c# - 如何使用 Roslyn 格式化代码选择并维护领先的琐事?

标签 c# roslyn

我想格式化我用 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/

相关文章:

c# - 将 Roslyn 与 Nuget 结合使用时避免大量的包和二进制文件

c# - 为什么 C# 编译器为每个传递的委托(delegate)创建一个新的 Action 实例?

C# Roslyn 编译 - 在动态编译的代码中使用 Nuget 包 - 编译但在运行时抛出异常(无法加载文件或程序集)

c# - 如何通过依赖注入(inject)使用 RateLimiter 的 HttpClient DelegatingHandler?

c# - DriveInfo.DriveFormat 上的设备未就绪错误

c# - 在 C# 中可以同时声明和调用 lambda 表达式吗?

c# - 扩展方法的 SymbolInfo

.net - 为 Roslyn 分析器提供依赖项的正确方法是什么?

c# - 为什么在 c# 中 2.135 总是四舍五入(使用 2 位小数)到 2.13

c# - 变量声明应该总是放在循环之外吗?