New J2K: Add typeParameter's upper bounds
This commit is contained in:
committed by
Ilya Kirillov
parent
33b66ec17e
commit
4097ebe583
@@ -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}")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user