对CSharpScript的Roslyn语义分析似乎不起作用

时间:2018-02-23 01:18:14

标签: c# roslyn roslyn-code-analysis

我正在研究能够对通过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的候选者为零。

感谢任何建议!

1 个答案:

答案 0 :(得分:0)

要获取变量声明的符号,您只需要在变量类型上调用GetSymbolInfo,如下所示:

var variableSymbol = semanticModel.GetSymbolInfo(firstVariable.Type);

这将返回int类型的符号。