File: AddImport\AddImportFixData.cs
Web Access
Project: src\src\Features\Core\Portable\Microsoft.CodeAnalysis.Features.csproj (Microsoft.CodeAnalysis.Features)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
#nullable disable
 
using System.Collections.Immutable;
using System.Runtime.Serialization;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.Tags;
using Microsoft.CodeAnalysis.Text;
 
namespace Microsoft.CodeAnalysis.AddImport;
 
[DataContract]
internal sealed class AddImportFixData(
    AddImportFixKind kind,
    ImmutableArray<TextChange> textChanges,
    string title = null,
    ImmutableArray<string> tags = default,
    CodeActionPriority priority = default,
    ProjectId projectReferenceToAdd = null,
    ProjectId portableExecutableReferenceProjectId = null,
    string portableExecutableReferenceFilePathToAdd = null,
    string assemblyReferenceAssemblyName = null,
    string assemblyReferenceFullyQualifiedTypeName = null,
    string packageSource = null,
    string packageName = null,
    string packageVersionOpt = null)
{
    [DataMember(Order = 0)]
    public AddImportFixKind Kind { get; } = kind;
 
    /// <summary>
    /// Text changes to make to the document.  Usually just the import to add.  May also
    /// include a change to the name node the feature was invoked on to fix the casing of it.
    /// May be empty for fixes that don't need to add an import and only do something like
    /// add a project/metadata reference.
    /// </summary>
    [DataMember(Order = 1)]
    public readonly ImmutableArray<TextChange> TextChanges = textChanges;
 
    /// <summary>
    /// String to display in the lightbulb menu.
    /// </summary>
    [DataMember(Order = 2)]
    public readonly string Title = title;
 
    /// <summary>
    /// Tags that control what glyph is displayed in the lightbulb menu.
    /// </summary>
    [DataMember(Order = 3)]
    public readonly ImmutableArray<string> Tags = tags;
 
    /// <summary>
    /// The priority this item should have in the lightbulb list.
    /// </summary>
    [DataMember(Order = 4)]
    public readonly CodeActionPriority Priority = priority;
 
    #region When adding P2P references.
 
    /// <summary>
    /// The optional id for a <see cref="Project"/> we'd like to add a reference to.
    /// </summary>
    [DataMember(Order = 5)]
    public readonly ProjectId ProjectReferenceToAdd = projectReferenceToAdd;
 
    #endregion
 
    #region When adding a metadata reference
 
    /// <summary>
    /// If we're adding <see cref="PortableExecutableReferenceFilePathToAdd"/> then this
    /// is the id for the <see cref="Project"/> we can find that <see cref="PortableExecutableReference"/>
    /// referenced from.
    /// </summary>
    [DataMember(Order = 6)]
    public readonly ProjectId PortableExecutableReferenceProjectId = portableExecutableReferenceProjectId;
 
    /// <summary>
    /// If we want to add a <see cref="PortableExecutableReference"/> metadata reference, this 
    /// is the <see cref="PortableExecutableReference.FilePath"/> for it.
    /// </summary>
    [DataMember(Order = 7)]
    public readonly string PortableExecutableReferenceFilePathToAdd = portableExecutableReferenceFilePathToAdd;
 
    #endregion
 
    #region When adding an assembly reference
 
    [DataMember(Order = 8)]
    public readonly string AssemblyReferenceAssemblyName = assemblyReferenceAssemblyName;
 
    [DataMember(Order = 9)]
    public readonly string AssemblyReferenceFullyQualifiedTypeName = assemblyReferenceFullyQualifiedTypeName;
 
    #endregion
 
    #region When adding a package reference
 
    [DataMember(Order = 10)]
    public readonly string PackageSource = packageSource;
 
    [DataMember(Order = 11)]
    public readonly string PackageName = packageName;
 
    [DataMember(Order = 12)]
    public readonly string PackageVersionOpt = packageVersionOpt;
 
    #endregion
 
    public static AddImportFixData CreateForProjectSymbol(ImmutableArray<TextChange> textChanges, string title, ImmutableArray<string> tags, CodeActionPriority priority, ProjectId projectReferenceToAdd)
        => new(AddImportFixKind.ProjectSymbol,
               textChanges,
               title: title,
               tags: tags,
               priority: priority,
               projectReferenceToAdd: projectReferenceToAdd);
 
    public static AddImportFixData CreateForMetadataSymbol(ImmutableArray<TextChange> textChanges, string title, ImmutableArray<string> tags, CodeActionPriority priority, ProjectId portableExecutableReferenceProjectId, string portableExecutableReferenceFilePathToAdd)
        => new(AddImportFixKind.MetadataSymbol,
               textChanges,
               title: title,
               tags: tags,
               priority: priority,
               portableExecutableReferenceProjectId: portableExecutableReferenceProjectId,
               portableExecutableReferenceFilePathToAdd: portableExecutableReferenceFilePathToAdd);
 
    public static AddImportFixData CreateForReferenceAssemblySymbol(ImmutableArray<TextChange> textChanges, string title, string assemblyReferenceAssemblyName, string assemblyReferenceFullyQualifiedTypeName)
        => new(AddImportFixKind.ReferenceAssemblySymbol,
               textChanges,
               title: title,
               tags: WellKnownTagArrays.AddReference,
               priority: CodeActionPriority.Low,
               assemblyReferenceAssemblyName: assemblyReferenceAssemblyName,
               assemblyReferenceFullyQualifiedTypeName: assemblyReferenceFullyQualifiedTypeName);
 
    public static AddImportFixData CreateForPackageSymbol(ImmutableArray<TextChange> textChanges, string packageSource, string packageName, string packageVersionOpt)
        => new(AddImportFixKind.PackageSymbol,
               textChanges,
               packageSource: packageSource,
               priority: CodeActionPriority.Low,
               packageName: packageName,
               packageVersionOpt: packageVersionOpt);
}