<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
    "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
    "https://checkstyle.org/dtds/configuration_1_3.dtd">

<!--
  Checkstyle Configuration for Nop Platform 2.0

  设计原则:
  1. 只检测真正的 BUG 和潜在缺陷,不强制编码风格
  2. 风格相关规则已按 nop-entropy 项目实际编码习惯配置
  3. 自动生成文件(_gen/、_前缀文件)由 sonar.exclusions 排除,此处不重复处理
  4. 与 SonarQube 互补:Checkstyle 做编译前快速拦截,SonarQube 做深度分析
-->
<module name="Checker">

    <property name="charset" value="UTF-8"/>
    <property name="severity" value="warning"/>
    <property name="fileExtensions" value="java"/>

    <!-- ================================================================== -->
    <!--  Checker 级别规则(文件级检查)                                       -->
    <!-- ================================================================== -->

    <!--
      System.out/err 检测
      cli/、boot/、benchmark 模块合法使用 System.out,通过 suppression 过滤
    -->
    <module name="RegexpSingleline">
        <property name="format" value="System\.(out|err)\.print"/>
        <property name="message" value="核心模块请使用 SLF4J Logger 替代 System.out/err"/>
    </module>

    <!-- ================================================================== -->
    <!--  TreeWalker 级别规则(AST 检查)                                     -->
    <!-- ================================================================== -->
    <module name="TreeWalker">

        <!-- ========== 一、BUG 检测(质量红线) ================ -->

        <!-- 空块检测:允许空块但必须有注释说明原因 -->
        <module name="EmptyBlock">
            <property name="option" value="text"/>
        </module>

        <!-- 空 catch 块:仅允许变量名为 "expected" 的空 catch -->
        <module name="EmptyCatchBlock">
            <property name="exceptionVariableName" value="expected"/>
        </module>

        <!-- 共变 equals:定义了 equals() 但没有覆盖 Object.equals() -->
        <module name="CovariantEquals"/>

        <!-- 禁止 finalize() 方法 -->
        <module name="NoFinalizer"/>

        <!-- 字符串字面量用 == 比较而非 equals() -->
        <module name="StringLiteralEquality"/>

        <!-- 禁止 native 方法 -->
        <module name="IllegalToken">
            <property name="tokens" value="LITERAL_NATIVE"/>
        </module>

        <!-- 未使用的 import -->
        <module name="UnusedImports"/>

        <!-- 冗余 import -->
        <module name="RedundantImport"/>

        <!-- @Deprecated 标注一致性 -->
        <module name="MissingDeprecated"/>

        <!-- ========== 二、按项目实际风格调整的复杂度规则 ========== -->

        <!--
          圈复杂度:放宽到 15
          项目框架代码逻辑分支多,原值 10 产生大量噪音
        -->
        <module name="CyclomaticComplexity">
            <property name="max" value="15"/>
        </module>

        <!--
          方法长度:150 行
          项目实际大部分方法在 50 行内,150 行是合理的上限
        -->
        <module name="MethodLength">
            <property name="max" value="150"/>
            <property name="countEmpty" value="false"/>
        </module>

        <!--
          参数数量:7 个
          Nop 平台 API 方法参数较多,7 个是合理上限
        -->
        <module name="ParameterNumber">
            <property name="max" value="7"/>
        </module>

        <!--
          匿名内部类长度:放宽到 40 行
          项目中 Lambda 和 Stream 使用广泛,20 行限制太严格
        -->
        <module name="AnonInnerLength">
            <property name="max" value="40"/>
        </module>

        <!--
          MagicNumber:允许 -1, 0, 1, 2, 3, 10, 100
          项目大量使用常见字面量,这些数字语义清晰无需常量化
        -->
        <module name="MagicNumber">
            <property name="ignoreNumbers" value="-1, 0, 1, 2, 3, 10, 100"/>
            <property name="ignoreHashCodeMethod" value="true"/>
        </module>

        <!--
          IllegalThrows:保留检测,但允许 throws Exception
          Nop 平台统一使用 NopException 体系,标注 throws Exception 是合法模式
        -->
        <module name="IllegalThrows">
            <property name="illegalClassNames" value="java.lang.Error, java.lang.RuntimeException, java.lang.Throwable"/>
        </module>

        <!--
          Star import:允许 static star import(项目常用 import static xxx.*)
          普通星号导入仍然禁止
        -->
        <module name="AvoidStarImport">
            <property name="allowStaticMemberImports" value="true"/>
        </module>

    </module>
</module>