From c1dbe9eee212b73bdf7a74a673d128f9e99fac72 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 6 Sep 2011 13:16:05 +0400 Subject: [PATCH] Specificity by receiver fixed. Test updated --- .../calls/OverloadingConflictResolver.java | 15 ++++++++++++--- idea/testData/checker/ExtensionFunctions.jet | 6 +++--- .../checker/regression/SpecififcityByReceiver.jet | 9 +++++++++ 3 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 idea/testData/checker/regression/SpecififcityByReceiver.jet diff --git a/idea/src/org/jetbrains/jet/lang/resolve/calls/OverloadingConflictResolver.java b/idea/src/org/jetbrains/jet/lang/resolve/calls/OverloadingConflictResolver.java index d2a824bf850..2a9887e3c2c 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/calls/OverloadingConflictResolver.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/calls/OverloadingConflictResolver.java @@ -59,6 +59,12 @@ import java.util.Set; if (overrides(f, g)) return true; if (overrides(g, f)) return false; + JetType receiverTypeOfF = f.getReceiverType(); + JetType receiverTypeOfG = g.getReceiverType(); + if (receiverTypeOfF != null && receiverTypeOfG != null) { + if (!typeMoreSpecific(receiverTypeOfF, receiverTypeOfG)) return false; + } + List fParams = f.getValueParameters(); List gParams = g.getValueParameters(); @@ -68,9 +74,7 @@ import java.util.Set; JetType fParamType = fParams.get(i).getOutType(); JetType gParamType = gParams.get(i).getOutType(); - if (!semanticServices.getTypeChecker().isSubtypeOf(fParamType, gParamType) - && !numericTypeMoreSpecific(fParamType, gParamType) - ) { + if (!typeMoreSpecific(fParamType, gParamType)) { return false; } } @@ -92,6 +96,11 @@ import java.util.Set; return !f.getOriginal().getTypeParameters().isEmpty(); } + private boolean typeMoreSpecific(@NotNull JetType specific, @NotNull JetType general) { + return semanticServices.getTypeChecker().isSubtypeOf(specific, general) || + numericTypeMoreSpecific(specific, general); + } + private boolean numericTypeMoreSpecific(@NotNull JetType specific, @NotNull JetType general) { JetStandardLibrary standardLibrary = semanticServices.getStandardLibrary(); JetType _double = standardLibrary.getDoubleType(); diff --git a/idea/testData/checker/ExtensionFunctions.jet b/idea/testData/checker/ExtensionFunctions.jet index 75df8a0f4c0..e8f48b27932 100644 --- a/idea/testData/checker/ExtensionFunctions.jet +++ b/idea/testData/checker/ExtensionFunctions.jet @@ -16,7 +16,7 @@ class A fun A.plus(a : Any) { 1.foo() - true.foo() + true.foo() 1 } @@ -57,8 +57,8 @@ namespace null_safety { command.foo - command.equals(null) - command?.equals(null) + command.equals(null) + command?.equals(null) command.equals1(null) command?.equals1(null) diff --git a/idea/testData/checker/regression/SpecififcityByReceiver.jet b/idea/testData/checker/regression/SpecififcityByReceiver.jet new file mode 100644 index 00000000000..3ea23c51e45 --- /dev/null +++ b/idea/testData/checker/regression/SpecififcityByReceiver.jet @@ -0,0 +1,9 @@ +fun Any.equals(other : Any?) : Boolean + +fun main(args: Array) { + + val command : Any = 1 + + command?.equals(null) + command.equals(null) +} \ No newline at end of file