diff --git a/compiler/testData/mockJDK/jre/lib/rt.jar b/compiler/testData/mockJDK/jre/lib/rt.jar index bc09a129fae..a97cdd5ff3d 100644 Binary files a/compiler/testData/mockJDK/jre/lib/rt.jar and b/compiler/testData/mockJDK/jre/lib/rt.jar differ diff --git a/compiler/testData/mockJDK/src.zip b/compiler/testData/mockJDK/src.zip index 0a1d6b2634d..f5c454a3a6b 100644 Binary files a/compiler/testData/mockJDK/src.zip and b/compiler/testData/mockJDK/src.zip differ diff --git a/generators/src/org/jetbrains/jet/generators/mockJDK/GenerateMockJdk.java b/generators/src/org/jetbrains/jet/generators/mockJDK/GenerateMockJdk.java index 3785c324462..1972bd824d9 100644 --- a/generators/src/org/jetbrains/jet/generators/mockJDK/GenerateMockJdk.java +++ b/generators/src/org/jetbrains/jet/generators/mockJDK/GenerateMockJdk.java @@ -252,6 +252,7 @@ public class GenerateMockJdk { "java/util/Properties.class", "java/util/Random.class", "java/util/RandomAccess.class", + "java/util/Objects.class", "java/util/Set.class", "java/util/SortedMap.class", "java/util/SortedSet.class", diff --git a/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt index 2101864a2cc..b5914c641c2 100644 --- a/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt +++ b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt @@ -235,6 +235,11 @@ open class ExpressionVisitor(private val converter: Converter) : JavaElementVisi } } + if (target is PsiMethod && isObjectsEquals(target) && arguments.size == 2) { + result = BinaryExpression(converter.convertExpression(arguments[0]), converter.convertExpression(arguments[1]), "==") + return + } + result = MethodCallExpression(converter.convertExpression(methodExpr), convertArguments(expression), typeArguments, @@ -247,6 +252,12 @@ open class ExpressionVisitor(private val converter: Converter) : JavaElementVisi method.getParameterList().getParameters().single().getType().getCanonicalText() == JAVA_LANG_OBJECT } + private fun isObjectsEquals(method: PsiMethod): Boolean { + return method.getName() == "equals" && + method.getParameterList().getParameters().size == 2 && + method.getContainingClass()?.getQualifiedName() == "java.util.Objects" + } + override fun visitNewExpression(expression: PsiNewExpression) { if (expression.getArrayInitializer() != null) { result = converter.convertExpression(expression.getArrayInitializer()) diff --git a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java index 6ab3362124c..b9510969966 100644 --- a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java +++ b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java @@ -1146,6 +1146,11 @@ public class JavaToKotlinConverterTestGenerated extends AbstractJavaToKotlinConv doTest("j2k/tests/testData/ast/equals/Equals4.java"); } + @TestMetadata("ObjectsEquals.java") + public void testObjectsEquals() throws Exception { + doTest("j2k/tests/testData/ast/equals/ObjectsEquals.java"); + } + } @TestMetadata("j2k/tests/testData/ast/field") diff --git a/j2k/tests/testData/ast/equals/ObjectsEquals.java b/j2k/tests/testData/ast/equals/ObjectsEquals.java new file mode 100644 index 00000000000..ec8b9725087 --- /dev/null +++ b/j2k/tests/testData/ast/equals/ObjectsEquals.java @@ -0,0 +1,15 @@ +//file +import java.util.Objects; + +interface I { +} + +class C{ + boolean foo1(I i1, I i2) { + return Objects.equals(i1, i2)) + } + + boolean foo2(I i1, I i2) { + return !java.util.Objects.equals(i1, i2) + } +} \ No newline at end of file diff --git a/j2k/tests/testData/ast/equals/ObjectsEquals.kt b/j2k/tests/testData/ast/equals/ObjectsEquals.kt new file mode 100644 index 00000000000..cbaf0d64d72 --- /dev/null +++ b/j2k/tests/testData/ast/equals/ObjectsEquals.kt @@ -0,0 +1,13 @@ +import java.util.Objects + +trait I + +class C { + fun foo1(i1: I, i2: I): Boolean { + return i1 == i2 + } + + fun foo2(i1: I, i2: I): Boolean { + return i1 != i2 + } +} \ No newline at end of file