New J2K: Symbol provider refactor.
This commit is contained in:
@@ -6,8 +6,10 @@
|
||||
package org.jetbrains.kotlin.j2k
|
||||
|
||||
import com.intellij.psi.*
|
||||
import org.jetbrains.kotlin.j2k.tree.JKLocalVariable
|
||||
import org.jetbrains.kotlin.j2k.tree.JKParameter
|
||||
import org.jetbrains.kotlin.j2k.tree.JKClass
|
||||
import org.jetbrains.kotlin.j2k.tree.JKDeclaration
|
||||
import org.jetbrains.kotlin.j2k.tree.JKField
|
||||
import org.jetbrains.kotlin.j2k.tree.JKMethod
|
||||
import org.jetbrains.kotlin.j2k.tree.impl.*
|
||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||
|
||||
@@ -32,32 +34,40 @@ class JKSymbolProvider {
|
||||
}
|
||||
}
|
||||
|
||||
fun provideSymbol(reference: PsiReference): JKSymbol {
|
||||
inline fun <reified T : JKSymbol> provideSymbol(reference: PsiReference): T {
|
||||
val target = reference.resolve()
|
||||
if (target != null) return provideDirectSymbol(target)
|
||||
return JKUnresolvedField(reference)
|
||||
if (target != null) return provideDirectSymbol(target) as T
|
||||
return JKUnresolvedField(reference).let { if (it is T) it else JKUnresolvedMethod(reference) as T }
|
||||
}
|
||||
|
||||
fun provideLocalVarSymbol(psi: PsiLocalVariable, variable: JKLocalVariable): JKSymbol {
|
||||
return symbols.getOrPut(psi) { JKUniverseFieldSymbol(variable) }
|
||||
}
|
||||
|
||||
fun provideParameterSymbol(psi: PsiParameter, variable: JKParameter): JKSymbol {
|
||||
return symbols.getOrPut(psi) { JKUniverseFieldSymbol(variable) }
|
||||
fun provideUniverseSymbol(psi: PsiElement, jk: JKDeclaration? = null): JKSymbol = symbols.getOrPut(psi) {
|
||||
when (psi) {
|
||||
is PsiField, is PsiParameter, is PsiLocalVariable -> JKUniverseFieldSymbol()
|
||||
is PsiMethod -> JKUniverseMethodSymbol()
|
||||
is PsiClass -> JKUniverseClassSymbol()
|
||||
else -> TODO()
|
||||
}
|
||||
}.also {
|
||||
if (jk != null)
|
||||
when (it) {
|
||||
is JKUniverseClassSymbol -> it.target = jk as JKClass
|
||||
is JKUniverseFieldSymbol -> it.target = jk as JKField
|
||||
is JKUniverseMethodSymbol -> it.target = jk as JKMethod
|
||||
}
|
||||
}
|
||||
|
||||
private inner class ElementVisitor : JavaElementVisitor() {
|
||||
override fun visitClass(aClass: PsiClass) {
|
||||
symbols[aClass] = JKUniverseClassSymbol()
|
||||
provideUniverseSymbol(aClass)
|
||||
aClass.acceptChildren(this)
|
||||
}
|
||||
|
||||
override fun visitField(field: PsiField) {
|
||||
symbols[field] = JKUniverseFieldSymbol()
|
||||
provideUniverseSymbol(field)
|
||||
}
|
||||
|
||||
override fun visitMethod(method: PsiMethod) {
|
||||
symbols[method] = JKUniverseMethodSymbol()
|
||||
provideUniverseSymbol(method)
|
||||
}
|
||||
|
||||
override fun visitFile(file: PsiFile) {
|
||||
|
||||
@@ -111,9 +111,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
|
||||
fun PsiMethodCallExpression.toJK(): JKExpression {
|
||||
val method = methodExpression as PsiReferenceExpressionImpl
|
||||
|
||||
val call = JKJavaMethodCallExpressionImpl(
|
||||
symbolProvider.provideSymbol(method) as JKMethodSymbol, argumentList.toJK()
|
||||
)
|
||||
val call = JKJavaMethodCallExpressionImpl(symbolProvider.provideSymbol(method), argumentList.toJK())
|
||||
return if (method.findChildByRole(ChildRole.DOT) != null) {
|
||||
JKQualifiedExpressionImpl((method.qualifier as PsiExpression).toJK(), JKJavaQualifierImpl.DOT, call)
|
||||
} else {
|
||||
@@ -223,13 +221,12 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
|
||||
isInterface -> JKClass.ClassKind.INTERFACE
|
||||
else -> JKClass.ClassKind.CLASS
|
||||
}
|
||||
val psi = this
|
||||
return JKClassImpl(with(modifierMapper) { modifierList.toJK() }, JKNameIdentifierImpl(name!!), classKind).also {
|
||||
it.declarationList = psi.children.mapNotNull {
|
||||
return JKClassImpl(with(modifierMapper) { modifierList.toJK() }, JKNameIdentifierImpl(name!!), classKind).also { jkClassImpl ->
|
||||
jkClassImpl.declarationList = children.mapNotNull {
|
||||
ElementVisitor().apply { it.accept(this) }.resultElement as? JKDeclaration
|
||||
}
|
||||
backAnnotation[it] = this
|
||||
(symbolProvider.provideDirectSymbol(psi) as? JKUniverseClassSymbol)?.run { target = it }
|
||||
backAnnotation[jkClassImpl] = this
|
||||
symbolProvider.provideUniverseSymbol(this, jkClassImpl)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -240,7 +237,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
|
||||
JKNameIdentifierImpl(name),
|
||||
with(expressionTreeMapper) { initializer.toJK() }
|
||||
).also {
|
||||
(symbolProvider.provideDirectSymbol(this) as? JKUniverseFieldSymbol)?.run { target = it }
|
||||
symbolProvider.provideUniverseSymbol(this, it)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -256,7 +253,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
|
||||
parameterList.parameters.map { it.toJK() },
|
||||
body?.toJK() ?: JKBodyStub
|
||||
).also {
|
||||
(symbolProvider.provideDirectSymbol(this) as? JKUniverseMethodSymbol)?.run { target = it }
|
||||
symbolProvider.provideUniverseSymbol(this, it)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -270,7 +267,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
|
||||
return JKParameterImpl(with(expressionTreeMapper) { typeElement?.toJK() } ?: TODO(),
|
||||
JKNameIdentifierImpl(name!!),
|
||||
with(modifierMapper) { modifierList.toJK() }).also {
|
||||
symbolProvider.provideParameterSymbol(this, it)
|
||||
symbolProvider.provideUniverseSymbol(this, it)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -286,7 +283,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
|
||||
with(expressionTreeMapper) { it.typeElement.toJK() },
|
||||
JKNameIdentifierImpl(it.name ?: TODO()),
|
||||
with(expressionTreeMapper) { it.initializer.toJK() }
|
||||
).also { i -> symbolProvider.provideLocalVarSymbol(it, i) }
|
||||
).also { i -> symbolProvider.provideUniverseSymbol(it, i) }
|
||||
} else TODO()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,9 +18,7 @@ package org.jetbrains.kotlin.j2k
|
||||
|
||||
import org.jetbrains.kotlin.j2k.ast.Nullability
|
||||
import org.jetbrains.kotlin.j2k.tree.*
|
||||
import org.jetbrains.kotlin.j2k.tree.impl.JKBodyStub
|
||||
import org.jetbrains.kotlin.j2k.tree.impl.JKClassSymbol
|
||||
import org.jetbrains.kotlin.j2k.tree.impl.modality
|
||||
import org.jetbrains.kotlin.j2k.tree.impl.*
|
||||
import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitorVoid
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.utils.Printer
|
||||
@@ -159,7 +157,13 @@ class NewCodeBuilder {
|
||||
|
||||
override fun visitQualifiedExpression(qualifiedExpression: JKQualifiedExpression) {
|
||||
qualifiedExpression.receiver.accept(this)
|
||||
printer.printWithNoIndent(qualifiedExpression.operator)
|
||||
printer.printWithNoIndent(
|
||||
when (qualifiedExpression.operator) {
|
||||
is JKJavaQualifierImpl.DOT /*<-remove this TODO!*/, is JKKtQualifierImpl.DOT -> "."
|
||||
is JKKtQualifierImpl.SAFE -> "?."
|
||||
else -> TODO()
|
||||
}
|
||||
)
|
||||
qualifiedExpression.selector.accept(this)
|
||||
}
|
||||
|
||||
@@ -172,7 +176,7 @@ class NewCodeBuilder {
|
||||
}
|
||||
|
||||
override fun visitMethodCallExpression(methodCallExpression: JKMethodCallExpression) {
|
||||
printer.printWithNoIndent(printer.printWithNoIndent(FqName(methodCallExpression.identifier.fqName).shortName().asString()))
|
||||
printer.printWithNoIndent(FqName(methodCallExpression.identifier.fqName).shortName().asString())
|
||||
printer.printWithNoIndent("(")
|
||||
methodCallExpression.arguments.accept(this)
|
||||
printer.printWithNoIndent(")")
|
||||
|
||||
@@ -94,3 +94,9 @@ class JKUnresolvedField(override val target: PsiReference) : JKFieldSymbol {
|
||||
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
|
||||
override val fqName: String = target.canonicalText
|
||||
}
|
||||
|
||||
class JKUnresolvedMethod(override val target: PsiReference) : JKMethodSymbol {
|
||||
override val declaredIn: JKSymbol
|
||||
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
|
||||
override val fqName: String = target.canonicalText
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user