From b99efb9a2ba10ca8a3ae8df2923b340508dbacdd Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Mon, 15 Jul 2019 18:41:36 +0300 Subject: [PATCH] [NI] Look for type variables in captured flexible types #KT-32434 Fixed --- .../fir/FirDiagnosticsSmokeTestGenerated.java | 5 ++ ...ctTypeCheckerContextForConstraintSystem.kt | 14 ++++-- .../diagnostics/tests/inference/kt32434.kt | 32 +++++++++++++ .../diagnostics/tests/inference/kt32434.txt | 48 +++++++++++++++++++ .../checkers/DiagnosticsTestGenerated.java | 5 ++ .../DiagnosticsUsingJavacTestGenerated.java | 5 ++ 6 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/inference/kt32434.kt create mode 100644 compiler/testData/diagnostics/tests/inference/kt32434.txt diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java index 688d1023e36..ae9e822d418 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java @@ -9711,6 +9711,11 @@ public class FirDiagnosticsSmokeTestGenerated extends AbstractFirDiagnosticsSmok runTest("compiler/testData/diagnostics/tests/inference/kt3184.kt"); } + @TestMetadata("kt32434.kt") + public void testKt32434() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/kt32434.kt"); + } + @TestMetadata("kt6175.kt") public void testKt6175() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/kt6175.kt"); diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/AbstractTypeCheckerContextForConstraintSystem.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/AbstractTypeCheckerContextForConstraintSystem.kt index 6159ddbf36b..00ec0ad3b55 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/AbstractTypeCheckerContextForConstraintSystem.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/AbstractTypeCheckerContextForConstraintSystem.kt @@ -90,7 +90,7 @@ abstract class AbstractTypeCheckerContextForConstraintSystem : AbstractTypeCheck val projection = typeMarker.typeConstructorProjection() if (projection.isStarProjection()) return null if (projection.getVariance() == TypeVariance.IN) { - val type = projection.getType().asSimpleType() ?: return null + val type = projection.getType().let { it.asSimpleType() ?: it.asFlexibleType()?.lowerBound() } ?: return null if (isMyTypeVariable(type)) { simplifyLowerConstraint(type, superType) if (isMyTypeVariable(superType.asSimpleType() ?: return null)) { @@ -100,10 +100,14 @@ abstract class AbstractTypeCheckerContextForConstraintSystem : AbstractTypeCheck return null } - return if (projection.getVariance() == TypeVariance.OUT) - projection.getType().takeIf { it is SimpleTypeMarker && isMyTypeVariable(it) }?.asSimpleType() - else - null + return if (projection.getVariance() == TypeVariance.OUT) { + val type = projection.getType() + when { + type is SimpleTypeMarker && isMyTypeVariable(type) -> type.asSimpleType() + type is FlexibleTypeMarker && isMyTypeVariable(type.lowerBound()) -> type.asFlexibleType()?.lowerBound() + else -> null + } + } else null } /** diff --git a/compiler/testData/diagnostics/tests/inference/kt32434.kt b/compiler/testData/diagnostics/tests/inference/kt32434.kt new file mode 100644 index 00000000000..72c785a37e6 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/kt32434.kt @@ -0,0 +1,32 @@ +// FULL_JDK +// !WITH_NEW_INFERENCE +// !DIAGNOSTICS: -UNUSED_PARAMETER +// Issue: KT-32434 + +// FILE: CacheMonoJava.java + +public class CacheMonoJava { + public static Mono lookup(java.util.Map> map, K key) { + throw new UnsupportedOperationException(); + } +} + +// FILE: main.kt + +interface Cache { + fun asMap(): MutableMap +} + +interface Mono +interface Signal : Mono + +interface AttributeDefinition + +val cache: Cache> = TODO() + +object CacheMonoKotlin { + fun lookup(map: MutableMap>, key: K): Mono = TODO() +} + +fun findByName_java(name: String): Mono = CacheMonoJava.lookup(cache.asMap(), name) +fun findByName_kotlin(name: String): Mono = CacheMonoKotlin.lookup(cache.asMap(), name) diff --git a/compiler/testData/diagnostics/tests/inference/kt32434.txt b/compiler/testData/diagnostics/tests/inference/kt32434.txt new file mode 100644 index 00000000000..563b298cbf9 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/kt32434.txt @@ -0,0 +1,48 @@ +package + +public val cache: Cache> +public fun findByName_java(/*0*/ name: kotlin.String): Mono +public fun findByName_kotlin(/*0*/ name: kotlin.String): Mono + +public interface AttributeDefinition { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface Cache { + public abstract fun asMap(): kotlin.collections.MutableMap + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public open class CacheMonoJava { + public constructor CacheMonoJava() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + // Static members + public open fun lookup(/*0*/ map: kotlin.collections.MutableMap!>!, /*1*/ key: K!): Mono! +} + +public object CacheMonoKotlin { + private constructor CacheMonoKotlin() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final fun lookup(/*0*/ map: kotlin.collections.MutableMap>, /*1*/ key: K): Mono + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface Mono { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface Signal : Mono { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 8f838fba1aa..6251bc2d177 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -9718,6 +9718,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { runTest("compiler/testData/diagnostics/tests/inference/kt3184.kt"); } + @TestMetadata("kt32434.kt") + public void testKt32434() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/kt32434.kt"); + } + @TestMetadata("kt6175.kt") public void testKt6175() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/kt6175.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 6226e734e9f..efa292aea8f 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -9713,6 +9713,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing runTest("compiler/testData/diagnostics/tests/inference/kt3184.kt"); } + @TestMetadata("kt32434.kt") + public void testKt32434() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/kt32434.kt"); + } + @TestMetadata("kt6175.kt") public void testKt6175() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/kt6175.kt");