关于后端:打造企业自己代码规范IDEA插件中

2次阅读

共计 3246 个字符,预计需要花费 9 分钟才能阅读完成。

一些基本概念

在开始独立研发公司本人的代码标准查看规定之前,先介绍一些相干的基本概念。阿里巴巴代码标准很多规定其实都是基于开源框架 PMD 进行的研发。PMD 用官网的话语介绍来说:PMD 是一个源代码分析器。它能够发现常见的编程缺点,如未应用的变量、空 catch 块、不必要的对象创立等。它反对多种语言。它能够用自定义规定进行扩大。它应用 JavaCC 和 Antlr 将源文件解析为形象语法树(AST),并对其运行规定以查找抵触。规定能够用 Java 编写,也能够应用 XPath 查问。开源代码库:https://github.com/pmd/pmd

这里波及到一个很要害的概念——AST 形象语法树 (Abstract Syntax Tree)。AST 使用场景其实十分多,日常咱们研发过程中谬误提醒、代码高亮、代码格式化、代码转译等等实现的根底都基于 AST。简略说,会通过词法剖析和语法分析将代码转化成一种相似树样层次结构来进行形容,当然这种形容能够用 XML 格局。文字描述比拟形象,无妨看一个“Hello world”的具体 AST 语法树(Java 1.8),这样就很容易进行了解了。

另外一个概念 XPath 是一门在 XML 文档中查找信息的语言。自身和代码解析没有关系,但当 AST 通过 XML 格局形容时,XPath 可能很好实现对相干节点进行查找。两者的联合就能进行违规代码的查看,这就是 XPath 规定代码标准查看基本原理。此外,与其配套的 PMD-Designer 规定可视化工具也很好用。

例如阿里巴巴代码标准中 PackageNamingRule 就是十分典型的 XPath 规定。包名只能由小写字母、数字来组成,具体的 XPath:

private static final String XPATH = "//PackageDeclaration/Name"
    + "[not (matches(@Image,'^[a-z0-9]+(\\.[a-z][a-z0-9]*)*$'))]"; 

上面先写个规定的例子来感触下自定义规定具体的操作;从查看代码中 System.out 相似的日志输入开始。

Example:查看代码中 System.out 相似的日志输入。

步骤一,使用 PMD-Designer 来辅助编写具体 XPath 的查看规定;这个工具也能够验证各种代码写法下,规定是否都能起到很好的作用。最终 XPath 具体规定如下:

//Name[starts-with(@Image, 'System.out.print') or starts-with(@Image, 'System.err.print')]

步骤二,新建一个具体的规定类,继承 AbstractXpathRule;其中 AbstractXpathRule 自身是继承 PMD 中 XPathRule,次要扩大了多语言的设计。具体如下:

package com.alibaba.p3c.pmd.lang.java.rule.emo;  
  
import com.alibaba.p3c.pmd.I18nResources;  
import com.alibaba.p3c.pmd.lang.AbstractXpathRule;  
import com.alibaba.p3c.pmd.lang.java.util.ViolationUtils;  
import net.sourceforge.pmd.lang.ast.Node;  
  
import static net.sourceforge.pmd.lang.rule.xpath.XPathRuleQuery.XPATH_2_0;  
  
public class VoidSystemPrintRule extends AbstractXpathRule {  
    private static final String XPATH =  
            "//Name[starts-with(@Image,'System.out.print') or starts-with(@Image,'System.err.print')]";  
  
    public VoidSystemPrintRule() {setXPath(XPATH);  
        setVersion(XPATH_2_0);  
    }  
  
    @Override  
    public void addViolation(Object data, Node node, String arg) {  
        ViolationUtils.addViolationWithPrecisePosition(this, node, data,  
                I18nResources.getMessage("java.naming.VoidSystemPrintRule.violation.msg", node.getImage()));  
    }  
}  

步骤三:在 messages.xml 和 messages_en.xml 别离增加查看出错后给出相干中英文提醒。

<entry key="java.naming.VoidSystemPrintRule.violation.msg">
    <![CDATA[ 程序中防止间接应用 System 对相干日志信息输入]]>
</entry>
——
<entry key="java.naming.VoidSystemPrintRule.violation.msg">
    <![CDATA[Avoid using system print]]>
</entry>

步骤四:新建 emo-common.xml 的规定汇合,并将实现的规定配置进去。

<ruleset name="AlibabaJavaNaming" xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
    <description>EmoJavaCommonRule</description>
    <rule name="VoidSystemPrintRule"
          language="java"
          since="1.6"
          message="java.naming.VoidSystemPrintRule.violation.msg"
          class="com.alibaba.p3c.pmd.lang.java.rule.emo.VoidSystemPrintRule">
        <priority>3</priority>
        <example>
            <![CDATA[System.out.println(message);
            ]]>
        </example>
    </rule>
</ruleset>

步骤五:在 ali-pmd.xml 中引入咱们新加的规定汇合 emo-common.xml。

<rule ref="rulesets/java/emo-common.xml"/>

最初运行下批改完的代码程序,成果如下:

综述下关键点, 代码标准查看基本原理能够基于 AST 语法树来进行实现;AST 联合 Xpath 能够不便进行相干标准规定的编写;通过 PMD-Designer 能可视化的帮忙咱们实现 XPath 的相干代码标准规定以及验证相干规定;给出了一个例子,基于阿里开源代码标准插件源码,编写实用本人公司的代码标准的形式。

附上相干代码 github 链接:https://github.com/ariesfly/e…
如有遇到问题欢送公众号(Java 研究者)私信留言

正文完
 0