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 PsiClass -> JKMultiverseClassSymbol(psi)
is KtClassOrObject -> JKMultiverseKtClassSymbol(psi) is KtClassOrObject -> JKMultiverseKtClassSymbol(psi)
is PsiMethod -> JKMultiverseMethodSymbol(psi, this) is PsiMethod -> JKMultiverseMethodSymbol(psi, this)
is PsiField -> JKMultiverseFieldSymbol(psi) is PsiField -> JKMultiverseFieldSymbol(psi, this)
is KtNamedFunction -> JKMultiverseFunctionSymbol(psi, this) is KtNamedFunction -> JKMultiverseFunctionSymbol(psi, this)
is KtProperty -> JKMultiversePropertySymbol(psi) is KtProperty -> JKMultiversePropertySymbol(psi, this)
else -> TODO(psi::class.toString()) else -> TODO(psi::class.toString())
} }
} }
@@ -120,6 +120,7 @@ fun JKJavaOperatorToken.toKtToken(): JKKtOperatorToken =
JavaTokenType.PERC -> JKKtSingleValueOperatorToken(KtTokens.PERC) JavaTokenType.PERC -> JKKtSingleValueOperatorToken(KtTokens.PERC)
JavaTokenType.EQ -> JKKtSingleValueOperatorToken(KtTokens.EQ) JavaTokenType.EQ -> JKKtSingleValueOperatorToken(KtTokens.EQ)
JavaTokenType.NE -> JKKtSingleValueOperatorToken(KtTokens.EXCLEQ)
JavaTokenType.PLUSEQ -> JKKtSingleValueOperatorToken(KtTokens.PLUSEQ) JavaTokenType.PLUSEQ -> JKKtSingleValueOperatorToken(KtTokens.PLUSEQ)
JavaTokenType.MINUSEQ -> JKKtSingleValueOperatorToken(KtTokens.MINUSEQ) JavaTokenType.MINUSEQ -> JKKtSingleValueOperatorToken(KtTokens.MINUSEQ)
@@ -137,7 +138,7 @@ fun JKJavaOperatorToken.toKtToken(): JKKtOperatorToken =
JavaTokenType.GTGTGTEQ -> JKKtWordOperatorToken("ushr") JavaTokenType.GTGTGTEQ -> JKKtWordOperatorToken("ushr")
JavaTokenType.XOREQ -> JKKtWordOperatorToken("xor") 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 { interface JKMethodSymbol : JKNamedSymbol {
override val fqName: String override val fqName: String
val recivierType: JKType? val receiverType: JKType?
val parameterTypes: List<JKType> val parameterTypes: List<JKType>
val returnType: JKType val returnType: JKType
} }
interface JKFieldSymbol : JKNamedSymbol { interface JKFieldSymbol : JKNamedSymbol {
override val fqName: String override val fqName: String
val filedType: JKType
} }
class JKUniverseClassSymbol : JKClassSymbol, JKUniverseSymbol<JKClass> { 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> { class JKUniverseMethodSymbol(private val symbolProvider: JKSymbolProvider) : JKMethodSymbol, JKUniverseSymbol<JKMethod> {
override val recivierType: JKType? override val receiverType: JKType?
get() = (target.parent as? JKClass)?.let { get() = (target.parent as? JKClass)?.let {
JKClassTypeImpl(symbolProvider.provideUniverseSymbol(it), emptyList()/*TODO*/) 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 { class JKMultiverseMethodSymbol(override val target: PsiMethod, private val symbolProvider: JKSymbolProvider) : JKMethodSymbol {
override val recivierType: JKType? override val receiverType: JKType?
get() = target.containingClass?.let { get() = target.containingClass?.let {
JKClassTypeImpl(symbolProvider.provideDirectSymbol(it) as JKClassSymbol, emptyList()/*TODO*/) 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 { 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) get() = target.receiverTypeReference?.typeElement?.toJK(symbolProvider)
override val parameterTypes: List<JKType> override val parameterTypes: List<JKType>
get() = target.valueParameters.map { it.typeReference!!.typeElement!!.toJK(symbolProvider) } 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> { class JKUniverseFieldSymbol : JKFieldSymbol, JKUniverseSymbol<JKField> {
override val filedType: JKType
get() = target.type.type
override val name: String override val name: String
get() = target.name.value get() = target.name.value
override lateinit var target: JKField override lateinit var target: JKField
@@ -135,7 +138,9 @@ class JKUniverseFieldSymbol : JKFieldSymbol, JKUniverseSymbol<JKField> {
get() = target.name.value // TODO("Fix this") 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 override val name: String
get() = target.name get() = target.name
override val declaredIn: JKSymbol override val declaredIn: JKSymbol
@@ -144,7 +149,9 @@ class JKMultiverseFieldSymbol(override val target: PsiField) : JKFieldSymbol {
get() = target.name // TODO("Fix this") 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 override val name: String
get() = target.name!! get() = target.name!!
override val declaredIn: JKSymbol override val declaredIn: JKSymbol
@@ -159,6 +166,8 @@ class JKUnresolvedField(override val target: String) : JKFieldSymbol {
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
override val filedType: 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
} }
@@ -169,7 +178,7 @@ class JKUnresolvedMethod(override val target: String) : JKMethodSymbol {
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
override val recivierType: JKType? override val receiverType: 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 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.
@@ -20,6 +20,9 @@ fun JKExpression.type(context: ConversionContext): JKType =
when (this) { when (this) {
is JKLiteralExpression -> type.toJkType(context.symbolProvider) is JKLiteralExpression -> type.toJkType(context.symbolProvider)
is JKBinaryExpression -> (operator as JKKtOperatorImpl).methodSymbol.returnType 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()) else -> TODO(this::class.java.toString())
} }