From e05c310cdbd5b434a127c6263665017b86918606 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Fri, 8 Jun 2012 15:27:49 +0400 Subject: [PATCH] KT-2195 error "Only safe calls are allowed ..." but it is function param (val) #KT-2195 --- .../jet/lang/resolve/calls/CallResolver.java | 19 ++++++++++++------- .../lang/resolve/calls/ResolutionTask.java | 6 +++++- .../lang/resolve/calls/TracingStrategy.java | 4 ++++ .../calls/autocasts/AutoCastUtils.java | 2 +- .../tests/nullabilityAndAutoCasts/kt2195.jet | 8 ++++++++ 5 files changed, 30 insertions(+), 9 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/kt2195.jet 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 77ccc55c447..26294ca844a 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 @@ -411,11 +411,21 @@ public class CallResolver { for (ResolutionCandidate resolutionCandidate : task.getCandidates()) { TemporaryBindingTrace candidateTrace = TemporaryBindingTrace.create(task.trace); Collection> contexts = callTransformer.createCallContexts(resolutionCandidate, task, candidateTrace); - Collection> calls = Lists.newArrayList(); for (CallResolutionContext context : contexts) { performResolutionForCandidateCall(context, task); - calls.addAll(callTransformer.transformCall(context, this, task)); + + /* important for 'variable as function case': temporary bind reference to descriptor (will be rewritten) + to have a binding to variable while 'invoke' call resolve */ + task.tracing.bindReference(context.candidateCall.getTrace(), context.candidateCall); + + Collection> calls = callTransformer.transformCall(context, this, task); + + for (ResolvedCallWithTrace call : calls) { + task.tracing.bindReference(call.getTrace(), call); + task.tracing.bindResolvedCall(call.getTrace(), call); + task.getResolvedCalls().add(call); + } context.candidateCall.getTrace().addAllMyDataTo(traceForResolutionCache, new Predicate() { @Override @@ -425,11 +435,6 @@ public class CallResolver { } }, false); } - for (ResolvedCallWithTrace call : calls) { - - task.tracing.bindResolvedCall(call.getTrace(), call); - task.getResolvedCalls().add(call); - } } Set> successfulCandidates = Sets.newLinkedHashSet(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ResolutionTask.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ResolutionTask.java index c688159c120..7b3f755b7fa 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ResolutionTask.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ResolutionTask.java @@ -98,12 +98,16 @@ public class ResolutionTask extends R public final TracingStrategy tracing = new TracingStrategy() { @Override - public void bindResolvedCall(@NotNull BindingTrace trace, @NotNull ResolvedCallWithTrace resolvedCall) { + public void bindReference(@NotNull BindingTrace trace, @NotNull ResolvedCallWithTrace resolvedCall) { CallableDescriptor descriptor = resolvedCall.getResultingDescriptor(); if (resolvedCall instanceof VariableAsFunctionResolvedCall) { descriptor = ((VariableAsFunctionResolvedCall) resolvedCall).getVariableCall().getResultingDescriptor(); } trace.record(REFERENCE_TARGET, reference, descriptor); + } + + @Override + public void bindResolvedCall(@NotNull BindingTrace trace, @NotNull ResolvedCallWithTrace resolvedCall) { trace.record(RESOLVED_CALL, call.getCalleeExpression(), resolvedCall); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/TracingStrategy.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/TracingStrategy.java index 47ba86d1376..59922c30ade 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/TracingStrategy.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/TracingStrategy.java @@ -35,6 +35,9 @@ import java.util.List; /*package*/ interface TracingStrategy { TracingStrategy EMPTY = new TracingStrategy() { + @Override + public void bindReference(@NotNull BindingTrace trace, @NotNull ResolvedCallWithTrace resolvedCall) {} + @Override public void bindResolvedCall(@NotNull BindingTrace trace, @NotNull ResolvedCallWithTrace resolvedCall) {} @@ -83,6 +86,7 @@ import java.util.List; @Override public void invisibleMember(@NotNull BindingTrace trace, @NotNull DeclarationDescriptor descriptor) {} }; + void bindReference(@NotNull BindingTrace trace, @NotNull ResolvedCallWithTrace resolvedCall); void bindResolvedCall(@NotNull BindingTrace trace, @NotNull ResolvedCallWithTrace resolvedCall); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/autocasts/AutoCastUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/autocasts/AutoCastUtils.java index 35cd3d77613..f0d6d6e839a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/autocasts/AutoCastUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/autocasts/AutoCastUtils.java @@ -80,7 +80,7 @@ public class AutoCastUtils { // else if (expression instanceof JetThisExpression) { // return castThis(dataFlowInfo, receiver); // } - DataFlowValue dataFlowValue = DataFlowValueFactory.INSTANCE.createDataFlowValue(receiver.getExpression(),receiver.getType(), + DataFlowValue dataFlowValue = DataFlowValueFactory.INSTANCE.createDataFlowValue(receiver.getExpression(), receiver.getType(), bindingContext); List result = Lists.newArrayList(); for (JetType possibleType : dataFlowInfo.getPossibleTypes(dataFlowValue)) { diff --git a/compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/kt2195.jet b/compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/kt2195.jet new file mode 100644 index 00000000000..1455b4bb676 --- /dev/null +++ b/compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/kt2195.jet @@ -0,0 +1,8 @@ +//KT-2195 error "Only safe calls are allowed ..." but it is function param (val) +package foo + +private fun sendCommand(errorCallback: (()->Unit)? = null) { + if (errorCallback != null) { + errorCallback() + } +} \ No newline at end of file