New J2K: Render list of implemented correctly

This commit is contained in:
Simon Ogorodnik
2018-07-20 16:09:52 +03:00
committed by Ilya Kirillov
parent b8bbd85bc7
commit ac20e9ba83
4 changed files with 26 additions and 1 deletions
@@ -96,6 +96,20 @@ class NewCodeBuilder {
)
}
override fun visitInheritanceInfo(inheritanceInfo: JKInheritanceInfo) {
renderList(inheritanceInfo.inherit) { it.accept(this) }
}
private inline fun <T> renderList(list: List<T>, 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 <T> List<T>.headTail(): Pair<T?, List<T>?> {
val head = this.firstOrNull()
val tail = if (size <= 1) null else subList(1, size)
return head to tail
}
@@ -325,4 +325,6 @@ class JKLambdaExpressionImpl(parameters: List<JKParameter>, returnType: JKTypeEl
class JKInheritanceInfoImpl(implements: List<JKTypeElement>) : JKInheritanceInfo, JKBranchElementBase() {
override val inherit: List<JKTypeElement> by children(implements)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitInheritanceInfo(this, data)
}
@@ -7,6 +7,7 @@ interface JKVisitor<out R, in D> {
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)
@@ -11,6 +11,8 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
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)