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