diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ClassBodyConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/ClassBodyConverter.kt index b7eb260f2be..e0554ca96e6 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ClassBodyConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ClassBodyConverter.kt @@ -16,27 +16,15 @@ package org.jetbrains.kotlin.j2k -import com.intellij.psi.PsiClass -import java.util.HashSet -import com.intellij.psi.PsiMember -import java.util.LinkedHashMap -import com.intellij.psi.PsiAnnotationMethod -import java.util.ArrayList -import com.intellij.psi.PsiModifier -import com.intellij.psi.PsiMethod +import com.intellij.openapi.util.text.StringUtil +import com.intellij.psi.* import org.jetbrains.kotlin.j2k.ast.* import org.jetbrains.kotlin.j2k.ast.Class -import com.intellij.psi.PsiField -import com.intellij.psi.PsiReturnStatement -import com.intellij.psi.PsiReferenceExpression -import com.intellij.openapi.util.text.StringUtil -import java.util.HashMap -import com.intellij.psi.PsiClassInitializer -import com.intellij.psi.PsiExpressionStatement -import com.intellij.psi.PsiAssignmentExpression -import com.intellij.psi.PsiExpression -import com.intellij.psi.JavaTokenType import org.jetbrains.kotlin.j2k.usageProcessing.AccessorToPropertyProcessing +import java.util.ArrayList +import java.util.HashMap +import java.util.HashSet +import java.util.LinkedHashMap class FieldCorrectionInfo(val name: String, val access: Modifier?, val setterAccess: Modifier?) { val identifier = Identifier(name).assignNoPrototype() @@ -97,7 +85,7 @@ class ClassBodyConverter(private val psiClass: PsiClass, primaryConstructorSignature = member.createSignature(converter) members.add(member.initializer()) } - else if (useCompanionObject && member !is Class && psiMember.hasModifierProperty(PsiModifier.STATIC)) { + else if (useCompanionObject && member !is Class && psiMember !is PsiEnumConstant && psiMember.hasModifierProperty(PsiModifier.STATIC)) { companionObjectMembers.add(member) } else { @@ -131,10 +119,8 @@ class ClassBodyConverter(private val psiClass: PsiClass, // do not convert private static methods into companion object if possible private fun shouldGenerateCompanionObject(convertedMembers: Map): Boolean { - if (psiClass.isEnum()) return false - val members = convertedMembers.keySet().filter { !it.isConstructor() } - val companionObjectMembers = members.filter { it !is PsiClass && it.hasModifierProperty(PsiModifier.STATIC) } + val companionObjectMembers = members.filter { it !is PsiClass && it !is PsiEnumConstant && it.hasModifierProperty(PsiModifier.STATIC) } val nestedClasses = members.filterIsInstance().filter { it.hasModifierProperty(PsiModifier.STATIC) } if (companionObjectMembers.all { it is PsiMethod && it.hasModifierProperty(PsiModifier.PRIVATE) }) { return nestedClasses.any { nestedClass -> companionObjectMembers.any { converter.referenceSearcher.findMethodCalls(it as PsiMethod, nestedClass).isNotEmpty() } } diff --git a/j2k/testData/fileOrElement/enum/companionObject.java b/j2k/testData/fileOrElement/enum/companionObject.java new file mode 100644 index 00000000000..2de0e8c947b --- /dev/null +++ b/j2k/testData/fileOrElement/enum/companionObject.java @@ -0,0 +1,12 @@ +public enum TestEnum { + A, + B; + + public static TestEnum parse() { return A; } +} + +class Go { + void fn() { + TestEnum x = TestEnum.parse(); + } +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/enum/companionObject.kt b/j2k/testData/fileOrElement/enum/companionObject.kt new file mode 100644 index 00000000000..e1034b44bd6 --- /dev/null +++ b/j2k/testData/fileOrElement/enum/companionObject.kt @@ -0,0 +1,17 @@ +public enum class TestEnum { + A + B + + companion object { + + public fun parse(): TestEnum { + return A + } + } +} + +class Go { + fun fn() { + val x = TestEnum.parse() + } +} diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java index 5ed5e22ea73..4c94d0d7353 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java @@ -1645,6 +1645,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo doTest(fileName); } + @TestMetadata("companionObject.java") + public void testCompanionObject() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/enum/companionObject.java"); + doTest(fileName); + } + @TestMetadata("emptyEnum.java") public void testEmptyEnum() throws Exception { String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/enum/emptyEnum.java"); diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java index d0b3549dd4d..983b8909d1f 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java @@ -1645,6 +1645,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo doTest(fileName); } + @TestMetadata("companionObject.java") + public void testCompanionObject() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/enum/companionObject.java"); + doTest(fileName); + } + @TestMetadata("emptyEnum.java") public void testEmptyEnum() throws Exception { String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/enum/emptyEnum.java");