From ac20e9ba8371b1f4f32ced3661a1b582de73c5e6 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Fri, 20 Jul 2018 16:09:52 +0300 Subject: [PATCH] New J2K: Render list of implemented correctly --- .../jetbrains/kotlin/j2k/NewCodeBuilder.kt | 22 ++++++++++++++++++- .../org/jetbrains/kotlin/j2k/tree/impl/jk.kt | 2 ++ .../kotlin/j2k/tree/visitors/JKVisitor.kt | 1 + .../kotlin/j2k/tree/visitors/JKVisitorVoid.kt | 2 ++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt index 7b2a25defba..9a094d62d1e 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt @@ -96,6 +96,20 @@ class NewCodeBuilder { ) } + override fun visitInheritanceInfo(inheritanceInfo: JKInheritanceInfo) { + renderList(inheritanceInfo.inherit) { it.accept(this) } + } + + + private inline fun renderList(list: List, separator: String = ", ", renderElement: (T) -> Unit) { + val (head, tail) = list.headTail() + head?.let(renderElement) ?: return + tail?.forEach { + builder.append(separator) + renderElement(it) + } + } + override fun visitClass(klass: JKClass) { klass.modifierList.accept(this) builder.append(" ") @@ -104,7 +118,7 @@ class NewCodeBuilder { printer.printWithNoIndent(klass.name.value) if (klass.inheritance.inherit.isNotEmpty()) { printer.printWithNoIndent(" : ") - klass.inheritance.inherit.forEach { it.accept(this) } + klass.inheritance.accept(this) } if (klass.declarationList.isNotEmpty()) { @@ -377,4 +391,10 @@ class NewCodeBuilder { Visitor().also { root.accept(it) } return builder.toString() } +} + +private inline fun List.headTail(): Pair?> { + val head = this.firstOrNull() + val tail = if (size <= 1) null else subList(1, size) + return head to tail } \ No newline at end of file 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 36053baee3e..d62fd405e35 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -325,4 +325,6 @@ class JKLambdaExpressionImpl(parameters: List, returnType: JKTypeEl class JKInheritanceInfoImpl(implements: List) : JKInheritanceInfo, JKBranchElementBase() { override val inherit: List by children(implements) + + override fun accept(visitor: JKVisitor, data: D): R = visitor.visitInheritanceInfo(this, data) } \ 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 5f2d5a7fc35..14b598c51ed 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt @@ -7,6 +7,7 @@ interface JKVisitor { fun visitDeclaration(declaration: JKDeclaration, data: D): R = visitTreeElement(declaration, data) fun visitFile(file: JKFile, data: D): R = visitTreeElement(file, data) fun visitClass(klass: JKClass, data: D): R = visitDeclaration(klass, data) + fun visitInheritanceInfo(inheritanceInfo: JKInheritanceInfo, data: D): R = visitTreeElement(inheritanceInfo, data) fun visitMethod(method: JKMethod, data: D): R = visitDeclaration(method, data) fun visitField(field: JKField, data: D): R = visitDeclaration(field, data) fun visitLocalVariable(localVariable: JKLocalVariable, data: D): R = visitField(localVariable, 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 ca62340b2a8..330049b43a6 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt @@ -11,6 +11,8 @@ interface JKVisitorVoid : JKVisitor { override fun visitFile(file: JKFile, data: Nothing?) = visitFile(file) fun visitClass(klass: JKClass) = visitDeclaration(klass, null) override fun visitClass(klass: JKClass, data: Nothing?) = visitClass(klass) + fun visitInheritanceInfo(inheritanceInfo: JKInheritanceInfo) = visitTreeElement(inheritanceInfo, null) + override fun visitInheritanceInfo(inheritanceInfo: JKInheritanceInfo, data: Nothing?) = visitInheritanceInfo(inheritanceInfo) fun visitMethod(method: JKMethod) = visitDeclaration(method, null) override fun visitMethod(method: JKMethod, data: Nothing?) = visitMethod(method) fun visitField(field: JKField) = visitDeclaration(field, null)