[英]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.