簡體   English   中英

與Roslyn C#CodeFixProvider和Trivia意外的換行符

[英]Unexpected line breaks with Roslyn C# CodeFixProvider and Trivia

我目前正在嘗試編寫一個C#CodeFixProvider,如果存在相應的屬性,它應該用屬性setter訪問替換對setXXX()方法的調用。 基本上

setSimpleProperty(42);

被替換為

SimpleProperty = 42;

核心似乎工作正常,但我正在努力與瑣事。 在以下示例中

/*a*/setSimpleProperty(/*b*/ 42 /*c*/)/*d*/;
  1. a引領瑣事進行調用
  2. b將瑣事拖尾到參數列表的開放大括號
  3. c正在貶低論證本身
  4. d跟蹤調用的瑣事

我試圖正確處理這些,以獲得預期的結果

/*a*/SimpleProperty = /*b*/42/*c*//*d*/;

但是,我得到了意想不到的換行符,無法弄清楚出了什么問題:

        /*a*/
        SimpleProperty =
/*b*/ 42 /*c*//*d*/;

我的基本代碼如下:

private static Task<Document> ReplaceMethodCallWithPropertySetAsync(Document document, InvocationExpressionSyntax invocation, ISymbol property, CancellationToken cancellationToken)
{
    ExpressionSyntax propertyAccess = null;


    if (invocation.Expression is IdentifierNameSyntax)
    {
        propertyAccess = SyntaxFactory.IdentifierName(property.Name);
    }
    else if (invocation.Expression is MemberAccessExpressionSyntax memberAccess)
    {
        propertyAccess = SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, memberAccess.Expression, SyntaxFactory.IdentifierName(property.Name));
    }

    var val = invocation.ArgumentList.Arguments.First().Expression.AppendLeadingTrivia(invocation.ArgumentList.OpenParenToken.TrailingTrivia);

    var newNode = SyntaxFactory.AssignmentExpression(SyntaxKind.SimpleAssignmentExpression, propertyAccess, val);
    newNode = newNode.AppendLeadingTrivia(invocation.GetLeadingTrivia()).AppendTrailingTrivia(invocation.GetTrailingTrivia());

    return document.ReplaceNodeAsync(invocation, newNode, cancellationToken);
}

AppendLeadingTrivia / AppendTralingTrivia只是輔助擴展方法:

public static T AppendTrailingTrivia<T>(this T node, IEnumerable<SyntaxTrivia> trivias) where T : SyntaxNode
{
    if (trivias == null)
        return node;

    if (node.HasTrailingTrivia)
        return node.WithTrailingTrivia(node.GetTrailingTrivia().Concat(trivias));
    else
        return node.WithTrailingTrivia(trivias);
}

那有什么不對? 我從哪里獲得換行符?

為什么使用AppendLeadingTrivia而不是WithLeadingTrivia,對於Trailing也是如此。 我是你“追加”到ElasticTrivia然后它取決於Normalizer的作用。 你正在控制你的例子中的所有瑣事。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM