From 3c4d99557e8ccf3c934e336b90a8dfb5efc17fdb Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Mon, 12 Feb 2018 18:31:37 +0700 Subject: [PATCH] [klib] Fix annotation printing --- .../kotlin/cli/klib/PrettyPrinter.kt | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/PrettyPrinter.kt b/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/PrettyPrinter.kt index e4a8cd1e177..8a00193f58d 100644 --- a/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/PrettyPrinter.kt +++ b/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/PrettyPrinter.kt @@ -159,7 +159,7 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment, .let { if (it.isEmpty()) " " else it } val supertypes = supertypesToString(supertypes(TypeTables.peek())) - val annotations = annotationsToString(getExtension(KonanSerializerProtocol.classAnnotation), "\n") + val annotations = annotationsToString(getExtension(KonanSerializerProtocol.classAnnotation)) val primaryConstructor = when { isObject || isCompanionObject -> "" @@ -203,10 +203,7 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment, private fun ProtoBuf.Constructor.asString(printVisibility: Boolean = true, isPrimary: Boolean = false): String { val visibility = if (printVisibility) Flags.VISIBILITY.get(flags).asString() else "" - val annotations = annotationsToString( - getExtension(KonanSerializerProtocol.constructorAnnotation), - if (isPrimary) " " else "\n" - ) + val annotations = annotationsToString(getExtension(KonanSerializerProtocol.constructorAnnotation), true) val parameters = valueParameterList.joinToString(", ", prefix = "(", postfix = ")") { it.asString() } val header = "$visibility$annotations" @@ -236,7 +233,7 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment, val isInline = Flags.IS_INLINE.asString(flags) val isExternal = Flags.IS_EXTERNAL_FUNCTION.asString(flags) val receiverType = receiverType() - val annotations = annotationsToString(getExtension(KonanSerializerProtocol.functionAnnotation), "\n") + val annotations = annotationsToString(getExtension(KonanSerializerProtocol.functionAnnotation)) val typeParameters = typeParameterList.joinToString("<", "> ") { it.asString() } val valueParameters = valueParameterList.joinToString(", ", "(", ")") { it.asString() } val returnType = returnType() @@ -256,7 +253,7 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment, val isExternal = Flags.IS_EXTERNAL_PROPERTY.asString(flags) val isConst = Flags.IS_CONST.asString(flags) val returnType = returnType(TypeTables.peek()).asString() - val annotations = annotationsToString(getExtension(KonanSerializerProtocol.propertyAnnotation), "\n") + val annotations = annotationsToString(getExtension(KonanSerializerProtocol.propertyAnnotation)) append("$annotations$Indent$isExternal$modality$visibility$isConst$isVar$name: $returnType\n") } @@ -280,7 +277,7 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment, val upperBounds = upperBoundsToString(upperBounds(TypeTables.peek())) val isReified = if (reified) "reified " else "" val variance = variance.asString() - val annotations = annotationsToString(getExtension(KonanSerializerProtocol.typeParameterAnnotation)) + val annotations = annotationsToString(getExtension(KonanSerializerProtocol.typeParameterAnnotation), true) return "$annotations$isReified$variance$parameterName$upperBounds" } @@ -296,20 +293,30 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment, val type = type(TypeTables.peek()).asString() val isCrossInline = Flags.IS_CROSSINLINE.asString(flags) - val annotations = annotationsToString(getExtension(KonanSerializerProtocol.parameterAnnotation)) + val annotations = annotationsToString(getExtension(KonanSerializerProtocol.parameterAnnotation), true) return "$annotations$isCrossInline$parameterName: $type" } //-------------------------------------------------------------------------// - private fun annotationsToString(annotations: List, separator: String = " ") = - buildString { annotations.forEach { append(it.asString() + separator) } } + private fun annotationsToString(annotations: List, oneline: Boolean = false): String { + if (annotations.isEmpty()) { + return "" + } + + val prefix = if (oneline) "" else "$Indent" + val separator = if (oneline) " " else "\n$Indent" + val postfix = if (oneline) " " else "\n" + return annotations.joinToString(prefix = prefix, separator = separator, postfix = postfix) { + it.asString() + } + } //-------------------------------------------------------------------------// private fun ProtoBuf.Annotation.asString(): String { - val builder = StringBuilder("$Indent@${getName(id)}") + val builder = StringBuilder("@${getName(id)}") argumentList.joinTo(builder, prefix = "(", postfix = ")") { it.value.asString() } return builder.toString() }