<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC
    "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
    "https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">
    <property name="tabWidth" value="4"/>
    <property name="charset" value="UTF-8" />

    <module name="SuppressionFilter">
	<property name="file" value="${config_loc}/suppressions.xml" />
    </module>

    <module name="BeforeExecutionExclusionFileFilter">
        <property name="fileNamePattern" value="render_old"/>
    </module>

    <module name="TreeWalker">
        <!-- Annotations -->
        <module name="AnnotationLocation" />
        <module name="AnnotationUseStyle">
            <!-- We want trailing commas on multiline arrays. -->
            <property name="trailingArrayComma" value="ignore" />
        </module>
        <module name="MissingDeprecated" />
        <module name="MissingOverride" />

        <!-- Blocks -->
        <module name="EmptyBlock" />
        <module name="EmptyCatchBlock">
            <property name="exceptionVariableName" value="ignored" />
        </module>
        <module name="LeftCurly" />
        <module name="NeedBraces">
            <property name="allowSingleLineStatement" value="true"/>
        </module>
        <module name="RightCurly" />

        <!-- Class design. As if we've ever followed good practice here. -->
        <module name="FinalClass" />
        <module name="InterfaceIsType" />
        <module name="MutableException" />
        <module name="OneTopLevelClass" />

        <!-- Coding -->
        <module name="ArrayTrailingComma" />
        <module name="EqualsHashCode" />
        <!-- FallThrough does not handle unreachable code well -->
        <module name="IllegalInstantiation" />
        <module name="IllegalThrows" />
        <module name="ModifiedControlVariable" />
        <module name="NoClone" />
        <module name="NoFinalizer" />
        <module name="OneStatementPerLine" />
        <module name="PackageDeclaration" />
        <module name="SimplifyBooleanExpression" />
        <module name="SimplifyBooleanReturn" />
        <module name="StringLiteralEquality" />
        <module name="UnnecessaryParentheses">
            <!-- Default minus LAND. -->
            <property name="tokens" value="EXPR,IDENT,NUM_DOUBLE,NUM_FLOAT,NUM_INT,NUM_LONG,STRING_LITERAL,LITERAL_NULL,LITERAL_FALSE,LITERAL_TRUE,ASSIGN,BAND_ASSIGN,BOR_ASSIGN,BSR_ASSIGN,BXOR_ASSIGN,DIV_ASSIGN,MINUS_ASSIGN,MOD_ASSIGN,PLUS_ASSIGN,SL_ASSIGN,SR_ASSIGN,STAR_ASSIGN,LAMBDA,TEXT_BLOCK_LITERAL_BEGIN,LITERAL_INSTANCEOF,GT,LT,GE,LE,EQUAL,NOT_EQUAL,UNARY_MINUS,UNARY_PLUS,INC,DEC,LNOT,BNOT,POST_INC,POST_DEC" />
        </module>
        <module name="UnnecessarySemicolonAfterTypeMemberDeclaration" />
        <module name="UnnecessarySemicolonInTryWithResources" />
        <module name="UnnecessarySemicolonInEnumeration" />

        <!-- Imports -->
        <module name="CustomImportOrder">
            <property name="customImportOrderRules"
                value="THIRD_PARTY_PACKAGE###STANDARD_JAVA_PACKAGE###STATIC"
            />
        </module>
        <module name="IllegalImport" />
        <module name="RedundantImport" />
        <module name="UnusedImports" />

        <!-- Javadoc -->
        <!-- TODO: Missing* checks for the dan200.computercraft.api package? -->
        <module name="AtclauseOrder">
            <property name="tagOrder" value="@param, @return, @throws, @deprecated"/>
        </module>
        <module name="InvalidJavadocPosition" />
        <module name="JavadocBlockTagLocation" />
        <module name="JavadocMethod"/>
        <module name="JavadocType"/>
        <module name="JavadocStyle">
            <property name="checkHtml" value="false" />
        </module>
        <module name="NonEmptyAtclauseDescription" />
        <module name="SingleLineJavadoc" />
        <module name="SummaryJavadocCheck"/>

        <!-- Misc -->
        <module name="ArrayTypeStyle" />
        <module name="CommentsIndentation" />
        <module name="Indentation" />
        <module name="OuterTypeFilename" />

        <!-- Modifiers -->
        <module name="ModifierOrder" />
        <module name="RedundantModifier" />

        <!-- Naming -->
        <module name="ClassTypeParameterName" />
        <module name="InterfaceTypeParameterName" />
        <module name="LambdaParameterName" />
        <module name="LocalFinalVariableName" />
        <module name="LocalVariableName" />
        <module name="MemberName" />
        <module name="MethodName">
            <property name="format" value="^(computercraft\$)?[a-z][a-zA-Z0-9]*$" />
        </module>
        <module name="MethodTypeParameterName" />
        <module name="PackageName">
            <property name="format" value="^(dan200\.computercraft|cc\.tweaked)(\.[a-z][a-z0-9]*)*" />
        </module>
        <module name="ParameterName" />
        <module name="StaticVariableName">
            <property name="format" value="^[a-z][a-zA-Z0-9]*|CAPABILITY(_[A-Z_]+)?$" />
        </module>
        <module name="TypeName" />

        <!-- Whitespace -->
        <module name="EmptyForInitializerPad"/>
        <module name="EmptyForIteratorPad">
            <property name="option" value="space"/>
        </module>
        <module name="GenericWhitespace" />
        <module name="MethodParamPad" />
        <module name="NoLineWrap" />
        <module name="NoWhitespaceAfter">
            <property name="tokens" value="AT,INC,DEC,UNARY_MINUS,UNARY_PLUS,BNOT,LNOT,DOT,ARRAY_DECLARATOR,INDEX_OP,METHOD_REF" />
        </module>
        <module name="NoWhitespaceBefore" />
        <!-- TODO: Decide on an OperatorWrap style. -->
        <module name="ParenPad" />
        <module name="SeparatorWrap">
            <property name="option" value="eol" />
            <property name="tokens" value="COMMA,SEMI,ELLIPSIS,ARRAY_DECLARATOR,RBRACK,METHOD_REF" />
        </module>
        <module name="SeparatorWrap">
            <property name="option" value="nl" />
            <property name="tokens" value="DOT,AT" />
        </module>
        <module name="SingleSpaceSeparator" />
        <module name="TypecastParenPad" />
        <module name="WhitespaceAfter">
            <property name="tokens" value="COMMA" />
        </module>
        <module name="WhitespaceAround">
            <property name="ignoreEnhancedForColon" value="false" />
            <!-- Allow empty functions -->
            <property name="allowEmptyLambdas" value="true" />
            <property name="allowEmptyMethods" value="true" />
            <property name="allowEmptyConstructors" value="true" />
            <property name="allowEmptyTypes" value="true" />

            <property name="tokens" value="ASSIGN,BAND,BAND_ASSIGN,BOR,BOR_ASSIGN,BSR,BSR_ASSIGN,BXOR,BXOR_ASSIGN,COLON,DIV,DIV_ASSIGN,EQUAL,GE,GT,LAMBDA,LAND,LCURLY,LE,LITERAL_RETURN,LOR,LT,MINUS,MINUS_ASSIGN,MOD,MOD_ASSIGN,NOT_EQUAL,PLUS,PLUS_ASSIGN,QUESTION,RCURLY,SL,SLIST,SL_ASSIGN,SR,SR_ASSIGN,STAR,STAR_ASSIGN,LITERAL_ASSERT,TYPE_EXTENSION_AND" />
        </module>
    </module>

    <module name="FileTabCharacter" />
    <module name="NewlineAtEndOfFile" />
    <module name="RegexpSingleline">
        <property name="format" value="\s+$"/>
        <property name="message" value="Trailing whitespace"/>
    </module>
</module>