[FIR] avoid jumping from status transformer for local classes to unresolved non-local classes

We must resolve a non-local declaration before access
if we want to jump from local to it to avoid possible problems
with parallel resolution

^KT-56550
This commit is contained in:
Dmitrii Gridin
2023-05-07 17:06:50 +02:00
committed by Space Team
parent 71c66cdb01
commit ba08f2c08a
6 changed files with 482 additions and 7 deletions
@@ -121,8 +121,8 @@ FILE: [ResolvedTo(IMPORTS)] anonymousObjectInInvalidPosition.kt
}
private [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] get(): <ERROR TYPE REF: Wrong number of type arguments>
public abstract [ResolvedTo(TYPES)] interface A<[ResolvedTo(TYPES)] T> : R|kotlin/Any| {
public abstract [ResolvedTo(TYPES)] fun x(): R|kotlin/Unit|
public abstract [ResolvedTo(STATUS)] interface A<[ResolvedTo(STATUS)] T> : R|kotlin/Any| {
public abstract [ResolvedTo(STATUS)] fun x(): R|kotlin/Unit|
}
@@ -140,8 +140,8 @@ FILE: [ResolvedTo(IMPORTS)] anonymousObjectInInvalidPosition.kt
}
private [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] get(): <ERROR TYPE REF: Wrong number of type arguments>
public abstract [ResolvedTo(TYPES)] interface A<[ResolvedTo(TYPES)] T> : R|kotlin/Any| {
public abstract [ResolvedTo(TYPES)] fun x(): R|kotlin/Unit|
public abstract [ResolvedTo(STATUS)] interface A<[ResolvedTo(STATUS)] T> : R|kotlin/Any| {
public abstract [ResolvedTo(STATUS)] fun x(): R|kotlin/Unit|
}
@@ -159,8 +159,8 @@ FILE: [ResolvedTo(IMPORTS)] anonymousObjectInInvalidPosition.kt
}
private [ResolvedTo(BODY_RESOLVE)] get(): <ERROR TYPE REF: Wrong number of type arguments>
public abstract [ResolvedTo(TYPES)] interface A<[ResolvedTo(TYPES)] T> : R|kotlin/Any| {
public abstract [ResolvedTo(TYPES)] fun x(): R|kotlin/Unit|
public abstract [ResolvedTo(STATUS)] interface A<[ResolvedTo(STATUS)] T> : R|kotlin/Any| {
public abstract [ResolvedTo(STATUS)] fun x(): R|kotlin/Unit|
}
@@ -0,0 +1,27 @@
open class TopLevelClass {
open fun foo(i: Int) {
}
open fun boo(b: String) {
}
}
open class AnotherTopLevelClass : TopLevelClass() {
override fun foo(i: Int) {
}
}
fun resolve<caret>Me() {
open class LocalClass : AnotherTopLevelClass() {
override fun foo(i: Int) {
}
}
class SecondLocalClass : LocalClass() {
override fun boo(b: String) {
}
}
}
@@ -0,0 +1,429 @@
RAW_FIR:
FILE: [ResolvedTo(RAW_FIR)] fromLocalHierarchyToOuter.kt
[ResolvedTo(RAW_FIR)] annotations container
public? open [ResolvedTo(RAW_FIR)] class TopLevelClass : R|kotlin/Any| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=TopLevelClass] constructor(): R|TopLevelClass| {
LAZY_super<R|kotlin/Any|>
}
public? open [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
public? open [ResolvedTo(RAW_FIR)] fun boo([ResolvedTo(RAW_FIR)] b: String): R|kotlin/Unit| { LAZY_BLOCK }
}
public? open [ResolvedTo(RAW_FIR)] class AnotherTopLevelClass : TopLevelClass {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnotherTopLevelClass] constructor(): R|AnotherTopLevelClass| {
LAZY_super<TopLevelClass>
}
public? open? override [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
}
public? final? [ResolvedTo(RAW_FIR)] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK }
IMPORTS:
FILE: [ResolvedTo(IMPORTS)] fromLocalHierarchyToOuter.kt
[ResolvedTo(RAW_FIR)] annotations container
public? open [ResolvedTo(RAW_FIR)] class TopLevelClass : R|kotlin/Any| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=TopLevelClass] constructor(): R|TopLevelClass| {
LAZY_super<R|kotlin/Any|>
}
public? open [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
public? open [ResolvedTo(RAW_FIR)] fun boo([ResolvedTo(RAW_FIR)] b: String): R|kotlin/Unit| { LAZY_BLOCK }
}
public? open [ResolvedTo(RAW_FIR)] class AnotherTopLevelClass : TopLevelClass {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnotherTopLevelClass] constructor(): R|AnotherTopLevelClass| {
LAZY_super<TopLevelClass>
}
public? open? override [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
}
public? final? [ResolvedTo(RAW_FIR)] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK }
COMPILER_REQUIRED_ANNOTATIONS:
FILE: [ResolvedTo(IMPORTS)] fromLocalHierarchyToOuter.kt
[ResolvedTo(RAW_FIR)] annotations container
public? open [ResolvedTo(RAW_FIR)] class TopLevelClass : R|kotlin/Any| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=TopLevelClass] constructor(): R|TopLevelClass| {
LAZY_super<R|kotlin/Any|>
}
public? open [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
public? open [ResolvedTo(RAW_FIR)] fun boo([ResolvedTo(RAW_FIR)] b: String): R|kotlin/Unit| { LAZY_BLOCK }
}
public? open [ResolvedTo(RAW_FIR)] class AnotherTopLevelClass : TopLevelClass {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnotherTopLevelClass] constructor(): R|AnotherTopLevelClass| {
LAZY_super<TopLevelClass>
}
public? open? override [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
}
public? final? [ResolvedTo(COMPILER_REQUIRED_ANNOTATIONS)] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK }
COMPANION_GENERATION:
FILE: [ResolvedTo(IMPORTS)] fromLocalHierarchyToOuter.kt
[ResolvedTo(RAW_FIR)] annotations container
public? open [ResolvedTo(RAW_FIR)] class TopLevelClass : R|kotlin/Any| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=TopLevelClass] constructor(): R|TopLevelClass| {
LAZY_super<R|kotlin/Any|>
}
public? open [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
public? open [ResolvedTo(RAW_FIR)] fun boo([ResolvedTo(RAW_FIR)] b: String): R|kotlin/Unit| { LAZY_BLOCK }
}
public? open [ResolvedTo(RAW_FIR)] class AnotherTopLevelClass : TopLevelClass {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnotherTopLevelClass] constructor(): R|AnotherTopLevelClass| {
LAZY_super<TopLevelClass>
}
public? open? override [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
}
public? final? [ResolvedTo(COMPANION_GENERATION)] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK }
SUPER_TYPES:
FILE: [ResolvedTo(IMPORTS)] fromLocalHierarchyToOuter.kt
[ResolvedTo(RAW_FIR)] annotations container
public? open [ResolvedTo(RAW_FIR)] class TopLevelClass : R|kotlin/Any| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=TopLevelClass] constructor(): R|TopLevelClass| {
LAZY_super<R|kotlin/Any|>
}
public? open [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
public? open [ResolvedTo(RAW_FIR)] fun boo([ResolvedTo(RAW_FIR)] b: String): R|kotlin/Unit| { LAZY_BLOCK }
}
public? open [ResolvedTo(RAW_FIR)] class AnotherTopLevelClass : TopLevelClass {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnotherTopLevelClass] constructor(): R|AnotherTopLevelClass| {
LAZY_super<TopLevelClass>
}
public? open? override [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
}
public? final? [ResolvedTo(SUPER_TYPES)] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK }
TYPES:
FILE: [ResolvedTo(IMPORTS)] fromLocalHierarchyToOuter.kt
[ResolvedTo(RAW_FIR)] annotations container
public? open [ResolvedTo(RAW_FIR)] class TopLevelClass : R|kotlin/Any| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=TopLevelClass] constructor(): R|TopLevelClass| {
LAZY_super<R|kotlin/Any|>
}
public? open [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
public? open [ResolvedTo(RAW_FIR)] fun boo([ResolvedTo(RAW_FIR)] b: String): R|kotlin/Unit| { LAZY_BLOCK }
}
public? open [ResolvedTo(RAW_FIR)] class AnotherTopLevelClass : TopLevelClass {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnotherTopLevelClass] constructor(): R|AnotherTopLevelClass| {
LAZY_super<TopLevelClass>
}
public? open? override [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
}
public? final? [ResolvedTo(TYPES)] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK }
STATUS:
FILE: [ResolvedTo(IMPORTS)] fromLocalHierarchyToOuter.kt
[ResolvedTo(RAW_FIR)] annotations container
public? open [ResolvedTo(RAW_FIR)] class TopLevelClass : R|kotlin/Any| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=TopLevelClass] constructor(): R|TopLevelClass| {
LAZY_super<R|kotlin/Any|>
}
public? open [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
public? open [ResolvedTo(RAW_FIR)] fun boo([ResolvedTo(RAW_FIR)] b: String): R|kotlin/Unit| { LAZY_BLOCK }
}
public? open [ResolvedTo(RAW_FIR)] class AnotherTopLevelClass : TopLevelClass {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnotherTopLevelClass] constructor(): R|AnotherTopLevelClass| {
LAZY_super<TopLevelClass>
}
public? open? override [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
}
public final [ResolvedTo(STATUS)] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK }
EXPECT_ACTUAL_MATCHING:
FILE: [ResolvedTo(IMPORTS)] fromLocalHierarchyToOuter.kt
[ResolvedTo(RAW_FIR)] annotations container
public? open [ResolvedTo(RAW_FIR)] class TopLevelClass : R|kotlin/Any| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=TopLevelClass] constructor(): R|TopLevelClass| {
LAZY_super<R|kotlin/Any|>
}
public? open [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
public? open [ResolvedTo(RAW_FIR)] fun boo([ResolvedTo(RAW_FIR)] b: String): R|kotlin/Unit| { LAZY_BLOCK }
}
public? open [ResolvedTo(RAW_FIR)] class AnotherTopLevelClass : TopLevelClass {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnotherTopLevelClass] constructor(): R|AnotherTopLevelClass| {
LAZY_super<TopLevelClass>
}
public? open? override [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
}
public final [ResolvedTo(EXPECT_ACTUAL_MATCHING)] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK }
ARGUMENTS_OF_ANNOTATIONS:
FILE: [ResolvedTo(IMPORTS)] fromLocalHierarchyToOuter.kt
[ResolvedTo(RAW_FIR)] annotations container
public? open [ResolvedTo(RAW_FIR)] class TopLevelClass : R|kotlin/Any| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=TopLevelClass] constructor(): R|TopLevelClass| {
LAZY_super<R|kotlin/Any|>
}
public? open [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
public? open [ResolvedTo(RAW_FIR)] fun boo([ResolvedTo(RAW_FIR)] b: String): R|kotlin/Unit| { LAZY_BLOCK }
}
public? open [ResolvedTo(RAW_FIR)] class AnotherTopLevelClass : TopLevelClass {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnotherTopLevelClass] constructor(): R|AnotherTopLevelClass| {
LAZY_super<TopLevelClass>
}
public? open? override [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
}
public final [ResolvedTo(ARGUMENTS_OF_ANNOTATIONS)] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK }
CONTRACTS:
FILE: [ResolvedTo(IMPORTS)] fromLocalHierarchyToOuter.kt
[ResolvedTo(RAW_FIR)] annotations container
public? open [ResolvedTo(RAW_FIR)] class TopLevelClass : R|kotlin/Any| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=TopLevelClass] constructor(): R|TopLevelClass| {
LAZY_super<R|kotlin/Any|>
}
public? open [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
public? open [ResolvedTo(RAW_FIR)] fun boo([ResolvedTo(RAW_FIR)] b: String): R|kotlin/Unit| { LAZY_BLOCK }
}
public? open [ResolvedTo(RAW_FIR)] class AnotherTopLevelClass : TopLevelClass {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnotherTopLevelClass] constructor(): R|AnotherTopLevelClass| {
LAZY_super<TopLevelClass>
}
public? open? override [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
}
public final [ResolvedTo(CONTRACTS)] fun resolveMe(): R|kotlin/Unit| {
local open [ResolvedTo(RAW_FIR)] class LocalClass : AnotherTopLevelClass {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=LocalClass] constructor(): R|LocalClass| {
super<AnotherTopLevelClass>()
}
public? open? override [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| {
}
}
local final? [ResolvedTo(RAW_FIR)] class SecondLocalClass : LocalClass {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=SecondLocalClass] constructor(): R|SecondLocalClass| {
super<LocalClass>()
}
public? open? override [ResolvedTo(RAW_FIR)] fun boo([ResolvedTo(RAW_FIR)] b: String): R|kotlin/Unit| {
}
}
}
IMPLICIT_TYPES_BODY_RESOLVE:
FILE: [ResolvedTo(IMPORTS)] fromLocalHierarchyToOuter.kt
[ResolvedTo(RAW_FIR)] annotations container
public? open [ResolvedTo(RAW_FIR)] class TopLevelClass : R|kotlin/Any| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=TopLevelClass] constructor(): R|TopLevelClass| {
LAZY_super<R|kotlin/Any|>
}
public? open [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
public? open [ResolvedTo(RAW_FIR)] fun boo([ResolvedTo(RAW_FIR)] b: String): R|kotlin/Unit| { LAZY_BLOCK }
}
public? open [ResolvedTo(RAW_FIR)] class AnotherTopLevelClass : TopLevelClass {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnotherTopLevelClass] constructor(): R|AnotherTopLevelClass| {
LAZY_super<TopLevelClass>
}
public? open? override [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
}
public final [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] fun resolveMe(): R|kotlin/Unit| {
local open [ResolvedTo(RAW_FIR)] class LocalClass : AnotherTopLevelClass {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=LocalClass] constructor(): R|LocalClass| {
super<AnotherTopLevelClass>()
}
public? open? override [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| {
}
}
local final? [ResolvedTo(RAW_FIR)] class SecondLocalClass : LocalClass {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=SecondLocalClass] constructor(): R|SecondLocalClass| {
super<LocalClass>()
}
public? open? override [ResolvedTo(RAW_FIR)] fun boo([ResolvedTo(RAW_FIR)] b: String): R|kotlin/Unit| {
}
}
}
ANNOTATIONS_ARGUMENTS_MAPPING:
FILE: [ResolvedTo(IMPORTS)] fromLocalHierarchyToOuter.kt
[ResolvedTo(RAW_FIR)] annotations container
public? open [ResolvedTo(RAW_FIR)] class TopLevelClass : R|kotlin/Any| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=TopLevelClass] constructor(): R|TopLevelClass| {
LAZY_super<R|kotlin/Any|>
}
public? open [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
public? open [ResolvedTo(RAW_FIR)] fun boo([ResolvedTo(RAW_FIR)] b: String): R|kotlin/Unit| { LAZY_BLOCK }
}
public? open [ResolvedTo(RAW_FIR)] class AnotherTopLevelClass : TopLevelClass {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnotherTopLevelClass] constructor(): R|AnotherTopLevelClass| {
LAZY_super<TopLevelClass>
}
public? open? override [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| { LAZY_BLOCK }
}
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] fun resolveMe(): R|kotlin/Unit| {
local open [ResolvedTo(RAW_FIR)] class LocalClass : AnotherTopLevelClass {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=LocalClass] constructor(): R|LocalClass| {
super<AnotherTopLevelClass>()
}
public? open? override [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] i: Int): R|kotlin/Unit| {
}
}
local final? [ResolvedTo(RAW_FIR)] class SecondLocalClass : LocalClass {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=SecondLocalClass] constructor(): R|SecondLocalClass| {
super<LocalClass>()
}
public? open? override [ResolvedTo(RAW_FIR)] fun boo([ResolvedTo(RAW_FIR)] b: String): R|kotlin/Unit| {
}
}
}
BODY_RESOLVE:
FILE: [ResolvedTo(IMPORTS)] fromLocalHierarchyToOuter.kt
[ResolvedTo(RAW_FIR)] annotations container
public open [ResolvedTo(STATUS)] class TopLevelClass : R|kotlin/Any| {
public [ResolvedTo(STATUS)] [ContainingClassKey=TopLevelClass] constructor(): R|TopLevelClass| {
LAZY_super<R|kotlin/Any|>
}
public open [ResolvedTo(STATUS)] fun foo([ResolvedTo(STATUS)] i: R|kotlin/Int|): R|kotlin/Unit| { LAZY_BLOCK }
public open [ResolvedTo(STATUS)] fun boo([ResolvedTo(STATUS)] b: R|kotlin/String|): R|kotlin/Unit| { LAZY_BLOCK }
}
public open [ResolvedTo(STATUS)] class AnotherTopLevelClass : R|TopLevelClass| {
public [ResolvedTo(STATUS)] [ContainingClassKey=AnotherTopLevelClass] constructor(): R|AnotherTopLevelClass| {
LAZY_super<R|TopLevelClass|>
}
public open override [ResolvedTo(STATUS)] fun foo([ResolvedTo(STATUS)] i: R|kotlin/Int|): R|kotlin/Unit| { LAZY_BLOCK }
}
public final [ResolvedTo(BODY_RESOLVE)] fun resolveMe(): R|kotlin/Unit| {
local open [ResolvedTo(BODY_RESOLVE)] class LocalClass : R|AnotherTopLevelClass| {
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=LocalClass] constructor(): R|LocalClass| {
super<R|AnotherTopLevelClass|>()
}
public open override [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] i: R|kotlin/Int|): R|kotlin/Unit| {
}
}
local final [ResolvedTo(BODY_RESOLVE)] class SecondLocalClass : R|LocalClass| {
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=SecondLocalClass] constructor(): R|SecondLocalClass| {
super<R|LocalClass|>()
}
public open override [ResolvedTo(BODY_RESOLVE)] fun boo([ResolvedTo(BODY_RESOLVE)] b: R|kotlin/String|): R|kotlin/Unit| {
}
}
}
FILE RAW TO BODY:
FILE: [ResolvedTo(IMPORTS)] fromLocalHierarchyToOuter.kt
[ResolvedTo(BODY_RESOLVE)] annotations container
public open [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|kotlin/Any| {
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|TopLevelClass| {
super<R|kotlin/Any|>()
}
public open [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] i: R|kotlin/Int|): R|kotlin/Unit| {
}
public open [ResolvedTo(BODY_RESOLVE)] fun boo([ResolvedTo(BODY_RESOLVE)] b: R|kotlin/String|): R|kotlin/Unit| {
}
}
public open [ResolvedTo(BODY_RESOLVE)] class AnotherTopLevelClass : R|TopLevelClass| {
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=AnotherTopLevelClass] constructor(): R|AnotherTopLevelClass| {
super<R|TopLevelClass|>()
}
public open override [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] i: R|kotlin/Int|): R|kotlin/Unit| {
}
}
public final [ResolvedTo(BODY_RESOLVE)] fun resolveMe(): R|kotlin/Unit| {
local open [ResolvedTo(BODY_RESOLVE)] class LocalClass : R|AnotherTopLevelClass| {
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=LocalClass] constructor(): R|LocalClass| {
super<R|AnotherTopLevelClass|>()
}
public open override [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] i: R|kotlin/Int|): R|kotlin/Unit| {
}
}
local final [ResolvedTo(BODY_RESOLVE)] class SecondLocalClass : R|LocalClass| {
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=SecondLocalClass] constructor(): R|SecondLocalClass| {
super<R|LocalClass|>()
}
public open override [ResolvedTo(BODY_RESOLVE)] fun boo([ResolvedTo(BODY_RESOLVE)] b: R|kotlin/String|): R|kotlin/Unit| {
}
}
}
@@ -174,6 +174,12 @@ public class FirOutOfContentRootLazyDeclarationResolveTestGenerated extends Abst
runTest("analysis/low-level-api-fir/testdata/lazyResolve/fakePrimaryConstructor.kt");
}
@Test
@TestMetadata("fromLocalHierarchyToOuter.kt")
public void testFromLocalHierarchyToOuter() throws Exception {
runTest("analysis/low-level-api-fir/testdata/lazyResolve/fromLocalHierarchyToOuter.kt");
}
@Test
@TestMetadata("functionWithParameter.kt")
public void testFunctionWithParameter() throws Exception {
@@ -174,6 +174,12 @@ public class FirSourceLazyDeclarationResolveTestGenerated extends AbstractFirSou
runTest("analysis/low-level-api-fir/testdata/lazyResolve/fakePrimaryConstructor.kt");
}
@Test
@TestMetadata("fromLocalHierarchyToOuter.kt")
public void testFromLocalHierarchyToOuter() throws Exception {
runTest("analysis/low-level-api-fir/testdata/lazyResolve/fromLocalHierarchyToOuter.kt");
}
@Test
@TestMetadata("functionWithParameter.kt")
public void testFunctionWithParameter() throws Exception {
@@ -190,6 +190,8 @@ abstract class AbstractFirStatusResolveTransformer(
private val designationMapForLocalClasses: Map<FirClassLikeDeclaration, FirClassLikeDeclaration?>,
private val scopeForLocalClass: FirScope?
) : FirAbstractTreeTransformer<FirResolvedDeclarationStatus?>(phase = FirResolvePhase.STATUS) {
private val isTransformerForLocalDeclarations: Boolean get() = scopeForLocalClass != null
@PrivateForInline
val classes = mutableListOf<FirClass>()
val statusResolver = FirStatusResolver(session, scopeSession)
@@ -329,7 +331,12 @@ abstract class AbstractFirStatusResolveTransformer(
private fun forceResolveStatusOfCorrespondingClass(typeRef: FirTypeRef) {
val superClassSymbol = typeRef.coneType.toSymbol(session)
superClassSymbol?.lazyResolveToPhase(FirResolvePhase.STATUS.previous)
if (isTransformerForLocalDeclarations) {
superClassSymbol?.lazyResolveToPhase(FirResolvePhase.STATUS)
} else {
superClassSymbol?.lazyResolveToPhase(FirResolvePhase.STATUS.previous)
}
when (superClassSymbol) {
is FirRegularClassSymbol -> forceResolveStatusesOfClass(superClassSymbol.fir)
is FirTypeAliasSymbol -> forceResolveStatusOfCorrespondingClass(superClassSymbol.fir.expandedTypeRef)