【问题标题】:Roslyn context.SemanticModel.GetDeclaredSymbol() returning NULL from InvocationExpressionRoslyn context.SemanticModel.GetDeclaredSymbol() 从 InvocationExpression 返回 NULL
【发布时间】:2020-07-23 22:36:23
【问题描述】:

尝试开发一个 VS 扩展来帮助使用 Roslyn 从 vb6 迁移到 Vb.net。

不幸的是,在检测过程中我从 GetDeclaredSymbol 中得到 NULL,因此我在检测源中的“DoEvents”表达式时运气不佳。

我的代码不好是……

注册动作:

 context.RegisterSyntaxNodeAction(AddressOf ExpressionStatementDec, SyntaxKind.InvocationExpression)

尝试检测“DoEvents”表达式:

Private Sub ExpressionStatementDec(context As SyntaxNodeAnalysisContext)

    Dim GotYou = context.SemanticModel.GetDeclaredSymbol(context.Node)

    Dim WhatExpression = context.Node.ToFullString.ToString

    ' Find DoEvents.
    If RemoveWhitespace(WhatExpression) = "DoEvents" Then

        Dim diag = Diagnostic.Create(Rule, GotYou.Locations(0), GotYou.Name)
        context.ReportDiagnostic(diag)

    End If
End Sub

我已经尝试了很多选项来尝试为“GotYou”获取正确类型的对象,但到目前为止没有运气。

任何指针表示赞赏:)

编辑附加信息: 我已经尝试过 GetSymbolInfo,但是当我在 context.Node.ToFullString.ToString 中检测到“DoEvents”时,我仍然没有在 context.SemanticModel.GetSymbolInfo(context.Node) 中得到任何东西,如下所示。

谢谢, 理查德

【问题讨论】:

  • 啊,所以我可能错过了一个重要的细节。在您从 VB6 迁移到 VB.NET 的情况下,那些 DoEvents 调用是否指向任何地方?或者,如果您尝试编译它们,是否只是因为没有 DoEvents 而出现错误?
  • 谢谢杰森。开发一个迁移工具扩展来帮助我们迁移我们拥有的大量 vb6 代码。在 vb6 中,您有“DoEvents”,而 vb.net 的等价物是“Application.DoEvents”。是的,在 vb.net 环境中使用本机 vb6 代码将无法编译。所以我想在visual studio中检测“DoEvents”并提供一个诊断灯泡选项来将“DoEvents”更改为“Application.DoEvents”。目前我正在努力获取足够的信息来创建一个 Diagnostic.Create(Rule....
  • 因此,如果您的代码中某处没有 DoEvents 方法,那么 SemanticModel 中的任何 API 都没有返回符号;相反,您应该通过查看表达式的文本来做您最初正在做的事情。相反,您应该只使用语法节点的位置,然后尝试获取一个符号来报告其位置,顺便说一句,无论如何都会报告定义的位置。

标签: vb.net vb6 roslyn vb6-migration


【解决方案1】:

如果您想查看调用所引用的内容,请调用 GetSymbolInfo 而不是 GetDeclaredSymbol。

【讨论】:

  • 谢谢杰森。我曾尝试过 GetSymbolInfo,但不幸的是我仍然没有得到任何回报。用更多信息和屏幕截图更新了我的问题。
【解决方案2】:

没有方便的 Visual Studio 来获取代码,但是...

我相信你想要的是这样的:

Dim WhatExpression = TryCast(CType(context.Node, InvocationExpressionSyntax).Expression, IdentifierNameSyntax)?.Identifier.Text

这还不是全部,您可能正在处理一个成员访问表达式,在这种情况下,它可能不是您想要的。在 C# 中使用模式匹配处理这些选项会更容易一些,但这是一般的想法。此时您不需要语义树,因为您首先要验证您处理的是正确的文本。一旦你得到了它,你就可以看到它来自哪里以及它是否是你需要处理的事情。获取语​​义模型的成本很高,当(在单元测试之外)很少需要它时,没有理由这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 2015-12-24
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多