diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt index 8ace147a37d..cff6d07554a 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt @@ -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 {