gpt4 book ai didi

c# - 格式化方法签名会丢失缩进

转载 作者:太空狗 更新时间:2023-10-29 21:53:44 24 4
gpt4 key购买 nike

我正在创建一个 Code Fix,它将检测到的方法的访问修饰符变为 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,但要指定要格式化的树的跨度,否则格式化程序将在 just 您传入的树,没有来自其父级的上下文。

关于c# - 格式化方法签名会丢失缩进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30031280/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com