New J2K: Add type calculating for more kinds of JKExpressions

This commit is contained in:
Ilya Kirillov
2018-10-30 15:54:46 +03:00
committed by Ilya Kirillov
parent 71b3fe33a3
commit dbdd39c6ab
4 changed files with 23 additions and 10 deletions
@@ -35,9 +35,9 @@ class JKSymbolProvider {
is PsiClass -> JKMultiverseClassSymbol(psi)
is KtClassOrObject -> JKMultiverseKtClassSymbol(psi)
is PsiMethod -> JKMultiverseMethodSymbol(psi, this)
is PsiField -> JKMultiverseFieldSymbol(psi)
is PsiField -> JKMultiverseFieldSymbol(psi, this)
is KtNamedFunction -> JKMultiverseFunctionSymbol(psi, this)
is KtProperty -> JKMultiversePropertySymbol(psi)
is KtProperty -> JKMultiversePropertySymbol(psi, this)
else -> TODO(psi::class.toString())
}
}
@@ -120,6 +120,7 @@ fun JKJavaOperatorToken.toKtToken(): JKKtOperatorToken =
JavaTokenType.PERC -> JKKtSingleValueOperatorToken(KtTokens.PERC)
JavaTokenType.EQ -> JKKtSingleValueOperatorToken(KtTokens.EQ)
JavaTokenType.NE -> JKKtSingleValueOperatorToken(KtTokens.EXCLEQ)
JavaTokenType.PLUSEQ -> JKKtSingleValueOperatorToken(KtTokens.PLUSEQ)
JavaTokenType.MINUSEQ -> JKKtSingleValueOperatorToken(KtTokens.MINUSEQ)
@@ -137,7 +138,7 @@ fun JKJavaOperatorToken.toKtToken(): JKKtOperatorToken =
JavaTokenType.GTGTGTEQ -> JKKtWordOperatorToken("ushr")
JavaTokenType.XOREQ -> JKKtWordOperatorToken("xor")
else -> TODO(this.token::class.java.toString())
else -> TODO(this.token.toString())
}
@@ -35,13 +35,14 @@ interface JKClassSymbol : JKNamedSymbol
interface JKMethodSymbol : JKNamedSymbol {
override val fqName: String
val recivierType: JKType?
val receiverType: JKType?
val parameterTypes: List<JKType>
val returnType: JKType
}
interface JKFieldSymbol : JKNamedSymbol {
override val fqName: String
val filedType: JKType
}
class JKUniverseClassSymbol : JKClassSymbol, JKUniverseSymbol<JKClass> {
@@ -76,7 +77,7 @@ class JKMultiverseKtClassSymbol(override val target: KtClassOrObject) : JKClassS
}
class JKUniverseMethodSymbol(private val symbolProvider: JKSymbolProvider) : JKMethodSymbol, JKUniverseSymbol<JKMethod> {
override val recivierType: JKType?
override val receiverType: JKType?
get() = (target.parent as? JKClass)?.let {
JKClassTypeImpl(symbolProvider.provideUniverseSymbol(it), emptyList()/*TODO*/)
}
@@ -94,7 +95,7 @@ class JKUniverseMethodSymbol(private val symbolProvider: JKSymbolProvider) : JKM
}
class JKMultiverseMethodSymbol(override val target: PsiMethod, private val symbolProvider: JKSymbolProvider) : JKMethodSymbol {
override val recivierType: JKType?
override val receiverType: JKType?
get() = target.containingClass?.let {
JKClassTypeImpl(symbolProvider.provideDirectSymbol(it) as JKClassSymbol, emptyList()/*TODO*/)
}
@@ -111,7 +112,7 @@ class JKMultiverseMethodSymbol(override val target: PsiMethod, private val symbo
}
class JKMultiverseFunctionSymbol(override val target: KtNamedFunction, private val symbolProvider: JKSymbolProvider) : JKMethodSymbol {
override val recivierType: JKType?
override val receiverType: JKType?
get() = target.receiverTypeReference?.typeElement?.toJK(symbolProvider)
override val parameterTypes: List<JKType>
get() = target.valueParameters.map { it.typeReference!!.typeElement!!.toJK(symbolProvider) }
@@ -126,6 +127,8 @@ class JKMultiverseFunctionSymbol(override val target: KtNamedFunction, private v
}
class JKUniverseFieldSymbol : JKFieldSymbol, JKUniverseSymbol<JKField> {
override val filedType: JKType
get() = target.type.type
override val name: String
get() = target.name.value
override lateinit var target: JKField
@@ -135,7 +138,9 @@ class JKUniverseFieldSymbol : JKFieldSymbol, JKUniverseSymbol<JKField> {
get() = target.name.value // TODO("Fix this")
}
class JKMultiverseFieldSymbol(override val target: PsiField) : JKFieldSymbol {
class JKMultiverseFieldSymbol(override val target: PsiField, private val symbolProvider: JKSymbolProvider) : JKFieldSymbol {
override val filedType: JKType
get() = target.type.toJK(symbolProvider)
override val name: String
get() = target.name
override val declaredIn: JKSymbol
@@ -144,7 +149,9 @@ class JKMultiverseFieldSymbol(override val target: PsiField) : JKFieldSymbol {
get() = target.name // TODO("Fix this")
}
class JKMultiversePropertySymbol(override val target: KtProperty) : JKFieldSymbol {
class JKMultiversePropertySymbol(override val target: KtProperty, private val symbolProvider: JKSymbolProvider) : JKFieldSymbol {
override val filedType: JKType
get() = target.typeReference!!.typeElement!!.toJK(symbolProvider)
override val name: String
get() = target.name!!
override val declaredIn: JKSymbol
@@ -159,6 +166,8 @@ class JKUnresolvedField(override val target: String) : JKFieldSymbol {
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
}
@@ -169,7 +178,7 @@ class JKUnresolvedMethod(override val target: String) : 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
override val recivierType: JKType?
override val receiverType: JKType?
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
override val parameterTypes: List<JKType>
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
@@ -20,6 +20,9 @@ fun JKExpression.type(context: ConversionContext): JKType =
when (this) {
is JKLiteralExpression -> type.toJkType(context.symbolProvider)
is JKBinaryExpression -> (operator as JKKtOperatorImpl).methodSymbol.returnType
is JKMethodCallExpression -> identifier.returnType
is JKFieldAccessExpressionImpl -> identifier.filedType
is JKQualifiedExpressionImpl -> this.selector.type(context)
else -> TODO(this::class.java.toString())
}