我想格式化我用 roslyn 修改的代码。 我正在修改方法内部的代码。 我不想重新格式化整个文件。 原始格式如下所示:
MyNamespace
{
class CodeBasicTests
{
int OperationOrder_0()
{
int a = 20;
int b = 10;
int sum = a + b;
return (int) sum;
}
}
}
在我格式化方法主体之后,它与边框对齐,而不是与方法签名对齐。
MyNamespace
{
class CodeBasicTests
{
int OperationOrder_0()
{
int a = 20;
int b = 10;
int c = 30; //new instruction
int sum = a + b + c;
return (int) sum;
}
}
}
我在方法访问者 (CSharpSyntaxRewriter) 中尝试了以下内容:
MethodDeclarationSyntax method = visited method node;
updatedMethod = method.ReplaceNode(method.Body, newBody);
updatedMethod = updatedMethod.NormalizeWhitespace().WithTriviaFrom(method);
return updatedMethod;
或者只选择方法体
newBody = (BlockSyntax) Formatter.Format(oldBody, texts, VisualStudioSolutionHandler.workspace);
我也尝试过使用格式化程序的文本跨度,但我根本无法让它工作。
我不想/不知道编写一个访问者来为 newBody 中的每个元素插入一个正确的选项卡,因为我插入的语句要复杂得多,我只想对更新的方法使用自动格式化功能.
我不知道保持原始方法缩进很重要。
最佳答案
用插入的新琐事替换当前琐事列表中的琐事。
这是我创建的用于向某些带注释的节点添加换行符的扩展方法的示例。
public static TNode AddNewlineToAnnotated<TNode>(this TNode node, string annotationKind)
where TNode : CSharpSyntaxNode =>
node.ReplaceNodes(node.GetAnnotatedNodes(annotationKind), (_, n) =>
n.WithLeadingTrivia(n.GetLeadingTrivia()
.Insert(0, SyntaxTree.ElasticEndOfLine(Environment.NewLine))
)
);
获得领先的琐事会给你一个 SyntaxTriviaList
并且你可以 Add()
, Insert()
或以其他方式修改琐事列表以提供你一个新的琐事列表。
关于c# - 如何使用 Roslyn 格式化代码选择并维护领先的琐事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30628608/