<?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" />
        <module name="MissingDeprecated" />
        <module name="MissingOverride" />

        <!-- Blocks -->
        <module name="EmptyBlock" />
        <module name="EmptyCatchBlock">
            <property name="exceptionVariableName" value="ignored" />
        </module>
        <module name="LeftCurly">
            <property name="option" value="nl" />
            <!-- The defaults, minus lambdas. -->
            <property name="tokens" value="ANNOTATION_DEF,CLASS_DEF,CTOR_DEF,ENUM_CONSTANT_DEF,ENUM_DEF,INTERFACE_DEF,LITERAL_CASE,LITERAL_CATCH,LITERAL_DEFAULT,LITERAL_DO,LITERAL_ELSE,LITERAL_FINALLY,LITERAL_FOR,LITERAL_IF,LITERAL_SWITCH,LITERAL_SYNCHRONIZED,LITERAL_TRY,LITERAL_WHILE,METHOD_DEF,OBJBLOCK,STATIC_INIT" />
        </module>
        <module name="NeedBraces">
            <property name="allowSingleLineStatement" value="true"/>
        </module>
        <module name="RightCurly">
            <property name="option" value="alone" />
        </module>

        <!-- 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" />
        <module name="UnnecessarySemicolonAfterTypeMemberDeclaration" />
        <module name="UnnecessarySemicolonInTryWithResources" />
        <module name="UnnecessarySemicolonInEnumeration" />

        <!-- Imports -->
        <module name="CustomImportOrder" />
        <module name="IllegalImport" />
        <module name="RedundantImport" />
        <module name="UnusedImports" />

        <!-- Javadoc -->
        <!-- TODO: Missing* checks for the dan200.computercraft.api package? -->
        <module name="AtclauseOrder" />
        <module name="InvalidJavadocPosition" />
        <module name="JavadocBlockTagLocation" />
        <module name="JavadocMethod"/>
        <module name="JavadocType"/>
        <module name="JavadocStyle" />
        <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" />
        <module name="MethodTypeParameterName" />
        <module name="PackageName">
            <property name="format" value="^dan200\.computercraft(\.[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_]+)?$" />
            <property name="applyToPrivate" value="false" />
        </module>
        <module name="StaticVariableName">
            <property name="format" value="^(s_)?[a-z][a-zA-Z0-9]*|CAPABILITY(_[A-Z_]+)?$" />
            <property name="applyToPrivate" value="true" />
        </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" />
        </module>
        <module name="NoWhitespaceBefore" />
        <!-- TODO: Decide on an OperatorWrap style. -->
        <module name="ParenPad">
            <property name="option" value="space" />
            <property name="tokens" value="ANNOTATION,ANNOTATION_FIELD_DEF,CTOR_CALL,CTOR_DEF,ENUM_CONSTANT_DEF,LITERAL_CATCH,LITERAL_DO,LITERAL_FOR,LITERAL_IF,LITERAL_NEW,LITERAL_SWITCH,LITERAL_SYNCHRONIZED,LITERAL_WHILE,METHOD_CALL,METHOD_DEF,RESOURCE_SPECIFICATION,SUPER_CTOR_CALL,LAMBDA" />
        </module>
        <module name="ParenPad">
            <property name="option" value="nospace" />
            <property name="tokens" value="DOT,EXPR,QUESTION" />
        </module>
        <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="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>
