Skip to content

Commit

Permalink
fix: paren-spacing of generic superclass constructor
Browse files Browse the repository at this point in the history
SpacingAroundParensRule wasn't applying in the case of a parameter list following a type argument list as expected in a generic super-class constructor call.
  • Loading branch information
tKe committed Apr 10, 2024
1 parent 26dc96a commit 51c289d
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.pinterest.ktlint.rule.engine.core.api.ElementType.LPAR
import com.pinterest.ktlint.rule.engine.core.api.ElementType.PRIMARY_CONSTRUCTOR
import com.pinterest.ktlint.rule.engine.core.api.ElementType.RPAR
import com.pinterest.ktlint.rule.engine.core.api.ElementType.SUPER_KEYWORD
import com.pinterest.ktlint.rule.engine.core.api.ElementType.TYPE_ARGUMENT_LIST
import com.pinterest.ktlint.rule.engine.core.api.ElementType.VALUE_ARGUMENT_LIST
import com.pinterest.ktlint.rule.engine.core.api.ElementType.VALUE_PARAMETER_LIST
import com.pinterest.ktlint.rule.engine.core.api.RuleId
Expand Down Expand Up @@ -46,7 +47,8 @@ public class SpacingAroundParensRule : StandardRule("paren-spacing") {
node.treeParent?.treeParent?.elementType != FUNCTION_TYPE ||
// Super keyword needs special-casing
prevLeaf.prevLeaf()?.elementType == SUPER_KEYWORD ||
prevLeaf.prevLeaf()?.treeParent?.elementType == PRIMARY_CONSTRUCTOR
prevLeaf.prevLeaf()?.treeParent?.elementType == PRIMARY_CONSTRUCTOR ||
prevLeaf.prevLeaf()?.treeParent?.elementType == TYPE_ARGUMENT_LIST
) &&
(
node.treeParent?.elementType == VALUE_PARAMETER_LIST ||
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,40 @@ class SpacingAroundParensRuleTest {
.isFormattedAs(formattedCode)
}

@Test
fun `Given class with superclass constructor call`() {
val code =
"""
open class Bar(param: String)
class Foo : Bar ("test")
""".trimIndent()
val formattedCode =
"""
open class Bar(param: String)
class Foo : Bar("test")
""".trimIndent()
spacingAroundParensRuleAssertThat(code)
.hasLintViolation(2, 16, "Unexpected spacing before \"(\"")
.isFormattedAs(formattedCode)
}

@Test
fun `Given class with superclass constructor call with type parameter`() {
val code =
"""
open class Bar<T>(param: T)
class Foo : Bar<String> ("test")
""".trimIndent()
val formattedCode =
"""
open class Bar<T>(param: T)
class Foo : Bar<String>("test")
""".trimIndent()
spacingAroundParensRuleAssertThat(code)
.hasLintViolation(2, 24, "Unexpected spacing before \"(\"")
.isFormattedAs(formattedCode)
}

@Test
fun `Given a variable declaration with unexpected spacing around the opening parenthesis of the expression`() {
val code =
Expand Down

0 comments on commit 51c289d

Please sign in to comment.