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

Replace KtLintMultiRule #6094

Merged
merged 13 commits into from May 27, 2023
Merged
Expand Up @@ -6,6 +6,82 @@ import io.gitlab.arturbosch.detekt.api.RuleSetProvider
import io.gitlab.arturbosch.detekt.api.internal.ActiveByDefault
import io.gitlab.arturbosch.detekt.api.internal.Configuration
import io.gitlab.arturbosch.detekt.api.internal.ruleSetConfig
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.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
import io.gitlab.arturbosch.detekt.formatting.wrappers.NoMultipleSpaces
import io.gitlab.arturbosch.detekt.formatting.wrappers.NoSemicolons
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.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
import io.gitlab.arturbosch.detekt.formatting.wrappers.SpacingAroundCurly
import io.gitlab.arturbosch.detekt.formatting.wrappers.SpacingAroundDot
import io.gitlab.arturbosch.detekt.formatting.wrappers.SpacingAroundDoubleColon
import io.gitlab.arturbosch.detekt.formatting.wrappers.SpacingAroundKeyword
import io.gitlab.arturbosch.detekt.formatting.wrappers.SpacingAroundOperators
import io.gitlab.arturbosch.detekt.formatting.wrappers.SpacingAroundParens
import io.gitlab.arturbosch.detekt.formatting.wrappers.SpacingAroundRangeOperator
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.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
import io.gitlab.arturbosch.detekt.formatting.wrappers.Wrapping

/**
* This rule set provides wrappers for rules implemented by ktlint - https://ktlint.github.io/.
Expand All @@ -23,7 +99,91 @@ class FormattingProvider : RuleSetProvider {

override val ruleSetId: String = "formatting"

override fun instance(config: Config) = RuleSet(ruleSetId, listOf(KtLintMultiRule(config)))
@Suppress("LongMethod")
override fun instance(config: Config) = RuleSet(
ruleSetId,
listOf(
// Wrappers for ktlint-ruleset-standard rules. Enabled by default.
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),
NoBlankLinesInChainedMethodCalls(config),
NoConsecutiveBlankLines(config),
NoEmptyClassBody(config),
NoEmptyFirstLineInMethodBlock(config),
NoLineBreakAfterElse(config),
NoLineBreakBeforeAssignment(config),
NoMultipleSpaces(config),
NoSemicolons(config),
NoTrailingSpaces(config),
NoUnitReturn(config),
NoUnusedImports(config),
NoWildcardImports(config),
NullableTypeSpacing(config),
PackageName(config),
ParameterListWrapping(config),
ParameterWrapping(config),
PropertyName(config),
PropertyWrapping(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),
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.
ContextReceiverMapping(config),
DiscouragedCommentLocation(config),
EnumWrapping(config),
FunctionSignature(config),
IfElseBracing(config),
IfElseWrapping(config),
MultilineExpressionWrapping(config),
NoBlankLineInList(config),
NoConsecutiveComments(config),
NoEmptyFirstLineInClassBody(config),
ParameterListSpacing(config),
StringTemplateIndent(config),
TryCatchFinallySpacing(config),
TypeArgumentListSpacing(config),
TypeParameterListSpacing(config),
).sortedWith(FormattingRuleComparator)
)

companion object {
@Configuration("if android style guides should be preferred")
Expand Down
@@ -0,0 +1,14 @@
package io.gitlab.arturbosch.detekt.formatting

/**
* This serves as weak heuristic to order the wrapped rules according to their visitor modifiers.
* Currently only RunAsLateAsPossible is supported.
*/
internal object FormattingRuleComparator : Comparator<FormattingRule> {
override fun compare(o1: FormattingRule, o2: FormattingRule): Int {
Copy link
Member

Choose a reason for hiding this comment

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

Ktlint also defines VisitorModifier.RunAfterRule, and we should respect that

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yap, that is described in #5259

Copy link
Member

Choose a reason for hiding this comment

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

😭. Would you mind if I contribute to this PR as well?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I do not mind at all. But I would not want to fix the RunAfterRule issue with this pr or do you see them as strongly connected?

Copy link
Member

Choose a reason for hiding this comment

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

It seems that we agreed that this PR can be merged post 1.23
Let me just open a new PR post the merge of this PR.

if (o1.runAsLateAsPossible == o2.runAsLateAsPossible) {
return 0
}
return if (o1.runAsLateAsPossible) 1 else -1
}
}