From e5d5e5be441f492897e1d9edaf7a14bf7a932b35 Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Tue, 28 Sep 2021 15:06:28 +0300 Subject: [PATCH] [FIR] Reorder scopes for KT-34822 --- .../typeParameterVsNested.kt.rendered | 4 +-- .../typeParameterVsNested.rendered | 4 +-- .../resolve/typeParameterVsNested.fir.txt | 32 ++++++++++++------- .../testData/resolve/typeParameterVsNested.kt | 18 +++++++---- .../transformers/FirSupertypesResolution.kt | 2 +- .../transformers/FirTypeResolveTransformer.kt | 5 ++- ...sForClassAndTypeParameterWithSameFqName.kt | 1 - 7 files changed, 40 insertions(+), 26 deletions(-) diff --git a/analysis/analysis-api/testData/components/declarationRenderer/typeParameterVsNested.kt.rendered b/analysis/analysis-api/testData/components/declarationRenderer/typeParameterVsNested.kt.rendered index 16eb79a5e07..138f7e1ce63 100644 --- a/analysis/analysis-api/testData/components/declarationRenderer/typeParameterVsNested.kt.rendered +++ b/analysis/analysis-api/testData/components/declarationRenderer/typeParameterVsNested.kt.rendered @@ -1,8 +1,8 @@ interface Some abstract class My { open inner class T - abstract val x: My.T - abstract fun foo(arg: My.T) + abstract val x: T + abstract fun foo(arg: T) abstract val y: My.T abstract val z: My.T abstract class Some : My.T diff --git a/analysis/analysis-api/testData/components/declarationRenderer/typeParameterVsNested.rendered b/analysis/analysis-api/testData/components/declarationRenderer/typeParameterVsNested.rendered index 16eb79a5e07..138f7e1ce63 100644 --- a/analysis/analysis-api/testData/components/declarationRenderer/typeParameterVsNested.rendered +++ b/analysis/analysis-api/testData/components/declarationRenderer/typeParameterVsNested.rendered @@ -1,8 +1,8 @@ interface Some abstract class My { open inner class T - abstract val x: My.T - abstract fun foo(arg: My.T) + abstract val x: T + abstract fun foo(arg: T) abstract val y: My.T abstract val z: My.T abstract class Some : My.T diff --git a/compiler/fir/analysis-tests/testData/resolve/typeParameterVsNested.fir.txt b/compiler/fir/analysis-tests/testData/resolve/typeParameterVsNested.fir.txt index a59735cea2e..b37eebc8f4b 100644 --- a/compiler/fir/analysis-tests/testData/resolve/typeParameterVsNested.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/typeParameterVsNested.fir.txt @@ -1,32 +1,42 @@ FILE: typeParameterVsNested.kt public abstract interface Some : R|kotlin/Any| { + public open fun test(): R|kotlin/Int| { + ^test Int(10) + } + } public abstract class My : R|kotlin/Any| { public constructor(): R|test/My| { super() } - public final inner class T : R|kotlin/Any| { - public test/My.constructor(): R|test/My.T| { + public open class T : R|kotlin/Any| { + public constructor(): R|test/My.T| { super() } } - public abstract val x: R|test/My.T| - public get(): R|test/My.T| + public abstract val x: R|T| + public get(): R|T| - public abstract fun foo(arg: R|test/My.T|): R|kotlin/Unit| + public final fun foo(arg: R|T|): R|kotlin/Int| { + ^foo R|/arg|.R|test/Some.test|().R|kotlin/Int.plus|(this@R|test/My|.R|test/My.x|.R|test/Some.test|()) + } - public abstract val y: - public get(): + public abstract val y: R|test/My.T| + public get(): R|test/My.T| - public abstract val z: - public get(): + public abstract val z: R|test/My.T| + public get(): R|test/My.T| - public final class Some : { + public final fun boo(): R|kotlin/String| { + ^boo this@R|test/My|.R|test/My.y|.#().R|kotlin/plus|(this@R|test/My|.R|test/My.z|.#()) + } + + public final class Some : R|test/My.T| { public constructor(): R|test/My.Some| { - super|>() + super() } } diff --git a/compiler/fir/analysis-tests/testData/resolve/typeParameterVsNested.kt b/compiler/fir/analysis-tests/testData/resolve/typeParameterVsNested.kt index e8bc2326708..a9de0504d70 100644 --- a/compiler/fir/analysis-tests/testData/resolve/typeParameterVsNested.kt +++ b/compiler/fir/analysis-tests/testData/resolve/typeParameterVsNested.kt @@ -1,19 +1,25 @@ package test -interface Some +interface Some { + fun test() = 10 +} abstract class My { - inner class T + open class T abstract val x: T - abstract fun foo(arg: T) + // Wouldn't work for the inner class T + fun foo(arg: T) = arg.test() + x.test() - abstract val y: My.T + abstract val y: My.T - abstract val z: test.My.T + abstract val z: test.My.T - class Some : T() + // Would work for the type parameter T + fun boo() = y.test() + z.test() + + class Some : T() } abstract class Your : T diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt index a18aacefede..47fcbd3244b 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt @@ -172,7 +172,6 @@ private fun createScopesForNestedClasses( mutableListOf().apply { // Note: from higher priority to lower priority // See also: BodyResolveContext.withScopesForClass - addIfNotNull(klass.typeParametersScope()) addIfNotNull(session.nestedClassifierScope(klass)) val companionObjects = klass.declarations.filterIsInstance().filter { it.isCompanion } for (companionObject in companionObjects) { @@ -186,6 +185,7 @@ private fun createScopesForNestedClasses( it.lookupTag.getNestedClassifierScope(session, scopeSession) ?.wrapNestedClassifierScopeWithSubstitutionForSuperType(it, session) } + addIfNotNull(klass.typeParametersScope()) } fun FirRegularClass.resolveSupertypesInTheAir(session: FirSession): List { 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 27c4fb3fb52..951b1b8dc2f 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 @@ -249,16 +249,15 @@ open class FirTypeResolveTransformer( scopes.add(scope) } } + session.nestedClassifierScope(firClass)?.let(scopes::add) if (firClass is FirRegularClass) { - firClass.addTypeParametersScope() val companionObject = firClass.companionObject if (companionObject != null) { session.nestedClassifierScope(companionObject)?.let(scopes::add) } + firClass.addTypeParametersScope() } - session.nestedClassifierScope(firClass)?.let(scopes::add) - // Note that annotations are still visited here // again, although there's no need in it transformElement(firClass, data) diff --git a/compiler/testData/codegen/box/reflection/types/equalsForClassAndTypeParameterWithSameFqName.kt b/compiler/testData/codegen/box/reflection/types/equalsForClassAndTypeParameterWithSameFqName.kt index deeb33142ed..c026af31b3b 100644 --- a/compiler/testData/codegen/box/reflection/types/equalsForClassAndTypeParameterWithSameFqName.kt +++ b/compiler/testData/codegen/box/reflection/types/equalsForClassAndTypeParameterWithSameFqName.kt @@ -2,7 +2,6 @@ // WITH_REFLECT // FIR incorrectly resolves typeParameterType's return type to the nested class `A.T`. -// IGNORE_BACKEND_FIR: JVM_IR package test