File: src\roslyn\src\Analyzers\CSharp\Analyzers\UseExpressionBody\Helpers\UseExpressionBodyHelper.cs
Web Access
Project: src\roslyn\src\CodeStyle\CSharp\Analyzers\Microsoft.CodeAnalysis.CSharp.CodeStyle.csproj (Microsoft.CodeAnalysis.CSharp.CodeStyle)
// 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.

using System.Collections.Immutable;
using System.Diagnostics.CodeAnalysis;
using System.Threading;
using Microsoft.CodeAnalysis.CodeStyle;
using Microsoft.CodeAnalysis.CSharp.CodeGeneration;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Options;

namespace Microsoft.CodeAnalysis.CSharp.UseExpressionBody;

internal abstract class UseExpressionBodyHelper
{
    public abstract Option2<CodeStyleOption2<ExpressionBodyPreference>> Option { get; }
    public abstract LocalizableString UseExpressionBodyTitle { get; }
    public abstract LocalizableString UseBlockBodyTitle { get; }
    public abstract string DiagnosticId { get; }
    public abstract EnforceOnBuild EnforceOnBuild { get; }
    public abstract ImmutableArray<SyntaxKind> SyntaxKinds { get; }

    public abstract CodeStyleOption2<ExpressionBodyPreference> GetExpressionBodyPreference(CSharpCodeGenerationOptions options);
    public abstract BlockSyntax? GetBody(SyntaxNode declaration);
    public abstract ArrowExpressionClauseSyntax? GetExpressionBody(SyntaxNode declaration);
    public abstract bool IsRelevantDeclarationNode(SyntaxNode node);

    public abstract bool CanOfferUseExpressionBody(CodeStyleOption2<ExpressionBodyPreference> preference, SyntaxNode declaration, bool forAnalyzer, CancellationToken cancellationToken);
    public abstract bool CanOfferUseBlockBody(CodeStyleOption2<ExpressionBodyPreference> preference, SyntaxNode declaration, bool forAnalyzer, out bool fixesError, [NotNullWhen(true)] out ArrowExpressionClauseSyntax? expressionBody);
    public abstract SyntaxNode Update(SemanticModel semanticModel, SyntaxNode declaration, bool useExpressionBody, CancellationToken cancellationToken);

    public abstract Location GetDiagnosticLocation(SyntaxNode declaration);

    public static readonly ImmutableArray<UseExpressionBodyHelper> Helpers =
        [
            UseExpressionBodyForConstructorsHelper.Instance,
            UseExpressionBodyForConversionOperatorsHelper.Instance,
            UseExpressionBodyForIndexersHelper.Instance,
            UseExpressionBodyForMethodsHelper.Instance,
            UseExpressionBodyForOperatorsHelper.Instance,
            UseExpressionBodyForPropertiesHelper.Instance,
            UseExpressionBodyForAccessorsHelper.Instance,
            UseExpressionBodyForLocalFunctionHelper.Instance,
        ];
}