<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
    "-//Puppy Crawl//DTD Check Configuration 1.2//EN"
    "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
<module name="Checker">

    <!-- Checks that a package.html file exists for each package.     -->
    <!-- See http://checkstyle.sf.net/config_javadoc.html#PackageHtml -->
    <module name="JavadocPackage">
        <property name="severity" value="warning"/>
    </module>

    <!-- Checks whether files end with a new line.                        -->
    <!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile -->
    <module name="NewlineAtEndOfFile"/>

    <module name="Header">
        <property name="headerFile" value="etc/checkstyle/dmdirc.license"/>
        <property name="ignoreLines" value="2, 21"/>
    </module>

    <module name="FileLength"/>

    <module name="FileTabCharacter">
        <property name="eachLine" value="true"/>
    </module>

    <module name="TreeWalker">
        <module name="UncommentedMain"/>
        <module name="TodoComment">
            <property name="severity" value="warning"/>
        </module>
        <module name="SuperFinalize"/>
        <module name="SuperClone"/>
        <module name="RightCurly"/>
        <module name="PackageAnnotation"/>
        <module name="OuterTypeNumber"/>
        <module name="OuterTypeFilename"/>
        <module name="OneStatementPerLine"/>
        <module name="NoFinalizer"/>
        <module name="NoClone"/>
        <module name="NestedForDepth"/>
        <module name="NPathComplexity">
            <property name="severity" value="warning"/>
            <property name="max" value="500"/>
        </module>
        <module name="MultipleVariableDeclarations"/>
        <module name="MissingOverride"/>
        <module name="MissingDeprecated"/>
        <module name="MethodTypeParameterName"/>
        <module name="MethodCount"/>
        <module name="MagicNumber">
            <property name="ignoreHashCodeMethod" value="true"/>
        </module>
        <module name="LineLength">
            <property name="severity" value="warning"/>
            <property name="max" value="100"/>
        </module>
        <module name="JavaNCSS">
            <property name="methodMaximum" value="200"/>
        </module>
        <module name="InnerTypeLast"/>
        <module name="Indentation"/>
        <module name="IllegalType"/>
        <module name="FinalLocalVariable"/>
        <module name="CyclomaticComplexity"/>
        <module name="ImportOrder">
            <property name="groups" value="com.dmdirc,com.google,java,javax"/>
            <property name="ordered" value="true"/>
            <property name="separated" value="true"/>
            <property name="option" value="bottom"/>
        </module>

        <!-- Checks for Javadoc comments.                     -->
        <!-- See http://checkstyle.sf.net/config_javadoc.html -->
        <module name="JavadocMethod">
            <property name="allowUndeclaredRTE" value="true"/>
        </module>
        <module name="JavadocType"/>
        <module name="JavadocVariable"/>
        <module name="JavadocStyle"/>

        <!-- Checks for Naming Conventions.                  -->
        <!-- See http://checkstyle.sf.net/config_naming.html -->
        <module name="ConstantName"/>
        <module name="ClassTypeParameterName"/>
        <module name="LocalFinalVariableName"/>
        <module name="LocalVariableName"/>
        <module name="MemberName"/>
        <module name="MethodName"/>
        <module name="PackageName"/>
        <module name="ParameterName"/>
        <module name="StaticVariableName"/>

        <!-- Checks for imports                              -->
        <!-- See http://checkstyle.sf.net/config_import.html -->
        <module name="IllegalImport"/>
        <module name="RedundantImport"/>
        <module name="UnusedImports"/>

        <!-- Checks for Size Violations.                    -->
        <!-- See http://checkstyle.sf.net/config_sizes.html -->
        <module name="ParameterNumber"/>

        <!-- Checks for whitespace                               -->
        <!-- See http://checkstyle.sf.net/config_whitespace.html -->
        <module name="EmptyForIteratorPad"/>
        <module name="EmptyForInitializerPad"/>
        <module name="MethodParamPad"/>
        <module name="NoWhitespaceAfter"/>
        <module name="NoWhitespaceBefore"/>
        <module name="OperatorWrap"/>
        <module name="ParenPad"/>
        <module name="TypecastParenPad"/>
        <module name="WhitespaceAfter"/>
        <module name="WhitespaceAround">
            <property name="tokens" value="
                ASSIGN, BAND, BAND_ASSIGN, BOR, BOR_ASSIGN, BSR, BSR_ASSIGN, BXOR, BXOR_ASSIGN,
                COLON, DIV, DIV_ASSIGN, EQUAL, GE, GT, LAND, LCURLY, LE, LITERAL_ASSERT,
                LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF,
                LITERAL_RETURN, LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE, 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,  TYPE_EXTENSION_AND, 
                WILDCARD_TYPE" />
        </module>


        <!-- Modifier Checks                                    -->
        <!-- See http://checkstyle.sf.net/config_modifiers.html -->
        <module name="ModifierOrder"/>
        <module name="RedundantModifier"/>


        <!-- Checks for blocks. You know, those {}'s         -->
        <!-- See http://checkstyle.sf.net/config_blocks.html -->
        <module name="AvoidNestedBlocks"/>
        <module name="EmptyBlock"/>
        <module name="LeftCurly"/>
        <module name="NeedBraces"/>
        <module name="RightCurly"/>


        <!-- Checks for common coding problems               -->
        <!-- See http://checkstyle.sf.net/config_coding.html -->
        <module name="EmptyStatement"/>
        <module name="EqualsHashCode"/>
        <module name="HiddenField">
            <property name="ignoreConstructorParameter" value="true"/>
            <property name="ignoreSetter" value="true"/>
            <property name="ignoreAbstractMethods" value="true"/>
        </module>
        <module name="IllegalInstantiation"/>
        <module name="InnerAssignment">
            <property name="severity" value="warning"/>
        </module>
        <module name="MissingSwitchDefault"/>
        <module name="RedundantThrows"/>
        <module name="SimplifyBooleanExpression"/>
        <module name="SimplifyBooleanReturn"/>
        <module name="ArrayTrailingComma"/>
        <module name="CovariantEquals"/>
        <module name="FinalLocalVariable"/>
        <module name="ModifiedControlVariable">
            <property name="severity" value="warning"/>
        </module>
        <module name="StringLiteralEquality"/>
        <module name="NestedIfDepth">
            <property name="max" value="3"/>
        </module>
        <module name="NestedTryDepth"/>
        <module name="IllegalCatch"/>
        <module name="HiddenField">
            <property name="ignoreConstructorParameter" value="true"/>
            <property name="ignoreSetter" value="true"/>
        </module>
        <module name="GenericWhitespace"/>
        <module name="EqualsAvoidNull"/>
        <module name="BooleanExpressionComplexity"/>
        <module name="AnonInnerLength">
            <property name="max" value="50"/>
        </module>
        <module name="AnnotationUseStyle"/>
        <module name="IllegalThrows"/>
        <module name="PackageDeclaration"/>
        <module name="DeclarationOrder"/>
        <module name="ParameterAssignment"/>
        <module name="ExplicitInitialization"/>
        <module name="DefaultComesLast"/>
        <module name="FallThrough"/>
        <module name="UnnecessaryParentheses"/>


        <!-- Checks for class design                         -->
        <!-- See http://checkstyle.sf.net/config_design.html -->
        <module name="FinalClass"/>
        <module name="HideUtilityClassConstructor"/>
        <module name="InterfaceIsType"/>
        <module name="VisibilityModifier"/>
        <module name="MutableException"/>
        <module name="ThrowsCount">
            <property name="max" value="2"/>
        </module>


        <!-- Miscellaneous other checks.                   -->
        <!-- See http://checkstyle.sf.net/config_misc.html -->
        <module name="ArrayTypeStyle"/>
        <module name="FinalParameters"/>
        <module name="UpperEll"/>
    </module>
</module>
