New J2K: Add support of lambda expressions in LowerNullabilityInFunctionParametersConversion
This commit is contained in:
committed by
Ilya Kirillov
parent
197fda30e2
commit
4aacb15872
+38
-9
@@ -5,23 +5,31 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.nj2k.conversions
|
package org.jetbrains.kotlin.nj2k.conversions
|
||||||
|
|
||||||
import org.jetbrains.kotlin.nj2k.ConversionContext
|
|
||||||
import org.jetbrains.kotlin.j2k.ast.Nullability
|
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.*
|
||||||
import org.jetbrains.kotlin.nj2k.tree.impl.JKFieldSymbol
|
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.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() {
|
class LowerNullabilityInFunctionParametersConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
|
||||||
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
||||||
if (element !is JKMethod) return recurse(element)
|
if (element !is JKMethod && element !is JKLambdaExpression) return recurse(element)
|
||||||
val scopes =
|
val (parameters, scopes) =
|
||||||
listOfNotNull(
|
when (element) {
|
||||||
element.block,
|
is JKMethod -> element.parameters to
|
||||||
(element as? JKKtConstructor)?.delegationCall
|
listOfNotNull(
|
||||||
) + element.parameters.mapNotNull {
|
element.block,
|
||||||
if (it.initializer !is JKStubExpression) it.initializer else null
|
(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.type.type.nullability != Nullability.Default) continue
|
||||||
if (parameter.hasNotNullUsages(scopes)) {
|
if (parameter.hasNotNullUsages(scopes)) {
|
||||||
parameter.type = JKTypeElementImpl(parameter.type.type.updateNullability(Nullability.NotNull))
|
parameter.type = JKTypeElementImpl(parameter.type.type.updateNullability(Nullability.NotNull))
|
||||||
@@ -48,6 +56,27 @@ class LowerNullabilityInFunctionParametersConversion(private val context: Conver
|
|||||||
return element
|
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)
|
return recurse(element)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user