New J2K: Preserve text for unresolved types, and render it in code builder
This commit is contained in:
committed by
Ilya Kirillov
parent
7e2be15fcc
commit
b8bbd85bc7
@@ -22,6 +22,7 @@ import com.intellij.psi.impl.source.tree.ChildRole
|
|||||||
import com.intellij.psi.impl.source.tree.java.PsiLiteralExpressionImpl
|
import com.intellij.psi.impl.source.tree.java.PsiLiteralExpressionImpl
|
||||||
import com.intellij.psi.impl.source.tree.java.PsiNewExpressionImpl
|
import com.intellij.psi.impl.source.tree.java.PsiNewExpressionImpl
|
||||||
import com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl
|
import com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl
|
||||||
|
import org.jetbrains.kotlin.j2k.ast.Nullability
|
||||||
import org.jetbrains.kotlin.j2k.tree.*
|
import org.jetbrains.kotlin.j2k.tree.*
|
||||||
import org.jetbrains.kotlin.j2k.tree.JKLiteralExpression.LiteralType.*
|
import org.jetbrains.kotlin.j2k.tree.JKLiteralExpression.LiteralType.*
|
||||||
import org.jetbrains.kotlin.j2k.tree.impl.*
|
import org.jetbrains.kotlin.j2k.tree.impl.*
|
||||||
@@ -207,7 +208,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun PsiType.toJK(): JKType {
|
fun PsiType.toJK(nullability: Nullability = Nullability.Default): JKType {
|
||||||
return when (this) {
|
return when (this) {
|
||||||
is PsiClassType -> {
|
is PsiClassType -> {
|
||||||
val target = resolve()
|
val target = resolve()
|
||||||
@@ -215,13 +216,14 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
|
|||||||
if (target != null) {
|
if (target != null) {
|
||||||
JKClassTypeImpl(
|
JKClassTypeImpl(
|
||||||
target.let { symbolProvider.provideDirectSymbol(it) as JKClassSymbol },
|
target.let { symbolProvider.provideDirectSymbol(it) as JKClassSymbol },
|
||||||
parameters
|
parameters,
|
||||||
|
nullability
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
JKUnresolvedClassType(parameters)
|
JKUnresolvedClassType(this.presentableText, parameters, nullability)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
is PsiArrayType -> JKJavaArrayTypeImpl(componentType.toJK())
|
is PsiArrayType -> JKJavaArrayTypeImpl(componentType.toJK(), nullability)
|
||||||
is PsiPrimitiveType -> JKJavaPrimitiveTypeImpl.KEYWORD_TO_INSTANCE[presentableText]
|
is PsiPrimitiveType -> JKJavaPrimitiveTypeImpl.KEYWORD_TO_INSTANCE[presentableText]
|
||||||
?: error("Invalid primitive type $presentableText")
|
?: error("Invalid primitive type $presentableText")
|
||||||
else -> throw Exception("Invalid PSI")
|
else -> throw Exception("Invalid PSI")
|
||||||
@@ -237,8 +239,12 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
|
|||||||
isInterface -> JKClass.ClassKind.INTERFACE
|
isInterface -> JKClass.ClassKind.INTERFACE
|
||||||
else -> JKClass.ClassKind.CLASS
|
else -> JKClass.ClassKind.CLASS
|
||||||
}
|
}
|
||||||
val implTypes = this.implementsList?.referencedTypes?.map { with(expressionTreeMapper) { JKTypeElementImpl(it.toJK()) } }.orEmpty()
|
|
||||||
val extTypes = this.extendsList?.referencedTypes?.map { with(expressionTreeMapper) { JKTypeElementImpl(it.toJK()) } }.orEmpty()
|
fun PsiReferenceList.mapTypes() =
|
||||||
|
this.referencedTypes.map { with(expressionTreeMapper) { JKTypeElementImpl(it.toJK(Nullability.NotNull)) } }
|
||||||
|
|
||||||
|
val implTypes = this.implementsList?.mapTypes().orEmpty()
|
||||||
|
val extTypes = this.extendsList?.mapTypes().orEmpty()
|
||||||
return JKClassImpl(
|
return JKClassImpl(
|
||||||
with(modifierMapper) { modifierList.toJK() }, JKNameIdentifierImpl(name!!), JKInheritanceInfoImpl(extTypes + implTypes),
|
with(modifierMapper) { modifierList.toJK() }, JKNameIdentifierImpl(name!!), JKInheritanceInfoImpl(extTypes + implTypes),
|
||||||
classKind
|
classKind
|
||||||
@@ -333,7 +339,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
|
|||||||
is PsiSwitchLabelStatement -> if (isDefaultCase) JKSwitchDefaultLabelStatementImpl() else
|
is PsiSwitchLabelStatement -> if (isDefaultCase) JKSwitchDefaultLabelStatementImpl() else
|
||||||
JKSwitchLabelStatementImpl(with(expressionTreeMapper) { caseValue.toJK() })
|
JKSwitchLabelStatementImpl(with(expressionTreeMapper) { caseValue.toJK() })
|
||||||
is PsiBreakStatement -> {
|
is PsiBreakStatement -> {
|
||||||
labelIdentifier?.also { TODO("Label break") }
|
//labelIdentifier?.also { TODO("Label break") }
|
||||||
JKBreakStatementImpl()
|
JKBreakStatementImpl()
|
||||||
}
|
}
|
||||||
else -> TODO("for ${this::class}")
|
else -> TODO("for ${this::class}")
|
||||||
|
|||||||
@@ -286,7 +286,8 @@ class NewCodeBuilder {
|
|||||||
when (type) {
|
when (type) {
|
||||||
is JKClassType ->
|
is JKClassType ->
|
||||||
(type.classReference as JKClassSymbol).fqName?.let { printer.printWithNoIndent(FqName(it).shortName().asString()) }
|
(type.classReference as JKClassSymbol).fqName?.let { printer.printWithNoIndent(FqName(it).shortName().asString()) }
|
||||||
|
is JKUnresolvedClassType ->
|
||||||
|
printer.printWithNoIndent(type.name)
|
||||||
else -> printer.printWithNoIndent("Unit /* TODO: ${type::class} */")
|
else -> printer.printWithNoIndent("Unit /* TODO: ${type::class} */")
|
||||||
}
|
}
|
||||||
when (type.nullability) {
|
when (type.nullability) {
|
||||||
|
|||||||
@@ -178,6 +178,7 @@ class JKClassTypeImpl(
|
|||||||
|
|
||||||
|
|
||||||
class JKUnresolvedClassType(
|
class JKUnresolvedClassType(
|
||||||
|
val name: String,
|
||||||
var parameters: List<JKType>,
|
var parameters: List<JKType>,
|
||||||
override val nullability: Nullability = Nullability.Default
|
override val nullability: Nullability = Nullability.Default
|
||||||
) : JKType
|
) : JKType
|
||||||
|
|||||||
Reference in New Issue
Block a user