[LL FIR] do not calculate constructors with classes during types phase

^KT-56551
This commit is contained in:
Dmitrii Gridin
2023-05-15 16:29:37 +02:00
committed by Space Team
parent 5b3f617378
commit e464af00db
33 changed files with 73 additions and 68 deletions
@@ -13,9 +13,11 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.util.checkPhase
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.checkReceiverTypeRefIsResolved
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.checkReturnTypeRefIsResolved
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.checkTypeRefIsResolved
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries
import org.jetbrains.kotlin.fir.FirElementWithResolveState
import org.jetbrains.kotlin.fir.FirFileAnnotationsContainer
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.PrivateForInline
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.FirTypeResolveTransformer
@@ -96,37 +98,32 @@ private class LLFirTypeTargetResolver(
transformer.withClassScopes(
firClass,
actionInsideStaticScope = {
resolveConstructors(firClass)
},
action = action,
)
}
}
private fun resolveConstructors(firClass: FirRegularClass): Unit = transformer.withScopeCleanup {
transformer.addTypeParametersScope(firClass)
for (member in firClass.declarations) {
if (member !is FirConstructor) continue
member.lazyResolveToPhase(resolverPhase.previous)
performCustomResolveUnderLock(member) {
// ConstructedTypeRef should be resolved only with type parameters, but not with nested classes and classes from supertypes
transformer.transformDelegatedConstructorCall(member)
transformer.withClassScopes(firClass) {
member.accept(transformer, null)
}
}
}
}
override fun doLazyResolveUnderLock(target: FirElementWithResolveState) {
when (target) {
is FirConstructor -> {
error("Should be resolved during ${::resolveConstructors.name}")
// ConstructedTypeRef should be resolved only with type parameters, but not with nested classes and classes from supertypes
val scopesBeforeContainingClass = transformer.scopesBefore
?: errorWithFirSpecificEntries("The containing class scope is not found", fir = target)
@OptIn(PrivateForInline::class)
transformer.withScopeCleanup {
val clazz = transformer.classDeclarationsStack.last()
if (!transformer.removeOuterTypeParameterScope(clazz)) {
transformer.scopes = scopesBeforeContainingClass
} else {
transformer.scopes = transformer.staticScopes
transformer.addTypeParametersScope(clazz)
}
transformer.transformDelegatedConstructorCall(target)
}
target.accept(transformer, null)
}
is FirDanglingModifierList, is FirFileAnnotationsContainer, is FirCallableDeclaration, is FirTypeAlias, is FirScript -> {
target.accept(transformer, null)
@@ -222,7 +222,7 @@ FILE: [ResolvedTo(IMPORTS)] annotationParameters.kt
}
public? final? [ResolvedTo(TYPES)] class B : R|kotlin/Any| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=B] constructor(): R|B| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=B] constructor(): R|B| {
LAZY_super<R|kotlin/Any|>
}
@@ -97,7 +97,7 @@ TYPES:
FILE: [ResolvedTo(IMPORTS)] classMembers.kt
[ResolvedTo(BODY_RESOLVE)] annotations container
public? final? [ResolvedTo(TYPES)] class A : R|kotlin/Any| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=A] constructor(): R|A| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=A] constructor(): R|A| {
LAZY_super<R|kotlin/Any|>
}
@@ -77,7 +77,7 @@ TYPES:
FILE: [ResolvedTo(IMPORTS)] functionInValueClass.kt
[ResolvedTo(BODY_RESOLVE)] annotations container
@R|kotlin/jvm/JvmInline|[Types]() public? final? inline [ResolvedTo(TYPES)] class Value : R|kotlin/Any| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=Value] constructor([ResolvedTo(TYPES)] [CorrespondingProperty=/Value.value] value: R|kotlin/Int|): R|Value| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Value] constructor([ResolvedTo(RAW_FIR)] [CorrespondingProperty=/Value.value] value: Int): R|Value| {
LAZY_super<R|kotlin/Any|>
}
@@ -391,7 +391,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass2.kt
}
public? abstract [ResolvedTo(TYPES)] class OuterClass : R|Foo1| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| {
LAZY_super<<implicit>>
}
@@ -391,7 +391,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass3.kt
}
public? abstract [ResolvedTo(TYPES)] class OuterClass : R|Foo1| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| {
LAZY_super<<implicit>>
}
@@ -391,7 +391,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass4.kt
}
public? abstract [ResolvedTo(TYPES)] class OuterClass : R|Foo1| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| {
LAZY_super<<implicit>>
}
@@ -159,8 +159,8 @@ FILE: [ResolvedTo(IMPORTS)] nestedClass.kt
}
public? final? [ResolvedTo(TYPES)] class OuterClass : R|AnotherTopLevelClass| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| {
LAZY_super<R|AnotherTopLevelClass|>
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| {
LAZY_super<AnotherTopLevelClass>
}
public? final? [ResolvedTo(TYPES)] class NestedClass : R|kotlin/Any| {
@@ -542,7 +542,7 @@ FILE: [ResolvedTo(IMPORTS)] complexRedeclaration.kt
}
public? final? [ResolvedTo(TYPES)] object B : R|kotlin/Any| {
private [ResolvedTo(TYPES)] [ContainingClassKey=B] constructor(): R|B| {
private [ResolvedTo(RAW_FIR)] [ContainingClassKey=B] constructor(): R|B| {
LAZY_super<R|kotlin/Any|>
}
@@ -112,7 +112,7 @@ TYPES:
FILE: [ResolvedTo(IMPORTS)] dataClassCopy.kt
[ResolvedTo(BODY_RESOLVE)] annotations container
public? final? data [ResolvedTo(TYPES)] class DataClass : R|kotlin/Any| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=DataClass] constructor([ResolvedTo(TYPES)] [CorrespondingProperty=one/DataClass.i] i: R|kotlin/Int|, [ResolvedTo(TYPES)] [CorrespondingProperty=one/DataClass.b] b: R|kotlin/Boolean|): R|one/DataClass| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=DataClass] constructor([ResolvedTo(RAW_FIR)] [CorrespondingProperty=one/DataClass.i] i: Int, [ResolvedTo(RAW_FIR)] [CorrespondingProperty=one/DataClass.b] b: Boolean): R|one/DataClass| {
LAZY_super<R|kotlin/Any|>
}
@@ -112,7 +112,7 @@ TYPES:
FILE: [ResolvedTo(IMPORTS)] dataComponent2.kt
[ResolvedTo(BODY_RESOLVE)] annotations container
public? final? data [ResolvedTo(TYPES)] class DataClass : R|kotlin/Any| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=DataClass] constructor([ResolvedTo(TYPES)] [CorrespondingProperty=one/DataClass.i] i: R|kotlin/Int|, [ResolvedTo(TYPES)] [CorrespondingProperty=one/DataClass.b] b: R|kotlin/Boolean|): R|one/DataClass| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=DataClass] constructor([ResolvedTo(RAW_FIR)] [CorrespondingProperty=one/DataClass.i] i: Int, [ResolvedTo(RAW_FIR)] [CorrespondingProperty=one/DataClass.b] b: Boolean): R|one/DataClass| {
LAZY_super<R|kotlin/Any|>
}
@@ -132,7 +132,7 @@ FILE: [ResolvedTo(IMPORTS)] delegatedField.kt
}
public? final? [ResolvedTo(TYPES)] [DelegateFieldsMapKey={0=FirFieldSymbol one/Usage.$$delegate_0}] class Usage : R|one/Foo| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=Usage] constructor([ResolvedTo(TYPES)] prop: R|one/Foo|): R|one/Usage| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Usage] constructor([ResolvedTo(RAW_FIR)] prop: Foo): R|one/Usage| {
LAZY_super<<implicit>>
}
@@ -102,7 +102,7 @@ TYPES:
FILE: [ResolvedTo(IMPORTS)] enumEntries.kt
[ResolvedTo(BODY_RESOLVE)] annotations container
public? final? [ResolvedTo(TYPES)] enum class MyEnum : R|kotlin/Enum<one/MyEnum>| {
private [ResolvedTo(TYPES)] [ContainingClassKey=MyEnum] constructor(): R|one/MyEnum| {
private [ResolvedTo(RAW_FIR)] [ContainingClassKey=MyEnum] constructor(): R|one/MyEnum| {
LAZY_super<R|kotlin/Enum<one/MyEnum>|>
}
@@ -138,7 +138,7 @@ FILE: [ResolvedTo(IMPORTS)] enumEntry.kt
}
public? final? [ResolvedTo(TYPES)] enum class Foo : R|kotlin/Enum<Foo>| {
private [ResolvedTo(TYPES)] [ContainingClassKey=Foo] constructor(): R|Foo| {
private [ResolvedTo(RAW_FIR)] [ContainingClassKey=Foo] constructor(): R|Foo| {
LAZY_super<R|kotlin/Enum<Foo>|>
}
@@ -102,7 +102,7 @@ TYPES:
FILE: [ResolvedTo(IMPORTS)] enumValueOf.kt
[ResolvedTo(BODY_RESOLVE)] annotations container
public? final? [ResolvedTo(TYPES)] enum class MyEnum : R|kotlin/Enum<one/MyEnum>| {
private [ResolvedTo(TYPES)] [ContainingClassKey=MyEnum] constructor(): R|one/MyEnum| {
private [ResolvedTo(RAW_FIR)] [ContainingClassKey=MyEnum] constructor(): R|one/MyEnum| {
LAZY_super<R|kotlin/Enum<one/MyEnum>|>
}
@@ -102,7 +102,7 @@ TYPES:
FILE: [ResolvedTo(IMPORTS)] enumValues.kt
[ResolvedTo(BODY_RESOLVE)] annotations container
public? final? [ResolvedTo(TYPES)] enum class MyEnum : R|kotlin/Enum<one/MyEnum>| {
private [ResolvedTo(TYPES)] [ContainingClassKey=MyEnum] constructor(): R|one/MyEnum| {
private [ResolvedTo(RAW_FIR)] [ContainingClassKey=MyEnum] constructor(): R|one/MyEnum| {
LAZY_super<R|kotlin/Enum<one/MyEnum>|>
}
@@ -170,7 +170,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverride.kt
}
public? abstract [ResolvedTo(TYPES)] class Usage : R|Foo2| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=Usage] constructor(): R|Usage| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Usage] constructor(): R|Usage| {
LAZY_super<<implicit>>
}
@@ -391,7 +391,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass.kt
}
public? abstract [ResolvedTo(TYPES)] class OuterClass : R|Foo1| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| {
LAZY_super<<implicit>>
}
@@ -405,7 +405,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass.kt
}
public? abstract [ResolvedTo(TYPES)] class NestedClass : R|Foo2| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=NestedClass] constructor(): R|OuterClass.NestedClass| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=NestedClass] constructor(): R|OuterClass.NestedClass| {
LAZY_super<<implicit>>
}
@@ -391,7 +391,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass2.kt
}
public? abstract [ResolvedTo(TYPES)] class OuterClass : R|Foo1| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| {
LAZY_super<<implicit>>
}
@@ -414,8 +414,8 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass2.kt
}
public? abstract [ResolvedTo(TYPES)] class AnotherNestedClass : R|OuterClass.NestedClass| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=AnotherNestedClass] constructor(): R|OuterClass.AnotherNestedClass| {
LAZY_super<R|OuterClass.NestedClass|>
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnotherNestedClass] constructor(): R|OuterClass.AnotherNestedClass| {
LAZY_super<NestedClass>
}
public? open? override [ResolvedTo(TYPES)] fun bar([ResolvedTo(TYPES)] s: R|kotlin/String|): R|kotlin/Unit| { LAZY_BLOCK }
@@ -391,12 +391,12 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass3.kt
}
public? abstract [ResolvedTo(TYPES)] class OuterClass : R|Foo1| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| {
LAZY_super<<implicit>>
}
public? final? [ResolvedTo(TYPES)] class SimpleNestedClass : R|kotlin/Any| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=SimpleNestedClass] constructor(): R|OuterClass.SimpleNestedClass| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=SimpleNestedClass] constructor(): R|OuterClass.SimpleNestedClass| {
LAZY_super<R|kotlin/Any|>
}
@@ -161,7 +161,7 @@ FILE: [ResolvedTo(IMPORTS)] lazyProperty.kt
public? final? [ResolvedTo(RAW_FIR)] fun getAny(): Any? { LAZY_BLOCK }
public? final? [ResolvedTo(RAW_FIR)] fun <[ResolvedTo(RAW_FIR)] Q> materialize(): Q { LAZY_BLOCK }
public? final? [ResolvedTo(TYPES)] class Test : R|kotlin/Any| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=Test] constructor(): R|Test| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Test] constructor(): R|Test| {
LAZY_super<R|kotlin/Any|>
}
@@ -68,7 +68,7 @@ FILE: [ResolvedTo(IMPORTS)] localConstructor.kt
[ResolvedTo(BODY_RESOLVE)] annotations container
public? final? [ResolvedTo(RAW_FIR)] fun <[ResolvedTo(RAW_FIR)] T> magic(): T { LAZY_BLOCK }
public? final? [ResolvedTo(TYPES)] class Q : R|kotlin/Any| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=Q] constructor(): R|Q| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Q] constructor(): R|Q| {
LAZY_super<R|kotlin/Any|>
}
@@ -321,7 +321,7 @@ FILE: [ResolvedTo(IMPORTS)] nestedCompilerRequiredAnnotationsForMember.kt
}
@R|kotlin/Deprecated|[Types](String(FirstClass)) @R|Anno|[Types](LAZY_EXPRESSION) public? final? [ResolvedTo(TYPES)] class FirstClass : R|kotlin/Any| {
@R|kotlin/Deprecated|[Types](String(constructor)) @R|Anno|[Types](LAZY_EXPRESSION) public? [ResolvedTo(TYPES)] [ContainingClassKey=FirstClass] constructor([ResolvedTo(TYPES)] [CorrespondingProperty=/FirstClass.a] @R|Anno|[Types](LAZY_EXPRESSION) a: R|kotlin/Int|): R|FirstClass| {
@Deprecated[Unresolved](LAZY_EXPRESSION) @Anno[Unresolved](LAZY_EXPRESSION) public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=FirstClass] constructor([ResolvedTo(RAW_FIR)] [CorrespondingProperty=/FirstClass.a] @Deprecated[Unresolved](LAZY_EXPRESSION) @Anno[Unresolved](LAZY_EXPRESSION) a: Int): R|FirstClass| {
LAZY_super<R|kotlin/Any|>
}
@@ -334,7 +334,7 @@ FILE: [ResolvedTo(IMPORTS)] nestedCompilerRequiredAnnotationsForMember.kt
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=FirstClass] get(): <implicit>
@R|kotlin/Deprecated|[Types](String(NestedClass)) @R|Anno|[Types](LAZY_EXPRESSION) public? final? [ResolvedTo(TYPES)] class NestedClass : R|kotlin/Any| {
@R|kotlin/Deprecated|[Types](String(constructor)) @R|Anno|[Types](LAZY_EXPRESSION) public? [ResolvedTo(TYPES)] [ContainingClassKey=NestedClass] constructor([ResolvedTo(TYPES)] [CorrespondingProperty=/FirstClass.NestedClass.a] @R|Anno|[Types](LAZY_EXPRESSION) a: R|kotlin/Int|): R|FirstClass.NestedClass| {
@Deprecated[Unresolved](LAZY_EXPRESSION) @Anno[Unresolved](LAZY_EXPRESSION) public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=NestedClass] constructor([ResolvedTo(RAW_FIR)] [CorrespondingProperty=/FirstClass.NestedClass.a] @Deprecated[Unresolved](LAZY_EXPRESSION) @Anno[Unresolved](LAZY_EXPRESSION) a: Int): R|FirstClass.NestedClass| {
LAZY_super<R|kotlin/Any|>
}
@@ -157,8 +157,8 @@ TYPES:
FILE: [ResolvedTo(IMPORTS)] nestedTypeAlias.kt
[ResolvedTo(BODY_RESOLVE)] annotations container
public? final? [ResolvedTo(TYPES)] class OuterClass<[ResolvedTo(TYPES)] T1> : R|SuperForOuter| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=OuterClass] constructor<[ResolvedTo(TYPES)] T1>(): R|OuterClass<T1>| {
LAZY_super<R|SuperForOuter|>
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=OuterClass] constructor<[ResolvedTo(TYPES)] T1>(): R|OuterClass<T1>| {
LAZY_super<SuperForOuter>
}
public? final? [ResolvedTo(SUPER_TYPES)] class NestedClass<[ResolvedTo(SUPER_TYPES)] T2> : R|Another| {
@@ -72,7 +72,7 @@ TYPES:
FILE: [ResolvedTo(IMPORTS)] parameterOfNonLocalSetter.kt
[ResolvedTo(BODY_RESOLVE)] annotations container
public? final? [ResolvedTo(TYPES)] class X : R|kotlin/Any| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=X] constructor(): R|X| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=X] constructor(): R|X| {
LAZY_super<R|kotlin/Any|>
}
@@ -185,7 +185,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverride.kt
}
public? abstract [ResolvedTo(TYPES)] class Usage : R|Foo2| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=Usage] constructor(): R|Usage| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Usage] constructor(): R|Usage| {
LAZY_super<<implicit>>
}
@@ -406,7 +406,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass.kt
}
public? abstract [ResolvedTo(TYPES)] class OuterClass : R|Foo1| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| {
LAZY_super<<implicit>>
}
@@ -406,7 +406,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass2.kt
}
public? abstract [ResolvedTo(TYPES)] class OuterClass : R|Foo1| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| {
LAZY_super<<implicit>>
}
@@ -420,7 +420,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass2.kt
}
public? abstract [ResolvedTo(TYPES)] class NestedClass : R|Foo2| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=NestedClass] constructor(): R|OuterClass.NestedClass| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=NestedClass] constructor(): R|OuterClass.NestedClass| {
LAZY_super<<implicit>>
}
@@ -406,12 +406,12 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass3.kt
}
public? abstract [ResolvedTo(TYPES)] class OuterClass : R|Foo1| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| {
LAZY_super<<implicit>>
}
public? final? [ResolvedTo(TYPES)] class SimpleNestedClass : R|kotlin/Any| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=SimpleNestedClass] constructor(): R|OuterClass.SimpleNestedClass| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=SimpleNestedClass] constructor(): R|OuterClass.SimpleNestedClass| {
LAZY_super<R|kotlin/Any|>
}
@@ -421,7 +421,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass4.kt
}
public? abstract [ResolvedTo(TYPES)] class OuterClass : R|Foo1| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| {
LAZY_super<<implicit>>
}
@@ -447,8 +447,8 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass4.kt
}
public? abstract [ResolvedTo(TYPES)] class AnotherNestedClass : R|OuterClass.NestedClass| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=AnotherNestedClass] constructor(): R|OuterClass.AnotherNestedClass| {
LAZY_super<R|OuterClass.NestedClass|>
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnotherNestedClass] constructor(): R|OuterClass.AnotherNestedClass| {
LAZY_super<NestedClass>
}
public? open? override [ResolvedTo(RAW_FIR)] fun bar([ResolvedTo(RAW_FIR)] s: String): R|kotlin/Unit| { LAZY_BLOCK }
@@ -102,7 +102,7 @@ TYPES:
FILE: [ResolvedTo(IMPORTS)] secondaryConstructorParameter.kt
[ResolvedTo(BODY_RESOLVE)] annotations container
public? final? [ResolvedTo(TYPES)] class A : R|kotlin/Any| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=A] constructor([ResolvedTo(TYPES)] [CorrespondingProperty=/A.prop] prop: R|kotlin/Int| = LAZY_EXPRESSION, [ResolvedTo(TYPES)] c: R|kotlin/String|): R|A| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=A] constructor([ResolvedTo(RAW_FIR)] [CorrespondingProperty=/A.prop] prop: Int = LAZY_EXPRESSION, [ResolvedTo(RAW_FIR)] c: String): R|A| {
LAZY_super<R|kotlin/Any|>
}
@@ -62,7 +62,7 @@ TYPES:
FILE: [ResolvedTo(IMPORTS)] typeParameterOfNonLocalFunction.kt
[ResolvedTo(BODY_RESOLVE)] annotations container
public? final? [ResolvedTo(TYPES)] class X : R|kotlin/Any| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=X] constructor(): R|X| {
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=X] constructor(): R|X| {
LAZY_super<R|kotlin/Any|>
}
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.resolve.transformers
import kotlinx.collections.immutable.PersistentList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toPersistentList
import org.jetbrains.kotlin.KtFakeSourceElementKind
@@ -76,6 +77,9 @@ open class FirTypeResolveTransformer(
@PrivateForInline
var staticScopes = scopes
@set:PrivateForInline
var scopesBefore: PersistentList<FirScope>? = null
private var currentDeclaration: FirDeclaration? = null
private inline fun <T> withDeclaration(declaration: FirDeclaration, crossinline action: () -> T): T {
@@ -366,12 +370,14 @@ open class FirTypeResolveTransformer(
}
inline fun <T> withScopeCleanup(crossinline l: () -> T): T {
val scopesBefore = scopes
val scopesBeforeSnapshot = scopes
scopesBefore = scopesBeforeSnapshot
val staticScopesBefore = staticScopes
val result = l()
scopes = scopesBefore
scopes = scopesBeforeSnapshot
staticScopes = staticScopesBefore
return result
@@ -406,13 +412,15 @@ open class FirTypeResolveTransformer(
constructor.delegatedConstructor?.let(this::resolveConstructedTypeRefForDelegatedConstructorCall)
}
fun removeOuterTypeParameterScope(firClass: FirClass): Boolean = !firClass.isInner && !firClass.isLocal
inline fun <R> withClassScopes(
firClass: FirClass,
crossinline actionInsideStaticScope: () -> Unit = {},
crossinline action: () -> R,
): R = withScopeCleanup {
// Remove type parameter scopes for classes that are neither inner nor local
if (!firClass.isInner && !firClass.isLocal) {
if (removeOuterTypeParameterScope(firClass)) {
this.scopes = staticScopes
}