(这是一个小众的技术问题,但最终结果可能会引起广泛关注,所以我在这里问,但是如果不值得进行SO交换,很高兴将讨论转到电子邮件中。)
背景:我目前正在使用PMD来对学生提交的作业进行样式检查。这是PMD和CheckStyle的组合,并以自定义格式输出,因此我已经以编程方式而不是从命令行使用PMD。运行样式检查器后,我会在用于课程管理和作业评分的Web应用程序中显示输出。
我想增强我的Web应用程序,以便像IDE一样允许跳转到定义的各种交互。为此,我需要比例如更精确的输出。 ctags产生。由于PMD已经进行了Java解析和类型解析,因此可以想象将PMD用于识别文件中的所有名称并找出它们的绑定位置。
到目前为止的方法:我已经找到了一种运行解析器,NameResolution
外观,Symbol
外观,DataFlow
外观的方法, TypeResolution
外观和Multifile
外观,如SourceCodeProcessor
逻辑中所示。 (我不知道是否需要所有这些,但是我想运行它们不会有伤害...)我试图定义自己的AST访客,其核心逻辑是
ASTName
个节点NameDeclaration
问题/问题:
assertEquals
至org.junit.Assert.assertEquals
或其他静态导入。我已将执行跟踪到ClassTypeResolver
中,似乎正在找到org.junit.Assert
类,但是当我的访问者开始运行时,相关的ASTName
节点具有空的NameDeclaration和一个空类型。ASTName
有时由点分的访问路径组成,例如someObject.someMethod
被视为单个ASTName
?如何才能分别获得这两部分的名称解析?谢谢!
答案 0 :(得分:1)
绝对有点超出范围,所以最好转到PMD开发邮件列表,或者直接给我们的维护人员发送电子邮件。
尽管如此,到目前为止,似乎没有人对这个问题有疑问,我会尽可能完整地回答。
foo(bar, baz)
,这意味着要查找foo
的返回类型(不是定义foo
的类型)。对于Assert.assertEquals
,返回类型为void
,因此理想情况下,这就是您应该看到的。仍然有一些警告。 PMD的类型解析的这个特定领域仍然不完整(我们可以解决较简单的情况,但是要在难以使用类型推断的情况下进行努力)。对此区域的任何错误报告/ PR均表示赞赏。auxclasspath
中的原因。