FirClassSubstitutionScope: eliminate second constructor to simplify code

This commit is contained in:
Mikhail Glukhikh
2020-10-20 09:49:10 +03:00
parent 80f8b5b234
commit 3663bc6be3
2 changed files with 8 additions and 17 deletions
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.resolve
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
import org.jetbrains.kotlin.fir.resolve.transformers.createSubstitutionForSupertype import org.jetbrains.kotlin.fir.resolve.transformers.createSubstitutionForSupertype
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.FirTypeScope import org.jetbrains.kotlin.fir.scopes.FirTypeScope
@@ -97,22 +98,20 @@ fun ConeClassLikeType.wrapSubstitutionScopeIfNeed(
val typeParameters = (declaration as? FirTypeParameterRefsOwner)?.typeParameters.orEmpty() val typeParameters = (declaration as? FirTypeParameterRefsOwner)?.typeParameters.orEmpty()
val originalSubstitution = createSubstitution(typeParameters, this, session) val originalSubstitution = createSubstitution(typeParameters, this, session)
val platformClass = session.platformClassMapper.getCorrespondingPlatformClass(declaration) val platformClass = session.platformClassMapper.getCorrespondingPlatformClass(declaration)
if (platformClass != null) { val substitutor = if (platformClass != null) {
// This kind of substitution is necessary when method which is mapped from Java (e.g. Java Map.forEach) // This kind of substitution is necessary when method which is mapped from Java (e.g. Java Map.forEach)
// is called on an external type, like MyMap<String, String>, // is called on an external type, like MyMap<String, String>,
// to determine parameter types properly (e.g. String, String instead of K, V) // to determine parameter types properly (e.g. String, String instead of K, V)
val platformTypeParameters = platformClass.typeParameters val platformTypeParameters = platformClass.typeParameters
val platformSubstitution = createSubstitution(platformTypeParameters, this, session) val platformSubstitution = createSubstitution(platformTypeParameters, this, session)
FirClassSubstitutionScope( substitutorByMap(originalSubstitution + platformSubstitution)
session, useSiteMemberScope, originalSubstitution + platformSubstitution, skipPrivateMembers = true,
derivedClassId = derivedClassId
)
} else { } else {
FirClassSubstitutionScope( substitutorByMap(originalSubstitution)
session, useSiteMemberScope, originalSubstitution, skipPrivateMembers = true,
derivedClassId = derivedClassId
)
} }
FirClassSubstitutionScope(
session, useSiteMemberScope, substitutor,
skipPrivateMembers = true, derivedClassId = derivedClassId
)
} }
} }
@@ -35,14 +35,6 @@ class FirClassSubstitutionScope(
private val fakeOverrideConstructors = mutableMapOf<FirConstructorSymbol, FirConstructorSymbol>() private val fakeOverrideConstructors = mutableMapOf<FirConstructorSymbol, FirConstructorSymbol>()
private val fakeOverrideVariables = mutableMapOf<FirVariableSymbol<*>, FirVariableSymbol<*>>() private val fakeOverrideVariables = mutableMapOf<FirVariableSymbol<*>, FirVariableSymbol<*>>()
constructor(
session: FirSession,
useSiteMemberScope: FirTypeScope,
substitution: Map<FirTypeParameterSymbol, ConeKotlinType>,
skipPrivateMembers: Boolean,
derivedClassId: ClassId?
) : this(session, useSiteMemberScope, substitutorByMap(substitution), skipPrivateMembers, derivedClassId)
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) { override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) {
useSiteMemberScope.processFunctionsByName(name) process@{ original -> useSiteMemberScope.processFunctionsByName(name) process@{ original ->
val function = fakeOverrideFunctions.getOrPut(original) { createFakeOverrideFunction(original) } val function = fakeOverrideFunctions.getOrPut(original) { createFakeOverrideFunction(original) }