From b702e207c06d1e862bc2c2a9be87b6ac031341ad Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Mon, 9 Jul 2018 20:55:33 +0300 Subject: [PATCH] New J2K: Add inheritance and support while & type-casts in code builder --- .../kotlin/j2k/JavaToJKTreeBuilder.kt | 9 +++++-- .../jetbrains/kotlin/j2k/NewCodeBuilder.kt | 27 +++++++++++++++++++ .../org/jetbrains/kotlin/j2k/tree/impl/jk.kt | 7 ++++- .../org/jetbrains/kotlin/j2k/tree/jk.kt | 9 ++++++- 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt index 198cc157537..6cefd90e9a5 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt @@ -76,7 +76,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) { fun PsiAssignmentExpression.toJK(): JKJavaAssignmentExpression { return JKJavaAssignmentExpressionImpl( - lExpression.toJK() as? JKAssignableExpression ?: error("Its possible?"), + lExpression.toJK() as? JKAssignableExpression ?: error("Its possible? ${lExpression.toJK().prettyDebugPrintTree()}"), rExpression.toJK(), operationSign.toJK() ) @@ -238,7 +238,12 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) { isInterface -> JKClass.ClassKind.INTERFACE else -> JKClass.ClassKind.CLASS } - return JKClassImpl(with(modifierMapper) { modifierList.toJK() }, JKNameIdentifierImpl(name!!), classKind).also { jkClassImpl -> + val implTypes = this.implementsList?.referencedTypes?.map { with(expressionTreeMapper) { JKTypeElementImpl(it.toJK()) } }.orEmpty() + val extTypes = this.extendsList?.referencedTypes?.map { with(expressionTreeMapper) { JKTypeElementImpl(it.toJK()) } }.orEmpty() + return JKClassImpl( + with(modifierMapper) { modifierList.toJK() }, JKNameIdentifierImpl(name!!), JKInheritanceInfoImpl(extTypes + implTypes), + classKind + ).also { jkClassImpl -> jkClassImpl.declarationList = children.mapNotNull { ElementVisitor().apply { it.accept(this) }.resultElement as? JKDeclaration } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt index 5b778311b4f..c10d0d1d183 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt @@ -101,6 +101,11 @@ class NewCodeBuilder { printer.print(classKindString(klass.classKind)) builder.append(" ") printer.printWithNoIndent(klass.name.value) + if (klass.inheritance.inherit.isNotEmpty()) { + printer.printWithNoIndent(" : ") + klass.inheritance.inherit.forEach { it.accept(this) } + } + if (klass.declarationList.isNotEmpty()) { printer.println(" {") printer.pushIndent() @@ -216,6 +221,28 @@ class NewCodeBuilder { } } + override fun visitTypeCastExpression(typeCastExpression: JKTypeCastExpression) { + typeCastExpression.expression.accept(this) + printer.printWithNoIndent(" as ") + typeCastExpression.type.accept(this) + } + + override fun visitWhileStatement(whileStatement: JKWhileStatement) { + printer.print("while(") + whileStatement.condition.accept(this) + printer.printlnWithNoIndent(")", "{") + printer.pushIndent() + val body = whileStatement.body + if (body is JKBlockStatement) { + body.block.statements.forEach { it.accept(this) } + } else { + body.accept(this) + } + printer.popIndent() + printer.println("}") + + } + override fun visitLocalVariable(localVariable: JKLocalVariable) { if (localVariable.modifierList.modality == JKModalityModifier.Modality.FINAL) { printer.print("val") 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 f0812d92ac1..497cf864a29 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -32,6 +32,7 @@ class JKFileImpl : JKFile, JKBranchElementBase() { class JKClassImpl( modifierList: JKModifierList, name: JKNameIdentifier, + inheritance: JKInheritanceInfo, override var classKind: JKClass.ClassKind ) : JKClass, JKBranchElementBase() { override fun accept(visitor: JKVisitor, data: D): R = visitor.visitClass(this, data) @@ -39,7 +40,7 @@ class JKClassImpl( override var name by child(name) override var modifierList by child(modifierList) override var declarationList by children() - + override val inheritance by child(inheritance) } class JKNameIdentifierImpl(override val value: String) : JKNameIdentifier, JKElementBase() {} @@ -317,4 +318,8 @@ class JKLambdaExpressionImpl(parameters: List, returnType: JKTypeEl override val returnType by child(returnType) override var parameters by children(parameters) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitLambdaExpression(this, data) +} + +class JKInheritanceInfoImpl(implements: List) : JKInheritanceInfo, JKBranchElementBase() { + override val inherit: List by children(implements) } \ 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 8d829da8786..064835c8726 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt @@ -39,6 +39,9 @@ interface JKFile : JKTreeElement, JKBranchElement { interface JKClass : JKDeclaration, JKModifierListOwner { val name: JKNameIdentifier + + val inheritance: JKInheritanceInfo + var declarationList: List var classKind: ClassKind @@ -47,6 +50,10 @@ interface JKClass : JKDeclaration, JKModifierListOwner { } } +interface JKInheritanceInfo : JKTreeElement, JKBranchElement { + val inherit: List +} + interface JKMethod : JKDeclaration, JKModifierListOwner { val name: JKNameIdentifier var parameters: List @@ -124,7 +131,7 @@ interface JKPrefixExpression : JKUnaryExpression interface JKPostfixExpression : JKUnaryExpression -interface JKQualifiedExpression : JKExpression { +interface JKQualifiedExpression : JKExpression, JKAssignableExpression { val receiver: JKExpression val operator: JKQualifier val selector: JKExpression