diff --git a/config/detekt/detekt.yml b/config/detekt/detekt.yml index 0e0f5133ff6..6a42d4c0313 100644 --- a/config/detekt/detekt.yml +++ b/config/detekt/detekt.yml @@ -71,8 +71,20 @@ formatting: autoCorrect: true Filename: active: false + FunctionReturnTypeSpacing: + active: true + FunctionStartOfBodySpacing: + active: true MaximumLineLength: active: false + NullableTypeSpacing: + active: true + ParameterListSpacing: + active: true + SpacingBetweenFunctionNameAndOpeningParenthesis: + active: true + TypeParameterListSpacing: + active: true naming: ClassNaming: diff --git a/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/KtLintMultiRule.kt b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/KtLintMultiRule.kt index c9dbcaebd32..b003a594357 100644 --- a/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/KtLintMultiRule.kt +++ b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/KtLintMultiRule.kt @@ -14,6 +14,9 @@ import io.gitlab.arturbosch.detekt.formatting.wrappers.EnumEntryNameCase import io.gitlab.arturbosch.detekt.formatting.wrappers.Filename import io.gitlab.arturbosch.detekt.formatting.wrappers.FinalNewline import io.gitlab.arturbosch.detekt.formatting.wrappers.FunKeywordSpacing +import io.gitlab.arturbosch.detekt.formatting.wrappers.FunctionReturnTypeSpacing +import io.gitlab.arturbosch.detekt.formatting.wrappers.FunctionSignature +import io.gitlab.arturbosch.detekt.formatting.wrappers.FunctionStartOfBodySpacing import io.gitlab.arturbosch.detekt.formatting.wrappers.FunctionTypeReferenceSpacing import io.gitlab.arturbosch.detekt.formatting.wrappers.ImportOrdering import io.gitlab.arturbosch.detekt.formatting.wrappers.Indentation @@ -35,7 +38,9 @@ import io.gitlab.arturbosch.detekt.formatting.wrappers.NoTrailingSpaces import io.gitlab.arturbosch.detekt.formatting.wrappers.NoUnitReturn import io.gitlab.arturbosch.detekt.formatting.wrappers.NoUnusedImports import io.gitlab.arturbosch.detekt.formatting.wrappers.NoWildcardImports +import io.gitlab.arturbosch.detekt.formatting.wrappers.NullableTypeSpacing import io.gitlab.arturbosch.detekt.formatting.wrappers.PackageName +import io.gitlab.arturbosch.detekt.formatting.wrappers.ParameterListSpacing import io.gitlab.arturbosch.detekt.formatting.wrappers.ParameterListWrapping import io.gitlab.arturbosch.detekt.formatting.wrappers.SpacingAroundAngleBrackets import io.gitlab.arturbosch.detekt.formatting.wrappers.SpacingAroundColon @@ -50,9 +55,11 @@ import io.gitlab.arturbosch.detekt.formatting.wrappers.SpacingAroundRangeOperato import io.gitlab.arturbosch.detekt.formatting.wrappers.SpacingAroundUnaryOperator import io.gitlab.arturbosch.detekt.formatting.wrappers.SpacingBetweenDeclarationsWithAnnotations import io.gitlab.arturbosch.detekt.formatting.wrappers.SpacingBetweenDeclarationsWithComments +import io.gitlab.arturbosch.detekt.formatting.wrappers.SpacingBetweenFunctionNameAndOpeningParenthesis import io.gitlab.arturbosch.detekt.formatting.wrappers.StringTemplate import io.gitlab.arturbosch.detekt.formatting.wrappers.TrailingComma import io.gitlab.arturbosch.detekt.formatting.wrappers.TypeArgumentListSpacing +import io.gitlab.arturbosch.detekt.formatting.wrappers.TypeParameterListSpacing import io.gitlab.arturbosch.detekt.formatting.wrappers.UnnecessaryParenthesesBeforeTrailingLambda import io.gitlab.arturbosch.detekt.formatting.wrappers.Wrapping import org.jetbrains.kotlin.com.intellij.lang.ASTNode @@ -70,18 +77,24 @@ class KtLintMultiRule(config: Config = Config.empty) : override val rules: List = listOf( // Wrappers for ktlint-ruleset-standard rules. Enabled by default. + AnnotationOnSeparateLine(config), + AnnotationSpacing(config), + ArgumentListWrapping(config), ChainWrapping(config), CommentSpacing(config), + EnumEntryNameCase(config), Filename(config), FinalNewline(config), ImportOrdering(config), Indentation(config), MaximumLineLength(config), ModifierOrdering(config), + MultiLineIfElse(config), NoBlankLineBeforeRbrace(config), NoBlankLinesInChainedMethodCalls(config), NoConsecutiveBlankLines(config), NoEmptyClassBody(config), + NoEmptyFirstLineInMethodBlock(config), NoLineBreakAfterElse(config), NoLineBreakBeforeAssignment(config), NoMultipleSpaces(config), @@ -90,40 +103,41 @@ class KtLintMultiRule(config: Config = Config.empty) : NoUnitReturn(config), NoUnusedImports(config), NoWildcardImports(config), + PackageName(config), ParameterListWrapping(config), + SpacingAroundAngleBrackets(config), SpacingAroundColon(config), SpacingAroundComma(config), SpacingAroundCurly(config), SpacingAroundDot(config), + SpacingAroundDoubleColon(config), SpacingAroundKeyword(config), SpacingAroundOperators(config), SpacingAroundParens(config), SpacingAroundRangeOperator(config), + SpacingAroundUnaryOperator(config), + SpacingBetweenDeclarationsWithAnnotations(config), + SpacingBetweenDeclarationsWithComments(config), StringTemplate(config), + TrailingComma(config), // in standard ruleset but not enabled by default Wrapping(config), // Wrappers for ktlint-ruleset-experimental rules. Disabled by default. - AnnotationOnSeparateLine(config), - AnnotationSpacing(config), - ArgumentListWrapping(config), BlockCommentInitialStarAlignment(config), CommentWrapping(config), DiscouragedCommentLocation(config), - EnumEntryNameCase(config), - FunctionTypeReferenceSpacing(config), + FunctionReturnTypeSpacing(config), FunKeywordSpacing(config), + FunctionSignature(config), + FunctionStartOfBodySpacing(config), + FunctionTypeReferenceSpacing(config), KdocWrapping(config), ModifierListSpacing(config), - MultiLineIfElse(config), - NoEmptyFirstLineInMethodBlock(config), - PackageName(config), - SpacingAroundAngleBrackets(config), - SpacingAroundDoubleColon(config), - SpacingAroundUnaryOperator(config), - SpacingBetweenDeclarationsWithAnnotations(config), - SpacingBetweenDeclarationsWithComments(config), - TrailingComma(config), + NullableTypeSpacing(config), + ParameterListSpacing(config), + SpacingBetweenFunctionNameAndOpeningParenthesis(config), TypeArgumentListSpacing(config), + TypeParameterListSpacing(config), UnnecessaryParenthesesBeforeTrailingLambda(config), ) diff --git a/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/FunctionReturnTypeSpacing.kt b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/FunctionReturnTypeSpacing.kt new file mode 100644 index 00000000000..0f85c9efd94 --- /dev/null +++ b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/FunctionReturnTypeSpacing.kt @@ -0,0 +1,17 @@ +package io.gitlab.arturbosch.detekt.formatting.wrappers + +import com.pinterest.ktlint.ruleset.experimental.FunctionReturnTypeSpacingRule +import io.gitlab.arturbosch.detekt.api.Config +import io.gitlab.arturbosch.detekt.api.internal.AutoCorrectable +import io.gitlab.arturbosch.detekt.formatting.FormattingRule + +/** + * See [ktlint docs](https://pinterest.github.io/ktlint/rules/experimental/#function-return-type-spacing) for + * documentation. + */ +@AutoCorrectable(since = "1.22.0") +class FunctionReturnTypeSpacing(config: Config) : FormattingRule(config) { + + override val wrapping = FunctionReturnTypeSpacingRule() + override val issue = issueFor("Checks the spacing between colon and return type.") +} diff --git a/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/FunctionSignature.kt b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/FunctionSignature.kt new file mode 100644 index 00000000000..5ce2ffc619c --- /dev/null +++ b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/FunctionSignature.kt @@ -0,0 +1,43 @@ +package io.gitlab.arturbosch.detekt.formatting.wrappers + +import com.pinterest.ktlint.core.api.DefaultEditorConfigProperties +import com.pinterest.ktlint.core.api.UsesEditorConfigProperties +import com.pinterest.ktlint.ruleset.experimental.FunctionSignatureRule +import io.gitlab.arturbosch.detekt.api.Config +import io.gitlab.arturbosch.detekt.api.config +import io.gitlab.arturbosch.detekt.api.configWithAndroidVariants +import io.gitlab.arturbosch.detekt.api.internal.AutoCorrectable +import io.gitlab.arturbosch.detekt.api.internal.Configuration +import io.gitlab.arturbosch.detekt.formatting.FormattingRule + +/** + * See [ktlint docs](https://pinterest.github.io/ktlint/rules/experimental/#function-signature) for + * documentation. + */ +@AutoCorrectable(since = "1.22.0") +class FunctionSignature(config: Config) : FormattingRule(config) { + + override val wrapping = FunctionSignatureRule() + override val issue = issueFor("Format signature to be single when possible, multiple lines otherwise.") + + @Configuration("parameter count means multiline threshold") + private val forceMultilineWhenParameterCountGreaterOrEqualThan by config(2_147_483_647) + + @Configuration("indentation size") + private val functionBodyExpressionWrapping by config("default") + + @Configuration("maximum line length") + private val maxLineLength by configWithAndroidVariants(120, 100) + + @Configuration("indentation size") + private val indentSize by config(4) + + override fun overrideEditorConfigProperties(): Map, String> = + mapOf( + FunctionSignatureRule.forceMultilineWhenParameterCountGreaterOrEqualThanProperty to + forceMultilineWhenParameterCountGreaterOrEqualThan.toString(), + FunctionSignatureRule.functionBodyExpressionWrappingProperty to functionBodyExpressionWrapping, + DefaultEditorConfigProperties.maxLineLengthProperty to maxLineLength.toString(), + DefaultEditorConfigProperties.indentSizeProperty to indentSize.toString(), + ) +} diff --git a/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/FunctionStartOfBodySpacing.kt b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/FunctionStartOfBodySpacing.kt new file mode 100644 index 00000000000..9aa3148c8e8 --- /dev/null +++ b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/FunctionStartOfBodySpacing.kt @@ -0,0 +1,17 @@ +package io.gitlab.arturbosch.detekt.formatting.wrappers + +import com.pinterest.ktlint.ruleset.experimental.FunctionStartOfBodySpacingRule +import io.gitlab.arturbosch.detekt.api.Config +import io.gitlab.arturbosch.detekt.api.internal.AutoCorrectable +import io.gitlab.arturbosch.detekt.formatting.FormattingRule + +/** + * See [ktlint docs](https://pinterest.github.io/ktlint/rules/experimental/#function-start-of-body-spacing) for + * documentation. + */ +@AutoCorrectable(since = "1.22.0") +class FunctionStartOfBodySpacing(config: Config) : FormattingRule(config) { + + override val wrapping = FunctionStartOfBodySpacingRule() + override val issue = issueFor("Check for consistent spacing before start of function body.") +} diff --git a/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/NullableTypeSpacing.kt b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/NullableTypeSpacing.kt new file mode 100644 index 00000000000..0f213b76779 --- /dev/null +++ b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/NullableTypeSpacing.kt @@ -0,0 +1,17 @@ +package io.gitlab.arturbosch.detekt.formatting.wrappers + +import com.pinterest.ktlint.ruleset.experimental.NullableTypeSpacingRule +import io.gitlab.arturbosch.detekt.api.Config +import io.gitlab.arturbosch.detekt.api.internal.AutoCorrectable +import io.gitlab.arturbosch.detekt.formatting.FormattingRule + +/** + * See [ktlint docs](https://pinterest.github.io/ktlint/rules/experimental/#nullable-type-spacing) for + * documentation. + */ +@AutoCorrectable(since = "1.22.0") +class NullableTypeSpacing(config: Config) : FormattingRule(config) { + + override val wrapping = NullableTypeSpacingRule() + override val issue = issueFor("Ensure no spaces in nullable type.") +} diff --git a/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/ParameterListSpacing.kt b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/ParameterListSpacing.kt new file mode 100644 index 00000000000..790729e23e9 --- /dev/null +++ b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/ParameterListSpacing.kt @@ -0,0 +1,17 @@ +package io.gitlab.arturbosch.detekt.formatting.wrappers + +import com.pinterest.ktlint.ruleset.experimental.ParameterListSpacingRule +import io.gitlab.arturbosch.detekt.api.Config +import io.gitlab.arturbosch.detekt.api.internal.AutoCorrectable +import io.gitlab.arturbosch.detekt.formatting.FormattingRule + +/** + * See [ktlint docs](https://pinterest.github.io/ktlint/rules/experimental/#parameter-list-spacing) for + * documentation. + */ +@AutoCorrectable(since = "1.22.0") +class ParameterListSpacing(config: Config) : FormattingRule(config) { + + override val wrapping = ParameterListSpacingRule() + override val issue = issueFor("Ensure consistent spacing inside the parameter list.") +} diff --git a/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/SpacingBetweenFunctionNameAndOpeningParenthesis.kt b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/SpacingBetweenFunctionNameAndOpeningParenthesis.kt new file mode 100644 index 00000000000..b4168bb5145 --- /dev/null +++ b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/SpacingBetweenFunctionNameAndOpeningParenthesis.kt @@ -0,0 +1,17 @@ +package io.gitlab.arturbosch.detekt.formatting.wrappers + +import com.pinterest.ktlint.ruleset.experimental.SpacingBetweenFunctionNameAndOpeningParenthesisRule +import io.gitlab.arturbosch.detekt.api.Config +import io.gitlab.arturbosch.detekt.api.internal.AutoCorrectable +import io.gitlab.arturbosch.detekt.formatting.FormattingRule + +/** + * See [ktlint docs](https://pinterest.github.io/ktlint/rules/experimental/#spacing-between-function-name-and-opening-parenthesis) for + * documentation. + */ +@AutoCorrectable(since = "1.22.0") +class SpacingBetweenFunctionNameAndOpeningParenthesis(config: Config) : FormattingRule(config) { + + override val wrapping = SpacingBetweenFunctionNameAndOpeningParenthesisRule() + override val issue = issueFor("Ensure consistent spacing between function name and opening parenthesis.") +} diff --git a/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/TypeParameterListSpacing.kt b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/TypeParameterListSpacing.kt new file mode 100644 index 00000000000..fec09926104 --- /dev/null +++ b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/TypeParameterListSpacing.kt @@ -0,0 +1,17 @@ +package io.gitlab.arturbosch.detekt.formatting.wrappers + +import com.pinterest.ktlint.ruleset.experimental.TypeParameterListSpacingRule +import io.gitlab.arturbosch.detekt.api.Config +import io.gitlab.arturbosch.detekt.api.internal.AutoCorrectable +import io.gitlab.arturbosch.detekt.formatting.FormattingRule + +/** + * See [ktlint docs](https://pinterest.github.io/ktlint/rules/experimental/#type-parameter-list-spacing) for + * documentation. + */ +@AutoCorrectable(since = "1.22.0") +class TypeParameterListSpacing(config: Config) : FormattingRule(config) { + + override val wrapping = TypeParameterListSpacingRule() + override val issue = issueFor("Check spacing after a type parameter list in function and class declarations.") +} diff --git a/detekt-formatting/src/main/resources/config/config.yml b/detekt-formatting/src/main/resources/config/config.yml index 8a620c0ecdf..340a53c90dc 100644 --- a/detekt-formatting/src/main/resources/config/config.yml +++ b/detekt-formatting/src/main/resources/config/config.yml @@ -41,6 +41,19 @@ formatting: FunKeywordSpacing: active: false autoCorrect: true + FunctionReturnTypeSpacing: + active: false + autoCorrect: true + FunctionSignature: + active: false + autoCorrect: true + forceMultilineWhenParameterCountGreaterOrEqualThan: 2147483647 + functionBodyExpressionWrapping: 'default' + maxLineLength: 120 + indentSize: 4 + FunctionStartOfBodySpacing: + active: false + autoCorrect: true FunctionTypeReferenceSpacing: active: false autoCorrect: true @@ -108,9 +121,15 @@ formatting: NoWildcardImports: active: true packagesToUseImportOnDemandProperty: 'java.util.*,kotlinx.android.synthetic.**' + NullableTypeSpacing: + active: false + autoCorrect: true PackageName: active: true autoCorrect: true + ParameterListSpacing: + active: false + autoCorrect: true ParameterListWrapping: active: true autoCorrect: true @@ -154,6 +173,9 @@ formatting: SpacingBetweenDeclarationsWithComments: active: true autoCorrect: true + SpacingBetweenFunctionNameAndOpeningParenthesis: + active: false + autoCorrect: true StringTemplate: active: true autoCorrect: true @@ -165,6 +187,9 @@ formatting: TypeArgumentListSpacing: active: false autoCorrect: true + TypeParameterListSpacing: + active: false + autoCorrect: true UnnecessaryParenthesesBeforeTrailingLambda: active: false autoCorrect: true