New J2K: Type system refactored, parents from types removed, added JKTypeElement

This commit is contained in:
Dimach
2018-05-28 16:07:10 +03:00
committed by Ilya Kirillov
parent bc645a12b5
commit bfb0f4a369
12 changed files with 86 additions and 124 deletions
@@ -186,8 +186,8 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
return JKExpressionListImpl(this?.expressions?.map { it.toJK() } ?: emptyList())
}
fun PsiTypeElement.toJK(): JKType {
return type.toJK().also {
fun PsiTypeElement.toJK(): JKTypeElement {
return JKTypeElementImpl(type.toJK()).also {
backAnnotation[it] = this
}
}
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.j2k.tree.JKJavaMethod
import org.jetbrains.kotlin.j2k.tree.JKTreeElement
import org.jetbrains.kotlin.j2k.tree.impl.JKJavaPrimitiveTypeImpl
import org.jetbrains.kotlin.j2k.tree.impl.JKKtFunctionImpl
import org.jetbrains.kotlin.j2k.tree.impl.JKTypeElementImpl
class JavaMethodToKotlinFunctionConversion : TransformerBasedConversion() {
override fun visitTreeElement(element: JKTreeElement) {
@@ -31,7 +32,7 @@ class JavaMethodToKotlinFunctionConversion : TransformerBasedConversion() {
somethingChanged = true
klass.declarationList = klass.declarationList.map {
if (it is JKJavaMethod) JKKtFunctionImpl(
JKJavaPrimitiveTypeImpl.BOOLEAN,
JKTypeElementImpl(JKJavaPrimitiveTypeImpl.BOOLEAN),
it.name,
it.valueArguments,
it.block,
@@ -8,12 +8,10 @@ package org.jetbrains.kotlin.j2k.conversions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.j2k.ConversionContext
import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.j2k.tree.JKClassType
import org.jetbrains.kotlin.j2k.tree.JKJavaPrimitiveType
import org.jetbrains.kotlin.j2k.tree.JKTreeElement
import org.jetbrains.kotlin.j2k.tree.JKType
import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.impl.JKClassSymbol
import org.jetbrains.kotlin.j2k.tree.impl.JKClassTypeImpl
import org.jetbrains.kotlin.j2k.tree.impl.JKTypeElementImpl
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.platform.JavaToKotlinClassMap
@@ -40,11 +38,14 @@ class TypeMappingConversion(val context: ConversionContext) : MatchBasedConversi
fun applyToElement(element: JKTreeElement): JKTreeElement {
return when (element) {
is JKJavaPrimitiveType -> mapPrimitiveType(element)
is JKClassType -> mapClassType(element)
else -> applyRecursive(element, this::applyToElement)
}
return if (element is JKTypeElement) {
val type = element.type
when (type) {
is JKJavaPrimitiveType -> mapPrimitiveType(type, element)
is JKClassType -> mapClassType(type, element)
else -> applyRecursive(element, this::applyToElement)
}
} else applyRecursive(element, this::applyToElement)
}
private fun resolveFqName(classId: ClassId, element: PsiElement): PsiElement? {
@@ -70,17 +71,20 @@ class TypeMappingConversion(val context: ConversionContext) : MatchBasedConversi
return JKClassTypeImpl(context.symbolProvider.provideSymbol(newTarget) as JKClassSymbol, parameters, nullability)
}
fun mapClassType(type: JKClassType): JKType {
val fqNameStr = (type.classReference as? JKClassSymbol)?.fqName ?: return type
fun mapClassType(type: JKClassType, typeElement: JKTypeElement): JKTypeElement {
val fqNameStr = (type.classReference as? JKClassSymbol)?.fqName ?: return typeElement
val newFqName = JavaToKotlinClassMap.mapJavaToKotlin(FqName(fqNameStr)) ?: return type
val newFqName = JavaToKotlinClassMap.mapJavaToKotlin(FqName(fqNameStr)) ?: return typeElement
return classTypeByFqName(context.backAnnotator(type), newFqName, type.parameters, type.nullability) ?: type
return classTypeByFqName(context.backAnnotator(typeElement), newFqName, type.parameters, type.nullability)?.let {
JKTypeElementImpl(it)
} ?: typeElement
}
fun mapPrimitiveType(type: JKJavaPrimitiveType): JKType {
fun mapPrimitiveType(type: JKJavaPrimitiveType, typeElement: JKTypeElement): JKTypeElement {
val fqName = JvmPrimitiveType.get(type.name).primitiveType.typeFqName
return classTypeByFqName(context.backAnnotator(type), ClassId.topLevel(fqName), emptyList()) ?: type
return classTypeByFqName(context.backAnnotator(typeElement), ClassId.topLevel(fqName), emptyList())?.let { JKTypeElementImpl(it) }
?: typeElement
}
}
@@ -74,15 +74,13 @@ private class DebugTreePrinter : JKVisitorVoid {
printer.println("]")
}
override fun visitType(type: JKType) {
override fun visitTypeElement(typeElement: JKTypeElement) {
val type = typeElement.type
printer.println(type.classNameWithoutJK(), " \"")
printer.indented {
if (type is JKClassType) {
printer.println((type.classReference as? JKClassSymbol)?.fqName ?: type.classReference?.let { it::class } ?: "Unbound")
}
if (type is JKJavaArrayType) {
type.type.accept(this, null)
}
if (type is JKJavaPrimitiveType) {
printer.println(type.name)
}
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor
class JKJavaFieldImpl(
modifierList: JKModifierList,
type: JKType,
type: JKTypeElement,
name: JKNameIdentifier,
initializer: JKExpression
) : JKJavaField, JKBranchElementBase() {
@@ -32,9 +32,23 @@ class JKJavaFieldImpl(
override var initializer: JKExpression by child(initializer)
override var modifierList: JKModifierList by child(modifierList)
override var type by child(type)
override var name: JKNameIdentifier by child(name)
override var type: JKType by child(type)
}
class JKJavaMethodImpl(
override var modifierList: JKModifierList,
override var name: JKNameIdentifier,
override var valueArguments: List<JKValueArgument>,
override var block: JKBlock
) : JKJavaMethod, JKElementBase() {
override val returnType: JKTypeElement
get() = TODO()
override val valid: Boolean
get() = true
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaMethod(this, data)
}
class JKJavaLiteralExpressionImpl(
@@ -52,27 +66,12 @@ class JKJavaModifierImpl(override val type: JKJavaModifier.JavaModifierType) : J
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaModifier(this, data)
}
class JKJavaMethodImpl(
override var modifierList: JKModifierList,
override var name: JKNameIdentifier,
override var valueArguments: List<JKValueArgument>,
override var block: JKBlock
) : JKJavaMethod, JKElementBase() {
override val returnType: JKType
get() = TODO()
override val valid: Boolean
get() = true
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaMethod(this, data)
}
sealed class JKJavaOperatorImpl : JKOperator, JKElementBase() {
sealed class JKJavaOperatorImpl : JKOperator {
object PLUS : JKJavaOperatorImpl()
object MINUS : JKJavaOperatorImpl()
}
sealed class JKJavaQualifierImpl : JKQualifier, JKElementBase() {
sealed class JKJavaQualifierImpl : JKQualifier {
object DOT : JKJavaQualifierImpl()
}
@@ -80,18 +79,10 @@ class JKJavaMethodCallExpressionImpl(
override var identifier: JKMethodSymbol, override var arguments: JKExpressionList
) : JKJavaMethodCallExpression, JKElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaMethodCallExpression(this, data)
override fun <D> acceptChildren(visitor: JKVisitor<Unit, D>, data: D) {
arguments.accept(visitor, data)
}
}
class JKJavaFieldAccessExpressionImpl(override var identifier: JKFieldSymbol) : JKJavaFieldAccessExpression, JKElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaFieldAccessExpression(this, data)
override fun <D> acceptChildren(visitor: JKVisitor<Unit, D>, data: D) {
}
}
class JKJavaNewExpressionImpl(
@@ -105,37 +96,19 @@ class JKJavaNewExpressionImpl(
class JKJavaNewEmptyArrayImpl(override var initializer: List<JKLiteralExpression?>) : JKJavaNewEmptyArray, JKElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaNewEmptyArray(this, data)
override fun <D> acceptChildren(visitor: JKVisitor<Unit, D>, data: D) {
}
}
class JKJavaNewArrayImpl(override var initializer: List<JKExpression>) : JKJavaNewArray, JKElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaNewArray(this, data)
override fun <D> acceptChildren(visitor: JKVisitor<Unit, D>, data: D) {
}
}
sealed class JKJavaPrimitiveTypeImpl(override val name: String) : JKJavaPrimitiveType, JKElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaPrimitiveType(this, data)
override fun <D> acceptChildren(visitor: JKVisitor<Unit, D>, data: D) {
}
sealed class JKJavaPrimitiveTypeImpl(override val name: String) : JKJavaPrimitiveType {
object BYTE : JKJavaPrimitiveTypeImpl("byte")
object BOOLEAN : JKJavaPrimitiveTypeImpl("boolean")
object INT : JKJavaPrimitiveTypeImpl("int")
}
class JKJavaArrayTypeImpl(type: JKType) : JKJavaArrayType, JKBranchElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaArrayType(this, data)
override val type: JKType by child(type)
}
class JKJavaArrayTypeImpl(override val type: JKType) : JKJavaArrayType
class JKReturnStatementImpl(expression: JKExpression) : JKBranchElementBase(), JKReturnStatement {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitReturnStatement(this, data)
@@ -127,7 +127,7 @@ class JKModifierListImpl(modifiers: List<JKModifier> = emptyList()) : JKModifier
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitModifierList(this, data)
}
class JKValueArgumentImpl(type: JKType, override val name: String) : JKValueArgument, JKBranchElementBase() {
class JKValueArgumentImpl(type: JKTypeElement, override val name: String) : JKValueArgument, JKBranchElementBase() {
override var type by child(type)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitValueArgument(this, data)
}
@@ -144,8 +144,7 @@ class JKBinaryExpressionImpl(left: JKExpression, right: JKExpression, override v
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitBinaryExpression(this, data)
}
class JKPrefixExpressionImpl(expression: JKExpression, operator: JKOperator) : JKPrefixExpression, JKBranchElementBase() {
override var operator by child(operator)
class JKPrefixExpressionImpl(expression: JKExpression, override var operator: JKOperator) : JKPrefixExpression, JKBranchElementBase() {
override var expression by child(expression)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitPrefixExpression(this, data)
}
@@ -192,25 +191,18 @@ class JKParenthesizedExpressionImpl(override var expression: JKExpression) : JKP
}
class JKTypeCastExpressionImpl(override var expression: JKExpression, override var type: JKType) : JKTypeCastExpression,
class JKTypeCastExpressionImpl(override var expression: JKExpression, type: JKTypeElement) : JKTypeCastExpression,
JKBranchElementBase() {
override var type by child(type)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitTypeCastExpression(this, data)
override fun <D> acceptChildren(visitor: JKVisitor<Unit, D>, data: D) {
expression.accept(visitor, data)
type.accept(visitor, data)
}
}
class JKTypeElementImpl(override val type: JKType) : JKTypeElement, JKElementBase()
class JKClassTypeImpl(
override val classReference: JKClassSymbol,
parameters: List<JKType>,
override var parameters: List<JKType>,
override val nullability: Nullability = Nullability.Default
) : JKClassType, JKBranchElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitClassType(this, data)
override var parameters: List<JKType> by children(parameters)
}
) : JKClassType
class JKNullLiteral : JKExpression, JKElementBase()
@@ -21,19 +21,18 @@ import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor
class JKKtPropertyImpl(
modifierList: JKModifierList,
type: JKType,
type: JKTypeElement,
name: JKNameIdentifier,
initializer: JKExpression,
getter: JKBlock,
setter: JKBlock
) : JKBranchElementBase(), JKKtProperty {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtProperty(this, data)
override val valid: Boolean
get() = true
override var modifierList: JKModifierList by child(modifierList)
override var type: JKType by child(type)
override var type by child(type)
override var name: JKNameIdentifier by child(name)
override val initializer: JKExpression by child(initializer)
override val getter: JKBlock by child(getter)
@@ -41,7 +40,7 @@ class JKKtPropertyImpl(
}
class JKKtFunctionImpl(
returnType: JKType,
returnType: JKTypeElement,
name: JKNameIdentifier,
valueArguments: List<JKValueArgument>,
block: JKBlock,
@@ -50,7 +49,7 @@ class JKKtFunctionImpl(
override val valid: Boolean
get() = true
override var returnType: JKType by child(returnType)
override var returnType: JKTypeElement by child(returnType)
override var name: JKNameIdentifier by child(name)
override var valueArguments: List<JKValueArgument> by children(valueArguments)
override var block: JKBlock by child(block)
@@ -58,7 +57,6 @@ class JKKtFunctionImpl(
}
sealed class JKKtQualifierImpl : JKQualifier, JKElementBase() {
object DOT : JKKtQualifierImpl()
object SAFE : JKKtQualifierImpl()
}
@@ -33,14 +33,6 @@ interface JKJavaAssignmentExpression : JKExpression {
var rExpression: JKExpression
}
interface JKJavaPrimitiveType : JKType {
val name: String
}
interface JKJavaArrayType : JKType {
val type: JKType
}
interface JKJavaMethodCallExpression : JKMethodCallExpression
interface JKJavaFieldAccessExpression : JKFieldAccessExpression
+6 -12
View File
@@ -16,10 +16,8 @@
package org.jetbrains.kotlin.j2k.tree
import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.j2k.tree.impl.JKFieldSymbol
import org.jetbrains.kotlin.j2k.tree.impl.JKMethodSymbol
import org.jetbrains.kotlin.j2k.tree.impl.JKSymbol
import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor
interface JKTreeElement : JKElement {
@@ -43,11 +41,11 @@ interface JKClass : JKDeclaration, JKModifierListOwner {
interface JKMethod : JKDeclaration, JKModifierListOwner {
val name: JKNameIdentifier
var valueArguments: List<JKValueArgument>
val returnType: JKType
val returnType: JKTypeElement
}
interface JKField : JKDeclaration, JKModifierListOwner {
val type: JKType
val type: JKTypeElement
val name: JKNameIdentifier
}
@@ -61,12 +59,8 @@ interface JKAccessModifier : JKModifier
interface JKModalityModifier : JKModifier
interface JKType : JKTreeElement
interface JKClassType : JKType {
val classReference: JKSymbol?
val nullability: Nullability
val parameters: List<JKType>
interface JKTypeElement : JKTreeElement {
val type: JKType
}
interface JKStatement : JKTreeElement
@@ -130,7 +124,7 @@ interface JKParenthesizedExpression : JKExpression {
interface JKTypeCastExpression : JKExpression {
val expression: JKExpression
val type: JKType
val type: JKTypeElement
}
interface JKExpressionList : JKTreeElement {
@@ -147,7 +141,7 @@ interface JKLiteralExpression : JKExpression {
}
interface JKValueArgument : JKTreeElement {
var type: JKType
var type: JKTypeElement
val name: String
}
@@ -16,7 +16,10 @@
package org.jetbrains.kotlin.j2k.tree
interface JKOperator : JKTreeElement
import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.j2k.tree.impl.JKSymbol
interface JKOperator
interface JKQualifier
@@ -39,3 +42,19 @@ interface JKModifierListOwner {
interface JKReferenceTarget {
val valid: Boolean
}
interface JKType
interface JKClassType : JKType {
val classReference: JKSymbol?
val nullability: Nullability
val parameters: List<JKType>
}
interface JKJavaPrimitiveType : JKType {
val name: String
}
interface JKJavaArrayType : JKType {
val type: JKType
}
@@ -12,8 +12,7 @@ interface JKVisitor<out R, in D> {
fun visitModifierList(modifierList: JKModifierList, data: D): R = visitTreeElement(modifierList, data)
fun visitAccessModifier(accessModifier: JKAccessModifier, data: D): R = visitModifier(accessModifier, data)
fun visitModalityModifier(modalityModifier: JKModalityModifier, data: D): R = visitModifier(modalityModifier, data)
fun visitType(type: JKType, data: D): R = visitTreeElement(type, data)
fun visitClassType(classType: JKClassType, data: D): R = visitType(classType, data)
fun visitTypeElement(typeElement: JKTypeElement, data: D): R = visitTreeElement(typeElement, data)
fun visitStatement(statement: JKStatement, data: D): R = visitTreeElement(statement, data)
fun visitLoop(loop: JKLoop, data: D): R = visitStatement(loop, data)
fun visitBlock(block: JKBlock, data: D): R = visitTreeElement(block, data)
@@ -39,8 +38,6 @@ interface JKVisitor<out R, in D> {
fun visitJavaMethod(javaMethod: JKJavaMethod, data: D): R = visitMethod(javaMethod, data)
fun visitJavaForLoop(javaForLoop: JKJavaForLoop, data: D): R = visitLoop(javaForLoop, data)
fun visitJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression, data: D): R = visitExpression(javaAssignmentExpression, data)
fun visitJavaPrimitiveType(javaPrimitiveType: JKJavaPrimitiveType, data: D): R = visitType(javaPrimitiveType, data)
fun visitJavaArrayType(javaArrayType: JKJavaArrayType, data: D): R = visitType(javaArrayType, data)
fun visitJavaMethodCallExpression(javaMethodCallExpression: JKJavaMethodCallExpression, data: D): R = visitMethodCallExpression(javaMethodCallExpression, data)
fun visitJavaFieldAccessExpression(javaFieldAccessExpression: JKJavaFieldAccessExpression, data: D): R = visitFieldAccessExpression(javaFieldAccessExpression, data)
fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression, data: D): R = visitExpression(javaNewExpression, data)
@@ -21,10 +21,8 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitAccessModifier(accessModifier: JKAccessModifier, data: Nothing?) = visitAccessModifier(accessModifier)
fun visitModalityModifier(modalityModifier: JKModalityModifier) = visitModifier(modalityModifier, null)
override fun visitModalityModifier(modalityModifier: JKModalityModifier, data: Nothing?) = visitModalityModifier(modalityModifier)
fun visitType(type: JKType) = visitTreeElement(type, null)
override fun visitType(type: JKType, data: Nothing?) = visitType(type)
fun visitClassType(classType: JKClassType) = visitType(classType, null)
override fun visitClassType(classType: JKClassType, data: Nothing?) = visitClassType(classType)
fun visitTypeElement(typeElement: JKTypeElement) = visitTreeElement(typeElement, null)
override fun visitTypeElement(typeElement: JKTypeElement, data: Nothing?) = visitTypeElement(typeElement)
fun visitStatement(statement: JKStatement) = visitTreeElement(statement, null)
override fun visitStatement(statement: JKStatement, data: Nothing?) = visitStatement(statement)
fun visitLoop(loop: JKLoop) = visitStatement(loop, null)
@@ -75,10 +73,6 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitJavaForLoop(javaForLoop: JKJavaForLoop, data: Nothing?) = visitJavaForLoop(javaForLoop)
fun visitJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression) = visitExpression(javaAssignmentExpression, null)
override fun visitJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression, data: Nothing?) = visitJavaAssignmentExpression(javaAssignmentExpression)
fun visitJavaPrimitiveType(javaPrimitiveType: JKJavaPrimitiveType) = visitType(javaPrimitiveType, null)
override fun visitJavaPrimitiveType(javaPrimitiveType: JKJavaPrimitiveType, data: Nothing?) = visitJavaPrimitiveType(javaPrimitiveType)
fun visitJavaArrayType(javaArrayType: JKJavaArrayType) = visitType(javaArrayType, null)
override fun visitJavaArrayType(javaArrayType: JKJavaArrayType, data: Nothing?) = visitJavaArrayType(javaArrayType)
fun visitJavaMethodCallExpression(javaMethodCallExpression: JKJavaMethodCallExpression) = visitMethodCallExpression(javaMethodCallExpression, null)
override fun visitJavaMethodCallExpression(javaMethodCallExpression: JKJavaMethodCallExpression, data: Nothing?) = visitJavaMethodCallExpression(javaMethodCallExpression)
fun visitJavaFieldAccessExpression(javaFieldAccessExpression: JKJavaFieldAccessExpression) = visitFieldAccessExpression(javaFieldAccessExpression, null)