New J2K: Add !! postfix expression support

This commit is contained in:
Ilya Kirillov
2018-12-24 15:37:32 +03:00
committed by Ilya Kirillov
parent a529dcce4c
commit 60d498cedc
@@ -32,10 +32,12 @@ private fun JKType.classSymbol(symbolProvider: JKSymbolProvider) =
val psiClass = resolveFqName( val psiClass = resolveFqName(
ClassId.fromString(jvmPrimitiveType.primitiveType.typeFqName.asString()), ClassId.fromString(jvmPrimitiveType.primitiveType.typeFqName.asString()),
symbolProvider.symbolsByPsi.keys.first() symbolProvider.symbolsByPsi.keys.first()
)!! )
symbolProvider.provideDirectSymbol(psiClass) as JKClassSymbol psiClass?.let { klass ->
symbolProvider.provideDirectSymbol(klass) as? JKClassSymbol
}
} }
else -> TODO(this::class.java.toString()) else -> null
} }
private fun JKKtOperatorToken.binaryExpressionMethodSymbol( private fun JKKtOperatorToken.binaryExpressionMethodSymbol(
@@ -59,7 +61,6 @@ private fun JKKtOperatorToken.binaryExpressionMethodSymbol(
if (leftType.isStringType()) symbolProvider.provideByFqName(KotlinBuiltIns.FQ_NAMES.string.toSafe()) if (leftType.isStringType()) symbolProvider.provideByFqName(KotlinBuiltIns.FQ_NAMES.string.toSafe())
else leftType.classSymbol(symbolProvider) else leftType.classSymbol(symbolProvider)
val defaultClassSymbol by lazy { val defaultClassSymbol by lazy {
when (text) { when (text) {
"<", ">", "<=", ">=", "==", "!=", "&&", "||" -> "<", ">", "<=", ">=", "==", "!=", "&&", "||" ->
@@ -82,7 +83,7 @@ private fun JKKtOperatorToken.binaryExpressionMethodSymbol(
.filterIsInstance<KtNamedFunction>() .filterIsInstance<KtNamedFunction>()
.filter { it.name == operatorName } .filter { it.name == operatorName }
.mapNotNull { symbolProvider.provideDirectSymbol(it) as? JKMethodSymbol } .mapNotNull { symbolProvider.provideDirectSymbol(it) as? JKMethodSymbol }
.firstOrNull { it.parameterTypes.singleOrNull()?.takeIf { rightType.isSubtypeOf(it, symbolProvider) } != null } .firstOrNull { it.parameterTypes?.singleOrNull()?.takeIf { rightType.isSubtypeOf(it, symbolProvider) } != null }
?: defaultClassSymbol ?: defaultClassSymbol
is JKUniverseClassSymbol -> classSymbol.target.psi<PsiClass>()?.methodSymbol() ?: defaultClassSymbol is JKUniverseClassSymbol -> classSymbol.target.psi<PsiClass>()?.methodSymbol() ?: defaultClassSymbol
is JKMultiverseClassSymbol -> classSymbol.target.methodSymbol() ?: defaultClassSymbol is JKMultiverseClassSymbol -> classSymbol.target.methodSymbol() ?: defaultClassSymbol
@@ -94,6 +95,9 @@ private fun JKKtOperatorToken.unaryExpressionMethodSymbol(
operandType: JKType, operandType: JKType,
symbolProvider: JKSymbolProvider symbolProvider: JKSymbolProvider
): JKMethodSymbol { ): JKMethodSymbol {
if (this == KtTokens.EXCLEQ) {
return JKExclExclMethod(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
@@ -102,6 +106,7 @@ private fun JKKtOperatorToken.unaryExpressionMethodSymbol(
.filter { it.name == operatorName } .filter { it.name == operatorName }
.mapNotNull { symbolProvider.provideDirectSymbol(it) as? JKMethodSymbol } .mapNotNull { symbolProvider.provideDirectSymbol(it) as? JKMethodSymbol }
.firstOrNull()!! .firstOrNull()!!
null -> TODO(" No class symbol")
else -> TODO(classSymbol::class.toString()) else -> TODO(classSymbol::class.toString())
} }
} }
@@ -268,6 +273,12 @@ fun JKFieldAccessExpression.asAssignmentFromTarget(): JKKtAssignmentStatement? =
fun JKFieldAccessExpression.isInDecrementOrIncrement(): Boolean = fun JKFieldAccessExpression.isInDecrementOrIncrement(): Boolean =
(parent as? JKUnaryExpression)?.operator?.token?.text in listOf("++", "--") (parent as? JKUnaryExpression)?.operator?.token?.text in listOf("++", "--")
fun JKExpression.bangedBangedExpr(context: ConversionContext): JKExpression =
JKPostfixExpressionImpl(
this,
JKKtOperatorImpl(KtTokens.EXCLEXCL, JKExclExclMethod(type(context)!!))
)
fun JKVariable.hasWritableUsages(scope: JKTreeElement, context: ConversionContext): Boolean = fun JKVariable.hasWritableUsages(scope: JKTreeElement, context: ConversionContext): Boolean =
findUsages(scope, context).any { findUsages(scope, context).any {
it.asAssignmentFromTarget() != null it.asAssignmentFromTarget() != null