我们正在尝试使用 Roslyn API 来分析现有应用程序,以便能够编写工具来评估其质量。
在下面的代码中,我们尝试使用 API 来获取通过 async/await 调用调用的特定方法的
IOperation
:
if (toEvaluate is AwaitExpressionSyntax awaitExpressionSyntax)
{
if (awaitExpressionSyntax.Expression is InvocationExpressionSyntax invocationExpressionSyntax)
{
var operation = semanticModel.GetOperation(invocationExpressionSyntax);
// Analyse the operation
}
}
我们在大多数情况下都看到这种工作方式,但对于一个特定的方法调用
GetOperation
会返回一个 IOperation
,其中 Kind
为 OperationKind.Invalid
。
由于我们正在分析工作应用程序中的代码,因此我们知道代码本身并不是无效的。
什么会导致
GetOperation
返回OperationKind.Invalid
?
是否有任何调试信息可以用来了解什么操作被视为无效?
最后,通过查看
semanticModel.GetDiagnostics()
的输出,我们能够得到一些关于问题所在的线索,这表明模型缺少对 netstandard.dll
的引用。
添加缺失的 DLL 似乎确实解决了问题。
尚不完全清楚为什么这对其他方法有效,甚至对于
semanticModel.GetOperation(invocationExpressionSyntax)
成功返回的方法(即 OperationKind
不是 Invalid
),诊断中的错误仍然存在。