我编写了一个小型自定义 Rosyln 分析器,用于检查某些方法调用,以及它们是否在循环上下文或表达式中执行。我想要警告的代码示例如下:
IMessageHandlerContext context = default;
foreach (var item in dataItems)
{
await context.Send<IProcessItem>(m =>
{
m.Item = "my-item-id";
});
}
我执行两阶段分析,首先通过查看方法名称来检查方法调用是否是我特别感兴趣的方法调用。第二个更改是查看更广泛的上下文,并测试调用是否发生在循环上下文或表达式内。分析器适用于 For 和 ForEach 构造,但无法突出显示 While 循环表达式。我对第一阶段(查看方法名称)工作正常感到满意。
private void CheckForMethodInvocationInLoop(SyntaxNodeAnalysisContext context)
{
var invocation = (InvocationExpressionSyntax)context.Node;
var containsMethod = false;
// Removed stage one code for brevity
if (!containsMethod)
return;
var loopFound = invocation.FirstAncestorOrSelf<StatementSyntax>(ss =>
ss.IsKind(SyntaxKind.ForStatement) ||
ss.IsKind(SyntaxKind.ForEachStatement) ||
ss.IsKind(SyntaxKind.WhileStatement));
if (loopFound != null)
{
context.ReportDiagnostic(Diagnostic.Create(Rule, invocation.GetLocation()));
}
}
分析器正确突出显示 For 和 ForEach 表达式中的方法调用,但无法识别 While 表达式中的相同调用。
ForEach 表达式内部调用,语法高亮
While 表达式内调用,无语法高亮
我尝试了几种技术来检查调用上下文。首先,通过递归检查调用语句上的每个父级及其父级。我还尝试在调用本身上使用方法 FirstAncestorOrSelf 来测试某种 Statement。通过检查语法可视化工具,我无法确定为什么分析器无法识别 While 表达式内的调用。
最佳答案
所以我看了你的仓库,然后 fixing a few quick things (例如您的主项目中没有引用分析器,或者分析器必须针对 netstandard2.0
构建)诊断按预期工作:
关于c# - Roslyn 分析器未检测 While 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75235610/