diktat

Strict coding standard for Kotlin and a custom set of rules for detecting code smells, code style issues and bugs

View the Project on GitHub saveourtool/diktat

Chap Standard Rule name Description Fix Config FixMe  
1 1.1.1 CONFUSING_IDENTIFIER_NAMING Check: warns if the identifier has an inappropriate name (see table of rule 1.2 part 6). no no no  
1 1.1.1 BACKTICKS_PROHIBITED Check: warns if backticks (``) are used in the identifier name, except in the case when it is a test method (marked with @Test annotation). no no -  
1 1.1.1 VARIABLE_NAME_INCORRECT Check: warns if a variable name consists of only a single character; the only exceptions are industry-standard fixed names, such as {i, j}.
Fix: No fix is available, since it is the responsibility of a human to choose a meaningful identifier name.
no no Recursively update usages of this class in the projectMake exceptions configurable.  
1 1.1.1 EXCEPTION_SUFFIX Check: warns if a class that extends any Exception class does not have an “Exception” suffix.
Fix: adding the “Exception” suffix to the class name.
yes no Need to add tests for this.  
1 1.1.1 IDENTIFIER_LENGTH Check: identifier length should be in the [2,64] range , except for industry-standard names, such as {i, j} and ‘e’ for catching exceptions.
Fix: Fix: no fix is available, since only a human can choose a meaningful identifier name, depending on the context.
no no May be make this rule configurable (length)  
1 1.1.1 FILE_NAME_INCORRECT Check: warns if a file name does not have a .kt/.kts extension.
Fix: no
no no Extensions should be configurable; it can be autofixed.  
1 1.1.1 GENERIC_NAME Check: warns if the name of a generic type parameter (e.g. T) consists of more than a single capital letter. The capital letter can be followed by numbers, though (e.g. T12).
Fix:
yes no Recursively update usages of this identifier in the project.  
1 1.1.1 VARIABLE_HAS_PREFIX Check: warns if the name of a variable has a Hungarian notation specific prefix (like mVariable or M_VARIABLE), which is considered a bad code style (Android is the only exception).
Fix: none is available, as only a human can choose a meaningful name, depending on a particular context.
no no    
1 1.2.1 PACKAGE_NAME_MISSING Check: warns if a package declaration is missing in the file.
Fix: automatically adds a package directive with the name that starts from the domain name (example - com.huawei) and contains the real directory.
yes no Recursively fix all imports in the project.
Fix the directory where the code is stored.
Make this check isolated from the domain name addition.
 
1 1.2.1 PACKAGE_NAME_INCORRECT_CASE Check: warns if a package name is incorrect (non-lower) case.
Fix: automatically update the case in package name.
yes no Recursively update all imports in the project.  
1 1.2.1 PACKAGE_NAME_INCORRECT_PREFIX Check: warns if a package name does not start with the company’s domain.
Fix: automatically update the prefix in the package name.
yes no Fix the directory where the code is stored.
Recursively update all imports in the project.
 
1 1.2.1 PACKAGE_NAME_INCORRECT_SYMBOLS Check: warns if a package name has incorrect symbols, such as underscore or non-ASCII letters/digits. Exception: underscores that are used for differentiating of keywords in a name.
Fix: no fix currently available; will be suggested later.
no no Add autofix for at least converting underscore to a dot or replacing itFix the directory where the code is stored. Cover autofix with tests.  
1 1.2.1 PACKAGE_NAME_INCORRECT_PATH Check: warns if the path for a file does not match with a package name.
Fix: replacing the incorrect package name with the name constructed from a path to the file.
yes no Make this check isolated from domain name creation. Recursively update all imports in the project. Fix the directory where the code is stored. Add a test mechanism to test checker.  
1 1.2.1 INCORRECT_PACKAGE_SEPARATOR Check: warns if the underscore is incorrectly used in package naming to split name parts.
Fix: fixing all nodes in AST and the package name to remove all underscores.
no no Recursively update usages of this class in the project.  
1 1.3.1 CLASS_NAME_INCORRECT Check: warns if the Class/Enum/Interface name does not match the Pascal case (“([A-Z][a-z0-9]+)+”).
Fix: fixing the case. If it is some fixed case (like Snake or Camel) - with word saving; if not - will restore PascalCase as is.
yes no Recursively update usages of this class in the projectCheck and find the better way of converting the identifier to PascalCaseNeed to add checks using natural language processing and check that the class name contains only nouns.  
1 1.3.1 OBJECT_NAME_INCORRECT Check: warns if the object does not match the Pascal case (“([A-Z][a-z0-9]+)+”).
Fix: fixing the case in the same way as for the classes.
yes no Recursively update usages of this class in the project.  
1 1.3.1 ENUM_VALUE Check: verifies if the enum value is in UPPER_SNAKE_CASE or in PascalCase depending on the configuration. UPPER_SNAKE_CASE is the default configuration, but can be changed by ‘enumStyle’ config.
Fix: automatically converting the enum case to a properly selected case
yes enumStyle: snakeCase, pascalCase Recursively update usages of this identifier in the project.  
1 1.3.1 TYPEALIAS_NAME_INCORRECT_CASE Check: typealias name should be in pascalCase.
Fix:
yes no Recursively update usages of this typealias in the project.  
1 1.4.1 FUNCTION_NAME_INCORRECT_CASE Check: function/method name should be in lowerCamelCase.
Fix:
yes no Recursively update usages of this function in the project.  
1 1.5.1 CONSTANT_UPPERCASE Check: warns if CONSTANT (treated as const val from companion object or class level) is not in UPPER_SNAKE_CASE.
Fix: name is changed to UPPER_SNAKE_CASE.
yes no Recursively update usages of this identifier in the project.  
1 1.6.1 VARIABLE_NAME_INCORRECT_FORMAT Check: warns if the name of a variable is not in lowerCamelCase or contains non-ASCII letters.
Fix: fixing the case format to lowerCamelCase.
  no -  
1 1.6.2 FUNCTION_BOOLEAN_PREFIX Check: functions/methods that return boolean should have a special prefix, such as “is/should/etc.”
Fix:
yes no Recursively update usages of this function in the project. Aggressive fix - what if the new name will not be valid?  
2 2.1.1 MISSING_KDOC_TOP_LEVEL Check: warns at a file level internal or public class or if the function has a missing KDoc.
Fix: no
no no Support extension for setters/getters. Support extension for method “override”.  
2 2.1.1 KDOC_EXTRA_PROPERTY Check: warn if there is a property in KDoc that is not present in the class. no no -  
2 2.1.1 MISSING_KDOC_CLASS_ELEMENTS Check: warns if accessible internal elements (protected, public, internal) in a class are not documented.
Fix: no
no no Maybe exception cases for setters and getters are needed; no sense in adding KDoc to them.  
2 2.1.1 MISSING_KDOC_ON_FUNCTION Check: warns if accessible function doesn’t have KDoc.
Fix: adds KDoc template if it is not empty.
yes no    
2 2.1.1 KDOC_NO_CONSTRUCTOR_PROPERTY Check: warns if there is no property tag inside KDoc before the constructor. yes no    
2 2.1.1 KDOC_NO_CLASS_BODY_PROPERTIES_IN_HEADER Check: warns if the property is declared in a class body but documented with a property tag inside KDoc before the constructor. yes no    
2 2.1.1 KDOC_NO_CONSTRUCTOR_PROPERTY_WITH_COMMENT Check: warns if there is a comment before the property in the constructor. yes no    
2 2.1.1 COMMENTED_BY_KDOC Check: warns if there is a kdoc comment in the code block. yes no replace “/*” to “/  
2 2.1.2 KDOC_WITHOUT_PARAM_TAG Check: warns if an accessible method has parameters and they are not documented in KDoc.
Fix: If accessible method has no KDoc, the KDoc template is added.
yes no Should also make a separate fix, even if there is already some Kdoc in place.  
2 2.1.2 KDOC_WITHOUT_RETURN_TAG Check: warns if the accessible method has an explicit return type. Then it is not documented in KDoc.
Fix: If the accessible method has no KDoc, the KDoc template is added.
yes no Should also make separate fix, even if there is already some Kdoc in place.  
2 2.1.2 KDOC_WITHOUT_THROWS_TAG Check: warns if the accessible method has the throw keyword and it is not documented in KDoc.
Fix: if the accessible method has no KDoc, KDoc template is added.
yes no Should also make separate fix, even if there is already some Kdoc in place.  
2 2.1.3 KDOC_EMPTY_KDOC Check: warns if the KDoc is empty.
Fix: no
no no    
2 2.1.3 KDOC_WRONG_SPACES_AFTER_TAG Check: warns if there is more than one space after the KDoc tag.
Fix: removes redundant spaces.
yes no    
2 2.1.3 KDOC_WRONG_TAGS_ORDER Check: warns if the basic KDoc tags are not ordered properly.
Fix: reorders tags (@receiver, @param, @property, @return, @throws or @exception, @constructor).
yes no Ensure basic tags are at the end of KDoc.  
2 2.1.3 KDOC_NEWLINES_BEFORE_BASIC_TAGS Check: warns if the block of tags (@param, @return, @throws) is not separated from the previous part of KDoc by exactly one empty line.
Fix: adds an empty line or removes a redundant one.
yes no    
2 2.1.3 KDOC_NO_NEWLINES_BETWEEN_BASIC_TAGS Check: if there is a newline of an empty KDoc line (with a leading asterisk) between @param, @return, @throws tags.
Fix: removes the line.
yes no    
2 2.1.3 KDOC_NO_NEWLINE_AFTER_SPECIAL_TAGS Check: warns if special tags @apiNote, @implNote, @implSpec don’t have exactly one empty line after.
Fix: removes redundant lines or adds one.
yes no Handle empty lines without a leading asterisk.  
2 2.1.3 KDOC_NO_DEPRECATED_TAG Check: warns if @deprecated is used in KDoc.
Fix: adds @Deprecated annotation with a message; removes the tag.
yes no The replaceWith field in the annotation can also be filled with a meaningful value.  
2 2.2.1 KDOC_NO_EMPTY_TAGS Check: warns if the KDoc tags have an empty content. no no    
2 2.2.1 KDOC_CONTAINS_DATE_OR_AUTHOR Check: warns if the KDoc header contains the @author tag.
Also warns if the @since tag is present but contains anything but version (e.g.: a date).
no no Detect the author by other patterns (e.g. ‘created by’ etc.)  
2 2.2.1 HEADER_WRONG_FORMAT Checks: warns if there is no newline after the KDoc header.
Fix: adds a newline
yes no Check if the header is on the very top of the file. It is hard to determine when it is not.  
2 2.2.1 HEADER_MISSING_OR_WRONG_COPYRIGHT Checks: copyright exists on top of the file and is properly formatted (as a block comment).
Fix: adds copyright if it is missing and required.
yes isCopyrightMandatory, copyrightText (sets the copyright pattern for your project, you also can use ;@currYear; the key word in your text in aim to indicate the current year, instead of explicitly specifying).    
2 2.2.1 WRONG_COPYRIGHT_YEAR Checks: copyright has a valid year.
Fix: makes the year valid.
yes no -  
2 2.2.1 HEADER_MISSING_IN_NON_SINGLE_CLASS_FILE Check: warns if a file with zero or >1 classes doesn’t have a KDoc header. no no    
2 2.2.1 HEADER_NOT_BEFORE_PACKAGE Check: warns if a KDoc file header is located not before a package directive.
Fix: moves this KDoc
yes no    
2 2.3.1 KDOC_TRIVIAL_KDOC_ON_FUNCTION Check: warns if KDoc contains a single line with words ‘return’, ‘get’ or ‘set’. no no    
2 2.4.1 COMMENT_WHITE_SPACE Check: warns if there is no space between // and comment, and if there is no space between the code and the comment
.Fix: adds a white space.
yes maxSpaces -  
2 2.4.1 WRONG_NEWLINES_AROUND_KDOC Check: warns if there is no new line above and under the comment. Exception on the first comment.
Fix: adds a new line.
yes no -  
2 2.4.1 FIRST_COMMENT_NO_BLANK_LINE Check: warns if there is a new line before the first comment.
Fix: deletes a new line.
yes no -  
2 2.4.1 IF_ELSE_COMMENTS Check: warns if there is a comment outside of the else block.
Fix: adds the comment to the first line in else block.
yes no -  
2 2.4.2 COMMENTED_OUT_CODE Check: warns if the commented code is detected (when uncommented, can be parsed). no no Offset is lost when the joined EOL comments are split again.  
3 3.1.1 FILE_IS_TOO_LONG Check: warns if the file has too many lines.
Fix: no
no maxSize -  
1 3.1.2 FILE_NAME_MATCH_CLASS Check: warns
Fix: no
no no Probably, it can be agressively autofixed.  
3 3.1.2 FILE_CONTAINS_ONLY_COMMENTS Check: warns if the file contains only comments, imports, and package directive. no no -  
3 3.1.2 FILE_INCORRECT_BLOCKS_ORDER Check: warns if the general order of code parts is wrong.
Fix: rearranges parts of code.
yes no handle other elements that could be present before the package directive (other comments).  
3 3.1.2 FILE_NO_BLANK_LINE_BETWEEN_BLOCKS Check: warns if there is not exactly one blank line between the code parts.
Fix: leaves a single empty line.
yes no -  
3 3.1.2 FILE_UNORDERED_IMPORTS Check: warns if the imports are not sorted alphabetically, or there are empty lines among them.
Fix: reorders imports.
yes no -  
3 3.1.2 FILE_WILDCARD_IMPORTS Check: warns if the wildcard imports are used except the cases when they are allowed. no allowedWildcards -  
3 3.1.2 UNUSED_IMPORT Check: warns if an import is not used. no deleteUnusedImport -  
3 3.1.4 WRONG_ORDER_IN_CLASS_LIKE_STRUCTURES Check: warns if the declaration part of a class, such as a code structure (class, interface, etc.) is not in the proper order.
Fix: restores the order according to the code style guide.
yes no -  
3 3.1.4 BLANK_LINE_BETWEEN_PROPERTIES Check: warns if properties with comments are not separated by a blank line.
Fix: fixes the number of blank lines.
yes no -  
3 3.1.4 WRONG_DECLARATIONS_ORDER Check: if the order of enum values or constant properties inside the companion is not correct. yes no -  
3 3.1.5 TOP_LEVEL_ORDER Check: warns if the top level order is incorrect. yes no -  
3 3.2.1 NO_BRACES_IN_CONDITIONALS_AND_LOOPS Check: warns if braces are not used in if, else, when, for, do, and while statements. Exception: single line if statement (ternary operator).
Fix: adds missing braces.
yes no -  
3 3.2.2 BRACES_BLOCK_STRUCTURE_ERROR Check: warns if non-empty code blocks with braces do not follow the K&R style (1TBS or OTBS style). yes openBraceNewline closeBraceNewline -  
3 3.3.1 WRONG_INDENTATION Check: warns if an indentation is incorrect.
Fix: corrects the indentation.

Basic cases are covered currently.
yes extendedIndentOfParameters
alignedParameters
extendedIndentForExpressionBodies
extendedIndentAfterOperators
extendedIndentBeforeDot
indentationSize
-  
3 3.4.1 EMPTY_BLOCK_STRUCTURE_ERROR Check: warns if an empty block exists or if its style is incorrect. yes allowEmptyBlocks styleEmptyBlockWithNewline -  
3 3.5.1 LONG_LINE Check: warns if the length doesn’t exceed the specified length. no lineLength Handle json method in KDoc.  
3 3.6.1 MORE_THAN_ONE_STATEMENT_PER_LINE Check: warns if there is more than one statement per line. yes no -  
3 3.6.2 REDUNDANT_SEMICOLON Check: warns if semicolons are used at the end of a line.
Fix: removes the semicolon.
yes no -  
3 3.6.2 WRONG_NEWLINES Check: warns if line breaks do not follow the code style guide.
Fix: fixes incorrect line breaks.
yes no -  
3 3.6.2 COMPLEX_EXPRESSION Check: warns if a long dot-qualified expression is used in a condition or as an argument. no no -  
3 3.6.2 TRAILING_COMMA Check: warns if a trailing comma is missing. yes valueArgument valueParameter indices whenConditions collectionLiteral typeArgument typeParameter destructuringDeclaration -  
3 3.7.1 TOO_MANY_BLANK_LINES Check: warns if blank lines are used or placed incorrectly.
Fix: removes redundant blank lines.
yes no    
3 3.8.1 WRONG_WHITESPACE Check: warns if the usage of horizontal spaces violates the code style guide.
Fix: fixes incorrect whitespaces.
yes no -  
3 3.8.1 TOO_MANY_CONSECUTIVE_SPACES Check: warns if there are too many consecutive spaces in a line. Exception: in an enum if there is a configured and single eol comment.
Fix: squeezes spaces to 1.
yes maxSpaces saveInitialFormattingForEnums -  
3 3.9.1 ENUMS_SEPARATED Check: warns if an enum structure is incorrect: the enum entries should be separated by a comma and a line break, and the last entry should have a semicolon in the end. yes no Replace variable to enum if it possible.  
3 3.10.2 LOCAL_VARIABLE_EARLY_DECLARATION Check: warns if a local variable is declared not immediately before its usage.
Fix (not implemented yet): moves the variable declaration.
no no add auto fix  
3 3.11.1 WHEN_WITHOUT_ELSE Check: warns if a when statement does not have else in the end.
Fix: adds else when a statement doesn’t have it.
yes no - If a when statement of the enum or sealed type contains all values of the enum, there is no need to have the “else” branch.
3 3.12.1 ANNOTATION_NEW_LINE Check: warns if an annotation is not on a new single line. yes no -  
3 3.14.1 WRONG_MULTIPLE_MODIFIERS_ORDER Check: warns if the multiple modifiers in the sequence are in the wrong order. Value identifier supported in Kotlin 1.5 yes no -  
3 3.14.2 LONG_NUMERICAL_VALUES_SEPARATED Check: warns if the value of the integer or float constant is too big. no maxNumberLength maxBlockLength -  
3 3.14.3 MAGIC_NUMBER Check: warns if there are magic numbers in the code. no ignoreNumbers, ignoreHashCodeFunction, ignorePropertyDeclaration, ignoreLocalVariableDeclaration, ignoreConstantDeclaration, ignoreCompanionObjectPropertyDeclaration, ignoreEnums, ignoreRanges, ignoreExtensionFunctions no  
3 3.15.1 STRING_CONCATENATION Check: warns if the concatenation of strings is used in a single line. yes no -  
3 3.15.2 STRING_TEMPLATE_CURLY_BRACES Check: warns if there are redundant curly braces in the string template.
Fix: deletes the curly braces.
yes no +  
3 3.15.2 STRING_TEMPLATE_QUOTES Check: warns if there are redundant quotes in the string template.
Fix: deletes the quotes and $ symbol.
yes no +  
3 3.16.1 COLLAPSE_IF_STATEMENTS Check: warns if there are redundant nested if-statements, which could be collapsed into a single statement by concatenating their conditions. yes no -  
3 3.16.2 COMPLEX_BOOLEAN_EXPRESSION Check: warns if the boolean expression is complex and can be simplified.
Fix: replaces the boolean expression with a simpler one.
yes no +  
3 3.17.1 CONVENTIONAL_RANGE Check: warns if it is possible to replace the range with until or replace the rangeTo function with a range.
Fix: replace range with until or replace the rangeTo function with a range.
yes no -  
3 3.18.1 DEBUG_PRINT Check: warns if there is a printing to console (assumption that it’s a debug logging). no no -  
4 4.1.1 FLOAT_IN_ACCURATE_CALCULATIONS Checks that floating-point values are not used in the arithmetic expressions.
Fix: no
no no Current implementation detects only floating-point constants.  
4 4.1.3 SAY_NO_TO_VAR Check: warns if the var modifier is used for a local variable (not in a class or at file level), and this var is not used in accumulators. no no no several fixmes related to the search mechanism (VariablesSearch) and fixme for checking reassinment of this var
4 4.2.1 SMART_CAST_NEEDED Check: warns if the casting can be omitted.
Fix: Deletes casting.
yes no -  
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.  
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 +  
5 5.1.4 INVERSE_FUNCTION_PREFERRED Check: Warns if a function call with “!” can be rewritten to the inverse function (!isEmpty() -> isNotEmpty()).
Fix: Rewrites the function call.
yes - -  
5 5.2.1 LAMBDA_IS_NOT_LAST_PARAMETER Checks that the lambda inside function parameters block is not at the end. no no    
5 5.2.2 TOO_MANY_PARAMETERS Check: Warns if a function contains more parameters than allowed. no maxParameterListSize    
5 5.2.3 WRONG_OVERLOADING_FUNCTION_ARGUMENTS Check: Warns if a function has overloading instead of using default arguments. no no    
5 5.2.4 RUN_BLOCKING_INSIDE_ASYNC Check: Warns if the runBlocking is used inside the async block code. no no -  
5 5.2.5 TOO_MANY_LINES_IN_LAMBDA Checks that the long lambda has parameters. no maxLambdaLength    
5 5.2.6 CUSTOM_LABEL Check: Warns if using an unnecessary custom label. no no -  
5 5.2.7 PARAMETER_NAME_IN_OUTER_LAMBDA Check: warns if the outer lambda uses an implicit parameter it. no no -  
6 6.1.1 SINGLE_CONSTRUCTOR_SHOULD_BE_PRIMARY Check: warns if there is only one secondary constructor in a class.
Fix: converts it to a primary constructor.
yes no Support the more complicated logic of the constructor conversion.  
6 6.1.2 USE_DATA_CLASS Check: if the class can be made as a data class. no no yes  
6 6.1.3 EMPTY_PRIMARY_CONSTRUCTOR Check: warns if there is an empty primary constructor. yes no yes  
6 6.1.4 MULTIPLE_INIT_BLOCKS Checks that the classes have only one init block. yes no -  
6 6.1.5 USELESS_SUPERTYPE Checks if the override function can be removed. yes no    
6 6.1.6 CLASS_SHOULD_NOT_BE_ABSTRACT Checks if the abstract class has any abstract method. If not, it warns that the class must not be abstract.
Fix: deletes the abstract modifier.
yes no -  
6 6.1.7 NO_CORRESPONDING_PROPERTY Checks: warns if with using “backing property” scheme, the name of a real and a back property are the same. no no -  
6 6.1.8 CUSTOM_GETTERS_SETTERS Check that no custom getters and setters are used for the properties. no no -  
6 6.1.9 WRONG_NAME_OF_VARIABLE_INSIDE_ACCESSOR Checks if the name of a variable is used in the custom getter or setter. no no    
6 6.1.10 TRIVIAL_ACCESSORS_ARE_NOT_RECOMMENDED Checks if there are trivial getters or setters.
Fix: Delete the trivial getter or setter.
yes no -  
6 6.1.11 COMPACT_OBJECT_INITIALIZATION Checks if the class instantiation can be wrapped in apply for better readability.   no    
6 6.1.12 INLINE_CLASS_CAN_BE_USED Check: warns if the class can be transferred to the inline class. no no yes  
6 6.2.2 EXTENSION_FUNCTION_SAME_SIGNATURE Checks if an extension function has the same signature as another extension function, and their classes are related. no no +  
6 6.2.3 EXTENSION_FUNCTION_WITH_CLASS Check: if the file contains a class, then it can not have extension functions for the same class. no no -  
6 6.2.4 USE_LAST_INDEX Check: change a property length - 1 to the property lastIndex. no no -  
6 6.4.1 AVOID_USING_UTILITY_CLASS Checks if there is a class/object that can be replaced with the extension function. no no -  
6 6.4.2 OBJECT_IS_PREFERRED Check: if class is stateless, then it is preferred to use object. yes no +  
6 6.5.1 RUN_IN_SCRIPT Checks : if the kts script contains other functions except the run code. yes no -