From 692442d7a29a2b6002b2a1c58ff58987b3693b30 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 2 Dec 2019 17:02:07 +0300 Subject: [PATCH] Do not look into captured star projection as types --- .../resolve/calls/NewCommonSuperTypeCalculator.kt | 10 +++++++--- .../calls/inference/model/NewConstraintSystemImpl.kt | 6 ++++-- .../jetbrains/kotlin/types/model/TypeSystemContext.kt | 3 ++- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/NewCommonSuperTypeCalculator.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/NewCommonSuperTypeCalculator.kt index 5813af7618c..2ec2cbb7336 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/NewCommonSuperTypeCalculator.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/NewCommonSuperTypeCalculator.kt @@ -16,9 +16,12 @@ package org.jetbrains.kotlin.resolve.calls -import org.jetbrains.kotlin.types.* -import org.jetbrains.kotlin.types.checker.* +import org.jetbrains.kotlin.types.AbstractNullabilityChecker import org.jetbrains.kotlin.types.AbstractNullabilityChecker.hasPathByNotMarkedNullableNodes +import org.jetbrains.kotlin.types.AbstractTypeChecker +import org.jetbrains.kotlin.types.AbstractTypeCheckerContext +import org.jetbrains.kotlin.types.UnwrappedType +import org.jetbrains.kotlin.types.checker.SimpleClassicTypeSystemContext import org.jetbrains.kotlin.types.model.* object NewCommonSuperTypeCalculator { @@ -174,7 +177,8 @@ object NewCommonSuperTypeCalculator { } private fun TypeSystemCommonSuperTypesContext.isCapturedStubType(type: SimpleTypeMarker): Boolean { - val projectedType = type.asCapturedType()?.typeConstructor()?.projection()?.getType() ?: return false + val projectedType = + type.asCapturedType()?.typeConstructor()?.projection()?.takeUnless { it.isStarProjection() }?.getType() ?: return false return projectedType.asSimpleType()?.isStubType() == true } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt index 2257a0af47b..f7009be4542 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt @@ -185,10 +185,12 @@ class NewConstraintSystemImpl( val capturedType = it.asSimpleType()?.asCapturedType() // TODO: change NewCapturedType to markered one for FE-IR val typeToCheck = if (capturedType is CapturedTypeMarker && capturedType.captureStatus() == CaptureStatus.FROM_EXPRESSION) - capturedType.typeConstructorProjection().getType() + capturedType.typeConstructorProjection().takeUnless { projection -> projection.isStarProjection() }?.getType() else it + if (typeToCheck == null) return@contains false + storage.allTypeVariables.containsKey(typeToCheck.typeConstructor()) } } @@ -333,4 +335,4 @@ class NewConstraintSystemImpl( return constraints.any { (it.kind == ConstraintKind.UPPER || it.kind == ConstraintKind.EQUALITY) && it.type.isUnit() } } -} \ No newline at end of file +} diff --git a/core/type-system/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt b/core/type-system/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt index e692bd08400..9af3760bcb9 100644 --- a/core/type-system/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt +++ b/core/type-system/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt @@ -233,7 +233,8 @@ interface TypeSystemContext : TypeSystemOptimizationContext { fun KotlinTypeMarker.isDynamic(): Boolean = asFlexibleType()?.asDynamicType() != null fun KotlinTypeMarker.isCapturedDynamic(): Boolean = - asSimpleType()?.asCapturedType()?.typeConstructor()?.projection()?.getType()?.isDynamic() == true + asSimpleType()?.asCapturedType()?.typeConstructor()?.projection()?.takeUnless { it.isStarProjection() } + ?.getType()?.isDynamic() == true fun KotlinTypeMarker.isDefinitelyNotNullType(): Boolean = asSimpleType()?.asDefinitelyNotNullType() != null