Vb.net Roslyn context.SemanticModel.GetDeclaredSymbol()从调用表达式返回NULL

Vb.net Roslyn context.SemanticModel.GetDeclaredSymbol()从调用表达式返回NULL,vb.net,vb6,roslyn,vb6-migration,Vb.net,Vb6,Roslyn,Vb6 Migration,尝试开发一个VS扩展,以帮助使用Roslyn从vb6迁移到Vb.net 不幸的是,我在检测源代码中的“DoEvents”表达式时运气不太好,因为在检测过程中,我的GetDeclaredSymbol得到NULL 我糟糕的编码是 注册操作: context.RegisterSyntaxNodeAction(AddressOf ExpressionStatementDec, SyntaxKind.InvocationExpression) 尝试检测“DoEvents”表达式: Private Su

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

不幸的是,我在检测源代码中的“DoEvents”表达式时运气不太好,因为在检测过程中,我的GetDeclaredSymbol得到NULL

我糟糕的编码是

注册操作:

 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
我尝试了大量的选项,试图为“GoYou”获得正确类型的对象,但到目前为止运气不佳

任何指导员(请欣赏:)

编辑其他信息: 我尝试过GetSymbolInfo,但是当我在context.Node.ToFullString.ToString中检测到“DoEvents”时,我仍然没有在context.SemanticModel.GetSymbolInfo(context.Node)中获得任何内容,如下所示

谢谢,
Richard

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

Visual Studio手边没有获取代码的工具,但是

我相信你想要的是:

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

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

谢谢Jason。我尝试了GetSymbolInfo,但不幸的是,我仍然没有得到任何回报。用更多信息和屏幕截图更新了我的问题。啊,所以我可能错过了一个重要的细节。在从VB6迁移到VB.NET的情况下,这些DoEvents调用是否指向任何地方?或者如果你试图编译它们,你只是因为没有DoEvents而出错吗?谢谢Jason。开发一个迁移工具扩展来帮助我们迁移大量的vb6代码。在vb6中,您有“DoEvents”,而vb.net的等价物是“Application.DoEvents”。是的,对于vb.net环境中的本机vb6代码,它将不会编译。所以我想在VisualStudio中检测“DoEvents”,并提供一个诊断灯泡选项,将“DoEvents”更改为“Application.DoEvents”。目前,我正在努力获取足够的信息来创建诊断。创建(规则….因此,如果代码中某处没有DoEvents方法,则SemanticModel中的任何API都不会返回符号;相反,您应该通过查看表达式的文本来执行最初的操作。相反,您应该只使用语法节点的位置,然后尝试获取符号来报告位置n of,顺便说一句,它将报告定义的位置。