New J2K: Added more cases to code builder.

This commit is contained in:
Dimach
2018-06-07 22:22:34 +03:00
committed by Ilya Kirillov
parent b06f0fe848
commit ab723b1d39
@@ -37,13 +37,34 @@ class NewCodeBuilder {
JKClass.ClassKind.INTERFACE -> "interface"
}
inner class Visitor : JKVisitorVoid {
override fun visitTreeElement(treeElement: JKTreeElement) {
printer.print("/* !!! Hit visitElement for element type: ${treeElement::class} !!! */")
}
override fun visitModifierList(modifierList: JKModifierList) {
modifierList.modifiers.firstOrNull()?.accept(this)
for (i in 1..modifierList.modifiers.lastIndex) {
printer.printWithNoIndent(" ")
modifierList.modifiers[i].accept(this)
}
}
override fun visitKtModifier(ktModifier: JKKtModifier) {
printer.printWithNoIndent(
when (ktModifier.type) {
JKKtModifier.KtModifierType.INTERNAL -> "internal"
JKKtModifier.KtModifierType.ABSTRACT -> "abstract"
JKKtModifier.KtModifierType.INNER -> "inner"
JKKtModifier.KtModifierType.OPEN -> "open"
else -> ktModifier.type.toString()
}
)
}
override fun visitClass(klass: JKClass) {
klass.modifierList.accept(this)
builder.append(" ")
printer.print(classKindString(klass.classKind))
builder.append(" ")
printer.print(klass.name.value)
@@ -56,58 +77,6 @@ class NewCodeBuilder {
}
}
override fun visitBinaryExpression(binaryExpression: JKBinaryExpression) {
binaryExpression.left.accept(this)
printer.printWithNoIndent(binaryExpression.operator)
binaryExpression.right.accept(this)
}
override fun visitKtLiteralExpression(ktLiteralExpression: JKKtLiteralExpression) {
printer.printWithNoIndent(ktLiteralExpression.literal)
}
override fun visitTypeElement(typeElement: JKTypeElement) {
val type = typeElement.type
when (type) {
is JKClassType -> (type.classReference as JKClassSymbol).fqName?.let { printer.printWithNoIndent(FqName(it).shortName().asString()) }
else -> printer.printWithNoIndent("Unit /* TODO: ${type::class} */")
}
when (type.nullability) {
Nullability.Nullable -> printer.printWithNoIndent("?")
Nullability.Default -> printer.printWithNoIndent("? /* TODO: Default */")
else -> {
}
}
}
override fun visitKtFunction(ktFunction: JKKtFunction) {
printer.print("fun ", ktFunction.name.value, "(", "): ")
ktFunction.returnType.accept(this)
if (ktFunction.block !== JKBodyStub) {
printer.printlnWithNoIndent("{")
printer.pushIndent()
ktFunction.block.accept(this)
printer.popIndent()
printer.printWithNoIndent("}")
}
}
override fun visitBlock(block: JKBlock) {
block.acceptChildren(this)
}
override fun visitExpressionStatement(expressionStatement: JKExpressionStatement) {
printer.printIndent()
expressionStatement.expression.accept(this)
printer.printlnWithNoIndent()
}
override fun visitReturnStatement(returnStatement: JKReturnStatement) {
printer.print("return ")
returnStatement.expression.accept(this)
printer.printlnWithNoIndent()
}
override fun visitKtProperty(ktProperty: JKKtProperty) {
// TODO: Fix this
if (ktProperty.modifierList.modifiers.any { (it as? JKJavaModifier)?.type == JKJavaModifier.JavaModifierType.FINAL }) {
@@ -124,6 +93,95 @@ class NewCodeBuilder {
}
printer.printlnWithNoIndent()
}
override fun visitKtFunction(ktFunction: JKKtFunction) {
printer.print("fun ", ktFunction.name.value, "(", "): ")
ktFunction.returnType.accept(this)
if (ktFunction.block !== JKBodyStub) {
printer.printlnWithNoIndent("{")
printer.pushIndent()
ktFunction.block.accept(this)
printer.popIndent()
printer.printWithNoIndent("}")
}
}
override fun visitBinaryExpression(binaryExpression: JKBinaryExpression) {
binaryExpression.left.accept(this)
printer.printWithNoIndent(binaryExpression.operator)
binaryExpression.right.accept(this)
}
override fun visitKtLiteralExpression(ktLiteralExpression: JKKtLiteralExpression) {
printer.printWithNoIndent(ktLiteralExpression.literal)
}
override fun visitPrefixExpression(prefixExpression: JKPrefixExpression) {
printer.printWithNoIndent(prefixExpression.operator)
prefixExpression.expression.accept(this)
}
override fun visitPostfixExpression(postfixExpression: JKPostfixExpression) {
postfixExpression.expression.accept(this)
printer.printWithNoIndent(postfixExpression.operator)
}
override fun visitQualifiedExpression(qualifiedExpression: JKQualifiedExpression) {
qualifiedExpression.receiver.accept(this)
printer.printWithNoIndent(qualifiedExpression.operator)
qualifiedExpression.selector.accept(this)
}
override fun visitExpressionList(expressionList: JKExpressionList) {
expressionList.expressions.firstOrNull()?.accept(this)
for (i in 1..expressionList.expressions.lastIndex) {
printer.printWithNoIndent(", ")
expressionList.expressions[i].accept(this)
}
}
override fun visitMethodCallExpression(methodCallExpression: JKMethodCallExpression) {
printer.printWithNoIndent(printer.printWithNoIndent(FqName(methodCallExpression.identifier.fqName).shortName().asString()))
printer.printWithNoIndent("(")
methodCallExpression.arguments.accept(this)
printer.printWithNoIndent(")")
}
override fun visitParenthesizedExpression(parenthesizedExpression: JKParenthesizedExpression) {
printer.printWithNoIndent("(")
parenthesizedExpression.expression.accept(this)
printer.printWithNoIndent(")")
}
override fun visitTypeElement(typeElement: JKTypeElement) {
val type = typeElement.type
when (type) {
is JKClassType -> (type.classReference as JKClassSymbol).fqName?.let { printer.printWithNoIndent(FqName(it).shortName().asString()) }
else -> printer.printWithNoIndent("Unit /* TODO: ${type::class} */")
}
when (type.nullability) {
Nullability.Nullable -> printer.printWithNoIndent("?")
Nullability.Default -> printer.printWithNoIndent("? /* TODO: Default */")
else -> {
}
}
}
override fun visitBlock(block: JKBlock) {
block.acceptChildren(this)
}
override fun visitExpressionStatement(expressionStatement: JKExpressionStatement) {
printer.printIndent()
expressionStatement.expression.accept(this)
printer.printlnWithNoIndent()
}
override fun visitReturnStatement(returnStatement: JKReturnStatement) {
printer.print("return ")
returnStatement.expression.accept(this)
printer.printlnWithNoIndent()
}
}
fun printCodeOut(root: JKTreeElement): String {