From 0078a5a61b40db37e444e6982a6c91f2bf660e89 Mon Sep 17 00:00:00 2001 From: Dimach Date: Thu, 28 Jun 2018 20:13:46 +0300 Subject: [PATCH] New J2K: Symbol provider refactor. --- .../jetbrains/kotlin/j2k/JKSymbolProvider.kt | 38 ++++++++++++------- .../kotlin/j2k/JavaToJKTreeBuilder.kt | 21 +++++----- .../jetbrains/kotlin/j2k/NewCodeBuilder.kt | 14 ++++--- .../jetbrains/kotlin/j2k/tree/impl/symbols.kt | 6 +++ 4 files changed, 48 insertions(+), 31 deletions(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JKSymbolProvider.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JKSymbolProvider.kt index e71fb643b9b..8e13f3ffd44 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JKSymbolProvider.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JKSymbolProvider.kt @@ -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 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) { diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt index d918476c7de..4b190b9a2f9 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt @@ -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() } } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt index dad828d0f73..cea1a89cdfd 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt @@ -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(")") 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 c9c7364efb5..e20580dc203 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/symbols.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/symbols.kt @@ -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 +}