[NI] Resolve function literals in block as lambda expression

This commit is contained in:
Mikhail Zarechenskiy
2017-08-17 16:18:43 +03:00
committed by Stanislav Erokhin
parent 08964006de
commit c45f86a2fc
6 changed files with 48 additions and 2 deletions
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
import org.jetbrains.kotlin.psi.psiUtil.referenceExpression
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.ModifierCheckerCore
@@ -483,8 +484,7 @@ class PSICallResolver(
): PSIKotlinCallArgument {
val builtIns = outerCallContext.scope.ownerDescriptor.builtIns
val parseErrorArgument = ParseErrorKotlinCallArgument(valueArgument, startDataFlowInfo, builtIns)
val ktExpression = KtPsiUtil.deparenthesize(valueArgument.getArgumentExpression()) ?:
return parseErrorArgument
val ktExpression = extractArgumentExpression(outerCallContext, valueArgument) ?: parseErrorArgument
val argumentName = valueArgument.getArgumentName()?.asName
@@ -499,6 +499,7 @@ class PSICallResolver(
if (ktExpression.hasBlockBody()) builtIns.unitType else null
FunctionExpressionImpl(outerCallContext, valueArgument, startDataFlowInfo, argumentName, ktExpression, receiverType, parametersTypes, returnType)
}
else -> null
}
if (lambdaArgument != null) {
@@ -563,6 +564,19 @@ class PSICallResolver(
return createSimplePSICallArgument(context, valueArgument, typeInfo) ?: parseErrorArgument
}
private fun extractArgumentExpression(outerCallContext: BasicCallResolutionContext, valueArgument: ValueArgument): KtExpression? {
val argumentExpression = valueArgument.getArgumentExpression() ?: return null
val ktExpression = ArgumentTypeResolver.getFunctionLiteralArgumentIfAny(argumentExpression, outerCallContext) ?:
ArgumentTypeResolver.getCallableReferenceExpressionIfAny(argumentExpression, outerCallContext) ?:
KtPsiUtil.deparenthesize(argumentExpression)
return when (ktExpression) {
is KtFunctionLiteral -> ktExpression.getParentOfType<KtLambdaExpression>(true)
else -> ktExpression
}
}
private fun checkNoSpread(context: BasicCallResolutionContext, valueArgument: ValueArgument) {
valueArgument.getSpreadElement()?.let {
context.trace.report(Errors.SPREAD_OF_LAMBDA_OR_CALLABLE_REFERENCE.on(it))
@@ -0,0 +1,8 @@
fun box(): String {
val p: (String) -> Boolean = if (true) {
{ true }
} else {
{ true }
}
return "OK"
}
@@ -16598,6 +16598,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
doTest(fileName);
}
@TestMetadata("functionLiteralAsLastExpressionInBlock.kt")
public void testFunctionLiteralAsLastExpressionInBlock() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/regressions/functionLiteralAsLastExpressionInBlock.kt");
doTest(fileName);
}
@TestMetadata("generic.kt")
public void testGeneric() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/regressions/generic.kt");
@@ -16598,6 +16598,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
doTest(fileName);
}
@TestMetadata("functionLiteralAsLastExpressionInBlock.kt")
public void testFunctionLiteralAsLastExpressionInBlock() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/regressions/functionLiteralAsLastExpressionInBlock.kt");
doTest(fileName);
}
@TestMetadata("generic.kt")
public void testGeneric() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/regressions/generic.kt");
@@ -16598,6 +16598,12 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
doTest(fileName);
}
@TestMetadata("functionLiteralAsLastExpressionInBlock.kt")
public void testFunctionLiteralAsLastExpressionInBlock() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/regressions/functionLiteralAsLastExpressionInBlock.kt");
doTest(fileName);
}
@TestMetadata("generic.kt")
public void testGeneric() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/regressions/generic.kt");
@@ -20246,6 +20246,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
doTest(fileName);
}
@TestMetadata("functionLiteralAsLastExpressionInBlock.kt")
public void testFunctionLiteralAsLastExpressionInBlock() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/regressions/functionLiteralAsLastExpressionInBlock.kt");
doTest(fileName);
}
@TestMetadata("generic.kt")
public void testGeneric() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/regressions/generic.kt");