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