From ec80c21fd118667fdb2e851da7eea5d76d95eb52 Mon Sep 17 00:00:00 2001 From: Igor Yakovlev Date: Tue, 15 Jun 2021 19:05:25 +0200 Subject: [PATCH] [FIR IDE] Fix lazy resolve for local declarations --- .../resolve/cfg/localClassesWithImplicit.dot | 16 +++---- .../cfg/localClassesWithImplicit.fir.txt | 8 ++-- .../CallBasedInExpressionGenerator.fir.txt | 4 +- .../expresssions/localImplicitBodies.fir.txt | 4 +- .../resolve/expresssions/localObjects.fir.txt | 2 +- .../resolve/expresssions/localScopes.fir.txt | 8 ++-- .../expresssions/localWithBooleanNot.fir.txt | 4 +- .../expresssions/privateVisibility.fir.txt | 8 ++-- ...RedundantVisibilityModifierChecker.fir.txt | 2 +- .../callableReferenceToLocalClass.fir.txt | 2 +- .../implicitInLocalClasses.fir.txt | 26 +++++------ .../testData/resolve/objectInnerClass.fir.txt | 44 +++++++++---------- .../bad/callsInPlace/inAnonymousObject.dot | 4 +- .../callsInPlace/inAnonymousObject.fir.txt | 4 +- .../bad/callsInPlace/inLocalClass.dot | 4 +- .../bad/callsInPlace/inLocalClass.fir.txt | 4 +- .../delegates/anonymousInDelegate.fir.txt | 2 +- .../selfReferenceToCompanionObject.fir.txt | 4 +- .../converter/DeclarationsConverter.kt | 4 +- .../kotlin/fir/builder/RawFirBuilder.kt | 6 +-- .../kotlin/fir/builder/BaseFirBuilder.kt | 11 ++--- .../jetbrains/kotlin/fir/builder/Context.kt | 5 ++- .../fir/low/level/api/IdeFirPhaseManager.kt | 6 +-- .../api/api/FirDeclarationDesignation.kt | 13 +++--- .../resolve/FirLazyDeclarationResolver.kt | 32 ++++++++++++-- .../lazy/resolve/NonLocalDeclarationUtils.kt | 19 +------- .../low/level/api/util/declarationUtils.kt | 12 +---- .../testdata/onAirResolve/localClass.txt | 6 +-- .../partialRawBuilder/localFunction.txt | 2 +- 29 files changed, 133 insertions(+), 133 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/localClassesWithImplicit.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/localClassesWithImplicit.dot index ada79ed24ee..1276e767deb 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/localClassesWithImplicit.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/localClassesWithImplicit.dot @@ -151,7 +151,7 @@ digraph localClassesWithImplicit_kt { 60 [label="Enter block"]; 61 [label="Access variable R|/b|"]; 62 [label="Access variable R|kotlin/String.length|"]; - 63 [label="Function call: this@R|/A|.R|/A.bar|()"]; + 63 [label="Function call: this@R|/A|.R|/bar|()"]; 64 [label="Exit block"]; } 65 [label="Exit when branch result"]; @@ -168,7 +168,7 @@ digraph localClassesWithImplicit_kt { ^ when () { (R|/b| is R|kotlin/String|) -> { R|/b|.R|kotlin/String.length| - this@R|/A|.R|/A.bar|() + this@R|/A|.R|/bar|() } else -> { Int(1) @@ -238,7 +238,7 @@ digraph localClassesWithImplicit_kt { 81 [label="Access variable #"]; 82 [label="Access variable R|/a|"]; 83 [label="Access variable R|kotlin/String.length|"]; - 84 [label="Function call: this@R|/A|.R|/A.baz|()"]; + 84 [label="Function call: this@R|/A|.R|/baz|()"]; 85 [label="Exit block"]; } 86 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; @@ -248,7 +248,7 @@ digraph localClassesWithImplicit_kt { 74 [label="Jump: ^bar R|/myRun|( = myRun@fun (): R|kotlin/Int| { R|/b|.# R|/a|.R|kotlin/String.length| - ^ this@R|/A|.R|/A.baz|() + ^ this@R|/A|.R|/baz|() } )"]; 75 [label="Stub" style="filled" fillcolor=gray]; @@ -352,7 +352,7 @@ digraph localClassesWithImplicit_kt { 123 [label="Enter block"]; 124 [label="Access variable R|/b|"]; 125 [label="Access variable R|kotlin/String.length|"]; - 126 [label="Function call: this@R|/|.R|/.bar|()"]; + 126 [label="Function call: this@R|/|.R|/bar|()"]; 127 [label="Exit block"]; } 128 [label="Exit when branch result"]; @@ -369,7 +369,7 @@ digraph localClassesWithImplicit_kt { ^ when () { (R|/b| is R|kotlin/String|) -> { R|/b|.R|kotlin/String.length| - this@R|/|.R|/.bar|() + this@R|/|.R|/bar|() } else -> { Int(1) @@ -439,7 +439,7 @@ digraph localClassesWithImplicit_kt { 144 [label="Access variable R|kotlin/String.length|"]; 145 [label="Access variable R|/b|"]; 146 [label="Access variable #"]; - 147 [label="Function call: this@R|/|.R|/.baz|()"]; + 147 [label="Function call: this@R|/|.R|/baz|()"]; 148 [label="Exit block"]; } 149 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; @@ -449,7 +449,7 @@ digraph localClassesWithImplicit_kt { 137 [label="Jump: ^bar R|/myRun|( = myRun@fun (): R|kotlin/Int| { R|/a|.R|kotlin/String.length| R|/b|.# - ^ this@R|/|.R|/.baz|() + ^ this@R|/|.R|/baz|() } )"]; 138 [label="Stub" style="filled" fillcolor=gray]; diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/localClassesWithImplicit.fir.txt b/compiler/fir/analysis-tests/testData/resolve/cfg/localClassesWithImplicit.fir.txt index a47ea24421d..a36a90cef1a 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/localClassesWithImplicit.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/localClassesWithImplicit.fir.txt @@ -20,7 +20,7 @@ FILE: localClassesWithImplicit.kt ^ when () { (R|/b| is R|kotlin/String|) -> { R|/b|.R|kotlin/String.length| - this@R|/A|.R|/A.bar|() + this@R|/A|.R|/bar|() } else -> { Int(1) @@ -35,7 +35,7 @@ FILE: localClassesWithImplicit.kt ^bar R|/myRun|( = myRun@fun (): R|kotlin/Int| { R|/b|.# R|/a|.R|kotlin/String.length| - ^ this@R|/A|.R|/A.baz|() + ^ this@R|/A|.R|/baz|() } ) } @@ -57,7 +57,7 @@ FILE: localClassesWithImplicit.kt ^ when () { (R|/b| is R|kotlin/String|) -> { R|/b|.R|kotlin/String.length| - this@R|/|.R|/.bar|() + this@R|/|.R|/bar|() } else -> { Int(1) @@ -72,7 +72,7 @@ FILE: localClassesWithImplicit.kt ^bar R|/myRun|( = myRun@fun (): R|kotlin/Int| { R|/a|.R|kotlin/String.length| R|/b|.# - ^ this@R|/|.R|/.baz|() + ^ this@R|/|.R|/baz|() } ) } diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/CallBasedInExpressionGenerator.fir.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/CallBasedInExpressionGenerator.fir.txt index 55139a3c5a5..1a0e2d46dc8 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/CallBasedInExpressionGenerator.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/CallBasedInExpressionGenerator.fir.txt @@ -57,12 +57,12 @@ FILE: CallBasedInExpressionGenerator.kt } public final override fun putSelector(type: R|org/jetbrains/kotlin/codegen/range/inExpression/Type|, kotlinType: R|org/jetbrains/kotlin/codegen/range/inExpression/KotlinType?|, v: R|org/jetbrains/kotlin/codegen/range/inExpression/InstructionAdapter|): R|kotlin/Unit| { - this@R|/|.R|/.invokeFunction|(R|/v|) + this@R|/|.R|/invokeFunction|(R|/v|) #(R|/type|, R|/kotlinType|, R|/v|) } public final override fun condJump(jumpLabel: R|org/jetbrains/kotlin/codegen/range/inExpression/Label|, v: R|org/jetbrains/kotlin/codegen/range/inExpression/InstructionAdapter|, jumpIfFalse: R|kotlin/Boolean|): R|kotlin/Unit| { - this@R|/|.R|/.invokeFunction|(R|/v|) + this@R|/|.R|/invokeFunction|(R|/v|) R|/v|.#(when () { R|/jumpIfFalse| -> { #.# diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/localImplicitBodies.fir.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/localImplicitBodies.fir.txt index bce3a5999eb..e7486f98d7d 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/localImplicitBodies.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/localImplicitBodies.fir.txt @@ -6,7 +6,7 @@ FILE: localImplicitBodies.kt } public final fun sss(): R|kotlin/Int| { - ^sss this@R|/|.R|/.abc|() + ^sss this@R|/|.R|/abc|() } public final fun abc(): R|kotlin/Int| { @@ -15,5 +15,5 @@ FILE: localImplicitBodies.kt } - lval g: R|kotlin/Int| = R|/x|.R|/.sss|() + lval g: R|kotlin/Int| = R|/x|.R|/sss|() } diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/localObjects.fir.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/localObjects.fir.txt index da21a3d6171..7f9c3779ce3 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/localObjects.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/localObjects.fir.txt @@ -38,7 +38,7 @@ FILE: localObjects.kt } - Q|B|.R|/B.foo|() + Q|B|.R|/foo|() } public final val bb: = #.#() public get(): diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/localScopes.fir.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/localScopes.fir.txt index bce53b4ae23..fc4a8b5bef4 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/localScopes.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/localScopes.fir.txt @@ -20,7 +20,7 @@ FILE: localScopes.kt } lval base: R|BaseLocal| = R|/BaseLocal.BaseLocal|() - R|/base|.R|/BaseLocal.baz|() + R|/base|.R|/baz|() R|/base|.R|/Bar.foo|() lval anonymous: R|| = object : R|Bar| { private constructor(): R|| { @@ -32,7 +32,7 @@ FILE: localScopes.kt } - R|/anonymous|.R|/.baz|() + R|/anonymous|.R|/baz|() R|/anonymous|.R|/Bar.foo|() local final class DerivedLocal : R|BaseLocal| { public constructor(): R|DerivedLocal| { @@ -45,7 +45,7 @@ FILE: localScopes.kt } lval derived: R|DerivedLocal| = R|/DerivedLocal.DerivedLocal|() - R|/derived|.R|/DerivedLocal.gau|() - R|/derived|.R|/BaseLocal.baz|() + R|/derived|.R|/gau|() + R|/derived|.R|/baz|() R|/derived|.R|/Bar.foo|() } diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/localWithBooleanNot.fir.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/localWithBooleanNot.fir.txt index e346ae60b05..f6f83b7aff8 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/localWithBooleanNot.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/localWithBooleanNot.fir.txt @@ -10,11 +10,11 @@ FILE: foo.kt private set(value: R|kotlin/Boolean|): R|kotlin/Unit| public final fun bar(): R|kotlin/Boolean| { - ^bar this@R|/|.R|/.result|.R|kotlin/Boolean.not|() + ^bar this@R|/|.R|/result|.R|kotlin/Boolean.not|() } public final override fun result(): R|kotlin/Boolean| { - ^result this@R|/|.R|/.result| + ^result this@R|/|.R|/result| } } diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/privateVisibility.fir.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/privateVisibility.fir.txt index f74af222a1e..a665777ef79 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/privateVisibility.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/privateVisibility.fir.txt @@ -71,7 +71,7 @@ FILE: first.kt private final fun bar(): R|kotlin/Unit| public final fun baz(): R|kotlin/Unit| { - this@R|/Local|.R|/Local.bar|() + this@R|/Local|.R|/bar|() this@R|/Local|.R|/Local.Inner.Inner|() } @@ -81,15 +81,15 @@ FILE: first.kt } public final fun foo(): R|kotlin/Unit| { - this@R|/Local|.R|/Local.bar|() + this@R|/Local|.R|/bar|() } } } - R|/Local.Local|().R|/Local.baz|() - R|/Local.Local|().#() + R|/Local.Local|().R|/baz|() + R|/Local.Local|()./bar is invisible>#() } public final fun test(): R|kotlin/Unit| { R|/foo|() diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantVisibilityModifierChecker.fir.txt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantVisibilityModifierChecker.fir.txt index 2fd1132eb4c..daed56be777 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantVisibilityModifierChecker.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantVisibilityModifierChecker.fir.txt @@ -12,7 +12,7 @@ FILE: RedundantVisibilityModifierChecker.kt } - R|/LocalClass.LocalClass|().R|/LocalClass.foo| = Int(1) + R|/LocalClass.LocalClass|().R|/foo| = Int(1) } internal final inline fun internal(): R|kotlin/Unit| { R|/f|() diff --git a/compiler/fir/analysis-tests/testData/resolve/inference/callableReferenceToLocalClass.fir.txt b/compiler/fir/analysis-tests/testData/resolve/inference/callableReferenceToLocalClass.fir.txt index 52632affaf2..93b65149307 100644 --- a/compiler/fir/analysis-tests/testData/resolve/inference/callableReferenceToLocalClass.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/inference/callableReferenceToLocalClass.fir.txt @@ -14,5 +14,5 @@ FILE: callableReferenceToLocalClass.kt } lval datas: R|kotlin/collections/List| = Null(null)!! - lval xs: R|kotlin/collections/List| = R|/datas|.R|/myMap|(Q|Data|::R|/Data.x|) + lval xs: R|kotlin/collections/List| = R|/datas|.R|/myMap|(Q|Data|::R|/x|) } diff --git a/compiler/fir/analysis-tests/testData/resolve/localClasses/implicitInLocalClasses.fir.txt b/compiler/fir/analysis-tests/testData/resolve/localClasses/implicitInLocalClasses.fir.txt index fc2b082a662..d0db2e444f0 100644 --- a/compiler/fir/analysis-tests/testData/resolve/localClasses/implicitInLocalClasses.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/localClasses/implicitInLocalClasses.fir.txt @@ -8,7 +8,7 @@ FILE: implicitInLocalClasses.kt } public final fun foo(x: R|kotlin/Int|): R|kotlin/Boolean| { - ^foo this@R|/A|.R|/A.bar|(R|/x|) + ^foo this@R|/A|.R|/bar|(R|/x|) } public final fun bar(y: R|kotlin/Int|): R|kotlin/Boolean| { @@ -17,7 +17,7 @@ FILE: implicitInLocalClasses.kt public final val w: R|kotlin/Boolean| public get(): R|kotlin/Boolean| { - ^ this@R|/A|.R|/A.z| + ^ this@R|/A|.R|/z| } public final val z: R|kotlin/Boolean| @@ -28,17 +28,17 @@ FILE: implicitInLocalClasses.kt } lval a: R|A| = R|/A.A|() - R|/useBoolean|(R|/a|.R|/A.foo|(Int(1))) - R|/useBoolean|(R|/a|.R|/A.bar|(Int(1))) - R|/useBoolean|(R|/a|.R|/A.w|) - R|/useBoolean|(R|/a|.R|/A.z|) + R|/useBoolean|(R|/a|.R|/foo|(Int(1))) + R|/useBoolean|(R|/a|.R|/bar|(Int(1))) + R|/useBoolean|(R|/a|.R|/w|) + R|/useBoolean|(R|/a|.R|/z|) local final class B : R|kotlin/Any| { public constructor(): R|B| { super() } public final fun foo(x: R|kotlin/Int|): R|kotlin/Boolean| { - ^foo this@R|/B|.R|/B.inner|.R|/B.Inner.w| + ^foo this@R|/B|.R|/inner|.R|/w| } public final fun bar(y: R|kotlin/Int|): R|kotlin/Boolean| { @@ -55,12 +55,12 @@ FILE: implicitInLocalClasses.kt public final val w: R|kotlin/Boolean| public get(): R|kotlin/Boolean| { - ^ this@R|/B.Inner|.R|/B.Inner.z| + ^ this@R|/B.Inner|.R|/z| } public final val z: R|kotlin/Boolean| public get(): R|kotlin/Boolean| { - ^ this@R|/B|.R|/B.bar|(Int(1)) + ^ this@R|/B|.R|/bar|(Int(1)) } } @@ -68,8 +68,8 @@ FILE: implicitInLocalClasses.kt } lval b: R|B| = R|/B.B|() - R|/useBoolean|(R|/b|.R|/B.foo|(Int(1))) - R|/useBoolean|(R|/b|.R|/B.bar|(Int(1))) - R|/useBoolean|(R|/b|.R|/B.inner|.R|/B.Inner.w|) - R|/useBoolean|(R|/b|.R|/B.inner|.R|/B.Inner.z|) + R|/useBoolean|(R|/b|.R|/foo|(Int(1))) + R|/useBoolean|(R|/b|.R|/bar|(Int(1))) + R|/useBoolean|(R|/b|.R|/inner|.R|/w|) + R|/useBoolean|(R|/b|.R|/inner|.R|/z|) } diff --git a/compiler/fir/analysis-tests/testData/resolve/objectInnerClass.fir.txt b/compiler/fir/analysis-tests/testData/resolve/objectInnerClass.fir.txt index 6116ba8e6cd..cba01380f35 100644 --- a/compiler/fir/analysis-tests/testData/resolve/objectInnerClass.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/objectInnerClass.fir.txt @@ -10,24 +10,24 @@ FILE: objectInnerClass.kt } public final fun R|.Base|.zoo(): R|kotlin/Unit| { - lval x: R|B| = this@R|/.Child.zoo|.R|/.Base.property| + lval x: R|B| = this@R|/zoo|.R|/property| } public final fun foo(): R|kotlin/Unit| { - this@R|/.Child|.R|/.Base.baseFun|() - lval x: R|B| = this@R|/.Child|.R|/.Base.property| - (this@R|/.Child|, this@R|/.Child|).R|/.Child.zoo|() + this@R|/.Child|.R|/baseFun|() + lval x: R|B| = this@R|/.Child|.R|/property| + (this@R|/.Child|, this@R|/.Child|).R|/zoo|() (this@R|/|, this@R|/.Child|).R|/.hoo|() } } public final fun R|.Child|.voo(): R|kotlin/Unit| { - lval x: R|B| = this@R|/.voo|.R|/.Base.property| + lval x: R|B| = this@R|/.voo|.R|/property| } public final fun R|.Base|.hoo(): R|kotlin/Unit| { - lval x: R|B| = this@R|/.hoo|.R|/.Base.property| + lval x: R|B| = this@R|/.hoo|.R|/property| } local open inner class Base : R|kotlin/Any| { @@ -45,16 +45,16 @@ FILE: objectInnerClass.kt public final fun caseForBase(): R|kotlin/Unit| { lval base: R|.Base| = this@R|/|.R|/.Base.Base|(R|/B.B|()) - R|/base|.R|/.Base.baseFun|() - R|/base|.R|/.Base.property| + R|/base|.R|/baseFun|() + R|/base|.R|/property| (this@R|/|, R|/base|).R|/.hoo|() } public final fun caseForChild(): R|kotlin/Unit| { lval child: R|.Child| = this@R|/|.R|/.Child.Child|(R|/B.B|()) - R|/child|.R|/.Base.baseFun|() - R|/child|.R|/.Base.property| - R|/child|.R|/.Child.foo|() + R|/child|.R|/baseFun|() + R|/child|.R|/property| + R|/child|.R|/foo|() (this@R|/|, R|/child|).R|/.hoo|() (this@R|/|, R|/child|).R|/.voo|() } @@ -135,24 +135,24 @@ FILE: objectInnerClass.kt } public final fun R|Case3..Base|.zoo(): R|kotlin/Unit| { - lval x: R|B| = this@R|/Case3..Child.zoo|.R|/Case3..Base.property| + lval x: R|B| = this@R|/zoo|.R|/property| } public final fun foo(): R|kotlin/Unit| { - this@R|/Case3..Child|.R|/Case3..Base.baseFun|() - lval x: R|B| = this@R|/Case3..Child|.R|/Case3..Base.property| - (this@R|/Case3..Child|, this@R|/Case3..Child|).R|/Case3..Child.zoo|() + this@R|/Case3..Child|.R|/baseFun|() + lval x: R|B| = this@R|/Case3..Child|.R|/property| + (this@R|/Case3..Child|, this@R|/Case3..Child|).R|/zoo|() (this@R|/|, this@R|/Case3..Child|).R|/.hoo|() } } public final fun R|Case3..Child|.voo(): R|kotlin/Unit| { - lval x: R|B| = this@R|/.voo|.R|/Case3..Base.property| + lval x: R|B| = this@R|/.voo|.R|/property| } public final fun R|Case3..Base|.hoo(): R|kotlin/Unit| { - lval x: R|B| = this@R|/.hoo|.R|/Case3..Base.property| + lval x: R|B| = this@R|/.hoo|.R|/property| } local open inner class Base : R|kotlin/Any| { @@ -170,16 +170,16 @@ FILE: objectInnerClass.kt public final fun caseForBase(): R|kotlin/Unit| { lval base: R|Case3..Base| = this@R|/|.R|/Case3..Base.Base|(R|/B.B|()) - R|/base|.R|/Case3..Base.baseFun|() - R|/base|.R|/Case3..Base.property| + R|/base|.R|/baseFun|() + R|/base|.R|/property| (this@R|/|, R|/base|).R|/.hoo|() } public final fun caseForChild(): R|kotlin/Unit| { lval child: R|Case3..Child| = this@R|/|.R|/Case3..Child.Child|(R|/B.B|()) - R|/child|.R|/Case3..Base.baseFun|() - R|/child|.R|/Case3..Base.property| - R|/child|.R|/Case3..Child.foo|() + R|/child|.R|/baseFun|() + R|/child|.R|/property| + R|/child|.R|/foo|() (this@R|/|, R|/child|).R|/.hoo|() (this@R|/|, R|/child|).R|/.voo|() } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/bad/callsInPlace/inAnonymousObject.dot b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/bad/callsInPlace/inAnonymousObject.dot index 2fcac12ad47..d026ebe5ef9 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/bad/callsInPlace/inAnonymousObject.dot +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/bad/callsInPlace/inAnonymousObject.dot @@ -12,7 +12,7 @@ digraph inAnonymousObject_kt { 2 [label="Exit anonymous object"]; 3 [label="Variable declaration: lval obj: R||"]; 4 [label="Access variable R|/obj|"]; - 5 [label="Function call: R|/obj|.R|/.run|()"]; + 5 [label="Function call: R|/obj|.R|/run|()"]; 6 [label="Function call: R|/d|.R|SubstitutionOverride|()"]; 7 [label="Exit block"]; } @@ -70,7 +70,7 @@ digraph inAnonymousObject_kt { color=blue 20 [label="Enter block"]; 21 [label="Access variable R|/b|"]; - 22 [label="Assignment: R|/.leaked|"]; + 22 [label="Assignment: R|/leaked|"]; 23 [label="Exit block"]; } 24 [label="Exit init block" style="filled" fillcolor=red]; diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/bad/callsInPlace/inAnonymousObject.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/bad/callsInPlace/inAnonymousObject.fir.txt index 088e438a102..6067533015e 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/bad/callsInPlace/inAnonymousObject.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/bad/callsInPlace/inAnonymousObject.fir.txt @@ -21,7 +21,7 @@ FILE: inAnonymousObject.kt public get(): R|kotlin/Any| init { - this@R|/|.R|/.leaked| = R|/b| + this@R|/|.R|/leaked| = R|/b| } public final override fun run(): R|kotlin/Unit| { @@ -30,6 +30,6 @@ FILE: inAnonymousObject.kt } - R|/obj|.R|/.run|() + R|/obj|.R|/run|() R|/d|.R|SubstitutionOverride|() } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/bad/callsInPlace/inLocalClass.dot b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/bad/callsInPlace/inLocalClass.dot index 49e19f74b96..570287c13e1 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/bad/callsInPlace/inLocalClass.dot +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/bad/callsInPlace/inLocalClass.dot @@ -11,7 +11,7 @@ digraph inLocalClass_kt { 1 [label="Enter block"]; 2 [label="Exit local class foo"]; 3 [label="Function call: R|/LocalClass.LocalClass|()"]; - 4 [label="Function call: R|/LocalClass.LocalClass|().R|/LocalClass.run|()"]; + 4 [label="Function call: R|/LocalClass.LocalClass|().R|/run|()"]; 5 [label="Function call: R|/e|.R|SubstitutionOverride|()"]; 6 [label="Exit block"]; } @@ -77,7 +77,7 @@ digraph inLocalClass_kt { color=blue 22 [label="Enter block"]; 23 [label="Access variable R|/c|"]; - 24 [label="Assignment: R|/LocalClass.leaked|"]; + 24 [label="Assignment: R|/leaked|"]; 25 [label="Exit block"]; } 26 [label="Exit init block" style="filled" fillcolor=red]; diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/bad/callsInPlace/inLocalClass.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/bad/callsInPlace/inLocalClass.fir.txt index 73f4a36d2e9..b953228e47d 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/bad/callsInPlace/inLocalClass.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/bad/callsInPlace/inLocalClass.fir.txt @@ -23,7 +23,7 @@ FILE: inLocalClass.kt } init { - this@R|/LocalClass|.R|/LocalClass.leaked| = R|/c| + this@R|/LocalClass|.R|/leaked| = R|/c| } public final fun run(): R|kotlin/Unit| { @@ -32,6 +32,6 @@ FILE: inLocalClass.kt } - R|/LocalClass.LocalClass|().R|/LocalClass.run|() + R|/LocalClass.LocalClass|().R|/run|() R|/e|.R|SubstitutionOverride|() } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/anonymousInDelegate.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/anonymousInDelegate.fir.txt index 1d5def93c8e..1e07b8777cc 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/anonymousInDelegate.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/anonymousInDelegate.fir.txt @@ -15,7 +15,7 @@ FILE: anonymousInDelegate.kt } - ^ R|/foo|.R|/.bar|() + ^ R|/foo|.R|/bar|() } ) public get(): R|kotlin/Int| { diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/selfReferenceToCompanionObject.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/selfReferenceToCompanionObject.fir.txt index bc0d1e28ff7..aae77a3be4f 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/selfReferenceToCompanionObject.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/selfReferenceToCompanionObject.fir.txt @@ -57,12 +57,12 @@ FILE: selfReferenceToCompanionObject.kt public get(): R|kotlin/String| public final val closure2: R|() -> kotlin/String| = fun (): R|kotlin/String| { - ^ this@R|/|.R|/.y| + ^ this@R|/|.R|/y| } public get(): R|() -> kotlin/String| - public final override val z: R|kotlin/String| = this@R|/|.R|/.closure2|.R|SubstitutionOverride|() + public final override val z: R|kotlin/String| = this@R|/|.R|/closure2|.R|SubstitutionOverride|() public get(): R|kotlin/String| } diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 53d17ab6622..11489333aff 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -692,7 +692,7 @@ class DeclarationsConverter( )?.let { declarations += it.firConstructor } classBodyNode?.also { // Use ANONYMOUS_OBJECT_NAME for the owner class id of enum entry declarations - withChildClassName(ANONYMOUS_OBJECT_NAME, isLocal = true) { + withChildClassName(ANONYMOUS_OBJECT_NAME, forceLocalContext = true) { declarations += convertClassBody(it, enumClassWrapper) } } @@ -1407,7 +1407,7 @@ class DeclarationsConverter( isSuspend = modifiers.hasSuspend() } - symbol = FirNamedFunctionSymbol(callableIdForName(functionName, isLocal)) + symbol = FirNamedFunctionSymbol(callableIdForName(functionName)) dispatchReceiverType = currentDispatchReceiverType() } } diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 85d7438c838..ad1298e5764 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -787,7 +787,7 @@ open class RawFirBuilder( typeParameters ) // Use ANONYMOUS_OBJECT_NAME for the owner class id for enum entry declarations (see KT-42351) - withChildClassName(ANONYMOUS_OBJECT_NAME, isLocal = true) { + withChildClassName(ANONYMOUS_OBJECT_NAME, forceLocalContext = true) { for (declaration in ktEnumEntry.declarations) { declarations += declaration.toFirDeclaration( correctedEnumSelfTypeRef, @@ -816,7 +816,7 @@ open class RawFirBuilder( val isLocal = classOrObject.isLocal || classOrObject.getStrictParentOfType() != null return withChildClassName( classOrObject.nameAsSafeName, - isLocal = isLocal + forceLocalContext = isLocal ) { val classKind = when (classOrObject) { is KtObjectDeclaration -> ClassKind.OBJECT @@ -1022,7 +1022,7 @@ open class RawFirBuilder( receiverTypeRef = receiverType name = function.nameAsSafeName labelName = runIf(!name.isSpecial) { name.identifier } - symbol = FirNamedFunctionSymbol(callableIdForName(function.nameAsSafeName, function.isLocal)) + symbol = FirNamedFunctionSymbol(callableIdForName(function.nameAsSafeName)) dispatchReceiverType = currentDispatchReceiverType() status = FirDeclarationStatusImpl( if (function.isLocal) Visibilities.Local else function.visibility, diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt index e08b7ca34b6..327185b6a6c 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt @@ -64,11 +64,12 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte /**** Class name utils ****/ inline fun withChildClassName( name: Name, - isLocal: Boolean = context.firFunctionTargets.isNotEmpty(), + forceLocalContext: Boolean = false, l: () -> T ): T { context.className = context.className.child(name) - context.localBits.add(isLocal) + val oldForcedLocalContext = context.forcedLocalContext + context.forcedLocalContext = forceLocalContext || context.forcedLocalContext val dispatchReceiversNumber = context.dispatchReceiverTypesStack.size return try { l() @@ -82,7 +83,7 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte } context.className = context.className.parent() - context.localBits.removeLast() + context.forcedLocalContext = oldForcedLocalContext } } @@ -99,9 +100,9 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte } } - fun callableIdForName(name: Name, local: Boolean = false) = + fun callableIdForName(name: Name) = when { - local -> { + context.inLocalContext -> { val pathFqName = context.firFunctionTargets.fold( if (context.className == FqName.ROOT) context.packageFqName else context.currentClassId.asSingleFqName() diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/Context.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/Context.kt index 50229d473d2..e67f1a1f14f 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/Context.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/Context.kt @@ -20,8 +20,9 @@ import org.jetbrains.kotlin.name.Name class Context { lateinit var packageFqName: FqName var className: FqName = FqName.ROOT - val localBits: MutableList = mutableListOf() - val currentClassId get() = ClassId(packageFqName, className, localBits.lastOrNull() ?: false) + var forcedLocalContext: Boolean = false + val inLocalContext get() = forcedLocalContext || firFunctionTargets.isNotEmpty() + val currentClassId get() = ClassId(packageFqName, className, inLocalContext) val firFunctionTargets = mutableListOf() val calleeNamesForLambda = mutableListOf() diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/IdeFirPhaseManager.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/IdeFirPhaseManager.kt index 987c385d8ad..ea0c6607e79 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/IdeFirPhaseManager.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/IdeFirPhaseManager.kt @@ -11,11 +11,9 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.transformers.FirPhaseManager import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol -import org.jetbrains.kotlin.idea.fir.low.level.api.api.tryCollectDesignation import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.FirLazyDeclarationResolver import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirSessionInvalidator -import org.jetbrains.kotlin.idea.fir.low.level.api.util.isLocalDeclaration @ThreadSafeMutableState internal class IdeFirPhaseManager( @@ -28,7 +26,6 @@ internal class IdeFirPhaseManager( requiredPhase: FirResolvePhase ) { val fir = symbol.fir as FirDeclaration - if (fir.isLocalDeclaration) return try { if (fir.resolvePhase < requiredPhase) { //TODO Make thread safe lazyDeclarationResolver.lazyResolveDeclaration( @@ -36,7 +33,8 @@ internal class IdeFirPhaseManager( moduleFileCache = cache, scopeSession = ScopeSession(), toPhase = requiredPhase, - checkPCE = true + checkPCE = true, + skipLocalDeclaration = true, ) } } catch (e: Throwable) { diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/FirDeclarationDesignation.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/FirDeclarationDesignation.kt index 8b49fd35dab..f468ce3f528 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/FirDeclarationDesignation.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/FirDeclarationDesignation.kt @@ -13,7 +13,6 @@ import org.jetbrains.kotlin.fir.renderWithType import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.resolve.toFirRegularClass import org.jetbrains.kotlin.idea.fir.low.level.api.util.getContainingFile -import org.jetbrains.kotlin.idea.fir.low.level.api.util.isLocalDeclaration import org.jetbrains.kotlin.idea.util.ifFalse class FirDeclarationDesignationWithFile( @@ -55,14 +54,16 @@ private fun FirRegularClass.collectForNonLocal(): List { } private fun collectDesignationPath(declaration: FirDeclaration): List? { - if (declaration.isLocalDeclaration) return null val containingClass = when (declaration) { is FirCallableDeclaration<*> -> { - val isLocalMember = (declaration as? FirCallableMemberDeclaration<*>)?.status?.visibility == Visibilities.Local - if (isLocalMember) return null + if (declaration.symbol.callableId.isLocal) return null + if ((declaration as? FirCallableMemberDeclaration<*>)?.status?.visibility == Visibilities.Local) return null when (declaration) { - is FirSimpleFunction, is FirProperty, is FirField, is FirConstructor -> - declaration.containingClass()?.toFirRegularClass(declaration.moduleData.session) + is FirSimpleFunction, is FirProperty, is FirField, is FirConstructor -> { + val klass = declaration.containingClass() ?: return emptyList() + if (klass.classId.isLocal) return null + klass.toFirRegularClass(declaration.moduleData.session) + } else -> return null } } diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/FirLazyDeclarationResolver.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/FirLazyDeclarationResolver.kt index f77892c9381..4a33c944e1d 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/FirLazyDeclarationResolver.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/FirLazyDeclarationResolver.kt @@ -12,6 +12,9 @@ import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignationWithFile +import org.jetbrains.kotlin.idea.fir.low.level.api.api.collectDesignationWithFile +import org.jetbrains.kotlin.idea.fir.low.level.api.api.tryCollectDesignationWithFile +import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.getNonLocalContainingOrThisDeclaration import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.runCustomResolveUnderLock @@ -22,6 +25,7 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.transformers.FirProviderInter import org.jetbrains.kotlin.idea.fir.low.level.api.transformers.LazyTransformerFactory import org.jetbrains.kotlin.idea.fir.low.level.api.util.checkCanceled import org.jetbrains.kotlin.idea.fir.low.level.api.util.ensurePhase +import org.jetbrains.kotlin.idea.fir.low.level.api.util.findSourceNonLocalFirDeclaration import org.jetbrains.kotlin.idea.util.ifTrue internal class FirLazyDeclarationResolver(private val firFileBuilder: FirFileBuilder) { @@ -189,6 +193,7 @@ internal class FirLazyDeclarationResolver(private val firFileBuilder: FirFileBui toPhase: FirResolvePhase, checkPCE: Boolean, declarationPhaseDowngraded: Boolean = false, + skipLocalDeclaration: Boolean = false, ) { if (toPhase == FirResolvePhase.RAW_FIR) return //TODO Should be synchronised @@ -205,10 +210,29 @@ internal class FirLazyDeclarationResolver(private val firFileBuilder: FirFileBui return } - val provider = firDeclarationToResolve.moduleData.session.firIdeProvider - val (designation, forceToBody) = - firDeclarationToResolve.getNonLocalDeclarationToResolveAndForceUpgradeToBodyPhase(provider, moduleFileCache, firFileBuilder) - val neededPhase = if (forceToBody) FirResolvePhase.BODY_RESOLVE else toPhase + val requestedDeclarationDesignation = firDeclarationToResolve.tryCollectDesignationWithFile() + + val designation: FirDeclarationDesignationWithFile + val neededPhase: FirResolvePhase + if (requestedDeclarationDesignation != null) { + designation = requestedDeclarationDesignation + neededPhase = toPhase + } else { + val possiblyLocalDeclaration = firDeclarationToResolve.getKtDeclarationForFirElement() + val nonLocalDeclaration = possiblyLocalDeclaration.getNonLocalContainingOrThisDeclaration() + ?: error("Container for local declaration cannot be null") + + val isLocalDeclarationResolveRequested = possiblyLocalDeclaration != nonLocalDeclaration + if (isLocalDeclarationResolveRequested && skipLocalDeclaration) return + + val nonLocalFirDeclaration = nonLocalDeclaration.findSourceNonLocalFirDeclaration( + firFileBuilder, + firDeclarationToResolve.moduleData.session.firIdeProvider.symbolProvider, + moduleFileCache + ) + designation = nonLocalFirDeclaration.collectDesignationWithFile() + neededPhase = if (isLocalDeclarationResolveRequested) FirResolvePhase.BODY_RESOLVE else toPhase + } //TODO Should be synchronised if (!designation.declaration.isValidForResolve()) return diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/NonLocalDeclarationUtils.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/NonLocalDeclarationUtils.kt index 9d1d15f2111..d43845c6fbd 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/NonLocalDeclarationUtils.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/NonLocalDeclarationUtils.kt @@ -21,18 +21,9 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.psi.psiUtil.getParentOfType -internal fun FirDeclaration.getNonLocalDeclarationToResolveAndForceUpgradeToBodyPhase( - provider: FirProvider, - moduleFileCache: ModuleFileCache, - firFileBuilder: FirFileBuilder -): Pair { +internal fun FirDeclaration.getKtDeclarationForFirElement(): KtDeclaration { require(this !is FirFile) - val nonLocalDesignation = tryCollectDesignationWithFile() - if (nonLocalDesignation != null) { - return nonLocalDesignation to false - } - val ktDeclaration = (psi as? KtDeclaration) ?: run { (source as? FirFakeSourceElement<*>).psi?.parentOfType() } @@ -61,13 +52,7 @@ internal fun FirDeclaration.getNonLocalDeclarationToResolveAndForceUpgradeToBody check(declaration is KtDeclaration) { "FirDeclaration should have a PSI of type KtDeclaration" } - - val nonLocalDeclaration = declaration.getNonLocalContainingOrThisDeclaration() - ?: error("Container for local declaration cannot be null") - - val firDeclaration = nonLocalDeclaration.findSourceNonLocalFirDeclaration(firFileBuilder, provider.symbolProvider, moduleFileCache) - val needUpgrade = nonLocalDeclaration !== declaration - return firDeclaration.collectDesignationWithFile() to needUpgrade + return declaration } internal fun declarationCanBeLazilyResolved(declaration: KtDeclaration): Boolean { diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/util/declarationUtils.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/util/declarationUtils.kt index 0e28c6b92d6..32aaf5e121b 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/util/declarationUtils.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/util/declarationUtils.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.util -import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.realPsi @@ -125,13 +124,4 @@ private fun KtClassLikeDeclaration.findFir(firSymbolProvider: FirSymbolProvider) val FirDeclaration.isGeneratedDeclaration - get() = realPsi == null - - -internal val FirDeclaration.isLocalDeclaration: Boolean - get() = when (this) { - is FirCallableDeclaration<*> -> - ((this as? FirCallableMemberDeclaration<*>)?.status?.visibility == Visibilities.Local) - is FirClassLikeDeclaration<*> -> isLocal - else -> true - } \ No newline at end of file + get() = realPsi == null \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/localClass.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/localClass.txt index 42fd6d4e087..76a7f0a98f9 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/localClass.txt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/localClass.txt @@ -1,9 +1,9 @@ -public? final? [BODY_RESOLVE] class E : R|kotlin/Any| { - public? [BODY_RESOLVE] constructor(): R|E| { +public final [BODY_RESOLVE] class E : R|kotlin/Any| { + public [BODY_RESOLVE] constructor(): R|E| { super() } - public? final? [BODY_RESOLVE] fun e(): R|kotlin/Int| { + public final [BODY_RESOLVE] fun e(): R|kotlin/Int| { ^e R|/x| } diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/partialRawBuilder/localFunction.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/partialRawBuilder/localFunction.txt index 20bf6943b21..8b4bb6a7d2a 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/partialRawBuilder/localFunction.txt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/partialRawBuilder/localFunction.txt @@ -1,3 +1,3 @@ -local final? fun /bar(): R|kotlin/Unit| { +local final? fun test/locals/Owner.bar(): R|kotlin/Unit| { baz#(i#, x#) }