我正在尝试编写自定义 FxCop 代码分析规则 这将警告开发人员不要使用包含太深嵌套代码块的方法, 并将敦促他们重构困惑局面。
例如。我正在努力避免以下情况:
if(condition)
{
foreach(var item in items)
{
if(anotherCondition)
{
for(var product in item.Products)
{
// even more nested statement blocks...
}
}
}
}
当我重写 VisitBlock(Block block)
方法时出现计算器溢出
计算 block 的深度,因为显然,有一个循环引用
从 block 的属性之一到
block 本身。
即对于某些 i 以下内容为真:block.Statements[i] == block
为什么会存在这样的循环引用?如何避免? 谢谢!
最佳答案
经过更多的研究,我发现我实际上有两个主要问题
- VisitXXX 方法不访问源代码的抽象语法树中的节点
但实际上访问生成的 IL 中的节点。只需比较每个方法生成的 IL 指令
以及每个 method.Body.
生成的语句 我想知道如果 FxCop 我们能取得什么成就 可以为我们提供一个真正的 AST 访问者吗? - 回答我最初的问题,防止开发人员编写过多的嵌套
代码块,我们应该自己扫描方法代码,我的意思是,取出
method.Body
的SourceContext
属性中的起始行和结束行,并保留每一个的轨道 '{' 和 '}' 我们找到了。 “{”的递增计数器和“}”的递减计数器。这应该行得通,对吧?
关于stack-overflow - 使用 FxCop Introspection 进行代码分析的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4951338/