New J2K: Add support of lambda expressions in LowerNullabilityInFunctionParametersConversion

This commit is contained in:
Ilya Kirillov
2019-02-13 16:06:35 +03:00
committed by Ilya Kirillov
parent 197fda30e2
commit 4aacb15872
@@ -5,23 +5,31 @@
package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ConversionContext
import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.nj2k.ConversionContext
import org.jetbrains.kotlin.nj2k.isEquals
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKFieldSymbol
import org.jetbrains.kotlin.nj2k.tree.impl.JKKtSpreadOperator
import org.jetbrains.kotlin.nj2k.tree.impl.JKTypeElementImpl
import org.jetbrains.kotlin.utils.addToStdlib.cast
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class LowerNullabilityInFunctionParametersConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKMethod) return recurse(element)
val scopes =
listOfNotNull(
element.block,
(element as? JKKtConstructor)?.delegationCall
) + element.parameters.mapNotNull {
if (it.initializer !is JKStubExpression) it.initializer else null
if (element !is JKMethod && element !is JKLambdaExpression) return recurse(element)
val (parameters, scopes) =
when (element) {
is JKMethod -> element.parameters to
listOfNotNull(
element.block,
(element as? JKKtConstructor)?.delegationCall
) + element.parameters.mapNotNull { if (it.initializer !is JKStubExpression) it.initializer else null }
is JKLambdaExpression -> element.parameters to listOf(element.statement)
else -> return recurse(element)
}
for (parameter in element.parameters) {
for (parameter in parameters) {
if (parameter.type.type.nullability != Nullability.Default) continue
if (parameter.hasNotNullUsages(scopes)) {
parameter.type = JKTypeElementImpl(parameter.type.type.updateNullability(Nullability.NotNull))
@@ -48,6 +56,27 @@ class LowerNullabilityInFunctionParametersConversion(private val context: Conver
return element
}
}
is JKPrefixExpression -> {
if (element.expression.safeAs<JKFieldAccessExpression>()?.identifier == parameterSymbol
&& element.operator is JKKtSpreadOperator
) {
found = true
return element
}
}
is JKFieldAccessExpression -> {
if (element.identifier == parameterSymbol
&& element.parent is JKBinaryExpression
&& element.parent.cast<JKBinaryExpression>().let {
!it.operator.isEquals()
&& (it.left.type(context.symbolProvider)?.asPrimitiveType() != null
|| it.right.type(context.symbolProvider)?.asPrimitiveType() != null)
}
) {
found = true
return element
}
}
}
return recurse(element)
}