File: src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\Services\Precedence\IPrecedenceService.cs
Web Access
Project: src\src\Workspaces\Core\Portable\Microsoft.CodeAnalysis.Workspaces.csproj (Microsoft.CodeAnalysis.Workspaces)
// 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
 
namespace Microsoft.CodeAnalysis.Precedence;
 
internal interface IPrecedenceService
{
    /// <summary>
    /// Returns the precedence of the given expression, mapped down to one of the 
    /// <see cref="PrecedenceKind"/> values.  The mapping is language specific.
    /// </summary>
    PrecedenceKind GetPrecedenceKind(int operatorPrecedence);
 
    /// <summary>
    /// Returns the precedence of this expression in a scale specific to a particular
    /// language.  These values cannot be compared across languages, but relates the 
    /// precedence of expressions in the same language.  A smaller value means lower
    /// precedence.
    /// </summary>
    int GetOperatorPrecedence(SyntaxNode expression);
}
 
internal abstract class AbstractPrecedenceService<
    TExpressionSyntax,
    TOperatorPrecedence> : IPrecedenceService
    where TExpressionSyntax : SyntaxNode
    where TOperatorPrecedence : struct
{
    int IPrecedenceService.GetOperatorPrecedence(SyntaxNode expression)
        => (int)(object)this.GetOperatorPrecedence((TExpressionSyntax)expression);
 
    PrecedenceKind IPrecedenceService.GetPrecedenceKind(int operatorPrecedence)
         => this.GetPrecedenceKind((TOperatorPrecedence)(object)operatorPrecedence);
 
    public abstract TOperatorPrecedence GetOperatorPrecedence(TExpressionSyntax expression);
    public abstract PrecedenceKind GetPrecedenceKind(TOperatorPrecedence operatorPrecedence);
}
 
internal static class PrecedenceServiceExtensions
{
    public static PrecedenceKind GetPrecedenceKind(this IPrecedenceService service, SyntaxNode expression)
        => service.GetPrecedenceKind(service.GetOperatorPrecedence(expression));
}