<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC
    "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
    "https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">
  <!-- Tabs are strictly banned -->
  <module name="FileTabCharacter"/>
  <module name="SuppressWarningsFilter" />
  <module name="TreeWalker">
    <module name="SuppressWarningsHolder" /> <!-- allows for @SuppressWarnings annotation -->
    <!-- Important basics -->
    <!-- <module name="PackageDeclaration"/> Unlikely that we would miss this in a PR -->
    <module name="OuterTypeFilename"/> <!-- TypeName -> TypeName.java -->

    <!--
    Control package usage, so people don't insert Bukkit into WE where it shouldn't belong, etc.
    It is a bit draconian, so update as necessary!
    -->
<!--
    <module name="ImportControl">
      <property name="file" value="${config_loc}/import-control.xml"/>
    </module>
-->

    <!-- Code -->
    <module name="HideUtilityClassConstructor"/> <!-- Utility classes should not have a constructor -->
    <module name="CovariantEquals"/>
    <module name="EqualsHashCode"/> <!-- equals() and hashCode() go together -->
    <module name="NestedTryDepth"> <!-- SHOULD not need to adjust this -->
      <property name="max" value="2"/>
    </module>
    <module name="SuperFinalize"/> <!-- We don't actually use this -->

    <!-- Style -->
    <module name="LeftCurly"> <!-- Left brace never goes on another line -->
      <property name="option" value="eol"/>
    </module> <!-- We don't check right brance -->
    <module name="DefaultComesLast"/> <!-- default case in switch should be last -->
    <module name="GenericWhitespace"/>

    <!-- Naming -->
    <module name="ClassTypeParameterName">
      <property name="format" value="^[A-Z][a-zA-Z0-9]*$"/>
    </module>
    <module name="LocalFinalVariableName"/>
    <module name="LocalVariableName">
      <property name="format" value="^[a-z_][a-zA-Z0-9]*$"/>
    </module>
    <module name="MemberName">
      <property name="format" value="^[a-z_][a-zA-Z0-9]*$"/>
    </module>
    <module name="MethodName">
      <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
    </module>
    <!-- <module name="PackageName"/> Unlikely that we would miss this in a PR -->
    <module name="ParameterName"/>
    <!-- <module name="TypeName"/> Unlikely that we would miss this in a PR -->
    <!-- Validate assignment operators -->
    <module name="WhitespaceAround">
      <property name="tokens" value="ASSIGN"/>
    </module>
    <!-- Validate String.to(Lower|Upper)Case() calls include Locale argument -->
    <module name="Regexp">
      <property name="message" value="Case-conversion calls must include an explicit Locale"/>
      <property name="format" value="(?!Character)\.to(Lower|Upper)Case\(\)"/>
      <property name="illegalPattern" value="true"/>
    </module>
  </module>
  <!-- Validate that command annotations are formatted correctly -->
  <module name="RegexpMultiline">
    <property name="format" value="^( +)@(Arg|Switch|Command)\(.*?\n\1 {5,}"/>
  </module>
</module>