diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JKSymbolProvider.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JKSymbolProvider.kt index c3459a68f63..c94e11a3fe7 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JKSymbolProvider.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JKSymbolProvider.kt @@ -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() + private val elementVisitor = ElementVisitor() + + fun preBuildTree(files: List) { + 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) + } + } } \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt index cd5a00bfc3e..c8d596c6e88 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt @@ -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() - val symbols = mutableMapOf() - - val symbolsByDeclaration = mutableMapOf() - - 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 } } } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewJavaToKotlinConverter.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewJavaToKotlinConverter.kt index e1e50dd56c1..9617b5b2b79 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewJavaToKotlinConverter.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewJavaToKotlinConverter.kt @@ -37,16 +37,17 @@ class NewJavaToKotlinConverter( } fun filesToKotlin(files: List, progressIndicator: ProgressIndicator = EmptyProgressIndicator()): List { - 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) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/FieldToPropertyConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/FieldToPropertyConversion.kt index 08565dd6df1..2813be75228 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/FieldToPropertyConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/FieldToPropertyConversion.kt @@ -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() @@ -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 } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/symbols.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/symbols.kt index d5fc6b5431d..70da9129d7a 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/symbols.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/symbols.kt @@ -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