KT-6349 J2K: Static members of enums should be converted to class object members
#KT-6349 Fixed
This commit is contained in:
@@ -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<PsiMember, Member>): 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<PsiClass>().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() } }
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
public enum TestEnum {
|
||||
A,
|
||||
B;
|
||||
|
||||
public static TestEnum parse() { return A; }
|
||||
}
|
||||
|
||||
class Go {
|
||||
void fn() {
|
||||
TestEnum x = TestEnum.parse();
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
@@ -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");
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user