From 4aacb15872333b56baacd0fa74547aa7ad115d39 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Wed, 13 Feb 2019 16:06:35 +0300 Subject: [PATCH] New J2K: Add support of lambda expressions in LowerNullabilityInFunctionParametersConversion --- ...llabilityInFunctionParametersConversion.kt | 47 +++++++++++++++---- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/LowerNullabilityInFunctionParametersConversion.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/LowerNullabilityInFunctionParametersConversion.kt index 497c357a363..e687ee102e5 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/LowerNullabilityInFunctionParametersConversion.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/LowerNullabilityInFunctionParametersConversion.kt @@ -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()?.identifier == parameterSymbol + && element.operator is JKKtSpreadOperator + ) { + found = true + return element + } + } + is JKFieldAccessExpression -> { + if (element.identifier == parameterSymbol + && element.parent is JKBinaryExpression + && element.parent.cast().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) }