File: src\Analyzers\CSharp\CodeFixes\RemoveAsyncModifier\RemoveAsyncModifierHelpers.cs
Web Access
Project: src\src\Features\CSharp\Portable\Microsoft.CodeAnalysis.CSharp.Features.csproj (Microsoft.CodeAnalysis.CSharp.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.
 
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Shared.Extensions;
 
namespace Microsoft.CodeAnalysis.CSharp.RemoveAsyncModifier;
 
internal static class RemoveAsyncModifierHelpers
{
    internal static SyntaxNode WithoutAsyncModifier(MethodDeclarationSyntax method, TypeSyntax returnType)
    {
        var newModifiers = RemoveAsyncModifier(method.Modifiers, ref returnType);
        return method.WithReturnType(returnType).WithModifiers(newModifiers);
    }
 
    internal static SyntaxNode WithoutAsyncModifier(LocalFunctionStatementSyntax localFunction, TypeSyntax returnType)
    {
        var newModifiers = RemoveAsyncModifier(localFunction.Modifiers, ref returnType);
        return localFunction.WithReturnType(returnType).WithModifiers(newModifiers);
    }
 
    internal static SyntaxNode WithoutAsyncModifier(ParenthesizedLambdaExpressionSyntax lambda)
        => lambda.WithAsyncKeyword(default).WithPrependedLeadingTrivia(lambda.AsyncKeyword.LeadingTrivia);
 
    internal static SyntaxNode WithoutAsyncModifier(SimpleLambdaExpressionSyntax lambda)
        => lambda.WithAsyncKeyword(default).WithPrependedLeadingTrivia(lambda.AsyncKeyword.LeadingTrivia);
 
    internal static SyntaxNode WithoutAsyncModifier(AnonymousMethodExpressionSyntax method)
        => method.WithAsyncKeyword(default).WithPrependedLeadingTrivia(method.AsyncKeyword.LeadingTrivia);
 
    private static SyntaxTokenList RemoveAsyncModifier(SyntaxTokenList modifiers, ref TypeSyntax newReturnType)
    {
        var asyncTokenIndex = modifiers.IndexOf(SyntaxKind.AsyncKeyword);
        SyntaxTokenList newModifiers;
        if (asyncTokenIndex == 0)
        {
            // Have to move the trivia on the async token appropriately.
            var asyncLeadingTrivia = modifiers[0].LeadingTrivia;
 
            if (modifiers.Count > 1)
            {
                // Move the trivia to the next modifier;
                newModifiers = modifiers.Replace(
                    modifiers[1],
                    modifiers[1].WithPrependedLeadingTrivia(asyncLeadingTrivia));
                newModifiers = newModifiers.RemoveAt(0);
            }
            else
            {
                // move it to the return type.
                newModifiers = default;
                newReturnType = newReturnType.WithPrependedLeadingTrivia(asyncLeadingTrivia);
            }
        }
        else
        {
            newModifiers = modifiers.RemoveAt(asyncTokenIndex);
        }
 
        return newModifiers;
    }
}