Explicit equals call on non nullable receiver
This commit is contained in:
@@ -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
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user