【问题标题】:Roslyn semantic analysis on CSharpScript doesn't seem to workCSharpScript 上的 Roslyn 语义分析似乎不起作用
【发布时间】: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


    【解决方案1】:

    根据 Cyrus Najmabadi 在 Roslyn 问题跟踪器上的说法:

    VariableDeclarationSyntax 指的是整个声明。即:int i,j,k。因此,询问您从中获得的“声明符号”在 C# 中没有任何意义。您需要获取单独的“VariableDeclarator”,并在这些上请求 GetDeclaredSymbol。

    一旦我使用了 VariableDeclaratorSyntax 而不是 VariableDeclarationSyntax,我就得到了我需要的东西。

    【讨论】:

      【解决方案2】:

      要获得变量声明的符号,你只需要像这样在变量类型上调用GetSymbolInfo

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

      这将返回 int 类型的符号。

      【讨论】:

      • 感谢您的反馈,但结果相同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      • 2022-01-01
      相关资源
      最近更新 更多