From e464af00db043fabf67eed85d5727d30e2d8243a Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Mon, 15 May 2023 16:29:37 +0200 Subject: [PATCH] [LL FIR] do not calculate constructors with classes during types phase ^KT-56551 --- .../fir/transformers/LLFirTypeLazyResolver.kt | 43 +++++++++---------- .../lazyResolve/annotationParameters.txt | 2 +- .../testdata/lazyResolve/classMembers.txt | 2 +- .../classes/functionInValueClass.txt | 2 +- .../hierarchyWithOverrideAndNestedClass2.txt | 2 +- .../hierarchyWithOverrideAndNestedClass3.txt | 2 +- .../hierarchyWithOverrideAndNestedClass4.txt | 2 +- .../lazyResolve/classes/nestedClass.txt | 4 +- .../lazyResolve/complexRedeclaration.txt | 2 +- .../testdata/lazyResolve/dataClassCopy.txt | 2 +- .../testdata/lazyResolve/dataComponent2.txt | 2 +- .../testdata/lazyResolve/delegatedField.txt | 2 +- .../testdata/lazyResolve/enumEntries.txt | 2 +- .../testdata/lazyResolve/enumEntry.txt | 2 +- .../testdata/lazyResolve/enumValueOf.txt | 2 +- .../testdata/lazyResolve/enumValues.txt | 2 +- .../functions/hierarchyWithOverride.txt | 2 +- .../hierarchyWithOverrideAndNestedClass.txt | 4 +- .../hierarchyWithOverrideAndNestedClass2.txt | 6 +-- .../hierarchyWithOverrideAndNestedClass3.txt | 4 +- .../testdata/lazyResolve/lazyProperty.txt | 2 +- .../testdata/lazyResolve/localConstructor.txt | 2 +- ...edCompilerRequiredAnnotationsForMember.txt | 4 +- .../testdata/lazyResolve/nestedTypeAlias.txt | 4 +- .../lazyResolve/parameterOfNonLocalSetter.txt | 2 +- .../properties/hierarchyWithOverride.txt | 2 +- .../hierarchyWithOverrideAndNestedClass.txt | 2 +- .../hierarchyWithOverrideAndNestedClass2.txt | 4 +- .../hierarchyWithOverrideAndNestedClass3.txt | 4 +- .../hierarchyWithOverrideAndNestedClass4.txt | 6 +-- .../secondaryConstructorParameter.txt | 2 +- .../typeParameterOfNonLocalFunction.txt | 2 +- .../transformers/FirTypeResolveTransformer.kt | 14 ++++-- 33 files changed, 73 insertions(+), 68 deletions(-) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirTypeLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirTypeLazyResolver.kt index df5f8659534..771941f4579 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirTypeLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirTypeLazyResolver.kt @@ -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) diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/annotationParameters.txt b/analysis/low-level-api-fir/testdata/lazyResolve/annotationParameters.txt index 96223d66faf..22dba68bdf6 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/annotationParameters.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/annotationParameters.txt @@ -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 } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/classMembers.txt b/analysis/low-level-api-fir/testdata/lazyResolve/classMembers.txt index 697b202e785..31381c33e62 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/classMembers.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/classMembers.txt @@ -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 } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/classes/functionInValueClass.txt b/analysis/low-level-api-fir/testdata/lazyResolve/classes/functionInValueClass.txt index 56a068c88e0..55beb77dd85 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/classes/functionInValueClass.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/classes/functionInValueClass.txt @@ -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 } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass2.txt b/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass2.txt index 0d98f527f01..e18621a2f21 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass2.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass2.txt @@ -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<> } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass3.txt b/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass3.txt index 650f237ee94..9f2d4bae651 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass3.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass3.txt @@ -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<> } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass4.txt b/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass4.txt index bd7c75ae61f..59abe2fcb4e 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass4.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass4.txt @@ -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<> } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/classes/nestedClass.txt b/analysis/low-level-api-fir/testdata/lazyResolve/classes/nestedClass.txt index 179ed1383f6..b9e152a59c5 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/classes/nestedClass.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/classes/nestedClass.txt @@ -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 + public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=OuterClass] constructor(): R|OuterClass| { + LAZY_super } public? final? [ResolvedTo(TYPES)] class NestedClass : R|kotlin/Any| { diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/complexRedeclaration.txt b/analysis/low-level-api-fir/testdata/lazyResolve/complexRedeclaration.txt index 57400cc236d..a240c22c211 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/complexRedeclaration.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/complexRedeclaration.txt @@ -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 } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/dataClassCopy.txt b/analysis/low-level-api-fir/testdata/lazyResolve/dataClassCopy.txt index 39300076d42..dd9d380bb07 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/dataClassCopy.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/dataClassCopy.txt @@ -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 } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/dataComponent2.txt b/analysis/low-level-api-fir/testdata/lazyResolve/dataComponent2.txt index 444fc41d529..e9352ae73e8 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/dataComponent2.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/dataComponent2.txt @@ -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 } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/delegatedField.txt b/analysis/low-level-api-fir/testdata/lazyResolve/delegatedField.txt index 24119940480..0f87233baba 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/delegatedField.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/delegatedField.txt @@ -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<> } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/enumEntries.txt b/analysis/low-level-api-fir/testdata/lazyResolve/enumEntries.txt index 5d96b9423e1..f137096ed3d 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/enumEntries.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/enumEntries.txt @@ -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| { - private [ResolvedTo(TYPES)] [ContainingClassKey=MyEnum] constructor(): R|one/MyEnum| { + private [ResolvedTo(RAW_FIR)] [ContainingClassKey=MyEnum] constructor(): R|one/MyEnum| { LAZY_super|> } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/enumEntry.txt b/analysis/low-level-api-fir/testdata/lazyResolve/enumEntry.txt index 53fdfd7f3a5..dec8897bb31 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/enumEntry.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/enumEntry.txt @@ -138,7 +138,7 @@ FILE: [ResolvedTo(IMPORTS)] enumEntry.kt } public? final? [ResolvedTo(TYPES)] enum class Foo : R|kotlin/Enum| { - private [ResolvedTo(TYPES)] [ContainingClassKey=Foo] constructor(): R|Foo| { + private [ResolvedTo(RAW_FIR)] [ContainingClassKey=Foo] constructor(): R|Foo| { LAZY_super|> } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/enumValueOf.txt b/analysis/low-level-api-fir/testdata/lazyResolve/enumValueOf.txt index 64e03e32217..c07781bf447 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/enumValueOf.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/enumValueOf.txt @@ -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| { - private [ResolvedTo(TYPES)] [ContainingClassKey=MyEnum] constructor(): R|one/MyEnum| { + private [ResolvedTo(RAW_FIR)] [ContainingClassKey=MyEnum] constructor(): R|one/MyEnum| { LAZY_super|> } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/enumValues.txt b/analysis/low-level-api-fir/testdata/lazyResolve/enumValues.txt index 81a7dfe4453..8042e2c4841 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/enumValues.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/enumValues.txt @@ -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| { - private [ResolvedTo(TYPES)] [ContainingClassKey=MyEnum] constructor(): R|one/MyEnum| { + private [ResolvedTo(RAW_FIR)] [ContainingClassKey=MyEnum] constructor(): R|one/MyEnum| { LAZY_super|> } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/functions/hierarchyWithOverride.txt b/analysis/low-level-api-fir/testdata/lazyResolve/functions/hierarchyWithOverride.txt index 0cc0be1bad5..0ae9716801f 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/functions/hierarchyWithOverride.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/functions/hierarchyWithOverride.txt @@ -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<> } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/functions/hierarchyWithOverrideAndNestedClass.txt b/analysis/low-level-api-fir/testdata/lazyResolve/functions/hierarchyWithOverrideAndNestedClass.txt index b90d361e4cb..37a044e1dc4 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/functions/hierarchyWithOverrideAndNestedClass.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/functions/hierarchyWithOverrideAndNestedClass.txt @@ -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<> } @@ -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<> } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/functions/hierarchyWithOverrideAndNestedClass2.txt b/analysis/low-level-api-fir/testdata/lazyResolve/functions/hierarchyWithOverrideAndNestedClass2.txt index 083ef93b722..5d16a5d73ef 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/functions/hierarchyWithOverrideAndNestedClass2.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/functions/hierarchyWithOverrideAndNestedClass2.txt @@ -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<> } @@ -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 + public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnotherNestedClass] constructor(): R|OuterClass.AnotherNestedClass| { + LAZY_super } public? open? override [ResolvedTo(TYPES)] fun bar([ResolvedTo(TYPES)] s: R|kotlin/String|): R|kotlin/Unit| { LAZY_BLOCK } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/functions/hierarchyWithOverrideAndNestedClass3.txt b/analysis/low-level-api-fir/testdata/lazyResolve/functions/hierarchyWithOverrideAndNestedClass3.txt index 60f74c7cc60..94d735ec368 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/functions/hierarchyWithOverrideAndNestedClass3.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/functions/hierarchyWithOverrideAndNestedClass3.txt @@ -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<> } 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 } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/lazyProperty.txt b/analysis/low-level-api-fir/testdata/lazyResolve/lazyProperty.txt index 8bc653b64c9..c5ee88a33d6 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/lazyProperty.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/lazyProperty.txt @@ -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 } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/localConstructor.txt b/analysis/low-level-api-fir/testdata/lazyResolve/localConstructor.txt index edfe72a2ee3..e33b3fff4cb 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/localConstructor.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/localConstructor.txt @@ -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 } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/nestedCompilerRequiredAnnotationsForMember.txt b/analysis/low-level-api-fir/testdata/lazyResolve/nestedCompilerRequiredAnnotationsForMember.txt index 8253f112093..10a479ae58c 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/nestedCompilerRequiredAnnotationsForMember.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/nestedCompilerRequiredAnnotationsForMember.txt @@ -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 } @@ -334,7 +334,7 @@ FILE: [ResolvedTo(IMPORTS)] nestedCompilerRequiredAnnotationsForMember.kt public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=FirstClass] get(): @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 } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/nestedTypeAlias.txt b/analysis/low-level-api-fir/testdata/lazyResolve/nestedTypeAlias.txt index 4778e3a2aab..f31dcdca571 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/nestedTypeAlias.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/nestedTypeAlias.txt @@ -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| { - LAZY_super + public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=OuterClass] constructor<[ResolvedTo(TYPES)] T1>(): R|OuterClass| { + LAZY_super } public? final? [ResolvedTo(SUPER_TYPES)] class NestedClass<[ResolvedTo(SUPER_TYPES)] T2> : R|Another| { diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/parameterOfNonLocalSetter.txt b/analysis/low-level-api-fir/testdata/lazyResolve/parameterOfNonLocalSetter.txt index 2be432ff658..f3362404ac0 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/parameterOfNonLocalSetter.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/parameterOfNonLocalSetter.txt @@ -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 } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/properties/hierarchyWithOverride.txt b/analysis/low-level-api-fir/testdata/lazyResolve/properties/hierarchyWithOverride.txt index 1854c310ec7..51e75e3714e 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/properties/hierarchyWithOverride.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/properties/hierarchyWithOverride.txt @@ -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<> } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/properties/hierarchyWithOverrideAndNestedClass.txt b/analysis/low-level-api-fir/testdata/lazyResolve/properties/hierarchyWithOverrideAndNestedClass.txt index 3d2e6bfd342..8975c18a9a6 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/properties/hierarchyWithOverrideAndNestedClass.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/properties/hierarchyWithOverrideAndNestedClass.txt @@ -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<> } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/properties/hierarchyWithOverrideAndNestedClass2.txt b/analysis/low-level-api-fir/testdata/lazyResolve/properties/hierarchyWithOverrideAndNestedClass2.txt index dcb2d4cbbd3..f993a445b27 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/properties/hierarchyWithOverrideAndNestedClass2.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/properties/hierarchyWithOverrideAndNestedClass2.txt @@ -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<> } @@ -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<> } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/properties/hierarchyWithOverrideAndNestedClass3.txt b/analysis/low-level-api-fir/testdata/lazyResolve/properties/hierarchyWithOverrideAndNestedClass3.txt index fbe533136bb..fc80372f975 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/properties/hierarchyWithOverrideAndNestedClass3.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/properties/hierarchyWithOverrideAndNestedClass3.txt @@ -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<> } 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 } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/properties/hierarchyWithOverrideAndNestedClass4.txt b/analysis/low-level-api-fir/testdata/lazyResolve/properties/hierarchyWithOverrideAndNestedClass4.txt index 750ee988259..45513af0f97 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/properties/hierarchyWithOverrideAndNestedClass4.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/properties/hierarchyWithOverrideAndNestedClass4.txt @@ -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<> } @@ -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 + public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnotherNestedClass] constructor(): R|OuterClass.AnotherNestedClass| { + LAZY_super } public? open? override [ResolvedTo(RAW_FIR)] fun bar([ResolvedTo(RAW_FIR)] s: String): R|kotlin/Unit| { LAZY_BLOCK } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/secondaryConstructorParameter.txt b/analysis/low-level-api-fir/testdata/lazyResolve/secondaryConstructorParameter.txt index 7a44fd07426..176d149ced7 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/secondaryConstructorParameter.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/secondaryConstructorParameter.txt @@ -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 } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/typeParameterOfNonLocalFunction.txt b/analysis/low-level-api-fir/testdata/lazyResolve/typeParameterOfNonLocalFunction.txt index 23aa949a4fc..d1cd255c1b1 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/typeParameterOfNonLocalFunction.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/typeParameterOfNonLocalFunction.txt @@ -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 } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt index 57807aab87d..5d9b53033f1 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt @@ -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? = null + private var currentDeclaration: FirDeclaration? = null private inline fun withDeclaration(declaration: FirDeclaration, crossinline action: () -> T): T { @@ -366,12 +370,14 @@ open class FirTypeResolveTransformer( } inline fun 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 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 }