New J2K: Add !! postfix expression support
This commit is contained in:
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
|
||||||
|
|||||||
Reference in New Issue
Block a user