From b617aca8ee7c94744d08b8e23d330428a341a24b Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 10 Aug 2021 11:39:28 +0300 Subject: [PATCH] FIR: fix scope order for super-type resolve #KT-48159 Fixed --- .../intellij/UastPatterns.fir.txt | 6 +++--- .../resolveWithStdlib/intellij/UastPatterns.kt | 4 ++-- .../transformers/FirSupertypesResolution.kt | 14 ++++++++------ 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/UastPatterns.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/UastPatterns.fir.txt index 4ffe3fcced3..bd86097e334 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/UastPatterns.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/UastPatterns.fir.txt @@ -6,7 +6,7 @@ FILE: UastPatterns.kt public abstract interface UReferenceExpression : R|UExpression| { } public final fun injectionHostOrReferenceExpression(): R|UExpressionPattern.Capture| { - ^injectionHostOrReferenceExpression R|/uExpression|().#( = filter@fun (it: R|UExpression|): R|kotlin/Boolean| { + ^injectionHostOrReferenceExpression R|/uExpression|().R|SubstitutionOverride|>|( = filter@fun (it: R|UExpression|): R|kotlin/Boolean| { ^ (R|/it| is R|UReferenceExpression|) } ) @@ -32,9 +32,9 @@ FILE: UastPatterns.kt super|>(R|/clazz|) } - public open class Capture : R|UExpressionPattern>| { + public open class Capture : R|UExpressionPattern>| { public constructor(clazz: R|java/lang/Class|): R|UExpressionPattern.Capture| { - super>|>(R|/clazz|) + super>|>(R|/clazz|) } } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/UastPatterns.kt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/UastPatterns.kt index 16d99039c48..01b777f97d3 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/UastPatterns.kt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/UastPatterns.kt @@ -23,7 +23,7 @@ interface UExpression : UElement interface UReferenceExpression : UExpression fun injectionHostOrReferenceExpression(): UExpressionPattern.Capture = - uExpression().filter { it is UReferenceExpression } + uExpression().filter { it is UReferenceExpression } fun uExpression(): UExpressionPattern.Capture = expressionCapture(UExpression::class.java) @@ -34,5 +34,5 @@ open class UElementPattern>(clazz: } open class UExpressionPattern>(clazz: Class) : UElementPattern(clazz) { - open class Capture(clazz: Class) : UExpressionPatternCapture>(clazz) + open class Capture(clazz: Class) : UExpressionPattern>(clazz) } \ No newline at end of file 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 916635b55f3..b8070e8a237 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 @@ -170,6 +170,14 @@ private fun createScopesForNestedClasses( supertypeComputationSession: SupertypeComputationSession ): Collection = 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) { + addIfNotNull(session.nestedClassifierScope(companionObject)) + } lookupSuperTypes( klass, lookupInterfaces = false, deep = true, substituteTypes = true, useSiteSession = session, @@ -178,12 +186,6 @@ private fun createScopesForNestedClasses( it.lookupTag.getNestedClassifierScope(session, scopeSession) ?.wrapNestedClassifierScopeWithSubstitutionForSuperType(it, session) } - addIfNotNull(klass.typeParametersScope()) - val companionObjects = klass.declarations.filterIsInstance().filter { it.isCompanion } - for (companionObject in companionObjects) { - addIfNotNull(session.nestedClassifierScope(companionObject)) - } - addIfNotNull(session.nestedClassifierScope(klass)) } fun FirRegularClass.resolveSupertypesInTheAir(session: FirSession): List {