"declaring a method" 的语义是什么?

What is the semantic of "declaring a method"?

根据 metric.xml 中定义的查询,我试图找出 class 声明了多少方法:

MATCH
    (t:Type:File)-[:DECLARES]->(m:Method)
WHERE 
    t.fqn=~'.*MyException'
RETURN
    t.fqn as Type, COUNT(m) as MethodCount

是 41。

我将查询更改为

MATCH
    (t:Class:File)-[:DECLARES]->(m:Method)
WHERE
    t.fqn=~'.*MyException'
RETURN
    t.fqn as Type, COUNT(m) as MethodCount

同样的 class 我得到 25。不应该是一样的结果吗? 如果我打开 class 并手动计数,我发现只有 23。那么如果 class 或类型 "declares" 方法是什么意思?似乎一些继承的方法也根据 :Type 或 :Class 计算在内。以及如何在没有继承方法的情况下获得 class 本身声明的 "real" 数量的方法?

第一个查询找到具有相同fqn的多个类型节点并聚合结果。只需将 id(t) 添加到 return 子句,您应该会看到它。

根本原因是同一异常类型很可能可作为多个节点使用,因为它包含在一个工件中并被其他工件所需要。要查找 "real" 节点,请使用以下查询:

MATCH
  (:Artifact)-[:CONTAINS]->(t:Type)-[:DECLARES]->(m:Method)
WHERE
  t.fqn=~'.*MyException'
RETURN
  t.fqn as Type, COUNT(m) as MethodCount

原文中有几个相关的问题post。如何只找到真正在 class 中声明的方法的答案是:

MATCH
  (:Artifact)-[:CONTAINS]->(t:Type)-[:DECLARES]->(m:Method)
WHERE
  t.fqn=~'.*MyException' AND m.name <> ''
RETURN
  t.fqn as Type, COUNT(m) as MethodCount