803 lines
31 KiB
YAML
803 lines
31 KiB
YAML
build:
|
||
excludeCorrectable: false
|
||
|
||
config:
|
||
validation: true
|
||
warningsAsErrors: false
|
||
# checkExhaustiveness: false
|
||
# when writing own rules with new properties, exclude the property path e.g.: 'my_rule_set,.*>.*>[my_property]'
|
||
excludes: 'custom-checks.*'
|
||
|
||
processors:
|
||
active: true
|
||
exclude:
|
||
- 'DetektProgressListener'
|
||
# - 'KtFileCountProcessor'
|
||
# - 'PackageCountProcessor'
|
||
# - 'ClassCountProcessor'
|
||
# - 'FunctionCountProcessor'
|
||
# - 'PropertyCountProcessor'
|
||
# - 'ProjectComplexityProcessor'
|
||
# - 'ProjectCognitiveComplexityProcessor'
|
||
# - 'ProjectLLOCProcessor'
|
||
# - 'ProjectCLOCProcessor'
|
||
# - 'ProjectLOCProcessor'
|
||
# - 'ProjectSLOCProcessor'
|
||
# - 'LicenseHeaderLoaderExtension'
|
||
|
||
console-reports:
|
||
active: true
|
||
exclude:
|
||
- 'ProjectStatisticsReport'
|
||
- 'ComplexityReport'
|
||
- 'NotificationReport'
|
||
- 'FindingsReport'
|
||
- 'FileBasedFindingsReport'
|
||
# - 'LiteFindingsReport'
|
||
|
||
output-reports:
|
||
active: true
|
||
exclude:
|
||
# - 'TxtOutputReport'
|
||
# - 'XmlOutputReport'
|
||
- 'HtmlOutputReport'
|
||
# - 'MdOutputReport'
|
||
# - 'SarifOutputReport'
|
||
|
||
comments:
|
||
active: false
|
||
AbsentOrWrongFileLicense: #报告每个没有所需许可证标头的Kotlin源文件
|
||
active: false
|
||
licenseTemplateFile: 'license.template'
|
||
# licenseTemplateIsRegex: false
|
||
CommentOverPrivateFunction: #报告private函数的注释和文档
|
||
active: false
|
||
CommentOverPrivateProperty: #报告私有属性的注释和文档
|
||
active: false
|
||
# DeprecatedBlockTag: #报告注释中使用@deprecated块标记,可以使用@ReplaceWith annotations
|
||
# active: false
|
||
EndOfSentenceFormat: #验证KDoc注释的第一句话的结尾
|
||
active: false
|
||
endOfSentenceFormat: '([.?!][ \t\n\r\f<])|([.?!:]$)'
|
||
# KDocReferencesNonPublicProperty: #报告任何引用类的非公共属性的KDoc注释
|
||
# active: false
|
||
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
|
||
# OutdatedDocumentation: #报告任何具有与声明签名不匹配的KDoc的类、函数或构造函数
|
||
# active: false
|
||
# matchTypeParameters: true
|
||
# matchDeclarationsOrder: true
|
||
# allowParamOnConstructorProperties: false
|
||
UndocumentedPublicClass: #报告没有所需文档的公共类、对象和接口
|
||
active: false
|
||
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
|
||
searchInNestedClass: true
|
||
searchInInnerClass: true
|
||
searchInInnerObject: true
|
||
searchInInnerInterface: true
|
||
# searchInProtectedClass: false
|
||
UndocumentedPublicFunction: #报告任何没有所需文档的公共方法
|
||
active: false
|
||
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
|
||
# searchProtectedFunction: false
|
||
UndocumentedPublicProperty: #报告任何没有所需文档的公共字段
|
||
active: false
|
||
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
|
||
# searchProtectedProperty: false
|
||
|
||
complexity:
|
||
active: true
|
||
# CognitiveComplexMethod: #报告复杂方法
|
||
# active: false
|
||
# allowedComplexity: 15
|
||
ComplexCondition: #报告复杂条件
|
||
active: false
|
||
# allowedConditions: 4
|
||
ComplexInterface: #包含太多函数和/或属性的复杂接口表明该接口一次处理太多事情。接口应该遵循单一责任原则,以鼓励该接口的实现不要同时处理太多事情
|
||
active: false
|
||
# allowedDefinitions: 10
|
||
includeStaticDeclarations: false
|
||
includePrivateDeclarations: false
|
||
# ignoreOverloaded: false
|
||
|
||
#该规则使用McCabe的循环复杂性(MCC)度量来测量函数源代码中线性独立路径的数量{https://www.ndepend.com/docs/code-metrics#CC}
|
||
# CyclomaticComplexMethod: #复杂的方法很难理解和阅读。复杂方法的副作用可能并不明显。更喜欢把复杂的方法分解成更小的方法,这样更容易理解。较小的方法也可以命名得更清晰,从而提高代码的可读性。
|
||
# active: true
|
||
# allowedComplexity: 14
|
||
# ignoreSingleWhenExpression: false
|
||
# ignoreSimpleWhenEntries: false
|
||
# ignoreNestingFunctions: false
|
||
# ignoreLocalFunctions: false
|
||
# nestingFunctions:
|
||
# - 'also'
|
||
# - 'apply'
|
||
# - 'forEach'
|
||
# - 'isNotNull'
|
||
# - 'ifNull'
|
||
# - 'let'
|
||
# - 'run'
|
||
# - 'use'
|
||
# - 'with'
|
||
LabeledExpression: #报告已标记的表达式
|
||
active: false
|
||
ignoredLabels: []
|
||
LargeClass: #报告大型类
|
||
active: true
|
||
# allowedLines: 600
|
||
LongMethod: #报告大方法
|
||
active: true
|
||
# allowedLines: 60
|
||
LongParameterList: #报告参数超过特定阈值的函数和构造函数。
|
||
active: true
|
||
# allowedFunctionParameters: 6
|
||
# allowedConstructorParameters: 15
|
||
ignoreDefaultParameters: false
|
||
ignoreDataClasses: true
|
||
# ignoreAnnotatedParameter: []
|
||
MethodOverloading: #报告经常重载的方法
|
||
active: false
|
||
# allowedOverloads: 6
|
||
NamedArguments: #报告参数超过某个阈值且全部未命名的函数调用。参数过多的调用更难理解,因此命名参数会有所帮助。
|
||
active: false
|
||
# allowedArguments: 3
|
||
# ignoreArgumentsMatchingNames: false
|
||
NestedBlockDepth: #报告函数中嵌套深度过大
|
||
active: true
|
||
# allowedDepth: 4
|
||
# NestedScopeFunctions: #避免嵌套作用域函数
|
||
# active: false
|
||
# allowedDepth: 1
|
||
# functions:
|
||
# - 'kotlin.apply'
|
||
# - 'kotlin.run'
|
||
# - 'kotlin.with'
|
||
# - 'kotlin.let'
|
||
# - 'kotlin.also'
|
||
ReplaceSafeCallChainWithRun: #不可为null的类型上的安全调用链是冗余的,可以通过将冗余的安全调用封装在run{}块中来删除 {xxx?.run}
|
||
active: false
|
||
StringLiteralDuplication: #规则检测并报告重复的字符串文字
|
||
active: false
|
||
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
|
||
# allowedDuplications: 2
|
||
ignoreAnnotation: true
|
||
# allowedWithLengthLessThan: 5
|
||
ignoreStringsRegex: '$^'
|
||
TooManyFunctions: #此规则报告包含过多函数的文件、类、接口、对象和枚举。每个元素可以配置有不同的阈值。
|
||
active: true
|
||
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
|
||
# allowedFunctionsPerFile: 11
|
||
# allowedFunctionsPerClass: 11
|
||
# allowedFunctionsPerInterface: 11
|
||
# allowedFunctionsPerObject: 11
|
||
# allowedFunctionsPerEnum: 11
|
||
ignoreDeprecated: false
|
||
ignorePrivate: false
|
||
ignoreOverridden: false
|
||
|
||
#协程规则集分析代码中潜在的协程问题。
|
||
coroutines:
|
||
active: true
|
||
GlobalCoroutineUsage:
|
||
active: false
|
||
# InjectDispatcher: #始终使用依赖项注入来注入调度器,以便于测试
|
||
# active: true
|
||
# dispatcherNames:
|
||
# - 'IO'
|
||
# - 'Default'
|
||
# - 'Unconfined'
|
||
RedundantSuspendModifier: #suspend修饰符只能在需要的地方使用,否则该函数只能从其他挂起函数中使用。这不必要地限制了函数的使用,应该通过删除不需要的suspend修饰符来避免
|
||
active: true
|
||
# SleepInsteadOfDelay: #报告Thread.sleep在挂起函数和协同程序块中的使用情况。由于协程的轻量级性质,一个线程可以同时包含多个协程,因此如果一个协程调用thread.sleep,它可能会停止执行不相关的协程,并导致不可预测的行为。
|
||
# active: true
|
||
# SuspendFunSwallowedCancellation: #不应在runCatching的lambda块内部调用suspend函数
|
||
# active: false
|
||
# SuspendFunWithCoroutineScopeReceiver: #将CoroutineScope用作接收器的挂起函数不应标记为挂起。
|
||
# active: false
|
||
SuspendFunWithFlowReturnType: #从kotlin.coroutines.Flow返回Flow的函数不应标记为挂起,简单地调用一个返回Flow的函数的行为不应该有任何副作用。只有当针对返回的Flow开始收集时,才应该实际完成工作。
|
||
active: true
|
||
|
||
#空块规则集包含将报告应避免的空代码块的规则。
|
||
empty-blocks:
|
||
active: true
|
||
EmptyCatchBlock: #报告空的捕获块。空的catch块表示异常被忽略而未被处理
|
||
active: true
|
||
allowedExceptionNameRegex: '_|(ignore|expected).*'
|
||
EmptyClassBlock: #报告空类。空的代码块没有任何作用,应该删除
|
||
active: true
|
||
EmptyDefaultConstructor: #报告空的默认构造函数。空的代码块没有任何作用,应该删除
|
||
active: true
|
||
EmptyDoWhileBlock: #报告空的do/while循环。空的代码块没有任何作用,应该删除
|
||
active: true
|
||
EmptyElseBlock: #报告为空的else块。空的代码块没有任何作用,应该删除
|
||
active: true
|
||
EmptyFinallyBlock: #报告为空的finally块。空代码块没有任何作用,应该删除
|
||
active: true
|
||
EmptyForBlock: #报告为空的for块。空代码块没有任何作用,应该删除
|
||
active: true
|
||
EmptyFunctionBlock: #报告为空的方法块。空代码块没有任何作用,应该删除
|
||
active: true
|
||
ignoreOverridden: false
|
||
EmptyIfBlock: #报告为空的if块。空代码块没有任何作用,应该删除
|
||
active: true
|
||
EmptyInitBlock: #报告为空的init块。空代码块没有任何作用,应该删除
|
||
active: true
|
||
# EmptyKotlinFile: #报告为空的kotlin文件。空代码块没有任何作用,应该删除
|
||
# active: true
|
||
EmptySecondaryConstructor: #报告为空的辅助构造函数。空代码块没有任何作用,应该删除
|
||
active: true
|
||
EmptyTryBlock: #报告为空的try块。空代码块没有任何作用,应该删除
|
||
active: true
|
||
EmptyWhenBlock: #报告为空的when块。空代码块没有任何作用,应该删除
|
||
active: true
|
||
EmptyWhileBlock: #报告为空的while块。空代码块没有任何作用,应该删除
|
||
active: true
|
||
|
||
exceptions:
|
||
active: true
|
||
ExceptionRaisedInUnexpectedLocation: #此规则报告从不应引发异常的函数。如果存在引发异常的函数,则会报告该函数。默认情况下,此规则检查toString、hashCode、equals和finalize。此规则可通过methodNames配置进行配置
|
||
active: true
|
||
methodNames:
|
||
- 'equals'
|
||
- 'finalize'
|
||
- 'hashCode'
|
||
- 'toString'
|
||
InstanceOfCheckForException: #此规则报告通过is检查或强制转换检查异常类型的捕获块。代码应该使用多个catch块,而不是捕获一般的异常类型,然后检查特定的异常类型。然后,这些捕获块应该捕获特定的异常
|
||
active: true
|
||
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
|
||
NotImplementedDeclaration: #此规则报告引发的所有NotImplementedError类型的异常。它还报告所有TODO(..)函数。这表明功能仍在开发中,无法正常工作。这两种声明都只能作为临时声明,不应放入生产环境中
|
||
active: false
|
||
# ObjectExtendsThrowable: #避免抛出单例Throwable
|
||
# active: false
|
||
PrintStackTrace: #打印堆栈
|
||
active: true
|
||
RethrowCaughtException: #重新抛出异常
|
||
active: true
|
||
ReturnFromFinally: # finally return
|
||
active: true
|
||
ignoreLabeled: false
|
||
SwallowedException: #报告所有捕获异常且未正确传递(例如作为原因)到新引发异常的实例
|
||
active: true
|
||
ignoredExceptionTypes:
|
||
- 'InterruptedException'
|
||
- 'MalformedURLException'
|
||
- 'NumberFormatException'
|
||
- 'ParseException'
|
||
allowedExceptionNameRegex: '_|(ignore|expected).*'
|
||
ThrowingExceptionFromFinally: #报告从finally块抛出异常
|
||
active: true
|
||
ThrowingExceptionInMain: #报告在主方法中引发的所有异常。只有当异常可以由“更高”的函数处理时,才应该抛出异常
|
||
active: false
|
||
ThrowingExceptionsWithoutMessageOrCause: #报告在没有参数或进一步描述的情况下抛出的所有异常
|
||
active: true
|
||
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
|
||
exceptions:
|
||
- 'ArrayIndexOutOfBoundsException'
|
||
- 'Exception'
|
||
- 'IllegalArgumentException'
|
||
- 'IllegalMonitorStateException'
|
||
- 'IllegalStateException'
|
||
- 'IndexOutOfBoundsException'
|
||
- 'NullPointerException'
|
||
- 'RuntimeException'
|
||
- 'Throwable'
|
||
ThrowingNewInstanceOfSameException: #异常不应封装在同一异常类型中,然后重新抛出。更喜欢用更有意义的异常类型包装异常
|
||
active: true
|
||
TooGenericExceptionCaught: #规则为类型过于通用的异常报告捕获块。最好捕获当前处理的案例的特定异常,避免扩大区域
|
||
active: true
|
||
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
|
||
exceptionNames:
|
||
- 'ArrayIndexOutOfBoundsException'
|
||
- 'Error'
|
||
# - 'Exception'
|
||
- 'IllegalMonitorStateException'
|
||
- 'IndexOutOfBoundsException'
|
||
- 'NullPointerException'
|
||
- 'RuntimeException'
|
||
# - 'Throwable'
|
||
allowedExceptionNameRegex: '_|(ignore|expected).*'
|
||
TooGenericExceptionThrown: #规则报告类型过于通用的抛出异常。对于当前发生的情况,最好抛出特定的异常
|
||
active: true
|
||
exceptionNames:
|
||
- 'Error'
|
||
- 'Exception'
|
||
- 'RuntimeException'
|
||
- 'Throwable'
|
||
|
||
naming:
|
||
active: true
|
||
# BooleanPropertyNaming:
|
||
# active: false
|
||
# allowedPattern: '^(is|has|are)'
|
||
ClassNaming:
|
||
active: true
|
||
classPattern: '[A-Z][a-zA-Z0-9]*'
|
||
ConstructorParameterNaming:
|
||
active: true
|
||
parameterPattern: '[a-z][A-Za-z0-9]*'
|
||
privateParameterPattern: '[a-z][A-Za-z0-9]*'
|
||
excludeClassPattern: '$^'
|
||
EnumNaming:
|
||
active: true
|
||
enumEntryPattern: '[A-Z][_a-zA-Z0-9]*'
|
||
ForbiddenClassName:
|
||
active: false
|
||
forbiddenName: []
|
||
# FunctionNameMaxLength:
|
||
# active: false
|
||
# maximumFunctionNameLength: 30
|
||
# FunctionNameMinLength:
|
||
# active: false
|
||
# minimumFunctionNameLength: 3
|
||
FunctionNaming:
|
||
active: true
|
||
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
|
||
functionPattern: '[a-z][a-zA-Z0-9]*'
|
||
excludeClassPattern: '$^'
|
||
FunctionParameterNaming:
|
||
active: true
|
||
parameterPattern: '[a-z][A-Za-z0-9]*'
|
||
excludeClassPattern: '$^'
|
||
InvalidPackageDeclaration:
|
||
active: true
|
||
rootPackage: ''
|
||
# requireRootInDeclaration: false
|
||
# LambdaParameterNaming:
|
||
# active: false
|
||
# parameterPattern: '[a-z][A-Za-z0-9]*|_'
|
||
MatchingDeclarationName:
|
||
active: true
|
||
mustBeFirst: true
|
||
# multiplatformTargets:
|
||
# - 'ios'
|
||
# - 'android'
|
||
# - 'js'
|
||
# - 'jvm'
|
||
# - 'native'
|
||
# - 'iosArm64'
|
||
# - 'iosX64'
|
||
# - 'macosX64'
|
||
# - 'mingwX64'
|
||
# - 'linuxX64'
|
||
MemberNameEqualsClassName:
|
||
active: true
|
||
ignoreOverridden: true
|
||
# NoNameShadowing:
|
||
# active: true
|
||
NonBooleanPropertyPrefixedWithIs:
|
||
active: false
|
||
ObjectPropertyNaming:
|
||
active: true
|
||
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: true
|
||
packagePattern: '[a-z]+(\.[a-z][A-Za-z0-9]*)*'
|
||
TopLevelPropertyNaming:
|
||
active: true
|
||
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
|
||
maximumVariableNameLength: 64
|
||
VariableMinLength:
|
||
active: false
|
||
minimumVariableNameLength: 1
|
||
VariableNaming:
|
||
active: true
|
||
variablePattern: '[a-z][A-Za-z0-9]*'
|
||
privateVariablePattern: '(_)?[a-z][A-Za-z0-9]*'
|
||
excludeClassPattern: '$^'
|
||
|
||
performance:
|
||
active: true
|
||
ArrayPrimitive: #使用Array<Primitive>会导致隐含拳击和性能打击。更喜欢使用Kotlin专用的数组实例
|
||
active: true
|
||
# CouldBeSequence: #由于每个调用都会创建一个新的列表,因此长链的收集操作将带来性能损失。请考虑使用序列
|
||
# active: false
|
||
# allowedOperations: 2
|
||
ForEachOnRange: #在一个范围内使用forEach可能会产生巨大的性能成本。因此,在大多数情况下,应该使用简单的for循环 (for example: {(1..10).forEach})
|
||
active: true
|
||
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
|
||
SpreadOperator: #在大多数情况下,使用排列运算符会导致在调用方法之前创建数组的完整副本。这会带来非常高的性能损失
|
||
active: true
|
||
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
|
||
# UnnecessaryPartOfBinaryExpression: #仅在表达式仅使用以下运算符之一||或&&的情况下验证二进制表达式
|
||
# active: false
|
||
UnnecessaryTemporaryInstantiation: #将基元类型转换为字符串时,请避免使用临时对象。与直接使用基元类型相比,这会降低性能。若要解决此问题,请删除包装类型
|
||
active: true
|
||
|
||
#潜在错误规则集提供了检测潜在错误的规则。
|
||
potential-bugs:
|
||
active: true
|
||
# AvoidReferentialEquality: #检查平等
|
||
# active: true
|
||
# forbiddenTypePatterns:
|
||
# - 'kotlin.String'
|
||
# CastNullableToNonNullableType: #可空强转null
|
||
# active: false
|
||
# ignorePlatformTypes: true
|
||
# CastToNullableType: #将不安全的强制转换报告为可为null的类型。作为字符串?未填充,可能被误用为安全类型转换(如?字符串)
|
||
# active: false
|
||
# CharArrayToStringCall:
|
||
# active: false
|
||
Deprecation:
|
||
active: false
|
||
# DontDowncastCollectionTypes: #检查集合向下类型转换,建议方法转换({list as MutableList} convert : {list.toMutableList()})
|
||
# active: false
|
||
# DoubleMutabilityForCollection: #MutableState可变var,不可变建议val
|
||
# active: true
|
||
# mutableTypes:
|
||
# - 'kotlin.collections.MutableList'
|
||
# - 'kotlin.collections.MutableMap'
|
||
# - 'kotlin.collections.MutableSet'
|
||
# - 'java.util.ArrayList'
|
||
# - 'java.util.LinkedHashSet'
|
||
# - 'java.util.HashSet'
|
||
# - 'java.util.LinkedHashMap'
|
||
# - 'java.util.HashMap'
|
||
# ElseCaseInsteadOfExhaustiveWhen: #当表达式包含else大小写时,即使它们有一组详尽的大小写,该规则也会报告
|
||
# active: false
|
||
# ignoredSubjectTypes: []
|
||
EqualsAlwaysReturnsTrueOrFalse: #报告始终返回true或false的equals()方法。
|
||
active: true
|
||
EqualsWithHashCodeExist: #当一个类重写equals()方法时,它也应该重写hashCode()方法
|
||
active: true
|
||
# ExitOutsideMain: #报告主函数之外使用System.exit()、Runtime.exit()、Runtime.holt()和Kotlin的exitProcess()时的使用情况
|
||
# active: false
|
||
ExplicitGarbageCollectionCall: #报告所有显式触发垃圾回收器的调用。代码应该独立于垃圾收集器工作,并且不应该要求在某些时间点触发GC。
|
||
active: true
|
||
HasPlatformType: #必须在公共API中显式声明平台类型,以防止出现意外错误
|
||
active: true
|
||
|
||
#此规则对使用@CheckReturnValue或@CheckResult注释的函数返回值但未以任何方式使用该值的实例发出警告Kotlin编译器通常不会对这种情况发出警告,所以这就是该规则背后的基本原理。
|
||
IgnoredReturnValue:
|
||
active: false
|
||
# restrictToConfig: true
|
||
returnValueAnnotations:
|
||
- 'CheckResult'
|
||
- '*.CheckResult'
|
||
- 'CheckReturnValue'
|
||
- '*.CheckReturnValue'
|
||
# ignoreReturnValueAnnotations:
|
||
# - 'CanIgnoreReturnValue'
|
||
# - '*.CanIgnoreReturnValue'
|
||
# returnValueTypes:
|
||
# - 'kotlin.sequences.Sequence'
|
||
# - 'kotlinx.coroutines.flow.*Flow'
|
||
# - 'java.util.stream.*Stream'
|
||
# ignoreFunctionCall: []
|
||
ImplicitDefaultLocale: #格式化字符串或执行大小写转换时,更喜欢显式传递[java.util.Locale],而不是使用隐式默认值
|
||
active: false
|
||
ImplicitUnitReturnType: #使用表达式语句的函数具有隐式返回类型
|
||
active: false
|
||
allowExplicitReturnType: true
|
||
InvalidRange: #报告为空的范围
|
||
active: true
|
||
IteratorHasNextCallsNextMethod: #验证Iterator接口的实现。Iterator实现的hasNext()方法不应该有任何副作用
|
||
active: true
|
||
IteratorNotThrowingNoSuchElementException: #报告在next()方法的实现中不抛出NoSuchElementException的Iterator接口的实现。当没有更多的元素要返回时,迭代器应该抛出NoSuchElementException
|
||
active: true
|
||
LateinitUsage: #报告Late-init修饰符的用法。
|
||
active: false
|
||
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
|
||
ignoreOnClassesPattern: ''
|
||
MapGetWithNotNullAssertionOperator: #使用非null断言运算符报告对map访问方法map[]或map.get()的调用!!。这可能会导致NullPointerException
|
||
active: true
|
||
# MissingPackageDeclaration: #当缺少包声明时报告
|
||
# active: false
|
||
# excludes: ['**/*.kts']
|
||
# NullCheckOnMutableProperty: #报告对可变属性的null检查,因为这些属性的值可以在执行if语句后更改,从而使null检查无效
|
||
# active: false
|
||
NullableToStringCall: #使用可能返回字符串“null”的可为null的接收器报告toString()调用
|
||
active: false
|
||
# PropertyUsedBeforeDeclaration: #报告在声明之前使用的属性
|
||
# active: false
|
||
UnconditionalJumpStatementInLoop: #报告包含跳转语句的循环,这些语句在任何条件下都会跳转
|
||
active: false
|
||
# UnnecessaryNotNullCheck: #使用requireNotNull或checkNotNull报告用户可以删除的不必要的非null检查。
|
||
# active: false
|
||
UnnecessaryNotNullOperator: #报告用户可以删除的不必要的非null运算符用法(!!)
|
||
active: true
|
||
UnnecessarySafeCall: #报告用户可以删除的不必要的非null运算符用法(?)
|
||
active: true
|
||
# UnreachableCatchBlock: #报告无法访问的捕获块。如果在上面的块中已经捕获到异常,则捕获块可能无法访问(Exception or Throwable)catch顺序
|
||
# active: true
|
||
UnreachableCode: #报告无法访问的代码。代码可能无法访问,因为它位于return、throw、continue或break表达式后面
|
||
active: true
|
||
UnsafeCallOnNullableType: #报告对可为null的类型的不安全调用
|
||
active: true
|
||
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
|
||
UnsafeCast: #报告不安全的强制转换
|
||
active: true
|
||
# UnusedUnaryOperator: #检测未使用的一元运算符
|
||
# active: true
|
||
UselessPostfixExpression: #报告未使用因而不必要的后缀表达式(++,--)
|
||
active: true
|
||
WrongEqualsTypeParameter: #报告接受错误类型参数的equals()方法
|
||
active: true
|
||
|
||
#{link https://detekt.dev/docs/rules/style#explicititlambdaparameter}
|
||
style:
|
||
active: true
|
||
# AbstractClassCanBeConcreteClass:
|
||
# active: true
|
||
# AbstractClassCanBeInterface:
|
||
# active: true
|
||
# AlsoCouldBeApply:
|
||
# active: false
|
||
# BracesOnIfStatements:
|
||
# active: false
|
||
# singleLine: 'never'
|
||
# multiLine: 'always'
|
||
# BracesOnWhenStatements:
|
||
# active: false
|
||
# singleLine: 'necessary'
|
||
# multiLine: 'consistent'
|
||
# CanBeNonNullable:
|
||
# active: false
|
||
# CascadingCallWrapping:
|
||
# active: false
|
||
# includeElvis: true
|
||
ClassOrdering:
|
||
active: false
|
||
CollapsibleIfStatements:
|
||
active: false
|
||
DataClassContainsFunctions:
|
||
active: false
|
||
# conversionFunctionPrefix:
|
||
# - 'to'
|
||
# allowOperators: false
|
||
DataClassShouldBeImmutable:
|
||
active: false
|
||
# DestructuringDeclarationWithTooManyEntries:
|
||
# active: false
|
||
# maxDestructuringEntries: 3
|
||
# DoubleNegativeLambda:
|
||
# active: false
|
||
# negativeFunctions:
|
||
# - reason: 'Use `takeIf` instead.'
|
||
# value: 'takeUnless'
|
||
# - reason: 'Use `all` instead.'
|
||
# value: 'none'
|
||
# negativeFunctionNameParts:
|
||
# - 'not'
|
||
# - 'non'
|
||
EqualsNullCall:
|
||
active: true
|
||
EqualsOnSignatureLine:
|
||
active: false
|
||
ExplicitCollectionElementAccessMethod:
|
||
active: false
|
||
ExplicitItLambdaParameter:
|
||
active: true
|
||
ExpressionBodySyntax:
|
||
active: false
|
||
includeLineWrapping: false
|
||
# ForbiddenAnnotation:
|
||
# active: false
|
||
# annotations:
|
||
# - reason: 'it is a java annotation. Use `Suppress` instead.'
|
||
# value: 'java.lang.SuppressWarnings'
|
||
# - reason: 'it is a java annotation. Use `kotlin.Deprecated` instead.'
|
||
# value: 'java.lang.Deprecated'
|
||
# - reason: 'it is a java annotation. Use `kotlin.annotation.MustBeDocumented` instead.'
|
||
# value: 'java.lang.annotation.Documented'
|
||
# - reason: 'it is a java annotation. Use `kotlin.annotation.Target` instead.'
|
||
# value: 'java.lang.annotation.Target'
|
||
# - reason: 'it is a java annotation. Use `kotlin.annotation.Retention` instead.'
|
||
# value: 'java.lang.annotation.Retention'
|
||
# - reason: 'it is a java annotation. Use `kotlin.annotation.Repeatable` instead.'
|
||
# value: 'java.lang.annotation.Repeatable'
|
||
# - reason: 'Kotlin does not support @Inherited annotation, see https://youtrack.jetbrains.com/issue/KT-22265'
|
||
# value: 'java.lang.annotation.Inherited'
|
||
ForbiddenComment:
|
||
active: false
|
||
# comments:
|
||
# - reason: 'Forbidden FIXME todo marker in comment, please fix the problem.'
|
||
# value: 'FIXME:'
|
||
# - reason: 'Forbidden STOPSHIP todo marker in comment, please address the problem before shipping the code.'
|
||
# value: 'STOPSHIP:'
|
||
# - reason: 'Forbidden TODO todo marker in comment, please do the changes.'
|
||
# value: 'TODO:'
|
||
allowedPatterns: ''
|
||
ForbiddenImport:
|
||
active: false
|
||
imports: []
|
||
forbiddenPatterns: ''
|
||
ForbiddenMethodCall:
|
||
active: false
|
||
methods:
|
||
- reason: 'print does not allow you to configure the output stream. Use a logger instead.'
|
||
value: 'kotlin.io.print'
|
||
- reason: 'println does not allow you to configure the output stream. Use a logger instead.'
|
||
value: 'kotlin.io.println'
|
||
# ForbiddenSuppress:
|
||
# active: false
|
||
# rules: []
|
||
ForbiddenVoid:
|
||
active: true
|
||
ignoreOverridden: false
|
||
ignoreUsageInGenerics: false
|
||
FunctionOnlyReturningConstant:
|
||
active: true
|
||
ignoreOverridableFunction: true
|
||
# ignoreActualFunction: true
|
||
# excludedFunctions: []
|
||
LoopWithTooManyJumpStatements:
|
||
active: true
|
||
maxJumpCount: 1
|
||
MagicNumber:
|
||
active: true
|
||
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**', '**/*.kts']
|
||
ignoreNumbers:
|
||
- '-1'
|
||
- '0'
|
||
- '1'
|
||
- '2'
|
||
ignoreHashCodeFunction: true
|
||
ignorePropertyDeclaration: false
|
||
ignoreLocalVariableDeclaration: false
|
||
ignoreConstantDeclaration: true
|
||
ignoreCompanionObjectPropertyDeclaration: true
|
||
ignoreAnnotation: false
|
||
ignoreNamedArgument: true
|
||
ignoreEnums: false
|
||
ignoreRanges: false
|
||
# ignoreExtensionFunctions: true
|
||
MandatoryBracesLoops:
|
||
active: false
|
||
# MaxChainedCallsOnSameLine:
|
||
# active: false
|
||
# maxChainedCalls: 5
|
||
MaxLineLength:
|
||
active: true
|
||
maxLineLength: 120
|
||
excludePackageStatements: true
|
||
excludeImportStatements: true
|
||
excludeCommentStatements: false
|
||
# excludeRawStrings: true
|
||
# MayBeConstant:
|
||
# active: true
|
||
ModifierOrder:
|
||
active: true
|
||
# MultilineLambdaItParameter:
|
||
# active: false
|
||
# MultilineRawStringIndentation:
|
||
# active: false
|
||
# indentSize: 4
|
||
# trimmingMethods:
|
||
# - 'trimIndent'
|
||
# - 'trimMargin'
|
||
NestedClassesVisibility: #嵌套类从父类继承其可见性,通常用于实现嵌套在其中的类的本地功能。这些嵌套类的可见性不能高于其父类
|
||
active: true
|
||
NewLineAtEndOfFile:
|
||
active: true
|
||
NoTabs:
|
||
active: false
|
||
# NullableBooleanCheck:
|
||
# active: false
|
||
# ObjectLiteralToLambda: #除了实现单个方法之外什么都不做的匿名对象可以用作lambda。
|
||
# active: true
|
||
OptionalAbstractKeyword:
|
||
active: true
|
||
OptionalUnit:
|
||
active: false
|
||
PreferToOverPairSyntax:
|
||
active: false
|
||
ProtectedMemberInFinalClass:
|
||
active: true
|
||
# RangeUntilInsteadOfRangeTo:
|
||
# active: false
|
||
RedundantExplicitType:
|
||
active: false
|
||
RedundantHigherOrderMapUsage:
|
||
active: true
|
||
RedundantVisibilityModifierRule:
|
||
active: false
|
||
# ReturnCount: #在一个函数中有许多出口点可能会造成混乱,并影响代码的可读性。
|
||
# active: false
|
||
# max: 2
|
||
# excludedFunctions:
|
||
# - 'equals'
|
||
# excludeLabeled: false
|
||
# excludeReturnFromLambda: false
|
||
# excludeGuardClauses: false
|
||
SafeCast:
|
||
active: true
|
||
SerialVersionUIDInSerializableClass:
|
||
active: true
|
||
# SpacingAfterPackageDeclaration:
|
||
# active: false
|
||
# StringShouldBeRawString:
|
||
# active: false
|
||
# maxEscapedCharacterCount: 2
|
||
# ignoredCharacters: []
|
||
ThrowsCount: #限制函数中抛出语句的数量,函数应该有明确的throw语句
|
||
active: true
|
||
max: 2
|
||
# excludeGuardClauses: false
|
||
TrailingWhitespace:
|
||
active: false
|
||
# TrimMultilineRawString:
|
||
# active: false
|
||
# trimmingMethods:
|
||
# - 'trimIndent'
|
||
# - 'trimMargin'
|
||
UnderscoresInNumericLiterals:
|
||
active: false
|
||
# acceptableLength: 4
|
||
# allowNonStandardGrouping: false
|
||
UnnecessaryAnnotationUseSiteTarget:
|
||
active: false
|
||
UnnecessaryApply:
|
||
active: true
|
||
# UnnecessaryBackticks:
|
||
# active: false
|
||
# UnnecessaryBracesAroundTrailingLambda:
|
||
# active: false
|
||
# UnnecessaryFilter:
|
||
# active: true
|
||
UnnecessaryInheritance: #此规则报告不必要的超类型
|
||
active: true
|
||
# UnnecessaryInnerClass:
|
||
# active: false
|
||
UnnecessaryLet:
|
||
active: false
|
||
UnnecessaryParentheses:
|
||
active: false
|
||
# allowForUnclearPrecedence: false
|
||
# UnusedImport:
|
||
# active: false
|
||
# UnusedParameter:
|
||
# active: true
|
||
# allowedNames: 'ignored|expected'
|
||
UnusedPrivateClass:
|
||
active: true
|
||
UnusedPrivateMember:
|
||
active: true
|
||
allowedNames: ''
|
||
# UnusedPrivateProperty:
|
||
# active: true
|
||
# allowedNames: '_|ignored|expected|serialVersionUID'
|
||
# UseAnyOrNoneInsteadOfFind:
|
||
# active: true
|
||
UseArrayLiteralsInAnnotations:
|
||
active: true
|
||
UseCheckNotNull:
|
||
active: true
|
||
UseCheckOrError:
|
||
active: true
|
||
UseDataClass:
|
||
active: false
|
||
allowVars: false
|
||
UseEmptyCounterpart:
|
||
active: false
|
||
UseIfEmptyOrIfBlank:
|
||
active: false
|
||
UseIfInsteadOfWhen:
|
||
active: false
|
||
# ignoreWhenContainingVariableDeclaration: false
|
||
# UseIsNullOrEmpty:
|
||
# active: true
|
||
# UseLet:
|
||
# active: false
|
||
# UseOrEmpty:
|
||
# active: true
|
||
UseRequire:
|
||
active: true
|
||
UseRequireNotNull:
|
||
active: true
|
||
# UseSumOfInsteadOfFlatMapSize:
|
||
# active: false
|
||
UselessCallOnNotNull:
|
||
active: true
|
||
UtilityClassWithPublicConstructor:
|
||
active: true
|
||
VarCouldBeVal:
|
||
active: true
|
||
# ignoreLateinitVar: false
|
||
WildcardImport:
|
||
active: true
|
||
excludeImports:
|
||
- 'java.util.*' |