dili-codestyle.xml 12.7 KB
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
          "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
          "http://checkstyle.sourceforge.net/dtds/configuration_1_3.dtd">

<!--地利集团技术研发部内部代码规范-->

<module name = "Checker">
    <property name="charset" value="UTF-8"/>

    <property name="severity" value="warning"/>

    <property name="fileExtensions" value="java, properties, xml"/>
    <!--文件中不允许出现Tab键, 包含Tab的每行都report-->
    <module name="FileTabCharacter">
        <property name="eachLine" value="true"/>
    </module>

    <module name="TreeWalker">
        <!--JAVA文件名与外层类型(类名)一致-->
        <module name="OuterTypeFilename"/>
        <!--文件每行长度不超过140个字符, 包名 类型引用 URL除外-->
        <module name="LineLength">
            <property name="max" value="140"/>
            <property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
        </module>
        <!--类型引用不允许使用*-->
        <module name="AvoidStarImport"/>
        <!--类型引用 包名 静态引用不允许换行-->
        <module name="NoLineWrap">
            <property name="tokens" value="IMPORT, PACKAGE_DEF, STATIC_IMPORT"/>
        </module>
        <!--try finally if else switch不允许空代码块, 但连续block除外, 比如: if (condition) {} -->
        <module name="EmptyBlock">
            <property name="option" value="TEXT"/>
            <property name="tokens" value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH"/>
        </module>
        <!--do while if else for语句块必须使用大括号{}, 连续block除外, 比如: if (condition) return false;-->
        <module name="NeedBraces"/>
        <!--代码块的左大括号在同一行显示-->
        <module name="LeftCurly">
            <property name="option" value="eol"/>
        </module>
        <!--multi-block语句try catch finally if else do的右大括号在同一行显示, } catch (Exception ex) { -->
        <module name="RightCurly">
            <property name="id" value="RightCurlySame"/>
            <property name="option" value="same"/>
            <property name="tokens" value="LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_DO"/>
        </module>
        <!--类定义 方法定义 构造方法和for while static no-static块的右大括号换行显示-->
        <module name="RightCurly">
            <property name="id" value="RightCurlyAlone"/>
            <property name="option" value="alone"/>
            <property name="tokens" value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, STATIC_INIT, INSTANCE_INIT"/>
        </module>
        <!--token必须使用空格隔开, 同时允许空构造函数 方法 类型定义 空循环体-->
        <module name="WhitespaceAround">
            <property name="allowEmptyConstructors" value="true"/>
            <property name="allowEmptyMethods" value="true"/>
            <property name="allowEmptyTypes" value="true"/>
            <property name="allowEmptyLoops" value="true"/>
            <message key="ws.notFollowed"
             value="WhitespaceAround: ''{0}'' is not followed by whitespace. Empty blocks may only be represented as '{}' when not part of a multi-block statement (4.1.3)"/>
             <message key="ws.notPreceded"
             value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/>
        </module>
        <!--每行只允许一个语句块, int i=1; int j=1;将导致检查失败-->
        <module name="OneStatementPerLine"/>
        <!--不允许多个变量定义在同一行-->
        <module name="MultipleVariableDeclarations"/>
        <!--数组定义风格必须使用java风格: String[] args, 不允许使用String args[]-->
        <module name="ArrayTypeStyle"/>
        <!--Switch语句必须包含一个default语句块-->
        <module name="MissingSwitchDefault"/>
        <!--Long类型常量定义时必须使用L, 而不是l-->
        <module name="UpperEll"/>
        <!--类定义里面方法和变量等的顺序遵循: public protected private abstract default static final transient volatile synchronized native-->
        <module name="ModifierOrder"/>
        <!--package语句, 所有import语句 所有成员变量 构造函数定义 方法定义 内部类 static块 non-static块必须使用空行隔开-->
        <module name="EmptyLineSeparator">
            <property name="allowNoEmptyLineBetweenFields" value="true"/>
        </module>
        <!--
        如果语句过长需要分行时 .号放在下一行
        StringBuilder build = new StringBuilder();
        build.append("a")
            .append("b");
        -->
        <module name="SeparatorWrap">
            <property name="id" value="SeparatorWrapDot"/>
            <property name="tokens" value="DOT"/>
            <property name="option" value="nl"/>
        </module>
        <!--
        如果语句过长需要分行时 ,号保持在同一行
        foo(i,
            s)
        -->
        <module name="SeparatorWrap">
            <property name="id" value="SeparatorWrapComma"/>
            <property name="tokens" value="COMMA"/>
            <property name="option" value="EOL"/>
        </module>
        <!--如果语句过长需要分行时, 可变参数 ... 保持在同一行-->
        <module name="SeparatorWrap">
            <property name="id" value="SeparatorWrapEllipsis"/>
            <property name="tokens" value="ELLIPSIS"/>
            <property name="option" value="EOL"/>
        </module>
        <!--如果语句过长需要分行时, 数组符号 []保持在同一行-->
        <module name="SeparatorWrap">
            <property name="id" value="SeparatorWrapArrayDeclarator"/>
            <property name="tokens" value="ARRAY_DECLARATOR"/>
            <property name="option" value="EOL"/>
        </module>
        <!--如果语句过长需要分行时, jdk8 lambda风格的方法引用 ::放在下一行-->
        <module name="SeparatorWrap">
            <property name="id" value="SeparatorWrapMethodRef"/>
            <property name="tokens" value="METHOD_REF"/>
            <property name="option" value="nl"/>
        </module>
        <!--包名必须符合以下正则表达式-->
        <module name="PackageName">
            <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
            <message key="name.invalidPattern"
             value="Package name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <!--类型名必须符合默认正则表达式: 首字母大写-->
        <module name="TypeName">
            <message key="name.invalidPattern"
             value="Type name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <!--成员变量名必须符合以下正则表达式: 首字母小写-->
        <module name="MemberName">
            <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
            <message key="name.invalidPattern"
             value="Member name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <!--参数名必须符合以下正则表达式: 首字母小写-->
        <module name="ParameterName">
            <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
            <message key="name.invalidPattern"
             value="Parameter name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <!--catch语句块中的参数名必须符合以下正则表达式: 首字母小写-->
        <module name="CatchParameterName">
            <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
            <message key="name.invalidPattern"
             value="Catch parameter name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <!--定义的局部变量名必须符合以下正则表达式: 首字母小写-->
        <module name="LocalVariableName">
            <property name="tokens" value="VARIABLE_DEF"/>
            <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
            <message key="name.invalidPattern"
             value="Local variable name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <!--类名Class xxx必须符合以下正则表达式-->
        <module name="ClassTypeParameterName">
            <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
            <message key="name.invalidPattern"
             value="Class type name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <!--方法参数Method xxx必须符合以下正则表达式-->
        <module name="MethodTypeParameterName">
            <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
            <message key="name.invalidPattern"
             value="Method type name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <!--接口名interface xxx必须符合以下正则表达式-->
        <module name="InterfaceTypeParameterName">
            <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
            <message key="name.invalidPattern"
             value="Interface type name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <!--泛型使用的< >前后空格检查, 不同的泛型使用场景, 检查的空格策略不同-->
        <module name="GenericWhitespace">
            <message key="ws.followed"
             value="GenericWhitespace ''{0}'' is followed by whitespace."/>
             <message key="ws.preceded"
             value="GenericWhitespace ''{0}'' is preceded with whitespace."/>
             <message key="ws.illegalFollow"
             value="GenericWhitespace ''{0}'' should followed by whitespace."/>
             <message key="ws.notPreceded"
             value="GenericWhitespace ''{0}'' is not preceded with whitespace."/>
        </module>
        <!--换行时的缩进策略-->
        <module name="Indentation">
            <!--普通换行时缩进策略-->
            <property name="basicOffset" value="4"/>
            <!--大括号被换行时缩进策略-->
            <property name="braceAdjustment" value="0"/>
            <!--case语句换行时缩进策略-->
            <property name="caseIndent" value="4"/>
            <!--throws语句缩进策略-->
            <property name="throwsIndent" value="4"/>
            <!---->
            <property name="lineWrappingIndentation" value="4"/>
            <!--数组初始化时缩进策略-->
            <property name="arrayInitIndent" value="4"/>
        </module>
        <!--在命名规则中允许allowedAbbreviationLength+1个连续大写字母出现-->
        <module name="AbbreviationAsWordInName">
            <property name="ignoreFinal" value="false"/>
            <property name="allowedAbbreviationLength" value="1"/>
        </module>
        <!--方法名相同但参数不同的overload方法放在一起-->
        <module name="OverloadMethodsDeclarationOrder"/>
        <!--变量定义与使用的距离不能超过默认值3-->
        <module name="VariableDeclarationUsageDistance"/>
        <!--检查import顺序-->
        <module name="CustomImportOrder">
            <property name="sortImportsInGroupAlphabetically" value="true"/>
            <property name="separateLineBetweenGroups" value="true"/>
            <property name="customImportOrderRules" value="STATIC###THIRD_PARTY_PACKAGE"/>
        </module>
        <!--检查方法格式-->
        <module name="MethodParamPad"/>
        <!--在某些符号前不能存在空格-->
        <module name="NoWhitespaceBefore">
          <property name="tokens" value="COMMA, SEMI, POST_INC, POST_DEC, DOT, ELLIPSIS, METHOD_REF"/>
            <property name="allowLineBreaks" value="true"/>
        </module>
        <!--检查小括号()两边的空格策略-->
        <module name="ParenPad"/>
        <!--需要换行时, 检查下列运算符必须在下一行-->
        <module name="OperatorWrap">
            <property name="option" value="NL"/>
            <property name="tokens" value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR, LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR, METHOD_REF "/>
        </module>
        <!--方法名命名规则-->
        <module name="MethodName">
            <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$"/>
            <message key="name.invalidPattern"
             value="Method name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <!--异常变量名为expected或有任何注解在里面, 允许空catch块-->
        <module name="EmptyCatchBlock">
            <property name="exceptionVariableName" value="expected"/>
        </module>
        <!--注释的缩进策略, 应与被注释代码缩进策略一样-->
        <module name="CommentsIndentation"/>
    </module>
</module>