Skip to content

Commit 5454f70

Browse files
committed
KT-6349 J2K: Static members of enums should be converted to class object members
#KT-6349 Fixed
1 parent f19eb20 commit 5454f70

File tree

5 files changed

+49
-22
lines changed

5 files changed

+49
-22
lines changed

j2k/src/org/jetbrains/kotlin/j2k/ClassBodyConverter.kt

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,15 @@
1616

1717
package org.jetbrains.kotlin.j2k
1818

19-
import com.intellij.psi.PsiClass
20-
import java.util.HashSet
21-
import com.intellij.psi.PsiMember
22-
import java.util.LinkedHashMap
23-
import com.intellij.psi.PsiAnnotationMethod
24-
import java.util.ArrayList
25-
import com.intellij.psi.PsiModifier
26-
import com.intellij.psi.PsiMethod
19+
import com.intellij.openapi.util.text.StringUtil
20+
import com.intellij.psi.*
2721
import org.jetbrains.kotlin.j2k.ast.*
2822
import org.jetbrains.kotlin.j2k.ast.Class
29-
import com.intellij.psi.PsiField
30-
import com.intellij.psi.PsiReturnStatement
31-
import com.intellij.psi.PsiReferenceExpression
32-
import com.intellij.openapi.util.text.StringUtil
33-
import java.util.HashMap
34-
import com.intellij.psi.PsiClassInitializer
35-
import com.intellij.psi.PsiExpressionStatement
36-
import com.intellij.psi.PsiAssignmentExpression
37-
import com.intellij.psi.PsiExpression
38-
import com.intellij.psi.JavaTokenType
3923
import org.jetbrains.kotlin.j2k.usageProcessing.AccessorToPropertyProcessing
24+
import java.util.ArrayList
25+
import java.util.HashMap
26+
import java.util.HashSet
27+
import java.util.LinkedHashMap
4028

4129
class FieldCorrectionInfo(val name: String, val access: Modifier?, val setterAccess: Modifier?) {
4230
val identifier = Identifier(name).assignNoPrototype()
@@ -97,7 +85,7 @@ class ClassBodyConverter(private val psiClass: PsiClass,
9785
primaryConstructorSignature = member.createSignature(converter)
9886
members.add(member.initializer())
9987
}
100-
else if (useCompanionObject && member !is Class && psiMember.hasModifierProperty(PsiModifier.STATIC)) {
88+
else if (useCompanionObject && member !is Class && psiMember !is PsiEnumConstant && psiMember.hasModifierProperty(PsiModifier.STATIC)) {
10189
companionObjectMembers.add(member)
10290
}
10391
else {
@@ -131,10 +119,8 @@ class ClassBodyConverter(private val psiClass: PsiClass,
131119

132120
// do not convert private static methods into companion object if possible
133121
private fun shouldGenerateCompanionObject(convertedMembers: Map<PsiMember, Member>): Boolean {
134-
if (psiClass.isEnum()) return false
135-
136122
val members = convertedMembers.keySet().filter { !it.isConstructor() }
137-
val companionObjectMembers = members.filter { it !is PsiClass && it.hasModifierProperty(PsiModifier.STATIC) }
123+
val companionObjectMembers = members.filter { it !is PsiClass && it !is PsiEnumConstant && it.hasModifierProperty(PsiModifier.STATIC) }
138124
val nestedClasses = members.filterIsInstance<PsiClass>().filter { it.hasModifierProperty(PsiModifier.STATIC) }
139125
if (companionObjectMembers.all { it is PsiMethod && it.hasModifierProperty(PsiModifier.PRIVATE) }) {
140126
return nestedClasses.any { nestedClass -> companionObjectMembers.any { converter.referenceSearcher.findMethodCalls(it as PsiMethod, nestedClass).isNotEmpty() } }
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
public enum TestEnum {
2+
A,
3+
B;
4+
5+
public static TestEnum parse() { return A; }
6+
}
7+
8+
class Go {
9+
void fn() {
10+
TestEnum x = TestEnum.parse();
11+
}
12+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
public enum class TestEnum {
2+
A
3+
B
4+
5+
companion object {
6+
7+
public fun parse(): TestEnum {
8+
return A
9+
}
10+
}
11+
}
12+
13+
class Go {
14+
fun fn() {
15+
val x = TestEnum.parse()
16+
}
17+
}

j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1645,6 +1645,12 @@ public void testColorEnum() throws Exception {
16451645
doTest(fileName);
16461646
}
16471647

1648+
@TestMetadata("companionObject.java")
1649+
public void testCompanionObject() throws Exception {
1650+
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/enum/companionObject.java");
1651+
doTest(fileName);
1652+
}
1653+
16481654
@TestMetadata("emptyEnum.java")
16491655
public void testEmptyEnum() throws Exception {
16501656
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/enum/emptyEnum.java");

j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1645,6 +1645,12 @@ public void testColorEnum() throws Exception {
16451645
doTest(fileName);
16461646
}
16471647

1648+
@TestMetadata("companionObject.java")
1649+
public void testCompanionObject() throws Exception {
1650+
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/enum/companionObject.java");
1651+
doTest(fileName);
1652+
}
1653+
16481654
@TestMetadata("emptyEnum.java")
16491655
public void testEmptyEnum() throws Exception {
16501656
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/enum/emptyEnum.java");

0 commit comments

Comments
 (0)