New J2K: Resolve symbols in correctly

This commit is contained in:
Ilya Kirillov
2019-04-04 14:01:15 +03:00
parent d806320383
commit a5d64bf0b1
2 changed files with 33 additions and 33 deletions
@@ -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<PsiExpression>() ?: 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)
}
@@ -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<JKExpression>.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<JKMethodSymbol>("kotlin.ranges.$operatorName").returnType!!
)
)
fun blockStatement(vararg statements: JKStatement) =
JKBlockStatementImpl(JKBlockImpl(statements.toList()))