From 7e7d8650547709c8c862dc3e3068db9880b3bfb6 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 8 Nov 2018 18:57:50 +0300 Subject: [PATCH] New J2K: Add enum constants --- .../kotlin/j2k/JavaToJKTreeBuilder.kt | 13 +++++++++ .../jetbrains/kotlin/j2k/NewCodeBuilder.kt | 29 ++++++++++++++++--- .../org/jetbrains/kotlin/j2k/tree/impl/jk.kt | 14 +++++++++ .../org/jetbrains/kotlin/j2k/tree/jk.kt | 4 +++ .../kotlin/j2k/tree/visitors/JKVisitor.kt | 1 + .../kotlin/j2k/tree/visitors/JKVisitorVoid.kt | 2 ++ 6 files changed, 59 insertions(+), 4 deletions(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt index 4569828fce3..4b16575dfd4 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt @@ -268,6 +268,14 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) { } } + fun PsiEnumConstant.toJK(): JKEnumConstant = + JKEnumConstantImpl( + JKNameIdentifierImpl(name), + with(expressionTreeMapper) { argumentList.toJK() }, + JKTypeElementImpl(JKClassTypeImpl(symbolProvider.provideDirectSymbol(containingClass!!) as JKClassSymbol, emptyList())), + with(modifierMapper) { modifierList.toJK() } + ) + fun PsiField.toJK(): JKJavaField { return JKJavaFieldImpl( with(modifierMapper) { modifierList.toJK(finalAsMutability = true) }, @@ -299,6 +307,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) { } fun PsiMember.toJK(): JKDeclaration? = when (this) { + is PsiEnumConstant -> this.toJK() is PsiField -> this.toJK() is PsiMethod -> this.toJK() else -> null @@ -491,6 +500,10 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) { resultElement = with(declarationMapper) { field.toJK() } } + override fun visitEnumConstant(enumConstant: PsiEnumConstant) { + resultElement = with(declarationMapper) { enumConstant.toJK() } + } + override fun visitMethod(method: PsiMethod) { resultElement = with(declarationMapper) { method.toJK() } } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt index ed5163b0106..06e99c9fed2 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt @@ -219,16 +219,28 @@ class NewCodeBuilder { if (klass.declarationList.any { it !is JKKtPrimaryConstructor }) { printer.block(multiline = true) { - klass.declarationList.forEach { - it.accept(this) - printer.printlnWithNoIndent() - } + renderEnumConstants(klass.declarationList.filterIsInstance()) + renderNonEnumClassDeclarations(klass.declarationList.filterNot { it is JKEnumConstant }) } } else { printer.println() } } + private fun renderEnumConstants(enumConstants: List) { + renderList(enumConstants) { + it.accept(this) + } + + } + + private fun renderNonEnumClassDeclarations(declarations: List) { + declarations.forEach { + it.accept(this) + printer.printlnWithNoIndent() + } + } + override fun visitKtProperty(ktProperty: JKKtProperty) { ktProperty.modifierList.accept(this) @@ -244,6 +256,15 @@ class NewCodeBuilder { } } + override fun visitEnumConstant(enumConstant: JKEnumConstant) { + enumConstant.name.accept(this) + if (enumConstant.arguments.expressions.isNotEmpty()) { + printer.par { + enumConstant.arguments.accept(this) + } + } + } + override fun visitKtInitDeclaration(ktInitDeclaration: JKKtInitDeclaration) { if (ktInitDeclaration.block.statements.isNotEmpty()) { printer.print("init ") diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt index 1c31f75fa49..fd63e47915b 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -469,5 +469,19 @@ class JKTypeParameterTypeImpl( override val nullability: Nullability = Nullability.Default ) : JKTypeParameterType +class JKEnumConstantImpl( + name: JKNameIdentifier, + arguments: JKExpressionList, + type: JKTypeElement, + modifierList: JKModifierList +) : JKEnumConstant, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { + override var name: JKNameIdentifier by child(name) + override val arguments: JKExpressionList by child(arguments) + override val type: JKTypeElement by child(type) + override var initializer: JKExpression by child(JKStubExpressionImpl()) + override var modifierList: JKModifierList by child(modifierList) + override fun accept(visitor: JKVisitor, data: D): R = visitor.visitEnumConstant(this, data) +} + fun JKTypeElement.present(): Boolean = type != JKNoTypeImpl \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt index 580a8e33de6..5f01b266974 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt @@ -286,4 +286,8 @@ interface JKTypeParameter : JKTreeElement { interface JKTypeParameterListOwner : JKTreeElement { var typeParameterList: JKTypeParameterList +} + +interface JKEnumConstant : JKField { + val arguments: JKExpressionList } \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt index 260f051330a..df8b9b5c4f0 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt @@ -63,6 +63,7 @@ interface JKVisitor { fun visitTypeParameterList(typeParameterList: JKTypeParameterList, data: D): R = visitTreeElement(typeParameterList, data) fun visitTypeParameter(typeParameter: JKTypeParameter, data: D): R = visitTreeElement(typeParameter, data) fun visitTypeParameterListOwner(typeParameterListOwner: JKTypeParameterListOwner, data: D): R = visitTreeElement(typeParameterListOwner, data) + fun visitEnumConstant(enumConstant: JKEnumConstant, data: D): R = visitTreeElement(enumConstant, data) fun visitJavaField(javaField: JKJavaField, data: D): R = visitField(javaField, data) fun visitJavaMethod(javaMethod: JKJavaMethod, data: D): R = visitMethod(javaMethod, data) fun visitJavaMethodCallExpression(javaMethodCallExpression: JKJavaMethodCallExpression, data: D): R = visitMethodCallExpression(javaMethodCallExpression, data) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt index b35849b0aaf..09f0aacd6be 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt @@ -123,6 +123,8 @@ interface JKVisitorVoid : JKVisitor { override fun visitTypeParameter(typeParameter: JKTypeParameter, data: Nothing?) = visitTypeParameter(typeParameter) fun visitTypeParameterListOwner(typeParameterListOwner: JKTypeParameterListOwner) = visitTreeElement(typeParameterListOwner, null) override fun visitTypeParameterListOwner(typeParameterListOwner: JKTypeParameterListOwner, data: Nothing?) = visitTypeParameterListOwner(typeParameterListOwner) + fun visitEnumConstant(enumConstant: JKEnumConstant) = visitTreeElement(enumConstant, null) + override fun visitEnumConstant(enumConstant: JKEnumConstant, data: Nothing?) = visitEnumConstant(enumConstant) fun visitJavaField(javaField: JKJavaField) = visitField(javaField, null) override fun visitJavaField(javaField: JKJavaField, data: Nothing?) = visitJavaField(javaField) fun visitJavaMethod(javaMethod: JKJavaMethod) = visitMethod(javaMethod, null)