NDepend如何使用某些方法在使用路径跃点上使用自定义过滤器间接编写方法查询

时间:2016-11-24 09:08:33

标签: ndepend cqlinq

我正在努力解决NDepend问题。这有点难以解释。我的代码库中有一个方法(让我们调用那个方法'TheMethod')不能被某种类型的其他方法调用(让我们称之为'TheKind'),除非它们用某些属性('TheAttr')修饰),直接或间接;如果是间接的,任何用'TheAttr'装饰的跳都不会导致间接使用的违反。

我会用“ - >”想象一些场景箭头表示“使用”,具有上述属性的方法与TheAttr一起使用“[TheAttr]”,如果规则应该被违反则单词“FAIL”/如果不违反规则则为“SUCCESS”。

因此...

我可以编写一个CQLinq查询,直接或间接地使用'TheMethod'触发'TheKind'的所有方法。我也可以从结果中排除具有'TheAttr'的方法。

somemethod -> TheMethod      FAIL
somemethod[TheAttr] -> TheMethod     SUCCESS

将间接使用纳入规则也很容易:

somemethod -> method1 -> method2 -> TheMethod     FAIL
somemethod[TheAttr] -> method1 -> method2 -> TheMethod    SUCCESS

现在,我想要的是:

somemethod -> method1[TheAttr] -> method2 -> TheMethod    SUCCESS

somemethod -> method1 -> method2[TheAttr] -> TheMethod    SUCCESS

因此,换句话说,任何具有装饰的中间调用者都应该导致“TheMethod”/“通过”有效用法的有效用法也应该是有效的。

可以用NDepend检查吗?我用FillIterative进行了实验但到目前为止没有运气。

谢谢, 添

PS。:这是我目前的尝试:

    warnif count > 0 
let mcalling = Methods.WithFullName("My.Namespace.MyType.get_SomeProperty()").SingleOrDefault().MethodsCallingMe.ToList()
let domain = mcalling.FillIterative(callers => // Unique loop, just to let a chance to build the hashset.
                                      from o in (new object()).ToEnumerable()
                                      let hashset = callers.ToHashSet() // Use a hashet to make Intersect calls much faster!
                                      from m in Methods.UsingAny(callers).Except(callers) 
                                      where !m.HasAttribute("My.Namespace.NDependIgnore.MayUsePropAlthoughAsync".AllowNoMatch())
                                      select m
                                   )

let indirectcallers = domain.DefinitionDomain.Where(m1 => m1.IsAsync).ToArray()  // Avoid double enumeration

from m in indirectcallers
let depth = m.DepthOfIsUsing("My.Namespace.MyType.get_SomeProperty()")
where depth >= 0
select new 
{ 
  Method=m, 
  Depth=depth, 
  Level=domain[m]
}

0 个答案:

没有答案