New J2K: Done symbols

This commit is contained in:
Dimach
2018-05-23 19:33:17 +03:00
committed by Ilya Kirillov
parent 1e4737b4b2
commit f912639999
5 changed files with 69 additions and 55 deletions
@@ -5,15 +5,47 @@
package org.jetbrains.kotlin.j2k
import com.intellij.psi.*
import org.jetbrains.kotlin.j2k.tree.impl.*
import org.jetbrains.kotlin.psi.KtClassOrObject
class JKSymbolProvider {
//
//
// fun provideSymbol(clz: PsiClass): JKClassSymbol {
//
// }
//
// fun provideSymbol(clz: KtClassOrObject): JKClassSymbol {
//
// }
val symbols = mutableMapOf<PsiElement, JKSymbol>()
private val elementVisitor = ElementVisitor()
fun preBuildTree(files: List<PsiJavaFile>) {
files.forEach { it.accept(elementVisitor) }
}
fun provideSymbol(psi: PsiElement): JKSymbol {
return symbols.getOrPut(psi) {
when (psi) {
is PsiClass -> JKMultiverseClassSymbol(psi)
is KtClassOrObject -> JKMultiverseKtClassSymbol(psi)
is PsiMethod -> JKMultiverseMethodSymbol(psi)
is PsiField -> JKMultiverseFieldSymbol(psi)
else -> TODO()
}
}
}
private inner class ElementVisitor : JavaElementVisitor() {
override fun visitClass(aClass: PsiClass) {
symbols[aClass] = JKUniverseClassSymbol()
aClass.acceptChildren(this)
}
override fun visitField(field: PsiField) {
symbols[field] = JKUniverseFieldSymbol()
}
override fun visitMethod(method: PsiMethod) {
symbols[method] = JKUniverseMethodSymbol()
}
override fun visitFile(file: PsiFile) {
file.acceptChildren(this)
}
}
}
@@ -26,7 +26,7 @@ import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.impl.*
class JavaToJKTreeBuilder {
class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
private val expressionTreeMapper = ExpressionTreeMapper()
@@ -36,32 +36,6 @@ class JavaToJKTreeBuilder {
val backAnnotation = mutableMapOf<JKElement, PsiElement>()
val symbols = mutableMapOf<PsiElement, JKSymbol>()
val symbolsByDeclaration = mutableMapOf<JKDeclaration, JKSymbol>()
fun provideSymbol(psi: PsiElement): JKSymbol {
return symbols.getOrPut(psi) {
when (psi) {
is PsiClass -> JKMultiverseClassSymbol(psi)
is PsiMethod -> JKMultiverseMethodSymbol(psi)
is PsiField -> JKMultiverseFieldSymbol(psi)
else -> TODO()
}
}
}
fun provideSymbol(psi: JKDeclaration): JKSymbol {
return symbolsByDeclaration.getOrPut(psi) {
when (psi) {
is JKClass -> JKUniverseClassSymbol(psi)
is JKMethod -> JKUniverseMethodSymbol(psi)
is JKField -> JKUniverseFieldSymbol(psi)
else -> TODO()
}
}
}
private inner class ExpressionTreeMapper {
fun PsiExpression.toJK(): JKExpression {
when (this) {
@@ -190,7 +164,10 @@ class JavaToJKTreeBuilder {
return JKJavaNewEmptyArrayImpl(dimensions.map { it?.toJK() })
}
}
return JKJavaNewExpressionImpl(provideSymbol(constructorFakeReference.resolve()!!) as JKMethodSymbol, argumentList.toJK())
return JKJavaNewExpressionImpl(
symbolProvider.provideSymbol(constructorFakeReference.resolve()!!) as JKMethodSymbol,
argumentList.toJK()
)
}
fun PsiArrayAccessExpression.toJK(): JKExpression {
@@ -218,7 +195,7 @@ class JavaToJKTreeBuilder {
fun PsiType.toJK(): JKType {
return when (this) {
is PsiClassType -> JKClassTypeImpl(
resolve()?.let { provideSymbol(it) as? JKClassSymbol }!!,
resolve()?.let { symbolProvider.provideSymbol(it) as? JKClassSymbol }!!,
parameters.map { it.toJK() }
)
is PsiArrayType -> JKJavaArrayTypeImpl(componentType.toJK())
@@ -247,7 +224,7 @@ class JavaToJKTreeBuilder {
it.declarationList = psi.children.mapNotNull {
ElementVisitor(this@DeclarationMapper).apply { it.accept(this) }.resultElement as? JKDeclaration
}
provideSymbol(it)
(symbolProvider.provideSymbol(psi) as? JKUniverseClassSymbol)?.run { target = it }
}
}
@@ -258,7 +235,7 @@ class JavaToJKTreeBuilder {
JKNameIdentifierImpl(this.name),
with(expressionTreeMapper) { initializer?.toJK() } ?: TODO()
).also {
provideSymbol(it)
(symbolProvider.provideSymbol(this) as? JKUniverseFieldSymbol)?.run { target = it }
}
}
@@ -267,7 +244,7 @@ class JavaToJKTreeBuilder {
with(modifierMapper) { modifierList.toJK() }, JKNameIdentifierImpl(name),
parameterList.parameters.map { it -> it.toJK() }, body?.toJK() ?: TODO()
).also {
provideSymbol(it)
(symbolProvider.provideSymbol(this) as? JKUniverseMethodSymbol)?.run { target = it }
}
}
@@ -37,16 +37,17 @@ class NewJavaToKotlinConverter(
}
fun filesToKotlin(files: List<PsiJavaFile>, progressIndicator: ProgressIndicator = EmptyProgressIndicator()): List<String> {
val treeBuilder = JavaToJKTreeBuilder()
val symbolProvider = JKSymbolProvider()
symbolProvider.preBuildTree(files)
val treeBuilder = JavaToJKTreeBuilder(symbolProvider)
val fileTrees = files.mapNotNull(treeBuilder::buildTree)
println(fileTrees.prettyPrintTrees())
val context = ConversionContext(
JKSymbolProvider(),
project,
{ treeBuilder.backAnnotation[it] }
)
project
) { treeBuilder.backAnnotation[it] }
ConversionsRunner.doApply(fileTrees, context)
@@ -7,6 +7,8 @@ package org.jetbrains.kotlin.j2k.conversions
import org.jetbrains.kotlin.j2k.ConversionContext
import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.impl.JKBlockImpl
import org.jetbrains.kotlin.j2k.tree.impl.JKKtPropertyImpl
import org.jetbrains.kotlin.load.java.JvmAbi
class FieldToPropertyConversion : MatchBasedConversion() {
@@ -31,7 +33,7 @@ class FieldToPropertyConversion : MatchBasedConversion() {
)
fun applyToElement(element: JKTreeElement): JKTreeElement {
/*if (element !is JKUDeclarationList) return applyRecursive(element, this::applyToElement)
if (element !is JKClass) return applyRecursive(element, this::applyToElement)
val propertyInfos = mutableMapOf<String, PropertyInfo>()
@@ -41,7 +43,7 @@ class FieldToPropertyConversion : MatchBasedConversion() {
}
}
val declarations= element.declarations.toMutableList()
val declarations = element.declarationList.toMutableList()
declarations.forEach {
when (it) {
is JKJavaField -> propertyInfoFor(it.name.value).field = it
@@ -62,13 +64,13 @@ class FieldToPropertyConversion : MatchBasedConversion() {
JKKtPropertyImpl(field.modifierList, field.type, field.name, field.initializer, JKBlockImpl(), JKBlockImpl())
declarations.remove(field)
declarations.remove(info.getter!!)
declarations.remove(info.setter!!)
declarations.remove(info.getter)
declarations.remove(info.setter)
declarations.add(property)
}
}
element.declarations = declarations*/
element.declarationList = declarations
return element
}
@@ -11,7 +11,6 @@ import com.intellij.psi.PsiMethod
import org.jetbrains.kotlin.j2k.tree.JKClass
import org.jetbrains.kotlin.j2k.tree.JKField
import org.jetbrains.kotlin.j2k.tree.JKMethod
import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtClassOrObject
interface JKSymbol {
@@ -31,7 +30,8 @@ interface JKFieldSymbol : JKSymbol {
val fqName: String
}
class JKUniverseClassSymbol(override val target: JKClass) : JKClassSymbol {
class JKUniverseClassSymbol : JKClassSymbol {
override lateinit var target: JKClass
override val declaredIn: JKSymbol
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
override val fqName: String
@@ -45,7 +45,7 @@ class JKMultiverseClassSymbol(override val target: PsiClass) : JKClassSymbol {
get() = target.qualifiedName
}
class JKMultiverseKtClassSymbol(override val target: KtClassOrObject): JKClassSymbol {
class JKMultiverseKtClassSymbol(override val target: KtClassOrObject) : JKClassSymbol {
override val declaredIn: JKSymbol
get() = TODO("not implemented")
override val fqName: String?
@@ -53,7 +53,8 @@ class JKMultiverseKtClassSymbol(override val target: KtClassOrObject): JKClassSy
}
class JKUniverseMethodSymbol(override val target: JKMethod) : JKMethodSymbol {
class JKUniverseMethodSymbol : JKMethodSymbol {
override lateinit var target: JKMethod
override val declaredIn: JKSymbol
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
override val fqName: String
@@ -68,7 +69,8 @@ class JKMultiverseMethodSymbol(override val target: PsiMethod) : JKMethodSymbol
}
class JKUniverseFieldSymbol(override val target: JKField) : JKFieldSymbol {
class JKUniverseFieldSymbol : JKFieldSymbol {
override lateinit var target: JKField
override val declaredIn: JKSymbol
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
override val fqName: String