尝试将 pmd 从 6.17.0 升级到 6.18.0 时规则测试失败

rule failed test while trying to upgrade pmd from 6.17.0 to 6.18.0

规则是

"//Reference[matches(@literal, \"^\$[^!]+\") and ./preceding-sibling::Text and ./following-sibling::Text]"

为了方便我提供工程,你可以mvn-test。

整个项目在https://github.com/XenoAmess/p3c/tree/1605f4d1b9c6a505074be5328953af26f578e190/p3c-pmd

规则 class 是 com.alibaba。p3c.pmd.lang.vm.rule.other.UseQuietReferenceNotationRule

我试图查看您的更新日志,但没有发现任何相关内容。

感谢您的帮助。

这是修复 https://github.com/pmd/pmd/issues/1923. It has been fixed by using real/full name in the rule context (see https://github.com/pmd/pmd/pull/1982) 的副作用。在单元测试中,使用的文件名为 "n/a",现在被解释为目录 "n" 中的文件 "a"。 RuleContext::getSourceCodeFilename returns 只是文件名而不是完整路径。要检索完整路径,可以使用 RuleContext::getSourceCodeFile

您的规则 UseQuietReferenceNotationRule 检查文件名 (UseQuietReferenceNotationRule.java:65) which is now not "n/a" anymore in the unit tests but "a". You can "fix" the unit test by simply changing UT_FILE_NAME to "a" (see UseQuietReferenceNotationRule.java:45)。

或者您可以更改规则以使用 ctx.getSourceCodeFile().toString() 恢复 UseQuietReferenceNotationRule.java:62 中的完整路径名。虽然该文件不存在,但它仍然指向 "n/a".

在规则本身中检查路径名的替代方法可能是 File exclusion/inclusion patterns

此外,如果您认为这些规则对更广泛的受众有意义,欢迎在 https://github.com/pmd/pmd 上投稿。