New J2K: Add typeParameter's upper bounds

This commit is contained in:
Ilya Kirillov
2018-11-07 17:02:18 +03:00
committed by Ilya Kirillov
parent 33b66ec17e
commit 4097ebe583
5 changed files with 32 additions and 2 deletions
@@ -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 {
@@ -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) {
@@ -453,7 +453,8 @@ class JKTypeParameterListImpl(typeParameters: List<JKTypeParameter> = emptyList(
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitTypeParameterList(this, data)
}
class JKTypeParameterImpl(name: JKNameIdentifier) : JKTypeParameter, JKBranchElementBase() {
class JKTypeParameterImpl(name: JKNameIdentifier, upperBounds: List<JKTypeElement>) : JKTypeParameter, JKBranchElementBase() {
override var name: JKNameIdentifier by child(name)
override var upperBounds: List<JKTypeElement> by children(upperBounds)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitTypeParameter(this, data)
}
@@ -281,6 +281,7 @@ interface JKTypeParameterList : JKTreeElement {
interface JKTypeParameter : JKTreeElement {
var name: JKNameIdentifier
var upperBounds: List<JKTypeElement>
}
interface JKTypeParameterListOwner : JKTreeElement {
@@ -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}")
}
}