From 37532e8d02baa0264476874c76ba3b62350992e7 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 30 May 2014 16:47:56 +0400 Subject: [PATCH] Compare return types when structurally comparing callables --- .../DescriptorEquivalenceForOverrides.kt | 4 +-- .../classGenericsInReturnType.kt | 36 +++++++++++++++++++ .../duplicateMethod/covariantReturnTypes.kt | 36 +++++++++++++++++++ .../duplicateMethod/differentReturnTypes.kt | 2 +- .../checkers/JetDiagnosticsTestGenerated.java | 10 ++++++ 5 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/multimodule/duplicateMethod/classGenericsInReturnType.kt create mode 100644 compiler/testData/diagnostics/tests/multimodule/duplicateMethod/covariantReturnTypes.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorEquivalenceForOverrides.kt b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorEquivalenceForOverrides.kt index abc3b409498..76a17dad655 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorEquivalenceForOverrides.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorEquivalenceForOverrides.kt @@ -85,8 +85,8 @@ object DescriptorEquivalenceForOverrides { areTypeParametersEquivalent(d1, d2, {x, y -> x == a && y == b}) } - return overridingUtil.isOverridableBy(a, b).getResult() == OverrideCompatibilityInfo.Result.OVERRIDABLE - && overridingUtil.isOverridableBy(b, a).getResult() == OverrideCompatibilityInfo.Result.OVERRIDABLE + return overridingUtil.isOverridableByIncludingReturnType(a, b).getResult() == OverrideCompatibilityInfo.Result.OVERRIDABLE + && overridingUtil.isOverridableByIncludingReturnType(b, a).getResult() == OverrideCompatibilityInfo.Result.OVERRIDABLE } diff --git a/compiler/testData/diagnostics/tests/multimodule/duplicateMethod/classGenericsInReturnType.kt b/compiler/testData/diagnostics/tests/multimodule/duplicateMethod/classGenericsInReturnType.kt new file mode 100644 index 00000000000..97428dc54e3 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multimodule/duplicateMethod/classGenericsInReturnType.kt @@ -0,0 +1,36 @@ +// !DIAGNOSTICS: -UNNECESSARY_SAFE_CALL + +// MODULE: m1 +// FILE: a.kt +package p + +public trait B { + public fun foo(): T +} + +// MODULE: m2(m1) +// FILE: b.kt +package p + +public trait C : B { + override fun foo(): X + +} + +// MODULE: m3 +// FILE: b.kt +package p + +public trait B { + public fun foo(): T +} + +// MODULE: m4(m3, m2) +// FILE: c.kt +import p.* + +fun test(b: B?) { + if (b is C) { + b?.foo() + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/multimodule/duplicateMethod/covariantReturnTypes.kt b/compiler/testData/diagnostics/tests/multimodule/duplicateMethod/covariantReturnTypes.kt new file mode 100644 index 00000000000..4ae00f94b8c --- /dev/null +++ b/compiler/testData/diagnostics/tests/multimodule/duplicateMethod/covariantReturnTypes.kt @@ -0,0 +1,36 @@ +// !DIAGNOSTICS: -UNNECESSARY_SAFE_CALL + +// MODULE: m1 +// FILE: a.kt +package p + +public trait B { + public fun getParent(): B? +} + +// MODULE: m2(m1) +// FILE: b.kt +package p + +public trait C : B { + override fun getParent(): B? + +} + +// MODULE: m3 +// FILE: b.kt +package p + +public trait B { + public fun getParent(): Any? +} + +// MODULE: m4(m3, m2) +// FILE: c.kt +import p.* + +fun test(b: B?) { + if (b is C) { + b?.getParent() + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/multimodule/duplicateMethod/differentReturnTypes.kt b/compiler/testData/diagnostics/tests/multimodule/duplicateMethod/differentReturnTypes.kt index d8fa721ba3d..2d8d73cafb0 100644 --- a/compiler/testData/diagnostics/tests/multimodule/duplicateMethod/differentReturnTypes.kt +++ b/compiler/testData/diagnostics/tests/multimodule/duplicateMethod/differentReturnTypes.kt @@ -31,6 +31,6 @@ import p.* fun test(b: B?) { if (b is C) { - b?.getParent() + b?.getParent() } } \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 4a50cdba1b6..4e46d64d01a 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -4797,11 +4797,21 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest("compiler/testData/diagnostics/tests/multimodule/duplicateMethod/classGenericsInParamsNameMismatch.kt"); } + @TestMetadata("classGenericsInReturnType.kt") + public void testClassGenericsInReturnType() throws Exception { + doTest("compiler/testData/diagnostics/tests/multimodule/duplicateMethod/classGenericsInReturnType.kt"); + } + @TestMetadata("classVsFunctionGenericsInParamsMismatch.kt") public void testClassVsFunctionGenericsInParamsMismatch() throws Exception { doTest("compiler/testData/diagnostics/tests/multimodule/duplicateMethod/classVsFunctionGenericsInParamsMismatch.kt"); } + @TestMetadata("covariantReturnTypes.kt") + public void testCovariantReturnTypes() throws Exception { + doTest("compiler/testData/diagnostics/tests/multimodule/duplicateMethod/covariantReturnTypes.kt"); + } + @TestMetadata("differenceInParamNames.kt") public void testDifferenceInParamNames() throws Exception { doTest("compiler/testData/diagnostics/tests/multimodule/duplicateMethod/differenceInParamNames.kt");