Added AnnotationContext flag

This commit is contained in:
Mikhael Bogdanov
2013-11-12 11:21:56 +04:00
parent c09ba00c8d
commit afa09caa0f
12 changed files with 56 additions and 39 deletions
@@ -169,7 +169,8 @@ public class AnnotationResolver {
trace, scope,
CallMaker.makeCall(ReceiverValue.NO_RECEIVER, null, annotationEntry),
NO_EXPECTED_TYPE,
DataFlowInfo.EMPTY);
DataFlowInfo.EMPTY,
true);
}
public void resolveAnnotationsArguments(@NotNull JetScope scope, @Nullable JetModifierList modifierList, @NotNull BindingTrace trace) {
@@ -217,7 +217,8 @@ 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(), expressionTypingServices.createExtension(scope));
ResolutionResultsCacheImpl.create(), LabelResolver.create(),
expressionTypingServices.createExtension(scope, false), false);
DataFlowUtils.checkType(type, delegateExpression, simpleResolutionContext);
}
}
@@ -239,7 +240,7 @@ public class BodyResolver {
}
OverloadResolutionResults<FunctionDescriptor> results = callResolver.resolveFunctionCall(
trace, scopeForConstructor,
CallMaker.makeCall(ReceiverValue.NO_RECEIVER, null, call), NO_EXPECTED_TYPE, context.getOuterDataFlowInfo());
CallMaker.makeCall(ReceiverValue.NO_RECEIVER, null, call), NO_EXPECTED_TYPE, context.getOuterDataFlowInfo(), false);
if (results.isSuccess()) {
JetType supertype = results.getResultingDescriptor().getReturnType();
recordSupertype(typeReference, supertype);
@@ -132,12 +132,13 @@ public class CallResolver {
@NotNull JetScope scope,
@NotNull Call call,
@NotNull JetType expectedType,
@NotNull DataFlowInfo dataFlowInfo
@NotNull DataFlowInfo dataFlowInfo,
boolean isAnnotationContext
) {
return resolveFunctionCall(BasicCallResolutionContext.create(
trace, scope, call, expectedType, dataFlowInfo, ContextDependency.INDEPENDENT, CheckValueArgumentsMode.ENABLED,
ExpressionPosition.FREE, ResolutionResultsCacheImpl.create(), LabelResolver.create(), null,
expressionTypingServices.createExtension(scope)));
expressionTypingServices.createExtension(scope, isAnnotationContext), isAnnotationContext));
}
@NotNull
@@ -31,8 +31,8 @@ public class CallResolverExtensionProvider {
private WeakReference<Map<DeclarationDescriptor, List<CallResolverExtension>>> extensionsCache;
@NotNull
public CallResolverExtension createExtension(@Nullable DeclarationDescriptor descriptor) {
if (descriptor == null) {
public CallResolverExtension createExtension(@Nullable DeclarationDescriptor descriptor, boolean isAnnotationContext) {
if (descriptor == null || isAnnotationContext) {
return DEFAULT;
}
return new CompositeExtension(createExtensions(descriptor));
@@ -41,11 +41,12 @@ public class BasicCallResolutionContext extends CallResolutionContext<BasicCallR
@NotNull ResolutionResultsCache resolutionResultsCache,
@NotNull LabelResolver labelResolver,
@Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments,
@NotNull CallResolverExtension callResolverExtension
@NotNull CallResolverExtension callResolverExtension,
boolean isAnnotationContext
) {
return new BasicCallResolutionContext(
trace, scope, call, expectedType, dataFlowInfo, contextDependency, checkArguments, expressionPosition,
resolutionResultsCache, labelResolver, dataFlowInfoForArguments, callResolverExtension);
resolutionResultsCache, labelResolver, dataFlowInfoForArguments, callResolverExtension, isAnnotationContext);
}
@NotNull
@@ -55,7 +56,8 @@ 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.callResolverExtension);
context.expressionPosition, context.resolutionResultsCache, context.labelResolver, dataFlowInfoForArguments,
context.callResolverExtension, context.isAnnotationContext);
}
@NotNull
@@ -70,10 +72,10 @@ public class BasicCallResolutionContext extends CallResolutionContext<BasicCallR
DataFlowInfo dataFlowInfo, ContextDependency contextDependency, CheckValueArgumentsMode checkArguments,
ExpressionPosition expressionPosition, ResolutionResultsCache resolutionResultsCache,
LabelResolver labelResolver, MutableDataFlowInfoForArguments dataFlowInfoForArguments,
CallResolverExtension callResolverExtension
CallResolverExtension callResolverExtension, boolean isAnnotationContext
) {
super(trace, scope, call, expectedType, dataFlowInfo, contextDependency, checkArguments, expressionPosition, resolutionResultsCache,
labelResolver, dataFlowInfoForArguments, callResolverExtension);
labelResolver, dataFlowInfoForArguments, callResolverExtension, isAnnotationContext);
}
@Override
@@ -88,7 +90,7 @@ public class BasicCallResolutionContext extends CallResolutionContext<BasicCallR
@NotNull LabelResolver labelResolver
) {
return create(trace, scope, call, expectedType, dataFlowInfo, contextDependency, checkArguments, expressionPosition,
resolutionResultsCache, labelResolver, dataFlowInfoForArguments, callResolverExtension);
resolutionResultsCache, labelResolver, dataFlowInfoForArguments, callResolverExtension, isAnnotationContext);
}
@Override
@@ -50,10 +50,11 @@ public final class CallCandidateResolutionContext<D extends CallableDescriptor>
@NotNull ResolutionResultsCache resolutionResultsCache,
@NotNull LabelResolver labelResolver,
@Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments,
@NotNull CallResolverExtension callResolverExtension
@NotNull CallResolverExtension callResolverExtension,
boolean isAnnotationContext
) {
super(trace, scope, call, expectedType, dataFlowInfo, contextDependency, checkArguments, expressionPosition, resolutionResultsCache,
labelResolver, dataFlowInfoForArguments, callResolverExtension);
labelResolver, dataFlowInfoForArguments, callResolverExtension, isAnnotationContext);
this.candidateCall = candidateCall;
this.tracing = tracing;
}
@@ -65,7 +66,8 @@ 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.callResolverExtension);
context.expressionPosition, context.resolutionResultsCache, context.labelResolver, context.dataFlowInfoForArguments,
context.callResolverExtension, context.isAnnotationContext);
}
public static <D extends CallableDescriptor> CallCandidateResolutionContext<D> create(
@@ -80,7 +82,8 @@ 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.callResolverExtension);
context.resolutionResultsCache, context.labelResolver, context.dataFlowInfoForArguments, context.callResolverExtension,
context.isAnnotationContext);
}
@Override
@@ -96,7 +99,8 @@ public final class CallCandidateResolutionContext<D extends CallableDescriptor>
) {
return new CallCandidateResolutionContext<D>(
candidateCall, tracing, trace, scope, call, expectedType, dataFlowInfo, contextDependency,
checkArguments, expressionPosition, resolutionResultsCache, labelResolver, dataFlowInfoForArguments, callResolverExtension);
checkArguments, expressionPosition, resolutionResultsCache, labelResolver, dataFlowInfoForArguments, callResolverExtension,
isAnnotationContext);
}
@Override
@@ -47,10 +47,11 @@ public abstract class CallResolutionContext<Context extends CallResolutionContex
@NotNull LabelResolver labelResolver,
@SuppressWarnings("NullableProblems")
@Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments,
@NotNull CallResolverExtension callResolverExtension
@NotNull CallResolverExtension callResolverExtension,
boolean isAnnotationContext
) {
super(trace, scope, expectedType, dataFlowInfo, expressionPosition, contextDependency, resolutionResultsCache, labelResolver,
callResolverExtension);
callResolverExtension, isAnnotationContext);
this.call = call;
this.checkArguments = checkArguments;
if (dataFlowInfoForArguments != null) {
@@ -36,6 +36,7 @@ public abstract class ResolutionContext<Context extends ResolutionContext<Contex
public final ResolutionResultsCache resolutionResultsCache;
public final LabelResolver labelResolver;
public final CallResolverExtension callResolverExtension;
public final boolean isAnnotationContext;
protected ResolutionContext(
@NotNull BindingTrace trace,
@@ -46,7 +47,8 @@ public abstract class ResolutionContext<Context extends ResolutionContext<Contex
@NotNull ContextDependency contextDependency,
@NotNull ResolutionResultsCache resolutionResultsCache,
@NotNull LabelResolver labelResolver,
@NotNull CallResolverExtension callResolverExtension
@NotNull CallResolverExtension callResolverExtension,
boolean isAnnotationContext
) {
this.trace = trace;
this.scope = scope;
@@ -57,6 +59,7 @@ public abstract class ResolutionContext<Context extends ResolutionContext<Contex
this.resolutionResultsCache = resolutionResultsCache;
this.labelResolver = labelResolver;
this.callResolverExtension = callResolverExtension;
this.isAnnotationContext = isAnnotationContext;
}
protected abstract Context create(
@@ -18,10 +18,11 @@ public class SimpleResolutionContext extends ResolutionContext<SimpleResolutionC
@NotNull ContextDependency contextDependency,
@NotNull ResolutionResultsCache resolutionResultsCache,
@NotNull LabelResolver labelResolver,
@NotNull CallResolverExtension callResolverExtension
@NotNull CallResolverExtension callResolverExtension,
boolean isAnnotationContext
) {
super(trace, scope, expectedType, dataFlowInfo, expressionPosition, contextDependency, resolutionResultsCache, labelResolver,
callResolverExtension);
callResolverExtension, isAnnotationContext);
}
@Override
@@ -37,7 +38,7 @@ public class SimpleResolutionContext extends ResolutionContext<SimpleResolutionC
) {
return new SimpleResolutionContext(
trace, scope, expectedType, dataFlowInfo, expressionPosition, contextDependency, resolutionResultsCache, labelResolver,
callResolverExtension);
callResolverExtension, isAnnotationContext);
}
@Override
@@ -51,10 +51,10 @@ public class ResolutionTask<D extends CallableDescriptor, F extends D> extends C
DataFlowInfo dataFlowInfo, ContextDependency contextDependency, CheckValueArgumentsMode checkArguments,
ExpressionPosition expressionPosition, ResolutionResultsCache resolutionResultsCache,
@NotNull LabelResolver labelResolver, @Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments,
@NotNull CallResolverExtension callResolverExtension
@NotNull CallResolverExtension callResolverExtension, boolean isAnnotationContext
) {
super(trace, scope, call, expectedType, dataFlowInfo, contextDependency, checkArguments, expressionPosition, resolutionResultsCache,
labelResolver, dataFlowInfoForArguments, callResolverExtension);
labelResolver, dataFlowInfoForArguments, callResolverExtension, isAnnotationContext);
this.candidates = candidates;
this.reference = reference;
this.tracing = tracing;
@@ -69,7 +69,8 @@ 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.callResolverExtension);
context.expressionPosition, context.resolutionResultsCache, context.labelResolver, context.dataFlowInfoForArguments,
context.callResolverExtension, context.isAnnotationContext);
}
public ResolutionTask(
@@ -114,7 +115,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, callResolverExtension);
expressionPosition, resolutionResultsCache, labelResolver, dataFlowInfoForArguments, callResolverExtension, isAnnotationContext);
newTask.setCheckingStrategy(checkingStrategy);
return newTask;
}
@@ -127,7 +128,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, callResolverExtension);
expressionPosition, resolutionResultsCache, labelResolver, dataFlowInfoForArguments, callResolverExtension, isAnnotationContext);
}
public interface DescriptorCheckStrategy {
@@ -43,7 +43,7 @@ public class ExpressionTypingContext extends ResolutionContext<ExpressionTypingC
) {
return newContext(expressionTypingServices, trace, scope, dataFlowInfo, expectedType, expressionPosition,
ContextDependency.INDEPENDENT, ResolutionResultsCacheImpl.create(), LabelResolver.create(),
expressionTypingServices.createExtension(scope));
expressionTypingServices.createExtension(scope, false), false);
}
@NotNull
@@ -54,7 +54,7 @@ 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.callResolverExtension);
resolutionContext.callResolverExtension, resolutionContext.isAnnotationContext);
}
@NotNull
@@ -68,11 +68,12 @@ public class ExpressionTypingContext extends ResolutionContext<ExpressionTypingC
@NotNull ContextDependency contextDependency,
@NotNull ResolutionResultsCache resolutionResultsCache,
@NotNull LabelResolver labelResolver,
@NotNull CallResolverExtension callResolverExtension
@NotNull CallResolverExtension callResolverExtension,
boolean isAnnotationContext
) {
return new ExpressionTypingContext(
expressionTypingServices, labelResolver, trace, scope, dataFlowInfo, expectedType, expressionPosition, contextDependency, resolutionResultsCache,
callResolverExtension);
callResolverExtension, isAnnotationContext);
}
public final ExpressionTypingServices expressionTypingServices;
@@ -89,10 +90,11 @@ public class ExpressionTypingContext extends ResolutionContext<ExpressionTypingC
@NotNull ExpressionPosition expressionPosition,
@NotNull ContextDependency contextDependency,
@NotNull ResolutionResultsCache resolutionResultsCache,
@NotNull CallResolverExtension callResolverExtension
@NotNull CallResolverExtension callResolverExtension,
boolean isAnnotationContext
) {
super(trace, scope, expectedType, dataFlowInfo, expressionPosition, contextDependency, resolutionResultsCache, labelResolver,
callResolverExtension);
callResolverExtension, isAnnotationContext);
this.expressionTypingServices = expressionTypingServices;
}
@@ -108,7 +110,7 @@ public class ExpressionTypingContext extends ResolutionContext<ExpressionTypingC
@NotNull LabelResolver labelResolver
) {
return new ExpressionTypingContext(expressionTypingServices, this.labelResolver, trace, scope, dataFlowInfo, expectedType,
expressionPosition, contextDependency, resolutionResultsCache, callResolverExtension);
expressionPosition, contextDependency, resolutionResultsCache, callResolverExtension, isAnnotationContext);
}
@Override
@@ -353,7 +353,7 @@ 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.callResolverExtension);
oldContext.callResolverExtension, oldContext.isAnnotationContext);
}
@Nullable
@@ -410,7 +410,7 @@ public class ExpressionTypingServices {
}
@NotNull
public CallResolverExtension createExtension(@NotNull JetScope scope) {
return extensionProvider.createExtension(scope == JetScope.EMPTY ? null : scope.getContainingDeclaration());
public CallResolverExtension createExtension(@NotNull JetScope scope, boolean isAnnotationContext) {
return extensionProvider.createExtension(scope == JetScope.EMPTY ? null : scope.getContainingDeclaration(), isAnnotationContext);
}
}