New J2K: Add type for unresolved symbols
This commit is contained in:
committed by
Ilya Kirillov
parent
41640e1a15
commit
6051b455bf
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user