New J2K: Add type for unresolved symbols

This commit is contained in:
Ilya Kirillov
2018-12-01 16:00:27 +03:00
committed by Ilya Kirillov
parent 41640e1a15
commit 6051b455bf
3 changed files with 23 additions and 21 deletions
@@ -46,7 +46,7 @@ class JKSymbolProvider {
internal inline fun <reified T : JKSymbol> provideSymbol(reference: PsiReference): T { internal inline fun <reified T : JKSymbol> provideSymbol(reference: PsiReference): T {
val target = reference.resolve() val target = reference.resolve()
if (target != null) return provideDirectSymbol(target) as T if (target != null) return provideDirectSymbol(target) as T
return (if (isAssignable<T, JKUnresolvedField>()) JKUnresolvedField(reference) else JKUnresolvedMethod(reference)) as T return (if (isAssignable<T, JKUnresolvedField>()) JKUnresolvedField(reference, this) else JKUnresolvedMethod(reference)) as T
} }
fun provideUniverseSymbol(psi: PsiElement, jk: JKDeclaration): JKSymbol = provideUniverseSymbol(psi).also { fun provideUniverseSymbol(psi: PsiElement, jk: JKDeclaration): JKSymbol = provideUniverseSymbol(psi).also {
@@ -88,7 +88,7 @@ class JKSymbolProvider {
internal inline fun <reified T : JKSymbol> provideByFqName(classId: ClassId, context: PsiElement = symbolsByPsi.keys.first()): T { internal inline fun <reified T : JKSymbol> provideByFqName(classId: ClassId, context: PsiElement = symbolsByPsi.keys.first()): T {
return resolveFqName(classId, context)?.let(::provideDirectSymbol).safeAs<T>() ?: when { return resolveFqName(classId, context)?.let(::provideDirectSymbol).safeAs<T>() ?: when {
isAssignable<T, JKUnresolvedMethod>() -> JKUnresolvedMethod(classId.asSingleFqName().asString().replace('/', '.')) isAssignable<T, JKUnresolvedMethod>() -> JKUnresolvedMethod(classId.asSingleFqName().asString().replace('/', '.'))
isAssignable<T, JKUnresolvedField>() -> JKUnresolvedField(classId.asSingleFqName().asString().replace('/', '.')) // isAssignable<T, JKUnresolvedField>() -> JKUnresolvedField(classId.asSingleFqName().asString().replace('/', '.'))
else -> JKUnresolvedClassSymbol(classId.asSingleFqName().asString().replace('/', '.')) else -> JKUnresolvedClassSymbol(classId.asSingleFqName().asString().replace('/', '.'))
} as T } as T
} }
@@ -9,13 +9,18 @@ import com.intellij.psi.PsiClass
import com.intellij.psi.PsiField import com.intellij.psi.PsiField
import com.intellij.psi.PsiMethod import com.intellij.psi.PsiMethod
import com.intellij.psi.PsiReference 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.JKSymbolProvider
import org.jetbrains.kotlin.j2k.conversions.parentOfType import org.jetbrains.kotlin.j2k.conversions.parentOfType
import org.jetbrains.kotlin.j2k.conversions.resolveFqName
import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.psi.psiUtil.getValueParameterList import org.jetbrains.kotlin.psi.psiUtil.getValueParameterList
import org.jetbrains.kotlin.types.KotlinType
interface JKSymbol { interface JKSymbol {
val target: Any val target: Any
@@ -161,19 +166,27 @@ class JKMultiversePropertySymbol(override val target: KtProperty, private val sy
get() = target.name!! // TODO("Fix this") get() = target.name!! // TODO("Fix this")
} }
class JKUnresolvedField(override val target: String) : JKFieldSymbol { class JKUnresolvedField(override val target: PsiReference, private val symbolProvider: JKSymbolProvider) : JKFieldSymbol {
constructor(target: PsiReference) : this(target.canonicalText) 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 override val declaredIn: JKSymbol
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 override val fqName: String = target.canonicalText
override val filedType: JKType override val name: String = target.canonicalText
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
override val name: String
get() = target
} }
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) constructor(target: PsiReference) : this(target.canonicalText)
override val declaredIn: JKSymbol 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. get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
override val parameterTypes: List<JKType> override val parameterTypes: List<JKType>
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 returnType: JKType
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
override val name: String override val name: String
get() = target get() = target
} }
@@ -42,15 +42,6 @@ interface JKKtAssignmentStatement : JKStatement {
interface JKKtCall : JKMethodCallExpression 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 JKKtMethodCallExpression : JKMethodCallExpression
interface JKKtAlsoCallExpression : JKKtMethodCallExpression { interface JKKtAlsoCallExpression : JKKtMethodCallExpression {