Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add wrapper for KtLint rules #17

Open
wants to merge 6 commits into
base: ktlint-0.49.0
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion build-logic/src/main/kotlin/Versions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget

object Versions {

const val DETEKT: String = "1.23.0-RC1"
const val DETEKT: String = "1.23.0-RC2"
const val SNAPSHOT_NAME: String = "main"
val JVM_TARGET: JvmTarget = JvmTarget.JVM_1_8

Expand Down
10 changes: 0 additions & 10 deletions config/detekt/detekt.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,18 +73,10 @@ formatting:
active: 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

Expand Down Expand Up @@ -218,8 +210,6 @@ style:
active: true
excludes: ['**/test/**', '**/*Test.kt', '**/*Spec.kt']
excludeCommentStatements: true
MultilineRawStringIndentation:
active: true
NestedClassesVisibility:
active: true
ObjectLiteralToLambda:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ interface Config {
/**
* Is thrown when loading a configuration results in errors.
*/
class InvalidConfigurationError(throwable: Throwable? = null /* nullable to not break signature */) :
class InvalidConfigurationError(throwable: Throwable? = null) :
RuntimeException(
"Provided configuration file is invalid: Structure must be from type Map<String,Any>!" +
throwable?.let { "\n" + it.message }.orEmpty(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ class CliArgs {
The following @Parameters are used for type resolution. When additional parameters are required the
names should mirror the names found in this file (e.g. "classpath", "language-version", "jvm-target"):
https://github.com/JetBrains/kotlin/blob/master/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt
*/
*/
@Parameter(
names = ["--classpath", "-cp"],
description = "EXPERIMENTAL: Paths where to find user class files and depending jar files. " +
Expand Down
1 change: 0 additions & 1 deletion detekt-core/src/main/resources/deprecation.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ complexity>ComplexMethod=Rule is renamed to `CyclomaticComplexMethod` to disting
complexity>LongParameterList>threshold=Use `functionThreshold` and `constructorThreshold` instead
empty-blocks>EmptyFunctionBlock>ignoreOverriddenFunctions=Use `ignoreOverridden` instead
formatting>Indentation>continuationIndentSize=`continuationIndentSize` is ignored by KtLint and will have no effect
formatting>ParameterListWrapping>indentSize=`indentSize` is ignored by KtLint and will have no effect
formatting>TrailingComma=Rule is split between `TrailingCommaOnCallSite` and `TrailingCommaOnDeclarationSite` now.
naming>BooleanPropertyNaming>ignoreOverridden=This configuration is ignored and will be removed in the future
naming>ConstructorParameterNaming>ignoreOverridden=This configuration is ignored and will be removed in the future
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class AnnotationSuppressorSpec(private val env: KotlinCoreEnvironment) {
inner class AnnotationSuppressorFactory {
@Test
fun `Factory returns null if ignoreAnnotated is not set`() {
val suppressor = annotationSuppressorFactory(buildConfigAware(/* empty */), BindingContext.EMPTY)
val suppressor = annotationSuppressorFactory(buildConfigAware(), BindingContext.EMPTY)

assertThat(suppressor).isNull()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class FunctionSuppressorSpec {
@Test
fun `Factory returns null if ignoreFunction is not set`() {
val suppressor = functionSuppressorFactory(
buildConfigAware(/* empty */),
buildConfigAware(),
BindingContext.EMPTY,
)

Expand Down
8 changes: 1 addition & 7 deletions detekt-formatting/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,7 @@ val extraDepsToPackage: Configuration by configurations.creating

dependencies {
compileOnly(projects.detektApi)
implementation(libs.ktlint.rulesetStandard) {
exclude(group = "org.jetbrains.kotlin")
}
implementation(libs.ktlint.core) {
exclude(group = "org.jetbrains.kotlin")
}
implementation(libs.ktlint.rulesetExperimental) {
implementation(libs.ktlintRulesetStandard) {
exclude(group = "org.jetbrains.kotlin")
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package io.gitlab.arturbosch.detekt.formatting

import com.pinterest.ktlint.core.Rule.VisitorModifier.RunAsLateAsPossible
import com.pinterest.ktlint.core.api.EditorConfigProperties
import com.pinterest.ktlint.core.api.editorconfig.CODE_STYLE_PROPERTY
import com.pinterest.ktlint.core.api.editorconfig.EditorConfigProperty
import com.pinterest.ktlint.rule.engine.core.api.Rule.VisitorModifier.RunAsLateAsPossible
import com.pinterest.ktlint.rule.engine.core.api.editorconfig.CODE_STYLE_PROPERTY
import com.pinterest.ktlint.rule.engine.core.api.editorconfig.EditorConfig
import com.pinterest.ktlint.rule.engine.core.api.editorconfig.EditorConfigProperty
import com.pinterest.ktlint.rule.engine.core.api.editorconfig.INDENT_STYLE_PROPERTY
import io.gitlab.arturbosch.detekt.api.CodeSmell
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.CorrectableCodeSmell
Expand All @@ -24,7 +25,7 @@ import org.jetbrains.kotlin.psi.KtFile
*/
abstract class FormattingRule(config: Config) : Rule(config) {

abstract val wrapping: com.pinterest.ktlint.core.Rule
abstract val wrapping: com.pinterest.ktlint.rule.engine.core.api.Rule

/**
* Should the android style guide be enforced?
Expand Down Expand Up @@ -54,15 +55,19 @@ abstract class FormattingRule(config: Config) : Rule(config) {

open fun overrideEditorConfigProperties(): Map<EditorConfigProperty<*>, String>? = null

private fun computeEditorConfigProperties(): EditorConfigProperties {
private fun computeEditorConfigProperties(): EditorConfig {
val usesEditorConfigProperties = overrideEditorConfigProperties()?.toMutableMap()
?: mutableMapOf()

if (isAndroid) {
usesEditorConfigProperties[CODE_STYLE_PROPERTY] = "android"
usesEditorConfigProperties[CODE_STYLE_PROPERTY] = "android_studio"
} else {
usesEditorConfigProperties[CODE_STYLE_PROPERTY] = "intellij_idea"
}

return buildMap {
usesEditorConfigProperties[INDENT_STYLE_PROPERTY] = "space"

val properties = buildMap {
usesEditorConfigProperties.forEach { (editorConfigProperty, defaultValue) ->
put(
key = editorConfigProperty.type.name,
Expand All @@ -74,6 +79,8 @@ abstract class FormattingRule(config: Config) : Rule(config) {
)
}
}

return EditorConfig(properties)
}

private fun emitFinding(message: String, canBeAutoCorrected: Boolean, node: ASTNode) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,29 +7,38 @@ import io.gitlab.arturbosch.detekt.formatting.wrappers.AnnotationSpacing
import io.gitlab.arturbosch.detekt.formatting.wrappers.ArgumentListWrapping
import io.gitlab.arturbosch.detekt.formatting.wrappers.BlockCommentInitialStarAlignment
import io.gitlab.arturbosch.detekt.formatting.wrappers.ChainWrapping
import io.gitlab.arturbosch.detekt.formatting.wrappers.ClassName
import io.gitlab.arturbosch.detekt.formatting.wrappers.CommentSpacing
import io.gitlab.arturbosch.detekt.formatting.wrappers.CommentWrapping
import io.gitlab.arturbosch.detekt.formatting.wrappers.ContextReceiverMapping
import io.gitlab.arturbosch.detekt.formatting.wrappers.DiscouragedCommentLocation
import io.gitlab.arturbosch.detekt.formatting.wrappers.EnumEntryNameCase
import io.gitlab.arturbosch.detekt.formatting.wrappers.EnumWrapping
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.FunctionName
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.IfElseBracing
import io.gitlab.arturbosch.detekt.formatting.wrappers.IfElseWrapping
import io.gitlab.arturbosch.detekt.formatting.wrappers.ImportOrdering
import io.gitlab.arturbosch.detekt.formatting.wrappers.Indentation
import io.gitlab.arturbosch.detekt.formatting.wrappers.KdocWrapping
import io.gitlab.arturbosch.detekt.formatting.wrappers.MaximumLineLength
import io.gitlab.arturbosch.detekt.formatting.wrappers.ModifierListSpacing
import io.gitlab.arturbosch.detekt.formatting.wrappers.ModifierOrdering
import io.gitlab.arturbosch.detekt.formatting.wrappers.MultiLineIfElse
import io.gitlab.arturbosch.detekt.formatting.wrappers.MultilineExpressionWrapping
import io.gitlab.arturbosch.detekt.formatting.wrappers.NoBlankLineBeforeRbrace
import io.gitlab.arturbosch.detekt.formatting.wrappers.NoBlankLineInList
import io.gitlab.arturbosch.detekt.formatting.wrappers.NoBlankLinesInChainedMethodCalls
import io.gitlab.arturbosch.detekt.formatting.wrappers.NoConsecutiveBlankLines
import io.gitlab.arturbosch.detekt.formatting.wrappers.NoConsecutiveComments
import io.gitlab.arturbosch.detekt.formatting.wrappers.NoEmptyClassBody
import io.gitlab.arturbosch.detekt.formatting.wrappers.NoEmptyFirstLineInClassBody
import io.gitlab.arturbosch.detekt.formatting.wrappers.NoEmptyFirstLineInMethodBlock
import io.gitlab.arturbosch.detekt.formatting.wrappers.NoLineBreakAfterElse
import io.gitlab.arturbosch.detekt.formatting.wrappers.NoLineBreakBeforeAssignment
Expand All @@ -43,6 +52,9 @@ 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.ParameterWrapping
import io.gitlab.arturbosch.detekt.formatting.wrappers.PropertyName
import io.gitlab.arturbosch.detekt.formatting.wrappers.PropertyWrapping
import io.gitlab.arturbosch.detekt.formatting.wrappers.SpacingAroundAngleBrackets
import io.gitlab.arturbosch.detekt.formatting.wrappers.SpacingAroundColon
import io.gitlab.arturbosch.detekt.formatting.wrappers.SpacingAroundComma
Expand All @@ -58,8 +70,10 @@ import io.gitlab.arturbosch.detekt.formatting.wrappers.SpacingBetweenDeclaration
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.StringTemplateIndent
import io.gitlab.arturbosch.detekt.formatting.wrappers.TrailingCommaOnCallSite
import io.gitlab.arturbosch.detekt.formatting.wrappers.TrailingCommaOnDeclarationSite
import io.gitlab.arturbosch.detekt.formatting.wrappers.TryCatchFinallySpacing
import io.gitlab.arturbosch.detekt.formatting.wrappers.TypeArgumentListSpacing
import io.gitlab.arturbosch.detekt.formatting.wrappers.TypeParameterListSpacing
import io.gitlab.arturbosch.detekt.formatting.wrappers.UnnecessaryParenthesesBeforeTrailingLambda
Expand All @@ -79,14 +93,24 @@ class KtLintMultiRule(config: Config = Config.empty) :
AnnotationOnSeparateLine(config),
AnnotationSpacing(config),
ArgumentListWrapping(config),
BlockCommentInitialStarAlignment(config),
ChainWrapping(config),
ClassName(config),
CommentSpacing(config),
CommentWrapping(config),
EnumEntryNameCase(config),
Filename(config),
FinalNewline(config),
FunctionName(config),
FunKeywordSpacing(config),
FunctionReturnTypeSpacing(config),
FunctionStartOfBodySpacing(config),
FunctionTypeReferenceSpacing(config),
ImportOrdering(config),
Indentation(config),
KdocWrapping(config),
MaximumLineLength(config),
ModifierListSpacing(config),
ModifierOrdering(config),
MultiLineIfElse(config),
NoBlankLineBeforeRbrace(config),
Expand All @@ -102,8 +126,12 @@ class KtLintMultiRule(config: Config = Config.empty) :
NoUnitReturn(config),
NoUnusedImports(config),
NoWildcardImports(config),
NullableTypeSpacing(config),
PackageName(config),
ParameterListWrapping(config),
ParameterWrapping(config),
PropertyName(config),
PropertyWrapping(config),
SpacingAroundAngleBrackets(config),
SpacingAroundColon(config),
SpacingAroundComma(config),
Expand All @@ -117,29 +145,29 @@ class KtLintMultiRule(config: Config = Config.empty) :
SpacingAroundUnaryOperator(config),
SpacingBetweenDeclarationsWithAnnotations(config),
SpacingBetweenDeclarationsWithComments(config),
SpacingBetweenFunctionNameAndOpeningParenthesis(config),
StringTemplate(config),
TrailingCommaOnCallSite(config), // in standard ruleset but not enabled by default
TrailingCommaOnDeclarationSite(config), // in standard ruleset but not enabled by default
UnnecessaryParenthesesBeforeTrailingLambda(config),
Wrapping(config),

// Wrappers for ktlint-ruleset-experimental rules. Disabled by default.
BlockCommentInitialStarAlignment(config),
CommentWrapping(config),
ContextReceiverMapping(config),
DiscouragedCommentLocation(config),
FunctionReturnTypeSpacing(config),
FunKeywordSpacing(config),
EnumWrapping(config),
FunctionSignature(config),
FunctionStartOfBodySpacing(config),
FunctionTypeReferenceSpacing(config),
KdocWrapping(config),
ModifierListSpacing(config),
NullableTypeSpacing(config),
IfElseBracing(config),
IfElseWrapping(config),
MultilineExpressionWrapping(config),
NoBlankLineInList(config),
NoConsecutiveComments(config),
NoEmptyFirstLineInClassBody(config),
ParameterListSpacing(config),
SpacingBetweenFunctionNameAndOpeningParenthesis(config),
StringTemplateIndent(config),
TryCatchFinallySpacing(config),
TypeArgumentListSpacing(config),
TypeParameterListSpacing(config),
UnnecessaryParenthesesBeforeTrailingLambda(config),
)

override fun visit(root: KtFile) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package io.gitlab.arturbosch.detekt.formatting.wrappers

import com.pinterest.ktlint.ruleset.standard.AnnotationRule
import com.pinterest.ktlint.rule.engine.core.api.editorconfig.EditorConfigProperty
import com.pinterest.ktlint.rule.engine.core.api.editorconfig.INDENT_SIZE_PROPERTY
import com.pinterest.ktlint.ruleset.standard.rules.AnnotationRule
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.config
import io.gitlab.arturbosch.detekt.api.internal.ActiveByDefault
import io.gitlab.arturbosch.detekt.api.internal.AutoCorrectable
import io.gitlab.arturbosch.detekt.api.internal.Configuration
import io.gitlab.arturbosch.detekt.formatting.FormattingRule

/**
Expand All @@ -15,4 +19,12 @@ class AnnotationOnSeparateLine(config: Config) : FormattingRule(config) {

override val wrapping = AnnotationRule()
override val issue = issueFor("Multiple annotations should be placed on separate lines. ")

@Configuration("indentation size")
private val indentSize by config(4)

override fun overrideEditorConfigProperties(): Map<EditorConfigProperty<*>, String> =
mapOf(
INDENT_SIZE_PROPERTY to indentSize.toString(),
)
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package io.gitlab.arturbosch.detekt.formatting.wrappers

import com.pinterest.ktlint.ruleset.standard.AnnotationSpacingRule
import com.pinterest.ktlint.ruleset.standard.rules.AnnotationSpacingRule
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.internal.ActiveByDefault
import io.gitlab.arturbosch.detekt.api.internal.AutoCorrectable
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package io.gitlab.arturbosch.detekt.formatting.wrappers

import com.pinterest.ktlint.core.api.editorconfig.EditorConfigProperty
import com.pinterest.ktlint.core.api.editorconfig.INDENT_SIZE_PROPERTY
import com.pinterest.ktlint.core.api.editorconfig.MAX_LINE_LENGTH_PROPERTY
import com.pinterest.ktlint.ruleset.standard.ArgumentListWrappingRule
import com.pinterest.ktlint.rule.engine.core.api.editorconfig.EditorConfigProperty
import com.pinterest.ktlint.rule.engine.core.api.editorconfig.INDENT_SIZE_PROPERTY
import com.pinterest.ktlint.rule.engine.core.api.editorconfig.MAX_LINE_LENGTH_PROPERTY
import com.pinterest.ktlint.ruleset.standard.rules.ArgumentListWrappingRule
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.config
import io.gitlab.arturbosch.detekt.api.configWithAndroidVariants
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
package io.gitlab.arturbosch.detekt.formatting.wrappers

import com.pinterest.ktlint.ruleset.experimental.BlockCommentInitialStarAlignmentRule
import com.pinterest.ktlint.ruleset.standard.rules.BlockCommentInitialStarAlignmentRule
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.internal.ActiveByDefault
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/#block-comment-initial-star-alignment) for
* documentation.
*/
@ActiveByDefault(since = "1.23.0")
@AutoCorrectable(since = "1.20.0")
class BlockCommentInitialStarAlignment(config: Config) : FormattingRule(config) {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package io.gitlab.arturbosch.detekt.formatting.wrappers

import com.pinterest.ktlint.ruleset.standard.ChainWrappingRule
import com.pinterest.ktlint.rule.engine.core.api.editorconfig.EditorConfigProperty
import com.pinterest.ktlint.rule.engine.core.api.editorconfig.INDENT_SIZE_PROPERTY
import com.pinterest.ktlint.ruleset.standard.rules.ChainWrappingRule
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.config
import io.gitlab.arturbosch.detekt.api.internal.ActiveByDefault
import io.gitlab.arturbosch.detekt.api.internal.AutoCorrectable
import io.gitlab.arturbosch.detekt.api.internal.Configuration
import io.gitlab.arturbosch.detekt.formatting.FormattingRule

/**
Expand All @@ -15,4 +19,12 @@ class ChainWrapping(config: Config) : FormattingRule(config) {

override val wrapping = ChainWrappingRule()
override val issue = issueFor("Checks if condition chaining is wrapped right")

@Configuration("indentation size")
private val indentSize by config(4)

override fun overrideEditorConfigProperties(): Map<EditorConfigProperty<*>, String> =
mapOf(
INDENT_SIZE_PROPERTY to indentSize.toString(),
)
}