From 1fac1fc5d3b52d60768f652a8e7a232819dea21e Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Sat, 27 Feb 2021 13:46:13 +0300 Subject: [PATCH] [FIR] Add proper rendering of FirJavaTypeRef --- .../testData/builtIns/kotlin-collections.txt | 2 +- .../kotlin/fir/types/jvm/FirJavaTypeRef.kt | 26 +++++++++++++++++-- .../kotlin/fir/types/FirUserTypeRef.kt | 1 + .../org/jetbrains/kotlin/fir/FirRenderer.kt | 4 +++ .../fir/types/impl/FirUserTypeRefImpl.kt | 2 ++ .../fir/tree/generator/NodeConfigurator.kt | 1 + 6 files changed, 33 insertions(+), 3 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/builtIns/kotlin-collections.txt b/compiler/fir/analysis-tests/testData/builtIns/kotlin-collections.txt index 6ae2c2fa494..3ea064d7994 100644 --- a/compiler/fir/analysis-tests/testData/builtIns/kotlin-collections.txt +++ b/compiler/fir/analysis-tests/testData/builtIns/kotlin-collections.txt @@ -1,5 +1,5 @@ public/*package*/ open class ArraysUtilJVM : R|kotlin/Any| { - public/*package*/ open static fun !|> asList(p0: ): + public/*package*/ open static fun !|> asList(p0: T[]): java.util.List public/*package*/ constructor(): R|kotlin/collections/ArraysUtilJVM| diff --git a/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/types/jvm/FirJavaTypeRef.kt b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/types/jvm/FirJavaTypeRef.kt index 57c8a66b152..9476969a9fc 100644 --- a/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/types/jvm/FirJavaTypeRef.kt +++ b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/types/jvm/FirJavaTypeRef.kt @@ -15,6 +15,9 @@ import org.jetbrains.kotlin.fir.types.FirUserTypeRef import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.transformInplace +import org.jetbrains.kotlin.load.java.structure.JavaArrayType +import org.jetbrains.kotlin.load.java.structure.JavaClassifierType +import org.jetbrains.kotlin.load.java.structure.JavaPrimitiveType import org.jetbrains.kotlin.load.java.structure.JavaType class FirJavaTypeRef( @@ -22,6 +25,9 @@ class FirJavaTypeRef( annotationBuilder: () -> List, override val qualifier: MutableList ) : FirUserTypeRef(), FirAnnotationContainer { + override val customRenderer: Boolean + get() = true + override val isMarkedNullable: Boolean get() = false @@ -48,7 +54,10 @@ class FirJavaTypeRef( return this } - override fun replaceSource(newSource: FirSourceElement?) { + override fun replaceSource(newSource: FirSourceElement?) {} + + override fun toString(): String { + return type.render() } } @@ -65,4 +74,17 @@ class FirJavaTypeRefBuilder { inline fun buildJavaTypeRef(init: FirJavaTypeRefBuilder.() -> Unit): FirJavaTypeRef { return FirJavaTypeRefBuilder().apply(init).build() -} \ No newline at end of file +} + +private fun JavaType?.render(): String { + return when (this) { + is JavaArrayType -> "${componentType.render()}[]" + is JavaClassifierType -> if (typeArguments.isEmpty()) { + classifierQualifiedName + } else { + classifierQualifiedName + typeArguments.joinToString(separator = ", ", prefix = "<", postfix = ">") { it.render() } + } + is JavaPrimitiveType -> type?.typeName?.identifier ?: "void" + else -> toString() + } +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/FirUserTypeRef.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/FirUserTypeRef.kt index dffcf72a133..bc9fd44023b 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/FirUserTypeRef.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/FirUserTypeRef.kt @@ -19,6 +19,7 @@ abstract class FirUserTypeRef : FirTypeRefWithNullability() { abstract override val annotations: List abstract override val isMarkedNullable: Boolean abstract val qualifier: List + abstract val customRenderer: Boolean override fun accept(visitor: FirVisitor, data: D): R = visitor.visitUserTypeRef(this, data) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index e0bbd3b287b..f8d3b667678 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -947,6 +947,10 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM override fun visitUserTypeRef(userTypeRef: FirUserTypeRef) { userTypeRef.annotations.renderAnnotations() + if (userTypeRef.customRenderer) { + print(userTypeRef.toString()) + return + } for ((index, qualifier) in userTypeRef.qualifier.withIndex()) { if (index != 0) { print(".") diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirUserTypeRefImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirUserTypeRefImpl.kt index 219e553abcf..ebdf8c466dc 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirUserTypeRefImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirUserTypeRefImpl.kt @@ -21,6 +21,8 @@ class FirUserTypeRefImpl( override val qualifier: MutableList, override val annotations: MutableList ) : FirUserTypeRef(), FirAnnotationContainer { + override val customRenderer: Boolean + get() = false override fun acceptChildren(visitor: FirVisitor, data: D) { for (part in qualifier) { diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt index 09121c8ffef..a3f88c2c23b 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt @@ -571,6 +571,7 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild userTypeRef.configure { +fieldList("qualifier", firQualifierPartType) + +booleanField("customRenderer") } functionTypeRef.configure {