diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/ForConversion.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/ForConversion.kt index d8d1f4cee9a..dff74a08c25 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/ForConversion.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/ForConversion.kt @@ -10,7 +10,6 @@ import com.intellij.util.IncorrectOperationException import org.jetbrains.kotlin.j2k.ReferenceSearcher import org.jetbrains.kotlin.j2k.hasWriteAccesses import org.jetbrains.kotlin.lexer.KtTokens -import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.nj2k.* import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.impl.* @@ -172,15 +171,13 @@ class ForConversion(private val context: ConversionContext) : RecursiveApplicabl reversed -> downToExpression( start, convertBound(bound, if (inclusiveComparison) 0 else +1), - context, - psiContext + context ) bound !is JKKtLiteralExpression && !inclusiveComparison -> untilToExpression( start, convertBound(bound, 0), - context, - psiContext + context ) else -> kotlinBinaryExpression( start, @@ -234,15 +231,17 @@ class ForConversion(private val context: ConversionContext) : RecursiveApplicabl ?: indicesByArrayLength(collectionSizeExpression) ?: return null - val psiContext = collectionSizeExpression.psi() ?: return null return if (reversed) { - val reversedSymbol = context.symbolProvider.provideDirectSymbol( - multiResolveFqName(ClassId.fromString("kotlin/collections/reversed"), psiContext).first() - ) as JKMethodSymbol JKQualifiedExpressionImpl( indices, JKKtQualifierImpl.DOT, - JKJavaMethodCallExpressionImpl(reversedSymbol, JKArgumentListImpl()) + JKJavaMethodCallExpressionImpl( + context.symbolProvider.provideByFqName( + "kotlin/collections/reversed", + multiResolve = true + ), + JKArgumentListImpl() + ) ) } else indices } @@ -266,10 +265,12 @@ class ForConversion(private val context: ConversionContext) : RecursiveApplicabl private fun toIndicesCall(javaSizeCall: JKQualifiedExpression): JKQualifiedExpression? { val psiContext = javaSizeCall.psi ?: return null - val indiciesSymbol = context.symbolProvider.provideDirectSymbol( - multiResolveFqName(ClassId.fromString("kotlin/collections/indices"), psiContext).first() - ) as JKMultiversePropertySymbol - val selector = JKFieldAccessExpressionImpl(indiciesSymbol) + val selector = JKFieldAccessExpressionImpl( + context.symbolProvider.provideByFqName( + "kotlin/collections/indices", + multiResolve = true + ) + ) return JKQualifiedExpressionImpl(javaSizeCall::receiver.detached(), javaSizeCall.operator, selector) } diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/expressions.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/expressions.kt index 80c144e46f4..5cfa3633ab0 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/expressions.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/expressions.kt @@ -6,15 +6,12 @@ package org.jetbrains.kotlin.nj2k import com.intellij.psi.PsiClass -import com.intellij.psi.PsiElement import com.intellij.psi.tree.TokenSet import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.lexer.KtSingleValueToken import org.jetbrains.kotlin.lexer.KtTokens -import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.nj2k.conversions.RecursiveApplicableConversionBase -import org.jetbrains.kotlin.nj2k.conversions.multiResolveFqName import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.psi.KtNamedFunction @@ -91,6 +88,9 @@ private fun JKKtOperatorToken.unaryExpressionMethodType( if (this == KtTokens.MINUS || this == KtTokens.PLUS) { return operandType!! } + if (this == KtTokens.EXCL) { + return operandType!! + } val classSymbol = operandType!!.classSymbol(symbolProvider) return when (classSymbol) { is JKMultiverseKtClassSymbol ->// todo look for extensions @@ -220,29 +220,25 @@ fun kotlinPostfixExpression( fun untilToExpression( from: JKExpression, to: JKExpression, - conversionContext: ConversionContext, - psiContext: PsiElement + conversionContext: ConversionContext ): JKExpression = rangeExpression( from, to, "until", - conversionContext, - psiContext + conversionContext ) fun downToExpression( from: JKExpression, to: JKExpression, - conversionContext: ConversionContext, - psiContext: PsiElement + conversionContext: ConversionContext ): JKExpression = rangeExpression( from, to, "downTo", - conversionContext, - psiContext + conversionContext ) fun List.toExpressionList() = @@ -258,14 +254,17 @@ fun rangeExpression( from: JKExpression, to: JKExpression, operatorName: String, - conversionContext: ConversionContext, - psiContext: PsiElement -): JKExpression { - val returnType = (conversionContext.symbolProvider.provideDirectSymbol( - multiResolveFqName(ClassId.fromString("kotlin/ranges/$operatorName"), psiContext).first() - ) as JKMethodSymbol).returnType - return JKBinaryExpressionImpl(from, to, JKKtOperatorImpl(JKKtWordOperatorToken(operatorName), returnType!!)) -} + conversionContext: ConversionContext +): JKExpression = + JKBinaryExpressionImpl( + from, + to, + JKKtOperatorImpl( + JKKtWordOperatorToken(operatorName), + conversionContext.symbolProvider.provideByFqName("kotlin.ranges.$operatorName").returnType!! + ) + ) + fun blockStatement(vararg statements: JKStatement) = JKBlockStatementImpl(JKBlockImpl(statements.toList()))