From d55c6550bb89399e729139d12fac00d1db821308 Mon Sep 17 00:00:00 2001 From: "simon.ogorodnik" Date: Thu, 9 Apr 2020 22:16:54 +0300 Subject: [PATCH] [FIR] Add substitution to classifiers processing --- .../fir/java/scopes/JavaClassEnhancementScope.kt | 5 +++-- .../kotlin/fir/scopes/jvm/JvmMappedScope.kt | 5 +++-- .../kotlin/fir/resolve/calls/tower/TowerLevels.kt | 1 + .../kotlin/fir/resolve/impl/FirTypeResolverImpl.kt | 1 + .../kotlin/fir/resolve/substitution/Substitutors.kt | 6 ++++++ .../kotlin/fir/scopes/FirTypeParameterScope.kt | 7 ++++--- .../scopes/impl/AbstractFirUseSiteMemberScope.kt | 11 ++++------- .../scopes/impl/FirAbstractSimpleImportingScope.kt | 8 +++----- .../scopes/impl/FirAbstractStarImportingScope.kt | 8 +++----- .../fir/scopes/impl/FirClassDeclaredMemberScope.kt | 7 ++++--- .../fir/scopes/impl/FirClassSubstitutionScope.kt | 7 +++++-- .../fir/scopes/impl/FirIntegerLiteralTypeScope.kt | 3 --- .../fir/scopes/impl/FirLazyNestedClassifierScope.kt | 7 ++++--- .../kotlin/fir/scopes/impl/FirLocalScope.kt | 5 +++-- .../fir/scopes/impl/FirNestedClassifierScope.kt | 7 ++++--- .../fir/scopes/impl/FirOnlyClassifiersScope.kt | 5 +++-- .../kotlin/fir/scopes/impl/FirPackageMemberScope.kt | 7 ++++--- .../kotlin/fir/scopes/impl/FirStaticScope.kt | 7 +++---- .../kotlin/fir/scopes/impl/FirSuperTypeScope.kt | 13 +++++++------ .../jetbrains/kotlin/fir/scopes/FirIterableScope.kt | 7 ++++--- .../src/org/jetbrains/kotlin/fir/scopes/FirScope.kt | 13 +++++++++++-- 21 files changed, 80 insertions(+), 60 deletions(-) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt index 5c5f5c007e6..06014e0d6e4 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack import org.jetbrains.kotlin.fir.java.declarations.* import org.jetbrains.kotlin.fir.java.enhancement.* import org.jetbrains.kotlin.fir.render +import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.jvm.computeJvmDescriptor import org.jetbrains.kotlin.fir.symbols.CallableId @@ -76,8 +77,8 @@ class JavaClassEnhancementScope( return super.processFunctionsByName(name, processor) } - override fun processClassifiersByName(name: Name, processor: (FirClassifierSymbol<*>) -> Unit) { - useSiteMemberScope.processClassifiersByName(name, processor) + override fun processClassifiersByNameWithSubstitution(name: Name, processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit) { + useSiteMemberScope.processClassifiersByNameWithSubstitution(name, processor) } private fun enhance( diff --git a/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt index d8d480e39aa..6eed8645764 100644 --- a/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt +++ b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.scopes.jvm import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSettings import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol @@ -39,8 +40,8 @@ class JvmMappedScope( declaredMemberScope.processPropertiesByName(name, processor) } - override fun processClassifiersByName(name: Name, processor: (FirClassifierSymbol<*>) -> Unit) { - declaredMemberScope.processClassifiersByName(name, processor) + override fun processClassifiersByNameWithSubstitution(name: Name, processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit) { + declaredMemberScope.processClassifiersByNameWithSubstitution(name, processor) } companion object { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt index 72da46b23f1..c2ab41122a7 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.ProcessorAction import org.jetbrains.kotlin.fir.scopes.impl.FirAbstractImportingScope import org.jetbrains.kotlin.fir.scopes.impl.FirExplicitSimpleImportingScope +import org.jetbrains.kotlin.fir.scopes.processClassifiersByName import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.classId diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt index 606cb04187a..b6c33be4c47 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.resolve.constructType import org.jetbrains.kotlin.fir.resolve.firSymbolProvider import org.jetbrains.kotlin.fir.scopes.FirIterableScope import org.jetbrains.kotlin.fir.scopes.FirScope +import org.jetbrains.kotlin.fir.scopes.processClassifiersByName import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/substitution/Substitutors.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/substitution/Substitutors.kt index ca01ed32d77..c1cdea34f80 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/substitution/Substitutors.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/substitution/Substitutors.kt @@ -135,6 +135,12 @@ data class ChainedSubstitutor(private val first: ConeSubstitutor, private val se } } +fun ConeSubstitutor.chain(other: ConeSubstitutor): ConeSubstitutor { + if (this == ConeSubstitutor.Empty) return other + if (other == ConeSubstitutor.Empty) return this + return ChainedSubstitutor(this, other) +} + data class ConeSubstitutorByMap(val substitution: Map) : AbstractConeSubstitutor() { override fun substituteType(type: ConeKotlinType): ConeKotlinType? { if (type !is ConeTypeParameterType) return null diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/FirTypeParameterScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/FirTypeParameterScope.kt index e721d19ebfb..02800b936c3 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/FirTypeParameterScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/FirTypeParameterScope.kt @@ -6,18 +6,19 @@ package org.jetbrains.kotlin.fir.scopes import org.jetbrains.kotlin.fir.declarations.FirTypeParameter +import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol import org.jetbrains.kotlin.name.Name abstract class FirTypeParameterScope : FirScope() { abstract val typeParameters: Map> - override fun processClassifiersByName( + override fun processClassifiersByNameWithSubstitution( name: Name, - processor: (FirClassifierSymbol<*>) -> Unit + processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit ) { val matchedTypeParameters = typeParameters[name] ?: return - matchedTypeParameters.forEach { processor(it.symbol) } + matchedTypeParameters.forEach { processor(it.symbol, ConeSubstitutor.Empty) } } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt index cac7d5c97f2..c1975084aeb 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction import org.jetbrains.kotlin.fir.declarations.impl.FirSimpleFunctionImpl import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.scopes.FirOverrideChecker import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.impl.* @@ -118,12 +119,8 @@ abstract class AbstractFirUseSiteMemberScope( isVararg = parameter.isVararg } - - override fun processClassifiersByName( - name: Name, - processor: (FirClassifierSymbol<*>) -> Unit - ) { - declaredMemberScope.processClassifiersByName(name, processor) - superTypesScope.processClassifiersByName(name, processor) + override fun processClassifiersByNameWithSubstitution(name: Name, processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit) { + declaredMemberScope.processClassifiersByNameWithSubstitution(name, processor) + superTypesScope.processClassifiersByNameWithSubstitution(name, processor) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractSimpleImportingScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractSimpleImportingScope.kt index e9395b4c703..11b6425e488 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractSimpleImportingScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractSimpleImportingScope.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvedImport import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.calls.tower.TowerScopeLevel +import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol import org.jetbrains.kotlin.name.ClassId @@ -22,10 +23,7 @@ abstract class FirAbstractSimpleImportingScope( protected abstract val simpleImports: Map> - override fun processClassifiersByName( - name: Name, - processor: (FirClassifierSymbol<*>) -> Unit - ) { + override fun processClassifiersByNameWithSubstitution(name: Name, processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit) { val imports = simpleImports[name] ?: return if (imports.isEmpty()) return val provider = FirSymbolProvider.getInstance(session) @@ -35,7 +33,7 @@ abstract class FirAbstractSimpleImportingScope( import.resolvedClassId?.createNestedClassId(importedName) ?: ClassId.topLevel(import.packageFqName.child(importedName)) val symbol = provider.getClassLikeSymbolByFqName(classId) ?: continue - processor(symbol) + processor(symbol, ConeSubstitutor.Empty) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractStarImportingScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractStarImportingScope.kt index ce743d3f7d6..1ebc74053df 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractStarImportingScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractStarImportingScope.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirResolvedImport import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.calls.tower.TowerScopeLevel +import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol import org.jetbrains.kotlin.name.ClassId @@ -24,10 +25,7 @@ abstract class FirAbstractStarImportingScope( private val absentClassifierNames = mutableSetOf() - override fun processClassifiersByName( - name: Name, - processor: (FirClassifierSymbol<*>) -> Unit - ) { + override fun processClassifiersByNameWithSubstitution(name: Name, processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit) { if (starImports.isEmpty() || name in absentClassifierNames) { return } @@ -41,7 +39,7 @@ abstract class FirAbstractStarImportingScope( } val symbol = provider.getClassLikeSymbolByFqName(classId) ?: continue empty = false - processor(symbol) + processor(symbol, ConeSubstitutor.Empty) } if (empty) { absentClassifierNames += name diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassDeclaredMemberScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassDeclaredMemberScope.kt index 50eb902cb65..20422369113 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassDeclaredMemberScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassDeclaredMemberScope.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.scopes.impl import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider +import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol @@ -62,8 +63,8 @@ class FirClassDeclaredMemberScope( } } - override fun processClassifiersByName( + override fun processClassifiersByNameWithSubstitution( name: Name, - processor: (FirClassifierSymbol<*>) -> Unit - ) = nestedClassifierScope.processClassifiersByName(name, processor) + processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit + ) = nestedClassifierScope.processClassifiersByNameWithSubstitution(name, processor) } 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 0bc22a5e8da..e8f601288ca 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 @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.substitution.ChainedSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor +import org.jetbrains.kotlin.fir.resolve.substitution.chain import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorForFullBodyResolve @@ -82,8 +83,10 @@ class FirClassSubstitutionScope( } } - override fun processClassifiersByName(name: Name, processor: (FirClassifierSymbol<*>) -> Unit) { - useSiteMemberScope.processClassifiersByName(name, processor) + override fun processClassifiersByNameWithSubstitution(name: Name, processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit) { + useSiteMemberScope.processClassifiersByNameWithSubstitution(name) { symbol, substitutor -> + processor(symbol, substitutor.chain(this.substitutor)) + } } private val typeCalculator = 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 667a6fa4a22..74d4d135bce 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 @@ -81,9 +81,6 @@ class FirIntegerLiteralTypeScope(private val session: FirSession, val isUnsigned resolvePhase = FirResolvePhase.BODY_RESOLVE } - override fun processClassifiersByName(name: Name, processor: (FirClassifierSymbol<*>) -> Unit) { - - } override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) { val symbol = BINARY_OPERATOR_SYMBOLS[name] 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 31f77ec1de3..dd3fb4a90fd 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 @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.scopes.impl import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider +import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol import org.jetbrains.kotlin.name.ClassId @@ -20,9 +21,9 @@ class FirLazyNestedClassifierScope( private val symbolProvider: FirSymbolProvider ) : FirScope() { - override fun processClassifiersByName( + override fun processClassifiersByNameWithSubstitution( name: Name, - processor: (FirClassifierSymbol<*>) -> Unit + processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit ) { if (name !in existingNames) { return @@ -30,6 +31,6 @@ class FirLazyNestedClassifierScope( val child = classId.createNestedClassId(name) val symbol = symbolProvider.getClassLikeSymbolByFqName(child) ?: return - processor(symbol) + processor(symbol, ConeSubstitutor.Empty) } } 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 650d9f27be7..776d7bff3b0 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 @@ -10,6 +10,7 @@ import kotlinx.collections.immutable.persistentMapOf import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.NAME_FOR_BACKING_FIELD import org.jetbrains.kotlin.fir.resolve.PersistentMultimap +import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.name.Name @@ -62,10 +63,10 @@ class FirLocalScope( } } - override fun processClassifiersByName(name: Name, processor: (FirClassifierSymbol<*>) -> Unit) { + override fun processClassifiersByNameWithSubstitution(name: Name, processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit) { val klass = classes[name] if (klass != null) { - processor(klass) + processor(klass, ConeSubstitutor.Empty) } } } \ No newline at end of file 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 75a6cf2b9b5..09256aba202 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 @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.scopes.impl import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol @@ -24,11 +25,11 @@ class FirNestedClassifierScope(val klass: FirClass<*>) : FirScope() { result } - override fun processClassifiersByName( + override fun processClassifiersByNameWithSubstitution( name: Name, - processor: (FirClassifierSymbol<*>) -> Unit + processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit ) { val matchedClass = classIndex[name] ?: return - processor(matchedClass) + processor(matchedClass, ConeSubstitutor.Empty) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirOnlyClassifiersScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirOnlyClassifiersScope.kt index fcdcb2f6cfc..fc8b192c320 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirOnlyClassifiersScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirOnlyClassifiersScope.kt @@ -5,12 +5,13 @@ package org.jetbrains.kotlin.fir.scopes.impl +import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol import org.jetbrains.kotlin.name.Name class FirOnlyClassifiersScope(val delegate: FirScope) : FirScope() { - override fun processClassifiersByName(name: Name, processor: (FirClassifierSymbol<*>) -> Unit) { - return delegate.processClassifiersByName(name, processor) + override fun processClassifiersByNameWithSubstitution(name: Name, processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit) { + return delegate.processClassifiersByNameWithSubstitution(name, processor) } } \ No newline at end of file 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 a29810d421e..7819d76cf20 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 @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.scopes.impl import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider +import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.name.ClassId @@ -21,9 +22,9 @@ class FirPackageMemberScope(val fqName: FqName, val session: FirSession) : FirSc private val callableCache = mutableMapOf>>() - override fun processClassifiersByName( + override fun processClassifiersByNameWithSubstitution( name: Name, - processor: (FirClassifierSymbol<*>) -> Unit + processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit ) { if (name.asString().isEmpty()) return @@ -34,7 +35,7 @@ class FirPackageMemberScope(val fqName: FqName, val session: FirSession) : FirSc } if (symbol != null) { - processor(symbol) + processor(symbol, ConeSubstitutor.Empty) } } 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 88f672eb61d..2fda1f05bd0 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 @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.scopes.impl import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.isStatic +import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol @@ -16,10 +17,8 @@ import org.jetbrains.kotlin.name.Name class FirStaticScope(private val delegateScope: FirScope) : FirScope() { - override fun processClassifiersByName(name: Name, processor: (FirClassifierSymbol<*>) -> Unit) { - delegateScope.processClassifiersByName(name) { - processor(it) - } + override fun processClassifiersByNameWithSubstitution(name: Name, processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit) { + delegateScope.processClassifiersByNameWithSubstitution(name, processor) } override fun processFunctionsByName( diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirSuperTypeScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirSuperTypeScope.kt index ce2377a6ee4..16829a8c222 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirSuperTypeScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirSuperTypeScope.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction +import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.scopes.FirOverrideChecker import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.impl.* @@ -214,7 +215,7 @@ class FirSuperTypeScope private constructor( return result } - override fun processClassifiersByName(name: Name, processor: (FirClassifierSymbol<*>) -> Unit) { + override fun processClassifiersByNameWithSubstitution(name: Name, processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit) { if (name in absentClassifiers) { return } @@ -222,11 +223,11 @@ class FirSuperTypeScope private constructor( val pending = mutableListOf>() var empty = true for (scope in scopes) { - scope.processClassifiersByName(name) { + scope.processClassifiersByNameWithSubstitution(name) { symbol, substitution -> empty = false - if (it !in accepted) { - pending += it - processor(it) + if (symbol !in accepted) { + pending += symbol + processor(symbol, substitution) } } accepted += pending @@ -235,7 +236,7 @@ class FirSuperTypeScope private constructor( if (empty) { absentClassifiers += name } - super.processClassifiersByName(name, processor) + super.processClassifiersByNameWithSubstitution(name, processor) } companion object { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirIterableScope.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirIterableScope.kt index ca42ac21717..b86f73bf73d 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirIterableScope.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirIterableScope.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.scopes +import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol @@ -13,12 +14,12 @@ import org.jetbrains.kotlin.name.Name abstract class FirIterableScope : FirScope() { abstract val scopes: Iterable - override fun processClassifiersByName( + override fun processClassifiersByNameWithSubstitution( name: Name, - processor: (FirClassifierSymbol<*>) -> Unit + processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit ) { for (scope in scopes) { - scope.processClassifiersByName(name, processor) + scope.processClassifiersByNameWithSubstitution(name, processor) } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirScope.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirScope.kt index 95ca1a326f6..81263dd689d 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirScope.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirScope.kt @@ -5,15 +5,16 @@ package org.jetbrains.kotlin.fir.scopes +import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.name.Name abstract class FirScope { - open fun processClassifiersByName( + open fun processClassifiersByNameWithSubstitution( name: Name, - processor: (FirClassifierSymbol<*>) -> Unit + processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit ) {} open fun processFunctionsByName( @@ -48,3 +49,11 @@ enum class ProcessorAction { return this } } + + +inline fun FirScope.processClassifiersByName( + name: Name, + noinline processor: (FirClassifierSymbol<*>) -> Unit +) { + processClassifiersByNameWithSubstitution(name) { symbol, _ -> processor(symbol) } +} \ No newline at end of file