gpt4 book ai didi

C# CodeAnalysis - 表达式的结构

转载 作者:太空宇宙 更新时间:2023-11-03 10:24:41 26 4
gpt4 key购买 nike

我想在 VS2013 中的 C# (.NET 4.5) 脚本中进行简单的代码替换。应重写每个 @GetIt 调用,以便将其封装在 lambda 函数中:

new MyClass(@GetInt("a") * @GetInt("b"));

成为

new MyClass( x => (x.GetInt("a") * x.GetInt("b")) )

我安装了 Roslyn 的 CodeAnalysis 来解析脚本。我使用以下调用获取所有带有 @GetInt 标识符的 token :

var getters = CSharpSyntaxTree.ParseText("new MyClass(@GetInt("a") * @GetInt("b"));")
.GetRoot().DescendantTokens().OfType<SyntaxToken>()
.Where(x => x.Text.Equals("@GetInt"));

对于 @GetInt 作为 MyClass 构造函数的一个简单参数,它工作正常并使用 getters[i].Parent.Parent.Parent.Parent 我正确地到达了构造函数的 MethodDeclarationSyntax 节点。

但是,如上例所示添加乘法,第二个 @GetInt 的标记将 * GetInt("b") 声明为其父级(它是但是已经是一个 MethodDeclarationSyntax,而不是参数节点)并且遍历回它的父级导致 CompilationUnitSyntax 这是根!

这样,我就无法获得有关语法树中第二个 @GetInt 位置的信息。因此,没有丢失的信息就不可能进行替换。

我检查过没有使用前缀@的情况,但结果是一样的。有人可以告诉我我做错了什么吗?

解决方案 正如 JoshVarty 在他的评论之一中所建议的那样:在 NuGet 包中禁用脚本的代码分析之前,我必须使用一种解决方法。首先,我将 string script = "..." 修饰为

var decoratedScript = "class MYCLASS { void METHOD() {\n" + script + "\n} }";

@GetInt 重写完成后,我删除添加的装饰。

最佳答案

默认情况下,ParseText() 希望您传递一个典型的 C# 文档。 (由 using 语句、命名空间、类型等组成的东西)

如果您想解析单个表达式,您可以使用 CSharpParseOptions 来这样做:

var parseOptions = CSharpParseOptions.Default;
parseOptions = parseOptions.WithKind(SourceCodeKind.Script); //We're going to be passing individual expressions in.

var getters = CSharpSyntaxTree.ParseText(@"new MyClass(@GetInt(""a"") * @GetInt(""b""));", parseOptions)
.GetRoot().DescendantTokens().OfType<SyntaxToken>()
.Where(x => x.Text.Equals("@GetInt"));

当我使用它时,我得到了 @GetInt 的两个调用作为 BinaryExpressionSyntax(乘法)的子级。

您可以通过以下方式看到树最初为您自己解析错误:

var tree = CSharpSyntaxTree.ParseText(@"new MyClass(@GetInt(""a"") * @GetInt(""b""));");
var errs = tree.GetDiagnostics().Where(n => n.Severity == DiagnosticSeverity.Error);

编辑 非常抱歉,RTM 的脚本 API 似乎已被删除。我能想到的唯一解决方法是将每个语句包装在一个类和一个方法中,直到它再次开始工作。

它出现在 http://sourceroslyn.io 上的原因是因为那是基于当前的母版,他们正在重新添加它。

关于C# CodeAnalysis - 表达式的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32034881/

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