Do not inject TopDownAnalysisParameters into ControlFlowAnalyzer

This commit is contained in:
Andrey Breslav
2014-02-23 12:50:09 +04:00
parent 42c7c54ea0
commit d4a6374d76
5 changed files with 19 additions and 29 deletions
@@ -251,7 +251,6 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
candidateResolver.setArgumentTypeResolver(argumentTypeResolver); candidateResolver.setArgumentTypeResolver(argumentTypeResolver);
controlFlowAnalyzer.setTopDownAnalysisParameters(topDownAnalysisParameters);
controlFlowAnalyzer.setTrace(bindingTrace); controlFlowAnalyzer.setTrace(bindingTrace);
declarationsChecker.setTrace(bindingTrace); declarationsChecker.setTrace(bindingTrace);
@@ -167,7 +167,6 @@ public class InjectorForBodyResolve {
candidateResolver.setArgumentTypeResolver(argumentTypeResolver); candidateResolver.setArgumentTypeResolver(argumentTypeResolver);
controlFlowAnalyzer.setTopDownAnalysisParameters(topDownAnalysisParameters);
controlFlowAnalyzer.setTrace(bindingTrace); controlFlowAnalyzer.setTrace(bindingTrace);
declarationsChecker.setTrace(bindingTrace); declarationsChecker.setTrace(bindingTrace);
@@ -206,7 +206,6 @@ public class InjectorForTopDownAnalyzerBasic {
candidateResolver.setArgumentTypeResolver(argumentTypeResolver); candidateResolver.setArgumentTypeResolver(argumentTypeResolver);
controlFlowAnalyzer.setTopDownAnalysisParameters(topDownAnalysisParameters);
controlFlowAnalyzer.setTrace(bindingTrace); controlFlowAnalyzer.setTrace(bindingTrace);
declarationsChecker.setTrace(bindingTrace); declarationsChecker.setTrace(bindingTrace);
@@ -31,72 +31,66 @@ import java.util.Map;
import static org.jetbrains.jet.lang.types.TypeUtils.NO_EXPECTED_TYPE; import static org.jetbrains.jet.lang.types.TypeUtils.NO_EXPECTED_TYPE;
public class ControlFlowAnalyzer { public class ControlFlowAnalyzer {
private TopDownAnalysisParameters topDownAnalysisParameters;
private BindingTrace trace; private BindingTrace trace;
@Inject
public void setTopDownAnalysisParameters(TopDownAnalysisParameters topDownAnalysisParameters) {
this.topDownAnalysisParameters = topDownAnalysisParameters;
}
@Inject @Inject
public void setTrace(BindingTrace trace) { public void setTrace(BindingTrace trace) {
this.trace = trace; this.trace = trace;
} }
public void process(@NotNull BodiesResolveContext bodiesResolveContext) { public void process(@NotNull BodiesResolveContext c) {
for (JetFile file : bodiesResolveContext.getFiles()) { for (JetFile file : c.getFiles()) {
if (!bodiesResolveContext.completeAnalysisNeeded(file)) continue; if (!c.completeAnalysisNeeded(file)) continue;
checkDeclarationContainer(file); checkDeclarationContainer(c, file);
} }
for (JetClassOrObject aClass : bodiesResolveContext.getClasses().keySet()) { for (JetClassOrObject aClass : c.getClasses().keySet()) {
if (!bodiesResolveContext.completeAnalysisNeeded(aClass)) continue; if (!c.completeAnalysisNeeded(aClass)) continue;
checkDeclarationContainer(aClass); checkDeclarationContainer(c, aClass);
} }
for (Map.Entry<JetNamedFunction, SimpleFunctionDescriptor> entry : bodiesResolveContext.getFunctions().entrySet()) { for (Map.Entry<JetNamedFunction, SimpleFunctionDescriptor> entry : c.getFunctions().entrySet()) {
JetNamedFunction function = entry.getKey(); JetNamedFunction function = entry.getKey();
SimpleFunctionDescriptor functionDescriptor = entry.getValue(); SimpleFunctionDescriptor functionDescriptor = entry.getValue();
if (!bodiesResolveContext.completeAnalysisNeeded(function)) continue; if (!c.completeAnalysisNeeded(function)) continue;
JetType expectedReturnType = !function.hasBlockBody() && !function.hasDeclaredReturnType() JetType expectedReturnType = !function.hasBlockBody() && !function.hasDeclaredReturnType()
? NO_EXPECTED_TYPE ? NO_EXPECTED_TYPE
: functionDescriptor.getReturnType(); : functionDescriptor.getReturnType();
checkFunction(function, expectedReturnType); checkFunction(c, function, expectedReturnType);
} }
for (Map.Entry<JetProperty, PropertyDescriptor> entry : bodiesResolveContext.getProperties().entrySet()) { for (Map.Entry<JetProperty, PropertyDescriptor> entry : c.getProperties().entrySet()) {
JetProperty property = entry.getKey(); JetProperty property = entry.getKey();
if (!bodiesResolveContext.completeAnalysisNeeded(property)) continue; if (!c.completeAnalysisNeeded(property)) continue;
PropertyDescriptor propertyDescriptor = entry.getValue(); PropertyDescriptor propertyDescriptor = entry.getValue();
checkProperty(property, propertyDescriptor); checkProperty(c, property, propertyDescriptor);
} }
} }
private void checkDeclarationContainer(JetDeclarationContainer declarationContainer) { private void checkDeclarationContainer(@NotNull BodiesResolveContext c, JetDeclarationContainer declarationContainer) {
// A pseudocode of class/object initialization corresponds to a class/object // A pseudocode of class/object initialization corresponds to a class/object
// or initialization of properties corresponds to a package declared in a file // or initialization of properties corresponds to a package declared in a file
JetFlowInformationProvider flowInformationProvider = new JetFlowInformationProvider((JetElement) declarationContainer, trace); JetFlowInformationProvider flowInformationProvider = new JetFlowInformationProvider((JetElement) declarationContainer, trace);
if (topDownAnalysisParameters.isDeclaredLocally()) { if (c.getTopDownAnalysisParameters().isDeclaredLocally()) {
flowInformationProvider.checkForLocalClassOrObjectMode(); flowInformationProvider.checkForLocalClassOrObjectMode();
return; return;
} }
flowInformationProvider.checkDeclaration(); flowInformationProvider.checkDeclaration();
} }
private void checkProperty(JetProperty property, PropertyDescriptor propertyDescriptor) { private void checkProperty(@NotNull BodiesResolveContext c, JetProperty property, PropertyDescriptor propertyDescriptor) {
for (JetPropertyAccessor accessor : property.getAccessors()) { for (JetPropertyAccessor accessor : property.getAccessors()) {
PropertyAccessorDescriptor accessorDescriptor = accessor.isGetter() PropertyAccessorDescriptor accessorDescriptor = accessor.isGetter()
? propertyDescriptor.getGetter() ? propertyDescriptor.getGetter()
: propertyDescriptor.getSetter(); : propertyDescriptor.getSetter();
assert accessorDescriptor != null : "no property accessor descriptor " + accessor.getText(); assert accessorDescriptor != null : "no property accessor descriptor " + accessor.getText();
JetType returnType = accessorDescriptor.getReturnType(); JetType returnType = accessorDescriptor.getReturnType();
checkFunction(accessor, returnType); checkFunction(c, accessor, returnType);
} }
} }
private void checkFunction(@NotNull JetDeclarationWithBody function, @Nullable JetType expectedReturnType) { private void checkFunction(@NotNull BodiesResolveContext c, @NotNull JetDeclarationWithBody function, @Nullable JetType expectedReturnType) {
JetExpression bodyExpression = function.getBodyExpression(); JetExpression bodyExpression = function.getBodyExpression();
if (bodyExpression == null) return; if (bodyExpression == null) return;
JetFlowInformationProvider flowInformationProvider = new JetFlowInformationProvider(function, trace); JetFlowInformationProvider flowInformationProvider = new JetFlowInformationProvider(function, trace);
if (topDownAnalysisParameters.isDeclaredLocally()) { if (c.getTopDownAnalysisParameters().isDeclaredLocally()) {
flowInformationProvider.checkForLocalClassOrObjectMode(); flowInformationProvider.checkForLocalClassOrObjectMode();
return; return;
} }
@@ -206,7 +206,6 @@ public class InjectorForTopDownAnalyzerForJs {
candidateResolver.setArgumentTypeResolver(argumentTypeResolver); candidateResolver.setArgumentTypeResolver(argumentTypeResolver);
controlFlowAnalyzer.setTopDownAnalysisParameters(topDownAnalysisParameters);
controlFlowAnalyzer.setTrace(bindingTrace); controlFlowAnalyzer.setTrace(bindingTrace);
declarationsChecker.setTrace(bindingTrace); declarationsChecker.setTrace(bindingTrace);