From 2c3fe8b8ec30801177de86cf8b408d9c94bc13f5 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 26 Jun 2020 16:10:02 +0300 Subject: [PATCH] [FIR] Cleanup FIR modules. Part 7 (`scopes` package) --- .../kotlin/fir/scopes/KotlinScopeProvider.kt | 14 ++++----- .../org/jetbrains/kotlin/fir/scopes/Scopes.kt | 1 - .../scopes/impl/FirClassSubstitutionScope.kt | 14 ++++++--- .../scopes/impl/FirClassUseSiteMemberScope.kt | 3 -- .../impl/FirDeclaredMemberScopeProvider.kt | 1 - .../impl/FirExplicitSimpleImportingScope.kt | 1 - .../scopes/impl/FirIntegerLiteralTypeScope.kt | 5 ++- .../fir/scopes/impl/FirIntegerOperatorCall.kt | 2 +- .../impl/FirLazyNestedClassifierScope.kt | 1 - .../kotlin/fir/scopes/impl/FirLocalScope.kt | 10 ++---- .../impl/FirMemberTypeParameterScope.kt | 6 ++-- .../scopes/impl/FirNestedClassifierScope.kt | 1 - .../fir/scopes/impl/FirPackageMemberScope.kt | 8 ++--- .../scopes/impl/FirStandardOverrideChecker.kt | 4 +-- .../kotlin/fir/scopes/impl/FirStaticScope.kt | 13 ++------ .../scopes/impl/FirTypeIntersectionScope.kt | 31 ++++++------------- 16 files changed, 41 insertions(+), 74 deletions(-) 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 338fa48bbe5..9753e15419f 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 @@ -26,14 +26,6 @@ class KotlinScopeProvider( scopeSession: ScopeSession ) -> FirScope = { _, declaredMemberScope, _, _ -> declaredMemberScope } ) : FirScopeProvider() { - - - private fun substitutor(symbol: FirRegularClassSymbol, type: ConeClassLikeType, useSiteSession: FirSession): ConeSubstitutor { - if (type.typeArguments.isEmpty()) return ConeSubstitutor.Empty - val originalSubstitution = createSubstitution(symbol.fir.typeParameters, type.typeArguments, useSiteSession) - return substitutorByMap(originalSubstitution) - } - override fun getUseSiteMemberScope( klass: FirClass<*>, useSiteSession: FirSession, @@ -69,6 +61,12 @@ class KotlinScopeProvider( } } + private fun substitutor(symbol: FirRegularClassSymbol, type: ConeClassLikeType, useSiteSession: FirSession): ConeSubstitutor { + if (type.typeArguments.isEmpty()) return ConeSubstitutor.Empty + val originalSubstitution = createSubstitution(symbol.fir.typeParameters, type.typeArguments, useSiteSession) + return substitutorByMap(originalSubstitution) + } + override fun getStaticMemberScopeForCallables( klass: FirClass<*>, useSiteSession: FirSession, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/Scopes.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/Scopes.kt index 26a9da4882f..7761a6e638e 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/Scopes.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/Scopes.kt @@ -61,4 +61,3 @@ private fun doCreateImportingScopes( } private val PACKAGE_MEMBER = scopeSessionKey() - diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt index f9524b3ba9d..82ea8acf70c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt @@ -56,12 +56,10 @@ class FirClassSubstitutionScope( override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) { useSiteMemberScope.processFunctionsByName(name) process@{ original -> - val function = fakeOverrideFunctions.getOrPut(original) { createFakeOverrideFunction(original) } processor(function) } - return super.processFunctionsByName(name, processor) } @@ -138,6 +136,11 @@ class FirClassSubstitutionScope( return original } + /* + * Member functions can't capture type parameters, so + * it's safe to cast newTypeParameters to List + */ + @Suppress("UNCHECKED_CAST") return createFakeOverrideFunction( session, member, @@ -243,6 +246,10 @@ class FirClassSubstitutionScope( return original } + /* + * Member properties can't capture type parameters, so + * it's safe to cast newTypeParameters to List + */ @Suppress("UNCHECKED_CAST") return createFakeOverrideProperty( session, @@ -350,7 +357,6 @@ class FirClassSubstitutionScope( typeParameters += newTypeParameters } } - } fun createFakeOverrideFunction( @@ -479,13 +485,11 @@ class FirClassSubstitutionScope( typeParameters += newTypeParameters } } - } } override fun processDeclaredConstructors(processor: (FirConstructorSymbol) -> Unit) { useSiteMemberScope.processDeclaredConstructors process@{ original -> - val constructor = fakeOverrideConstructors.getOrPut(original) { createFakeOverrideConstructor(original) } processor(constructor) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassUseSiteMemberScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassUseSiteMemberScope.kt index e3c27ab7b2c..d9093fb0880 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassUseSiteMemberScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassUseSiteMemberScope.kt @@ -26,7 +26,6 @@ class FirClassUseSiteMemberScope( processor(it) } - superTypesScope.processPropertiesByName(name) { val overriddenBy = it.getOverridden(seen) if (overriddenBy == null) { @@ -35,5 +34,3 @@ class FirClassUseSiteMemberScope( } } } - - diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirDeclaredMemberScopeProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirDeclaredMemberScopeProvider.kt index 6fa534e19c3..0f13db670db 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirDeclaredMemberScopeProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirDeclaredMemberScopeProvider.kt @@ -89,4 +89,3 @@ fun lazyNestedClassifierScope( if (existingNames.isEmpty()) return null return FirLazyNestedClassifierScope(classId, existingNames, symbolProvider) } - diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirExplicitSimpleImportingScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirExplicitSimpleImportingScope.kt index 210fe3a1000..656e1b5c68b 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirExplicitSimpleImportingScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirExplicitSimpleImportingScope.kt @@ -15,7 +15,6 @@ class FirExplicitSimpleImportingScope( session: FirSession, scopeSession: ScopeSession ) : FirAbstractSimpleImportingScope(session, scopeSession) { - override val simpleImports = imports.filterIsInstance() .filter { !it.isAllUnder && it.importedName != null } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerLiteralTypeScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerLiteralTypeScope.kt index 04f01027b5c..2df6eb63b2e 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerLiteralTypeScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerLiteralTypeScope.kt @@ -33,7 +33,6 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.util.OperatorNameConventions - class FirIntegerLiteralTypeScope(private val session: FirSession, val isUnsigned: Boolean) : FirTypeScope() { sealed class ILTKey { object Signed : ILTKey() @@ -48,6 +47,7 @@ class FirIntegerLiteralTypeScope(private val session: FirSession, val isUnsigned val SCOPE_SESSION_KEY = scopeSessionKey() } + @Suppress("PrivatePropertyName") private val BINARY_OPERATOR_SYMBOLS = BINARY_OPERATOR_NAMES.map { name -> name to FirNamedFunctionSymbol(CallableId(name)).apply { createFirFunction(name, this).apply { @@ -68,6 +68,7 @@ class FirIntegerLiteralTypeScope(private val session: FirSession, val isUnsigned } }.toMap() + @Suppress("PrivatePropertyName") private val UNARY_OPERATOR_SYMBOLS = UNARY_OPERATOR_NAMES.map { name -> name to FirNamedFunctionSymbol(CallableId(name)).apply { createFirFunction(name, this) } }.toMap() @@ -85,7 +86,6 @@ class FirIntegerLiteralTypeScope(private val session: FirSession, val isUnsigned resolvePhase = FirResolvePhase.BODY_RESOLVE } - override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) { val symbol = BINARY_OPERATOR_SYMBOLS[name] ?: UNARY_OPERATOR_SYMBOLS[name] @@ -165,4 +165,3 @@ class FirILTTypeRefPlaceHolder( return this } } - diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerOperatorCall.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerOperatorCall.kt index 2c57a67dbd1..8ea5ceb5ad4 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerOperatorCall.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerOperatorCall.kt @@ -74,6 +74,6 @@ class FirIntegerOperatorCallBuilder : FirQualifiedAccessBuilder, FirCallBuilder, } -inline fun buildFunctionCall(init: FirIntegerOperatorCallBuilder.() -> Unit): FirIntegerOperatorCall { +inline fun buildIntegerOperatorFunctionCall(init: FirIntegerOperatorCallBuilder.() -> Unit): FirIntegerOperatorCall { return FirIntegerOperatorCallBuilder().apply(init).build() } \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLazyNestedClassifierScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLazyNestedClassifierScope.kt index 912b665c161..7129f78e972 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLazyNestedClassifierScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLazyNestedClassifierScope.kt @@ -20,7 +20,6 @@ class FirLazyNestedClassifierScope( private val existingNames: List, private val symbolProvider: FirSymbolProvider ) : FirScope() { - override fun processClassifiersByNameWithSubstitution( name: Name, processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLocalScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLocalScope.kt index 0f4bc7b0a29..9e018f6263e 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLocalScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLocalScope.kt @@ -19,14 +19,10 @@ import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.name.Name class FirLocalScope private constructor( - properties: PersistentMap>, - functions: PersistentMultimap>, - classes: PersistentMap + val properties: PersistentMap>, + val functions: PersistentMultimap>, + val classes: PersistentMap ) : FirScope() { - val properties: PersistentMap> = properties - val functions: PersistentMultimap> = functions - val classes: PersistentMap = classes - constructor() : this(persistentMapOf(), PersistentMultimap(), persistentMapOf()) fun storeClass(klass: FirRegularClass): FirLocalScope { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirMemberTypeParameterScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirMemberTypeParameterScope.kt index 8242a2efe6b..4fb94857fb8 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirMemberTypeParameterScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirMemberTypeParameterScope.kt @@ -8,7 +8,9 @@ package org.jetbrains.kotlin.fir.scopes.impl import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.scopes.FirTypeParameterScope +import org.jetbrains.kotlin.name.Name class FirMemberTypeParameterScope(callableMember: FirMemberDeclaration) : FirTypeParameterScope() { - override val typeParameters = callableMember.typeParameters.filterIsInstance().groupBy { it.name } -} \ No newline at end of file + override val typeParameters: Map> = + callableMember.typeParameters.filterIsInstance().groupBy { it.name } +} diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirNestedClassifierScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirNestedClassifierScope.kt index ee0e2426afe..8f61a1d635d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirNestedClassifierScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirNestedClassifierScope.kt @@ -14,7 +14,6 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.name.Name class FirNestedClassifierScope(val klass: FirClass<*>) : FirScope() { - private val classIndex: Map = run { val result = mutableMapOf() for (declaration in klass.declarations) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirPackageMemberScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirPackageMemberScope.kt index 8d418e3ecbf..950398edda3 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirPackageMemberScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirPackageMemberScope.kt @@ -15,12 +15,9 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name class FirPackageMemberScope(val fqName: FqName, val session: FirSession) : FirScope() { - private val symbolProvider = session.firSymbolProvider - - private val classifierCache = mutableMapOf?>() - - private val callableCache = mutableMapOf>>() + private val classifierCache: MutableMap?> = mutableMapOf() + private val callableCache: MutableMap>> = mutableMapOf() override fun processClassifiersByNameWithSubstitution( name: Name, @@ -28,7 +25,6 @@ class FirPackageMemberScope(val fqName: FqName, val session: FirSession) : FirSc ) { if (name.asString().isEmpty()) return - val symbol = classifierCache.getOrPut(name) { val unambiguousFqName = ClassId(fqName, name) symbolProvider.getClassLikeSymbolByFqName(unambiguousFqName) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirStandardOverrideChecker.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirStandardOverrideChecker.kt index 944b29fd479..e82062ab9fc 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirStandardOverrideChecker.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirStandardOverrideChecker.kt @@ -15,7 +15,6 @@ import org.jetbrains.kotlin.types.model.KotlinTypeMarker import org.jetbrains.kotlin.types.model.SimpleTypeMarker class FirStandardOverrideChecker(session: FirSession) : FirAbstractOverrideChecker() { - private val context: ConeTypeContext = session.typeContext private fun isEqualTypes(substitutedCandidateType: ConeKotlinType, substitutedBaseType: ConeKotlinType): Boolean { @@ -114,7 +113,6 @@ class FirStandardOverrideChecker(session: FirSession) : FirAbstractOverrideCheck return overrideCandidate.valueParameters.zip(baseDeclaration.valueParameters).all { (memberParam, selfParam) -> isEqualTypes(memberParam.returnTypeRef, selfParam.returnTypeRef, substitutor) } - } override fun isOverriddenProperty( @@ -125,4 +123,4 @@ class FirStandardOverrideChecker(session: FirSession) : FirAbstractOverrideCheck val substitutor = buildTypeParametersSubstitutorIfCompatible(overrideCandidate, baseDeclaration) ?: return false return isEqualReceiverTypes(overrideCandidate.receiverTypeRef, baseDeclaration.receiverTypeRef, substitutor) } -} \ No newline at end of file +} diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirStaticScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirStaticScope.kt index 2fda1f05bd0..f6f3b2d3ded 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirStaticScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirStaticScope.kt @@ -16,15 +16,11 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.name.Name class FirStaticScope(private val delegateScope: FirScope) : FirScope() { - override fun processClassifiersByNameWithSubstitution(name: Name, processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit) { delegateScope.processClassifiersByNameWithSubstitution(name, processor) } - override fun processFunctionsByName( - name: Name, - processor: (FirFunctionSymbol<*>) -> Unit - ) { + override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) { delegateScope.processFunctionsByName(name) { if ((it.fir as? FirSimpleFunction)?.isStatic == true) { processor(it) @@ -32,14 +28,11 @@ class FirStaticScope(private val delegateScope: FirScope) : FirScope() { } } - override fun processPropertiesByName( - name: Name, - processor: (FirVariableSymbol<*>) -> Unit - ) { + override fun processPropertiesByName(name: Name, processor: (FirVariableSymbol<*>) -> Unit) { delegateScope.processPropertiesByName(name) { if ((it.fir as? FirCallableMemberDeclaration<*>)?.isStatic == true) { processor(it) } } } -} \ No newline at end of file +} diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt index 6d957a7658a..5b6d74b79d6 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt @@ -32,16 +32,13 @@ class FirTypeIntersectionScope private constructor( overrideChecker: FirOverrideChecker, private val scopes: List, ) : AbstractFirOverrideScope(session, overrideChecker) { - - private val absentFunctions = mutableSetOf() - - private val absentProperties = mutableSetOf() - - private val absentClassifiers = mutableSetOf() + private val absentFunctions: MutableSet = mutableSetOf() + private val absentProperties: MutableSet = mutableSetOf() + private val absentClassifiers: MutableSet = mutableSetOf() private val typeContext = ConeTypeCheckerContext(isErrorTypeEqualsToAnything = false, isStubTypeEqualsToAnything = false, session) - private val overriddenSymbols = mutableMapOf, Collection>>() + private val overriddenSymbols: MutableMap, Collection>> = mutableMapOf() override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) { if (!processCallablesByName(name, processor, absentFunctions, FirScope::processFunctionsByName)) { @@ -87,7 +84,6 @@ class FirTypeIntersectionScope private constructor( processor(member) } - return false } @@ -105,10 +101,8 @@ class FirTypeIntersectionScope private constructor( return true } - private fun > selectMostSpecificMember( - overridables: Collection - ): D { - require(overridables.isNotEmpty()) { "Should have at least one overridable descriptor" } + private fun > selectMostSpecificMember(overridables: Collection): D { + require(overridables.isNotEmpty()) { "Should have at least one overridable symbol" } if (overridables.size == 1) { return overridables.first() } @@ -126,19 +120,15 @@ class FirTypeIntersectionScope private constructor( } } - when { - candidates.isEmpty() -> { - return transitivelyMostSpecific - } - candidates.size == 1 -> { - return candidates.first() - } + return when { + candidates.isEmpty() -> transitivelyMostSpecific + candidates.size == 1 -> candidates.first() else -> { candidates.firstOrNull { val type = it.fir.returnTypeRef.coneTypeSafe() type != null && type !is ConeFlexibleType }?.let { return it } - return candidates.first() + candidates.first() } } } @@ -272,7 +262,6 @@ class FirTypeIntersectionScope private constructor( scopes: List ): FirTypeScope { scopes.singleOrNull()?.let { return it } - return FirTypeIntersectionScope(session, overrideChecker, scopes) } }