<?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">

<!-- based on https://github.com/KyoriPowered/adventure/blob/master/.checkstyle/checkstyle.xml -->

<module name="Checker">
    <property name="charset" value="UTF-8"/>
    <property name="fileExtensions" value="java, properties, xml"/>
    <property name="severity" value="error"/>

    <!-- https://checkstyle.org/config_filefilters.html#BeforeExecutionExclusionFileFilter -->
    <module name="BeforeExecutionExclusionFileFilter">
        <property name="fileNamePattern" value="module\-info\.java$"/>
    </module>

    <!-- https://checkstyle.org/config_whitespace.html#FileTabCharacter -->
    <module name="FileTabCharacter">
        <property name="eachLine" value="true"/>
    </module>

    <!-- https://checkstyle.org/config_misc.html#NewlineAtEndOfFile -->
    <module name="NewlineAtEndOfFile"/>

    <!-- https://checkstyle.org/config_filters.html#SuppressionFilter -->
    <module name="SuppressionFilter">
        <property name="file" value="${configDirectory}/suppressions.xml"/>
    </module>

    <!-- https://checkstyle.org/config_filters.html#SuppressWithPlainTextCommentFilter -->
    <module name="SuppressWithPlainTextCommentFilter"/>

    <module name="TreeWalker">
        <!-- https://checkstyle.org/config_misc.html#ArrayTypeStyle -->
        <module name="ArrayTypeStyle"/>

        <!-- https://checkstyle.org/config_imports.html#AvoidStarImport -->
        <module name="AvoidStarImport"/>

        <!-- https://checkstyle.org/config_misc.html#AvoidEscapedUnicodeCharacters -->
        <module name="AvoidEscapedUnicodeCharacters">
            <property name="allowByTailComment" value="true"/>
            <property name="allowEscapesForControlCharacters" value="true"/>
            <property name="allowNonPrintableEscapes" value="true"/>
            <property name="severity" value="info"/>
        </module>

        <!-- https://checkstyle.org/config_misc.html#CommentsIndentation -->
        <module name="CommentsIndentation"/>

        <!-- https://checkstyle.org/config_whitespace.html#EmptyForInitializerPad -->
        <module name="EmptyForInitializerPad"/>

        <!-- https://checkstyle.org/config_whitespace.html#EmptyForIteratorPad -->
        <module name="EmptyForIteratorPad"/>

        <!-- https://checkstyle.org/config_whitespace.html#EmptyLineSeparator -->
        <module name="EmptyLineSeparator">
            <property name="allowMultipleEmptyLines" value="false"/>
            <property name="allowMultipleEmptyLinesInsideClassMembers" value="false"/>
            <property name="allowNoEmptyLineBetweenFields" value="true"/>
            <property name="tokens"
                      value="CLASS_DEF, CTOR_DEF, ENUM_DEF, IMPORT, INSTANCE_INIT, INTERFACE_DEF, METHOD_DEF, STATIC_IMPORT, STATIC_INIT, VARIABLE_DEF"/> <!-- remove PACKAGE_DEF, temporarily remove COMPACT_CTOR_DEF, RECORD_DEF -->
        </module>

        <!-- https://checkstyle.org/config_coding.html#FallThrough -->
        <module name="FallThrough">
            <property name="checkLastCaseGroup" value="true"/>
        </module>

        <!-- https://checkstyle.org/config_design.html#FinalClass -->
        <module name="FinalClass"/>

        <!-- https://checkstyle.org/config_coding.html#FinalLocalVariable -->
        <module name="FinalLocalVariable"/>

        <!-- https://checkstyle.org/config_whitespace.html#GenericWhitespace -->
        <module name="GenericWhitespace"/>

        <!-- https://checkstyle.org/config_design.html#HideUtilityClassConstructor -->
        <module name="HideUtilityClassConstructor"/>

        <!-- https://checkstyle.org/config_imports.html#IllegalImport -->
        <module name="IllegalImport">
            <property name="illegalPkgs" value="sun, jdk, com.sun"/>
        </module>

        <!-- https://checkstyle.org/config_coding.html#IllegalTokenText -->
        <module name="IllegalTokenText">
            <property name="format"
                      value="\\u00(09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)"/>
            <property name="message"
                      value="Consider using special escape sequence instead of octal value or Unicode escaped value."/>
            <property name="tokens" value="CHAR_LITERAL, STRING_LITERAL"/>
        </module>

        <!-- https://checkstyle.org/config_misc.html#Indentation -->
        <module name="Indentation"/>

        <!-- https://checkstyle.org/config_blocks.html#LeftCurly -->
        <module name="LeftCurly"/>

        <!-- https://checkstyle.org/config_naming.html#MethodName -->
        <module name="MethodName">
            <property name="format" value="^[_]?[a-z][a-zA-Z0-9]*$"/>
        </module>

        <!-- https://checkstyle.org/config_whitespace.html#MethodParamPad -->
        <module name="MethodParamPad"/>

        <!-- https://checkstyle.org/config_javadoc.html#MissingJavadocMethod -->
        <module name="MissingJavadocMethod">
            <property name="allowMissingPropertyJavadoc" value="true"/>
            <property name="tokens" value="METHOD_DEF, ANNOTATION_FIELD_DEF"/> <!-- remove CTOR_DEF, COMPACT_CTOR_DEF -->
        </module>

        <!-- https://checkstyle.org/config_javadoc.html#MissingJavadocType -->
        <module name="MissingJavadocType"/>

        <!-- https://checkstyle.org/config_coding.html#NoFinalizer -->
        <module name="NoFinalizer"/>

        <!-- https://checkstyle.org/config_whitespace.html#NoLineWrap -->
        <module name="NoLineWrap"/>

        <!-- https://checkstyle.org/config_whitespace.html#NoWhitespaceAfter -->
        <module name="NoWhitespaceAfter">
            <property name="allowLineBreaks" value="false"/>
        </module>

        <!-- https://checkstyle.org/config_whitespace.html#NoWhitespaceBefore -->
        <module name="NoWhitespaceBefore">
            <property name="allowLineBreaks" value="true"/>
        </module>

        <!-- https://checkstyle.org/config_coding.html#OneStatementPerLine -->
        <module name="OneStatementPerLine"/>

        <!-- https://checkstyle.org/config_misc.html#OuterTypeFilename -->
        <module name="OuterTypeFilename"/>

        <!-- https://checkstyle.org/config_imports.html#RedundantImport -->
        <module name="RedundantImport"/>

        <!-- https://checkstyle.org/config_modifier.html#RedundantModifier -->
        <module name="RedundantModifier">
            <property name="tokens"
                      value="ANNOTATION_FIELD_DEF, CLASS_DEF, CTOR_DEF, ENUM_DEF, INTERFACE_DEF, VARIABLE_DEF"/> <!-- remove METHOD_DEF and RESOURCE -->
        </module>

        <!-- https://checkstyle.org/config_coding.html#RequireThis -->
        <module name="RequireThis"/>

        <!-- https://checkstyle.org/config_blocks.html#RightCurly -->
        <module name="RightCurly">
            <property name="id" value="RightCurlyAlone"/>
            <property name="option" value="alone"/>
            <property name="tokens"
                      value="ANNOTATION_DEF, CLASS_DEF, CTOR_DEF, ENUM_DEF, INSTANCE_INIT, LITERAL_FOR, LITERAL_WHILE, METHOD_DEF, STATIC_INIT"/>
        </module>
        <module name="RightCurly">
            <property name="id" value="RightCurlySame"/>
            <property name="option" value="same"/>
            <property name="tokens"
                      value="LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_IF, LITERAL_TRY"/> <!-- add LITERAL_DO -->
        </module>

        <!-- https://checkstyle.org/config_whitespace.html#SingleSpaceSeparator -->
        <module name="SingleSpaceSeparator">
            <property name="validateComments" value="true"/>
        </module>

        <!-- https://checkstyle.org/config_whitespace.html#TypecastParenPad -->
        <module name="TypecastParenPad"/>

        <!-- https://checkstyle.org/config_coding.html#UnnecessaryParentheses -->
        <module name="UnnecessaryParentheses"/>

        <!-- https://checkstyle.org/config_imports.html#UnusedImports -->
        <module name="UnusedImports"/>

    </module>
</module>