diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/annotationClassMember.kt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/annotationClassMember.kt index 99c7f132257b6bc577787d4c4301b0ddfbb6c88d..4c459a5222177799d5ff19b1a1c84019193fdc83 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/annotationClassMember.kt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/annotationClassMember.kt @@ -1,5 +1,5 @@ annotation class A() { - constructor(s: Nothing?) {} + constructor(s: Nothing?) {} init {} fun foo() {} val bar: Nothing? diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/conflictingOverloads.kt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/conflictingOverloads.kt index 43bd1d7e6565c94920e1224e1de2a38c340c62d4..48bf6e25af2e67c59cfe3b86062f5138b8fb7af5 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/conflictingOverloads.kt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/conflictingOverloads.kt @@ -1,6 +1,6 @@ -fun test(x: Int) {} +fun test(x: Int) {} -fun test(y: Int) {} +fun test(y: Int) {} fun test() {} @@ -17,9 +17,9 @@ fun test(z: Int, c: Char) {} } class B : A { - override fun rest(s: String) {} + override fun rest(s: String) {} - fun rest(s: String) {} + fun rest(s: String) {} fun rest(l: Long) {} @@ -45,11 +45,11 @@ fun kek(t: T) {} fun lol(a: Array) {} fun lol(a: Array) {} -fun mem(t: T) where T : () -> Boolean, T : String {} -fun mem(t: T) where T : String, T : () -> Boolean {} +fun mem(t: T) where T : () -> Boolean, T : String {} +fun mem(t: T) where T : String, T : () -> Boolean {} class M { - companion object {} + companion object {} val Companion = object : Any {} } diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/constructorInInterface.kt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/constructorInInterface.kt index fed72540136aaf39915d6b26855e689ffeb7257c..0431d3a915f803de45741372135c5ed3daa3f204 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/constructorInInterface.kt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/constructorInInterface.kt @@ -1,7 +1,7 @@ -interface A(val s: String) +interface A(val s: String) -interface B constructor(val s: String) +interface B constructor(val s: String) interface C { - constructor(val s: String) {} + constructor(val s: String) {} } diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/cyclicConstructorDelegationCall.kt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/cyclicConstructorDelegationCall.kt index 6af1dea3d24f772c94b838efe95d5b8b0e74241b..3e0bcb593bf3e7680d18af1431ce5529bbdcee02 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/cyclicConstructorDelegationCall.kt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/cyclicConstructorDelegationCall.kt @@ -2,14 +2,14 @@ class B class C class A() { - constructor(a: Int) : this("test") {} - constructor(a: String) : this(10) {} + constructor(a: Int) : this("test") {} + constructor(a: String) : this(10) {} - constructor(a: Boolean) : this('\n') {} - constructor(a: Char) : this(0.0) {} - constructor(a: Double) : this(false) {} + constructor(a: Boolean) : this('\n') {} + constructor(a: Char) : this(0.0) {} + constructor(a: Double) : this(false) {} - constructor(b: B) : this(3.14159265) {} + constructor(b: B) : this(3.14159265) {} constructor(c: C) : this() {} constructor(a: List) : this(C()) {} @@ -17,7 +17,7 @@ class A() { class D { constructor(i: Boolean) {} - constructor(i: Int) : this(3) {} + constructor(i: Int) : this(3) {} } class E { @@ -25,7 +25,7 @@ class E { // selection of the proper constructor // but a type mismatch for the first // argument - constructor(e: T, i: Int) : this(i, 10) {} + constructor(e: T, i: Int) : this(i, 10) {} } class I { @@ -33,7 +33,7 @@ class I { // selection of the proper constructor // but a type mismatch for the first // argument - constructor(e: T, i: Int) : this(i, 10) + constructor(e: T, i: Int) : this(i, 10) } class J { @@ -42,20 +42,20 @@ class J { } class F(s: String) { - constructor(i: Boolean) {} - constructor(i: Int) : this(3) {} + constructor(i: Boolean) {} + constructor(i: Int) : this(3) {} } class G(x: Int) { - constructor() {} + constructor() {} } class H(x: Int) { - constructor() + constructor() } class K(x: Int) { - constructor() : this() {} + constructor() : this() {} } class M { @@ -63,5 +63,5 @@ class M { } class U : M { - constructor() + constructor() } diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/delegationSuperCallInEnumConstructor.kt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/delegationSuperCallInEnumConstructor.kt index de3e2fca1f55aba5a8d7a977dda11dc43d42c421..f647d95b892883063590b543b21e9cb1629be4b4 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/delegationSuperCallInEnumConstructor.kt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/delegationSuperCallInEnumConstructor.kt @@ -1,6 +1,6 @@ enum class A { A(1), B(2), C("test"); - constructor(x: Int) : super() + constructor(x: Int) : super() constructor(t: String) : this(10) } diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/explicitDelegationCallRequired.kt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/explicitDelegationCallRequired.kt index 8a943818747ebe8fd84d7b340e2f3c2edab5791d..89391c3f554bf4b6915df049ffa69cbfb2001acc 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/explicitDelegationCallRequired.kt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/explicitDelegationCallRequired.kt @@ -3,16 +3,16 @@ class A(x: Int) { } class B : A { - constructor() + constructor() constructor(z: String) : this() } class C : A(20) { - constructor() + constructor() constructor(z: String) : this() } class D() : A(20) { - constructor(x: Int) + constructor(x: Int) constructor(z: String) : this() } diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/instanceAccessBeforeSuperCall.kt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/instanceAccessBeforeSuperCall.kt index 5af0cecc5ce981e030be3551a9e5c007404905f3..ecc452d60ca5cb301b036da2c20d99ac99528871 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/instanceAccessBeforeSuperCall.kt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/instanceAccessBeforeSuperCall.kt @@ -7,10 +7,10 @@ class A { class B(other: B = this) class C() { - constructor(x: Int) : this({ + constructor(x: Int) : this({ val a = 10 this - }) {} + }) {} } class D { diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/localEntitytNotAllowed.kt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/localEntitytNotAllowed.kt index 93261d8df5c5e5d3537fcd03a47a58222ac8c4f6..b419ca218d9f05fe2d9d5eea1c75822c510b751f 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/localEntitytNotAllowed.kt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/localEntitytNotAllowed.kt @@ -6,19 +6,19 @@ object A { interface X val a = object : Any() { - object D { + object D { object G interface Z - } + } interface Y } fun b() { - object E { + object E { object F interface M - } + } interface N diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/manyCompanionObjects.kt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/manyCompanionObjects.kt index 0b81df7cd10477534aa2d41c82cb14efab5f2856..56cc10963e72f1f317abe5404761df090d254225 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/manyCompanionObjects.kt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/manyCompanionObjects.kt @@ -1,11 +1,11 @@ class A { - companion object { + companion object { - } + } - companion object { + companion object { - } + } } class B { @@ -13,7 +13,7 @@ class B { } - companion object B { + companion object B { - } + } } diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/sealedSupertype.kt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/sealedSupertype.kt index 63562f91132abf1699577078d01795d888ed00dc..6bd113761970e7c3b49f4468de6cccc33683be57 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/sealedSupertype.kt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/sealedSupertype.kt @@ -28,9 +28,9 @@ sealed class P { class K : P() -object B { +object B { class I : P() -} +} fun test() { class L : P() diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/typeParametersInObject.kt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/typeParametersInObject.kt index 53e38a047bcb0dfd501d8d5718966b6bf228efde..cce8b4d04bce78e51f4b47a22b4f30e66833c230 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/typeParametersInObject.kt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/typeParametersInObject.kt @@ -1,15 +1,15 @@ -object A { - object B -} +object A { + object B +} class N { - companion object { + companion object { - } + } } fun test() { - object M { + object M { - } + } } diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/valOnAnnotationParameter.kt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/valOnAnnotationParameter.kt index 03c8a353964d0d254da9fc2583b5e3a45aa2ae0d..11a2a5ce1a9fb5ad9098d9783725f1743e037743 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/valOnAnnotationParameter.kt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/valOnAnnotationParameter.kt @@ -1,4 +1,4 @@ annotation class A( - var a: Int, + var a: Int, b: String ) diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/localObjects.kt b/compiler/fir/analysis-tests/testData/resolve/expresssions/localObjects.kt index f82f0ba51ded1599a7acf5104bc910a0251a757e..cf10589374f7fa765c89a6f45bf23b5fa9d46257 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/localObjects.kt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/localObjects.kt @@ -12,9 +12,9 @@ fun test() { } b.foo() - object B { + object B { fun foo() {} - } + } B.foo() } diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/ArrayEqualityCanBeReplacedWithEquals.kt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/ArrayEqualityCanBeReplacedWithEquals.kt index 48ee3140b4179b8946e46a2af12bebc2b3f12fa0..1a9b3677c68a9491848639fbc242cb5fec0fcead 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/ArrayEqualityCanBeReplacedWithEquals.kt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/ArrayEqualityCanBeReplacedWithEquals.kt @@ -4,14 +4,14 @@ fun foo(p: Int) { val a = arrayOf(1, 2, 3) val b = arrayOf(3, 2, 1) - if (a == b) { } + if (a == b) { } } fun testsFromIdea() { val a = arrayOf("a") val b = a val c: Any? = null - a == b + a == b a == c - a != b + a != b } diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/CanBeValChecker.kt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/CanBeValChecker.kt index 5265bf5f52c944276d37a31d6dc3e7746a3c8e10..908fed80c3ffd2e18b30fdade43a4e1c85971035 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/CanBeValChecker.kt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/CanBeValChecker.kt @@ -23,7 +23,7 @@ operator fun C.plusAssign(a: Any) {} fun testOperatorAssignment() { val c = C() c += "" - var c1 = C() + var c1 = C() c1 += "" var a = 1 @@ -33,7 +33,7 @@ fun testOperatorAssignment() { fun destructuringDeclaration() { - var (v1, v2) = getPair() + var (v1, v2) = getPair() print(v1) var (v3, v4) = getPair() @@ -49,11 +49,11 @@ fun destructuringDeclaration() { val (a, b, c) = Triple(1, 1, 1) - var (x, y, z) = Triple(1, 1, 1) + var (x, y, z) = Triple(1, 1, 1) } fun stackOverflowBug() { - var a: Int + var a: Int a = 1 for (i in 1..10) print(i) @@ -71,8 +71,8 @@ fun smth(flag: Boolean) { } fun withAnnotation(p: List) { - @Suppress("UNCHECKED_CAST") - var v = p as List + @Suppress("UNCHECKED_CAST") + var v = p as List print(v) } @@ -88,7 +88,7 @@ fun listReceiver(p: List) {} fun withInitializer() { var v1 = 1 var v2 = 2 - var v3 = 3 + var v3 = 3 v1 = 1 v2++ // todo mark this UNUSED_CHANGED_VALUES print(v3) @@ -102,7 +102,7 @@ fun test() { } fun foo() { - var a: Int + var a: Int val bool = true if (bool) a = 4 else a = 42 val b: String @@ -130,7 +130,7 @@ fun assignedTwice(p: Int) { } fun main(args: Array) { - var a: String? + var a: String? val unused = 0 if (args.size == 1) { @@ -153,7 +153,7 @@ fun lambda() { } fun lambdaInitialization() { - var a: Int + var a: Int run { a = 20 @@ -161,7 +161,7 @@ fun lambdaInitialization() { } fun notAssignedWhenNotUsed(p: Int) { - var v: Int + var v: Int if (p > 0) { v = 1 print(v) diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantExplicitTypeChecker.kt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantExplicitTypeChecker.kt index 033dc08beeb000839d31966d602503f4e7802e2e..1639a7f66345fec22c61d41e187c0dd374fb2dfd 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantExplicitTypeChecker.kt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantExplicitTypeChecker.kt @@ -52,7 +52,7 @@ fun foo() { val piFloat: Float = 3.14f val piDouble: Double = 3.14 val charZ: Char = 'z' - var alpha: Int = 0 + var alpha: Int = 0 } fun test(boolean: Boolean) { diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantModalityModifierChecker.kt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantModalityModifierChecker.kt index 0489203b341b074f216e199b9e96c9a015e1c8d3..29ef5c58d94e79c4f44724a978ca152f46b5cbea 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantModalityModifierChecker.kt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantModalityModifierChecker.kt @@ -4,23 +4,23 @@ object O { // Interface interface Interface { - // Questionable cuz compiler reports warning here in FE 1.0 - open val gav: Int - get() = 42 - // Redundant - abstract fun foo() - // error - private final fun bar() + // Questionable cuz compiler reports warning here in FE 1.0 + open val gav: Int + get() = 42 + // Redundant + abstract fun foo() + // error + private final fun bar() - open fun goo() {} - abstract fun tar() + open fun goo() {} + abstract fun tar() - // error - abstract fun too() {} + // error + abstract fun too() {} } interface B { - abstract var bar: Unit - abstract fun foo() + abstract var bar: Unit + abstract fun foo() } interface Foo @@ -35,8 +35,8 @@ expect abstract class AbstractClass : Foo { // Abstract abstract class Base { - // Redundant final - final fun foo() {} + // Redundant final + final fun foo() {} // Abstract abstract fun bar() // Open @@ -44,8 +44,8 @@ abstract class Base { } class FinalDerived : Base() { - // Redundant final - override final fun bar() {} + // Redundant final + override final fun bar() {} // Non-final member in final class override open val gav = 13 } @@ -53,33 +53,33 @@ class FinalDerived : Base() { open class OpenDerived : Base() { // Final override final fun bar() {} - // Redundant open - override open val gav = 13 + // Redundant open + override open val gav = 13 } -// Redundant final -final class Final +// Redundant final +final class Final // Derived interface interface Derived : Interface { - // Redundant - override open fun foo() {} + // Redundant + override open fun foo() {} // error final class Nested } // Derived abstract class abstract class AbstractDerived1(override final val gav: Int) : Interface { - // Redundant - override open fun foo() {} + // Redundant + override open fun foo() {} } // Derived abstract class abstract class AbstractDerived2 : Interface { // Final override final fun foo() {} - // Redundant - override open val gav = 13 + // Redundant + override open val gav = 13 } // Redundant abstract interface abstract interface AbstractInterface -// Redundant final object -final object FinalObject +// Redundant final object +final object FinalObject // Open interface open interface OpenInterface diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantVisibilityModifierChecker.kt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantVisibilityModifierChecker.kt index 9bd5d5fab2b62dd408fe8be81847f2f5abec1f7f..d1ac4a133b3a043a5818eb22be45adac7408c2a3 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantVisibilityModifierChecker.kt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantVisibilityModifierChecker.kt @@ -1,7 +1,7 @@ fun f() { - public var baz = 0 + public var baz = 0 class LocalClass { - internal var foo = 0 + internal var foo = 0 } LocalClass().foo = 1 } @@ -26,10 +26,10 @@ class Foo2< internal inner class B } -public class C { - public val foo: Int = 0 +public class C { + public val foo: Int = 0 - public fun bar() {} + public fun bar() {} } @@ -42,19 +42,19 @@ open class D { } class E : D() { - protected override fun willRemainProtected() { - } + protected override fun willRemainProtected() { + } public override fun willBecomePublic() { } } -enum class F private constructor(val x: Int) { +enum class F private constructor(val x: Int) { FIRST(42) } sealed class G constructor(val y: Int) { - private constructor(): this(42) + private constructor(): this(42) object H : G() } @@ -63,16 +63,16 @@ interface I { fun bar() } -public var baz = 0 +public var baz = 0 open class J { protected val baz = 0 - protected get() = field * 2 + protected get() = field * 2 var baf = 0 - public get() = 1 - public set(value) { + public get() = 1 + public set(value) { field = value - } + } var buf = 0 private get() = 42 diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/BasicTest.kt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/BasicTest.kt index 912b9269c914d3d40eff4f69e6604812a9c0c8b2..e218c599d57af8b6f2d907d220ead004ba86e786 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/BasicTest.kt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/BasicTest.kt @@ -1,7 +1,7 @@ fun goo() { var a = 2 val b = 4 - a = a + 1 + b - a = (a + 1) + a = a + 1 + b + a = (a + 1) a = a * b + 1 } diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/multipleOperators.kt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/multipleOperators.kt index 11f1bca71dea3375a6ba28eb19ced8cbd4ae77cd..9d171517e9c4bfdf89b6fb4d8f82cbe16d73f784 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/multipleOperators.kt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/multipleOperators.kt @@ -1,5 +1,5 @@ fun foo() { var x = 0 - var y = 0 - x = x + y + 5 + var y = 0 + x = x + y + 5 } diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/multipleOperatorsRightSideRepeat.kt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/multipleOperatorsRightSideRepeat.kt index 96977f2be0eb405d1df9db8132918af89cbf5cf9..a93064495f95ba1121e400f42e043999f38b49c9 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/multipleOperatorsRightSideRepeat.kt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/multipleOperatorsRightSideRepeat.kt @@ -1,5 +1,5 @@ fun foo() { var x = 0 - var y = 0 - x = y + x + 5 + var y = 0 + x = y + x + 5 } diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/nonCommutativeRepeat.kt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/nonCommutativeRepeat.kt index dcc6e3c00c310ea28211c4e53b2934edecbb765e..2208ebf69b3bddbf540a4274388d62aaa9472851 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/nonCommutativeRepeat.kt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/nonCommutativeRepeat.kt @@ -1,8 +1,8 @@ fun foo() { var x = 0 - x = x - 1 - 1 + x = x - 1 - 1 - x = x / 1 + x = x / 1 x = 1 / x - x = -1 + x + x = -1 + x } diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/rightSideRepeat.kt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/rightSideRepeat.kt index adde06044e7e4f0abf167e746f2893e6aae664d9..43f50dd8c405fa943d7f03aff736ee876ab2c40f 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/rightSideRepeat.kt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/rightSideRepeat.kt @@ -1,4 +1,4 @@ fun foo() { var x = 0 - x = 1 + x + x = 1 + x } diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/simpleAssign.kt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/simpleAssign.kt index cb9f57e707505c2b3916e04d7cbb4374aaec433d..ba5108a3cc625c8aa55ee0e666156301f12c67ee 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/simpleAssign.kt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/simpleAssign.kt @@ -1,5 +1,5 @@ fun foo() { var y = 0 val x = 0 - y = y + x + y = y + x } diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/validAddition.kt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/validAddition.kt index d77084bd75a6a7c2a9965568b3e5cdd745fbed56..191b05aebd929fe241029c7838992fed8df0f6e5 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/validAddition.kt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/validAddition.kt @@ -1,4 +1,4 @@ fun foo() { var x = 0 - x = x + 1 + x = x + 1 } diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/validSubtraction.kt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/validSubtraction.kt index a474c593fa13d23206d5280e3c5b43ebe5b6c7f5..41407233e65f8beb0dc9853df100c982924b0803 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/validSubtraction.kt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/canBeReplacedWithOperatorAssignment/validSubtraction.kt @@ -1,4 +1,4 @@ fun foo() { var x = 0 - x = x - 1 + x = x - 1 } diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/unused/manyLocalVariables.kt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/unused/manyLocalVariables.kt index d95d419335fb586f170568afaae151be7d3ff56f..dd1e70856920c8d0ff000f3017cd3d636e326262 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/unused/manyLocalVariables.kt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/unused/manyLocalVariables.kt @@ -1,5 +1,5 @@ fun foo() { - var a = 1 + var a = 1 var b = 2 var c = 3 diff --git a/compiler/fir/analysis-tests/testData/resolve/openInInterface.kt b/compiler/fir/analysis-tests/testData/resolve/openInInterface.kt index fdd553a00187a9ede4e5de4da065dacd08e94351..863e2cf7e4ff45e33ee1c57f9f913bb19764c5bf 100644 --- a/compiler/fir/analysis-tests/testData/resolve/openInInterface.kt +++ b/compiler/fir/analysis-tests/testData/resolve/openInInterface.kt @@ -1,12 +1,12 @@ interface Some { - open fun foo() + open fun foo() open fun bar() {} - open val x: Int + open val x: Int open val y = 1 open val z get() = 1 - open var xx: Int + open var xx: Int open var yy = 1 open var zz: Int set(value) { diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/mixingImplicitAndExplicitReceivers.kt b/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/mixingImplicitAndExplicitReceivers.kt index 4220436053edaa832cad13524712b9265e1ba607..9cd0660a7a983288ef70edb3815aa69cf3df5aa0 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/mixingImplicitAndExplicitReceivers.kt +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/mixingImplicitAndExplicitReceivers.kt @@ -1,4 +1,4 @@ -fun takeString(s: String) {} +fun takeString(s: String) {} class Wrapper(val s: String?) { fun withThis() { @@ -11,4 +11,4 @@ class Wrapper(val s: String?) { } } -fun takeString(s: String) {} +fun takeString(s: String) {} diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/assignSafeCall.kt b/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/assignSafeCall.kt index c48cdff0f54c2041fc48710d6bc9d7c13afa353c..8e51020f74a15acfacbc4bfeac1fc9df03e4333d 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/assignSafeCall.kt +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/assignSafeCall.kt @@ -23,11 +23,11 @@ fun test_2(a: A?) { } } -fun test_3(x: Any?) { +fun test_3(x: Any?) { val a = x as? A ?: return a.foo() // Should be OK x.foo() // Should be OK -} +} // ----------------- Unstable ----------------- @@ -53,8 +53,8 @@ fun test_2(a: B?) { } } -fun test_3(x: Any?) { +fun test_3(x: Any?) { val a = x as? B ?: return a.foo() // Should be OK x.foo() // Should be OK -} +} diff --git a/compiler/fir/analysis-tests/testData/resolve/typeAliasWithTypeArguments.kt b/compiler/fir/analysis-tests/testData/resolve/typeAliasWithTypeArguments.kt index 065f97411525b409066a243f67caa3d032f70886..997d46d1aaa9997781f53784dca096c2a940d015 100644 --- a/compiler/fir/analysis-tests/testData/resolve/typeAliasWithTypeArguments.kt +++ b/compiler/fir/analysis-tests/testData/resolve/typeAliasWithTypeArguments.kt @@ -10,10 +10,10 @@ interface C { fun baz() } -interface Inv() { +interface Inv() { fun k(): K fun t(): T -} +} typealias Inv0 = Inv typealias Inv1 = Inv diff --git a/compiler/fir/analysis-tests/testData/resolve/whenElse.kt b/compiler/fir/analysis-tests/testData/resolve/whenElse.kt index e3340f5c0923245bf469dd7917b80eea8ad4859c..831c7f173ab0bc3245e088471e349f646d3fadea 100644 --- a/compiler/fir/analysis-tests/testData/resolve/whenElse.kt +++ b/compiler/fir/analysis-tests/testData/resolve/whenElse.kt @@ -13,7 +13,7 @@ class B() class C(val b : B) fun get(f: Boolean) = if (f) {A.A1} else {""} -fun case2() { +fun case2() { val flag: Any = get(false) //string val l1 = when (flag!!) { // should be NO_ELSE_IN_WHEN @@ -25,9 +25,9 @@ fun get(f: Boolean) = if (f) {A.A1} else {""} A.A1 -> B() A.A2 -> B() } -} +} -fun case2() { +fun case2() { val flag: Any = get(true) //A val l1 = when (flag!!) {// should be NO_ELSE_IN_WHEN @@ -39,7 +39,7 @@ fun get(f: Boolean) = if (f) {A.A1} else {""} A.A1 -> B() A.A2 -> B() } -} +} fun case3() { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt index f0a296ea3ea0f250f0c8b8682ed365888be298ca..f288784a41edea96859dd6b1d48f02326831cb79 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt @@ -20,39 +20,56 @@ import org.jetbrains.kotlin.psi.KtParameter.VAL_VAR_TOKEN_SET object LightTreePositioningStrategies { val DEFAULT = object : LightTreePositioningStrategy() { - override fun mark(node: LighterASTNode, tree: FlyweightCapableTreeStructure): List { + override fun mark( + node: LighterASTNode, + startOffset: Int, + endOffset: Int, + tree: FlyweightCapableTreeStructure + ): List { when (node.tokenType) { KtNodeTypes.OBJECT_DECLARATION -> { val objectKeyword = tree.objectKeyword(node)!! return markRange( from = objectKeyword, to = tree.nameIdentifier(node) ?: objectKeyword, - tree + startOffset, endOffset, tree, node ) } KtNodeTypes.CONSTRUCTOR_DELEGATION_CALL -> { - return SECONDARY_CONSTRUCTOR_DELEGATION_CALL.mark(node, tree) + return SECONDARY_CONSTRUCTOR_DELEGATION_CALL.mark(node, startOffset, endOffset, tree) } } - return super.mark(node, tree) + return super.mark(node, startOffset, endOffset, tree) } } val VAL_OR_VAR_NODE: LightTreePositioningStrategy = object : LightTreePositioningStrategy() { - override fun mark(node: LighterASTNode, tree: FlyweightCapableTreeStructure): List { + override fun mark( + node: LighterASTNode, + startOffset: Int, + endOffset: Int, + tree: FlyweightCapableTreeStructure + ): List { val target = tree.valOrVarKeyword(node) ?: node - return markElement(target, tree) + return markElement(target, startOffset, endOffset, tree, node) } } val SECONDARY_CONSTRUCTOR_DELEGATION_CALL: LightTreePositioningStrategy = object : LightTreePositioningStrategy() { - override fun mark(node: LighterASTNode, tree: FlyweightCapableTreeStructure): List { + override fun mark( + node: LighterASTNode, + startOffset: Int, + endOffset: Int, + tree: FlyweightCapableTreeStructure + ): List { when (node.tokenType) { KtNodeTypes.SECONDARY_CONSTRUCTOR -> { - val valueParameterList = tree.valueParameterList(node) ?: return markElement(node, tree) + val valueParameterList = tree.valueParameterList(node) + ?: return markElement(node, startOffset, endOffset, tree) return markRange( tree.constructorKeyword(node)!!, - tree.lastChild(valueParameterList)!!, tree + tree.lastChild(valueParameterList) ?: valueParameterList, + startOffset, endOffset, tree, node ) } KtNodeTypes.CONSTRUCTOR_DELEGATION_CALL -> { @@ -60,13 +77,14 @@ object LightTreePositioningStrategies { if (delegationReference != null && tree.firstChild(delegationReference) == null) { val constructor = tree.findParentOfType(node, KtNodeTypes.SECONDARY_CONSTRUCTOR)!! val valueParameterList = tree.valueParameterList(constructor) - ?: return markElement(constructor, tree) + ?: return markElement(constructor, startOffset, endOffset, tree, node) return markRange( tree.constructorKeyword(constructor)!!, - tree.lastChild(valueParameterList)!!, tree + tree.lastChild(valueParameterList) ?: valueParameterList, + startOffset, endOffset, tree, node ) } - return markElement(delegationReference ?: node, tree) + return markElement(delegationReference ?: node, startOffset, endOffset, tree, node) } else -> error("unexpected element $node") } @@ -74,7 +92,12 @@ object LightTreePositioningStrategies { } val DECLARATION_NAME: LightTreePositioningStrategy = object : LightTreePositioningStrategy() { - override fun mark(node: LighterASTNode, tree: FlyweightCapableTreeStructure): List { + override fun mark( + node: LighterASTNode, + startOffset: Int, + endOffset: Int, + tree: FlyweightCapableTreeStructure + ): List { val nameIdentifier = tree.nameIdentifier(node) if (nameIdentifier != null) { if (node.tokenType == KtNodeTypes.CLASS || node.tokenType == KtNodeTypes.OBJECT_DECLARATION) { @@ -83,24 +106,31 @@ object LightTreePositioningStrategies { ?: tree.findChildByType(node, TokenSet.create(KtTokens.CLASS_KEYWORD, KtTokens.OBJECT_KEYWORD)) ?: node - return markRange(startElement, nameIdentifier, tree) + return markRange(startElement, nameIdentifier, startOffset, endOffset, tree, node) } - return markElement(nameIdentifier, tree) + return markElement(node, startOffset, endOffset, tree) } if (node.tokenType == KtNodeTypes.FUN) { - return DECLARATION_SIGNATURE.mark(node, tree) + return DECLARATION_SIGNATURE.mark(node, startOffset, endOffset, tree) } - return DEFAULT.mark(node, tree) + return DEFAULT.mark(node, startOffset, endOffset, tree) } } val DECLARATION_SIGNATURE: LightTreePositioningStrategy = object : LightTreePositioningStrategy() { - override fun mark(node: LighterASTNode, tree: FlyweightCapableTreeStructure): List { + override fun mark( + node: LighterASTNode, + startOffset: Int, + endOffset: Int, + tree: FlyweightCapableTreeStructure + ): List { when (node.tokenType) { KtNodeTypes.PRIMARY_CONSTRUCTOR, KtNodeTypes.SECONDARY_CONSTRUCTOR -> { - val begin = tree.constructorKeyword(node) ?: tree.valueParameterList(node) ?: return markElement(node, tree) - val end = tree.valueParameterList(node) ?: tree.constructorKeyword(node) ?: return markElement(node, tree) - return markRange(begin, end, tree) + val begin = tree.constructorKeyword(node) ?: tree.valueParameterList(node) + ?: return markElement(node, startOffset, endOffset, tree) + val end = tree.valueParameterList(node) ?: tree.constructorKeyword(node) + ?: return markElement(node, startOffset, endOffset, tree) + return markRange(begin, end, startOffset, endOffset, tree, node) } KtNodeTypes.FUN, KtNodeTypes.FUNCTION_LITERAL -> { val endOfSignatureElement = @@ -113,11 +143,11 @@ object LightTreePositioningStrategies { ?: tree.valueParameterList(node) ?: node } else node - return markRange(startElement, endOfSignatureElement, tree) + return markRange(startElement, endOfSignatureElement, startOffset, endOffset, tree, node) } KtNodeTypes.PROPERTY -> { val endOfSignatureElement = tree.typeReference(node) ?: tree.nameIdentifier(node) ?: node - return markRange(node, endOfSignatureElement, tree) + return markRange(node, endOfSignatureElement, startOffset, endOffset, tree, node) } KtNodeTypes.PROPERTY_ACCESSOR -> { val endOfSignatureElement = @@ -125,32 +155,38 @@ object LightTreePositioningStrategies { ?: tree.rightParenthesis(node) ?: tree.accessorNamePlaceholder(node) - return markRange(node, endOfSignatureElement, tree) + return markRange(node, endOfSignatureElement, startOffset, endOffset, tree, node) } KtNodeTypes.CLASS -> { - val nameAsDeclaration = tree.nameIdentifier(node) ?: return markElement(node, tree) + val nameAsDeclaration = tree.nameIdentifier(node) + ?: return markElement(node, startOffset, endOffset, tree) val primaryConstructorParameterList = tree.primaryConstructor(node)?.let { constructor -> tree.valueParameterList(constructor) - } ?: return markElement(nameAsDeclaration, tree) - return markRange(nameAsDeclaration, primaryConstructorParameterList, tree) + } ?: return markElement(nameAsDeclaration, startOffset, endOffset, tree, node) + return markRange(nameAsDeclaration, primaryConstructorParameterList, startOffset, endOffset, tree, node) } KtNodeTypes.OBJECT_DECLARATION -> { - return DECLARATION_NAME.mark(node, tree) + return DECLARATION_NAME.mark(node, startOffset, endOffset, tree) } KtNodeTypes.CLASS_INITIALIZER -> { - return markElement(tree.initKeyword(node)!!, tree) + return markElement(tree.initKeyword(node)!!, startOffset, endOffset, tree, node) } } - return super.mark(node, tree) + return super.mark(node, startOffset, endOffset, tree) } } val DECLARATION_SIGNATURE_OR_DEFAULT: LightTreePositioningStrategy = object : LightTreePositioningStrategy() { - override fun mark(node: LighterASTNode, tree: FlyweightCapableTreeStructure): List = + override fun mark( + node: LighterASTNode, + startOffset: Int, + endOffset: Int, + tree: FlyweightCapableTreeStructure + ): List = if (node.isDeclaration) { - DECLARATION_SIGNATURE.mark(node, tree) + DECLARATION_SIGNATURE.mark(node, startOffset, endOffset, tree) } else { - DEFAULT.mark(node, tree) + DEFAULT.mark(node, startOffset, endOffset, tree) } private val LighterASTNode.isDeclaration: Boolean @@ -170,17 +206,29 @@ object LightTreePositioningStrategies { } private class ModifierSetBasedLightTreePositioningStrategy(private val modifierSet: TokenSet) : LightTreePositioningStrategy() { - override fun mark(node: LighterASTNode, tree: FlyweightCapableTreeStructure): List { - tree.findChildByType(node, modifierSet)?.let { return markElement(it, tree) } - tree.nameIdentifier(node)?.let { return markElement(it, tree) } + override fun mark( + node: LighterASTNode, + startOffset: Int, + endOffset: Int, + tree: FlyweightCapableTreeStructure + ): List { + val modifierList = tree.modifierList(node) + if (modifierList != null) { + tree.findChildByType(modifierList, modifierSet)?.let { + return markElement(it, startOffset, endOffset, tree, node) + } + } + tree.nameIdentifier(node)?.let { + return markElement(it, startOffset, endOffset, tree, node) + } return when (node.tokenType) { KtNodeTypes.OBJECT_DECLARATION -> { - markElement(tree.objectKeyword(node)!!, tree) + markElement(tree.objectKeyword(node)!!, startOffset, endOffset, tree, node) } KtNodeTypes.PROPERTY_ACCESSOR -> { - markElement(tree.accessorNamePlaceholder(node), tree) + markElement(tree.accessorNamePlaceholder(node), startOffset, endOffset, tree, node) } - else -> markElement(node, tree) + else -> markElement(node, startOffset, endOffset, tree) } } } @@ -190,8 +238,13 @@ object LightTreePositioningStrategies { val MODALITY_MODIFIER: LightTreePositioningStrategy = ModifierSetBasedLightTreePositioningStrategy(MODALITY_MODIFIERS) val OPERATOR: LightTreePositioningStrategy = object : LightTreePositioningStrategy() { - override fun mark(node: LighterASTNode, tree: FlyweightCapableTreeStructure): List { - return markElement(tree.operationReference(node) ?: node, tree) + override fun mark( + node: LighterASTNode, + startOffset: Int, + endOffset: Int, + tree: FlyweightCapableTreeStructure + ): List { + return markElement(tree.operationReference(node) ?: node, startOffset, endOffset, tree, node) } } } @@ -248,15 +301,17 @@ private fun FlyweightCapableTreeStructure.valueParameterList(nod findChildByType(node, KtNodeTypes.VALUE_PARAMETER_LIST) private fun FlyweightCapableTreeStructure.typeReference(node: LighterASTNode): LighterASTNode? { - val childrenRef = Ref>() + val childrenRef = Ref>() getChildren(node, childrenRef) - return childrenRef.get()?.dropWhile { it.tokenType != KtTokens.COLON }?.firstOrNull { it.tokenType == KtNodeTypes.TYPE_REFERENCE } + return childrenRef.get()?.filterNotNull()?.dropWhile { it.tokenType != KtTokens.COLON }?.firstOrNull { + it.tokenType == KtNodeTypes.TYPE_REFERENCE + } } private fun FlyweightCapableTreeStructure.receiverTypeReference(node: LighterASTNode): LighterASTNode? { - val childrenRef = Ref>() + val childrenRef = Ref>() getChildren(node, childrenRef) - return childrenRef.get()?.firstOrNull { + return childrenRef.get()?.filterNotNull()?.firstOrNull { if (it.tokenType == KtTokens.COLON || it.tokenType == KtTokens.LPAR) return null it.tokenType == KtNodeTypes.TYPE_REFERENCE } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategy.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategy.kt index 5c0db8b0dea88a314617cc555dd7e53f6d7bc0e5..2d76d41016846c01880477569c94afb1e7f1d3c7 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategy.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategy.kt @@ -15,13 +15,13 @@ import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens.WHITE_SPACE open class LightTreePositioningStrategy { - open fun markDiagnostic(diagnostic: FirDiagnostic<*>): List { - val element = diagnostic.element - return mark(element.lighterASTNode, element.treeStructure) - } - - open fun mark(node: LighterASTNode, tree: FlyweightCapableTreeStructure): List { - return markElement(node, tree) + open fun mark( + node: LighterASTNode, + startOffset: Int, + endOffset: Int, + tree: FlyweightCapableTreeStructure + ): List { + return markElement(node, startOffset, endOffset, tree) } open fun isValid(node: LighterASTNode, tree: FlyweightCapableTreeStructure): Boolean { @@ -29,12 +29,30 @@ open class LightTreePositioningStrategy { } } -fun markElement(node: LighterASTNode, tree: FlyweightCapableTreeStructure): List { - return listOf(TextRange(tree.getStartOffset(node), tree.getEndOffset(node))) +fun markElement( + node: LighterASTNode, + startOffset: Int, + endOffset: Int, + tree: FlyweightCapableTreeStructure, + originalNode: LighterASTNode = node, +): List { + if (node === originalNode) return listOf(TextRange(startOffset, endOffset)) + val startDelta = tree.getStartOffset(node) - tree.getStartOffset(originalNode) + val endDelta = tree.getEndOffset(node) - tree.getEndOffset(originalNode) + return listOf(TextRange(startDelta + startOffset, endDelta + endOffset)) } -fun markRange(from: LighterASTNode, to: LighterASTNode, tree: FlyweightCapableTreeStructure): List { - return listOf(TextRange(tree.getStartOffset(from), tree.getEndOffset(to))) +fun markRange( + from: LighterASTNode, + to: LighterASTNode, + startOffset: Int, + endOffset: Int, + tree: FlyweightCapableTreeStructure, + originalNode: LighterASTNode +): List { + val startDelta = tree.getStartOffset(from) - tree.getStartOffset(originalNode) + val endDelta = tree.getEndOffset(to) - tree.getEndOffset(originalNode) + return listOf(TextRange(startDelta + startOffset, endDelta + endOffset)) } private val DOC_AND_COMMENT_TOKENS = setOf( diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategy.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategy.kt index aef575700a909cfc518744b337cf54e4ecc7b3d4..f628d09d93acd6cafe48577510542508fb31b634 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategy.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategy.kt @@ -21,7 +21,7 @@ open class SourceElementPositioningStrategy( @Suppress("UNCHECKED_CAST") return psiStrategy.mark(element.psi as E) } - return lightTreeStrategy.mark(element.lighterASTNode, element.treeStructure) + return lightTreeStrategy.mark(element.lighterASTNode, element.startOffset, element.endOffset, element.treeStructure) } fun isValid(element: FirSourceElement): Boolean { diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticCodeMetaInfo.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticCodeMetaInfo.kt index bfd591e42c811728a7c6ce82c188da149f6df350..cab0787fcd04b2dc126b87ee4fe360e6224a4383 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticCodeMetaInfo.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticCodeMetaInfo.kt @@ -6,14 +6,11 @@ package org.jetbrains.kotlin.test.frontend.fir.handlers import com.intellij.openapi.util.TextRange -import com.intellij.psi.PsiElement import org.jetbrains.kotlin.codeMetaInfo.model.CodeMetaInfo import org.jetbrains.kotlin.codeMetaInfo.renderConfigurations.AbstractCodeMetaInfoRenderConfiguration -import org.jetbrains.kotlin.diagnostics.PositioningStrategy import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDefaultErrorMessages import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderer -import org.jetbrains.kotlin.fir.psi object FirMetaInfoUtils { val renderDiagnosticNoArgs = FirDiagnosticCodeMetaRenderConfiguration().apply { renderParams = false } @@ -24,23 +21,18 @@ class FirDiagnosticCodeMetaInfo( val diagnostic: FirDiagnostic<*>, renderConfiguration: FirDiagnosticCodeMetaRenderConfiguration ) : CodeMetaInfo { - // TODO: this implementation is hacky and doesn't support proper ranges for light tree diagnostics - private val textRangeFromClassicDiagnostic: TextRange? = run { - val psi = diagnostic.element.psi ?: return@run null - - @Suppress("UNCHECKED_CAST") - val positioningStrategy = diagnostic.factory.positioningStrategy.psiStrategy as PositioningStrategy - positioningStrategy.mark(psi).first() + private val textRangeFromClassicDiagnostic: TextRange = run { + diagnostic.factory.positioningStrategy.markDiagnostic(diagnostic).first() } override var renderConfiguration: FirDiagnosticCodeMetaRenderConfiguration = renderConfiguration private set override val start: Int - get() = textRangeFromClassicDiagnostic?.startOffset ?: diagnostic.element.startOffset + get() = textRangeFromClassicDiagnostic.startOffset override val end: Int - get() = textRangeFromClassicDiagnostic?.endOffset ?: diagnostic.element.endOffset + get() = textRangeFromClassicDiagnostic.endOffset override val tag: String get() = renderConfiguration.getTag(this)