Use no-op substitutor instead of substitutor with empty map

This commit is contained in:
Simon Ogorodnik
2019-06-27 16:58:20 +03:00
committed by Mikhail Glukhikh
parent 2d74dac4f2
commit 3da11cc85b
8 changed files with 23 additions and 17 deletions
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack
import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass
import org.jetbrains.kotlin.fir.java.toNotNullConeKotlinType
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.*
@@ -68,7 +68,7 @@ class JavaClassUseSiteScope(
val types = base.typeParameters.map {
ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), false)
}
val substitution = ConeSubstitutorByMap(overriddenInJava.typeParameters.map { it.symbol }.zip(types).toMap())
val substitution = substitutorByMap(overriddenInJava.typeParameters.map { it.symbol }.zip(types).toMap())
if (!overriddenInJava.typeParameters.zip(base.typeParameters).all { (a, b) ->
a.bounds.size == b.bounds.size && a.bounds.zip(b.bounds).all { (aBound, bBound) ->
isEqualTypes(aBound, bBound, substitution)
@@ -248,6 +248,7 @@ interface ConeInferenceContext : TypeSystemInferenceExtensionContext,
}
override fun typeSubstitutorByTypeConstructor(map: Map<TypeConstructorMarker, KotlinTypeMarker>): TypeSubstitutorMarker {
if (map.isEmpty()) return ConeSubstitutor.Empty
return object : AbstractConeSubstitutor(),
TypeSubstitutorMarker {
override fun substituteType(type: ConeKotlinType): ConeKotlinType? {
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration
import org.jetbrains.kotlin.fir.renderWithType
import org.jetbrains.kotlin.fir.resolve.constructType
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
import org.jetbrains.kotlin.fir.service
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
import org.jetbrains.kotlin.fir.symbols.invoke
@@ -92,7 +92,7 @@ fun createToFreshVariableSubstitutorAndAddInitialConstraints(
val freshTypeVariables = typeParameters.map { TypeParameterBasedTypeVariable(it.symbol) }
val toFreshVariables = ConeSubstitutorByMap(freshTypeVariables.associate { it.typeParameterSymbol to it.defaultType })
val toFreshVariables = substitutorByMap(freshTypeVariables.associate { it.typeParameterSymbol to it.defaultType })
for (freshVariable in freshTypeVariables) {
csBuilder.registerVariable(freshVariable)
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.resolve.calls
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirNamedFunction
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.coneTypeUnsafe
@@ -211,7 +211,7 @@ class ConeSimpleConstraintSystemImpl(val system: NewConstraintSystemImpl) : Simp
it to variable.defaultType
}
val substitutor = ConeSubstitutorByMap(substitutionMap.cast())
val substitutor = substitutorByMap(substitutionMap.cast())
for (typeParameter in typeParameters) {
require(typeParameter is FirTypeParameterSymbol)
for (upperBound in typeParameter.fir.bounds) {
@@ -13,11 +13,11 @@ import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl
import org.jetbrains.kotlin.types.model.TypeSubstitutorMarker
interface ConeSubstitutor : TypeSubstitutorMarker {
fun substituteOrSelf(type: ConeKotlinType): ConeKotlinType
fun substituteOrNull(type: ConeKotlinType): ConeKotlinType?
abstract class ConeSubstitutor : TypeSubstitutorMarker {
abstract fun substituteOrSelf(type: ConeKotlinType): ConeKotlinType
abstract fun substituteOrNull(type: ConeKotlinType): ConeKotlinType?
object Empty : ConeSubstitutor {
object Empty : ConeSubstitutor() {
override fun substituteOrSelf(type: ConeKotlinType): ConeKotlinType {
return type
}
@@ -33,7 +33,7 @@ fun ConeSubstitutor.substituteOrNull(type: ConeKotlinType?): ConeKotlinType? {
return type?.let { substituteOrNull(it) }
}
abstract class AbstractConeSubstitutor : ConeSubstitutor {
abstract class AbstractConeSubstitutor : ConeSubstitutor() {
private fun wrapProjection(old: ConeKotlinTypeProjection, newType: ConeKotlinType): ConeKotlinTypeProjection {
return when (old) {
is ConeStarProjection -> old
@@ -130,6 +130,11 @@ abstract class AbstractConeSubstitutor : ConeSubstitutor {
}
fun substitutorByMap(substitution: Map<ConeTypeParameterSymbol, ConeKotlinType>): ConeSubstitutor {
if (substitution.isEmpty()) return ConeSubstitutor.Empty
return ConeSubstitutorByMap(substitution)
}
class ConeSubstitutorByMap(val substitution: Map<ConeTypeParameterSymbol, ConeKotlinType>) : AbstractConeSubstitutor() {
override fun substituteType(type: ConeKotlinType): ConeKotlinType? {
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol
@@ -38,7 +38,7 @@ abstract class AbstractFirOverrideScope(val session: FirSession) : FirScope() {
val types = self.typeParameters.map {
ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), false)
}
val substitution = ConeSubstitutorByMap(member.typeParameters.map { it.symbol }.zip(types).toMap())
val substitution = substitutorByMap(member.typeParameters.map { it.symbol }.zip(types).toMap())
if (!member.typeParameters.zip(self.typeParameters).all { (a, b) ->
a.bounds.size == b.bounds.size &&
a.bounds.zip(b.bounds).all { (aBound, bBound) -> isEqualTypes(aBound, bBound, substitution) }
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirMemberFunctionImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorWithJump
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
@@ -33,7 +33,7 @@ class FirClassSubstitutionScope(
private val fakeOverrides = mutableMapOf<FirFunctionSymbol<*>, FirFunctionSymbol<*>>()
private val substitutor = ConeSubstitutorByMap(substitution)
private val substitutor = substitutorByMap(substitution)
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> ProcessorAction): ProcessorAction {
useSiteScope.processFunctionsByName(name) process@{ original ->
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.calls.ConeTypeVariableTypeConstructor
import org.jetbrains.kotlin.fir.resolve.calls.hasNullableSuperType
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe
import org.jetbrains.kotlin.fir.service
import org.jetbrains.kotlin.fir.symbols.*
@@ -435,7 +435,7 @@ class ConeTypeCheckerContext(override val isErrorTypeEqualsToAnything: Boolean,
parameter.symbol as ConeTypeParameterSymbol to ((argument as? ConeTypedProjection)?.type
?: StandardClassIds.Any(session.firSymbolProvider).constructType(emptyArray(), isNullable = true))
}
ConeSubstitutorByMap(substitution)
substitutorByMap(substitution)
} else {
ConeSubstitutor.Empty
}