一些基本概念

在开始独立研发公司自己的代码规范检查规则之前,先介绍一些相关的基本概念。阿里巴巴代码规范很多规则其实都是基于开源框架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 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/emo-coding-guardian

如有遇到问题欢迎公众号私信留言

​打造企业自己代码规范IDEA插件(中)的更多相关文章

  1. ​打造企业自己代码规范IDEA插件(上)

    "交流互鉴是文明发展的本质要求.只有同其他文明交流互鉴.取长补短,才能保持旺盛生命活力." 这说的是文明,但映射到计算机技术本身也是相通的,开源代码/项目就是一种很好的技术交流方式 ...

  2. 2016 正确 sublime安装PHPcs PHPcodesniffer代码规范提示插件,修正网上部分不详细描述

    对你有助请点赞,请顶,不好请踩------送人玫瑰,手留余香!-------------------14:37 2016/3/212016 正确 sublime安装PHPcs PHPcodesniff ...

  3. IDEA 阿里巴巴代码规范检查插件

    1.问题概要 大家都想写出规范的代码,可规范的标准是什么勒,估计每个人心中的标准都不是完全一致的 在分工合作越来越精细化的时代,我们需要一个最大程度接近公认的规范,这里我们以阿里巴巴的代码规范作为参考 ...

  4. 静态代码扫描之阿里java代码规范IDEA插件

    前言 2017年2月9日,首次公布<阿里巴巴Java开发手册>; 2017年9月25日,阿里巴巴集团发布了<阿里巴巴Java开发手册>PDF终极版; 2017年10月14日,在 ...

  5. Java代码规范_插件_阿里java开发手册

    给大家分享一个阿里巴巴的java开发规范,在日常自动化工作中我们可以参考一下,特别是用java进行coding的同学. 而且还可以利用相应的插件进行代码扫描检测,感兴趣的们可以马上应用到自动化中来. ...

  6. IDEA06 代码规范检测插件之Alibaba Java Coding Guidelines

    1 官方资料 1.1 官方介绍 https://mp.weixin.qq.com/s/IbibsXlWHlM59kfXJqRvZA#rd 1.2 github地址 https://github.com ...

  7. 阿里p3c(代码规范,eclipse插件、模版,idea插件)

    阿里p3c 一.说明 代码规范检查插件p3c,是根据<阿里巴巴Java开发手册>转化而成的自动化插件. (高级黑:P-3C“Orion”,反潜巡逻机,阿里大概取p3c先进,监测,发现潜在问 ...

  8. Jenkins系列——使用checkstyle进行代码规范检查【升级版】

    1.背景 在<Jenkins系列——使用checkstyle进行代码规范检查>一文中完成了ant实现代码规范检查的例子.但存在以下缺陷: 每个作业都需要配置一个不同的checkstyle ...

  9. MyEclipse中阿里JAVA代码规范插件(P3C)的安装及使用

    JAVA代码规范插件(P3C)是阿里巴巴2017年10月14日在杭州云栖大会上首发的,使之前的阿里巴巴JAVA开发手册正式以插件形式公开走向业界.插件的相关信息及安装包都可以在GitHub(https ...

随机推荐

  1. 如何使用API接口批量查询图书信息?

    之前小编讲过在Excel表格中根据ISBN查询图书信息可以使用我们的图书查询公式,但偶然间发现少部分书籍由于年份久远导致查不出来,今天小编就教给大家另一种查询图书信息的方式,即通过API接口返回的JS ...

  2. C# 委托/事件本质详解

    委托 一.什么是委托 IL层面1>委托的本质就是一个类2>继承自System.MulticastDelegate3>委托里面内置了3个方法:Invoke(),BeginInvoke( ...

  3. React报错之无法在未挂载的组件上执行React状态更新

    正文从这开始~ 总览 为了解决"Warning: Can't perform a React state update on an unmounted component" ,可以 ...

  4. SDK和API的直接区别

    狭义的说法,在实际工作中, 如果对方需要你提供一个api,是指一个工程提供给另外一个工程的接口(一般是基于http协议). 如果对方需要你提供一个sdk,是指基于对方工程的编程语言,提供一个代码包.在 ...

  5. EMAS Serverless到底有多便利?

    EMAS Serverless 简介 EMAS Serverless 是阿里云提供的基于Serverless技术的一站式后端开发平台,为开发者提供高可用.弹性伸缩的云开发服务,包含云函数.云数据库.云 ...

  6. q 短引用标签

    <q/>标签可以使一段文本作为引用. <p>他说:<q>明天要下雨</q>.</p> 注意,源代码中并没有为这段文字添加引用符号,而是添加了 ...

  7. feign的fallback操作

    Fallback可以帮助我们在使用Feign去调用另外一个服务时,如果出现了问题,走服务降级,返回一个错误数据,避免功能因为一个服务出现问题,全部失效. 依赖: <dependency> ...

  8. Linux 安装 Tomcat 详细教程

    Linux 安装Tomcat详细步骤 1. 前往tomcat官网复制下载链接, tomcat官网地址:https://tomcat.apache.org/ 2. 进入到指定目录,使用 wget 命令下 ...

  9. CF1167F Scalar Queries (线段树/树状数组)

    题意 题解 对于[l,r]中的一个数,不论[l,r]有多大,只有比它小的数可以影响到它的排名,那么就可以把ai从小到大排序,一个一个加入线段树中,线段树中下表为 i 的是ai(原来的位置,不是排序后的 ...

  10. KingbaseES例程之快速删除表数据

    概述 快速删除表中的数据 delete语句删除数据 表中的数据被删除了,但是这个数据在硬盘上的真实存储空间不会被释放. 这种删除缺点是:删除效率比较低. 这种删除优点是:支持删除部分数据,支持回滚. ...