File: Protocol\CodeAction.cs
Web Access
Project: src\src\LanguageServer\Protocol\Microsoft.CodeAnalysis.LanguageServer.Protocol.csproj (Microsoft.CodeAnalysis.LanguageServer.Protocol)
// 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.
 
namespace Roslyn.LanguageServer.Protocol
{
    using System.Text.Json.Serialization;
 
    /// <summary>
    /// A class representing a change that can be performed in code. A CodeAction must either set
    /// <see cref="CodeAction.Edit"/> or <see cref="CodeAction.Command"/>. If both are supplied,
    /// the edit will be applied first, then the command will be executed.
    /// <para>
    /// See the <see href="https://microsoft.github.io/language-server-protocol/specifications/specification-current/#codeAction">Language Server Protocol specification</see> for additional information.
    /// </para>
    /// </summary>
    internal class CodeAction
    {
        /// <summary>
        /// A short human readable title for this code action.
        /// </summary>
        [JsonPropertyName("title")]
        [JsonRequired]
        public string Title
        {
            get;
            set;
        }
 
        /// <summary>
        /// The kind of the code action, used to filter code actions.
        /// </summary>
        [JsonPropertyName("kind")]
        [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
        public CodeActionKind? Kind
        {
            get;
            set;
        }
 
        /// <summary>
        /// The diagnostics that this code action resolves.
        /// </summary>
        [JsonPropertyName("diagnostics")]
        [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
        public Diagnostic[]? Diagnostics
        {
            get;
            set;
        }
 
        /// <summary>
        /// Marks this as a preferred action. Preferred actions are used by the
        /// Auto Fix command and can be targeted by keybindings.
        /// <para>
        /// A quick fix should be marked preferred if it properly addresses the
        /// underlying error. A refactoring should be marked preferred if it is the
        /// most reasonable choice of actions to take.
        /// </para>
        /// </summary>
        /// <remarks>Since LSP 3.15</remarks>
        [JsonPropertyName("preferred")]
        [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
        public bool IsPreferred { get; init; }
 
        /// <summary>
        /// Marks that the code action cannot currently be applied.
        /// <para>
        /// Clients should follow the following guidelines regarding disabled code
        /// actions:
        /// <list type="bullet">
        /// <item>
        /// Disabled code actions are not shown in automatic lightbulbs code
        /// action menus.
        /// </item>
        /// <item>
        /// Disabled actions are shown as faded out in the code action menu when
        /// the user request a more specific type of code action, such as
        /// refactorings.
        /// </item>
        /// <item>
        /// If the user has a keybinding that auto applies a code action and only
        /// a disabled code actions are returned, the client should show the user
        /// an error message with <see cref="CodeActionDisabledReason.Reason"/> in the editor.
        /// </item>
        /// </list>
        /// </para>
        /// </summary>
        /// <remarks>Since LSP 3.16</remarks>
        [JsonPropertyName("disabled")]
        [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
        public CodeActionDisabledReason? Disabled { get; init; }
 
        /// <summary>
        /// Gets or sets the workspace edit that this code action performs.
        /// </summary>
        [JsonPropertyName("edit")]
        [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
        public WorkspaceEdit? Edit
        {
            get;
            set;
        }
 
        /// <summary>
        /// A command this code action executes. If a code action
        /// provides an edit and a command, first the edit is
        /// executed and then the command.
        /// </summary>
        [JsonPropertyName("command")]
        [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
        public Command? Command
        {
            get;
            set;
        }
 
        /// <summary>
        /// Data field that is preserved on a code action between a <c>textDocument/codeAction</c> request
        /// and a <c>codeAction/resolve</c> request.
        /// </summary>
        /// <remarks>Since LSP 3.16</remarks>
        [JsonPropertyName("data")]
        [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
        public object? Data
        {
            get;
            set;
        }
    }
}