C# CSharpScript的Roslyn语义分析';好像不行
我正在研究如何对通过Roslyn中的CSharpScript API创建的C#脚本执行语义分析。然而,我所有使用语义模型API的尝试都失败了 这是我的代码,包含了我到目前为止的方法和我尝试过的东西(最初我的脚本声明中有导入和引用传递的选项,但这些似乎并没有改变我的结果)C# CSharpScript的Roslyn语义分析';好像不行,c#,roslyn,roslyn-code-analysis,C#,Roslyn,Roslyn Code Analysis,我正在研究如何对通过Roslyn中的CSharpScript API创建的C#脚本执行语义分析。然而,我所有使用语义模型API的尝试都失败了 这是我的代码,包含了我到目前为止的方法和我尝试过的东西(最初我的脚本声明中有导入和引用传递的选项,但这些似乎并没有改变我的结果) scriptscript=CSharpScript.Create(“intx=2;x+=1;”); script.Compile();//这似乎无关紧要 Compilation=script.GetCompilation();
scriptscript=CSharpScript.Create(“intx=2;x+=1;”);
script.Compile();//这似乎无关紧要
Compilation=script.GetCompilation();
SyntaxTree SyntaxTree=compilation.SyntaxTrees.Single();
SyntaxNode syntaxTreeRoot=syntaxTree.GetRoot();
SemanticModel SemanticModel=compilation.GetSemanticModel(syntaxTree);
var firstVariable=syntaxTreeRoot.genderantnodes().OfType().First();
IEnumerable firstVariableParents=firstVariable.祖先();
IEnumerable diag=semanticModel.GetSyntaxDiagnostics();
IEnumerable declDiag=semanticModel.GetDeclarationDiagnostics();
SymbolInfo variableSymbol=semanticModel.GetSymbolInfo(第一个变量);
ISymbol variableDecl=semanticModel.GetDeclaredSymbol(第一个变量);
int断点=0;
我尝试过从树中获取各种不同类型的语法节点,当我从语义模型中请求时,没有任何东西能给我任何实际的符号信息。例如,当我在VS调试器的断点声明中停止这段代码时,diag和declDiag的长度为0,variableDecl为null,variablesymble的候选项为零
任何建议都将不胜感激 要获取变量声明的符号,只需对变量类型调用
GetSymbolInfo
,如下所示:
var variableSymbol = semanticModel.GetSymbolInfo(firstVariable.Type);
这将返回
int
类型的符号。根据Roslyn问题追踪器上Cyrus Najmabadi的说法:
VariableDeclarationSyntax引用整个声明。i、 e:int i,j,k。所以问你从中得到了什么“声明符号”在C#中没有意义。您需要获取单个的“VariableDeclarator”,并在其上请求GetDeclaredSymbol
一旦我使用VariableDeclaratorSyntax而不是VariableDeclarationSyntax,我就得到了我所需要的。感谢您的反馈,但结果是一样的。
var variableSymbol = semanticModel.GetSymbolInfo(firstVariable.Type);