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 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
}