[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.checkReceiverTypeRefIsResolved
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.checkReturnTypeRefIsResolved 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.checkTypeRefIsResolved
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries
import org.jetbrains.kotlin.fir.FirElementWithResolveState import org.jetbrains.kotlin.fir.FirElementWithResolveState
import org.jetbrains.kotlin.fir.FirFileAnnotationsContainer import org.jetbrains.kotlin.fir.FirFileAnnotationsContainer
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.PrivateForInline
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.FirTypeResolveTransformer import org.jetbrains.kotlin.fir.resolve.transformers.FirTypeResolveTransformer
@@ -96,37 +98,32 @@ private class LLFirTypeTargetResolver(
transformer.withClassScopes( transformer.withClassScopes(
firClass, firClass,
actionInsideStaticScope = {
resolveConstructors(firClass)
},
action = action, 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) { override fun doLazyResolveUnderLock(target: FirElementWithResolveState) {
when (target) { when (target) {
is FirConstructor -> { 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 -> { is FirDanglingModifierList, is FirFileAnnotationsContainer, is FirCallableDeclaration, is FirTypeAlias, is FirScript -> {
target.accept(transformer, null) target.accept(transformer, null)
@@ -222,7 +222,7 @@ FILE: [ResolvedTo(IMPORTS)] annotationParameters.kt
} }
public? final? [ResolvedTo(TYPES)] class B : R|kotlin/Any| { 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|> LAZY_super<R|kotlin/Any|>
} }
@@ -97,7 +97,7 @@ TYPES:
FILE: [ResolvedTo(IMPORTS)] classMembers.kt FILE: [ResolvedTo(IMPORTS)] classMembers.kt
[ResolvedTo(BODY_RESOLVE)] annotations container [ResolvedTo(BODY_RESOLVE)] annotations container
public? final? [ResolvedTo(TYPES)] class A : R|kotlin/Any| { 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|> LAZY_super<R|kotlin/Any|>
} }
@@ -77,7 +77,7 @@ TYPES:
FILE: [ResolvedTo(IMPORTS)] functionInValueClass.kt FILE: [ResolvedTo(IMPORTS)] functionInValueClass.kt
[ResolvedTo(BODY_RESOLVE)] annotations container [ResolvedTo(BODY_RESOLVE)] annotations container
@R|kotlin/jvm/JvmInline|[Types]() public? final? inline [ResolvedTo(TYPES)] class Value : R|kotlin/Any| { @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|> LAZY_super<R|kotlin/Any|>
} }
@@ -391,7 +391,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass2.kt
} }
public? abstract [ResolvedTo(TYPES)] class OuterClass : R|Foo1| { 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>> LAZY_super<<implicit>>
} }
@@ -391,7 +391,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass3.kt
} }
public? abstract [ResolvedTo(TYPES)] class OuterClass : R|Foo1| { 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>> LAZY_super<<implicit>>
} }
@@ -391,7 +391,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass4.kt
} }
public? abstract [ResolvedTo(TYPES)] class OuterClass : R|Foo1| { 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>> LAZY_super<<implicit>>
} }
@@ -159,8 +159,8 @@ FILE: [ResolvedTo(IMPORTS)] nestedClass.kt
} }
public? final? [ResolvedTo(TYPES)] class OuterClass : R|AnotherTopLevelClass| { public? final? [ResolvedTo(TYPES)] class OuterClass : R|AnotherTopLevelClass| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| { public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| {
LAZY_super<R|AnotherTopLevelClass|> LAZY_super<AnotherTopLevelClass>
} }
public? final? [ResolvedTo(TYPES)] class NestedClass : R|kotlin/Any| { 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| { 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|> LAZY_super<R|kotlin/Any|>
} }
@@ -112,7 +112,7 @@ TYPES:
FILE: [ResolvedTo(IMPORTS)] dataClassCopy.kt FILE: [ResolvedTo(IMPORTS)] dataClassCopy.kt
[ResolvedTo(BODY_RESOLVE)] annotations container [ResolvedTo(BODY_RESOLVE)] annotations container
public? final? data [ResolvedTo(TYPES)] class DataClass : R|kotlin/Any| { 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|> LAZY_super<R|kotlin/Any|>
} }
@@ -112,7 +112,7 @@ TYPES:
FILE: [ResolvedTo(IMPORTS)] dataComponent2.kt FILE: [ResolvedTo(IMPORTS)] dataComponent2.kt
[ResolvedTo(BODY_RESOLVE)] annotations container [ResolvedTo(BODY_RESOLVE)] annotations container
public? final? data [ResolvedTo(TYPES)] class DataClass : R|kotlin/Any| { 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|> 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? 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>> LAZY_super<<implicit>>
} }
@@ -102,7 +102,7 @@ TYPES:
FILE: [ResolvedTo(IMPORTS)] enumEntries.kt FILE: [ResolvedTo(IMPORTS)] enumEntries.kt
[ResolvedTo(BODY_RESOLVE)] annotations container [ResolvedTo(BODY_RESOLVE)] annotations container
public? final? [ResolvedTo(TYPES)] enum class MyEnum : R|kotlin/Enum<one/MyEnum>| { 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>|> 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>| { 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>|> LAZY_super<R|kotlin/Enum<Foo>|>
} }
@@ -102,7 +102,7 @@ TYPES:
FILE: [ResolvedTo(IMPORTS)] enumValueOf.kt FILE: [ResolvedTo(IMPORTS)] enumValueOf.kt
[ResolvedTo(BODY_RESOLVE)] annotations container [ResolvedTo(BODY_RESOLVE)] annotations container
public? final? [ResolvedTo(TYPES)] enum class MyEnum : R|kotlin/Enum<one/MyEnum>| { 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>|> LAZY_super<R|kotlin/Enum<one/MyEnum>|>
} }
@@ -102,7 +102,7 @@ TYPES:
FILE: [ResolvedTo(IMPORTS)] enumValues.kt FILE: [ResolvedTo(IMPORTS)] enumValues.kt
[ResolvedTo(BODY_RESOLVE)] annotations container [ResolvedTo(BODY_RESOLVE)] annotations container
public? final? [ResolvedTo(TYPES)] enum class MyEnum : R|kotlin/Enum<one/MyEnum>| { 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>|> 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? 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>> LAZY_super<<implicit>>
} }
@@ -391,7 +391,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass.kt
} }
public? abstract [ResolvedTo(TYPES)] class OuterClass : R|Foo1| { 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>> LAZY_super<<implicit>>
} }
@@ -405,7 +405,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass.kt
} }
public? abstract [ResolvedTo(TYPES)] class NestedClass : R|Foo2| { 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>> LAZY_super<<implicit>>
} }
@@ -391,7 +391,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass2.kt
} }
public? abstract [ResolvedTo(TYPES)] class OuterClass : R|Foo1| { 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>> LAZY_super<<implicit>>
} }
@@ -414,8 +414,8 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass2.kt
} }
public? abstract [ResolvedTo(TYPES)] class AnotherNestedClass : R|OuterClass.NestedClass| { public? abstract [ResolvedTo(TYPES)] class AnotherNestedClass : R|OuterClass.NestedClass| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=AnotherNestedClass] constructor(): R|OuterClass.AnotherNestedClass| { public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnotherNestedClass] constructor(): R|OuterClass.AnotherNestedClass| {
LAZY_super<R|OuterClass.NestedClass|> LAZY_super<NestedClass>
} }
public? open? override [ResolvedTo(TYPES)] fun bar([ResolvedTo(TYPES)] s: R|kotlin/String|): R|kotlin/Unit| { LAZY_BLOCK } 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? 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>> LAZY_super<<implicit>>
} }
public? final? [ResolvedTo(TYPES)] class SimpleNestedClass : R|kotlin/Any| { 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|> 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 getAny(): Any? { LAZY_BLOCK }
public? final? [ResolvedTo(RAW_FIR)] fun <[ResolvedTo(RAW_FIR)] Q> materialize(): Q { 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? 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|> LAZY_super<R|kotlin/Any|>
} }
@@ -68,7 +68,7 @@ FILE: [ResolvedTo(IMPORTS)] localConstructor.kt
[ResolvedTo(BODY_RESOLVE)] annotations container [ResolvedTo(BODY_RESOLVE)] annotations container
public? final? [ResolvedTo(RAW_FIR)] fun <[ResolvedTo(RAW_FIR)] T> magic(): T { LAZY_BLOCK } public? final? [ResolvedTo(RAW_FIR)] fun <[ResolvedTo(RAW_FIR)] T> magic(): T { LAZY_BLOCK }
public? final? [ResolvedTo(TYPES)] class Q : R|kotlin/Any| { 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|> 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(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|> LAZY_super<R|kotlin/Any|>
} }
@@ -334,7 +334,7 @@ FILE: [ResolvedTo(IMPORTS)] nestedCompilerRequiredAnnotationsForMember.kt
public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=FirstClass] get(): <implicit> 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(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|> LAZY_super<R|kotlin/Any|>
} }
@@ -157,8 +157,8 @@ TYPES:
FILE: [ResolvedTo(IMPORTS)] nestedTypeAlias.kt FILE: [ResolvedTo(IMPORTS)] nestedTypeAlias.kt
[ResolvedTo(BODY_RESOLVE)] annotations container [ResolvedTo(BODY_RESOLVE)] annotations container
public? final? [ResolvedTo(TYPES)] class OuterClass<[ResolvedTo(TYPES)] T1> : R|SuperForOuter| { public? final? [ResolvedTo(TYPES)] class OuterClass<[ResolvedTo(TYPES)] T1> : R|SuperForOuter| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=OuterClass] constructor<[ResolvedTo(TYPES)] T1>(): R|OuterClass<T1>| { public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=OuterClass] constructor<[ResolvedTo(TYPES)] T1>(): R|OuterClass<T1>| {
LAZY_super<R|SuperForOuter|> LAZY_super<SuperForOuter>
} }
public? final? [ResolvedTo(SUPER_TYPES)] class NestedClass<[ResolvedTo(SUPER_TYPES)] T2> : R|Another| { public? final? [ResolvedTo(SUPER_TYPES)] class NestedClass<[ResolvedTo(SUPER_TYPES)] T2> : R|Another| {
@@ -72,7 +72,7 @@ TYPES:
FILE: [ResolvedTo(IMPORTS)] parameterOfNonLocalSetter.kt FILE: [ResolvedTo(IMPORTS)] parameterOfNonLocalSetter.kt
[ResolvedTo(BODY_RESOLVE)] annotations container [ResolvedTo(BODY_RESOLVE)] annotations container
public? final? [ResolvedTo(TYPES)] class X : R|kotlin/Any| { 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|> LAZY_super<R|kotlin/Any|>
} }
@@ -185,7 +185,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverride.kt
} }
public? abstract [ResolvedTo(TYPES)] class Usage : R|Foo2| { 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>> LAZY_super<<implicit>>
} }
@@ -406,7 +406,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass.kt
} }
public? abstract [ResolvedTo(TYPES)] class OuterClass : R|Foo1| { 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>> LAZY_super<<implicit>>
} }
@@ -406,7 +406,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass2.kt
} }
public? abstract [ResolvedTo(TYPES)] class OuterClass : R|Foo1| { 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>> LAZY_super<<implicit>>
} }
@@ -420,7 +420,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass2.kt
} }
public? abstract [ResolvedTo(TYPES)] class NestedClass : R|Foo2| { 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>> LAZY_super<<implicit>>
} }
@@ -406,12 +406,12 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass3.kt
} }
public? abstract [ResolvedTo(TYPES)] class OuterClass : R|Foo1| { 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>> LAZY_super<<implicit>>
} }
public? final? [ResolvedTo(TYPES)] class SimpleNestedClass : R|kotlin/Any| { 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|> LAZY_super<R|kotlin/Any|>
} }
@@ -421,7 +421,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass4.kt
} }
public? abstract [ResolvedTo(TYPES)] class OuterClass : R|Foo1| { 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>> LAZY_super<<implicit>>
} }
@@ -447,8 +447,8 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass4.kt
} }
public? abstract [ResolvedTo(TYPES)] class AnotherNestedClass : R|OuterClass.NestedClass| { public? abstract [ResolvedTo(TYPES)] class AnotherNestedClass : R|OuterClass.NestedClass| {
public? [ResolvedTo(TYPES)] [ContainingClassKey=AnotherNestedClass] constructor(): R|OuterClass.AnotherNestedClass| { public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnotherNestedClass] constructor(): R|OuterClass.AnotherNestedClass| {
LAZY_super<R|OuterClass.NestedClass|> LAZY_super<NestedClass>
} }
public? open? override [ResolvedTo(RAW_FIR)] fun bar([ResolvedTo(RAW_FIR)] s: String): R|kotlin/Unit| { LAZY_BLOCK } 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 FILE: [ResolvedTo(IMPORTS)] secondaryConstructorParameter.kt
[ResolvedTo(BODY_RESOLVE)] annotations container [ResolvedTo(BODY_RESOLVE)] annotations container
public? final? [ResolvedTo(TYPES)] class A : R|kotlin/Any| { 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|> LAZY_super<R|kotlin/Any|>
} }
@@ -62,7 +62,7 @@ TYPES:
FILE: [ResolvedTo(IMPORTS)] typeParameterOfNonLocalFunction.kt FILE: [ResolvedTo(IMPORTS)] typeParameterOfNonLocalFunction.kt
[ResolvedTo(BODY_RESOLVE)] annotations container [ResolvedTo(BODY_RESOLVE)] annotations container
public? final? [ResolvedTo(TYPES)] class X : R|kotlin/Any| { 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|> LAZY_super<R|kotlin/Any|>
} }
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.resolve.transformers package org.jetbrains.kotlin.fir.resolve.transformers
import kotlinx.collections.immutable.PersistentList
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toPersistentList import kotlinx.collections.immutable.toPersistentList
import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.KtFakeSourceElementKind
@@ -76,6 +77,9 @@ open class FirTypeResolveTransformer(
@PrivateForInline @PrivateForInline
var staticScopes = scopes var staticScopes = scopes
@set:PrivateForInline
var scopesBefore: PersistentList<FirScope>? = null
private var currentDeclaration: FirDeclaration? = null private var currentDeclaration: FirDeclaration? = null
private inline fun <T> withDeclaration(declaration: FirDeclaration, crossinline action: () -> T): T { 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 { inline fun <T> withScopeCleanup(crossinline l: () -> T): T {
val scopesBefore = scopes val scopesBeforeSnapshot = scopes
scopesBefore = scopesBeforeSnapshot
val staticScopesBefore = staticScopes val staticScopesBefore = staticScopes
val result = l() val result = l()
scopes = scopesBefore scopes = scopesBeforeSnapshot
staticScopes = staticScopesBefore staticScopes = staticScopesBefore
return result return result
@@ -406,13 +412,15 @@ open class FirTypeResolveTransformer(
constructor.delegatedConstructor?.let(this::resolveConstructedTypeRefForDelegatedConstructorCall) constructor.delegatedConstructor?.let(this::resolveConstructedTypeRefForDelegatedConstructorCall)
} }
fun removeOuterTypeParameterScope(firClass: FirClass): Boolean = !firClass.isInner && !firClass.isLocal
inline fun <R> withClassScopes( inline fun <R> withClassScopes(
firClass: FirClass, firClass: FirClass,
crossinline actionInsideStaticScope: () -> Unit = {}, crossinline actionInsideStaticScope: () -> Unit = {},
crossinline action: () -> R, crossinline action: () -> R,
): R = withScopeCleanup { ): R = withScopeCleanup {
// Remove type parameter scopes for classes that are neither inner nor local // Remove type parameter scopes for classes that are neither inner nor local
if (!firClass.isInner && !firClass.isLocal) { if (removeOuterTypeParameterScope(firClass)) {
this.scopes = staticScopes this.scopes = staticScopes
} }