From a1e8d0a6bebf42a6c99ef78d1e6699f9bb73e3b6 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Wed, 13 Feb 2019 13:26:23 +0300 Subject: [PATCH] New J2K: Add Spread operator support --- .../org/jetbrains/kotlin/nj2k/tree/impl/k.kt | 11 ++++++++++ .../org/jetbrains/kotlin/nj2k/tree/types.kt | 22 +++++++++++-------- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/impl/k.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/impl/k.kt index 4fcf519c6ad..ba7e88f06f3 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/impl/k.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/impl/k.kt @@ -98,6 +98,17 @@ class JKKtSingleValueOperatorToken(val psiToken: KtSingleValueToken) : JKKtOpera override val text: String = psiToken.value } +object JKKtSpreadOperatorToken : JKKtOperatorToken { + override val text: String = "*" + override val operatorName: String = "*" +} + +object JKKtSpreadOperator : JKOperator { + override val token: JKOperatorToken = JKKtSpreadOperatorToken + override val precedence: Int + get() = TODO() +} + class JKKtWordOperatorToken(override val text: String) : JKKtOperatorToken { override val operatorName: String = text } diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/types.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/types.kt index 8465c6397c3..c2244d5f131 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/types.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/types.kt @@ -11,28 +11,32 @@ import org.jetbrains.kotlin.builtins.PrimitiveType import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.util.getJavaClassDescriptor -import org.jetbrains.kotlin.nj2k.ConversionContext -import org.jetbrains.kotlin.nj2k.JKSymbolProvider import org.jetbrains.kotlin.j2k.ast.Nullability -import org.jetbrains.kotlin.nj2k.conversions.resolveFqName -import org.jetbrains.kotlin.nj2k.kotlinTypeByName -import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.nj2k.ConversionContext +import org.jetbrains.kotlin.nj2k.JKSymbolProvider +import org.jetbrains.kotlin.nj2k.kotlinTypeByName +import org.jetbrains.kotlin.nj2k.tree.impl.* +import org.jetbrains.kotlin.psi.KtClass +import org.jetbrains.kotlin.psi.KtTypeReference import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.isNullable import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf +import org.jetbrains.kotlin.utils.addToStdlib.safeAs fun JKExpression.type(symbolProvider: JKSymbolProvider): JKType? = when (this) { is JKLiteralExpression -> type.toJkType(symbolProvider) is JKOperatorExpression -> { - (operator as? JKKtOperatorImpl)?.returnType - ?: error("Cannot get type of ${operator::class}, it should be first converted to KtOperator") - + val operator = operator + when (operator) { + is JKKtOperatorImpl -> operator.returnType + is JKKtSpreadOperator -> (this as JKPrefixExpression).expression.type(symbolProvider)//TODO ger real type + else -> error("Cannot get type of ${operator::class}, it should be first converted to KtOperator") + } } is JKMethodCallExpression -> identifier.returnType is JKFieldAccessExpressionImpl -> identifier.fieldType