Inject context for body resolve

This commit is contained in:
Nikolay Krasko
2012-08-10 20:13:30 +04:00
parent d33b826055
commit cf6787b798
7 changed files with 29 additions and 7 deletions
@@ -144,6 +144,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
this.topDownAnalysisContext.setTopDownAnalysisParameters(topDownAnalysisParameters); this.topDownAnalysisContext.setTopDownAnalysisParameters(topDownAnalysisParameters);
this.bodyResolver.setCallResolver(callResolver); this.bodyResolver.setCallResolver(callResolver);
this.bodyResolver.setContext(topDownAnalysisContext);
this.bodyResolver.setControlFlowAnalyzer(controlFlowAnalyzer); this.bodyResolver.setControlFlowAnalyzer(controlFlowAnalyzer);
this.bodyResolver.setDeclarationsChecker(declarationsChecker); this.bodyResolver.setDeclarationsChecker(declarationsChecker);
this.bodyResolver.setDescriptorResolver(descriptorResolver); this.bodyResolver.setDescriptorResolver(descriptorResolver);
@@ -49,10 +49,11 @@ public class AnalyzerFacadeForEverything {
InjectorForBodyResolve injector = new InjectorForBodyResolve( InjectorForBodyResolve injector = new InjectorForBodyResolve(
project, topDownAnalysisParameters, project, topDownAnalysisParameters,
new ObservableBindingTrace(traceContext)); new ObservableBindingTrace(traceContext),
bodiesResolveContext);
try { try {
injector.getBodyResolver().resolveBodies(bodiesResolveContext); injector.getBodyResolver().resolveBodies();
return AnalyzeExhaust.success(traceContext.getBindingContext()); return AnalyzeExhaust.success(traceContext.getBindingContext());
} finally { } finally {
injector.destroy(); injector.destroy();
@@ -21,6 +21,7 @@ import org.jetbrains.jet.lang.resolve.BodyResolver;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters; import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters;
import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.BodiesResolveContext;
import org.jetbrains.jet.lang.resolve.calls.CallResolver; import org.jetbrains.jet.lang.resolve.calls.CallResolver;
import org.jetbrains.jet.lang.resolve.DescriptorResolver; import org.jetbrains.jet.lang.resolve.DescriptorResolver;
import org.jetbrains.jet.lang.resolve.AnnotationResolver; import org.jetbrains.jet.lang.resolve.AnnotationResolver;
@@ -42,6 +43,7 @@ public class InjectorForBodyResolve {
private final Project project; private final Project project;
private final TopDownAnalysisParameters topDownAnalysisParameters; private final TopDownAnalysisParameters topDownAnalysisParameters;
private final BindingTrace bindingTrace; private final BindingTrace bindingTrace;
private final BodiesResolveContext bodiesResolveContext;
private CallResolver callResolver; private CallResolver callResolver;
private DescriptorResolver descriptorResolver; private DescriptorResolver descriptorResolver;
private AnnotationResolver annotationResolver; private AnnotationResolver annotationResolver;
@@ -57,12 +59,14 @@ public class InjectorForBodyResolve {
public InjectorForBodyResolve( public InjectorForBodyResolve(
@NotNull Project project, @NotNull Project project,
@NotNull TopDownAnalysisParameters topDownAnalysisParameters, @NotNull TopDownAnalysisParameters topDownAnalysisParameters,
@NotNull BindingTrace bindingTrace @NotNull BindingTrace bindingTrace,
@NotNull BodiesResolveContext bodiesResolveContext
) { ) {
this.bodyResolver = new BodyResolver(); this.bodyResolver = new BodyResolver();
this.project = project; this.project = project;
this.topDownAnalysisParameters = topDownAnalysisParameters; this.topDownAnalysisParameters = topDownAnalysisParameters;
this.bindingTrace = bindingTrace; this.bindingTrace = bindingTrace;
this.bodiesResolveContext = bodiesResolveContext;
this.callResolver = new CallResolver(); this.callResolver = new CallResolver();
this.descriptorResolver = new DescriptorResolver(); this.descriptorResolver = new DescriptorResolver();
this.annotationResolver = new AnnotationResolver(); this.annotationResolver = new AnnotationResolver();
@@ -76,6 +80,7 @@ public class InjectorForBodyResolve {
this.topDownAnalysisContext = new TopDownAnalysisContext(); this.topDownAnalysisContext = new TopDownAnalysisContext();
this.bodyResolver.setCallResolver(callResolver); this.bodyResolver.setCallResolver(callResolver);
this.bodyResolver.setContext(bodiesResolveContext);
this.bodyResolver.setControlFlowAnalyzer(controlFlowAnalyzer); this.bodyResolver.setControlFlowAnalyzer(controlFlowAnalyzer);
this.bodyResolver.setDeclarationsChecker(declarationsChecker); this.bodyResolver.setDeclarationsChecker(declarationsChecker);
this.bodyResolver.setDescriptorResolver(descriptorResolver); this.bodyResolver.setDescriptorResolver(descriptorResolver);
@@ -138,4 +143,8 @@ public class InjectorForBodyResolve {
return this.bindingTrace; return this.bindingTrace;
} }
public BodiesResolveContext getBodiesResolveContext() {
return this.bodiesResolveContext;
}
} }
@@ -128,6 +128,7 @@ public class InjectorForTopDownAnalyzerBasic {
this.topDownAnalysisContext.setTopDownAnalysisParameters(topDownAnalysisParameters); this.topDownAnalysisContext.setTopDownAnalysisParameters(topDownAnalysisParameters);
this.bodyResolver.setCallResolver(callResolver); this.bodyResolver.setCallResolver(callResolver);
this.bodyResolver.setContext(topDownAnalysisContext);
this.bodyResolver.setControlFlowAnalyzer(controlFlowAnalyzer); this.bodyResolver.setControlFlowAnalyzer(controlFlowAnalyzer);
this.bodyResolver.setDeclarationsChecker(declarationsChecker); this.bodyResolver.setDeclarationsChecker(declarationsChecker);
this.bodyResolver.setDescriptorResolver(descriptorResolver); this.bodyResolver.setDescriptorResolver(descriptorResolver);
@@ -110,6 +110,10 @@ public class BodyResolver {
this.declarationsChecker = declarationsChecker; this.declarationsChecker = declarationsChecker;
} }
@Inject
public void setContext(@NotNull BodiesResolveContext context) {
this.context = context;
}
private void resolveBehaviorDeclarationBodies(@NotNull BodiesResolveContext bodiesResolveContext) { private void resolveBehaviorDeclarationBodies(@NotNull BodiesResolveContext bodiesResolveContext) {
// Initialize context // Initialize context
@@ -132,10 +136,14 @@ public class BodyResolver {
} }
public void resolveBodies(@NotNull BodiesResolveContext bodiesResolveContext) { public void resolveBodies(@NotNull BodiesResolveContext bodiesResolveContext) {
resolveBehaviorDeclarationBodies(bodiesResolveContext); context = bodiesResolveContext;
controlFlowAnalyzer.process(bodiesResolveContext); resolveBodies();
declarationsChecker.process(bodiesResolveContext); }
public void resolveBodies() {
resolveBehaviorDeclarationBodies(context);
controlFlowAnalyzer.process(context);
declarationsChecker.process(context);
} }
private void resolveDelegationSpecifierLists() { private void resolveDelegationSpecifierLists() {
@@ -482,7 +490,7 @@ public class BodyResolver {
} }
} }
private void resolveFunctionBody( public void resolveFunctionBody(
@NotNull BindingTrace trace, @NotNull BindingTrace trace,
@NotNull JetDeclarationWithBody function, @NotNull JetDeclarationWithBody function,
@NotNull FunctionDescriptor functionDescriptor, @NotNull FunctionDescriptor functionDescriptor,
@@ -222,6 +222,7 @@ public class AllInjectorsGenerator {
generator.addPublicParameter(Project.class); generator.addPublicParameter(Project.class);
generator.addPublicParameter(TopDownAnalysisParameters.class); generator.addPublicParameter(TopDownAnalysisParameters.class);
generator.addPublicParameter(BindingTrace.class); generator.addPublicParameter(BindingTrace.class);
generator.addPublicParameter(BodiesResolveContext.class);
generator.generate("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForBodyResolve"); generator.generate("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForBodyResolve");
} }
@@ -128,6 +128,7 @@ public class InjectorForTopDownAnalyzerForJs {
this.topDownAnalysisContext.setTopDownAnalysisParameters(topDownAnalysisParameters); this.topDownAnalysisContext.setTopDownAnalysisParameters(topDownAnalysisParameters);
this.bodyResolver.setCallResolver(callResolver); this.bodyResolver.setCallResolver(callResolver);
this.bodyResolver.setContext(topDownAnalysisContext);
this.bodyResolver.setControlFlowAnalyzer(controlFlowAnalyzer); this.bodyResolver.setControlFlowAnalyzer(controlFlowAnalyzer);
this.bodyResolver.setDeclarationsChecker(declarationsChecker); this.bodyResolver.setDeclarationsChecker(declarationsChecker);
this.bodyResolver.setDescriptorResolver(descriptorResolver); this.bodyResolver.setDescriptorResolver(descriptorResolver);