Files
coco 723ce1af5c a
2026-07-03 15:12:48 +08:00

782 lines
24 KiB
YAML

build:
maxIssues: 0
excludeCorrectable: false
weights:
# complexity: 2
# LongParameterList: 1
# style: 1
# comments: 1
config:
validation: true
warningsAsErrors: true
# when writing own rules with new properties, exclude the property path e.g.: 'my_rule_set,.*>.*>[my_property]'
excludes: ''
processors:
active: true
exclude:
- 'DetektProgressListener'
# - 'FunctionCountProcessor'
# - 'PropertyCountProcessor'
# - 'ClassCountProcessor'
# - 'PackageCountProcessor'
# - 'KtFileCountProcessor'
console-reports:
active: true
exclude:
- 'ProjectStatisticsReport'
- 'ComplexityReport'
- 'NotificationReport'
# - 'FindingsReport'
- 'FileBasedFindingsReport'
output-reports:
active: true
exclude:
# - 'TxtOutputReport'
# - 'XmlOutputReport'
# - 'HtmlOutputReport'
comments:
active: true
# https://detekt.github.io/detekt/comments.html#absentorwrongfilelicense
# we don't use licenses per file, only root one
AbsentOrWrongFileLicense:
active: false
licenseTemplateFile: 'license.template'
# https://detekt.github.io/detekt/comments.html#commentoverprivatefunction
CommentOverPrivateFunction:
active: false
# https://detekt.github.io/detekt/comments.html#commentoverprivateproperty
CommentOverPrivateProperty:
active: false
# https://detekt.github.io/detekt/comments.html#endofsentenceformat
EndOfSentenceFormat:
active: false
endOfSentenceFormat: '([.?!][ \t\n\r\f<])|([.?!:]$)'
# https://detekt.github.io/detekt/comments.html#undocumentedpublicclass
UndocumentedPublicClass:
active: false
searchInNestedClass: false
searchInInnerClass: false
searchInInnerObject: false
searchInInnerInterface: false
# https://detekt.github.io/detekt/comments.html#undocumentedpublicfunction
UndocumentedPublicFunction:
active: false
# https://detekt.github.io/detekt/comments.html#undocumentedpublicproperty
UndocumentedPublicProperty:
active: false
complexity:
active: false
ComplexCondition:
active: true
threshold: 4
ComplexInterface:
active: false
threshold: 10
includeStaticDeclarations: false
includePrivateDeclarations: false
CyclomaticComplexMethod:
active: true
threshold: 15
ignoreSingleWhenExpression: false
ignoreSimpleWhenEntries: false
ignoreNestingFunctions: false
nestingFunctions: [ run, let, apply, with, also, use, forEach, isNotNull, ifNull ]
LabeledExpression:
active: false
ignoredLabels: [ ]
LargeClass:
active: true
threshold: 600
LongMethod:
active: true
threshold: 60
LongParameterList:
active: true
functionThreshold: 6
constructorThreshold: 7
ignoreDefaultParameters: false
ignoreDataClasses: true
ignoreAnnotated: [ ]
MethodOverloading:
active: false
threshold: 6
NamedArguments:
active: false
threshold: 3
NestedBlockDepth:
active: true
threshold: 4
ReplaceSafeCallChainWithRun:
active: false
StringLiteralDuplication:
active: false
excludes: [ '**/test/**', '**/androidTest/**' ]
threshold: 3
ignoreAnnotation: true
excludeStringsWithLessThan5Characters: true
ignoreStringsRegex: '$^'
TooManyFunctions:
active: true
excludes: [ '**/test/**', '**/androidTest/**' ]
thresholdInFiles: 11
thresholdInClasses: 11
thresholdInInterfaces: 11
thresholdInObjects: 11
thresholdInEnums: 11
ignoreDeprecated: false
ignorePrivate: false
ignoreOverridden: false
coroutines:
active: true
GlobalCoroutineUsage:
active: false
InjectDispatcher:
active: true
dispatcherNames:
- 'IO'
- 'Default'
- 'Unconfined'
RedundantSuspendModifier:
active: true
SleepInsteadOfDelay:
active: true
SuspendFunSwallowedCancellation:
active: false
SuspendFunWithCoroutineScopeReceiver:
active: false
SuspendFunWithFlowReturnType:
active: true
empty-blocks:
active: true
# https://detekt.github.io/detekt/empty-blocks.html#emptycatchblock
EmptyCatchBlock:
active: true
allowedExceptionNameRegex: '_|(ignore|expected).*'
# https://detekt.github.io/detekt/empty-blocks.html#emptyclassblock
EmptyClassBlock:
active: true
# https://detekt.github.io/detekt/empty-blocks.html#emptydefaultconstructor
EmptyDefaultConstructor:
active: true
# https://detekt.github.io/detekt/empty-blocks.html#emptydowhileblock
EmptyDoWhileBlock:
active: true
# https://detekt.github.io/detekt/empty-blocks.html#emptyelseblock
EmptyElseBlock:
active: true
# https://detekt.github.io/detekt/empty-blocks.html#emptyfinallyblock
EmptyFinallyBlock:
active: true
# https://detekt.github.io/detekt/empty-blocks.html#emptyforblock
EmptyForBlock:
active: true
# https://detekt.github.io/detekt/empty-blocks.html#emptyfunctionblock
# todo enable, 26 errors
EmptyFunctionBlock:
active: false
ignoreOverridden: false
# https://detekt.github.io/detekt/empty-blocks.html#emptyifblock
EmptyIfBlock:
active: true
# https://detekt.github.io/detekt/empty-blocks.html#emptyinitblock
EmptyInitBlock:
active: true
# https://detekt.github.io/detekt/empty-blocks.html#emptyktfile
EmptyKtFile:
active: true
# https://detekt.github.io/detekt/empty-blocks.html#emptysecondaryconstructor
EmptySecondaryConstructor:
active: true
# https://detekt.github.io/detekt/empty-blocks.html#emptytryblock
EmptyTryBlock:
active: true
# https://detekt.github.io/detekt/empty-blocks.html#emptywhenblock
EmptyWhenBlock:
active: true
# https://detekt.github.io/detekt/empty-blocks.html#emptywhileblock
EmptyWhileBlock:
active: true
exceptions:
active: false
ExceptionRaisedInUnexpectedLocation:
active: false
methodNames: [ toString, hashCode, equals, finalize ]
InstanceOfCheckForException:
active: false
excludes: [ '**/test/**', '**/androidTest/**' ]
NotImplementedDeclaration:
active: false
PrintStackTrace:
active: false
RethrowCaughtException:
active: false
ReturnFromFinally:
active: false
ignoreLabeled: false
SwallowedException:
active: false
ignoredExceptionTypes:
- InterruptedException
- NumberFormatException
- ParseException
- MalformedURLException
allowedExceptionNameRegex: '_|(ignore|expected).*'
ThrowingExceptionFromFinally:
active: false
ThrowingExceptionInMain:
active: false
ThrowingExceptionsWithoutMessageOrCause:
active: false
excludes: [ '**/test/**', '**/androidTest/**' ]
exceptions:
- IllegalArgumentException
- IllegalStateException
- IOException
ThrowingNewInstanceOfSameException:
active: false
TooGenericExceptionCaught:
active: true
excludes: [ '**/test/**', '**/androidTest/**' ]
exceptionNames:
- ArrayIndexOutOfBoundsException
- Error
- Exception
- IllegalMonitorStateException
- NullPointerException
- IndexOutOfBoundsException
- RuntimeException
- Throwable
allowedExceptionNameRegex: '_|(ignore|expected).*'
TooGenericExceptionThrown:
active: true
exceptionNames:
- Error
- Exception
- Throwable
- RuntimeException
formatting:
active: true
android: true
autoCorrect: false
# todo rise an issue: false positive on kotlin @file annotations
AnnotationOnSeparateLine:
active: false
AnnotationSpacing:
active: true
# todo fix and enable
ArgumentListWrapping:
active: false
# questionable rule; && and || goes to the end of line, instead of beginning a new line as we do right now
ChainWrapping:
active: false
CommentSpacing:
active: true
# duplicate of naming:EnumNaming
EnumEntryNameCase:
active: false
# todo what is it?
Filename:
active: false
# DUPLICATE of style:NewLineAtEndOfFile
FinalNewline:
active: false
insertFinalNewLine: false
ImportOrdering:
active: true
layout: '*,java.**,javax.**,kotlin.**,^'
# blocked by bugs: https://github.com/pinterest/ktlint/issues?q=is%3Aissue+is%3Aopen+Indentation
Indentation:
active: false
indentSize: 4
# DUPLICATE of style:MaxLineLength
MaximumLineLength:
active: false
maxLineLength: 120
# https://ktlint.github.io/#rule-modifier-order
ModifierOrdering:
active: true
MultiLineIfElse:
active: true
NoBlankLineBeforeRbrace:
active: true
# https://ktlint.github.io/#rule-blank
NoConsecutiveBlankLines:
active: true
# https://ktlint.github.io/#rule-empty-class-body
NoEmptyClassBody:
active: true
# questionable rule, it is good idea to have some visual space after function declaration
NoEmptyFirstLineInMethodBlock:
active: false
NoLineBreakAfterElse:
active: true
NoLineBreakBeforeAssignment:
active: true
NoMultipleSpaces:
active: true
# https://ktlint.github.io/#rule-semi
NoSemicolons:
active: true
# https://ktlint.github.io/#rule-trailing-whitespaces
NoTrailingSpaces:
active: true
NoUnitReturn:
active: true
# DUPLICATE of style UnusedImports
NoUnusedImports:
active: false
# DUPLICATE of style WildcardImports
NoWildcardImports:
active: false
# DUPLICATE of naming:PackageNaming rule
PackageName:
active: false
ParameterListWrapping:
active: true
# https://ktlint.github.io/#rule-spacing
SpacingAroundColon:
active: true
SpacingAroundComma:
active: true
SpacingAroundCurly:
active: true
SpacingAroundDot:
active: true
SpacingAroundDoubleColon:
active: true
SpacingAroundKeyword:
active: true
SpacingAroundOperators:
active: true
SpacingAroundParens:
active: true
SpacingAroundRangeOperator:
active: true
# https://detekt.github.io/detekt/formatting.html#spacingbetweendeclarationswithannotations
SpacingBetweenDeclarationsWithAnnotations:
active: false
# https://detekt.github.io/detekt/formatting.html#spacingbetweendeclarationswithcomments
SpacingBetweenDeclarationsWithComments:
active: true
# https://ktlint.github.io/#rule-string-template
StringTemplate:
active: true
naming:
active: true
# https://detekt.github.io/detekt/naming.html#classnaming
ClassNaming:
active: true
classPattern: '[A-Z][a-zA-Z0-9]*'
# https://detekt.github.io/detekt/naming.html#constructorparameternaming
ConstructorParameterNaming:
active: true
parameterPattern: '[a-z][A-Za-z0-9]*'
privateParameterPattern: '[a-z][A-Za-z0-9]*'
excludeClassPattern: '$^'
EnumNaming:
active: false
excludes: [ '**/test/**', '**/androidTest/**' ]
enumEntryPattern: '[A-Z][_a-zA-Z0-9]*'
ForbiddenClassName:
active: false
excludes: [ '**/test/**', '**/androidTest/**' ]
forbiddenName: [ ]
FunctionMaxLength:
active: false
excludes: [ '**/test/**', '**/androidTest/**' ]
maximumFunctionNameLength: 30
# blocked by `Is` functions
FunctionMinLength:
active: false
excludes: [ '**/test/**', '**/androidTest/**' ]
minimumFunctionNameLength: 3
# blocked by `Is` functions
FunctionNaming:
active: false
excludes: [ '**/test/**', '**/androidTest/**' ]
functionPattern: '([a-z][a-zA-Z0-9]*)|(`.*`)'
excludeClassPattern: '$^'
ignoreAnnotated: [ 'Composable' ]
FunctionParameterNaming:
active: false
excludes: [ '**/test/**', '**/androidTest/**' ]
parameterPattern: '[a-z][A-Za-z0-9]*'
excludeClassPattern: '$^'
# TODO: enable
InvalidPackageDeclaration:
active: false
rootPackage: ''
# https://detekt.github.io/detekt/naming.html#matchingdeclarationname
MatchingDeclarationName:
active: true
mustBeFirst: true
# https://detekt.github.io/detekt/naming.html#membernameequalsclassname
MemberNameEqualsClassName:
active: false
ignoreOverridden: true
NonBooleanPropertyPrefixedWithIs:
active: false
excludes: [ '**/test/**', '**/androidTest/**' ]
ObjectPropertyNaming:
active: false
excludes: [ '**/test/**', '**/androidTest/**' ]
constantPattern: '[A-Za-z][_A-Za-z0-9]*'
propertyPattern: '[A-Za-z][_A-Za-z0-9]*'
privatePropertyPattern: '(_)?[A-Za-z][_A-Za-z0-9]*'
PackageNaming:
active: false
excludes: [ '**/test/**', '**/androidTest/**' ]
packagePattern: '[a-z]+(\.[a-z][A-Za-z0-9]*)*'
TopLevelPropertyNaming:
active: false
excludes: [ '**/test/**', '**/androidTest/**' ]
constantPattern: '[A-Z][_A-Z0-9]*'
propertyPattern: '[A-Za-z][_A-Za-z0-9]*'
privatePropertyPattern: '_?[A-Za-z][_A-Za-z0-9]*'
VariableMaxLength:
active: false
excludes: [ '**/test/**', '**/androidTest/**' ]
maximumVariableNameLength: 64
VariableMinLength:
active: false
excludes: [ '**/test/**', '**/androidTest/**' ]
minimumVariableNameLength: 1
# https://detekt.github.io/detekt/naming.html#variablenaming
VariableNaming:
active: true
variablePattern: '[a-z][A-Za-z0-9]*'
privateVariablePattern: '(_)?[a-z][A-Za-z0-9]*'
excludeClassPattern: '$^'
performance:
active: false
ArrayPrimitive:
active: true
ForEachOnRange:
active: true
excludes: [ '**/test/**', '**/androidTest/**' ]
SpreadOperator:
active: true
excludes: [ '**/test/**', '**/androidTest/**' ]
UnnecessaryTemporaryInstantiation:
active: true
potential-bugs:
active: false
Deprecation:
active: false
EqualsAlwaysReturnsTrueOrFalse:
active: false
EqualsWithHashCodeExist:
active: false
ExplicitGarbageCollectionCall:
active: false
HasPlatformType:
active: false
IgnoredReturnValue:
active: false
restrictToConfig: true
returnValueAnnotations: [ '*.CheckReturnValue', '*.CheckResult' ]
ImplicitDefaultLocale:
active: false
ImplicitUnitReturnType:
active: false
allowExplicitReturnType: true
InvalidRange:
active: false
IteratorHasNextCallsNextMethod:
active: false
IteratorNotThrowingNoSuchElementException:
active: false
LateinitUsage:
active: false
excludes: [ '**/test/**', '**/androidTest/**' ]
ignoreAnnotated: [ ]
ignoreOnClassesPattern: ''
MapGetWithNotNullAssertionOperator:
active: false
NullableToStringCall:
active: false
UnconditionalJumpStatementInLoop:
active: false
UnnecessaryNotNullOperator:
active: false
UnnecessarySafeCall:
active: false
UnreachableCode:
active: false
UnsafeCallOnNullableType:
active: false
UnsafeCast:
active: false
UselessPostfixExpression:
active: false
WrongEqualsTypeParameter:
active: false
style:
active: true
BracesOnIfStatements:
active: true
singleLine: 'never'
multiLine: 'always'
# https://detekt.github.io/detekt/style.html#classordering
ClassOrdering:
active: true
# https://detekt.github.io/detekt/style.html#collapsibleifstatements
# questionable rule, no need for now
CollapsibleIfStatements:
active: false
# https://detekt.github.io/detekt/style.html#dataclasscontainsfunctions
# probably a good idea, but seems too strict
DataClassContainsFunctions:
active: false
conversionFunctionPrefix: [ 'to' ]
# https://detekt.github.io/detekt/style.html#dataclassshouldbeimmutable
# todo probably a good idea to enable it
DataClassShouldBeImmutable:
active: false
# https://detekt.github.io/detekt/style.html#equalsnullcall
EqualsNullCall:
active: true
# https://detekt.github.io/detekt/style.html#equalsonsignatureline
EqualsOnSignatureLine:
active: true
# https://detekt.github.io/detekt/style.html#explicitcollectionelementaccessmethod
ExplicitCollectionElementAccessMethod:
active: true
# https://detekt.github.io/detekt/style.html#explicititlambdaparameter
ExplicitItLambdaParameter:
active: true
# https://detekt.github.io/detekt/style.html#expressionbodysyntax
# sometimes it's harder to read
ExpressionBodySyntax:
active: false
includeLineWrapping: true
# https://detekt.github.io/detekt/style.html#forbiddencomment
ForbiddenComment:
active: true
comments: [ 'STOPSHIP' ]
allowedPatterns: ''
# https://detekt.github.io/detekt/style.html#forbiddenimport
# todo maybe use it to ban junit 4 in test code
ForbiddenImport:
active: true
imports: [ ]
forbiddenPatterns: 'gradle.kotlin.dsl.accessors.*'
# https://detekt.github.io/detekt/style.html#forbiddenmethodcall
# needs type resolution config https://github.com/detekt/detekt/issues/2259
ForbiddenMethodCall:
active: false
methods: [ 'kotlin.io.println', 'kotlin.io.print' ]
# https://detekt.github.io/detekt/style.html#forbiddenvoid
# needs type resolution config https://github.com/detekt/detekt/issues/2259
ForbiddenVoid:
active: false
ignoreOverridden: false
ignoreUsageInGenerics: false
# https://detekt.github.io/detekt/style.html#functiononlyreturningconstant
FunctionOnlyReturningConstant:
active: false
ignoreOverridableFunction: true
excludedFunctions: [ 'describeContents' ]
ignoreAnnotated: [ 'dagger.Provides' ]
# https://detekt.github.io/detekt/style.html#loopwithtoomanyjumpstatements
LoopWithTooManyJumpStatements:
active: true
maxJumpCount: 1
# https://detekt.github.io/detekt/style.html#magicnumber
MagicNumber:
active: false
excludes: [ '**/build.gradle.kts', '**/test/**', '**/androidTest/**' ]
ignoreNumbers: [ '-1', '0', '1', '2' ]
ignoreHashCodeFunction: true
ignorePropertyDeclaration: true
ignoreLocalVariableDeclaration: true
ignoreConstantDeclaration: true
ignoreCompanionObjectPropertyDeclaration: true
ignoreAnnotation: true
ignoreNamedArgument: true
ignoreEnums: true
ignoreRanges: false
# https://detekt.github.io/detekt/style.html#mandatorybracesloops
MandatoryBracesLoops:
active: true
# https://detekt.github.io/detekt/style.html#maxlinelength
MaxLineLength:
active: true
maxLineLength: 120
excludePackageStatements: true
excludeImportStatements: true
excludeCommentStatements: true
# https://detekt.github.io/detekt/style.html#maybeconst
MayBeConst:
active: true
# https://detekt.github.io/detekt/style.html#modifierorder
ModifierOrder:
active: true
# https://detekt.github.io/detekt/style.html#nestedclassesvisibility
NestedClassesVisibility:
active: true
# https://detekt.github.io/detekt/style.html#newlineatendoffile
NewLineAtEndOfFile:
active: true
# https://detekt.github.io/detekt/style.html#notabs
NoTabs:
active: true
# https://detekt.github.io/detekt/style.html#optionalabstractkeyword
OptionalAbstractKeyword:
active: true
# https://detekt.github.io/detekt/style.html#optionalunit
OptionalUnit:
active: false
BracesOnWhenStatements:
active: true
# https://detekt.github.io/detekt/style.html#prefertooverpairsyntax
PreferToOverPairSyntax:
active: true
# https://detekt.github.io/detekt/style.html#protectedmemberinfinalclass
ProtectedMemberInFinalClass:
active: true
RedundantExplicitType:
active: false
RedundantHigherOrderMapUsage:
active: false
# https://detekt.github.io/detekt/style.html#redundantvisibilitymodifierrule
# todo don't know about kotlin strict mode
# fix in 1.15 https://github.com/detekt/detekt/issues/3125 only works per module, not in our detektAll task
# because of how strict api detection works
RedundantVisibilityModifierRule:
active: false
# https://detekt.github.io/detekt/style.html#returncount
# todo enable (11 errors)
ReturnCount:
active: false
max: 2
excludedFunctions: [ 'equals' ]
excludeLabeled: false
excludeReturnFromLambda: true
excludeGuardClauses: false
# https://detekt.github.io/detekt/style.html#safecast
SafeCast:
active: false
SerialVersionUIDInSerializableClass:
active: false
SpacingBetweenPackageAndImports:
active: false
ThrowsCount:
active: false
max: 2
TrailingWhitespace:
active: false
UnderscoresInNumericLiterals:
active: false
acceptableLength: 5
UnnecessaryAbstractClass:
active: false
ignoreAnnotated: [ 'dagger.Module' ]
UnnecessaryAnnotationUseSiteTarget:
active: false
UnnecessaryApply:
active: false
UnnecessaryInheritance:
active: false
UnnecessaryLet:
active: false
# https://detekt.github.io/detekt/style.html#unnecessaryparentheses
UnnecessaryParentheses:
active: true
UntilInsteadOfRangeTo:
active: false
# https://detekt.github.io/detekt/style.html#unusedimports
UnusedImports:
active: true
# https://detekt.github.io/detekt/style.html#unusedprivateclass
UnusedPrivateClass:
active: true
# https://detekt.github.io/detekt/style.html#unusedprivatemember
UnusedPrivateMember:
active: true
allowedNames: '(_|ignored|expected|serialVersionUID)'
# https://detekt.github.io/detekt/style.html#usearrayliteralsinannotations
UseArrayLiteralsInAnnotations:
active: true
UseCheckNotNull:
active: false
UseCheckOrError:
active: false
UseDataClass:
active: false
ignoreAnnotated: [ ]
allowVars: false
UseEmptyCounterpart:
active: false
UseIfEmptyOrIfBlank:
active: false
UseIfInsteadOfWhen:
active: false
UseRequire:
active: false
UseRequireNotNull:
active: false
UselessCallOnNotNull:
active: false
UtilityClassWithPublicConstructor:
active: false
# https://detekt.github.io/detekt/style.html#varcouldbeval
VarCouldBeVal:
active: true
# https://detekt.github.io/detekt/style.html#wildcardimport
WildcardImport:
active: true
excludes: [ ]
excludeImports: [ ]
Compose:
CompositionLocalAllowlist:
active: true
ContentEmitterReturningValues:
active: true
ModifierComposable:
active: true
ModifierMissing:
active: true
ModifierReused:
active: true
ModifierWithoutDefault:
active: true
MultipleEmitters:
active: true
MutableParams:
active: true
ComposableNaming:
active: true
ComposableParamOrder:
active: true
PreviewNaming:
active: true
PreviewPublic:
active: true
RememberMissing:
active: true
UnstableCollections:
active: true
ViewModelForwarding:
active: true
ViewModelInjection:
active: true