From 7b89771953e142550b72a6e8c3f0058d37f28a21 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Mon, 20 Oct 2014 18:54:25 +0400 Subject: [PATCH] KT-6059 Regression: irrelevant compiler error on trait inheritance (worked in M8) #KT-6059 Fixed --- .../jet/lang/resolve/DeclarationsChecker.java | 7 ++ .../supertypeArgumentsExplicit.kt | 14 ++++ .../supertypeArgumentsExplicit.txt | 55 +++++++++++++++ .../platformTypes/supertypeTypeArguments.kt | 2 + .../platformTypes/supertypeTypeArguments.txt | 67 +++++++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 12 ++++ 6 files changed, 157 insertions(+) create mode 100644 compiler/testData/diagnostics/tests/platformTypes/supertypeArgumentsExplicit.kt create mode 100644 compiler/testData/diagnostics/tests/platformTypes/supertypeArgumentsExplicit.txt create mode 100644 compiler/testData/diagnostics/tests/platformTypes/supertypeTypeArguments.kt create mode 100644 compiler/testData/diagnostics/tests/platformTypes/supertypeTypeArguments.txt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java index 73cc22af25a..bd4db9fc9ee 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java @@ -195,6 +195,7 @@ public class DeclarationsChecker { switch (typeParameterDescriptor.getVariance()) { case INVARIANT: // Leave conflicting types as is + Filter.REMOVE_IF_EQUAL_TYPE_IN_THE_SET.proceed(conflictingTypes); break; case IN_VARIANCE: // Filter out those who have supertypes in this set (common supertype) @@ -233,6 +234,12 @@ public class DeclarationsChecker { public boolean removeNeeded(JetType subject, JetType other) { return JetTypeChecker.DEFAULT.isSubtypeOf(subject, other); } + }, + REMOVE_IF_EQUAL_TYPE_IN_THE_SET { + @Override + public boolean removeNeeded(JetType subject, JetType other) { + return JetTypeChecker.DEFAULT.equalTypes(subject, other); + } }; private void proceed(Set conflictingTypes) { diff --git a/compiler/testData/diagnostics/tests/platformTypes/supertypeArgumentsExplicit.kt b/compiler/testData/diagnostics/tests/platformTypes/supertypeArgumentsExplicit.kt new file mode 100644 index 00000000000..b269d1b4a96 --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/supertypeArgumentsExplicit.kt @@ -0,0 +1,14 @@ +// !EXPLICIT_FLEXIBLE_TYPES +// !DIAGNOSTICS: -BASE_WITH_NULLABLE_UPPER_BOUND + +trait A +trait B: A> + +trait C: A, B +trait D: B, A +trait E: A, B +trait F: A, B + +trait G: A, B +trait H: A, B +trait I: B, A \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/platformTypes/supertypeArgumentsExplicit.txt b/compiler/testData/diagnostics/tests/platformTypes/supertypeArgumentsExplicit.txt new file mode 100644 index 00000000000..70f63634d3a --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/supertypeArgumentsExplicit.txt @@ -0,0 +1,55 @@ +package + +internal trait A { + 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 +} + +internal trait B : A { + 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 +} + +internal trait C : A, B { + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal trait D : B, A { + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal trait E : A, B { + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal trait F : A, B { + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal trait G : A, B { + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal trait H : A, B { + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal trait I : B, A { + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/supertypeTypeArguments.kt b/compiler/testData/diagnostics/tests/platformTypes/supertypeTypeArguments.kt new file mode 100644 index 00000000000..48c821f00b4 --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/supertypeTypeArguments.kt @@ -0,0 +1,2 @@ +trait ExtMap : Map +class HashMapEx : java.util.HashMap(), ExtMap \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/platformTypes/supertypeTypeArguments.txt b/compiler/testData/diagnostics/tests/platformTypes/supertypeTypeArguments.txt new file mode 100644 index 00000000000..53e1a0977ac --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/supertypeTypeArguments.txt @@ -0,0 +1,67 @@ +package + +internal trait ExtMap : kotlin.Map { + public abstract override /*1*/ /*fake_override*/ fun containsKey(/*0*/ key: kotlin.Any?): kotlin.Boolean + public abstract override /*1*/ /*fake_override*/ fun containsValue(/*0*/ value: kotlin.Any?): kotlin.Boolean + public abstract override /*1*/ /*fake_override*/ fun entrySet(): kotlin.Set> + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract override /*1*/ /*fake_override*/ fun get(/*0*/ key: kotlin.Any?): V? + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public abstract override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean + public abstract override /*1*/ /*fake_override*/ fun keySet(): kotlin.Set + public abstract override /*1*/ /*fake_override*/ fun size(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + public abstract override /*1*/ /*fake_override*/ fun values(): kotlin.Collection +} + +internal final class HashMapEx : java.util.HashMap, ExtMap { + public constructor HashMapEx() + invisible_fake final override /*1*/ /*fake_override*/ var entrySet: kotlin.(Mutable)Set!>! + invisible_fake final override /*1*/ /*fake_override*/ val hashSeed: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var keySet: kotlin.(Mutable)Set! + invisible_fake final override /*1*/ /*fake_override*/ val loadFactor: kotlin.Float + invisible_fake final override /*1*/ /*fake_override*/ var modCount: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var size: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var table: kotlin.Array<(out) java.util.HashMap.Entry!>! + invisible_fake final override /*1*/ /*fake_override*/ var threshold: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var useAltHashing: kotlin.Boolean + invisible_fake final override /*1*/ /*fake_override*/ var values: kotlin.(Mutable)Collection! + invisible_fake open override /*1*/ /*fake_override*/ fun addEntry(/*0*/ p0: kotlin.Int, /*1*/ p1: K!, /*2*/ p2: V!, /*3*/ p3: kotlin.Int): kotlin.Unit + invisible_fake open override /*1*/ /*fake_override*/ fun capacity(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun clone(): kotlin.Any! + public open override /*2*/ /*fake_override*/ fun containsKey(/*0*/ key: kotlin.Any?): kotlin.Boolean + invisible_fake open override /*1*/ /*fake_override*/ fun containsNullValue(): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun containsValue(/*0*/ value: kotlin.Any?): kotlin.Boolean + invisible_fake open override /*1*/ /*fake_override*/ fun createEntry(/*0*/ p0: kotlin.Int, /*1*/ p1: K!, /*2*/ p2: V!, /*3*/ p3: kotlin.Int): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun entrySet(): kotlin.Set> + invisible_fake open override /*1*/ /*fake_override*/ fun entrySet0(): kotlin.(Mutable)Set!>! + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun get(/*0*/ key: kotlin.Any?): V? + invisible_fake final override /*1*/ /*fake_override*/ fun getEntry(/*0*/ p0: kotlin.Any!): java.util.HashMap.Entry! + invisible_fake open override /*1*/ /*fake_override*/ fun getForNullKey(): V! + invisible_fake final override /*1*/ /*fake_override*/ fun hash(/*0*/ p0: kotlin.Any!): kotlin.Int + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + invisible_fake open override /*1*/ /*fake_override*/ fun init(): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun keySet(): kotlin.Set + invisible_fake open override /*1*/ /*fake_override*/ fun loadFactor(): kotlin.Float + invisible_fake open override /*1*/ /*fake_override*/ fun newEntryIterator(): kotlin.(Mutable)Iterator!>! + invisible_fake open override /*1*/ /*fake_override*/ fun newKeyIterator(): kotlin.(Mutable)Iterator! + invisible_fake open override /*1*/ /*fake_override*/ fun newValueIterator(): kotlin.(Mutable)Iterator! + public open override /*1*/ /*fake_override*/ fun put(/*0*/ key: K!, /*1*/ value: V!): V! + public open override /*1*/ /*fake_override*/ fun putAll(/*0*/ m: (kotlin.MutableMap..kotlin.Map?)): kotlin.Unit + invisible_fake open override /*1*/ /*fake_override*/ fun putAllForCreate(/*0*/ p0: (kotlin.MutableMap..kotlin.Map?)): kotlin.Unit + invisible_fake open override /*1*/ /*fake_override*/ fun putForCreate(/*0*/ p0: K!, /*1*/ p1: V!): kotlin.Unit + invisible_fake open override /*1*/ /*fake_override*/ fun putForNullKey(/*0*/ p0: V!): V! + invisible_fake open override /*1*/ /*fake_override*/ fun readObject(/*0*/ p0: java.io.ObjectInputStream!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun remove(/*0*/ key: kotlin.Any!): V! + invisible_fake final override /*1*/ /*fake_override*/ fun removeEntryForKey(/*0*/ p0: kotlin.Any!): java.util.HashMap.Entry! + invisible_fake final override /*1*/ /*fake_override*/ fun removeMapping(/*0*/ p0: kotlin.Any!): java.util.HashMap.Entry! + invisible_fake open override /*1*/ /*fake_override*/ fun resize(/*0*/ p0: kotlin.Int): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun size(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String + invisible_fake open override /*1*/ /*fake_override*/ fun transfer(/*0*/ p0: kotlin.Array<(out) java.util.HashMap.Entry!>!, /*1*/ p1: kotlin.Boolean): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun values(): kotlin.Collection + invisible_fake open override /*1*/ /*fake_override*/ fun writeObject(/*0*/ p0: java.io.ObjectOutputStream!): kotlin.Unit +} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 46e182d0346..b66b8ad1d8f 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -7753,6 +7753,18 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("supertypeArgumentsExplicit.kt") + public void testSupertypeArgumentsExplicit() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/supertypeArgumentsExplicit.kt"); + doTest(fileName); + } + + @TestMetadata("supertypeTypeArguments.kt") + public void testSupertypeTypeArguments() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/supertypeTypeArguments.kt"); + doTest(fileName); + } + @TestMetadata("compiler/testData/diagnostics/tests/platformTypes/commonSupertype") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)