New J2K: Symbol provider refactor.

This commit is contained in:
Dimach
2018-06-28 20:13:46 +03:00
committed by Ilya Kirillov
parent e1f47823d4
commit 0078a5a61b
4 changed files with 48 additions and 31 deletions
@@ -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
}