Explicit equals call on non nullable receiver

This commit is contained in:
Pavel V. Talanov
2012-07-06 20:20:49 +04:00
parent 3814384762
commit 3d58d1ec16
4 changed files with 50 additions and 14 deletions
@@ -30,6 +30,10 @@ public final class EqualsTest extends AbstractExpressionTest {
fooBoxTest(); fooBoxTest();
} }
public void testExplicitEqualsMethod() throws Exception {
fooBoxTest();
}
public void testStringsEqual() throws Exception { public void testStringsEqual() throws Exception {
fooBoxTest(); fooBoxTest();
} }
@@ -147,7 +147,7 @@ public final class Intrinsics {
FunctionDescriptor iteratorFunction = getFunctionByName(arrayMemberScope, Name.identifier("iterator")); FunctionDescriptor iteratorFunction = getFunctionByName(arrayMemberScope, Name.identifier("iterator"));
functionIntrinsics.put(iteratorFunction, new CallStandardMethodIntrinsic("Kotlin.arrayIterator", true, 0)); functionIntrinsics.put(iteratorFunction, new CallStandardMethodIntrinsic("Kotlin.arrayIterator", true, 0));
ConstructorDescriptor arrayConstructor = ConstructorDescriptor arrayConstructor =
((ClassDescriptor)arrayMemberScope.getContainingDeclaration()).getConstructors().iterator().next(); ((ClassDescriptor) arrayMemberScope.getContainingDeclaration()).getConstructors().iterator().next();
functionIntrinsics.put(arrayConstructor, new CallStandardMethodIntrinsic("Kotlin.arrayFromFun", false, 2)); functionIntrinsics.put(arrayConstructor, new CallStandardMethodIntrinsic("Kotlin.arrayFromFun", false, 2));
} }
@@ -202,7 +202,7 @@ public final class Intrinsics {
public boolean isIntrinsic(@NotNull DeclarationDescriptor descriptor) { public boolean isIntrinsic(@NotNull DeclarationDescriptor descriptor) {
//NOTE: that if we want to add other intrinsics we have to modify this method //NOTE: that if we want to add other intrinsics we have to modify this method
if (descriptor instanceof FunctionDescriptor) { if (descriptor instanceof FunctionDescriptor) {
FunctionDescriptor functionDescriptor = (FunctionDescriptor)descriptor.getOriginal(); FunctionDescriptor functionDescriptor = (FunctionDescriptor) descriptor.getOriginal();
return (equalsIntrinsics.containsKey(functionDescriptor) || return (equalsIntrinsics.containsKey(functionDescriptor) ||
compareToIntrinsics.containsKey(functionDescriptor) || compareToIntrinsics.containsKey(functionDescriptor) ||
functionIntrinsics.containsKey(functionDescriptor)); functionIntrinsics.containsKey(functionDescriptor));
@@ -210,9 +210,17 @@ public final class Intrinsics {
return false; return false;
} }
//NOTE: that if we want to add other intrinsics we have to modify this method
@NotNull @NotNull
public Intrinsic getFunctionIntrinsic(@NotNull FunctionDescriptor descriptor) { public Intrinsic getIntrinsic(@NotNull FunctionDescriptor descriptor) {
return functionIntrinsics.get(descriptor.getOriginal()); Intrinsic intrinsic = functionIntrinsics.get(descriptor.getOriginal());
if (intrinsic == null) {
intrinsic = equalsIntrinsics.get(descriptor.getOriginal());
}
if (intrinsic == null) {
intrinsic = compareToIntrinsics.get(descriptor.getOriginal());
}
return intrinsic;
} }
@NotNull @NotNull
@@ -126,7 +126,7 @@ public final class CallTranslator extends AbstractTranslator {
private JsExpression intrinsicInvocation() { private JsExpression intrinsicInvocation() {
assert descriptor instanceof FunctionDescriptor; assert descriptor instanceof FunctionDescriptor;
try { try {
Intrinsic intrinsic = context().intrinsics().getFunctionIntrinsic((FunctionDescriptor) descriptor); Intrinsic intrinsic = context().intrinsics().getIntrinsic((FunctionDescriptor) descriptor);
return intrinsic.apply(callParameters.getThisOrReceiverOrNull(), arguments, context()); return intrinsic.apply(callParameters.getThisOrReceiverOrNull(), arguments, context());
} }
catch (RuntimeException e) { catch (RuntimeException e) {
@@ -0,0 +1,24 @@
package foo
class Foo(val name: String) {
public fun equals(that: Any?): Boolean {
if (that !is Foo) {
return false
}
return this.name == that.name
}
}
fun callEqualsMethod(v1: Foo, v2: Foo): Boolean {
return v1.equals(v2)
}
fun box() : Boolean {
val a = Foo("abc")
val b = Foo("abc")
val c = Foo("def")
if (!callEqualsMethod(a, b)) return false
if (callEqualsMethod(a, c)) return false
return true
}