From 5f641a255237bea4e91745e2b048d15e6ee804f4 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 16 Oct 2020 11:21:57 +0300 Subject: [PATCH] [FIR] Add wrapping scopes with forced calculator in checkers and fir2ir --- .../jetbrains/kotlin/fir/java/JavaClassRendering.kt | 2 +- .../kotlin/fir/analysis/checkers/FirHelpers.kt | 3 ++- .../declaration/FirTypeMismatchOnOverrideChecker.kt | 3 ++- .../jetbrains/kotlin/fir/backend/ConversionUtils.kt | 4 ++-- .../backend/generators/CallAndReferenceGenerator.kt | 2 +- .../backend/generators/DataClassMembersGenerator.kt | 6 +++++- .../backend/generators/DelegatedMemberGenerator.kt | 2 +- .../fir/backend/generators/FakeOverrideGenerator.kt | 2 +- .../org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt | 2 +- .../kotlin/fir/resolve/scopes/JvmMappedScopes.kt | 2 +- .../src/org/jetbrains/kotlin/fir/FirCallResolver.kt | 6 +++++- .../src/org/jetbrains/kotlin/fir/SessionUtils.kt | 2 +- .../jetbrains/kotlin/fir/resolve/SamResolution.kt | 3 +-- .../kotlin/fir/resolve/inference/InferenceUtils.kt | 6 +++++- .../kotlin/fir/scopes/KotlinScopeProvider.kt | 12 +++++++++--- .../fir/scopes/impl/FirAbstractImportingScope.kt | 2 +- .../api/fir/components/KtFirScopeProvider.kt | 6 +++++- .../KtFirSymbolDeclarationOverridesProvider.kt | 5 +++-- 18 files changed, 47 insertions(+), 23 deletions(-) diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/java/JavaClassRendering.kt b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/java/JavaClassRendering.kt index 0d23b6e1da8..c8684c2d4aa 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/java/JavaClassRendering.kt +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/java/JavaClassRendering.kt @@ -19,7 +19,7 @@ import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol fun renderJavaClass(renderer: FirRenderer, javaClass: FirJavaClass, session: FirSession) { - val memberScope = javaClass.unsubstitutedScope(session, ScopeSession()) + val memberScope = javaClass.unsubstitutedScope(session, ScopeSession(), withForcedTypeCalculator = true) val staticScope = javaClass.scopeProvider.getStaticScope(javaClass, session, ScopeSession()) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt index 3b746b0ea3e..e56d444a223 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt @@ -208,7 +208,8 @@ fun FirSimpleFunction.overriddenFunctions( ): List> { val firTypeScope = containingClass.unsubstitutedScope( context.sessionHolder.session, - context.sessionHolder.scopeSession + context.sessionHolder.scopeSession, + withForcedTypeCalculator = true ) val overriddenFunctions = mutableListOf>() diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTypeMismatchOnOverrideChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTypeMismatchOnOverrideChecker.kt index 905f62362d1..318fa8af947 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTypeMismatchOnOverrideChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTypeMismatchOnOverrideChecker.kt @@ -36,7 +36,8 @@ object FirTypeMismatchOnOverrideChecker : FirRegularClassChecker() { val firTypeScope = declaration.unsubstitutedScope( context.sessionHolder.session, - context.sessionHolder.scopeSession + context.sessionHolder.scopeSession, + withForcedTypeCalculator = true ) for (it in declaration.declarations) { diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt index 93545c16f54..8d2569620c5 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt @@ -230,7 +230,7 @@ internal fun FirSimpleFunction.generateOverriddenFunctionSymbols( scopeSession: ScopeSession, declarationStorage: Fir2IrDeclarationStorage ): List { - val scope = containingClass.unsubstitutedScope(session, scopeSession) + val scope = containingClass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true) scope.processFunctionsByName(name) {} val overriddenSet = mutableSetOf() scope.processDirectlyOverriddenFunctions(symbol) { @@ -251,7 +251,7 @@ internal fun FirProperty.generateOverriddenAccessorSymbols( scopeSession: ScopeSession, declarationStorage: Fir2IrDeclarationStorage ): List { - val scope = containingClass.unsubstitutedScope(session, scopeSession) + val scope = containingClass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true) scope.processPropertiesByName(name) {} val overriddenSet = mutableSetOf() scope.processDirectlyOverriddenProperties(symbol) { diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt index 0aff3e65e62..679da0f4dc7 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt @@ -368,7 +368,7 @@ class CallAndReferenceGenerator( // Fallback for FirReferencePlaceholderForResolvedAnnotations from jar val fir = coneType.lookupTag.toSymbol(session)?.fir as? FirClass<*> var constructorSymbol: FirConstructorSymbol? = null - fir?.unsubstitutedScope(session, scopeSession)?.processDeclaredConstructors { + fir?.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true)?.processDeclaredConstructors { if (it.fir.isPrimary && constructorSymbol == null) { constructorSymbol = it } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DataClassMembersGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DataClassMembersGenerator.kt index db7c12f43d4..ac1e6109934 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DataClassMembersGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DataClassMembersGenerator.kt @@ -146,7 +146,11 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) { @OptIn(ExperimentalStdlibApi::class) buildMap { for (name in listOf(equalsName, hashCodeName, toStringName)) { - klass.unsubstitutedScope(components.session, components.scopeSession).processFunctionsByName(name) { + klass.unsubstitutedScope( + components.session, + components.scopeSession, + withForcedTypeCalculator = true + ).processFunctionsByName(name) { val declaration = it.fir if (declaration is FirSimpleFunction && declaration.matchesDataClassSyntheticMemberSignatures diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt index d993986d86d..96adcdbf1b5 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt @@ -36,7 +36,7 @@ internal class DelegatedMemberGenerator( fun generate(irField: IrField, firField: FirField, firSubClass: FirClass<*>, subClass: IrClass) { val subClassLookupTag = firSubClass.symbol.toLookupTag() - val subClassScope = firSubClass.unsubstitutedScope(session, scopeSession) + val subClassScope = firSubClass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true) subClassScope.processAllFunctions { functionSymbol -> if (functionSymbol !is FirNamedFunctionSymbol) return@processAllFunctions diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt index 5bbe95254e7..48a7faf6033 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt @@ -73,7 +73,7 @@ class FakeOverrideGenerator( fun IrClass.getFakeOverrides(klass: FirClass<*>, realDeclarations: Collection): List { val result = mutableListOf() - val useSiteMemberScope = klass.unsubstitutedScope(session, scopeSession) + val useSiteMemberScope = klass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true) val superTypesCallableNames = useSiteMemberScope.getCallableNames() val realDeclarationSymbols = realDeclarations.filterIsInstance>().mapTo(mutableSetOf(), FirSymbolOwner<*>::symbol) for (name in superTypesCallableNames) { diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt index a66767db5ab..ce10f5017a9 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt @@ -123,7 +123,7 @@ class Fir2IrLazyClass( val processedNames = mutableSetOf() // NB: it's necessary to take all callables from scope, // e.g. to avoid accessing un-enhanced Java declarations with FirJavaTypeRef etc. inside - val scope = fir.unsubstitutedScope(session, scopeSession) + val scope = fir.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true) scope.processDeclaredConstructors { result += declarationStorage.getIrConstructorSymbol(it).owner } diff --git a/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/scopes/JvmMappedScopes.kt b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/scopes/JvmMappedScopes.kt index b5e5e070426..14bc65f7aa6 100644 --- a/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/scopes/JvmMappedScopes.kt +++ b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/scopes/JvmMappedScopes.kt @@ -35,7 +35,7 @@ fun wrapScopeWithJvmMapped( ?: return declaredMemberScope val preparedSignatures = JvmMappedScope.prepareSignatures(javaClass) return if (preparedSignatures.isNotEmpty()) { - javaClass.unsubstitutedScope(useSiteSession, scopeSession).let { javaClassUseSiteScope -> + javaClass.unsubstitutedScope(useSiteSession, scopeSession, withForcedTypeCalculator = false).let { javaClassUseSiteScope -> val jvmMappedScope = JvmMappedScope(declaredMemberScope, javaClassUseSiteScope, preparedSignatures) if (klass !is FirRegularClass) { jvmMappedScope diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt index c8585e51d52..b2055ff62aa 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt @@ -386,7 +386,11 @@ class FirCallResolver( callInfo: CallInfo ): ResolutionResult? { var constructorSymbol: FirConstructorSymbol? = null - annotationClassSymbol.fir.unsubstitutedScope(session, components.scopeSession).processDeclaredConstructors { + annotationClassSymbol.fir.unsubstitutedScope( + session, + components.scopeSession, + withForcedTypeCalculator = false + ).processDeclaredConstructors { if (it.fir.isPrimary && constructorSymbol == null) { constructorSymbol = it } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/SessionUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/SessionUtils.kt index 642351c70b4..fd31dc34384 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/SessionUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/SessionUtils.kt @@ -29,7 +29,7 @@ fun FirSimpleFunction.lowestVisibilityAmongOverrides( session: FirSession, scopeSession: ScopeSession ): Visibility { - val firTypeScope = containingClass.unsubstitutedScope(session, scopeSession) + val firTypeScope = containingClass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = false) var visibility = visibility // required; otherwise processOverriddenFunctions() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt index fc3258dd4e3..31482813a43 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.fir.resolve import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.FirSessionComponent import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParameterBuilder import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction @@ -260,7 +259,7 @@ private fun FirRegularClass.findSingleAbstractMethodByNames( var resultMethod: FirSimpleFunction? = null var metIncorrectMember = false - val classUseSiteMemberScope = this.unsubstitutedScope(session, scopeSession) + val classUseSiteMemberScope = this.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = false) for (candidateName in samCandidateNames) { if (metIncorrectMember) break diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceUtils.kt index abdcd9e1ce6..8622e283300 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceUtils.kt @@ -85,7 +85,11 @@ fun ConeClassLikeType.findBaseInvokeSymbol(session: FirSession, scopeSession: Sc require(this.isBuiltinFunctionalType(session)) val functionN = (lookupTag.toSymbol(session)?.fir as? FirClass<*>) ?: return null var baseInvokeSymbol: FirFunctionSymbol<*>? = null - functionN.unsubstitutedScope(session, scopeSession).processFunctionsByName(OperatorNameConventions.INVOKE) { functionSymbol -> + functionN.unsubstitutedScope( + session, + scopeSession, + withForcedTypeCalculator = false + ).processFunctionsByName(OperatorNameConventions.INVOKE) { functionSymbol -> baseInvokeSymbol = functionSymbol return@processFunctionsByName } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/KotlinScopeProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/KotlinScopeProvider.kt index c96a0d1dc2e..30e6d7dc0b8 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/KotlinScopeProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/KotlinScopeProvider.kt @@ -96,8 +96,14 @@ data class ConeSubstitutionScopeKey( data class DelegatedMemberScopeKey(val callableId: CallableId) : ScopeSessionKey() -fun FirClass<*>.unsubstitutedScope(useSiteSession: FirSession, scopeSession: ScopeSession): FirTypeScope { - return scopeProvider.getUseSiteMemberScope(this, useSiteSession, scopeSession) +fun FirClass<*>.unsubstitutedScope( + useSiteSession: FirSession, + scopeSession: ScopeSession, + withForcedTypeCalculator: Boolean +): FirTypeScope { + val scope = scopeProvider.getUseSiteMemberScope(this, useSiteSession, scopeSession) + if (withForcedTypeCalculator) return FirScopeWithFakeOverrideTypeCalculator(scope, FakeOverrideTypeCalculator.Forced) + return scope } fun FirClass<*>.scopeForClass( @@ -143,7 +149,7 @@ private fun FirClass<*>.scopeForClassImpl( containingClassForAdditionalMembers: ConeClassLikeLookupTag, isFromExpectClass: Boolean ): FirTypeScope { - val basicScope = unsubstitutedScope(useSiteSession, scopeSession) + val basicScope = unsubstitutedScope(useSiteSession, scopeSession, withForcedTypeCalculator = false) if (substitutor == ConeSubstitutor.Empty) return basicScope return scopeSession.getOrBuild( diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractImportingScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractImportingScope.kt index 4b837b826e6..4111f925e23 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractImportingScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractImportingScope.kt @@ -38,7 +38,7 @@ abstract class FirAbstractImportingScope( val firClass = (symbol as FirClassSymbol<*>).fir return if (firClass.classKind == ClassKind.OBJECT) - FirObjectImportedCallableScope(classId, firClass.unsubstitutedScope(session, scopeSession)) + FirObjectImportedCallableScope(classId, firClass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = false)) else firClass.scopeProvider.getStaticScope(firClass, session, scopeSession) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt index ec865f90436..9dc76b862b9 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt @@ -59,7 +59,11 @@ internal class KtFirScopeProvider( val firScope = classSymbol.firRef.withFir(FirResolvePhase.SUPER_TYPES) { fir -> val firSession = fir.session - fir.unsubstitutedScope(firSession, firResolveState.firTransformerProvider.getScopeSession(firSession)) + fir.unsubstitutedScope( + firSession, + firResolveState.firTransformerProvider.getScopeSession(firSession), + withForcedTypeCalculator = false + ) }.also(firScopeStorage::register) KtFirMemberScope(classSymbol, firScope, token, builder) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt index e553e176071..edf229da4a4 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt @@ -49,7 +49,8 @@ internal class KtFirSymbolDeclarationOverridesProvider( val firTypeScope = containingDeclaration.unsubstitutedScope( containingDeclaration.session, - ScopeSession() + ScopeSession(), + withForcedTypeCalculator = false ) val overriddenElement = mutableSetOf() @@ -64,4 +65,4 @@ internal class KtFirSymbolDeclarationOverridesProvider( } } } -} \ No newline at end of file +}