From 9d5983eae80d4180e842fea20bc2a91d0fa410c4 Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Mon, 25 Sep 2023 14:11:51 +0300 Subject: [PATCH 1/7] Refactored `warn` and `warnAndFix` in `Warnings` ### What's done: - removed `isFixMode` from `warn` - removed `canBeAutoCorrected` from `warnAndFix` It closes #1748 --- .../diktat/ruleset/constants/Warnings.kt | 93 +++++++++++++------ .../ruleset/rules/chapter1/FileNaming.kt | 10 +- .../rules/chapter1/IdentifierNaming.kt | 40 +++++--- .../ruleset/rules/chapter1/PackageNaming.kt | 2 +- .../rules/chapter2/comments/CommentsRule.kt | 1 - .../chapter2/comments/HeaderCommentRule.kt | 2 +- .../rules/chapter2/kdoc/KdocComments.kt | 10 +- .../rules/chapter2/kdoc/KdocFormatting.kt | 6 +- .../rules/chapter2/kdoc/KdocMethods.kt | 6 +- .../ruleset/rules/chapter3/DebugPrintRule.kt | 4 +- .../ruleset/rules/chapter3/EmptyBlock.kt | 2 +- .../LongNumericalValuesSeparatedRule.kt | 2 +- .../ruleset/rules/chapter3/MagicNumberRule.kt | 2 +- .../rules/chapter3/NullableTypeRule.kt | 6 +- .../ruleset/rules/chapter3/files/FileSize.kt | 2 +- .../rules/chapter3/files/FileStructureRule.kt | 4 +- .../rules/chapter3/files/NewlinesRule.kt | 2 +- .../identifiers/LocalVariablesRule.kt | 2 +- .../rules/chapter4/ImmutableValNoVarRule.kt | 2 +- .../ruleset/rules/chapter4/TypeAliasRule.kt | 2 +- .../VariableGenericTypeDeclarationRule.kt | 2 +- .../calculations/AccurateCalculationsRule.kt | 2 +- .../rules/chapter5/AsyncAndSyncRule.kt | 2 +- .../ruleset/rules/chapter5/CustomLabel.kt | 2 +- .../rules/chapter5/FunctionArgumentsSize.kt | 2 +- .../ruleset/rules/chapter5/FunctionLength.kt | 2 +- .../rules/chapter5/LambdaLengthRule.kt | 2 +- .../rules/chapter5/LambdaParameterOrder.kt | 2 +- .../rules/chapter5/NestedFunctionBlock.kt | 2 +- .../chapter5/OverloadingArgumentsFunction.kt | 2 +- .../ParameterNameInOuterLambdaRule.kt | 2 +- .../rules/chapter6/AvoidUtilityClass.kt | 2 +- .../rules/chapter6/CustomGetterSetterRule.kt | 4 +- .../chapter6/ExtensionFunctionsInFileRule.kt | 2 +- .../ExtensionFunctionsSameNameRule.kt | 2 +- .../chapter6/ImplicitBackingPropertyRule.kt | 2 +- .../rules/chapter6/PropertyAccessorFields.kt | 2 +- .../rules/chapter6/classes/DataClassesRule.kt | 2 +- .../chapter6/classes/InlineClassesRule.kt | 2 +- 39 files changed, 145 insertions(+), 95 deletions(-) diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/constants/Warnings.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/constants/Warnings.kt index 357479c215..c6bfa567c8 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/constants/Warnings.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/constants/Warnings.kt @@ -1,5 +1,6 @@ package com.saveourtool.diktat.ruleset.constants +import com.saveourtool.diktat.api.DiktatErrorEmitter import com.saveourtool.diktat.common.config.rules.Rule import com.saveourtool.diktat.common.config.rules.RulesConfig import com.saveourtool.diktat.common.config.rules.isRuleEnabled @@ -7,10 +8,6 @@ import com.saveourtool.diktat.ruleset.generation.EnumNames import com.saveourtool.diktat.ruleset.utils.isSuppressed import org.jetbrains.kotlin.com.intellij.lang.ASTNode -typealias EmitType = ((offset: Int, - errorMessage: String, - canBeAutoCorrected: Boolean) -> Unit) - typealias ListOfList = MutableList> typealias ListOfPairs = MutableList> @@ -201,6 +198,34 @@ enum class Warnings( */ fun warnText() = "[${ruleName()}] ${this.warn}:" + /** + * @param configRules list of [RulesConfig] + * @param emit function that will be called on warning + * @param freeText text that will be added to the warning message + * @param offset offset from the beginning of the file + * @param node the [ASTNode] on which the warning was triggered + * @param shouldBeAutoCorrected should be auto corrected or not + * @param isFixMode whether autocorrect mode is on + * @param autoFix function that will be called to autocorrect the warning + */ + @Suppress("LongParameterList", "TOO_MANY_PARAMETERS") + fun warnOnlyOrWarnAndFix( + configRules: List, + emit: DiktatErrorEmitter, + freeText: String, + offset: Int, + node: ASTNode, + shouldBeAutoCorrected: Boolean, + isFixMode: Boolean, + autoFix: () -> Unit, + ) { + if (shouldBeAutoCorrected) { + warnAndFix(configRules, emit, isFixMode, freeText, offset, node, autoFix) + } else { + warn(configRules, emit, freeText, offset, node) + } + } + /** * @param configRules list of [RulesConfig] * @param emit function that will be called on warning @@ -208,46 +233,60 @@ enum class Warnings( * @param freeText text that will be added to the warning message * @param offset offset from the beginning of the file * @param node the [ASTNode] on which the warning was triggered - * @param canBeAutoCorrected whether this warning can be autocorrected * @param autoFix function that will be called to autocorrect the warning */ @Suppress("LongParameterList", "TOO_MANY_PARAMETERS") - fun warnAndFix(configRules: List, - emit: EmitType, - isFixMode: Boolean, - freeText: String, - offset: Int, - node: ASTNode, - canBeAutoCorrected: Boolean = this.canBeAutoCorrected, - autoFix: () -> Unit) { - warn(configRules, emit, canBeAutoCorrected, freeText, offset, node) - if (canBeAutoCorrected) { - fix(configRules, isFixMode, node, autoFix) + fun warnAndFix( + configRules: List, + emit: DiktatErrorEmitter, + isFixMode: Boolean, + freeText: String, + offset: Int, + node: ASTNode, + autoFix: () -> Unit, + ) { + require(canBeAutoCorrected) { + "warnAndFix is called, but canBeAutoCorrected is false" } + doWarn(configRules, emit, freeText, offset, node, true) + fix(configRules, isFixMode, node, autoFix) } /** * @param configs list of [RulesConfig] * @param emit function that will be called on warning - * @param autoCorrected whether this warning can be autocorrected * @param freeText text that will be added to the warning message * @param offset offset from the beginning of the file * @param node the [ASTNode] on which the warning was triggered */ @Suppress("LongParameterList", "TOO_MANY_PARAMETERS") - fun warn(configs: List, - emit: EmitType, - autoCorrected: Boolean, - freeText: String, - offset: Int, - node: ASTNode) { + fun warn( + configs: List, + emit: DiktatErrorEmitter, + freeText: String, + offset: Int, + node: ASTNode, + ) { + doWarn(configs, emit, freeText, offset, node, false) + } + + @Suppress("LongParameterList", "TOO_MANY_PARAMETERS") + private fun doWarn( + configs: List, + emit: DiktatErrorEmitter, + freeText: String, + offset: Int, + node: ASTNode, + canBeAutoCorrected: Boolean, + ) { if (isRuleFromActiveChapter(configs) && configs.isRuleEnabled(this) && !node.isSuppressed(name, this, configs)) { val trimmedFreeText = freeText .lines() .run { if (size > 1) "${first()}..." else first() } - emit(offset, - "${this.warnText()} $trimmedFreeText", - autoCorrected + emit( + offset, + errorMessage = "${this.warnText()} $trimmedFreeText", + canBeAutoCorrected = canBeAutoCorrected, ) } } @@ -264,7 +303,7 @@ enum class Warnings( companion object { val names by lazy { - values().map { it.name } + entries.map { it.name } } } } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter1/FileNaming.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter1/FileNaming.kt index 56c0ba4bb3..b1b7b6e776 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter1/FileNaming.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter1/FileNaming.kt @@ -46,9 +46,8 @@ class FileNaming(configRules: List) : DiktatRule( private fun checkFileNaming(node: ASTNode) { val (name, extension) = getFileParts(filePath) if (!name.isPascalCase() || !validExtensions.contains(extension)) { - FILE_NAME_INCORRECT.warnAndFix(configRules, emitWarn, isFixMode, "$name$extension", 0, node) { - // FixMe: we can add an autocorrect here in future, but is there any purpose to change file or class name? - } + // FixMe: we can add an autocorrect here in future, but is there any purpose to change file or class name? + FILE_NAME_INCORRECT.warn(configRules, emitWarn, "$name$extension", 0, node) } } @@ -59,9 +58,8 @@ class FileNaming(configRules: List) : DiktatRule( if (classes.size == 1) { val className = classes[0].getFirstChildWithType(IDENTIFIER)!!.text if (className != fileNameWithoutSuffix) { - FILE_NAME_MATCH_CLASS.warnAndFix(configRules, emitWarn, isFixMode, "$fileNameWithoutSuffix$fileNameSuffix vs $className", 0, fileLevelNode) { - // FixMe: we can add an autocorrect here in future, but is there any purpose to change file name? - } + // FixMe: we can add an autocorrect here in future, but is there any purpose to change file name? + FILE_NAME_MATCH_CLASS.warn(configRules, emitWarn, "$fileNameWithoutSuffix$fileNameSuffix vs $className", 0, fileLevelNode) } } else { // FixMe: need to check that if there are several classes - at least one of them should match diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter1/IdentifierNaming.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter1/IdentifierNaming.kt index e1cb5bbb38..5c2c918886 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter1/IdentifierNaming.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter1/IdentifierNaming.kt @@ -131,7 +131,7 @@ class IdentifierNaming(configRules: List) : DiktatRule( if (identifierText.startsWith('`') && identifierText.endsWith('`')) { val isTestFun = node.elementType == KtNodeTypes.FUN && node.hasTestAnnotation() if (!isTestFun) { - BACKTICKS_PROHIBITED.warn(configRules, emitWarn, isFixMode, identifierText, identifier.startOffset, identifier) + BACKTICKS_PROHIBITED.warn(configRules, emitWarn, identifierText, identifier.startOffset, identifier) } return true } @@ -158,13 +158,13 @@ class IdentifierNaming(configRules: List) : DiktatRule( val isNonPrivatePrimaryConstructorParameter = (node.psi as? KtParameter)?.run { hasValOrVar() && getParentOfType(true)?.valueParameters?.contains(this) == true && !isPrivate() } ?: false - val canBeAutoCorrected = !(isPublicOrNonLocalProperty || isNonPrivatePrimaryConstructorParameter) + val shouldBeAutoCorrected = !(isPublicOrNonLocalProperty || isNonPrivatePrimaryConstructorParameter) namesOfVariables .forEach { variableName -> // variable should not contain only one letter in it's name. This is a bad example: b512 // but no need to raise a warning here if length of a variable. In this case we will raise IDENTIFIER_LENGTH if (variableName.text.containsOneLetterOrZero() && variableName.text.length > 1) { - VARIABLE_NAME_INCORRECT.warn(configRules, emitWarn, false, variableName.text, variableName.startOffset, node) + VARIABLE_NAME_INCORRECT.warn(configRules, emitWarn, variableName.text, variableName.startOffset, node) } // check if identifier of a property has a confusing name if (confusingIdentifierNames.contains(variableName.text) && !isValidCatchIdentifier(variableName) && @@ -176,13 +176,29 @@ class IdentifierNaming(configRules: List) : DiktatRule( // it should be in UPPER_CASE, no need to raise this warning if it is one-letter variable if (node.isConstant()) { if (!variableName.text.isUpperSnakeCase() && variableName.text.length > 1) { - CONSTANT_UPPERCASE.warnAndFix(configRules, emitWarn, isFixMode, variableName.text, variableName.startOffset, node, canBeAutoCorrected) { + CONSTANT_UPPERCASE.warnOnlyOrWarnAndFix( + configRules = configRules, + emit = emitWarn, + freeText = variableName.text, + offset = variableName.startOffset, + node = node, + shouldBeAutoCorrected = shouldBeAutoCorrected, + isFixMode = isFixMode, + ) { (variableName as LeafPsiElement).rawReplaceWithText(variableName.text.toDeterministic { toUpperSnakeCase() }) } } } else if (variableName.text != "_" && !variableName.text.isLowerCamelCase()) { // variable name should be in camel case. The only exception is a list of industry standard variables like i, j, k. - VARIABLE_NAME_INCORRECT_FORMAT.warnAndFix(configRules, emitWarn, isFixMode, variableName.text, variableName.startOffset, node, canBeAutoCorrected) { + VARIABLE_NAME_INCORRECT_FORMAT.warnOnlyOrWarnAndFix( + configRules = configRules, + emit = emitWarn, + freeText = variableName.text, + offset = variableName.startOffset, + node = node, + shouldBeAutoCorrected = shouldBeAutoCorrected, + isFixMode = isFixMode, + ) { // FixMe: cover fixes with tests val correctVariableName = variableName.text.toDeterministic { toLowerCamelCase() } variableName @@ -240,7 +256,7 @@ class IdentifierNaming(configRules: List) : DiktatRule( else -> "" } - CONFUSING_IDENTIFIER_NAMING.warn(configRules, emitWarn, false, warnText, variableName.startOffset, variableName) + CONFUSING_IDENTIFIER_NAMING.warn(configRules, emitWarn, warnText, variableName.startOffset, variableName) } /** @@ -274,9 +290,8 @@ class IdentifierNaming(configRules: List) : DiktatRule( private fun checkClassNamings(node: ASTNode): List { val genericType: ASTNode? = node.getTypeParameterList() if (genericType != null && !validGenericTypeName(genericType)) { - GENERIC_NAME.warnAndFix(configRules, emitWarn, isFixMode, genericType.text, genericType.startOffset, genericType) { - // FixMe: should fix generic name here - } + // FixMe: should fix generic name here + GENERIC_NAME.warn(configRules, emitWarn, genericType.text, genericType.startOffset, genericType) } val className: ASTNode = node.getIdentifierName() ?: return emptyList() @@ -397,9 +412,8 @@ class IdentifierNaming(configRules: List) : DiktatRule( if (functionReturnType != null && functionReturnType == PrimitiveType.BOOLEAN.typeName.asString()) { @Suppress("COLLAPSE_IF_STATEMENTS") if (allMethodPrefixes.none { functionName.text.startsWith(it) }) { - FUNCTION_BOOLEAN_PREFIX.warnAndFix(configRules, emitWarn, isFixMode, functionName.text, functionName.startOffset, functionName) { - // FixMe: add agressive autofix for this - } + // FixMe: add agressive autofix for this + FUNCTION_BOOLEAN_PREFIX.warn(configRules, emitWarn, functionName.text, functionName.startOffset, functionName) } } } @@ -441,7 +455,7 @@ class IdentifierNaming(configRules: List) : DiktatRule( if (it.text != "_" && !it.isTextLengthInRange(MIN_IDENTIFIER_LENGTH..MAX_IDENTIFIER_LENGTH) && !isValidOneCharVariable && !isValidCatchIdentifier(it) ) { - IDENTIFIER_LENGTH.warn(configRules, emitWarn, isFixMode, it.text, it.startOffset, it) + IDENTIFIER_LENGTH.warn(configRules, emitWarn, it.text, it.startOffset, it) } } } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter1/PackageNaming.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter1/PackageNaming.kt index 0416284ba6..36cc36e85a 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter1/PackageNaming.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter1/PackageNaming.kt @@ -168,7 +168,7 @@ class PackageNaming(configRules: List) : DiktatRule( // all words should contain only ASCII letters or digits wordsInPackageName .filter { word -> !areCorrectSymbolsUsed(word.text) } - .forEach { PACKAGE_NAME_INCORRECT_SYMBOLS.warn(configRules, emitWarn, isFixMode, it.text, it.startOffset, it) } + .forEach { PACKAGE_NAME_INCORRECT_SYMBOLS.warn(configRules, emitWarn, it.text, it.startOffset, it) } // all words should contain only ASCII letters or digits wordsInPackageName.forEach { correctPackageWordSeparatorsUsed(it) } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/comments/CommentsRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/comments/CommentsRule.kt index 71f23f5575..dbec1e6cd8 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/comments/CommentsRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/comments/CommentsRule.kt @@ -105,7 +105,6 @@ class CommentsRule(configRules: List) : DiktatRule( COMMENTED_OUT_CODE.warn( configRules, emitWarn, - isFixMode, parsedNode.text.substringBefore("\n").trim(), offset, invalidNode diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/comments/HeaderCommentRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/comments/HeaderCommentRule.kt index dcb265dc4f..44c2e8f4bb 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/comments/HeaderCommentRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/comments/HeaderCommentRule.kt @@ -72,7 +72,7 @@ class HeaderCommentRule(configRules: List) : DiktatRule( val numDeclaredClassesAndObjects = node.getAllChildrenWithType(KtNodeTypes.CLASS).size + node.getAllChildrenWithType(KtNodeTypes.OBJECT_DECLARATION).size if (numDeclaredClassesAndObjects != 1) { - HEADER_MISSING_IN_NON_SINGLE_CLASS_FILE.warn(configRules, emitWarn, isFixMode, + HEADER_MISSING_IN_NON_SINGLE_CLASS_FILE.warn(configRules, emitWarn, "there are $numDeclaredClassesAndObjects declared classes and/or objects", node.startOffset, node) } } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/kdoc/KdocComments.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/kdoc/KdocComments.kt index f55242671c..f6c0969c22 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/kdoc/KdocComments.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/kdoc/KdocComments.kt @@ -106,7 +106,7 @@ class KdocComments(configRules: List) : DiktatRule( .mapNotNull { it.nameIdentifier?.text } propertiesInKdoc .filterNot { it.getSubjectName() == null || it.getSubjectName() in propertyNames } - .forEach { KDOC_EXTRA_PROPERTY.warn(configRules, emitWarn, isFixMode, it.text, it.node.startOffset, node) } + .forEach { KDOC_EXTRA_PROPERTY.warn(configRules, emitWarn, it.text, it.node.startOffset, node) } } @Suppress("UnsafeCallOnNullableType", "ComplexMethod") @@ -236,7 +236,7 @@ class KdocComments(configRules: List) : DiktatRule( // if property is documented with KDoc, which has a property tag inside, then it can contain some additional more complicated // structure, that will be hard to move automatically val isFixable = propertyInLocalKdoc == null - KDOC_NO_CONSTRUCTOR_PROPERTY.warnAndFix(configRules, emitWarn, isFixMode, prevComment.text, prevComment.startOffset, node, isFixable) { + KDOC_NO_CONSTRUCTOR_PROPERTY.warnOnlyOrWarnAndFix(configRules, emitWarn, prevComment.text, prevComment.startOffset, node, shouldBeAutoCorrected = isFixable, isFixMode) { propertyInClassKdoc?.let { // local docs should be appended to docs in class appendKdocTagContent(propertyInClassKdoc, "\n$kdocText") @@ -274,7 +274,7 @@ class KdocComments(configRules: List) : DiktatRule( val traversedNodes: MutableSet = mutableSetOf() propertiesAndParams.forEach { property -> if (!traversedNodes.add(property.getSubjectName())) { - KDOC_DUPLICATE_PROPERTY.warn(configRules, emitWarn, isFixMode, property.text, property.node.startOffset, kdoc) + KDOC_DUPLICATE_PROPERTY.warn(configRules, emitWarn, property.text, property.node.startOffset, kdoc) } } } @@ -326,7 +326,7 @@ class KdocComments(configRules: List) : DiktatRule( } propertyInClassKdoc?.let { // if property is documented as `@property`, then we suggest to move docs to the declaration inside the class body - KDOC_NO_CLASS_BODY_PROPERTIES_IN_HEADER.warn(configRules, emitWarn, isFixMode, classElement.text, classElement.startOffset, classElement) + KDOC_NO_CLASS_BODY_PROPERTIES_IN_HEADER.warn(configRules, emitWarn, classElement.text, classElement.startOffset, classElement) return } } @@ -359,7 +359,7 @@ class KdocComments(configRules: List) : DiktatRule( } if (isModifierAccessibleOutsideOrActual && kdoc == null && !isTopLevelFunctionStandard(node)) { - warning.warn(configRules, emitWarn, isFixMode, name!!.text, node.startOffset, node) + warning.warn(configRules, emitWarn, name!!.text, node.startOffset, node) } } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/kdoc/KdocFormatting.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/kdoc/KdocFormatting.kt index be151632d6..34027f5616 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/kdoc/KdocFormatting.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/kdoc/KdocFormatting.kt @@ -120,7 +120,7 @@ class KdocFormatting(configRules: List) : DiktatRule( it.elementType != KDocTokens.LEADING_ASTERISK && it.elementType != WHITE_SPACE } ?: false if (!isKdocNotEmpty) { - KDOC_EMPTY_KDOC.warn(configRules, emitWarn, isFixMode, + KDOC_EMPTY_KDOC.warn(configRules, emitWarn, node.treeParent.getIdentifierName()?.text ?: node.nextSibling { it.elementType in KtTokens.KEYWORDS }?.text ?: node.text, node.startOffset, node) @@ -152,7 +152,7 @@ class KdocFormatting(configRules: List) : DiktatRule( kdocTags?.filter { it.getSubjectName() == null && it.getContent().isEmpty() }?.forEach { - KDOC_NO_EMPTY_TAGS.warn(configRules, emitWarn, isFixMode, "@${it.name!!}", it.node.startOffset, it.node) + KDOC_NO_EMPTY_TAGS.warn(configRules, emitWarn, "@${it.name!!}", it.node.startOffset, it.node) } } @@ -347,7 +347,7 @@ class KdocFormatting(configRules: List) : DiktatRule( it.knownTag == KDocKnownTag.SINCE && it.hasInvalidVersion() } .forEach { - KDOC_CONTAINS_DATE_OR_AUTHOR.warn(configRules, emitWarn, isFixMode, it.text.trim(), it.startOffset, it.node) + KDOC_CONTAINS_DATE_OR_AUTHOR.warn(configRules, emitWarn, it.text.trim(), it.startOffset, it.node) } } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/kdoc/KdocMethods.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/kdoc/KdocMethods.kt index 0a34e66966..fba546c99d 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/kdoc/KdocMethods.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/kdoc/KdocMethods.kt @@ -121,7 +121,7 @@ class KdocMethods(configRules: List) : DiktatRule( if (kdoc == null && anyTagFailed) { addKdocTemplate(node, name, missingParameters, explicitlyThrownExceptions, returnCheckFailed) } else if (kdoc == null && !isReferenceExpressionWithSameName(node)) { - MISSING_KDOC_ON_FUNCTION.warn(configRules, emitWarn, false, name, node.startOffset, node) + MISSING_KDOC_ON_FUNCTION.warn(configRules, emitWarn, name, node.startOffset, node) } else { if (paramCheckFailed) { handleParamCheck(node, kdoc, missingParameters, kDocMissingParameters, kdocTags) @@ -216,7 +216,7 @@ class KdocMethods(configRules: List) : DiktatRule( kdocTags: Collection? ) { kdocMissingParameters.forEach { - KDOC_WITHOUT_PARAM_TAG.warn(configRules, emitWarn, false, + KDOC_WITHOUT_PARAM_TAG.warn(configRules, emitWarn, "${it.getSubjectName()} param isn't present in argument list", it.node.startOffset, it.node) } @@ -295,7 +295,7 @@ class KdocMethods(configRules: List) : DiktatRule( .text .trim() if (kdocText.matches(uselessKdocRegex)) { - KDOC_TRIVIAL_KDOC_ON_FUNCTION.warn(configRules, emitWarn, isFixMode, kdocText, kdocTextNodes.first().startOffset, node) + KDOC_TRIVIAL_KDOC_ON_FUNCTION.warn(configRules, emitWarn, kdocText, kdocTextNodes.first().startOffset, node) } } } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/DebugPrintRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/DebugPrintRule.kt index 6858adc994..b66ee0d3ee 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/DebugPrintRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/DebugPrintRule.kt @@ -34,7 +34,7 @@ class DebugPrintRule(configRules: List) : DiktatRule( valueArgumentList?.getChildren(TokenSet.create(KtNodeTypes.VALUE_ARGUMENT))?.size?.let { it <= 1 } == true && node.findChildByType(KtNodeTypes.LAMBDA_ARGUMENT) == null) { Warnings.DEBUG_PRINT.warn( - configRules, emitWarn, autoCorrected = false, + configRules, emitWarn, "found $referenceExpression()", node.startOffset, node, ) } @@ -57,7 +57,7 @@ class DebugPrintRule(configRules: List) : DiktatRule( ?.text if (logMethod in setOf("error", "info", "log", "warn")) { Warnings.DEBUG_PRINT.warn( - configRules, emitWarn, autoCorrected = false, + configRules, emitWarn, "found console.$logMethod()", node.startOffset, node, ) } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/EmptyBlock.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/EmptyBlock.kt index 31c074b132..1adad213fd 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/EmptyBlock.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/EmptyBlock.kt @@ -55,7 +55,7 @@ class EmptyBlock(configRules: List) : DiktatRule( @Suppress("UnsafeCallOnNullableType", "TOO_LONG_FUNCTION") private fun checkEmptyBlock(node: ASTNode, configuration: EmptyBlockStyleConfiguration) { if (!configuration.emptyBlockExist) { - EMPTY_BLOCK_STRUCTURE_ERROR.warn(configRules, emitWarn, isFixMode, "empty blocks are forbidden unless it is function with override keyword", + EMPTY_BLOCK_STRUCTURE_ERROR.warn(configRules, emitWarn, "empty blocks are forbidden unless it is function with override keyword", node.startOffset, node) } else { node.findParentNodeWithSpecificType(KtNodeTypes.LAMBDA_ARGUMENT)?.let { diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/LongNumericalValuesSeparatedRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/LongNumericalValuesSeparatedRule.kt index fd760e4586..8ce2ed5aee 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/LongNumericalValuesSeparatedRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/LongNumericalValuesSeparatedRule.kt @@ -124,7 +124,7 @@ class LongNumericalValuesSeparatedRule(configRules: List) : DiktatR blocks.forEach { if (it.length > configuration.maxBlockLength) { - LONG_NUMERICAL_VALUES_SEPARATED.warn(configRules, emitWarn, false, "this block is too long $it", node.startOffset, node) + LONG_NUMERICAL_VALUES_SEPARATED.warn(configRules, emitWarn, "this block is too long $it", node.startOffset, node) } } } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/MagicNumberRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/MagicNumberRule.kt index f64a46424d..7ae8d77cbe 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/MagicNumberRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/MagicNumberRule.kt @@ -69,7 +69,7 @@ class MagicNumberRule(configRules: List) : DiktatRule( val result = listOf(isHashFunction, isPropertyDeclaration, isLocalVariable, isValueParameter, isConstant, isCompanionObjectProperty, isEnums, isRanges, isExtensionFunctions).zip(mapConfiguration.map { configuration.getParameter(it.key) }) if (result.any { it.first && it.first != it.second } && !isIgnoreNumber) { - MAGIC_NUMBER.warn(configRules, emitWarn, isFixMode, nodeText, node.startOffset, node) + MAGIC_NUMBER.warn(configRules, emitWarn, nodeText, node.startOffset, node) } } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/NullableTypeRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/NullableTypeRule.kt index 44214f5d41..98cba7a3a3 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/NullableTypeRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/NullableTypeRule.kt @@ -59,12 +59,12 @@ class NullableTypeRule(configRules: List) : DiktatRule( typeReferenceNode.findChildByType(NULLABLE_TYPE)!!.hasChildOfType(QUEST) && (node.findChildByType(CALL_EXPRESSION)?.findChildByType(REFERENCE_EXPRESSION) == null || node.findChildByType(CALL_EXPRESSION)!!.findChildByType(REFERENCE_EXPRESSION)!!.text in allowExpression)) { - NULLABLE_PROPERTY_TYPE.warn(configRules, emitWarn, isFixMode, "don't use nullable type", + NULLABLE_PROPERTY_TYPE.warn(configRules, emitWarn, "don't use nullable type", node.findChildByType(TYPE_REFERENCE)!!.startOffset, node) } else if (node.hasChildOfType(NULL)) { val fixedParam = findFixableParam(node) - NULLABLE_PROPERTY_TYPE.warnAndFix(configRules, emitWarn, isFixMode, "initialize explicitly", - node.findChildByType(NULL)!!.startOffset, node, fixedParam != null) { + NULLABLE_PROPERTY_TYPE.warnOnlyOrWarnAndFix(configRules, emitWarn, "initialize explicitly", + node.findChildByType(NULL)!!.startOffset, node, shouldBeAutoCorrected = fixedParam != null, isFixMode) { fixedParam?.let { findSubstitution(node, fixedParam) } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/files/FileSize.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/files/FileSize.kt index 1e410f52bf..baed436798 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/files/FileSize.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/files/FileSize.kt @@ -35,7 +35,7 @@ class FileSize(configRules: List) : DiktatRule( .split("\n") .size if (size > maxSize) { - FILE_IS_TOO_LONG.warn(configRules, emitWarn, isFixMode, size.toString(), node.startOffset, node) + FILE_IS_TOO_LONG.warn(configRules, emitWarn, size.toString(), node.startOffset, node) } } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/files/FileStructureRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/files/FileStructureRule.kt index 02d0dcd292..b3980fde2d 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/files/FileStructureRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/files/FileStructureRule.kt @@ -109,7 +109,7 @@ class FileStructureRule(configRules: List) : DiktatRule( val hasCode = node.getChildren(codeTokens).isNotEmpty() if (!hasCode) { val freeText = if (node.text.isEmpty()) "file is empty" else "file contains no code" - FILE_CONTAINS_ONLY_COMMENTS.warn(configRules, emitWarn, isFixMode, freeText, node.startOffset, node) + FILE_CONTAINS_ONLY_COMMENTS.warn(configRules, emitWarn, freeText, node.startOffset, node) } return hasCode } @@ -208,7 +208,7 @@ class FileStructureRule(configRules: List) : DiktatRule( isAllUnder && toString() !in wildCardImportsConfig.allowedWildcards } } - .forEach { FILE_WILDCARD_IMPORTS.warn(configRules, emitWarn, isFixMode, it.text, it.startOffset, it) } + .forEach { FILE_WILDCARD_IMPORTS.warn(configRules, emitWarn, it.text, it.startOffset, it) } val sortedImportsGroups = if (importsGroupingConfig.useRecommendedImportsOrder) { regroupImports(imports.map { it.psi as KtImportDirective }) .map { group -> group.map { it.node } } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/files/NewlinesRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/files/NewlinesRule.kt index 354c0d5de3..e423d64763 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/files/NewlinesRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/files/NewlinesRule.kt @@ -288,7 +288,7 @@ class NewlinesRule(configRules: List) : DiktatRule( // this inspection is softened for gradle scripts, see https://github.com/saveourtool/diktat/issues/1148 return } - COMPLEX_EXPRESSION.warn(configRules, emitWarn, isFixMode, node.text, node.startOffset, node) + COMPLEX_EXPRESSION.warn(configRules, emitWarn, node.text, node.startOffset, node) } private fun handleOpeningParentheses(node: ASTNode) { diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/identifiers/LocalVariablesRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/identifiers/LocalVariablesRule.kt index 8e9357ea6e..709b09a214 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/identifiers/LocalVariablesRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/identifiers/LocalVariablesRule.kt @@ -172,7 +172,7 @@ class LocalVariablesRule(configRules: List) : DiktatRule( } if (firstUsageStatementLine - numLinesToSkip != property.node.lastLineNumber() + 1 + offset) { - LOCAL_VARIABLE_EARLY_DECLARATION.warn(configRules, emitWarn, isFixMode, + LOCAL_VARIABLE_EARLY_DECLARATION.warn(configRules, emitWarn, warnMessage(property.name!!, property.node.getLineNumber(), firstUsageLine ?: firstUsageStatementLine), property.startOffset, property.node) } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter4/ImmutableValNoVarRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter4/ImmutableValNoVarRule.kt index 3a341b4496..d39a2aa246 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter4/ImmutableValNoVarRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter4/ImmutableValNoVarRule.kt @@ -47,7 +47,7 @@ class ImmutableValNoVarRule(configRules: List) : DiktatRule( } if (!usedInAccumulators) { - SAY_NO_TO_VAR.warn(configRules, emitWarn, isFixMode, property.text, property.node.startOffset, property.node) + SAY_NO_TO_VAR.warn(configRules, emitWarn, property.text, property.node.startOffset, property.node) } } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter4/TypeAliasRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter4/TypeAliasRule.kt index 1a465447c9..b99b78297d 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter4/TypeAliasRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter4/TypeAliasRule.kt @@ -40,7 +40,7 @@ class TypeAliasRule(configRules: List) : DiktatRule( if (node.textLength > config.typeReferenceLength) { @Suppress("COLLAPSE_IF_STATEMENTS") if (node.findAllDescendantsWithSpecificType(LT).size > 1 || node.findAllDescendantsWithSpecificType(VALUE_PARAMETER).size > 1) { - TYPE_ALIAS.warn(configRules, emitWarn, isFixMode, "too long type reference", node.startOffset, node) + TYPE_ALIAS.warn(configRules, emitWarn, "too long type reference", node.startOffset, node) } } } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter4/VariableGenericTypeDeclarationRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter4/VariableGenericTypeDeclarationRule.kt index b374a3f373..2aa55021cc 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter4/VariableGenericTypeDeclarationRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter4/VariableGenericTypeDeclarationRule.kt @@ -71,7 +71,7 @@ class VariableGenericTypeDeclarationRule(configRules: List) : Dikta } if (leftSide == null && rightSide != null) { - GENERIC_VARIABLE_WRONG_DECLARATION.warn(configRules, emitWarn, isFixMode, node.text, node.startOffset, node) + GENERIC_VARIABLE_WRONG_DECLARATION.warn(configRules, emitWarn, node.text, node.startOffset, node) } } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter4/calculations/AccurateCalculationsRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter4/calculations/AccurateCalculationsRule.kt index be7201e2e3..6e46cd8b87 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter4/calculations/AccurateCalculationsRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter4/calculations/AccurateCalculationsRule.kt @@ -78,7 +78,7 @@ class AccurateCalculationsRule(configRules: List) : DiktatRule( private fun checkFloatValue(floatValue: PsiElement?, expression: KtExpression) { floatValue?.let { // float value is used in comparison - FLOAT_IN_ACCURATE_CALCULATIONS.warn(configRules, emitWarn, isFixMode, + FLOAT_IN_ACCURATE_CALCULATIONS.warn(configRules, emitWarn, "float value of <${it.text}> used in arithmetic expression in ${expression.text}", expression.startOffset, expression.node) } } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/AsyncAndSyncRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/AsyncAndSyncRule.kt index 1ee42d8a95..23df0db6e0 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/AsyncAndSyncRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/AsyncAndSyncRule.kt @@ -32,7 +32,7 @@ class AsyncAndSyncRule(configRules: List) : DiktatRule( private fun checkRunBlocking(node: ASTNode) { node.parent { it.isAsync() || it.isSuspend() }?.let { - RUN_BLOCKING_INSIDE_ASYNC.warn(configRules, emitWarn, isFixMode, node.text, node.startOffset, node) + RUN_BLOCKING_INSIDE_ASYNC.warn(configRules, emitWarn, node.text, node.startOffset, node) } } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/CustomLabel.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/CustomLabel.kt index 661db831ad..aed505e6cd 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/CustomLabel.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/CustomLabel.kt @@ -33,7 +33,7 @@ class CustomLabel(configRules: List) : DiktatRule( (it.elementType == CALL_EXPRESSION && it.findChildByType(REFERENCE_EXPRESSION)?.text in forEachReference) } if (nestedCount == 1) { - CUSTOM_LABEL.warn(configRules, emitWarn, isFixMode, node.text, node.startOffset, node) + CUSTOM_LABEL.warn(configRules, emitWarn, node.text, node.startOffset, node) } } } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/FunctionArgumentsSize.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/FunctionArgumentsSize.kt index 6b29eab6c3..8f84b9694b 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/FunctionArgumentsSize.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/FunctionArgumentsSize.kt @@ -33,7 +33,7 @@ class FunctionArgumentsSize(configRules: List) : DiktatRule( private fun checkFun(node: ASTNode, maxParameterSize: Long) { val parameterListSize = (node.psi as KtFunction).valueParameters.size if (parameterListSize > maxParameterSize) { - TOO_MANY_PARAMETERS.warn(configRules, emitWarn, isFixMode, + TOO_MANY_PARAMETERS.warn(configRules, emitWarn, "${node.findChildByType(IDENTIFIER)!!.text} has $parameterListSize, but allowed $maxParameterSize", node.startOffset, node) } } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/FunctionLength.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/FunctionLength.kt index ccf5256583..6470d61eac 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/FunctionLength.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/FunctionLength.kt @@ -40,7 +40,7 @@ class FunctionLength(configRules: List) : DiktatRule( } val sizeFun = countCodeLines(copyNode) if (sizeFun > configuration.maxFunctionLength) { - TOO_LONG_FUNCTION.warn(configRules, emitWarn, isFixMode, + TOO_LONG_FUNCTION.warn(configRules, emitWarn, "max length is ${configuration.maxFunctionLength}, but you have $sizeFun", node.startOffset, node) } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/LambdaLengthRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/LambdaLengthRule.kt index 14503c1726..b190fba98f 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/LambdaLengthRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/LambdaLengthRule.kt @@ -33,7 +33,7 @@ class LambdaLengthRule(configRules: List) : DiktatRule( private fun checkLambda(node: ASTNode, configuration: LambdaLengthConfiguration) { val sizeLambda = countCodeLines(node) if (sizeLambda > configuration.maxLambdaLength && doesLambdaContainIt(node)) { - TOO_MANY_LINES_IN_LAMBDA.warn(configRules, emitWarn, isFixMode, + TOO_MANY_LINES_IN_LAMBDA.warn(configRules, emitWarn, "max length lambda without arguments is ${configuration.maxLambdaLength}, but you have $sizeLambda", node.startOffset, node) } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/LambdaParameterOrder.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/LambdaParameterOrder.kt index 365582a06f..76bf802176 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/LambdaParameterOrder.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/LambdaParameterOrder.kt @@ -39,7 +39,7 @@ class LambdaParameterOrder(configRules: List) : DiktatRule( ?.hasChildOfType(FUNCTION_TYPE) } funArguments.filterIndexed { index, ktParameter -> ktParameter != sortArguments[index] }.ifNotEmpty { - LAMBDA_IS_NOT_LAST_PARAMETER.warn(configRules, emitWarn, isFixMode, node.findChildByType(IDENTIFIER)!!.text, + LAMBDA_IS_NOT_LAST_PARAMETER.warn(configRules, emitWarn, node.findChildByType(IDENTIFIER)!!.text, first().node.startOffset, node) } } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/NestedFunctionBlock.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/NestedFunctionBlock.kt index ef8b026a6d..47bf47a140 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/NestedFunctionBlock.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/NestedFunctionBlock.kt @@ -46,7 +46,7 @@ class NestedFunctionBlock(configRules: List) : DiktatRule( ?.count { it.hasChildOfType(LBRACE) } ?: return if (blockParent > maxNestedBlockCount) { - NESTED_BLOCK.warn(configRules, emitWarn, isFixMode, node.findChildByType(IDENTIFIER)?.text ?: node.text, + NESTED_BLOCK.warn(configRules, emitWarn, node.findChildByType(IDENTIFIER)?.text ?: node.text, node.startOffset, node) return } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/OverloadingArgumentsFunction.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/OverloadingArgumentsFunction.kt index b583541e8a..4a0b7c4de2 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/OverloadingArgumentsFunction.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/OverloadingArgumentsFunction.kt @@ -45,7 +45,7 @@ class OverloadingArgumentsFunction(configRules: List) : DiktatRule( .toList() if (allOverloadFunction.isNotEmpty()) { - WRONG_OVERLOADING_FUNCTION_ARGUMENTS.warn(configRules, emitWarn, isFixMode, funPsi.node.findChildByType(IDENTIFIER)!!.text, funPsi.startOffset, funPsi.node) + WRONG_OVERLOADING_FUNCTION_ARGUMENTS.warn(configRules, emitWarn, funPsi.node.findChildByType(IDENTIFIER)!!.text, funPsi.startOffset, funPsi.node) } } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/ParameterNameInOuterLambdaRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/ParameterNameInOuterLambdaRule.kt index d51f5f3461..a79e3cb82c 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/ParameterNameInOuterLambdaRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/ParameterNameInOuterLambdaRule.kt @@ -29,7 +29,7 @@ class ParameterNameInOuterLambdaRule(configRules: List) : DiktatRul .isNotEmpty() if (hasInnerLambda && doesLambdaContainIt(node)) { PARAMETER_NAME_IN_OUTER_LAMBDA.warn( - configRules, emitWarn, isFixMode, + configRules, emitWarn, "lambda without arguments has inner lambda", node.startOffset, node, ) diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/AvoidUtilityClass.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/AvoidUtilityClass.kt index 07849541e2..94dc876355 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/AvoidUtilityClass.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/AvoidUtilityClass.kt @@ -56,7 +56,7 @@ class AvoidUtilityClass(configRules: List) : DiktatRule( ?.filter { it.elementType == FUN } ?.ifEmpty { return } ?: return - AVOID_USING_UTILITY_CLASS.warn(configRules, emitWarn, isFixMode, node.findChildByType(IDENTIFIER)?.text ?: node.text, node.startOffset, node) + AVOID_USING_UTILITY_CLASS.warn(configRules, emitWarn, node.findChildByType(IDENTIFIER)?.text ?: node.text, node.startOffset, node) } companion object { diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/CustomGetterSetterRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/CustomGetterSetterRule.kt index ed74b601ea..52e9afdc0d 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/CustomGetterSetterRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/CustomGetterSetterRule.kt @@ -36,14 +36,14 @@ class CustomGetterSetterRule(configRules: List) : DiktatRule( setter?.let { // only private custom setters are allowed if (!isPrivateSetter) { - CUSTOM_GETTERS_SETTERS.warn(configRules, emitWarn, isFixMode, setter.text, setter.startOffset, node) + CUSTOM_GETTERS_SETTERS.warn(configRules, emitWarn, setter.text, setter.startOffset, node) } } getter?.let { // only override getter are allowed if (!isOverrideGetter) { - CUSTOM_GETTERS_SETTERS.warn(configRules, emitWarn, isFixMode, getter.text, getter.startOffset, node) + CUSTOM_GETTERS_SETTERS.warn(configRules, emitWarn, getter.text, getter.startOffset, node) } } } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/ExtensionFunctionsInFileRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/ExtensionFunctionsInFileRule.kt index 2a3268ca3a..d91b8f9413 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/ExtensionFunctionsInFileRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/ExtensionFunctionsInFileRule.kt @@ -66,7 +66,7 @@ class ExtensionFunctionsInFileRule(configRules: List) : DiktatRule( } private fun fireWarning(node: ASTNode) { - EXTENSION_FUNCTION_WITH_CLASS.warn(configRules, emitWarn, isFixMode, "fun ${(node.psi as KtFunction).name}", node.startOffset, node) + EXTENSION_FUNCTION_WITH_CLASS.warn(configRules, emitWarn, "fun ${(node.psi as KtFunction).name}", node.startOffset, node) } private fun collectAllExtensionFunctionsWithSameClassName(node: ASTNode, classNames: List): List = diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/ExtensionFunctionsSameNameRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/ExtensionFunctionsSameNameRule.kt index ffa7a5cf09..d4a61a6da5 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/ExtensionFunctionsSameNameRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/ExtensionFunctionsSameNameRule.kt @@ -119,7 +119,7 @@ class ExtensionFunctionsSameNameRule(configRules: List) : DiktatRul firstFunc: ExtensionFunction, secondFunc: ExtensionFunction ) { - EXTENSION_FUNCTION_SAME_SIGNATURE.warn(configRules, emitWarn, isFixMode, "$firstFunc and $secondFunc", node.startOffset, node) + EXTENSION_FUNCTION_SAME_SIGNATURE.warn(configRules, emitWarn, "$firstFunc and $secondFunc", node.startOffset, node) } /** diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/ImplicitBackingPropertyRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/ImplicitBackingPropertyRule.kt index 2b7207cd2c..3bf32b79ab 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/ImplicitBackingPropertyRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/ImplicitBackingPropertyRule.kt @@ -105,7 +105,7 @@ class ImplicitBackingPropertyRule(configRules: List) : DiktatRule( } private fun raiseWarning(node: ASTNode, propName: String) { - NO_CORRESPONDING_PROPERTY.warn(configRules, emitWarn, isFixMode, + NO_CORRESPONDING_PROPERTY.warn(configRules, emitWarn, "$propName has no corresponding property with name _$propName", node.startOffset, node) } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/PropertyAccessorFields.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/PropertyAccessorFields.kt index bf0dcccc9d..38cf2f86f9 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/PropertyAccessorFields.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/PropertyAccessorFields.kt @@ -52,7 +52,7 @@ class PropertyAccessorFields(configRules: List) : DiktatRule( ?.none { firstReferenceWithSameName?.isGoingAfter(it) ?: false } ?: true val isNotCallExpression = firstReferenceWithSameName?.treeParent?.treeParent?.elementType != CALL_EXPRESSION if (firstReferenceWithSameName != null && isContainLocalVarSameName && isNotCallExpression && isNotExtensionProperty) { - WRONG_NAME_OF_VARIABLE_INSIDE_ACCESSOR.warn(configRules, emitWarn, isFixMode, node.text, node.startOffset, node) + WRONG_NAME_OF_VARIABLE_INSIDE_ACCESSOR.warn(configRules, emitWarn, node.text, node.startOffset, node) } } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/classes/DataClassesRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/classes/DataClassesRule.kt index fd7b75d84f..4943468a0d 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/classes/DataClassesRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/classes/DataClassesRule.kt @@ -50,7 +50,7 @@ class DataClassesRule(configRules: List) : DiktatRule( // fixme: Need to know types of vars and props to create data class private fun raiseWarn(node: ASTNode) { - USE_DATA_CLASS.warn(configRules, emitWarn, isFixMode, "${(node.psi as KtClass).name}", node.startOffset, node) + USE_DATA_CLASS.warn(configRules, emitWarn, "${(node.psi as KtClass).name}", node.startOffset, node) } @Suppress( diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/classes/InlineClassesRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/classes/InlineClassesRule.kt index 02fb6aafb1..f837d7a968 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/classes/InlineClassesRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter6/classes/InlineClassesRule.kt @@ -50,7 +50,7 @@ class InlineClassesRule(configRules: List) : DiktatRule( ?.getChildren(null) ?.all { it.elementType in goodModifiers } != false) { // Fixme: since it's an experimental feature we shouldn't do fixer - INLINE_CLASS_CAN_BE_USED.warn(configRules, emitWarn, isFixMode, "class ${classPsi.name}", classPsi.node.startOffset, classPsi.node) + INLINE_CLASS_CAN_BE_USED.warn(configRules, emitWarn, "class ${classPsi.name}", classPsi.node.startOffset, classPsi.node) } } From 025005d3a1159a9c872b89b0c4e6dfe08f43d51b Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Mon, 25 Sep 2023 14:57:03 +0300 Subject: [PATCH 2/7] removed typealias --- .../com/saveourtool/diktat/ruleset/constants/Warnings.kt | 4 ---- .../diktat/ruleset/rules/chapter2/comments/CommentsRule.kt | 2 +- .../diktat/ruleset/rules/chapter3/files/NewlinesRule.kt | 3 ++- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/constants/Warnings.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/constants/Warnings.kt index c6bfa567c8..4122043e1a 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/constants/Warnings.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/constants/Warnings.kt @@ -8,10 +8,6 @@ import com.saveourtool.diktat.ruleset.generation.EnumNames import com.saveourtool.diktat.ruleset.utils.isSuppressed import org.jetbrains.kotlin.com.intellij.lang.ASTNode -typealias ListOfList = MutableList> - -typealias ListOfPairs = MutableList> - /** * This class represent individual inspections of diktat code style. * A [Warnings] entry contains rule name, warning message and is used in code check. diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/comments/CommentsRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/comments/CommentsRule.kt index dbec1e6cd8..77644c3599 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/comments/CommentsRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/comments/CommentsRule.kt @@ -1,7 +1,6 @@ package com.saveourtool.diktat.ruleset.rules.chapter2.comments import com.saveourtool.diktat.common.config.rules.RulesConfig -import com.saveourtool.diktat.ruleset.constants.ListOfPairs import com.saveourtool.diktat.ruleset.constants.Warnings.COMMENTED_OUT_CODE import com.saveourtool.diktat.ruleset.rules.DiktatRule import com.saveourtool.diktat.ruleset.utils.findAllDescendantsWithSpecificType @@ -20,6 +19,7 @@ import org.jetbrains.kotlin.psi.KtPsiFactory import org.jetbrains.kotlin.psi.stubs.elements.KtFileElementType import org.jetbrains.kotlin.resolve.ImportPath +private typealias ListOfPairs = MutableList> /** * This rule performs checks if there is any commented code. * No commented out code is allowed, including imports. diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/files/NewlinesRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/files/NewlinesRule.kt index e423d64763..26b3df3d21 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/files/NewlinesRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/files/NewlinesRule.kt @@ -3,7 +3,6 @@ package com.saveourtool.diktat.ruleset.rules.chapter3.files import com.saveourtool.diktat.common.config.rules.RuleConfiguration import com.saveourtool.diktat.common.config.rules.RulesConfig import com.saveourtool.diktat.common.config.rules.getRuleConfig -import com.saveourtool.diktat.ruleset.constants.ListOfList import com.saveourtool.diktat.ruleset.constants.Warnings.COMPLEX_EXPRESSION import com.saveourtool.diktat.ruleset.constants.Warnings.REDUNDANT_SEMICOLON import com.saveourtool.diktat.ruleset.constants.Warnings.WRONG_NEWLINES @@ -104,6 +103,8 @@ import org.jetbrains.kotlin.psi.psiUtil.children import org.jetbrains.kotlin.psi.psiUtil.parents import org.jetbrains.kotlin.psi.psiUtil.siblings +private typealias ListOfList = MutableList> + /** * Rule that checks line break styles. * 1. Prohibits usage of semicolons at the end of line From efcf6c8ee2258b32f39100a7f593b057998ef704 Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Mon, 25 Sep 2023 15:04:02 +0300 Subject: [PATCH 3/7] fixed compile issues --- .../diktat/ruleset/rules/chapter3/LineLength.kt | 8 +++++--- .../diktat/ruleset/rules/chapter4/NullChecksRule.kt | 4 ++-- .../ruleset/rules/chapter5/AvoidNestedFunctionsRule.kt | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/LineLength.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/LineLength.kt index ad8d96597a..2073f53679 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/LineLength.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/LineLength.kt @@ -107,10 +107,12 @@ class LineLength(configRules: List) : DiktatRule( if ((newNode.elementType != TEXT && newNode.elementType != MARKDOWN_INLINE_LINK) || !isKdocValid(newNode)) { positionByOffset = node.treeParent.calculateLineColByOffset() val fixableType = isFixable(newNode, configuration) - LONG_LINE.warnAndFix( - configRules, emitWarn, isFixMode, + LONG_LINE.warnOnlyOrWarnAndFix( + configRules, emitWarn, "max line length ${configuration.lineLength}, but was ${line.length}", - offset + node.startOffset, node, fixableType !is None + offset + node.startOffset, node, + shouldBeAutoCorrected = fixableType !is None, + isFixMode, ) { // we should keep in mind, that in the course of fixing we change the offset val textLenBeforeFix = node.textLength diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter4/NullChecksRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter4/NullChecksRule.kt index 23198c35cd..4a19d0afa5 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter4/NullChecksRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter4/NullChecksRule.kt @@ -287,14 +287,14 @@ class NullChecksRule(configRules: List) : DiktatRule( freeText: String, autofix: () -> Unit ) { - AVOID_NULL_CHECKS.warnAndFix( + AVOID_NULL_CHECKS.warnOnlyOrWarnAndFix( configRules, emitWarn, - isFixMode, freeText, condition.node.startOffset, condition.node, canBeAutoFixed, + isFixMode, ) { autofix() } diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/AvoidNestedFunctionsRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/AvoidNestedFunctionsRule.kt index 532afa4b8e..ee5966abf3 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/AvoidNestedFunctionsRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter5/AvoidNestedFunctionsRule.kt @@ -42,8 +42,8 @@ class AvoidNestedFunctionsRule(configRules: List) : DiktatRule( if (isNestedFunction(node)) { val funcName = node.getFirstChildWithType(IDENTIFIER)!!.text - AVOID_NESTED_FUNCTIONS.warnAndFix(configRules, emitWarn, isFixMode, "fun $funcName", node.startOffset, node, - canBeAutoCorrected = checkFunctionReferences(node)) { + AVOID_NESTED_FUNCTIONS.warnOnlyOrWarnAndFix(configRules, emitWarn, "fun $funcName", node.startOffset, node, + shouldBeAutoCorrected = checkFunctionReferences(node), isFixMode) { // We take last nested function, then add and remove child from bottom to top val lastFunc = node.findAllDescendantsWithSpecificType(FUN).last() val funcSeq = lastFunc From 47a68629229728e27b11aa0031efe293da37fc43 Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Mon, 25 Sep 2023 15:28:25 +0300 Subject: [PATCH 4/7] fixed tests when we don't fix the code --- .../diktat/ruleset/constants/Warnings.kt | 2 +- .../chapter1/IdentifierNamingWarnTest.kt | 20 +++++++++---------- .../ruleset/chapter1/MethodNamingWarnTest.kt | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/constants/Warnings.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/constants/Warnings.kt index 4122043e1a..cba87df812 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/constants/Warnings.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/constants/Warnings.kt @@ -148,7 +148,7 @@ enum class Warnings( // FixMe: change float literal to BigDecimal? Or kotlin equivalent? FLOAT_IN_ACCURATE_CALCULATIONS(false, "4.1.1", "floating-point values shouldn't be used in accurate calculations"), - AVOID_NULL_CHECKS(false, "4.3.3", "Try to avoid explicit null-checks"), + AVOID_NULL_CHECKS(true, "4.3.3", "Try to avoid explicit null-checks"), // ======== chapter 5 ======== TOO_LONG_FUNCTION(false, "5.1.1", "function is too long: split it or make more primitive"), diff --git a/diktat-rules/src/test/kotlin/com/saveourtool/diktat/ruleset/chapter1/IdentifierNamingWarnTest.kt b/diktat-rules/src/test/kotlin/com/saveourtool/diktat/ruleset/chapter1/IdentifierNamingWarnTest.kt index 8a0f75bddb..d32fb24cc7 100644 --- a/diktat-rules/src/test/kotlin/com/saveourtool/diktat/ruleset/chapter1/IdentifierNamingWarnTest.kt +++ b/diktat-rules/src/test/kotlin/com/saveourtool/diktat/ruleset/chapter1/IdentifierNamingWarnTest.kt @@ -83,7 +83,7 @@ class IdentifierNamingWarnTest : LintTestBase(::IdentifierNaming) { """.trimIndent() lintMethod(code, DiktatError( - 3, 15, ruleId, "${GENERIC_NAME.warnText()} ", true) + 3, 15, ruleId, "${GENERIC_NAME.warnText()} ", false) ) } @@ -98,7 +98,7 @@ class IdentifierNamingWarnTest : LintTestBase(::IdentifierNaming) { """.trimIndent() lintMethod(code, DiktatError( - 3, 15, ruleId, "${GENERIC_NAME.warnText()} ", true) + 3, 15, ruleId, "${GENERIC_NAME.warnText()} ", false) ) } @@ -413,10 +413,10 @@ class IdentifierNamingWarnTest : LintTestBase(::IdentifierNaming) { fun ASTNode.empty(): Boolean { } fun empty(): Boolean { } """.trimIndent(), - DiktatError(1, 13, ruleId, "${FUNCTION_BOOLEAN_PREFIX.warnText()} emptyLineAfter", true), - DiktatError(2, 5, ruleId, "${FUNCTION_BOOLEAN_PREFIX.warnText()} emptyLineAfter", true), - DiktatError(3, 13, ruleId, "${FUNCTION_BOOLEAN_PREFIX.warnText()} empty", true), - DiktatError(4, 5, ruleId, "${FUNCTION_BOOLEAN_PREFIX.warnText()} empty", true) + DiktatError(1, 13, ruleId, "${FUNCTION_BOOLEAN_PREFIX.warnText()} emptyLineAfter", false), + DiktatError(2, 5, ruleId, "${FUNCTION_BOOLEAN_PREFIX.warnText()} emptyLineAfter", false), + DiktatError(3, 13, ruleId, "${FUNCTION_BOOLEAN_PREFIX.warnText()} empty", false), + DiktatError(4, 5, ruleId, "${FUNCTION_BOOLEAN_PREFIX.warnText()} empty", false) ) } @@ -656,10 +656,10 @@ class IdentifierNamingWarnTest : LintTestBase(::IdentifierNaming) { interface Test6 """.trimIndent() lintMethod(code, - DiktatError(1, 15, ruleId, "${GENERIC_NAME.warnText()} ", true), - DiktatError(7, 16, ruleId, "${GENERIC_NAME.warnText()} ", true), - DiktatError(8, 16, ruleId, "${GENERIC_NAME.warnText()} ", true), - DiktatError(9, 16, ruleId, "${GENERIC_NAME.warnText()} ", true), + DiktatError(1, 15, ruleId, "${GENERIC_NAME.warnText()} ", false), + DiktatError(7, 16, ruleId, "${GENERIC_NAME.warnText()} ", false), + DiktatError(8, 16, ruleId, "${GENERIC_NAME.warnText()} ", false), + DiktatError(9, 16, ruleId, "${GENERIC_NAME.warnText()} ", false), ) } } diff --git a/diktat-rules/src/test/kotlin/com/saveourtool/diktat/ruleset/chapter1/MethodNamingWarnTest.kt b/diktat-rules/src/test/kotlin/com/saveourtool/diktat/ruleset/chapter1/MethodNamingWarnTest.kt index 24b240947a..48fe61ae82 100644 --- a/diktat-rules/src/test/kotlin/com/saveourtool/diktat/ruleset/chapter1/MethodNamingWarnTest.kt +++ b/diktat-rules/src/test/kotlin/com/saveourtool/diktat/ruleset/chapter1/MethodNamingWarnTest.kt @@ -119,6 +119,6 @@ class MethodNamingWarnTest : LintTestBase(::IdentifierNaming) { return false } """.trimIndent() - lintMethod(code, DiktatError(1, 5, ruleId, "${FUNCTION_BOOLEAN_PREFIX.warnText()} someBooleanCheck", true)) + lintMethod(code, DiktatError(1, 5, ruleId, "${FUNCTION_BOOLEAN_PREFIX.warnText()} someBooleanCheck", false)) } } From 19f7747d0a476c7e033f50effd6267d1dd5f4197 Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Mon, 25 Sep 2023 18:26:01 +0300 Subject: [PATCH 5/7] detektAll --- .../diktat/ruleset/rules/chapter1/IdentifierNaming.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter1/IdentifierNaming.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter1/IdentifierNaming.kt index 5c2c918886..fd2f55ea0f 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter1/IdentifierNaming.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter1/IdentifierNaming.kt @@ -146,6 +146,7 @@ class IdentifierNaming(configRules: List) : DiktatRule( @Suppress( "SAY_NO_TO_VAR", "TOO_LONG_FUNCTION", + "LongMethod", "ComplexMethod", "UnsafeCallOnNullableType", ) From 8c6aba5c18a26619eab665e41fadd4511b1e621e Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Mon, 25 Sep 2023 18:34:23 +0300 Subject: [PATCH 6/7] diktatFix --- .../diktat/ruleset/rules/chapter2/comments/CommentsRule.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/comments/CommentsRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/comments/CommentsRule.kt index 77644c3599..724200869c 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/comments/CommentsRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter2/comments/CommentsRule.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.psi.stubs.elements.KtFileElementType import org.jetbrains.kotlin.resolve.ImportPath private typealias ListOfPairs = MutableList> + /** * This rule performs checks if there is any commented code. * No commented out code is allowed, including imports. From d955137b4698f181f668ed4b85edea4640f0683c Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Tue, 26 Sep 2023 12:07:19 +0300 Subject: [PATCH 7/7] review notes --- info/available-rules.md | 2 +- info/rules-mapping.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/info/available-rules.md b/info/available-rules.md index 1b2fce484a..4cfa76d5bb 100644 --- a/info/available-rules.md +++ b/info/available-rules.md @@ -100,7 +100,7 @@ | 4 | 4.2.2 | TYPE_ALIAS | Check: if the type reference of a property is longer than expected. | yes | typeReferenceLength | - | | | 4 | 4.3.1 | NULLABLE_PROPERTY_TYPE | Check: warns if an immutable property is initialized with null, or if the immutable property can have non-nullable type instead of nullable.
Fix: suggests the initial value instead of null or changes in the immutable property type. | yes | no | - | | 4 | 4.3.2 | GENERIC_VARIABLE_WRONG_DECLARATION | Check: warns if variables of generic types don't have an explicit type declaration.
Fix: fixes only the variables that have a generic declaration on both sides. | yes | no | + | -| 4 | 4.3.3 | AVOID_NULL_CHECKS | Check: warns if the null-check is used explicitly (for example: if (a == null)). | yes | no | Currently, no autofix. | +| 4 | 4.3.3 | AVOID_NULL_CHECKS | Check: warns if the null-check is used explicitly (for example: if (a == null)). | yes | no | Fix if\else conditions on null. | | 5 | 5.1.1 | TOO_LONG_FUNCTION | Check: warns if the length of a function is too long. | no | maxFunctionLength isIncludeHeader | | | 5 | 5.1.2 | NESTED_BLOCK | Warns if a function has more nested blocks than expected. | no | maxNestedBlockQuantit | | | 5 | 5.1.3 | AVOID_NESTED_FUNCTIONS | Check: Warns if there are nested functions.
Fix: declare the function in the outer scope. | yes | no | + | diff --git a/info/rules-mapping.md b/info/rules-mapping.md index 2eb332e678..807f902aa6 100644 --- a/info/rules-mapping.md +++ b/info/rules-mapping.md @@ -98,7 +98,7 @@ | TYPE_ALIAS | [4.2.2](guide/diktat-coding-convention.md#r4.2.2) | no | Variables | | NULLABLE_PROPERTY_TYPE | [4.3.1](guide/diktat-coding-convention.md#r4.3.1) | yes | Variables | | GENERIC_VARIABLE_WRONG_DECLARATION | [4.3.2](guide/diktat-coding-convention.md#r4.3.2) | yes | Variables | -| AVOID_NULL_CHECKS | [4.3.3](guide/diktat-coding-convention.md#r4.3.3) | no | Variables | +| AVOID_NULL_CHECKS | [4.3.3](guide/diktat-coding-convention.md#r4.3.3) | yes | Variables | | TOO_LONG_FUNCTION | [5.1.1](guide/diktat-coding-convention.md#r5.1.1) | no | Functions | | NESTED_BLOCK | [5.1.2](guide/diktat-coding-convention.md#r5.1.2) | no | Functions | | AVOID_NESTED_FUNCTIONS | [5.1.3](guide/diktat-coding-convention.md#r5.1.3) | yes | Functions |