From 3da11cc85b1d0f08f2b5e93ba8c2cc708a8be732 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Thu, 27 Jun 2019 16:58:20 +0300 Subject: [PATCH] Use no-op substitutor instead of substitutor with empty map --- .../fir/java/scopes/JavaClassUseSiteScope.kt | 4 ++-- .../fir/resolve/calls/ConeInferenceContext.kt | 1 + .../CreateFreshTypeVariableSubstitutorStage.kt | 4 ++-- .../fir/resolve/calls/OverloadConflictResolver.kt | 4 ++-- .../fir/resolve/substitution/ConeSubstitutor.kt | 15 ++++++++++----- .../fir/scopes/impl/AbstractFirOverrideScope.kt | 4 ++-- .../fir/scopes/impl/FirClassSubstitutionScope.kt | 4 ++-- .../jetbrains/kotlin/fir/types/ConeTypeContext.kt | 4 ++-- 8 files changed, 23 insertions(+), 17 deletions(-) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteScope.kt index d65fe2b1a1d..b5a02cdbe57 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteScope.kt @@ -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) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeInferenceContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeInferenceContext.kt index 28441129bde..4645d58ff99 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeInferenceContext.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeInferenceContext.kt @@ -248,6 +248,7 @@ interface ConeInferenceContext : TypeSystemInferenceExtensionContext, } override fun typeSubstitutorByTypeConstructor(map: Map): TypeSubstitutorMarker { + if (map.isEmpty()) return ConeSubstitutor.Empty return object : AbstractConeSubstitutor(), TypeSubstitutorMarker { override fun substituteType(type: ConeKotlinType): ConeKotlinType? { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CreateFreshTypeVariableSubstitutorStage.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CreateFreshTypeVariableSubstitutorStage.kt index dbb9f299ee9..dec894a712a 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CreateFreshTypeVariableSubstitutorStage.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CreateFreshTypeVariableSubstitutorStage.kt @@ -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) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/OverloadConflictResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/OverloadConflictResolver.kt index 7a55c922897..41fd2b946ff 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/OverloadConflictResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/OverloadConflictResolver.kt @@ -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) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/substitution/ConeSubstitutor.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/substitution/ConeSubstitutor.kt index 4ee915d2d33..ba997960aa9 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/substitution/ConeSubstitutor.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/substitution/ConeSubstitutor.kt @@ -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): ConeSubstitutor { + if (substitution.isEmpty()) return ConeSubstitutor.Empty + return ConeSubstitutorByMap(substitution) +} + class ConeSubstitutorByMap(val substitution: Map) : AbstractConeSubstitutor() { override fun substituteType(type: ConeKotlinType): ConeKotlinType? { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirOverrideScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirOverrideScope.kt index 31e4e20c160..e2299c4e25b 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirOverrideScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirOverrideScope.kt @@ -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) } 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 ec21ae4fa41..3bf6d694998 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 @@ -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<*>>() - private val substitutor = ConeSubstitutorByMap(substitution) + private val substitutor = substitutorByMap(substitution) override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> ProcessorAction): ProcessorAction { useSiteScope.processFunctionsByName(name) process@{ original -> diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt index 2343b50ea3e..03388bc7002 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt @@ -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 }