From 6051b455bfb032f35df8e274eac475b134d823a8 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Sat, 1 Dec 2018 16:00:27 +0300 Subject: [PATCH] New J2K: Add type for unresolved symbols --- .../jetbrains/kotlin/j2k/JKSymbolProvider.kt | 4 +-- .../jetbrains/kotlin/j2k/tree/impl/symbols.kt | 31 +++++++++++++------ j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt | 9 ------ 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JKSymbolProvider.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JKSymbolProvider.kt index caa9f5ea3d3..b9a753a89a2 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JKSymbolProvider.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JKSymbolProvider.kt @@ -46,7 +46,7 @@ class JKSymbolProvider { internal inline fun provideSymbol(reference: PsiReference): T { val target = reference.resolve() if (target != null) return provideDirectSymbol(target) as T - return (if (isAssignable()) JKUnresolvedField(reference) else JKUnresolvedMethod(reference)) as T + return (if (isAssignable()) JKUnresolvedField(reference, this) else JKUnresolvedMethod(reference)) as T } fun provideUniverseSymbol(psi: PsiElement, jk: JKDeclaration): JKSymbol = provideUniverseSymbol(psi).also { @@ -88,7 +88,7 @@ class JKSymbolProvider { internal inline fun provideByFqName(classId: ClassId, context: PsiElement = symbolsByPsi.keys.first()): T { return resolveFqName(classId, context)?.let(::provideDirectSymbol).safeAs() ?: when { isAssignable() -> JKUnresolvedMethod(classId.asSingleFqName().asString().replace('/', '.')) - isAssignable() -> JKUnresolvedField(classId.asSingleFqName().asString().replace('/', '.')) +// isAssignable() -> JKUnresolvedField(classId.asSingleFqName().asString().replace('/', '.')) else -> JKUnresolvedClassSymbol(classId.asSingleFqName().asString().replace('/', '.')) } as T } 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 06febee8c9a..79524cde8ab 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/symbols.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/symbols.kt @@ -9,13 +9,18 @@ import com.intellij.psi.PsiClass import com.intellij.psi.PsiField import com.intellij.psi.PsiMethod import com.intellij.psi.PsiReference +import com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl +import com.intellij.util.reverse import org.jetbrains.kotlin.j2k.JKSymbolProvider import org.jetbrains.kotlin.j2k.conversions.parentOfType +import org.jetbrains.kotlin.j2k.conversions.resolveFqName import org.jetbrains.kotlin.j2k.tree.* +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.psiUtil.getValueParameterList +import org.jetbrains.kotlin.types.KotlinType interface JKSymbol { val target: Any @@ -161,19 +166,27 @@ class JKMultiversePropertySymbol(override val target: KtProperty, private val sy get() = target.name!! // TODO("Fix this") } -class JKUnresolvedField(override val target: String) : JKFieldSymbol { - constructor(target: PsiReference) : this(target.canonicalText) +class JKUnresolvedField(override val target: PsiReference, private val symbolProvider: JKSymbolProvider) : JKFieldSymbol { + override val filedType: JKType + get() { + val resolvedType = (target as? PsiReferenceExpressionImpl)?.type + if (resolvedType != null) return resolvedType.toJK(symbolProvider) + val nothingSymbol = (symbolProvider.provideDirectSymbol( + resolveFqName(ClassId.fromString("kotlin.Nothing"), symbolProvider.symbolsByPsi.keys.first())!! + ) as JKClassSymbol) + return JKClassTypeImpl(nothingSymbol, emptyList()) + } override val declaredIn: JKSymbol get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. - override val fqName: String = target - override val filedType: JKType - get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. - override val name: String - get() = target + override val fqName: String = target.canonicalText + override val name: String = target.canonicalText } -class JKUnresolvedMethod(override val target: String) : JKMethodSymbol { +class JKUnresolvedMethod( + override val target: String, + override val returnType: JKType = JKNoTypeImpl +) : JKMethodSymbol { constructor(target: PsiReference) : this(target.canonicalText) override val declaredIn: JKSymbol @@ -183,8 +196,6 @@ class JKUnresolvedMethod(override val target: String) : JKMethodSymbol { get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. override val parameterTypes: List get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. - override val returnType: JKType - get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. override val name: String get() = target } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt index b440ecd2b49..7bc74f0ee73 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt @@ -42,15 +42,6 @@ interface JKKtAssignmentStatement : JKStatement { interface JKKtCall : JKMethodCallExpression -interface JKKtModifier : JKModifier { - val type: KtModifierType - - enum class KtModifierType { - ACTUAL, ABSTRACT, ANNOTATION, COMPANION, CONST, CROSSINLINE, DATA, ENUM, EXPECT, EXTERNAL, FINAL, INFIX, INLINE, INNER, - INTERNAL, LATEINIT, NOINLINE, OPEN, OPERATOR, OUT, OVERRIDE, REIFIED, SEALED, SUSPEND, TAILREC, VARARG, PRIVATE, PROTECTED - } -} - interface JKKtMethodCallExpression : JKMethodCallExpression interface JKKtAlsoCallExpression : JKKtMethodCallExpression {