diff --git a/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt index b5914c641c2..d2e0734efa0 100644 --- a/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt +++ b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt @@ -240,6 +240,34 @@ open class ExpressionVisitor(private val converter: Converter) : JavaElementVisi return } + //TODO: type arguments maybe required if we are in initializer of variable with no explicit type + if (target is PsiMethod && isCollectionsEmptyList(target) && arguments.size == 0) { + result = MethodCallExpression.build(null, "listOf", listOf(), listOf(), false) + return + } + + //TODO: type arguments maybe required if we are in initializer of variable with no explicit type + if (target is PsiMethod && isCollectionsEmptySet(target) && arguments.size == 0) { + result = MethodCallExpression.build(null, "setOf", listOf(), listOf(), false) + return + } + + //TODO: type arguments maybe required if we are in initializer of variable with no explicit type + if (target is PsiMethod && isCollectionsEmptyMap(target) && arguments.size == 0) { + result = MethodCallExpression.build(null, "mapOf", listOf(), listOf(), false) + return + } + + if (target is PsiMethod && isCollectionsSingletonList(target) && arguments.size == 1) { + result = MethodCallExpression.build(null, "listOf", listOf(converter.convertExpression(arguments.single())), listOf(), false) + return + } + + if (target is PsiMethod && isCollectionsSingleton(target) && arguments.size == 1) { + result = MethodCallExpression.build(null, "setOf", listOf(converter.convertExpression(arguments.single())), listOf(), false) + return + } + result = MethodCallExpression(converter.convertExpression(methodExpr), convertArguments(expression), typeArguments, @@ -258,6 +286,36 @@ open class ExpressionVisitor(private val converter: Converter) : JavaElementVisi method.getContainingClass()?.getQualifiedName() == "java.util.Objects" } + private fun isCollectionsEmptyList(method: PsiMethod): Boolean { + return method.getName() == "emptyList" && + method.getParameterList().getParameters().size == 0 && + method.getContainingClass()?.getQualifiedName() == "java.util.Collections" + } + + private fun isCollectionsEmptySet(method: PsiMethod): Boolean { + return method.getName() == "emptySet" && + method.getParameterList().getParameters().size == 0 && + method.getContainingClass()?.getQualifiedName() == "java.util.Collections" + } + + private fun isCollectionsEmptyMap(method: PsiMethod): Boolean { + return method.getName() == "emptyMap" && + method.getParameterList().getParameters().size == 0 && + method.getContainingClass()?.getQualifiedName() == "java.util.Collections" + } + + private fun isCollectionsSingletonList(method: PsiMethod): Boolean { + return method.getName() == "singletonList" && + method.getParameterList().getParameters().size == 1 && + method.getContainingClass()?.getQualifiedName() == "java.util.Collections" + } + + private fun isCollectionsSingleton(method: PsiMethod): Boolean { + return method.getName() == "singleton" && + method.getParameterList().getParameters().size == 1 && + method.getContainingClass()?.getQualifiedName() == "java.util.Collections" + } + 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 b9510969966..40a5375571d 100644 --- a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java +++ b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java @@ -2050,6 +2050,11 @@ public class JavaToKotlinConverterTestGenerated extends AbstractJavaToKotlinConv doTest("j2k/tests/testData/ast/methodCallExpression/callWithKeywords.java"); } + @TestMetadata("collectionsMethods.java") + public void testCollectionsMethods() throws Exception { + doTest("j2k/tests/testData/ast/methodCallExpression/collectionsMethods.java"); + } + @TestMetadata("emptyCall.java") public void testEmptyCall() throws Exception { doTest("j2k/tests/testData/ast/methodCallExpression/emptyCall.java"); diff --git a/j2k/tests/testData/ast/methodCallExpression/collectionsMethods.java b/j2k/tests/testData/ast/methodCallExpression/collectionsMethods.java new file mode 100644 index 00000000000..58a7e7766dd --- /dev/null +++ b/j2k/tests/testData/ast/methodCallExpression/collectionsMethods.java @@ -0,0 +1,12 @@ +//file +import java.util.*; + +class A { + Map foo() { + List list1 = Collections.emptyList(); + List list2 = Collections.singletonList(1); + Set set1 = Collections.emptySet(); + Set set2 = Collections.singleton("a"); + return Collections.emptyMap(); + } +} \ No newline at end of file diff --git a/j2k/tests/testData/ast/methodCallExpression/collectionsMethods.kt b/j2k/tests/testData/ast/methodCallExpression/collectionsMethods.kt new file mode 100644 index 00000000000..e987bf3e9e7 --- /dev/null +++ b/j2k/tests/testData/ast/methodCallExpression/collectionsMethods.kt @@ -0,0 +1,12 @@ +import java.util.* +import kotlin.Map + +class A { + fun foo(): Map { + val list1 = listOf() + val list2 = listOf(1) + val set1 = setOf() + val set2 = setOf("a") + return mapOf() + } +} \ No newline at end of file diff --git a/j2k/tests/testData/ast/methodCallExpression/collectionsMethods.kt.todo b/j2k/tests/testData/ast/methodCallExpression/collectionsMethods.kt.todo new file mode 100644 index 00000000000..12b65cfaa5e --- /dev/null +++ b/j2k/tests/testData/ast/methodCallExpression/collectionsMethods.kt.todo @@ -0,0 +1,12 @@ +import java.util.* +import kotlin.Map + +class A { + fun foo(): Map { + val list1 = listOf() + val list2 = listOf(1) + val set1 = setOf() + val set2 = setOf("a") + return mapOf() + } +} \ No newline at end of file