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

Bump ktlint to version 0.45.1 and implement new rules #4645

Merged
merged 6 commits into from Mar 29, 2022
Merged
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
1 change: 0 additions & 1 deletion detekt-formatting/build.gradle.kts
Expand Up @@ -13,7 +13,6 @@ dependencies {
implementation(libs.ktlint.rulesetExperimental) {
exclude(group = "org.jetbrains.kotlin")
}
implementation(libs.ktlint.microutilsKotlinLoggingJvm)

testImplementation(projects.detektTest)
testImplementation(libs.assertj)
Expand Down

This file was deleted.

@@ -1,6 +1,5 @@
package io.gitlab.arturbosch.detekt.formatting

import com.pinterest.ktlint.core.EditorConfig.Companion.fromMap
import com.pinterest.ktlint.core.KtLint
import com.pinterest.ktlint.core.Rule.VisitorModifier.RunAsLateAsPossible
import com.pinterest.ktlint.core.Rule.VisitorModifier.RunOnRootNodeOnly
Expand Down Expand Up @@ -57,10 +56,7 @@ abstract class FormattingRule(config: Config) : Rule(config) {
root.node.putUserData(KtLint.ANDROID_USER_DATA_KEY, isAndroid)
positionByOffset = KtLintLineColCalculator
.calculateLineColByOffset(KtLintLineColCalculator.normalizeText(root.text))
overrideEditorConfig()?.let { overrides ->
val oldEditorConfig = root.node.getUserData(KtLint.EDITOR_CONFIG_USER_DATA_KEY)
root.node.putUserData(KtLint.EDITOR_CONFIG_USER_DATA_KEY, oldEditorConfig.copy(overrides))
}

val editorConfigProperties = overrideEditorConfigProperties()

if (!editorConfigProperties.isNullOrEmpty()) {
Expand All @@ -78,8 +74,6 @@ abstract class FormattingRule(config: Config) : Rule(config) {
root.node.putUserData(KtLint.FILE_PATH_USER_DATA_KEY, root.name)
}

open fun overrideEditorConfig(): Map<String, Any>? = null

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

fun apply(node: ASTNode) {
Expand All @@ -89,8 +83,14 @@ abstract class FormattingRule(config: Config) : Rule(config) {

// KtLint 0.44.0 is assuming that KtLint.EDITOR_CONFIG_USER_DATA_KEY is available on all the nodes.
// If not, it crashes with a NPE. Here we're patching their behavior.
// This block is deprecated and will be removed in KtLint 0.46. But we have to suppress the
// deprecation warning because the ci runs with -Werror.
@Suppress("DEPRECATION")
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To be honest, I'm not really happy with this solution. Also I wanted to declare the ´overrideEditorConfig()` method as deprecated. But sadly each of deprecation will lead to a warning which is handled as error in the ci pipeline so I was forced to suppress this warning (without this code snippet the build will not succeed).

if (node.getUserData(KtLint.EDITOR_CONFIG_USER_DATA_KEY) == null) {
node.putUserData(KtLint.EDITOR_CONFIG_USER_DATA_KEY, fromMap(emptyMap()))
node.putUserData(
KtLint.EDITOR_CONFIG_USER_DATA_KEY,
com.pinterest.ktlint.core.EditorConfig.Companion.fromMap(emptyMap())
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please keep the import as it was before

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But then I have to suppress the warning over the entire file.
Without, the build will throw a warning like w: .../FormattingRule.kt: (3, 34): 'EditorConfig' is deprecated. Marked for removal ... and the code will probably not be able to build on the ci.
It's not aesthetic but I think @file:Suppress("DEPRECATION") is the more dirty way here.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yup makes sense. Thanks for clarifying 👍

)
}

wrapping.visit(node, autoCorrect) { offset, message, _ ->
Expand Down
Expand Up @@ -6,14 +6,21 @@ import io.gitlab.arturbosch.detekt.api.Rule
import io.gitlab.arturbosch.detekt.formatting.wrappers.AnnotationOnSeparateLine
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.CommentSpacing
import io.gitlab.arturbosch.detekt.formatting.wrappers.CommentWrapping
import io.gitlab.arturbosch.detekt.formatting.wrappers.DiscouragedCommentLocation
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.FunctionTypeReferenceSpacing
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.NoBlankLineBeforeRbrace
Expand Down Expand Up @@ -45,12 +52,14 @@ import io.gitlab.arturbosch.detekt.formatting.wrappers.SpacingBetweenDeclaration
import io.gitlab.arturbosch.detekt.formatting.wrappers.SpacingBetweenDeclarationsWithComments
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.UnnecessaryParenthesesBeforeTrailingLambda
import io.gitlab.arturbosch.detekt.formatting.wrappers.Wrapping
import org.jetbrains.kotlin.com.intellij.lang.ASTNode
import org.jetbrains.kotlin.com.intellij.psi.impl.source.JavaDummyElement
import org.jetbrains.kotlin.com.intellij.psi.impl.source.JavaDummyHolder
import org.jetbrains.kotlin.psi.KtFile
import java.util.LinkedList
import java.util.*

/**
* Runs all KtLint rules.
Expand Down Expand Up @@ -88,12 +97,20 @@ class KtLintMultiRule(config: Config = Config.empty) : MultiRule() {
SpacingAroundParens(config),
SpacingAroundRangeOperator(config),
StringTemplate(config),
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),
FunKeywordSpacing(config),
KdocWrapping(config),
ModifierListSpacing(config),
MultiLineIfElse(config),
NoEmptyFirstLineInMethodBlock(config),
PackageName(config),
Expand All @@ -103,6 +120,7 @@ class KtLintMultiRule(config: Config = Config.empty) : MultiRule() {
SpacingBetweenDeclarationsWithAnnotations(config),
SpacingBetweenDeclarationsWithComments(config),
TrailingComma(config),
TypeArgumentListSpacing(config),
UnnecessaryParenthesesBeforeTrailingLambda(config),
)

Expand Down
@@ -1,18 +1,20 @@
package io.gitlab.arturbosch.detekt.formatting.wrappers

import com.pinterest.ktlint.core.api.DefaultEditorConfigProperties
import com.pinterest.ktlint.core.api.FeatureInAlphaState
import com.pinterest.ktlint.core.api.UsesEditorConfigProperties
import com.pinterest.ktlint.ruleset.experimental.ArgumentListWrappingRule
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
import io.gitlab.arturbosch.detekt.formatting.INDENT_SIZE_KEY
import io.gitlab.arturbosch.detekt.formatting.MAX_LINE_LENGTH_KEY

/**
* See <a href="https://ktlint.github.io">ktlint-website</a> for documentation.
*/
@OptIn(FeatureInAlphaState::class)
@AutoCorrectable(since = "1.0.0")
class ArgumentListWrapping(config: Config) : FormattingRule(config) {

Expand All @@ -25,8 +27,9 @@ class ArgumentListWrapping(config: Config) : FormattingRule(config) {
@Configuration("maximum line length")
private val maxLineLength by configWithAndroidVariants(120, 100)

override fun overrideEditorConfig() = mapOf(
INDENT_SIZE_KEY to indentSize,
MAX_LINE_LENGTH_KEY to maxLineLength
)
override fun overrideEditorConfigProperties(): Map<UsesEditorConfigProperties.EditorConfigProperty<*>, String> =
mapOf(
DefaultEditorConfigProperties.indentSizeProperty to indentSize.toString(),
DefaultEditorConfigProperties.maxLineLengthProperty to maxLineLength.toString()
)
}
@@ -0,0 +1,16 @@
package io.gitlab.arturbosch.detekt.formatting.wrappers

import com.pinterest.ktlint.ruleset.experimental.BlockCommentInitialStarAlignmentRule
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.internal.AutoCorrectable
import io.gitlab.arturbosch.detekt.formatting.FormattingRule

/**
* See <a href="https://ktlint.github.io/#rule-spacing">ktlint-website</a> for documentation.
*/
@AutoCorrectable(since = "1.20.0")
class BlockCommentInitialStarAlignment(config: Config) : FormattingRule(config) {

override val wrapping = BlockCommentInitialStarAlignmentRule()
override val issue = issueFor("Detect the alignment of the initial star in a block comment.")
}
@@ -0,0 +1,30 @@
package io.gitlab.arturbosch.detekt.formatting.wrappers

import com.pinterest.ktlint.core.api.DefaultEditorConfigProperties
import com.pinterest.ktlint.core.api.FeatureInAlphaState
import com.pinterest.ktlint.core.api.UsesEditorConfigProperties
import com.pinterest.ktlint.ruleset.experimental.CommentWrappingRule
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.config
import io.gitlab.arturbosch.detekt.api.internal.AutoCorrectable
import io.gitlab.arturbosch.detekt.api.internal.Configuration
import io.gitlab.arturbosch.detekt.formatting.FormattingRule

/**
* See <a href="https://ktlint.github.io/#rule-indentation">ktlint-website</a> for documentation.
*/
@AutoCorrectable(since = "1.20.0")
class CommentWrapping(config: Config) : FormattingRule(config) {

override val wrapping = CommentWrappingRule()
override val issue = issueFor("Reports mis-indented code")

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

@OptIn(FeatureInAlphaState::class)
override fun overrideEditorConfigProperties(): Map<UsesEditorConfigProperties.EditorConfigProperty<*>, String> =
mapOf(
DefaultEditorConfigProperties.indentSizeProperty to indentSize.toString(),
)
}
@@ -0,0 +1,16 @@
package io.gitlab.arturbosch.detekt.formatting.wrappers

import com.pinterest.ktlint.ruleset.experimental.DiscouragedCommentLocationRule
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.internal.AutoCorrectable
import io.gitlab.arturbosch.detekt.formatting.FormattingRule

/**
* See <a href="https://ktlint.github.io/#rule-spacing">ktlint-website</a> for documentation.
*/
@AutoCorrectable(since = "1.20.0")
class DiscouragedCommentLocation(config: Config) : FormattingRule(config) {

override val wrapping = DiscouragedCommentLocationRule()
override val issue = issueFor("Detect discouraged comment locations.")
}
@@ -1,5 +1,6 @@
package io.gitlab.arturbosch.detekt.formatting.wrappers

import com.pinterest.ktlint.core.api.DefaultEditorConfigProperties
import com.pinterest.ktlint.core.api.FeatureInAlphaState
import com.pinterest.ktlint.core.api.UsesEditorConfigProperties
import com.pinterest.ktlint.ruleset.standard.FinalNewlineRule
Expand All @@ -16,7 +17,6 @@ import io.gitlab.arturbosch.detekt.formatting.FormattingRule
* This rules overlaps with [`style>NewLineAtEndOfFile`](https://detekt.dev/style.html#newlineatendoffile)
* from the standard rules, make sure to enable just one. The pro of this rule is that it can auto-correct the issue.
*/
@OptIn(FeatureInAlphaState::class)
@ActiveByDefault(since = "1.0.0")
@AutoCorrectable(since = "1.0.0")
class FinalNewline(config: Config) : FormattingRule(config) {
Expand All @@ -27,6 +27,7 @@ class FinalNewline(config: Config) : FormattingRule(config) {
@Configuration("report absence or presence of a newline")
private val insertFinalNewLine by config(true)

@OptIn(FeatureInAlphaState::class)
override fun overrideEditorConfigProperties(): Map<UsesEditorConfigProperties.EditorConfigProperty<*>, String> =
mapOf(FinalNewlineRule.insertNewLineProperty to insertFinalNewLine.toString())
mapOf(DefaultEditorConfigProperties.insertNewLineProperty to insertFinalNewLine.toString())
}
@@ -0,0 +1,16 @@
package io.gitlab.arturbosch.detekt.formatting.wrappers

import com.pinterest.ktlint.ruleset.experimental.FunKeywordSpacingRule
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.internal.AutoCorrectable
import io.gitlab.arturbosch.detekt.formatting.FormattingRule

/**
* See <a href="https://ktlint.github.io/#rule-spacing">ktlint-website</a> for documentation.
*/
@AutoCorrectable(since = "1.20.0")
class FunKeywordSpacing(config: Config) : FormattingRule(config) {

override val wrapping = FunKeywordSpacingRule()
override val issue = issueFor("Checks the spacing after the fun keyword.")
}
@@ -0,0 +1,17 @@
package io.gitlab.arturbosch.detekt.formatting.wrappers

import com.pinterest.ktlint.ruleset.experimental.FunctionTypeReferenceSpacingRule
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.internal.AutoCorrectable
import io.gitlab.arturbosch.detekt.formatting.FormattingRule

/**
* See <a href="https://ktlint.github.io/#rule-spacing">ktlint-website</a> for documentation.
*/
@AutoCorrectable(since = "1.20.0")
class FunctionTypeReferenceSpacing(config: Config) : FormattingRule(config) {

override val wrapping = FunctionTypeReferenceSpacingRule()
override val issue =
issueFor("Checks the spacing before and after the angle brackets of a type argument list.")
}
@@ -1,5 +1,8 @@
package io.gitlab.arturbosch.detekt.formatting.wrappers

import com.pinterest.ktlint.core.api.DefaultEditorConfigProperties
import com.pinterest.ktlint.core.api.FeatureInAlphaState
import com.pinterest.ktlint.core.api.UsesEditorConfigProperties
import com.pinterest.ktlint.ruleset.standard.IndentationRule
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.TextLocation
Expand All @@ -8,7 +11,6 @@ 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
import io.gitlab.arturbosch.detekt.formatting.INDENT_SIZE_KEY
import org.jetbrains.kotlin.com.intellij.lang.ASTNode

/**
Expand All @@ -29,9 +31,11 @@ class Indentation(config: Config) : FormattingRule(config) {
@Suppress("UnusedPrivateMember")
private val continuationIndentSize by config(4)

override fun overrideEditorConfig() = mapOf(
INDENT_SIZE_KEY to indentSize,
)
@OptIn(FeatureInAlphaState::class)
override fun overrideEditorConfigProperties(): Map<UsesEditorConfigProperties.EditorConfigProperty<*>, String> =
mapOf(
DefaultEditorConfigProperties.indentSizeProperty to indentSize.toString(),
)

/**
* [wrapping] is working with file's [node] and we don't want to highlight the whole file
Expand Down
@@ -0,0 +1,30 @@
package io.gitlab.arturbosch.detekt.formatting.wrappers

import com.pinterest.ktlint.core.api.DefaultEditorConfigProperties
import com.pinterest.ktlint.core.api.FeatureInAlphaState
import com.pinterest.ktlint.core.api.UsesEditorConfigProperties
import com.pinterest.ktlint.ruleset.experimental.KdocWrappingRule
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.config
import io.gitlab.arturbosch.detekt.api.internal.AutoCorrectable
import io.gitlab.arturbosch.detekt.api.internal.Configuration
import io.gitlab.arturbosch.detekt.formatting.FormattingRule

/**
* See <a href="https://ktlint.github.io/#rule-indentation">ktlint-website</a> for documentation.
*/
@AutoCorrectable(since = "1.20.0")
class KdocWrapping(config: Config) : FormattingRule(config) {

override val wrapping = KdocWrappingRule()
override val issue = issueFor("Reports mis-indented code")

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

@OptIn(FeatureInAlphaState::class)
override fun overrideEditorConfigProperties(): Map<UsesEditorConfigProperties.EditorConfigProperty<*>, String> =
mapOf(
DefaultEditorConfigProperties.indentSizeProperty to indentSize.toString(),
)
}
@@ -1,5 +1,6 @@
package io.gitlab.arturbosch.detekt.formatting.wrappers

import com.pinterest.ktlint.core.api.DefaultEditorConfigProperties
import com.pinterest.ktlint.core.api.FeatureInAlphaState
import com.pinterest.ktlint.core.api.UsesEditorConfigProperties
import com.pinterest.ktlint.ruleset.standard.MaxLineLengthRule
Expand All @@ -9,7 +10,6 @@ import io.gitlab.arturbosch.detekt.api.configWithAndroidVariants
import io.gitlab.arturbosch.detekt.api.internal.ActiveByDefault
import io.gitlab.arturbosch.detekt.api.internal.Configuration
import io.gitlab.arturbosch.detekt.formatting.FormattingRule
import io.gitlab.arturbosch.detekt.formatting.MAX_LINE_LENGTH_KEY

/**
* See <a href="https://ktlint.github.io">ktlint-website</a> for documentation.
Expand All @@ -34,8 +34,9 @@ class MaximumLineLength(config: Config) : FormattingRule(config) {
@Configuration("ignore back ticked identifier")
private val ignoreBackTickedIdentifier by config(false)

override fun overrideEditorConfig() = mapOf(MAX_LINE_LENGTH_KEY to maxLineLength)

override fun overrideEditorConfigProperties(): Map<UsesEditorConfigProperties.EditorConfigProperty<*>, String> =
mapOf(MaxLineLengthRule.ignoreBackTickedIdentifierProperty to ignoreBackTickedIdentifier.toString())
mapOf(
MaxLineLengthRule.ignoreBackTickedIdentifierProperty to ignoreBackTickedIdentifier.toString(),
DefaultEditorConfigProperties.maxLineLengthProperty to maxLineLength.toString(),
)
}