diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/ArgumentTypeResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/ArgumentTypeResolver.java index 22386651680..3cd8aef7e34 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/ArgumentTypeResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/ArgumentTypeResolver.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -315,7 +315,7 @@ public class ArgumentTypeResolver { * Visits function call arguments and determines data flow information changes */ public void analyzeArgumentsAndRecordTypes( - @NotNull CallResolutionContext context + @NotNull CallResolutionContext context, @NotNull ResolveArgumentsMode resolveArgumentsMode ) { MutableDataFlowInfoForArguments infoForArguments = context.dataFlowInfoForArguments; Call call = context.call; @@ -326,7 +326,7 @@ public class ArgumentTypeResolver { CallResolutionContext newContext = context.replaceDataFlowInfo(infoForArguments.getInfo(argument)); // Here we go inside arguments and determine additional data flow information for them - KotlinTypeInfo typeInfoForCall = getArgumentTypeInfo(expression, newContext, SHAPE_FUNCTION_ARGUMENTS); + KotlinTypeInfo typeInfoForCall = getArgumentTypeInfo(expression, newContext, resolveArgumentsMode); infoForArguments.updateInfo(argument, typeInfoForCall.getDataFlowInfo()); } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.kt index 226893b806f..fc3cf89ab2e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.psi.psiUtil.getParentOfType import org.jetbrains.kotlin.resolve.* import org.jetbrains.kotlin.resolve.bindingContextUtil.recordDataFlowInfo import org.jetbrains.kotlin.resolve.bindingContextUtil.recordScope +import org.jetbrains.kotlin.resolve.calls.callResolverUtil.ResolveArgumentsMode import org.jetbrains.kotlin.resolve.calls.callUtil.getCalleeExpressionIfAny import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext import org.jetbrains.kotlin.resolve.calls.context.CheckArgumentTypesMode @@ -64,6 +65,7 @@ import javax.inject.Inject class CallExpressionResolver( private val callResolver: CallResolver, private val constantExpressionEvaluator: ConstantExpressionEvaluator, + private val argumentTypeResolver: ArgumentTypeResolver, private val dataFlowAnalyzer: DataFlowAnalyzer, private val builtIns: KotlinBuiltIns, private val qualifiedExpressionResolver: QualifiedExpressionResolver, @@ -247,6 +249,13 @@ class CallExpressionResolver( temporaryForVariable.commit() context.trace.report(FUNCTION_EXPECTED.on(calleeExpression, calleeExpression, type ?: ErrorUtils.createErrorType(""))) + argumentTypeResolver.analyzeArgumentsAndRecordTypes( + BasicCallResolutionContext.create( + context, call, CheckArgumentTypesMode.CHECK_VALUE_ARGUMENTS, + DataFlowInfoForArgumentsImpl(initialDataFlowInfoForArguments, call) + ), + ResolveArgumentsMode.RESOLVE_FUNCTION_ARGUMENTS + ) return noTypeInfo(context) } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java index a516aea08ca..1472257d1b1 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java @@ -575,7 +575,7 @@ public class CallResolver { @NotNull TracingStrategy tracing ) { if (context.checkArguments == CheckArgumentTypesMode.CHECK_VALUE_ARGUMENTS) { - argumentTypeResolver.analyzeArgumentsAndRecordTypes(context); + argumentTypeResolver.analyzeArgumentsAndRecordTypes(context, ResolveArgumentsMode.SHAPE_FUNCTION_ARGUMENTS); } List typeArguments = context.call.getTypeArguments(); diff --git a/idea/testData/checker/regression/callVariableAsFunctionWithAnonymousObjectArg.kt b/idea/testData/checker/regression/callVariableAsFunctionWithAnonymousObjectArg.kt new file mode 100644 index 00000000000..b5fc01235ea --- /dev/null +++ b/idea/testData/checker/regression/callVariableAsFunctionWithAnonymousObjectArg.kt @@ -0,0 +1,4 @@ +fun f() { + val g = 3 + g(object : Any() {}) +} \ No newline at end of file diff --git a/idea/testData/checker/regression/callVariableAsFunctionWithLambdaArg.kt b/idea/testData/checker/regression/callVariableAsFunctionWithLambdaArg.kt new file mode 100644 index 00000000000..cdbf0861a3b --- /dev/null +++ b/idea/testData/checker/regression/callVariableAsFunctionWithLambdaArg.kt @@ -0,0 +1,5 @@ +fun f() { + val g = 3 + g { workingSet, customer -> + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java b/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java index cb71174648d..f347667b1ff 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java @@ -436,6 +436,18 @@ public class PsiCheckerTestGenerated extends AbstractPsiCheckerTest { doTest(fileName); } + @TestMetadata("callVariableAsFunctionWithAnonymousObjectArg.kt") + public void testCallVariableAsFunctionWithAnonymousObjectArg() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/regression/callVariableAsFunctionWithAnonymousObjectArg.kt"); + doTest(fileName); + } + + @TestMetadata("callVariableAsFunctionWithLambdaArg.kt") + public void testCallVariableAsFunctionWithLambdaArg() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/regression/callVariableAsFunctionWithLambdaArg.kt"); + doTest(fileName); + } + @TestMetadata("ClassDeclarationAfterDot.kt") public void testClassDeclarationAfterDot() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/regression/ClassDeclarationAfterDot.kt");