可以使用PMD导出IntelliSense信息吗?

时间:2018-10-12 19:46:46

标签: pmd

(这是一个小众的技术问题,但最终结果可能会引起广泛关注,所以我在这里问,但是如果不值得进行SO交换,很高兴将讨论转到电子邮件中。)

背景:我目前正在使用PMD来对学生提交的作业进行样式检查。这是PMD和CheckStyle的组合,并以自定义格式输出,因此我已经以编程方式而不是从命令行使用PMD。运行样式检查器后,我会在用于课程管理和作业评分的Web应用程序中显示输出。

我想增强我的Web应用程序,以便像IDE一样允许跳转到定义的各种交互。为此,我需要比例如更精确的输出。 ctags产生。由于PMD已经进行了Java解析和类型解析,因此可以想象将PMD用于识别文件中的所有名称并找出它们的绑定位置。

到目前为止的方法:我已经找到了一种运行解析器,NameResolution外观,Symbol外观,DataFlow外观的方法, TypeResolution外观和Multifile外观,如SourceCodeProcessor逻辑中所示。 (我不知道是否需要所有这些,但是我想运行它们不会有伤害...)我试图定义自己的AST访客,其核心逻辑是

  • 访问ASTName个节点
  • 获取他们的NameDeclaration
  • 以def-> use对的形式记录声明的源位置和节点的源位置

问题/问题:

  1. 尽管将auxClasspath装配为包括正确的jar,但名称解析有时无法解析,例如assertEqualsorg.junit.Assert.assertEquals或其他静态导入。我已将执行跟踪到ClassTypeResolver中,似乎正在找到org.junit.Assert类,但是当我的访问者开始运行时,相关的ASTName节点具有空的NameDeclaration和一个空类型。
  2. 我不明白如何确保可靠地检测到其他文件中的符号。我认为这是正确的类路径,并确保文件都是已编译的东西,但我无法完全解释有时会看到的失败。
  3. 为什么ASTName有时由点分的访问路径组成,例如someObject.someMethod被视为单个ASTName?如何才能分别获得这两部分的名称解析?
  4. 在尝试获取可靠的名称和类型信息之前,我还需要运行其他访客吗?
  5. (功能请求)是否有可能值得PMD作为内置功能来做?

谢谢!

1 个答案:

答案 0 :(得分:1)

绝对有点超出范围,所以最好转到PMD开发邮件列表,或者直接给我们的维护人员发送电子邮件。

尽管如此,到目前为止,似乎没有人对这个问题有疑问,我会尽可能完整地回答。

  1. 类型解析代码尝试标记每个节点的类型。对于方法调用foo(bar, baz),这意味着要查找foo的返回类型(不是定义foo的类型)。对于Assert.assertEquals,返回类型为void,因此理想情况下,这就是您应该看到的。仍然有一些警告。 PMD的类型解析的这个特定领域仍然不完整(我们可以解决较简单的情况,但是要在难以使用类型推断的情况下进行努力)。对此区域的任何错误报告/ PR均表示赞赏。
  2. 符号表或类型中的符号?记住符号表仍然是单个文件。类型不是,但是这就是为什么我们也需要项目自己的编译类包含在auxclasspath中的原因。
  3. 旧版…我们计划以一种或另一种方式进行更改(请参阅#497),但这是AST的构建方式的一项重大突破,这反过来意味着所有使用{{1 }}(都是在PMD中并由用户构建),很可能会完全停止工作…请提出任何反馈或想法。
  4. 不,您的实际运行量超出了所需。仅使用符号表和类型解析,您应该会很好(按此顺序!)
  5. 也许...您可以在PMD上起草RFC问题,以更好地讨论可能的用例...不仅如此,除了我们以某种方式公开符号表之外,您尝试做的大多数其他事情都是我们关心的事情。