New J2K: Done symbols
This commit is contained in:
@@ -5,15 +5,47 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.j2k
|
package org.jetbrains.kotlin.j2k
|
||||||
|
|
||||||
|
import com.intellij.psi.*
|
||||||
|
import org.jetbrains.kotlin.j2k.tree.impl.*
|
||||||
|
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||||
|
|
||||||
|
|
||||||
class JKSymbolProvider {
|
class JKSymbolProvider {
|
||||||
//
|
val symbols = mutableMapOf<PsiElement, JKSymbol>()
|
||||||
//
|
private val elementVisitor = ElementVisitor()
|
||||||
// fun provideSymbol(clz: PsiClass): JKClassSymbol {
|
|
||||||
//
|
fun preBuildTree(files: List<PsiJavaFile>) {
|
||||||
// }
|
files.forEach { it.accept(elementVisitor) }
|
||||||
//
|
}
|
||||||
// fun provideSymbol(clz: KtClassOrObject): JKClassSymbol {
|
|
||||||
//
|
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.*
|
import org.jetbrains.kotlin.j2k.tree.impl.*
|
||||||
|
|
||||||
|
|
||||||
class JavaToJKTreeBuilder {
|
class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
|
||||||
|
|
||||||
private val expressionTreeMapper = ExpressionTreeMapper()
|
private val expressionTreeMapper = ExpressionTreeMapper()
|
||||||
|
|
||||||
@@ -36,32 +36,6 @@ class JavaToJKTreeBuilder {
|
|||||||
|
|
||||||
val backAnnotation = mutableMapOf<JKElement, PsiElement>()
|
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 {
|
private inner class ExpressionTreeMapper {
|
||||||
fun PsiExpression.toJK(): JKExpression {
|
fun PsiExpression.toJK(): JKExpression {
|
||||||
when (this) {
|
when (this) {
|
||||||
@@ -190,7 +164,10 @@ class JavaToJKTreeBuilder {
|
|||||||
return JKJavaNewEmptyArrayImpl(dimensions.map { it?.toJK() })
|
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 {
|
fun PsiArrayAccessExpression.toJK(): JKExpression {
|
||||||
@@ -218,7 +195,7 @@ class JavaToJKTreeBuilder {
|
|||||||
fun PsiType.toJK(): JKType {
|
fun PsiType.toJK(): JKType {
|
||||||
return when (this) {
|
return when (this) {
|
||||||
is PsiClassType -> JKClassTypeImpl(
|
is PsiClassType -> JKClassTypeImpl(
|
||||||
resolve()?.let { provideSymbol(it) as? JKClassSymbol }!!,
|
resolve()?.let { symbolProvider.provideSymbol(it) as? JKClassSymbol }!!,
|
||||||
parameters.map { it.toJK() }
|
parameters.map { it.toJK() }
|
||||||
)
|
)
|
||||||
is PsiArrayType -> JKJavaArrayTypeImpl(componentType.toJK())
|
is PsiArrayType -> JKJavaArrayTypeImpl(componentType.toJK())
|
||||||
@@ -247,7 +224,7 @@ class JavaToJKTreeBuilder {
|
|||||||
it.declarationList = psi.children.mapNotNull {
|
it.declarationList = psi.children.mapNotNull {
|
||||||
ElementVisitor(this@DeclarationMapper).apply { it.accept(this) }.resultElement as? JKDeclaration
|
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),
|
JKNameIdentifierImpl(this.name),
|
||||||
with(expressionTreeMapper) { initializer?.toJK() } ?: TODO()
|
with(expressionTreeMapper) { initializer?.toJK() } ?: TODO()
|
||||||
).also {
|
).also {
|
||||||
provideSymbol(it)
|
(symbolProvider.provideSymbol(this) as? JKUniverseFieldSymbol)?.run { target = it }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -267,7 +244,7 @@ class JavaToJKTreeBuilder {
|
|||||||
with(modifierMapper) { modifierList.toJK() }, JKNameIdentifierImpl(name),
|
with(modifierMapper) { modifierList.toJK() }, JKNameIdentifierImpl(name),
|
||||||
parameterList.parameters.map { it -> it.toJK() }, body?.toJK() ?: TODO()
|
parameterList.parameters.map { it -> it.toJK() }, body?.toJK() ?: TODO()
|
||||||
).also {
|
).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> {
|
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)
|
val fileTrees = files.mapNotNull(treeBuilder::buildTree)
|
||||||
|
|
||||||
println(fileTrees.prettyPrintTrees())
|
println(fileTrees.prettyPrintTrees())
|
||||||
|
|
||||||
val context = ConversionContext(
|
val context = ConversionContext(
|
||||||
JKSymbolProvider(),
|
JKSymbolProvider(),
|
||||||
project,
|
project
|
||||||
{ treeBuilder.backAnnotation[it] }
|
) { treeBuilder.backAnnotation[it] }
|
||||||
)
|
|
||||||
|
|
||||||
ConversionsRunner.doApply(fileTrees, context)
|
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.ConversionContext
|
||||||
import org.jetbrains.kotlin.j2k.tree.*
|
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
|
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||||
|
|
||||||
class FieldToPropertyConversion : MatchBasedConversion() {
|
class FieldToPropertyConversion : MatchBasedConversion() {
|
||||||
@@ -31,7 +33,7 @@ class FieldToPropertyConversion : MatchBasedConversion() {
|
|||||||
)
|
)
|
||||||
|
|
||||||
fun applyToElement(element: JKTreeElement): JKTreeElement {
|
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>()
|
val propertyInfos = mutableMapOf<String, PropertyInfo>()
|
||||||
|
|
||||||
@@ -41,7 +43,7 @@ class FieldToPropertyConversion : MatchBasedConversion() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val declarations= element.declarations.toMutableList()
|
val declarations = element.declarationList.toMutableList()
|
||||||
declarations.forEach {
|
declarations.forEach {
|
||||||
when (it) {
|
when (it) {
|
||||||
is JKJavaField -> propertyInfoFor(it.name.value).field = 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())
|
JKKtPropertyImpl(field.modifierList, field.type, field.name, field.initializer, JKBlockImpl(), JKBlockImpl())
|
||||||
|
|
||||||
declarations.remove(field)
|
declarations.remove(field)
|
||||||
declarations.remove(info.getter!!)
|
declarations.remove(info.getter)
|
||||||
declarations.remove(info.setter!!)
|
declarations.remove(info.setter)
|
||||||
declarations.add(property)
|
declarations.add(property)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
element.declarations = declarations*/
|
element.declarationList = declarations
|
||||||
|
|
||||||
return element
|
return element
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import com.intellij.psi.PsiMethod
|
|||||||
import org.jetbrains.kotlin.j2k.tree.JKClass
|
import org.jetbrains.kotlin.j2k.tree.JKClass
|
||||||
import org.jetbrains.kotlin.j2k.tree.JKField
|
import org.jetbrains.kotlin.j2k.tree.JKField
|
||||||
import org.jetbrains.kotlin.j2k.tree.JKMethod
|
import org.jetbrains.kotlin.j2k.tree.JKMethod
|
||||||
import org.jetbrains.kotlin.psi.KtClass
|
|
||||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||||
|
|
||||||
interface JKSymbol {
|
interface JKSymbol {
|
||||||
@@ -31,7 +30,8 @@ interface JKFieldSymbol : JKSymbol {
|
|||||||
val fqName: String
|
val fqName: String
|
||||||
}
|
}
|
||||||
|
|
||||||
class JKUniverseClassSymbol(override val target: JKClass) : JKClassSymbol {
|
class JKUniverseClassSymbol : JKClassSymbol {
|
||||||
|
override lateinit var target: JKClass
|
||||||
override val declaredIn: JKSymbol
|
override val declaredIn: JKSymbol
|
||||||
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
|
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
|
||||||
override val fqName: String
|
override val fqName: String
|
||||||
@@ -45,7 +45,7 @@ class JKMultiverseClassSymbol(override val target: PsiClass) : JKClassSymbol {
|
|||||||
get() = target.qualifiedName
|
get() = target.qualifiedName
|
||||||
}
|
}
|
||||||
|
|
||||||
class JKMultiverseKtClassSymbol(override val target: KtClassOrObject): JKClassSymbol {
|
class JKMultiverseKtClassSymbol(override val target: KtClassOrObject) : JKClassSymbol {
|
||||||
override val declaredIn: JKSymbol
|
override val declaredIn: JKSymbol
|
||||||
get() = TODO("not implemented")
|
get() = TODO("not implemented")
|
||||||
override val fqName: String?
|
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
|
override val declaredIn: JKSymbol
|
||||||
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
|
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
|
||||||
override val fqName: String
|
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
|
override val declaredIn: JKSymbol
|
||||||
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
|
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
|
||||||
override val fqName: String
|
override val fqName: String
|
||||||
|
|||||||
Reference in New Issue
Block a user