diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypes.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypes.kt index 579f5eae30a..4f17a2eab6a 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypes.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypes.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.types import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.ConeClassifierLookupTag import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.types.model.* sealed class ConeKotlinTypeProjection : TypeArgumentMarker { @@ -193,3 +194,17 @@ class ConeIntersectionType( fun ConeIntersectionType.mapTypes(func: (ConeKotlinType) -> ConeKotlinType): ConeIntersectionType { return ConeIntersectionType(intersectedTypes.map(func)) } + +class ConeStubType(val variable: ConeTypeVariable, override val nullability: ConeNullability) : StubTypeMarker, ConeKotlinType() { + override val typeArguments: Array + get() = emptyArray() +} + +open class ConeTypeVariable(name: String) : TypeVariableMarker { + val typeConstructor = ConeTypeVariableTypeConstructor(name) + val defaultType = ConeTypeVariableType(ConeNullability.NOT_NULL, typeConstructor) +} + +class ConeTypeVariableTypeConstructor(val debugName: String) : ConeClassifierLookupTag(), TypeVariableTypeConstructorMarker { + override val name: Name get() = Name.identifier(debugName) +} diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/TypeRenderer.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/TypeRenderer.kt index 0b24ffe2de4..1c34f98dbe3 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/TypeRenderer.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/TypeRenderer.kt @@ -46,5 +46,6 @@ fun ConeKotlinType.render(): String { postfix = ")" ) } + is ConeStubType -> "stub type: $variable" } + nullabilitySuffix } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt index ef3057ec36e..35c65158f62 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt @@ -70,6 +70,7 @@ fun ConeKotlinType.toIrType(session: FirSession, declarationStorage: Fir2IrDecla // TODO: add intersectionTypeApproximation intersectedTypes.first().toIrType(session, declarationStorage) } + is ConeStubType -> createErrorType() } } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaElementFinder.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaElementFinder.kt index 998c69e33ef..cde40ff91ee 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaElementFinder.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaElementFinder.kt @@ -222,7 +222,8 @@ private const val ERROR_TYPE_STUB = CommonClassNames.JAVA_LANG_OBJECT private fun ConeKotlinType.mapToCanonicalString(session: FirSession): String { return when (this) { is ConeClassLikeType -> mapToCanonicalString(session) - is ConeTypeVariableType, is ConeFlexibleType, is ConeCapturedType, is ConeDefinitelyNotNullType, is ConeIntersectionType -> + is ConeTypeVariableType, is ConeFlexibleType, is ConeCapturedType, + is ConeDefinitelyNotNullType, is ConeIntersectionType, is ConeStubType -> error("Unexpected type: $this [${this::class}]") is ConeLookupTagBasedType -> lookupTag.name.asString() } @@ -250,7 +251,7 @@ private fun ConeClassType.mapToCanonicalString(session: FirSession): String { } + "[]" } - val context = ConeTypeCheckerContext(false, session) + val context = ConeTypeCheckerContext(isErrorTypeEqualsToAnything = false, isStubTypeEqualsToAnything = true, session = session) with(context) { val typeConstructor = typeConstructor() diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaElementFinder.kt.183 b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaElementFinder.kt.183 index a6c6a58f665..1cd7ff66161 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaElementFinder.kt.183 +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaElementFinder.kt.183 @@ -223,7 +223,8 @@ private const val ERROR_TYPE_STUB = CommonClassNames.JAVA_LANG_OBJECT private fun ConeKotlinType.mapToCanonicalString(session: FirSession): String { return when (this) { is ConeClassLikeType -> mapToCanonicalString(session) - is ConeTypeVariableType, is ConeFlexibleType, is ConeCapturedType, is ConeDefinitelyNotNullType, is ConeIntersectionType -> + is ConeTypeVariableType, is ConeFlexibleType, is ConeCapturedType, + is ConeDefinitelyNotNullType, is ConeIntersectionType, is ConeStubType -> error("Unexpected type: $this [${this::class}]") is ConeLookupTagBasedType -> lookupTag.name.asString() } @@ -251,7 +252,7 @@ private fun ConeClassType.mapToCanonicalString(session: FirSession): String { } + "[]" } - val context = ConeTypeCheckerContext(false, session) + val context = ConeTypeCheckerContext(isErrorTypeEqualsToAnything = false, isStubTypeEqualsToAnything = true, session = session) with(context) { val typeConstructor = typeConstructor() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt index 23a0de40a8b..62ed7a461c6 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt @@ -178,6 +178,7 @@ fun T.withNullability(nullability: ConeNullability): T { ConeNullability.UNKNOWN -> this // TODO: is that correct? ConeNullability.NOT_NULL -> this } as T + is ConeStubType -> ConeStubType(variable, nullability) as T else -> error("sealed: ${this::class}") } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt index 72265037049..e52423e97e8 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt @@ -51,7 +51,7 @@ class FirSamResolverImpl( getFunctionTypeForPossibleSamType(type.lowerBound) ?: return null, getFunctionTypeForPossibleSamType(type.upperBound) ?: return null ) - is ConeClassErrorType -> null + is ConeClassErrorType, is ConeStubType -> null // TODO: support those types as well is ConeAbbreviatedType, is ConeTypeParameterType, is ConeTypeVariableType, is ConeCapturedType, is ConeDefinitelyNotNullType, is ConeIntersectionType -> null 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 a204cfe6730..664f5c23f99 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 @@ -213,7 +213,8 @@ interface ConeInferenceContext : TypeSystemInferenceExtensionContext, } override fun createStubType(typeVariable: TypeVariableMarker): StubTypeMarker { - TODO("not implemented") + require(typeVariable is ConeTypeVariable) { "$typeVariable should subtype of ${ConeTypeVariable::class.qualifiedName}" } + return ConeStubType(typeVariable, ConeNullability.create(typeVariable.defaultType().isMarkedNullable())) } override fun KotlinTypeMarker.removeAnnotations(): KotlinTypeMarker { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/InferenceUtil.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/InferenceUtil.kt index 737e4a15aac..ad9768464a6 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/InferenceUtil.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/InferenceUtil.kt @@ -41,18 +41,9 @@ fun ConeTypeContext.hasNullableSuperType(type: ConeKotlinType): Boolean { return false } -class ConeTypeVariableTypeConstructor(val debugName: String) : ConeClassifierLookupTag(), TypeVariableTypeConstructorMarker { - override val name: Name get() = Name.identifier(debugName) -} - class TypeParameterBasedTypeVariable(val typeParameterSymbol: FirTypeParameterSymbol) : ConeTypeVariable(typeParameterSymbol.name.identifier) -open class ConeTypeVariable(name: String) : TypeVariableMarker { - val typeConstructor = ConeTypeVariableTypeConstructor(name) - val defaultType = ConeTypeVariableType(ConeNullability.NOT_NULL, typeConstructor) -} - class InferenceComponents( val ctx: TypeSystemInferenceExtensionContextDelegate, val session: FirSession, 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 447a47f1460..faf422e1df9 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 @@ -75,6 +75,7 @@ abstract class AbstractConeSubstitutor : ConeSubstitutor() { is ConeCapturedType -> return null is ConeDefinitelyNotNullType -> this.substituteOriginal() is ConeIntersectionType -> this.substituteIntersectedTypes() + is ConeStubType -> return null } } 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 b39fab638ed..086afca8621 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 @@ -12,7 +12,6 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.calls.ConeInferenceContext -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.substitutorByMap @@ -64,6 +63,7 @@ interface ConeTypeContext : TypeSystemContext, TypeSystemOptimizationContext, Ty is ConeDefinitelyNotNullType -> this is ConeIntersectionType -> this is ConeFlexibleType -> null + is ConeStubType -> this else -> error("Unknown simpleType: $this") } } @@ -131,6 +131,7 @@ interface ConeTypeContext : TypeSystemContext, TypeSystemOptimizationContext, Ty ?: ErrorTypeConstructor("Failed to expand alias: ${this}") is ConeLookupTagBasedType -> this.lookupTag.toSymbol(session) ?: ErrorTypeConstructor("Unresolved: ${this.lookupTag}") is ConeIntersectionType -> this + is ConeStubType -> variable.typeConstructor else -> error("?: ${this}") } @@ -352,6 +353,7 @@ interface ConeTypeContext : TypeSystemContext, TypeSystemOptimizationContext, Ty if (this is ConeCapturedType) return true if (this is ConeTypeVariableType) return false if (this is ConeIntersectionType) return false + if (this is ConeStubType) return true require(this is ConeLookupTagBasedType) val typeConstructor = this.typeConstructor() return typeConstructor is FirClassSymbol<*> || @@ -367,7 +369,7 @@ interface ConeTypeContext : TypeSystemContext, TypeSystemOptimizationContext, Ty } override fun SimpleTypeMarker.isStubType(): Boolean { - return false // TODO + return this is StubTypeMarker } override fun intersectTypes(types: List): SimpleTypeMarker {