diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java index c1467461ff4..6f907597877 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java @@ -340,14 +340,14 @@ public class CallResolver { @NotNull OverloadResolutionResultsImpl results, @NotNull TracingStrategy tracing ) { + if (context.call.getCallType() == Call.CallType.INVOKE) return; if (!results.isSingleResult()) { if (results.getResultCode() == INCOMPLETE_TYPE_INFERENCE) { argumentTypeResolver.checkTypesWithNoCallee(context, RESOLVE_FUNCTION_ARGUMENTS); } return; } - //call for 'invoke' was completed earlier - if (results.getResultingCall() instanceof VariableAsFunctionResolvedCall) return; + CallCandidateResolutionContext candidateContext = CallCandidateResolutionContext.createForCallBeingAnalyzed( results.getResultingCall().getCallToCompleteTypeArgumentInference(), context, tracing); candidateResolver.completeTypeInferenceDependentOnFunctionLiteralsForCall(candidateContext); @@ -358,6 +358,8 @@ public class CallResolver { @NotNull OverloadResolutionResultsImpl results, @NotNull TracingStrategy tracing ) { + if (context.call.getCallType() == Call.CallType.INVOKE) return results; + if (results.isSingleResult()) { Set unmappedArguments = results.getResultingCall().getCallToCompleteTypeArgumentInference().getUnmappedArguments(); argumentTypeResolver.checkUnmappedArgumentTypes(context, unmappedArguments); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallTransformer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallTransformer.java index 2c9f868da02..ca6369a307a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallTransformer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallTransformer.java @@ -30,6 +30,7 @@ import org.jetbrains.jet.lang.resolve.DelegatingBindingTrace; import org.jetbrains.jet.lang.resolve.TemporaryBindingTrace; import org.jetbrains.jet.lang.resolve.calls.context.BasicCallResolutionContext; import org.jetbrains.jet.lang.resolve.calls.context.CallCandidateResolutionContext; +import org.jetbrains.jet.lang.resolve.calls.context.ContextDependency; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallImpl; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallWithTrace; import org.jetbrains.jet.lang.resolve.calls.model.VariableAsFunctionResolvedCall; @@ -195,7 +196,8 @@ public class CallTransformer { DelegatingBindingTrace variableCallTrace = context.candidateCall.getTrace(); BasicCallResolutionContext basicCallResolutionContext = BasicCallResolutionContext.create( - context.replaceBindingTrace(variableCallTrace), functionCall, context.checkArguments, context.dataFlowInfoForArguments); + context.replaceBindingTrace(variableCallTrace).replaceContextDependency(ContextDependency.DEPENDENT), + functionCall, context.checkArguments, context.dataFlowInfoForArguments); // 'invoke' call resolve OverloadResolutionResults results = callResolver.resolveCallWithGivenName(basicCallResolutionContext, task.reference, Name.identifier("invoke")); diff --git a/compiler/testData/codegen/box/closures/closureInsideClosure/propertyAndFunctionNameClash.kt b/compiler/testData/codegen/box/closures/closureInsideClosure/propertyAndFunctionNameClash.kt new file mode 100644 index 00000000000..0133c48cc07 --- /dev/null +++ b/compiler/testData/codegen/box/closures/closureInsideClosure/propertyAndFunctionNameClash.kt @@ -0,0 +1,37 @@ +package d + +import java.util.ArrayList + +fun box(): String { + ListTag().test(listOf("a", "b")) + return "OK" +} + +fun ListTag.test(list: List) { + for (item in list) { + item() { + a { + text = item + } + } + } +} + +open class HtmlTag +open class ListTag : HtmlTag() {} +class LI : ListTag() {} + +public fun ListTag.item(body: LI.() -> Unit): Unit {} +fun HtmlTag.a(contents: A.() -> Unit) {} + +trait A : HtmlTag { + public var text: String +} + +fun listOf(vararg strings: String): List { + val list = ArrayList() + for (s in strings) { + list.add(s) + } + return list +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java index 4a3dc35b1ec..70c310c0579 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -1343,6 +1343,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest("compiler/testData/codegen/box/closures/closureInsideClosure/localFunInsideLocalFunDifferentSignatures.kt"); } + @TestMetadata("propertyAndFunctionNameClash.kt") + public void testPropertyAndFunctionNameClash() throws Exception { + doTest("compiler/testData/codegen/box/closures/closureInsideClosure/propertyAndFunctionNameClash.kt"); + } + @TestMetadata("threeLevels.kt") public void testThreeLevels() throws Exception { doTest("compiler/testData/codegen/box/closures/closureInsideClosure/threeLevels.kt");