一些基本概念在开始独立开发公司自己的代码规范检查规则之前,先介绍一下相关的一些基本概念。阿里巴巴代码规范的很多规则其实都是基于开源框架PMD开发的。PMD官方介绍是:PMD是源代码分析器。它可以发现常见的编程缺陷,如未使用的变量、空的catch块、不必要的对象创建等。它支持多种语言。它可以使用自定义规则进行扩展。它使用JavaCC和Antlr将源文件解析为抽象语法树(AST)并对其运行规则以查找冲突。规则可以用Java编写或使用XPath查询。开源代码库:https://github.com/pmd/pmd这里涉及到一个很关键的概念——AST抽象语法树(AbstractSyntaxTree)。AST的应用场景其实有很多。在我们日常的研发过程中,错误提示、代码高亮、代码格式化、代码翻译等都是基于AST的。简单的说就是通过词法分析和句法分析,将代码转化为树状的层次结构进行描述。当然,这个描述可以是XML格式。文字描述比较抽象。大家不妨看一下“Helloworld”具体的AST语法树(Java1.8),很容易理解。另一个概念XPath是一种用于在XML文档中查找信息的语言。本身与代码解析无关,但是当用XML格式描述AST时,XPath可以很好的完成相关节点的查找。两者结合可以检查非法代码,这是XPath规则代码规范检查的基本原理。另外,附带的PMD-Designer规则可视化工具也非常好用。比如AlibabaCodeSpecification中的PackageNamingRule就是一个非常典型的XPath规则。包名只能由小写字母和数字组成。具体XPath:privatestaticfinalStringXPATH="//PackageDeclaration/Name"+"[not(matches(@Image,'^[a-z0-9]+(\\.[a-z][a-z0-9]*)*$'))]";我们先写一个规则的例子来感受下自定义规则的具体操作;查看代码中System.out的类似日志输出开始。示例:检查代码中System.out的类似日志输出。第一步,使用PMD-Designer辅助编写具体的XPath检查规则;该工具还可以验证规则是否可以在各种代码编写方法中发挥良好的作用。最终的XPath具体规则如下://Name[starts-with(@Image,'System.out.print')orstarts-with(@Image,'System.err.print')]第二步,创建一个新增具体规则类,继承AbstractXpathRule;AbstractXpathRule本身继承了PMD中的XPathRule,主要是扩展了多语言的设计。详细如下:packagecom.alibaba.p3c.pmd.lang.java.rule.emo;导入com.alibaba.p3c.pmd.I18nResources;导入com.alibaba.p3c.pmd.lang.AbstractXpathRule;导入com.alibaba.p3c.pmd.lang.java.util.ViolationUtils;导入net.sourceforge.pmd.lang.ast.Node;importstaticnet.sourceforge.pmd.lang.rule.xpath.XPathRuleQuery.XPATH_2_0;publicclassVoidSystemPrintRuleextendsAbstractXpathRule{privatestaticfinalStringXPATH=“//Name[开始于(@Image,'System.out.print')或开始于(@Image,'System.err.print')]”;publicVoidSystemPrintRule(){setXPath(XPATH);设置版本(XPATH_2_0);}@OverridepublicvoidaddViolation(Objectdata,Nodenode,Stringarg){ViolationUtils.addViolationWithPrecisePosition(this,node,data,I18nResources.getMessage(“java.naming.getRgoid.viol.System)”;}}步骤三:在消息中。xml和messages_en.xml分别加入检查错误并给出相关的中英文提示
