簡體   English   中英

格式化方法簽名會丟失縮進

[英]Formatting a method signature loses indentation

我正在創建一個代碼修復程序,它將檢測到的方法的訪問修飾符設為public 實現非常簡單:刪除所有現有的訪問修飾符,並在前面添加public 之后,我替換節點並返回解決方案。

但是,這將導致出現如下所示的修飾符列表: publicvirtual void Method() 在將修飾符相互粘貼之上,該行代碼被錯誤地縮進。 看起來像這樣:

        [TestClass]
        public class MyClass
        {
            [TestMethod]
publicvirtual void Method()
            {

            }
        }

因此,作為解決方案,我將代碼格式化。 使用

var formattedMethod = Formatter.Format(newMethod, 
                                       newMethod.Modifiers.Span,
                                       document.Project.Solution.Workspace,
                                       document.Project.Solution.Workspace.Options);

我可以設置修飾符的格式,但是它們仍然會縮進:

        [TestClass]
        public class MyClass
        {
            [TestMethod]
public virtual void Method()
            {

            }
        }

我認為這是由於瑣事引起的,但是在格式化方法之前加上原始方法的前導瑣事並沒有什么不同。 我想避免格式化整個文檔,因為,這不是格式化整個文檔的動作。

此代碼修復的整個相關實現:

private Task<Solution> MakePublicAsync(Document document, SyntaxNode root, MethodDeclarationSyntax method)
{
    var removableModifiers = new[]
    {
        SyntaxFactory.Token(SyntaxKind.InternalKeyword),
        SyntaxFactory.Token(SyntaxKind.ProtectedKeyword),
        SyntaxFactory.Token(SyntaxKind.PrivateKeyword)
    };

    var modifierList = new SyntaxTokenList()
                            .Add(SyntaxFactory.Token(SyntaxKind.PublicKeyword))
                            .AddRange(method.Modifiers.Where(x => !removableModifiers.Select(y => y.RawKind).Contains(x.RawKind)));

    var newMethod = method.WithModifiers(modifierList);
    var formattedMethod = Formatter.Format(newMethod, newMethod.Modifiers.Span, document.Project.Solution.Workspace, document.Project.Solution.Workspace.Options);

    var newRoot = root.ReplaceNode(method, formattedMethod.WithLeadingTrivia(method.GetLeadingTrivia()));
    var newDocument = document.WithSyntaxRoot(newRoot);

    return Task.FromResult(newDocument.Project.Solution);
}

無需手動調用Formatter.Format ,只需將Formatter.Annotation放在固定節點上,CodeFix引擎將自動為您調用它。

問題是您需要在樹的根上調用Format ,但是要指定要格式化的樹的跨度,否則格式化程序將在您傳入的樹上運行,而其父級沒有上下文。

問題是我讓測試縮進了字符串表示形式本身,如下所示:

        var original = @"
    using System;
    using System.Text;

    namespace ConsoleApplication1
    {
        class MyClass
        {   
            void Method(Nullable<int> myVar = 5)
            {

            }
        }
    }";

如您所見,在左邊距和實際代碼之間仍然有一個選項卡。 顯然Roslyn格式化程序無法處理這種情況(這是不常見的情況)。

但在與此不同的情況下,您可能會對格式化程序感興趣,這就是為什么我會接受Kevin的回答。

暫無
暫無

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

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