LoParkour/config/checkstyle/checkstyle.xml
loki5512344 02e2947f47
refactor(player): encapsulate game state behind PlayerSettings, clear VisibilityModifier and HiddenField
- ParkourUser/ParkourPlayer/GeneratorState public mutable fields -> private + short accessors
- per-player settings extracted to player/data/PlayerSettings (ParkourPlayer 188 -> 96 lines,
  PMD-counted methods 20 -> 9); this is what fixed the TooManyMethods violation that the
  encapsulation itself introduced — by decomposition, not by lowering the threshold
- disk storage reads and writes the same canonical 12-key map as the SQL JSON column;
  legacy key names normalized on read, @Expose dropped from domain classes
- 39 settings call sites rewritten across 7 files
- HiddenField backlog cleared (Config, ObstacleGenerator, GhostService, Leaderboard,
  PagedMenu, Reward, ParticleData, World)
- checkstyle ratchet: VisibilityModifier, HiddenField, EmptyLineSeparator and
  MissingDeprecated flipped to error once their counters hit zero; suppressions.xml empty
- javac -Xmaxwarns raised so NullAway/Error Prone counts are honest
  (baseline 165/289, now 164/265)

checkstyle 0 errors / 135 warnings, PMD 0 violations, tests 94/0 fail, ./gradlew check green.
TODO.md: items 30 and 107 updated, new items 167-170, ПРОГРЕСС-6/7 recorded.
2026-10-06 18:57:39 +02:00

195 lines
7.4 KiB
XML

<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<!--
Two-tier gate (ratchet):
* severity="error" — rules that are at ZERO violations right now. The build
fails if any of them fires. Strict thresholds live here; they were raised
from the pre-Task-2 values (MethodLength 80->40, CyclomaticComplexity
20->15, NestedIfDepth 3->2, ParameterNumber 7->5, MagicNumber and
FinalLocalVariable promoted from warning to error).
* severity="warning" — the design-debt backlog: rules that are ON and report
every violation in build/reports/checkstyle, but do not fail the build
while their backlog is non-zero. Counts are tracked in TODO.md
(Задача 2, блок «красный baseline»). When a rule reaches zero violations
it MUST be flipped to severity="error" in this file.
suppressions.xml is intentionally empty — never add entries back; fix the
code or, for a documented intentional pattern, agree on it with the owner.
-->
<module name="Checker">
<property name="charset" value="UTF-8"/>
<property name="severity" value="error"/>
<property name="fileExtensions" value="java"/>
<module name="BeforeExecutionExclusionFileFilter">
<property name="fileNamePattern" value=".*[\\/]src[\\/]test[\\/].*"/>
</module>
<!-- Max file size: enforces the 200-line-per-file rule (KISS / decoupling). -->
<module name="FileLength">
<property name="max" value="200"/>
</module>
<module name="SuppressionFilter">
<property name="file" value="${config_loc}/suppressions.xml"/>
<property name="optional" value="true"/>
</module>
<module name="SuppressWarningsFilter"/>
<module name="LineLength">
<property name="max" value="150"/>
<property name="ignorePattern"
value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
</module>
<module name="TreeWalker">
<module name="SuppressWarningsHolder"/>
<module name="MethodLength">
<property name="max" value="40"/>
<property name="countEmpty" value="false"/>
<property name="severity" value="warning"/>
</module>
<module name="CyclomaticComplexity">
<property name="max" value="15"/>
</module>
<module name="ParameterNumber">
<property name="max" value="5"/>
<property name="severity" value="warning"/>
</module>
<module name="ReturnCount">
<property name="max" value="5"/>
<property name="severity" value="warning"/>
</module>
<module name="AvoidStarImport"/>
<module name="UnusedImports"/>
<module name="RedundantImport"/>
<module name="PackageName">
<property name="format" value="^[a-z]+(\.[a-zA-Z][a-zA-Z0-9]*)*$"/>
</module>
<module name="TypeName"/>
<module name="MethodName"/>
<module name="MemberName"/>
<module name="ParameterName"/>
<module name="LocalVariableName"/>
<module name="ConstantName">
<property name="format" value="^log$|^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$"/>
</module>
<module name="NeedBraces"/>
<module name="LeftCurly"/>
<module name="RightCurly"/>
<module name="ModifierOrder"/>
<module name="RedundantModifier"/>
<module name="EmptyStatement"/>
<module name="EqualsHashCode"/>
<module name="SimplifyBooleanExpression"/>
<module name="SimplifyBooleanReturn"/>
<module name="StringLiteralEquality"/>
<module name="DefaultComesLast"/>
<module name="MultipleVariableDeclarations"/>
<module name="OneStatementPerLine"/>
<module name="FallThrough"/>
<module name="HideUtilityClassConstructor"/>
<module name="OneTopLevelClass"/>
<module name="UpperEll"/>
<module name="ArrayTypeStyle"/>
<module name="MissingSwitchDefault"/>
<module name="OuterTypeFilename"/>
<module name="FinalClass"/>
<module name="HiddenField">
<property name="ignoreConstructorParameter" value="true"/>
<property name="ignoreSetter" value="true"/>
<property name="severity" value="error"/>
</module>
<module name="VisibilityModifier">
<property name="allowPublicFinalFields" value="true"/>
<property name="severity" value="error"/>
</module>
<module name="EmptyBlock">
<property name="option" value="text"/>
</module>
<module name="EmptyCatchBlock">
<property name="exceptionVariableName" value="expected|ignore"/>
</module>
<module name="EqualsAvoidNull"/>
<module name="NoFinalizer"/>
<module name="NoClone"/>
<module name="PackageDeclaration"/>
<!-- ============ Complexity and size ============ -->
<module name="NPathComplexity">
<property name="max" value="50"/>
<property name="severity" value="warning"/>
</module>
<module name="NestedIfDepth">
<property name="max" value="2"/>
</module>
<module name="NestedForDepth">
<property name="max" value="2"/>
</module>
<module name="NestedTryDepth">
<property name="max" value="2"/>
</module>
<module name="ClassDataAbstractionCoupling">
<property name="max" value="10"/>
<property name="severity" value="warning"/>
</module>
<module name="ClassFanOutComplexity">
<property name="max" value="12"/>
<property name="severity" value="warning"/>
</module>
<!-- ============ Safety and reliability ============ -->
<module name="MagicNumber">
<property name="ignoreNumbers" value="-1, 0, 1, 2"/>
<property name="ignoreHashCodeMethod" value="true"/>
<property name="ignoreAnnotation" value="true"/>
</module>
<module name="Regexp">
<property name="format" value="System\.(out|err)\.print"/>
<property name="illegalPattern" value="true"/>
<property name="message" value="Use a logger instead of System.out/err"/>
</module>
<module name="Regexp">
<property name="format" value="\.printStackTrace\(\)"/>
<property name="illegalPattern" value="true"/>
<property name="message" value="Use a logger instead of printStackTrace"/>
</module>
<module name="IllegalThrows"/>
<module name="IllegalCatch">
<property name="illegalClassNames"
value="java.lang.Exception, java.lang.Throwable, java.lang.RuntimeException"/>
<property name="severity" value="warning"/>
</module>
<!-- ============ Style and maintainability ============ -->
<module name="EmptyLineSeparator">
<property name="allowNoEmptyLineBetweenFields" value="true"/>
</module>
<module name="WhitespaceAround"/>
<module name="WhitespaceAfter"/>
<module name="NoWhitespaceBefore"/>
<module name="MissingOverride"/>
<module name="MissingDeprecated"/>
<module name="FinalLocalVariable">
<property name="validateEnhancedForLoopVariable" value="true"/>
</module>
</module>
</module>