added DataFlowInfoForArguments param to contexts

This commit is contained in:
Svetlana Isakova
2013-07-30 19:32:03 +04:00
parent 99bb6f13b5
commit e37af4de67
4 changed files with 53 additions and 15 deletions
@@ -17,13 +17,32 @@
package org.jetbrains.jet.lang.resolve.calls.context; package org.jetbrains.jet.lang.resolve.calls.context;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.Call; import org.jetbrains.jet.lang.psi.Call;
import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo; import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
import org.jetbrains.jet.lang.resolve.calls.model.MutableDataFlowInfoForArguments;
import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
public class BasicCallResolutionContext extends CallResolutionContext<BasicCallResolutionContext> { public class BasicCallResolutionContext extends CallResolutionContext<BasicCallResolutionContext> {
@NotNull
public static BasicCallResolutionContext create(
@NotNull BindingTrace trace,
@NotNull JetScope scope,
@NotNull Call call,
@NotNull JetType expectedType,
@NotNull DataFlowInfo dataFlowInfo,
@NotNull ResolveMode resolveMode,
@NotNull CheckValueArgumentsMode checkArguments,
@NotNull ExpressionPosition expressionPosition,
@NotNull ResolutionResultsCache resolutionResultsCache,
@Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments
) {
return new BasicCallResolutionContext(trace, scope, call, expectedType, dataFlowInfo, resolveMode, checkArguments,
expressionPosition, resolutionResultsCache, dataFlowInfoForArguments);
}
@NotNull @NotNull
public static BasicCallResolutionContext create( public static BasicCallResolutionContext create(
@NotNull BindingTrace trace, @NotNull BindingTrace trace,
@@ -36,22 +55,33 @@ public class BasicCallResolutionContext extends CallResolutionContext<BasicCallR
@NotNull ExpressionPosition expressionPosition, @NotNull ExpressionPosition expressionPosition,
@NotNull ResolutionResultsCache resolutionResultsCache @NotNull ResolutionResultsCache resolutionResultsCache
) { ) {
return new BasicCallResolutionContext(trace, scope, call, expectedType, dataFlowInfo, resolveMode, checkArguments, expressionPosition, resolutionResultsCache); return new BasicCallResolutionContext(trace, scope, call, expectedType, dataFlowInfo, resolveMode, checkArguments, expressionPosition, resolutionResultsCache, null);
} }
@NotNull
public static BasicCallResolutionContext create(
@NotNull ResolutionContext context, @NotNull Call call, @NotNull CheckValueArgumentsMode checkArguments,
@Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments
) {
return create(context.trace, context.scope, call, context.expectedType, context.dataFlowInfo, context.resolveMode,
checkArguments, context.expressionPosition, context.resolutionResultsCache, dataFlowInfoForArguments);
}
@NotNull @NotNull
public static BasicCallResolutionContext create( public static BasicCallResolutionContext create(
@NotNull ResolutionContext context, @NotNull Call call, @NotNull CheckValueArgumentsMode checkArguments @NotNull ResolutionContext context, @NotNull Call call, @NotNull CheckValueArgumentsMode checkArguments
) { ) {
return create(context.trace, context.scope, call, context.expectedType, context.dataFlowInfo, context.resolveMode, return create(context, call, checkArguments, null);
checkArguments, context.expressionPosition, context.resolutionResultsCache);
} }
private BasicCallResolutionContext( private BasicCallResolutionContext(
BindingTrace trace, JetScope scope, Call call, JetType expectedType, BindingTrace trace, JetScope scope, Call call, JetType expectedType,
DataFlowInfo dataFlowInfo, ResolveMode resolveMode, CheckValueArgumentsMode checkArguments, DataFlowInfo dataFlowInfo, ResolveMode resolveMode, CheckValueArgumentsMode checkArguments,
ExpressionPosition expressionPosition, ResolutionResultsCache resolutionResultsCache ExpressionPosition expressionPosition, ResolutionResultsCache resolutionResultsCache,
MutableDataFlowInfoForArguments dataFlowInfoForArguments
) { ) {
super(trace, scope, call, expectedType, dataFlowInfo, resolveMode, checkArguments, expressionPosition, resolutionResultsCache); super(trace, scope, call, expectedType, dataFlowInfo, resolveMode, checkArguments, expressionPosition, resolutionResultsCache,
dataFlowInfoForArguments);
} }
@Override @Override
@@ -45,7 +45,7 @@ public final class CallCandidateResolutionContext<D extends CallableDescriptor>
@NotNull ExpressionPosition expressionPosition, @NotNull ExpressionPosition expressionPosition,
@NotNull ResolutionResultsCache resolutionResultsCache @NotNull ResolutionResultsCache resolutionResultsCache
) { ) {
super(trace, scope, call, expectedType, dataFlowInfo, resolveMode, checkArguments, expressionPosition, resolutionResultsCache); super(trace, scope, call, expectedType, dataFlowInfo, resolveMode, checkArguments, expressionPosition, resolutionResultsCache, null);
this.candidateCall = candidateCall; this.candidateCall = candidateCall;
this.tracing = tracing; this.tracing = tracing;
} }
@@ -17,6 +17,7 @@
package org.jetbrains.jet.lang.resolve.calls.context; package org.jetbrains.jet.lang.resolve.calls.context;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.Call; import org.jetbrains.jet.lang.psi.Call;
import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo; import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
@@ -39,16 +40,20 @@ public abstract class CallResolutionContext<Context extends CallResolutionContex
@NotNull ResolveMode resolveMode, @NotNull ResolveMode resolveMode,
@NotNull CheckValueArgumentsMode checkArguments, @NotNull CheckValueArgumentsMode checkArguments,
@NotNull ExpressionPosition expressionPosition, @NotNull ExpressionPosition expressionPosition,
@NotNull ResolutionResultsCache resolutionResultsCache @NotNull ResolutionResultsCache resolutionResultsCache,
@Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments
) { ) {
super(trace, scope, expectedType, dataFlowInfo, expressionPosition, resolveMode, resolutionResultsCache); super(trace, scope, expectedType, dataFlowInfo, expressionPosition, resolveMode, resolutionResultsCache);
this.call = call; this.call = call;
this.checkArguments = checkArguments; this.checkArguments = checkArguments;
if (checkArguments == CheckValueArgumentsMode.ENABLED) { if (dataFlowInfoForArguments != null) {
dataFlowInfoForArguments = new DataFlowInfoForArgumentsImpl(call); this.dataFlowInfoForArguments = dataFlowInfoForArguments;
}
else if (checkArguments == CheckValueArgumentsMode.ENABLED) {
this.dataFlowInfoForArguments = new DataFlowInfoForArgumentsImpl(call);
} }
else { else {
dataFlowInfoForArguments = MutableDataFlowInfoForArguments.WITHOUT_ARGUMENTS_CHECK; this.dataFlowInfoForArguments = MutableDataFlowInfoForArguments.WITHOUT_ARGUMENTS_CHECK;
} }
} }
@@ -25,6 +25,7 @@ import org.jetbrains.jet.lang.psi.JetReferenceExpression;
import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo; import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
import org.jetbrains.jet.lang.resolve.calls.context.*; import org.jetbrains.jet.lang.resolve.calls.context.*;
import org.jetbrains.jet.lang.resolve.calls.model.MutableDataFlowInfoForArguments;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallWithTrace; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallWithTrace;
import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
@@ -46,9 +47,11 @@ public class ResolutionTask<D extends CallableDescriptor, F extends D> extends C
@NotNull Collection<ResolutionCandidate<D>> candidates, @NotNull JetReferenceExpression reference, @NotNull Collection<ResolutionCandidate<D>> candidates, @NotNull JetReferenceExpression reference,
@NotNull TracingStrategy tracing, BindingTrace trace, JetScope scope, Call call, JetType expectedType, @NotNull TracingStrategy tracing, BindingTrace trace, JetScope scope, Call call, JetType expectedType,
DataFlowInfo dataFlowInfo, ResolveMode resolveMode, CheckValueArgumentsMode checkArguments, DataFlowInfo dataFlowInfo, ResolveMode resolveMode, CheckValueArgumentsMode checkArguments,
ExpressionPosition expressionPosition, ResolutionResultsCache resolutionResultsCache ExpressionPosition expressionPosition, ResolutionResultsCache resolutionResultsCache,
@Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments
) { ) {
super(trace, scope, call, expectedType, dataFlowInfo, resolveMode, checkArguments, expressionPosition, resolutionResultsCache); super(trace, scope, call, expectedType, dataFlowInfo, resolveMode, checkArguments, expressionPosition, resolutionResultsCache,
dataFlowInfoForArguments);
this.candidates = candidates; this.candidates = candidates;
this.reference = reference; this.reference = reference;
this.tracing = tracing; this.tracing = tracing;
@@ -63,7 +66,7 @@ public class ResolutionTask<D extends CallableDescriptor, F extends D> extends C
this(candidates, reference, tracing != null ? tracing : TracingStrategyImpl.create(reference, context.call), this(candidates, reference, tracing != null ? tracing : TracingStrategyImpl.create(reference, context.call),
context.trace, context.scope, context.call, context.trace, context.scope, context.call,
context.expectedType, context.dataFlowInfo, context.resolveMode, context.checkArguments, context.expectedType, context.dataFlowInfo, context.resolveMode, context.checkArguments,
context.expressionPosition, context.resolutionResultsCache); context.expressionPosition, context.resolutionResultsCache, context.dataFlowInfoForArguments);
} }
public ResolutionTask( public ResolutionTask(
@@ -107,7 +110,7 @@ public class ResolutionTask<D extends CallableDescriptor, F extends D> extends C
) { ) {
ResolutionTask<D, F> newTask = new ResolutionTask<D, F>( ResolutionTask<D, F> newTask = new ResolutionTask<D, F>(
candidates, reference, tracing, trace, scope, call, expectedType, dataFlowInfo, resolveMode, checkArguments, candidates, reference, tracing, trace, scope, call, expectedType, dataFlowInfo, resolveMode, checkArguments,
expressionPosition, resolutionResultsCache); expressionPosition, resolutionResultsCache, dataFlowInfoForArguments);
newTask.setCheckingStrategy(checkingStrategy); newTask.setCheckingStrategy(checkingStrategy);
return newTask; return newTask;
} }
@@ -120,7 +123,7 @@ public class ResolutionTask<D extends CallableDescriptor, F extends D> extends C
public ResolutionTask<D, F> replaceCall(@NotNull Call newCall) { public ResolutionTask<D, F> replaceCall(@NotNull Call newCall) {
return new ResolutionTask<D, F>( return new ResolutionTask<D, F>(
candidates, reference, tracing, trace, scope, newCall, expectedType, dataFlowInfo, resolveMode, checkArguments, candidates, reference, tracing, trace, scope, newCall, expectedType, dataFlowInfo, resolveMode, checkArguments,
expressionPosition, resolutionResultsCache); expressionPosition, resolutionResultsCache, dataFlowInfoForArguments);
} }
public interface DescriptorCheckStrategy { public interface DescriptorCheckStrategy {