【发布时间】: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