From b8bbd85bc7ddc942a6a9938473daee3ecc4fb80e Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Fri, 20 Jul 2018 13:54:47 +0300 Subject: [PATCH] New J2K: Preserve text for unresolved types, and render it in code builder --- .../kotlin/j2k/JavaToJKTreeBuilder.kt | 20 ++++++++++++------- .../jetbrains/kotlin/j2k/NewCodeBuilder.kt | 3 ++- .../org/jetbrains/kotlin/j2k/tree/impl/jk.kt | 1 + 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt index 7c3bbbbd654..c65bc52c151 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt @@ -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.PsiNewExpressionImpl 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.JKLiteralExpression.LiteralType.* 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) { is PsiClassType -> { val target = resolve() @@ -215,13 +216,14 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) { if (target != null) { JKClassTypeImpl( target.let { symbolProvider.provideDirectSymbol(it) as JKClassSymbol }, - parameters + parameters, + nullability ) } 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] ?: error("Invalid primitive type $presentableText") else -> throw Exception("Invalid PSI") @@ -237,8 +239,12 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) { isInterface -> JKClass.ClassKind.INTERFACE 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( with(modifierMapper) { modifierList.toJK() }, JKNameIdentifierImpl(name!!), JKInheritanceInfoImpl(extTypes + implTypes), classKind @@ -333,7 +339,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) { is PsiSwitchLabelStatement -> if (isDefaultCase) JKSwitchDefaultLabelStatementImpl() else JKSwitchLabelStatementImpl(with(expressionTreeMapper) { caseValue.toJK() }) is PsiBreakStatement -> { - labelIdentifier?.also { TODO("Label break") } + //labelIdentifier?.also { TODO("Label break") } JKBreakStatementImpl() } else -> TODO("for ${this::class}") diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt index 91710dbba72..7b2a25defba 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt @@ -286,7 +286,8 @@ class NewCodeBuilder { when (type) { is JKClassType -> (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} */") } when (type.nullability) { 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 572ec0b720b..36053baee3e 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -178,6 +178,7 @@ class JKClassTypeImpl( class JKUnresolvedClassType( + val name: String, var parameters: List, override val nullability: Nullability = Nullability.Default ) : JKType