New extension parameter added to resolution context

This commit is contained in:
Mikhael Bogdanov
2013-10-23 14:46:25 +04:00
parent 06ab7708ae
commit 592c26e840
10 changed files with 73 additions and 36 deletions
@@ -209,7 +209,7 @@ public class BodyResolver {
if (type != null && supertype != null) {
SimpleResolutionContext simpleResolutionContext = new SimpleResolutionContext(
trace, scope, supertype, context.getOuterDataFlowInfo(), ExpressionPosition.FREE, ContextDependency.INDEPENDENT,
ResolutionResultsCacheImpl.create(), LabelResolver.create());
ResolutionResultsCacheImpl.create(), LabelResolver.create(), expressionTypingServices.getDefaultExtension());
DataFlowUtils.checkType(type, delegateExpression, simpleResolutionContext);
}
}
@@ -141,7 +141,7 @@ public class CallResolver {
) {
return resolveFunctionCall(BasicCallResolutionContext.create(
trace, scope, call, expectedType, dataFlowInfo, ContextDependency.INDEPENDENT, CheckValueArgumentsMode.ENABLED,
ExpressionPosition.FREE, ResolutionResultsCacheImpl.create(), LabelResolver.create(), null));
ExpressionPosition.FREE, ResolutionResultsCacheImpl.create(), LabelResolver.create(), null, expressionTypingServices.getDefaultExtension()));
}
@NotNull
@@ -20,6 +20,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.Call;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtension;
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;
@@ -39,11 +40,12 @@ public class BasicCallResolutionContext extends CallResolutionContext<BasicCallR
@NotNull ExpressionPosition expressionPosition,
@NotNull ResolutionResultsCache resolutionResultsCache,
@NotNull LabelResolver labelResolver,
@Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments
@Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments,
@NotNull CallResolverExtension callResolverExtension
) {
return new BasicCallResolutionContext(
trace, scope, call, expectedType, dataFlowInfo, contextDependency, checkArguments, expressionPosition,
resolutionResultsCache, labelResolver, dataFlowInfoForArguments);
resolutionResultsCache, labelResolver, dataFlowInfoForArguments, callResolverExtension);
}
@NotNull
@@ -53,7 +55,7 @@ public class BasicCallResolutionContext extends CallResolutionContext<BasicCallR
) {
return create(
context.trace, context.scope, call, context.expectedType, context.dataFlowInfo, context.contextDependency, checkArguments,
context.expressionPosition, context.resolutionResultsCache, context.labelResolver, dataFlowInfoForArguments);
context.expressionPosition, context.resolutionResultsCache, context.labelResolver, dataFlowInfoForArguments, context.callResolverExtension);
}
@NotNull
@@ -67,10 +69,11 @@ public class BasicCallResolutionContext extends CallResolutionContext<BasicCallR
BindingTrace trace, JetScope scope, Call call, JetType expectedType,
DataFlowInfo dataFlowInfo, ContextDependency contextDependency, CheckValueArgumentsMode checkArguments,
ExpressionPosition expressionPosition, ResolutionResultsCache resolutionResultsCache,
LabelResolver labelResolver, MutableDataFlowInfoForArguments dataFlowInfoForArguments
LabelResolver labelResolver, MutableDataFlowInfoForArguments dataFlowInfoForArguments,
CallResolverExtension callResolverExtension
) {
super(trace, scope, call, expectedType, dataFlowInfo, contextDependency, checkArguments, expressionPosition, resolutionResultsCache,
labelResolver, dataFlowInfoForArguments);
labelResolver, dataFlowInfoForArguments, callResolverExtension);
}
@Override
@@ -85,7 +88,7 @@ public class BasicCallResolutionContext extends CallResolutionContext<BasicCallR
@NotNull LabelResolver labelResolver
) {
return create(trace, scope, call, expectedType, dataFlowInfo, contextDependency, checkArguments, expressionPosition,
resolutionResultsCache, labelResolver, dataFlowInfoForArguments);
resolutionResultsCache, labelResolver, dataFlowInfoForArguments, callResolverExtension);
}
@Override
@@ -21,6 +21,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
import org.jetbrains.jet.lang.psi.Call;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtension;
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
import org.jetbrains.jet.lang.resolve.calls.model.MutableDataFlowInfoForArguments;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallImpl;
@@ -48,10 +49,11 @@ public final class CallCandidateResolutionContext<D extends CallableDescriptor>
@NotNull ExpressionPosition expressionPosition,
@NotNull ResolutionResultsCache resolutionResultsCache,
@NotNull LabelResolver labelResolver,
@Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments
@Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments,
@NotNull CallResolverExtension callResolverExtension
) {
super(trace, scope, call, expectedType, dataFlowInfo, contextDependency, checkArguments, expressionPosition, resolutionResultsCache,
labelResolver, dataFlowInfoForArguments);
labelResolver, dataFlowInfoForArguments, callResolverExtension);
this.candidateCall = candidateCall;
this.tracing = tracing;
}
@@ -63,7 +65,7 @@ public final class CallCandidateResolutionContext<D extends CallableDescriptor>
return new CallCandidateResolutionContext<D>(
candidateCall, tracing, trace, context.scope, call, context.expectedType,
context.dataFlowInfo, context.contextDependency, context.checkArguments,
context.expressionPosition, context.resolutionResultsCache, context.labelResolver, context.dataFlowInfoForArguments);
context.expressionPosition, context.resolutionResultsCache, context.labelResolver, context.dataFlowInfoForArguments, context.callResolverExtension);
}
public static <D extends CallableDescriptor> CallCandidateResolutionContext<D> create(
@@ -78,7 +80,7 @@ public final class CallCandidateResolutionContext<D extends CallableDescriptor>
return new CallCandidateResolutionContext<D>(
candidateCall, tracing, context.trace, context.scope, context.call, context.expectedType,
context.dataFlowInfo, context.contextDependency, context.checkArguments, context.expressionPosition,
context.resolutionResultsCache, context.labelResolver, context.dataFlowInfoForArguments);
context.resolutionResultsCache, context.labelResolver, context.dataFlowInfoForArguments, context.callResolverExtension);
}
@Override
@@ -94,7 +96,7 @@ public final class CallCandidateResolutionContext<D extends CallableDescriptor>
) {
return new CallCandidateResolutionContext<D>(
candidateCall, tracing, trace, scope, call, expectedType, dataFlowInfo, contextDependency,
checkArguments, expressionPosition, resolutionResultsCache, labelResolver, dataFlowInfoForArguments);
checkArguments, expressionPosition, resolutionResultsCache, labelResolver, dataFlowInfoForArguments, callResolverExtension);
}
@Override
@@ -20,6 +20,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.Call;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtension;
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
import org.jetbrains.jet.lang.resolve.calls.model.DataFlowInfoForArgumentsImpl;
import org.jetbrains.jet.lang.resolve.calls.model.MutableDataFlowInfoForArguments;
@@ -45,9 +46,11 @@ public abstract class CallResolutionContext<Context extends CallResolutionContex
@NotNull ResolutionResultsCache resolutionResultsCache,
@NotNull LabelResolver labelResolver,
@SuppressWarnings("NullableProblems")
@Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments
@Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments,
@NotNull CallResolverExtension callResolverExtension
) {
super(trace, scope, expectedType, dataFlowInfo, expressionPosition, contextDependency, resolutionResultsCache, labelResolver);
super(trace, scope, expectedType, dataFlowInfo, expressionPosition, contextDependency, resolutionResultsCache, labelResolver,
callResolverExtension);
this.call = call;
this.checkArguments = checkArguments;
if (dataFlowInfoForArguments != null) {
@@ -19,6 +19,7 @@ package org.jetbrains.jet.lang.resolve.calls.context;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtension;
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.JetType;
@@ -34,6 +35,7 @@ public abstract class ResolutionContext<Context extends ResolutionContext<Contex
public final ContextDependency contextDependency;
public final ResolutionResultsCache resolutionResultsCache;
public final LabelResolver labelResolver;
public final CallResolverExtension callResolverExtension;
protected ResolutionContext(
@NotNull BindingTrace trace,
@@ -43,7 +45,8 @@ public abstract class ResolutionContext<Context extends ResolutionContext<Contex
@NotNull ExpressionPosition expressionPosition,
@NotNull ContextDependency contextDependency,
@NotNull ResolutionResultsCache resolutionResultsCache,
@NotNull LabelResolver labelResolver
@NotNull LabelResolver labelResolver,
@NotNull CallResolverExtension callResolverExtension
) {
this.trace = trace;
this.scope = scope;
@@ -53,6 +56,7 @@ public abstract class ResolutionContext<Context extends ResolutionContext<Contex
this.contextDependency = contextDependency;
this.resolutionResultsCache = resolutionResultsCache;
this.labelResolver = labelResolver;
this.callResolverExtension = callResolverExtension;
}
protected abstract Context create(
@@ -2,6 +2,7 @@ package org.jetbrains.jet.lang.resolve.calls.context;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtension;
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.JetType;
@@ -16,9 +17,11 @@ public class SimpleResolutionContext extends ResolutionContext<SimpleResolutionC
@NotNull ExpressionPosition expressionPosition,
@NotNull ContextDependency contextDependency,
@NotNull ResolutionResultsCache resolutionResultsCache,
@NotNull LabelResolver labelResolver
@NotNull LabelResolver labelResolver,
@NotNull CallResolverExtension callResolverExtension
) {
super(trace, scope, expectedType, dataFlowInfo, expressionPosition, contextDependency, resolutionResultsCache, labelResolver);
super(trace, scope, expectedType, dataFlowInfo, expressionPosition, contextDependency, resolutionResultsCache, labelResolver,
callResolverExtension);
}
@Override
@@ -33,7 +36,8 @@ public class SimpleResolutionContext extends ResolutionContext<SimpleResolutionC
@NotNull LabelResolver labelResolver
) {
return new SimpleResolutionContext(
trace, scope, expectedType, dataFlowInfo, expressionPosition, contextDependency, resolutionResultsCache, labelResolver);
trace, scope, expectedType, dataFlowInfo, expressionPosition, contextDependency, resolutionResultsCache, labelResolver,
callResolverExtension);
}
@Override
@@ -23,6 +23,7 @@ import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
import org.jetbrains.jet.lang.psi.Call;
import org.jetbrains.jet.lang.psi.JetReferenceExpression;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtension;
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
import org.jetbrains.jet.lang.resolve.calls.context.*;
import org.jetbrains.jet.lang.resolve.calls.model.MutableDataFlowInfoForArguments;
@@ -49,10 +50,11 @@ public class ResolutionTask<D extends CallableDescriptor, F extends D> extends C
@NotNull TracingStrategy tracing, BindingTrace trace, JetScope scope, Call call, JetType expectedType,
DataFlowInfo dataFlowInfo, ContextDependency contextDependency, CheckValueArgumentsMode checkArguments,
ExpressionPosition expressionPosition, ResolutionResultsCache resolutionResultsCache,
@NotNull LabelResolver labelResolver, @Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments
@NotNull LabelResolver labelResolver, @Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments,
@NotNull CallResolverExtension callResolverExtension
) {
super(trace, scope, call, expectedType, dataFlowInfo, contextDependency, checkArguments, expressionPosition, resolutionResultsCache,
labelResolver, dataFlowInfoForArguments);
labelResolver, dataFlowInfoForArguments, callResolverExtension);
this.candidates = candidates;
this.reference = reference;
this.tracing = tracing;
@@ -67,7 +69,7 @@ public class ResolutionTask<D extends CallableDescriptor, F extends D> extends C
this(candidates, reference, tracing != null ? tracing : TracingStrategyImpl.create(reference, context.call),
context.trace, context.scope, context.call,
context.expectedType, context.dataFlowInfo, context.contextDependency, context.checkArguments,
context.expressionPosition, context.resolutionResultsCache, context.labelResolver, context.dataFlowInfoForArguments);
context.expressionPosition, context.resolutionResultsCache, context.labelResolver, context.dataFlowInfoForArguments, context.callResolverExtension);
}
public ResolutionTask(
@@ -112,7 +114,7 @@ public class ResolutionTask<D extends CallableDescriptor, F extends D> extends C
) {
ResolutionTask<D, F> newTask = new ResolutionTask<D, F>(
candidates, reference, tracing, trace, scope, call, expectedType, dataFlowInfo, contextDependency, checkArguments,
expressionPosition, resolutionResultsCache, labelResolver, dataFlowInfoForArguments);
expressionPosition, resolutionResultsCache, labelResolver, dataFlowInfoForArguments, callResolverExtension);
newTask.setCheckingStrategy(checkingStrategy);
return newTask;
}
@@ -125,7 +127,7 @@ public class ResolutionTask<D extends CallableDescriptor, F extends D> extends C
public ResolutionTask<D, F> replaceCall(@NotNull Call newCall) {
return new ResolutionTask<D, F>(
candidates, reference, tracing, trace, scope, newCall, expectedType, dataFlowInfo, contextDependency, checkArguments,
expressionPosition, resolutionResultsCache, labelResolver, dataFlowInfoForArguments);
expressionPosition, resolutionResultsCache, labelResolver, dataFlowInfoForArguments, callResolverExtension);
}
public interface DescriptorCheckStrategy {
@@ -21,6 +21,7 @@ import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.psi.Call;
import org.jetbrains.jet.lang.psi.JetReferenceExpression;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtension;
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
import org.jetbrains.jet.lang.resolve.calls.context.*;
import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResults;
@@ -41,8 +42,8 @@ public class ExpressionTypingContext extends ResolutionContext<ExpressionTypingC
@NotNull ExpressionPosition expressionPosition
) {
return newContext(expressionTypingServices, trace, scope, dataFlowInfo, expectedType, expressionPosition,
ContextDependency.INDEPENDENT, ResolutionResultsCacheImpl.create(), LabelResolver.create()
);
ContextDependency.INDEPENDENT, ResolutionResultsCacheImpl.create(), LabelResolver.create(),
expressionTypingServices.getDefaultExtension());
}
@NotNull
@@ -52,8 +53,8 @@ public class ExpressionTypingContext extends ResolutionContext<ExpressionTypingC
) {
return newContext(expressionTypingServices, resolutionContext.trace, resolutionContext.scope, resolutionContext.dataFlowInfo,
resolutionContext.expectedType, resolutionContext.expressionPosition, resolutionContext.contextDependency,
resolutionContext.resolutionResultsCache, resolutionContext.labelResolver
);
resolutionContext.resolutionResultsCache, resolutionContext.labelResolver,
resolutionContext.callResolverExtension);
}
@NotNull
@@ -66,10 +67,12 @@ public class ExpressionTypingContext extends ResolutionContext<ExpressionTypingC
@NotNull ExpressionPosition expressionPosition,
@NotNull ContextDependency contextDependency,
@NotNull ResolutionResultsCache resolutionResultsCache,
@NotNull LabelResolver labelResolver
@NotNull LabelResolver labelResolver,
@NotNull CallResolverExtension callResolverExtension
) {
return new ExpressionTypingContext(
expressionTypingServices, labelResolver, trace, scope, dataFlowInfo, expectedType, expressionPosition, contextDependency, resolutionResultsCache);
expressionTypingServices, labelResolver, trace, scope, dataFlowInfo, expectedType, expressionPosition, contextDependency, resolutionResultsCache,
callResolverExtension);
}
public final ExpressionTypingServices expressionTypingServices;
@@ -85,9 +88,11 @@ public class ExpressionTypingContext extends ResolutionContext<ExpressionTypingC
@NotNull JetType expectedType,
@NotNull ExpressionPosition expressionPosition,
@NotNull ContextDependency contextDependency,
@NotNull ResolutionResultsCache resolutionResultsCache
@NotNull ResolutionResultsCache resolutionResultsCache,
@NotNull CallResolverExtension callResolverExtension
) {
super(trace, scope, expectedType, dataFlowInfo, expressionPosition, contextDependency, resolutionResultsCache, labelResolver);
super(trace, scope, expectedType, dataFlowInfo, expressionPosition, contextDependency, resolutionResultsCache, labelResolver,
callResolverExtension);
this.expressionTypingServices = expressionTypingServices;
}
@@ -103,7 +108,7 @@ public class ExpressionTypingContext extends ResolutionContext<ExpressionTypingC
@NotNull LabelResolver labelResolver
) {
return new ExpressionTypingContext(expressionTypingServices, this.labelResolver, trace, scope, dataFlowInfo, expectedType,
expressionPosition, contextDependency, resolutionResultsCache);
expressionPosition, contextDependency, resolutionResultsCache, callResolverExtension);
}
@Override
@@ -30,6 +30,7 @@ import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.*;
import org.jetbrains.jet.lang.resolve.calls.CallExpressionResolver;
import org.jetbrains.jet.lang.resolve.calls.CallResolver;
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtension;
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
import org.jetbrains.jet.lang.resolve.calls.context.ContextDependency;
import org.jetbrains.jet.lang.resolve.calls.context.ExpressionPosition;
@@ -70,6 +71,8 @@ public class ExpressionTypingServices {
private AnnotationResolver annotationResolver;
@NotNull
private PlatformToKotlinClassMap platformToKotlinClassMap;
@NotNull
private CallResolverExtension defaultExtension;
@NotNull
public Project getProject() {
@@ -142,6 +145,16 @@ public class ExpressionTypingServices {
return platformToKotlinClassMap;
}
@Inject
public void setDefaultExtension(@NotNull CallResolverExtension extension) {
this.defaultExtension = extension;
}
@NotNull
public CallResolverExtension getDefaultExtension() {
return defaultExtension;
}
@NotNull
public JetType safeGetType(@NotNull JetScope scope, @NotNull JetExpression expression, @NotNull JetType expectedType, @NotNull DataFlowInfo dataFlowInfo, @NotNull BindingTrace trace) {
JetType type = getType(scope, expression, expectedType, dataFlowInfo, trace);
@@ -179,7 +192,8 @@ public class ExpressionTypingServices {
}
}
checkFunctionReturnType(function, ExpressionTypingContext.newContext(
this, trace, functionInnerScope, dataFlowInfo, expectedReturnType != null ? expectedReturnType : NO_EXPECTED_TYPE, ExpressionPosition.FREE
this, trace, functionInnerScope, dataFlowInfo, expectedReturnType != null ? expectedReturnType : NO_EXPECTED_TYPE,
ExpressionPosition.FREE
));
}
@@ -342,8 +356,8 @@ public class ExpressionTypingServices {
private ExpressionTypingContext createContext(ExpressionTypingContext oldContext, BindingTrace trace, WritableScope scope, DataFlowInfo dataFlowInfo, JetType expectedType) {
return ExpressionTypingContext.newContext(this, trace, scope, dataFlowInfo, expectedType, oldContext.expressionPosition,
oldContext.contextDependency, oldContext.resolutionResultsCache, oldContext.labelResolver
);
oldContext.contextDependency, oldContext.resolutionResultsCache, oldContext.labelResolver,
oldContext.callResolverExtension);
}
@Nullable