From 0b6a4df4f46b2a4f7baafa4322020015389f256e Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 9 Sep 2014 21:31:59 +0400 Subject: [PATCH] The case of Integer.getInteger("1", 2) fixed (was: OVERLOAD_RESOLUTION_AMBIGUITY) --- .../results/OverloadingConflictResolver.java | 19 +++++++++++- .../platformTypes/intVsIntegerAmbiguity.kt | 29 +++++++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 6 ++++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/platformTypes/intVsIntegerAmbiguity.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/results/OverloadingConflictResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/results/OverloadingConflictResolver.java index aebe433202f..1a177b796fd 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/results/OverloadingConflictResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/results/OverloadingConflictResolver.java @@ -28,6 +28,7 @@ import org.jetbrains.jet.lang.resolve.calls.model.VariableAsFunctionResolvedCall import org.jetbrains.jet.lang.types.BoundsSubstitutor; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.TypeUtils; +import org.jetbrains.jet.lang.types.TypesPackage; import org.jetbrains.jet.lang.types.checker.JetTypeChecker; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; @@ -239,8 +240,24 @@ public class OverloadingConflictResolver { } private boolean typeMoreSpecific(@NotNull JetType specific, @NotNull JetType general) { - return JetTypeChecker.DEFAULT.isSubtypeOf(specific, general) || + boolean isSubtype = JetTypeChecker.DEFAULT.isSubtypeOf(specific, general) || numericTypeMoreSpecific(specific, general); + if (!isSubtype) return false; + + boolean specificIsFlexible = TypesPackage.isFlexible(specific); + boolean generalIsFlexible = TypesPackage.isFlexible(general); + + if (specificIsFlexible && !generalIsFlexible) { + // Int! lessSpecific Int + // Int! >< Int? + return false; + } + else if (!specificIsFlexible && generalIsFlexible) { + // Int? >< Int! + if (specific.isNullable()) return false; + } + + return true; } private boolean numericTypeMoreSpecific(@NotNull JetType specific, @NotNull JetType general) { diff --git a/compiler/testData/diagnostics/tests/platformTypes/intVsIntegerAmbiguity.kt b/compiler/testData/diagnostics/tests/platformTypes/intVsIntegerAmbiguity.kt new file mode 100644 index 00000000000..1f4e96bc6e2 --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/intVsIntegerAmbiguity.kt @@ -0,0 +1,29 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER +// FILE: p/J.java + +package p; + +public class J { + public interface A {} + public static A foo(int s); + + public interface B {} + public static B foo(Integer s); +} + +// FILE: k.kt + +import p.* +import p.J.* + +class C + +fun foo(i: Int?) : C = null!! + +fun test(i: Int, ni: Int?) { + foo(2) : J.A + foo(i) : J.A + J.foo(ni) : J.B + foo(ni) +} + diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 276ee08404d..8d5b9e2915f 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -7743,6 +7743,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("intVsIntegerAmbiguity.kt") + public void testIntVsIntegerAmbiguity() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/intVsIntegerAmbiguity.kt"); + doTest(fileName); + } + @TestMetadata("override.kt") public void testOverride() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/override.kt");