{
"codeNarc": {
"url": "https://codenarc.org",
"version": "4.0.0"
},
"report": {
"timestamp": "2026 Jul 18 09:27:31"
},
"project": {
"title": "Sample Project",
"sourceDirectories": [
"src/test/groovy/org/codenarc/rule"
]
},
"summary": {
"totalFiles": 432,
"filesWithViolations": 62,
"priority1": 0,
"priority2": 84,
"priority3": 41
},
"packages": [
{
"path": "",
"totalFiles": 9,
"filesWithViolations": 3,
"priority1": 0,
"priority2": 0,
"priority3": 12,
"files": [
{
"name": "AbstractAstVisitorRuleTest.groovy",
"violations": [
{
"ruleName": "UnnecessaryObjectReferences",
"priority": 3,
"lineNumber": 185,
"sourceLine": "rule.doNotApplyToClassNames = 'Xxx' // doNotApply = NO",
"message": "The code could be more concise by using a with() or identity() block"
},
{
"ruleName": "UnnecessaryObjectReferences",
"priority": 3,
"lineNumber": 188,
"sourceLine": "rule.applyToClassNames = 'Xxx' // apply = NO",
"message": "The code could be more concise by using a with() or identity() block"
},
{
"ruleName": "UnnecessaryObjectReferences",
"priority": 3,
"lineNumber": 189,
"sourceLine": "rule.doNotApplyToClassNames = 'Xxx' // doNotApply = NO",
"message": "The code could be more concise by using a with() or identity() block"
}
]
},
{
"name": "AbstractAstVisitorTest.groovy",
"violations": [
]
},
{
"name": "AbstractClassReferenceRuleTestCase.groovy",
"violations": [
]
},
{
"name": "AbstractEnhanceableAstVisitorRuleTest.groovy",
"violations": [
]
},
{
"name": "AbstractRuleTest.groovy",
"violations": [
{
"ruleName": "UnnecessaryObjectReferences",
"priority": 3,
"lineNumber": 137,
"sourceLine": "rule.doNotApplyToFilesMatching = NO_MATCH // doNotApply = NO",
"message": "The code could be more concise by using a with() or identity() block"
},
{
"ruleName": "UnnecessaryObjectReferences",
"priority": 3,
"lineNumber": 140,
"sourceLine": "rule.applyToFilesMatching = NO_MATCH // apply = NO",
"message": "The code could be more concise by using a with() or identity() block"
},
{
"ruleName": "UnnecessaryObjectReferences",
"priority": 3,
"lineNumber": 141,
"sourceLine": "rule.doNotApplyToFilesMatching = NO_MATCH // doNotApply = NO",
"message": "The code could be more concise by using a with() or identity() block"
},
{
"ruleName": "UnnecessaryObjectReferences",
"priority": 3,
"lineNumber": 177,
"sourceLine": "rule.applyToFileNames = 'org/codenarc/MyOtherTest.groovy'",
"message": "The code could be more concise by using a with() or identity() block"
},
{
"ruleName": "UnnecessaryObjectReferences",
"priority": 3,
"lineNumber": 225,
"sourceLine": "rule.doNotApplyToFileNames = 'Xxx.groovy' // doNotApply = NO",
"message": "The code could be more concise by using a with() or identity() block"
},
{
"ruleName": "UnnecessaryObjectReferences",
"priority": 3,
"lineNumber": 228,
"sourceLine": "rule.applyToFileNames = 'Xxx.groovy' // apply = NO",
"message": "The code could be more concise by using a with() or identity() block"
},
{
"ruleName": "UnnecessaryObjectReferences",
"priority": 3,
"lineNumber": 229,
"sourceLine": "rule.doNotApplyToFileNames = 'Xxx.groovy' // doNotApply = NO",
"message": "The code could be more concise by using a with() or identity() block"
}
]
},
{
"name": "FakeCountRule.groovy",
"violations": [
]
},
{
"name": "FakePathRule.groovy",
"violations": [
]
},
{
"name": "InlineViolationsParserTest.groovy",
"violations": [
{
"ruleName": "MisorderedStaticImports",
"priority": 3,
"lineNumber": 20,
"sourceLine": "import static org.codenarc.rule.InlineViolationsParser.inlineViolation",
"message": "Static imports should appear before normal imports"
},
{
"ruleName": "UnnecessaryReturnKeyword",
"priority": 3,
"lineNumber": 199,
"sourceLine": "return [lineNumber: lineNumber, sourceLineText: sourceLineText, messageText: messageText]",
"message": "The return keyword is not needed and can be removed"
}
]
},
{
"name": "MockRule.groovy",
"violations": [
]
}
]
},
{
"path": "basic",
"totalFiles": 45,
"filesWithViolations": 1,
"priority1": 0,
"priority2": 0,
"priority3": 1,
"files": [
{
"name": "AssertWithinFinallyBlockRuleTest.groovy",
"violations": [
]
},
{
"name": "AssignmentInConditionalRuleTest.groovy",
"violations": [
]
},
{
"name": "BigDecimalInstantiationRuleTest.groovy",
"violations": [
]
},
{
"name": "BitwiseOperatorInConditionalRuleTest.groovy",
"violations": [
]
},
{
"name": "BooleanGetBooleanRuleTest.groovy",
"violations": [
]
},
{
"name": "BrokenNullCheckRuleTest.groovy",
"violations": [
]
},
{
"name": "BrokenOddnessCheckRuleTest.groovy",
"violations": [
]
},
{
"name": "ClassForNameRuleTest.groovy",
"violations": [
]
},
{
"name": "ComparisonOfTwoConstantsRuleTest.groovy",
"violations": [
]
},
{
"name": "ComparisonWithSelfRuleTest.groovy",
"violations": [
]
},
{
"name": "ConstantAssertExpressionRuleTest.groovy",
"violations": [
]
},
{
"name": "ConstantIfExpressionRuleTest.groovy",
"violations": [
]
},
{
"name": "ConstantTernaryExpressionRuleTest.groovy",
"violations": [
]
},
{
"name": "ConstantTernaryExpressionRule_ElvisTest.groovy",
"violations": [
]
},
{
"name": "DeadCodeRuleTest.groovy",
"violations": [
]
},
{
"name": "DoubleNegativeRuleTest.groovy",
"violations": [
]
},
{
"name": "DuplicateCaseStatementRuleTest.groovy",
"violations": [
]
},
{
"name": "DuplicateMapKeyRuleTest.groovy",
"violations": [
]
},
{
"name": "DuplicateSetValueRuleTest.groovy",
"violations": [
]
},
{
"name": "EmptyCatchBlockRuleTest.groovy",
"violations": [
]
},
{
"name": "EmptyClassRuleTest.groovy",
"violations": [
]
},
{
"name": "EmptyElseBlockRuleTest.groovy",
"violations": [
]
},
{
"name": "EmptyFinallyBlockRuleTest.groovy",
"violations": [
]
},
{
"name": "EmptyForStatementRuleTest.groovy",
"violations": [
]
},
{
"name": "EmptyIfStatementRuleTest.groovy",
"violations": [
]
},
{
"name": "EmptyInstanceInitializerRuleTest.groovy",
"violations": [
]
},
{
"name": "EmptyMethodRuleTest.groovy",
"violations": [
]
},
{
"name": "EmptyStaticInitializerRuleTest.groovy",
"violations": [
]
},
{
"name": "EmptySwitchStatementRuleTest.groovy",
"violations": [
]
},
{
"name": "EmptySynchronizedStatementRuleTest.groovy",
"violations": [
]
},
{
"name": "EmptyTryBlockRuleTest.groovy",
"violations": [
]
},
{
"name": "EmptyWhileStatementRuleTest.groovy",
"violations": [
]
},
{
"name": "EqualsAndHashCodeRuleTest.groovy",
"violations": [
]
},
{
"name": "EqualsOverloadedRuleTest.groovy",
"violations": [
]
},
{
"name": "ExplicitGarbageCollectionRuleTest.groovy",
"violations": [
]
},
{
"name": "ForLoopShouldBeWhileLoopRuleTest.groovy",
"violations": [
]
},
{
"name": "HardCodedWindowsFileSeparatorRuleTest.groovy",
"violations": [
]
},
{
"name": "HardCodedWindowsRootDirectoryRuleTest.groovy",
"violations": [
]
},
{
"name": "IntegerGetIntegerRuleTest.groovy",
"violations": [
]
},
{
"name": "MultipleUnaryOperatorsRuleTest.groovy",
"violations": [
{
"ruleName": "UnnecessaryReturnKeyword",
"priority": 3,
"lineNumber": 72,
"sourceLine": "return GroovyVersion.isGroovyVersion4() ? \"(${operator1}${operator2}$operand)\" : \"(${operator1}(${operator2}($operand)))\"",
"message": "The return keyword is not needed and can be removed"
}
]
},
{
"name": "ParameterAssignmentInFilterClosureRuleTest.groovy",
"violations": [
]
},
{
"name": "RandomDoubleCoercedToZeroRuleTest.groovy",
"violations": [
]
},
{
"name": "RemoveAllOnSelfRuleTest.groovy",
"violations": [
]
},
{
"name": "ReturnFromFinallyBlockRuleTest.groovy",
"violations": [
]
},
{
"name": "ThrowExceptionFromFinallyBlockRuleTest.groovy",
"violations": [
]
}
]
},
{
"path": "braces",
"totalFiles": 4,
"filesWithViolations": 0,
"priority1": 0,
"priority2": 0,
"priority3": 0,
"files": [
{
"name": "ElseBlockBracesRuleTest.groovy",
"violations": [
]
},
{
"name": "ForStatementBracesRuleTest.groovy",
"violations": [
]
},
{
"name": "IfStatementBracesRuleTest.groovy",
"violations": [
]
},
{
"name": "WhileStatementBracesRuleTest.groovy",
"violations": [
]
}
]
},
{
"path": "comments",
"totalFiles": 19,
"filesWithViolations": 13,
"priority1": 0,
"priority2": 0,
"priority3": 15,
"files": [
{
"name": "AbstractJavadocEmptyTagRuleTestCase.groovy",
"violations": [
{
"ruleName": "UnnecessaryReturnKeyword",
"priority": 3,
"lineNumber": 53,
"sourceLine": "return rule.name",
"message": "The return keyword is not needed and can be removed"
},
{
"ruleName": "UnnecessaryReturnKeyword",
"priority": 3,
"lineNumber": 56,
"sourceLine": "return \"The javadoc ${getTag()} tag is empty\"",
"message": "The return keyword is not needed and can be removed"
}
]
},
{
"name": "AbstractJavadocMissingDescriptionRuleTestCase.groovy",
"violations": [
{
"ruleName": "UnnecessaryReturnKeyword",
"priority": 3,
"lineNumber": 51,
"sourceLine": "return rule.name",
"message": "The return keyword is not needed and can be removed"
},
{
"ruleName": "UnnecessaryReturnKeyword",
"priority": 3,
"lineNumber": 54,
"sourceLine": "return \"The description for the javadoc ${getTag()} tag is missing\"",
"message": "The return keyword is not needed and can be removed"
}
]
},
{
"name": "ClassJavadocRuleTest.groovy",
"violations": [
]
},
{
"name": "JavadocConsecutiveEmptyLinesRuleTest.groovy",
"violations": [
]
},
{
"name": "JavadocEmptyAuthorTagRuleTest.groovy",
"violations": [
{
"ruleName": "UnnecessaryReturnKeyword",
"priority": 3,
"lineNumber": 27,
"sourceLine": "return '@author'",
"message": "The return keyword is not needed and can be removed"
}
]
},
{
"name": "JavadocEmptyExceptionTagRuleTest.groovy",
"violations": [
{
"ruleName": "UnnecessaryReturnKeyword",
"priority": 3,
"lineNumber": 27,
"sourceLine": "return '@exception'",
"message": "The return keyword is not needed and can be removed"
}
]
},
{
"name": "JavadocEmptyFirstLineRuleTest.groovy",
"violations": [
]
},
{
"name": "JavadocEmptyLastLineRuleTest.groovy",
"violations": [
]
},
{
"name": "JavadocEmptyParamTagRuleTest.groovy",
"violations": [
{
"ruleName": "UnnecessaryReturnKeyword",
"priority": 3,
"lineNumber": 27,
"sourceLine": "return '@param'",
"message": "The return keyword is not needed and can be removed"
}
]
},
{
"name": "JavadocEmptyReturnTagRuleTest.groovy",
"violations": [
{
"ruleName": "UnnecessaryReturnKeyword",
"priority": 3,
"lineNumber": 27,
"sourceLine": "return '@return'",
"message": "The return keyword is not needed and can be removed"
}
]
},
{
"name": "JavadocEmptySeeTagRuleTest.groovy",
"violations": [
{
"ruleName": "UnnecessaryReturnKeyword",
"priority": 3,
"lineNumber": 27,
"sourceLine": "return '@see'",
"message": "The return keyword is not needed and can be removed"
}
]
},
{
"name": "JavadocEmptySinceTagRuleTest.groovy",
"violations": [
{
"ruleName": "UnnecessaryReturnKeyword",
"priority": 3,
"lineNumber": 27,
"sourceLine": "return '@since'",
"message": "The return keyword is not needed and can be removed"
}
]
},
{
"name": "JavadocEmptyThrowsTagRuleTest.groovy",
"violations": [
{
"ruleName": "UnnecessaryReturnKeyword",
"priority": 3,
"lineNumber": 27,
"sourceLine": "return '@throws'",
"message": "The return keyword is not needed and can be removed"
}
]
},
{
"name": "JavadocEmptyVersionTagRuleTest.groovy",
"violations": [
{
"ruleName": "UnnecessaryReturnKeyword",
"priority": 3,
"lineNumber": 27,
"sourceLine": "return '@version'",
"message": "The return keyword is not needed and can be removed"
}
]
},
{
"name": "JavadocMissingExceptionDescriptionRuleTest.groovy",
"violations": [
{
"ruleName": "UnnecessaryReturnKeyword",
"priority": 3,
"lineNumber": 27,
"sourceLine": "return '@exception'",
"message": "The return keyword is not needed and can be removed"
}
]
},
{
"name": "JavadocMissingParamDescriptionRuleTest.groovy",
"violations": [
{
"ruleName": "UnnecessaryReturnKeyword",
"priority": 3,
"lineNumber": 27,
"sourceLine": "return '@param'",
"message": "The return keyword is not needed and can be removed"
}
]
},
{
"name": "JavadocMissingThrowsDescriptionRuleTest.groovy",
"violations": [
{
"ruleName": "UnnecessaryReturnKeyword",
"priority": 3,
"lineNumber": 27,
"sourceLine": "return '@throws'",
"message": "The return keyword is not needed and can be removed"
}
]
},
{
"name": "SpaceAfterCommentDelimiterRuleTest.groovy",
"violations": [
]
},
{
"name": "SpaceBeforeCommentDelimiterRuleTest.groovy",
"violations": [
]
}
]
},
{
"path": "concurrency",
"totalFiles": 27,
"filesWithViolations": 0,
"priority1": 0,
"priority2": 0,
"priority3": 0,
"files": [
{
"name": "BusyWaitRuleTest.groovy",
"violations": [
]
},
{
"name": "DoubleCheckedLockingRuleTest.groovy",
"violations": [
]
},
{
"name": "InconsistentPropertyLockingRuleTest.groovy",
"violations": [
]
},
{
"name": "InconsistentPropertySynchronizationRuleTest.groovy",
"violations": [
]
},
{
"name": "NestedSynchronizationRuleTest.groovy",
"violations": [
]
},
{
"name": "NoScriptBindingsRuleTest.groovy",
"violations": [
]
},
{
"name": "StaticCalendarFieldRuleTest.groovy",
"violations": [
]
},
{
"name": "StaticConnectionRuleTest.groovy",
"violations": [
]
},
{
"name": "StaticDateFormatFieldRuleTest.groovy",
"violations": [
]
},
{
"name": "StaticMatcherFieldRuleTest.groovy",
"violations": [
]
},
{
"name": "StaticSimpleDateFormatFieldRuleTest.groovy",
"violations": [
]
},
{
"name": "SynchronizedMethodRuleTest.groovy",
"violations": [
]
},
{
"name": "SynchronizedOnBoxedPrimitiveRuleTest.groovy",
"violations": [
]
},
{
"name": "SynchronizedOnGetClassRuleTest.groovy",
"violations": [
]
},
{
"name": "SynchronizedOnReentrantLockRuleTest.groovy",
"violations": [
]
},
{
"name": "SynchronizedOnStringRuleTest.groovy",
"violations": [
]
},
{
"name": "SynchronizedOnThisRuleTest.groovy",
"violations": [
]
},
{
"name": "SynchronizedReadObjectMethodRuleTest.groovy",
"violations": [
]
},
{
"name": "SystemRunFinalizersOnExitRuleTest.groovy",
"violations": [
]
},
{
"name": "ThisReferenceEscapesConstructorRuleTest.groovy",
"violations": [
]
},
{
"name": "ThreadGroupRuleTest.groovy",
"violations": [
]
},
{
"name": "ThreadLocalNotStaticFinalRuleTest.groovy",
"violations": [
]
},
{
"name": "ThreadYieldRuleTest.groovy",
"violations": [
]
},
{
"name": "UseOfNotifyMethodRuleTest.groovy",
"violations": [
]
},
{
"name": "VolatileArrayFieldRuleTest.groovy",
"violations": [
]
},
{
"name": "VolatileLongOrDoubleFieldRuleTest.groovy",
"violations": [
]
},
{
"name": "WaitOutsideOfWhileLoopRuleTest.groovy",
"violations": [
]
}
]
},
{
"path": "convention",
"totalFiles": 29,
"filesWithViolations": 1,
"priority1": 0,
"priority2": 0,
"priority3": 1,
"files": [
{
"name": "CompileStaticRuleTest.groovy",
"violations": [
{
"ruleName": "UnnecessaryReturnKeyword",
"priority": 3,
"lineNumber": 34,
"sourceLine": "return new CompileStaticRule()",
"message": "The return keyword is not needed and can be removed"
}
]
},
{
"name": "ConfusingTernaryRuleTest.groovy",
"violations": [
]
},
{
"name": "CouldBeElvisRuleTest.groovy",
"violations": [
]
},
{
"name": "CouldBeSwitchStatementRuleTest.groovy",
"violations": [
]
},
{
"name": "FieldTypeRequiredRuleTest.groovy",
"violations": [
]
},
{
"name": "HashtableIsObsoleteRule_HashtableTest.groovy",
"violations": [
]
},
{
"name": "HashtableIsObsoleteRule_JavaUtilHashtableTest.groovy",
"violations": [
]
},
{
"name": "IfStatementCouldBeTernaryRuleTest.groovy",
"violations": [
]
},
{
"name": "ImplicitClosureParameterRuleTest.groovy",
"violations": [
]
},
{
"name": "ImplicitReturnStatementRuleTest.groovy",
"violations": [
]
},
{
"name": "InvertedConditionRuleTest.groovy",
"violations": [
]
},
{
"name": "InvertedIfElseRuleTest.groovy",
"violations": [
]
},
{
"name": "LongLiteralWithLowerCaseLRuleTest.groovy",
"violations": [
]
},
{
"name": "MethodParameterTypeRequiredTest.groovy",
"violations": [
]
},
{
"name": "MethodReturnTypeRequiredRuleTest.groovy",
"violations": [
]
},
{
"name": "NoDefRuleTest.groovy",
"violations": [
]
},
{
"name": "NoDoubleRuleTest.groovy",
"violations": [
]
},
{
"name": "NoFloatRuleTest.groovy",
"violations": [
]
},
{
"name": "NoJavaUtilDateRuleTest.groovy",
"violations": [
]
},
{
"name": "NoTabCharacterRuleTest.groovy",
"violations": [
]
},
{
"name": "ParameterReassignmentRuleTest.groovy",
"violations": [
]
},
{
"name": "PublicMethodsBeforeNonPublicMethodsRuleTest.groovy",
"violations": [
]
},
{
"name": "StaticFieldsBeforeInstanceFieldsRuleTest.groovy",
"violations": [
]
},
{
"name": "StaticMethodsBeforeInstanceMethodsRuleTest.groovy",
"violations": [
]
},
{
"name": "TernaryCouldBeElvisRuleTest.groovy",
"violations": [
]
},
{
"name": "TrailingCommaRuleTest.groovy",
"violations": [
]
},
{
"name": "VariableTypeRequiredRuleTest.groovy",
"violations": [
]
},
{
"name": "VectorIsObsoleteRule_JavaUtilVectorTest.groovy",
"violations": [
]
},
{
"name": "VectorIsObsoleteRule_VectorTest.groovy",
"violations": [
]
}
]
},
{
"path": "design",
"totalFiles": 26,
"filesWithViolations": 3,
"priority1": 0,
"priority2": 1,
"priority3": 2,
"files": [
{
"name": "AbstractClassWithPublicConstructorRuleTest.groovy",
"violations": [
]
},
{
"name": "AbstractClassWithoutAbstractMethodRuleTest.groovy",
"violations": [
]
},
{
"name": "AssignmentToStaticFieldFromInstanceMethodRuleTest.groovy",
"violations": [
]
},
{
"name": "BooleanMethodReturnsNullRuleTest.groovy",
"violations": [
]
},
{
"name": "BuilderMethodWithSideEffectsRuleTest.groovy",
"violations": [
]
},
{
"name": "CloneWithoutCloneableRuleTest.groovy",
"violations": [
]
},
{
"name": "CloneableWithoutCloneRuleTest.groovy",
"violations": [
]
},
{
"name": "CloseWithoutCloseableRuleTest.groovy",
"violations": [
]
},
{
"name": "CompareToWithoutComparableRuleTest.groovy",
"violations": [
]
},
{
"name": "ConstantsOnlyInterfaceRuleTest.groovy",
"violations": [
]
},
{
"name": "EmptyMethodInAbstractClassRuleTest.groovy",
"violations": [
]
},
{
"name": "FinalClassWithProtectedMemberRuleTest.groovy",
"violations": [
]
},
{
"name": "ImplementationAsTypeRuleTest.groovy",
"violations": [
]
},
{
"name": "InstanceofRuleTest.groovy",
"violations": [
]
},
{
"name": "LocaleSetDefaultRuleTest.groovy",
"violations": [
]
},
{
"name": "NestedForLoopRuleTest.groovy",
"violations": [
{
"ruleName": "UnnecessaryReturnKeyword",
"priority": 3,
"lineNumber": 106,
"sourceLine": "return inlineViolation('Nested for loop')",
"message": "The return keyword is not needed and can be removed"
}
]
},
{
"name": "OptionalCollectionReturnTypeRuleTest.groovy",
"violations": [
{
"ruleName": "UnnecessaryReturnKeyword",
"priority": 3,
"lineNumber": 128,
"sourceLine": "return \"The method $methodName in class MyClass returns an Optional collection\"",
"message": "The return keyword is not needed and can be removed"
}
]
},
{
"name": "OptionalFieldRuleTest.groovy",
"violations": [
]
},
{
"name": "OptionalMethodParameterRuleTest.groovy",
"violations": [
]
},
{
"name": "PrivateFieldCouldBeFinalRuleTest.groovy",
"violations": [
{
"ruleName": "MethodCount",
"priority": 2,
"lineNumber": 26,
"sourceLine": "class PrivateFieldCouldBeFinalRuleTest extends AbstractRuleTestCase