J2K: converting of enum constants overriding members
This commit is contained in:
@@ -153,11 +153,6 @@ class CodeConverter(
|
||||
private fun PsiPrefixExpression.isLiteralWithSign()
|
||||
= getOperand() is PsiLiteralExpression && getOperationTokenType() in setOf(JavaTokenType.PLUS, JavaTokenType.MINUS)
|
||||
|
||||
public fun convertAnonymousClassBody(anonymousClass: PsiAnonymousClass): AnonymousClassBody {
|
||||
return AnonymousClassBody(ClassBodyConverter(anonymousClass, converter, isOpenClass = false, isObject = false).convertBody(),
|
||||
anonymousClass.getBaseClassType().resolve()?.isInterface() ?: false).assignPrototype(anonymousClass)
|
||||
}
|
||||
|
||||
private fun needConversion(actual: PsiType, expected: PsiType): Boolean {
|
||||
val expectedStr = expected.getCanonicalText()
|
||||
val actualStr = actual.getCanonicalText()
|
||||
|
||||
@@ -176,7 +176,9 @@ class Converter private(
|
||||
}
|
||||
|
||||
psiClass.isEnum() -> {
|
||||
val classBody = ClassBodyConverter(psiClass, this, isOpenClass = false, isObject = false).convertBody()
|
||||
modifiers = modifiers.without(Modifier.ABSTRACT)
|
||||
val hasInheritors = psiClass.getFields().any { it is PsiEnumConstant && it.getInitializingClass() != null }
|
||||
val classBody = ClassBodyConverter(psiClass, this, isOpenClass = hasInheritors, isObject = false).convertBody()
|
||||
Enum(name, annotations, modifiers, typeParameters, implementsTypes, classBody)
|
||||
}
|
||||
|
||||
@@ -307,10 +309,11 @@ class Converter private(
|
||||
val name = correction?.identifier ?: field.declarationIdentifier()
|
||||
val converted = if (field is PsiEnumConstant) {
|
||||
val argumentList = field.getArgumentList()
|
||||
EnumConstant(name,
|
||||
annotations,
|
||||
modifiers,
|
||||
deferredElement { codeConverter -> ExpressionList(codeConverter.convertExpressions(argumentList?.getExpressions() ?: arrayOf<PsiExpression>())).assignPrototype(argumentList) })
|
||||
val params = deferredElement { codeConverter ->
|
||||
ExpressionList(codeConverter.convertExpressions(argumentList?.getExpressions() ?: arrayOf<PsiExpression>())).assignPrototype(argumentList)
|
||||
}
|
||||
val body = field.getInitializingClass()?.let { convertAnonymousClassBody(it) }
|
||||
EnumConstant(name, annotations, modifiers, params, body)
|
||||
}
|
||||
else {
|
||||
val isVal = isVal(referenceSearcher, field)
|
||||
@@ -551,6 +554,11 @@ class Converter private(
|
||||
.assignPrototype(owner.getModifierList(), CommentsAndSpacesInheritance(blankLinesBefore = false))
|
||||
}
|
||||
|
||||
public fun convertAnonymousClassBody(anonymousClass: PsiAnonymousClass): AnonymousClassBody {
|
||||
return AnonymousClassBody(ClassBodyConverter(anonymousClass, this, isOpenClass = false, isObject = false).convertBody(),
|
||||
anonymousClass.getBaseClassType().resolve()?.isInterface() ?: false).assignPrototype(anonymousClass)
|
||||
}
|
||||
|
||||
private val MODIFIERS_MAP = listOf(
|
||||
PsiModifier.ABSTRACT to Modifier.ABSTRACT,
|
||||
PsiModifier.PUBLIC to Modifier.PUBLIC,
|
||||
|
||||
@@ -327,7 +327,7 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter {
|
||||
result = NewClassExpression(classRefConverted,
|
||||
convertArguments(expression),
|
||||
codeConverter.convertExpression(qualifier),
|
||||
if (anonymousClass != null) codeConverter.convertAnonymousClassBody(anonymousClass) else null)
|
||||
if (anonymousClass != null) converter.convertAnonymousClassBody(anonymousClass) else null)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -21,6 +21,6 @@ import org.jetbrains.kotlin.j2k.CodeBuilder
|
||||
class AnonymousClassBody(body: ClassBody, val extendsInterface: Boolean)
|
||||
: Class(Identifier.Empty, Annotations.Empty, Modifiers.Empty, TypeParameterList.Empty, listOf(), null, listOf(), body) {
|
||||
override fun generateCode(builder: CodeBuilder) {
|
||||
body.append(builder)
|
||||
body.appendTo(builder)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ open class Class(
|
||||
appendBaseTypes(builder)
|
||||
typeParameterList.appendWhere(builder)
|
||||
|
||||
body.append(builder)
|
||||
body.appendTo(builder)
|
||||
}
|
||||
|
||||
protected open val keyword: String
|
||||
|
||||
@@ -33,7 +33,7 @@ class ClassBody (
|
||||
val rBrace: RBrace,
|
||||
val isEnumBody: Boolean) {
|
||||
|
||||
fun append(builder: CodeBuilder) {
|
||||
fun appendTo(builder: CodeBuilder) {
|
||||
val membersFiltered = members.filter { !it.isEmpty }
|
||||
if (membersFiltered.isEmpty() && companionObjectMembers.isEmpty()) return
|
||||
|
||||
|
||||
@@ -38,6 +38,6 @@ class Enum(
|
||||
|
||||
appendBaseTypes(builder)
|
||||
|
||||
body.append(builder)
|
||||
body.appendTo(builder)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,15 +22,19 @@ class EnumConstant(
|
||||
val identifier: Identifier,
|
||||
annotations: Annotations,
|
||||
modifiers: Modifiers,
|
||||
val params: DeferredElement<ExpressionList>
|
||||
val params: DeferredElement<ExpressionList>,
|
||||
val body: AnonymousClassBody?
|
||||
) : Member(annotations, modifiers) {
|
||||
|
||||
override fun generateCode(builder: CodeBuilder) {
|
||||
if (params.isEmpty) {
|
||||
builder append annotations append identifier
|
||||
return
|
||||
builder append annotations append identifier
|
||||
|
||||
if (!params.isEmpty) {
|
||||
builder append "(" append params append ")"
|
||||
}
|
||||
|
||||
builder append annotations append identifier append "(" append params append ")"
|
||||
if (body != null) {
|
||||
builder append body
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
public enum E {
|
||||
A,
|
||||
|
||||
B {
|
||||
@Override
|
||||
void bar() {
|
||||
}
|
||||
};
|
||||
|
||||
void bar(){}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
public enum class E {
|
||||
A,
|
||||
|
||||
B {
|
||||
override fun bar() {
|
||||
}
|
||||
};
|
||||
|
||||
open fun bar() {
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
public enum E {
|
||||
A(1) {
|
||||
@Override
|
||||
void bar() {
|
||||
foo(this.p);
|
||||
}
|
||||
},
|
||||
|
||||
B(2) {
|
||||
@Override
|
||||
void bar() {
|
||||
}
|
||||
};
|
||||
|
||||
private int p;
|
||||
|
||||
E(int p) {
|
||||
this.p = p;
|
||||
}
|
||||
|
||||
void foo(int p) {}
|
||||
|
||||
abstract void bar();
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
// ERROR: Cannot access 'p': it is 'invisible_fake' in 'A'
|
||||
public enum class E(private val p: Int) {
|
||||
A(1) {
|
||||
override fun bar() {
|
||||
foo(this.p)
|
||||
}
|
||||
},
|
||||
|
||||
B(2) {
|
||||
override fun bar() {
|
||||
}
|
||||
};
|
||||
|
||||
fun foo(p: Int) {
|
||||
}
|
||||
|
||||
abstract fun bar()
|
||||
}
|
||||
@@ -1612,6 +1612,18 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("constantsWithBody1.java")
|
||||
public void testConstantsWithBody1() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/enum/constantsWithBody1.java");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("constantsWithBody2.java")
|
||||
public void testConstantsWithBody2() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/enum/constantsWithBody2.java");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("emptyEnum.java")
|
||||
public void testEmptyEnum() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/enum/emptyEnum.java");
|
||||
|
||||
@@ -1612,6 +1612,18 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("constantsWithBody1.java")
|
||||
public void testConstantsWithBody1() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/enum/constantsWithBody1.java");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("constantsWithBody2.java")
|
||||
public void testConstantsWithBody2() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/enum/constantsWithBody2.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