【发布时间】:2018-02-23 01:18:13
【问题描述】:
我正在研究能够对通过 Roslyn 中的 CSharpScript API 创建的 C# 脚本执行语义分析。但是,我使用语义模型 API 的所有尝试都失败了。
这是我的代码,包含我目前的方法和我尝试过的东西(最初我的脚本声明有通过导入和引用传递的选项,但这些似乎不会改变我的结果)。
Script script = CSharpScript.Create("int x = 2; x += 1;");
script.Compile(); // doesn't seem to matter
Compilation compilation = script.GetCompilation();
SyntaxTree syntaxTree = compilation.SyntaxTrees.Single();
SyntaxNode syntaxTreeRoot = syntaxTree.GetRoot();
SemanticModel semanticModel = compilation.GetSemanticModel(syntaxTree);
var firstVariable = syntaxTreeRoot.DescendantNodes().OfType<VariableDeclarationSyntax>().First();
IEnumerable<SyntaxNode> firstVariableParents = firstVariable.Ancestors();
IEnumerable<Diagnostic> diag = semanticModel.GetSyntaxDiagnostics();
IEnumerable<Diagnostic> declDiag = semanticModel.GetDeclarationDiagnostics();
SymbolInfo variableSymbol = semanticModel.GetSymbolInfo(firstVariable);
ISymbol variableDecl = semanticModel.GetDeclaredSymbol(firstVariable);
int breakpoint = 0;
我尝试从树中获取各种不同类型的语法节点,但当我从语义模型请求它时,没有任何东西可以给我任何实际的符号信息。例如,当我在断点声明的 VS 调试器中停止这段代码时,diag 和 declDiag 的长度为 0,variableDecl 为 null,variableSymbol 的候选者为零。
感谢任何建议!
【问题讨论】:
标签: c# roslyn roslyn-code-analysis