New J2K: Done symbols
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user