New J2K: Add enum constants

This commit is contained in:
Ilya Kirillov
2018-11-08 18:57:50 +03:00
committed by Ilya Kirillov
parent ff700b5399
commit 7e7d865054
6 changed files with 59 additions and 4 deletions
@@ -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() }
}
@@ -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<JKEnumConstant>) {
renderList(enumConstants) {
it.accept(this)
}
}
private fun renderNonEnumClassDeclarations(declarations: List<JKDeclaration>) {
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 ")
@@ -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 <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitEnumConstant(this, data)
}
fun JKTypeElement.present(): Boolean =
type != JKNoTypeImpl
@@ -286,4 +286,8 @@ interface JKTypeParameter : JKTreeElement {
interface JKTypeParameterListOwner : JKTreeElement {
var typeParameterList: JKTypeParameterList
}
interface JKEnumConstant : JKField {
val arguments: JKExpressionList
}
@@ -63,6 +63,7 @@ interface JKVisitor<out R, in D> {
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)
@@ -123,6 +123,8 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
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)