From 4097ebe583543bb2ae55a7ddaaafd4738c06d757 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Wed, 7 Nov 2018 17:02:18 +0300 Subject: [PATCH] New J2K: Add typeParameter's upper bounds --- .../kotlin/j2k/JavaToJKTreeBuilder.kt | 3 ++- .../jetbrains/kotlin/j2k/NewCodeBuilder.kt | 26 +++++++++++++++++++ .../org/jetbrains/kotlin/j2k/tree/impl/jk.kt | 3 ++- .../org/jetbrains/kotlin/j2k/tree/jk.kt | 1 + .../org/jetbrains/kotlin/j2k/tree/types.kt | 1 + 5 files changed, 32 insertions(+), 2 deletions(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt index 0bf9665cedd..4d957fe7f1c 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt @@ -237,7 +237,8 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) { JKTypeParameterListImpl(typeParameters.map { it.toJK() }) fun PsiTypeParameter.toJK(): JKTypeParameter = - JKTypeParameterImpl(JKNameIdentifierImpl(name!!)) + JKTypeParameterImpl(JKNameIdentifierImpl(name!!), + extendsListTypes.map { JKTypeElementImpl(it.toJK(symbolProvider, Nullability.NotNull)) }) fun PsiClass.toJK(): JKClass { val classKind: JKClass.ClassKind = when { diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt index 05bef3bad65..663d06dcf73 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt @@ -41,6 +41,25 @@ class NewCodeBuilder { } inner class Visitor : JKVisitorVoid { + private fun renderExtraTypeParametersUpperBounds(typeParameterList: JKTypeParameterList) { + val extraTypeBounds = typeParameterList.typeParameters + .filter { it.upperBounds.size > 1 } + if (extraTypeBounds.isNotEmpty()) { + printer.printWithNoIndent(" where ") + val typeParametersWithBoudnds = + extraTypeBounds.flatMap { typeParameter -> + typeParameter.upperBounds.map { bound -> + typeParameter.name to bound + } + } + renderList(typeParametersWithBoudnds) { (name, bound) -> + name.accept(this) + printer.printWithNoIndent(" : ") + bound.accept(this) + } + } + } + override fun visitTreeElement(treeElement: JKTreeElement) { printer.print("/* !!! Hit visitElement for element type: ${treeElement::class} !!! */") } @@ -195,6 +214,9 @@ class NewCodeBuilder { } } + //TODO should it be here? + renderExtraTypeParametersUpperBounds(klass.typeParameterList) + if (klass.declarationList.any { it !is JKKtPrimaryConstructor }) { printer.block(multiline = true) { klass.declarationList.forEach { it.accept(this) } @@ -317,6 +339,10 @@ class NewCodeBuilder { override fun visitTypeParameter(typeParameter: JKTypeParameter) { typeParameter.name.accept(this) + if (typeParameter.upperBounds.size == 1) { + printer.printlnWithNoIndent(" : ") + typeParameter.upperBounds.single().accept(this) + } } override fun visitLiteralExpression(literalExpression: JKLiteralExpression) { 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 1f43611068c..5871df1b2f1 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -453,7 +453,8 @@ class JKTypeParameterListImpl(typeParameters: List = emptyList( override fun accept(visitor: JKVisitor, data: D): R = visitor.visitTypeParameterList(this, data) } -class JKTypeParameterImpl(name: JKNameIdentifier) : JKTypeParameter, JKBranchElementBase() { +class JKTypeParameterImpl(name: JKNameIdentifier, upperBounds: List) : JKTypeParameter, JKBranchElementBase() { override var name: JKNameIdentifier by child(name) + override var upperBounds: List by children(upperBounds) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitTypeParameter(this, data) } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt index 0939af78f82..fe5774def93 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt @@ -281,6 +281,7 @@ interface JKTypeParameterList : JKTreeElement { interface JKTypeParameter : JKTreeElement { var name: JKNameIdentifier + var upperBounds: List } interface JKTypeParameterListOwner : JKTreeElement { diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt index 0ff54d32d6a..aebb8faaa7f 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt @@ -70,6 +70,7 @@ fun PsiType.toJK(symbolProvider: JKSymbolProvider, nullability: Nullability = Nu ?: error("Invalid primitive type $presentableText") is PsiDisjunctionType -> JKJavaDisjunctionTypeImpl(disjunctions.map { it.toJK(symbolProvider) }) + is PsiWildcardType -> JKStarProjectionTypeImpl() else -> throw Exception("Invalid PSI ${this::class.java}") } }