Deterministic order of setter calls

This commit is contained in:
Andrey Breslav
2012-03-13 20:00:54 +04:00
parent 93fcd7d1f2
commit c6e54b133c
4 changed files with 76 additions and 54 deletions
@@ -17,16 +17,15 @@
package org.jetbrains.jet.di; package org.jetbrains.jet.di;
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import org.jetbrains.jet.lang.resolve.AnnotationResolver;
import org.jetbrains.jet.lang.resolve.DescriptorResolver; import org.jetbrains.jet.lang.resolve.DescriptorResolver;
import org.jetbrains.jet.lang.resolve.TypeResolver; import org.jetbrains.jet.lang.resolve.TypeResolver;
import org.jetbrains.jet.lang.resolve.AnnotationResolver;
import org.jetbrains.jet.lang.resolve.calls.CallResolver; import org.jetbrains.jet.lang.resolve.calls.CallResolver;
import org.jetbrains.jet.lang.resolve.calls.OverloadingConflictResolver; import org.jetbrains.jet.lang.resolve.calls.OverloadingConflictResolver;
import com.intellij.openapi.project.Project; import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices;
/* This file is generated by org.jetbrains.jet.di.InjectorGenerator. DO NOT EDIT! */ /* This file is generated by org.jetbrains.jet.di.AllInjectorsGenerator. DO NOT EDIT! */
public class InjectorForMacros { public class InjectorForMacros {
private ExpressionTypingServices expressionTypingServices; private ExpressionTypingServices expressionTypingServices;
@@ -37,31 +36,31 @@ public class InjectorForMacros {
) { ) {
this.expressionTypingServices = new ExpressionTypingServices(); this.expressionTypingServices = new ExpressionTypingServices();
this.project = project; this.project = project;
DescriptorResolver descriptorResolver = new DescriptorResolver();
TypeResolver typeResolver = new TypeResolver();
AnnotationResolver annotationResolver = new AnnotationResolver();
CallResolver callResolver = new CallResolver(); CallResolver callResolver = new CallResolver();
DescriptorResolver descriptorResolver = new DescriptorResolver();
AnnotationResolver annotationResolver = new AnnotationResolver();
TypeResolver typeResolver = new TypeResolver();
OverloadingConflictResolver overloadingConflictResolver = new OverloadingConflictResolver(); OverloadingConflictResolver overloadingConflictResolver = new OverloadingConflictResolver();
this.expressionTypingServices.setDescriptorResolver(descriptorResolver);
this.expressionTypingServices.setCallResolver(callResolver); this.expressionTypingServices.setCallResolver(callResolver);
this.expressionTypingServices.setTypeResolver(typeResolver); this.expressionTypingServices.setDescriptorResolver(descriptorResolver);
this.expressionTypingServices.setProject(project); this.expressionTypingServices.setProject(project);
this.expressionTypingServices.setTypeResolver(typeResolver);
descriptorResolver.setExpressionTypingServices(expressionTypingServices);
descriptorResolver.setTypeResolver(typeResolver);
descriptorResolver.setAnnotationResolver(annotationResolver);
typeResolver.setDescriptorResolver(descriptorResolver);
typeResolver.setAnnotationResolver(annotationResolver);
annotationResolver.setExpressionTypingServices(expressionTypingServices);
annotationResolver.setCallResolver(callResolver);
callResolver.setDescriptorResolver(descriptorResolver); callResolver.setDescriptorResolver(descriptorResolver);
callResolver.setExpressionTypingServices(expressionTypingServices); callResolver.setExpressionTypingServices(expressionTypingServices);
callResolver.setTypeResolver(typeResolver);
callResolver.setOverloadingConflictResolver(overloadingConflictResolver); callResolver.setOverloadingConflictResolver(overloadingConflictResolver);
callResolver.setTypeResolver(typeResolver);
descriptorResolver.setAnnotationResolver(annotationResolver);
descriptorResolver.setExpressionTypingServices(expressionTypingServices);
descriptorResolver.setTypeResolver(typeResolver);
annotationResolver.setCallResolver(callResolver);
annotationResolver.setExpressionTypingServices(expressionTypingServices);
typeResolver.setAnnotationResolver(annotationResolver);
typeResolver.setDescriptorResolver(descriptorResolver);
} }
@@ -17,15 +17,32 @@
package org.jetbrains.jet.di; package org.jetbrains.jet.di;
import org.jetbrains.jet.lang.resolve.TopDownAnalyzer;
import org.jetbrains.jet.lang.resolve.BodyResolver;
import org.jetbrains.jet.lang.resolve.ControlFlowAnalyzer;
import org.jetbrains.jet.lang.resolve.DeclarationsChecker;
import org.jetbrains.jet.lang.resolve.DescriptorResolver;
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import org.jetbrains.jet.lang.resolve.TopDownAnalysisContext;
import org.jetbrains.jet.lang.ModuleConfiguration; import org.jetbrains.jet.lang.ModuleConfiguration;
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory; import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.DeclarationResolver;
import org.jetbrains.jet.lang.resolve.AnnotationResolver;
import org.jetbrains.jet.lang.resolve.calls.CallResolver; import org.jetbrains.jet.lang.resolve.calls.CallResolver;
import org.jetbrains.jet.lang.resolve.calls.OverloadingConflictResolver; import org.jetbrains.jet.lang.resolve.calls.OverloadingConflictResolver;
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices; import org.jetbrains.jet.lang.resolve.TypeResolver;
import org.jetbrains.jet.lang.resolve.ImportsResolver;
import org.jetbrains.jet.lang.resolve.DelegationResolver;
import org.jetbrains.jet.lang.resolve.OverloadResolver;
import org.jetbrains.jet.lang.resolve.OverrideResolver;
import org.jetbrains.jet.lang.resolve.TypeHierarchyResolver;
import com.intellij.openapi.project.Project;
import org.jetbrains.jet.lang.resolve.TopDownAnalysisContext;
import org.jetbrains.jet.lang.ModuleConfiguration;
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
/* This file is generated by org.jetbrains.jet.di.InjectorGenerator. DO NOT EDIT! */ /* This file is generated by org.jetbrains.jet.di.AllInjectorsGenerator. DO NOT EDIT! */
public class InjectorForTopDownAnalyzer { public class InjectorForTopDownAnalyzer {
private TopDownAnalyzer topDownAnalyzer; private TopDownAnalyzer topDownAnalyzer;
@@ -53,68 +70,68 @@ public class InjectorForTopDownAnalyzer {
DeclarationResolver declarationResolver = new DeclarationResolver(); DeclarationResolver declarationResolver = new DeclarationResolver();
AnnotationResolver annotationResolver = new AnnotationResolver(); AnnotationResolver annotationResolver = new AnnotationResolver();
CallResolver callResolver = new CallResolver(); CallResolver callResolver = new CallResolver();
TypeResolver typeResolver = new TypeResolver();
OverloadingConflictResolver overloadingConflictResolver = new OverloadingConflictResolver(); OverloadingConflictResolver overloadingConflictResolver = new OverloadingConflictResolver();
TypeResolver typeResolver = new TypeResolver();
ImportsResolver importsResolver = new ImportsResolver(); ImportsResolver importsResolver = new ImportsResolver();
TypeHierarchyResolver typeHierarchyResolver = new TypeHierarchyResolver();
DelegationResolver delegationResolver = new DelegationResolver(); DelegationResolver delegationResolver = new DelegationResolver();
OverrideResolver overrideResolver = new OverrideResolver();
OverloadResolver overloadResolver = new OverloadResolver(); OverloadResolver overloadResolver = new OverloadResolver();
OverrideResolver overrideResolver = new OverrideResolver();
TypeHierarchyResolver typeHierarchyResolver = new TypeHierarchyResolver();
this.topDownAnalyzer.setDeclarationResolver(declarationResolver); this.topDownAnalyzer.setDeclarationResolver(declarationResolver);
this.topDownAnalyzer.setTypeHierarchyResolver(typeHierarchyResolver);
this.topDownAnalyzer.setDelegationResolver(delegationResolver); this.topDownAnalyzer.setDelegationResolver(delegationResolver);
this.topDownAnalyzer.setOverrideResolver(overrideResolver);
this.topDownAnalyzer.setOverloadResolver(overloadResolver); this.topDownAnalyzer.setOverloadResolver(overloadResolver);
this.topDownAnalyzer.setOverrideResolver(overrideResolver);
this.topDownAnalyzer.setTypeHierarchyResolver(typeHierarchyResolver);
this.bodyResolver.setCallResolver(callResolver);
this.bodyResolver.setContext(topDownAnalysisContext); this.bodyResolver.setContext(topDownAnalysisContext);
this.bodyResolver.setDescriptorResolver(descriptorResolver); this.bodyResolver.setDescriptorResolver(descriptorResolver);
this.bodyResolver.setExpressionTypingServices(expressionTypingServices); this.bodyResolver.setExpressionTypingServices(expressionTypingServices);
this.bodyResolver.setCallResolver(callResolver);
this.controlFlowAnalyzer.setContext(topDownAnalysisContext); this.controlFlowAnalyzer.setContext(topDownAnalysisContext);
this.controlFlowAnalyzer.setFlowDataTraceFactory(jetControlFlowDataTraceFactory); this.controlFlowAnalyzer.setFlowDataTraceFactory(jetControlFlowDataTraceFactory);
this.declarationsChecker.setContext(topDownAnalysisContext); this.declarationsChecker.setContext(topDownAnalysisContext);
this.descriptorResolver.setAnnotationResolver(annotationResolver);
this.descriptorResolver.setExpressionTypingServices(expressionTypingServices); this.descriptorResolver.setExpressionTypingServices(expressionTypingServices);
this.descriptorResolver.setTypeResolver(typeResolver); this.descriptorResolver.setTypeResolver(typeResolver);
this.descriptorResolver.setAnnotationResolver(annotationResolver);
this.expressionTypingServices.setDescriptorResolver(descriptorResolver);
this.expressionTypingServices.setCallResolver(callResolver); this.expressionTypingServices.setCallResolver(callResolver);
this.expressionTypingServices.setTypeResolver(typeResolver); this.expressionTypingServices.setDescriptorResolver(descriptorResolver);
this.expressionTypingServices.setProject(project); this.expressionTypingServices.setProject(project);
this.expressionTypingServices.setTypeResolver(typeResolver);
declarationResolver.setAnnotationResolver(annotationResolver);
declarationResolver.setContext(topDownAnalysisContext); declarationResolver.setContext(topDownAnalysisContext);
declarationResolver.setDescriptorResolver(descriptorResolver); declarationResolver.setDescriptorResolver(descriptorResolver);
declarationResolver.setAnnotationResolver(annotationResolver);
declarationResolver.setImportsResolver(importsResolver); declarationResolver.setImportsResolver(importsResolver);
annotationResolver.setExpressionTypingServices(expressionTypingServices);
annotationResolver.setCallResolver(callResolver); annotationResolver.setCallResolver(callResolver);
annotationResolver.setExpressionTypingServices(expressionTypingServices);
callResolver.setDescriptorResolver(descriptorResolver); callResolver.setDescriptorResolver(descriptorResolver);
callResolver.setExpressionTypingServices(expressionTypingServices); callResolver.setExpressionTypingServices(expressionTypingServices);
callResolver.setTypeResolver(typeResolver);
callResolver.setOverloadingConflictResolver(overloadingConflictResolver); callResolver.setOverloadingConflictResolver(overloadingConflictResolver);
callResolver.setTypeResolver(typeResolver);
typeResolver.setDescriptorResolver(descriptorResolver);
typeResolver.setAnnotationResolver(annotationResolver); typeResolver.setAnnotationResolver(annotationResolver);
typeResolver.setDescriptorResolver(descriptorResolver);
importsResolver.setContext(topDownAnalysisContext);
importsResolver.setConfiguration(moduleConfiguration); importsResolver.setConfiguration(moduleConfiguration);
importsResolver.setContext(topDownAnalysisContext);
typeHierarchyResolver.setContext(topDownAnalysisContext);
typeHierarchyResolver.setDescriptorResolver(descriptorResolver);
typeHierarchyResolver.setImportsResolver(importsResolver);
typeHierarchyResolver.setConfiguration(moduleConfiguration);
delegationResolver.setContext(topDownAnalysisContext); delegationResolver.setContext(topDownAnalysisContext);
overloadResolver.setContext(topDownAnalysisContext);
overrideResolver.setContext(topDownAnalysisContext); overrideResolver.setContext(topDownAnalysisContext);
overloadResolver.setContext(topDownAnalysisContext); typeHierarchyResolver.setConfiguration(moduleConfiguration);
typeHierarchyResolver.setContext(topDownAnalysisContext);
typeHierarchyResolver.setDescriptorResolver(descriptorResolver);
typeHierarchyResolver.setImportsResolver(importsResolver);
} }
@@ -26,7 +26,7 @@ import org.jetbrains.jet.lang.resolve.calls.OverloadingConflictResolver;
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices; import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices;
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
/* This file is generated by org.jetbrains.jet.di.InjectorGenerator. DO NOT EDIT! */ /* This file is generated by org.jetbrains.jet.di.AllInjectorsGenerator. DO NOT EDIT! */
public class InjectorForTests { public class InjectorForTests {
private DescriptorResolver descriptorResolver; private DescriptorResolver descriptorResolver;
@@ -48,25 +48,25 @@ public class InjectorForTests {
AnnotationResolver annotationResolver = new AnnotationResolver(); AnnotationResolver annotationResolver = new AnnotationResolver();
OverloadingConflictResolver overloadingConflictResolver = new OverloadingConflictResolver(); OverloadingConflictResolver overloadingConflictResolver = new OverloadingConflictResolver();
this.descriptorResolver.setAnnotationResolver(annotationResolver);
this.descriptorResolver.setExpressionTypingServices(expressionTypingServices); this.descriptorResolver.setExpressionTypingServices(expressionTypingServices);
this.descriptorResolver.setTypeResolver(typeResolver); this.descriptorResolver.setTypeResolver(typeResolver);
this.descriptorResolver.setAnnotationResolver(annotationResolver);
this.expressionTypingServices.setDescriptorResolver(descriptorResolver);
this.expressionTypingServices.setCallResolver(callResolver); this.expressionTypingServices.setCallResolver(callResolver);
this.expressionTypingServices.setTypeResolver(typeResolver); this.expressionTypingServices.setDescriptorResolver(descriptorResolver);
this.expressionTypingServices.setProject(project); this.expressionTypingServices.setProject(project);
this.expressionTypingServices.setTypeResolver(typeResolver);
this.typeResolver.setDescriptorResolver(descriptorResolver);
this.typeResolver.setAnnotationResolver(annotationResolver); this.typeResolver.setAnnotationResolver(annotationResolver);
this.typeResolver.setDescriptorResolver(descriptorResolver);
this.callResolver.setDescriptorResolver(descriptorResolver); this.callResolver.setDescriptorResolver(descriptorResolver);
this.callResolver.setExpressionTypingServices(expressionTypingServices); this.callResolver.setExpressionTypingServices(expressionTypingServices);
this.callResolver.setTypeResolver(typeResolver);
this.callResolver.setOverloadingConflictResolver(overloadingConflictResolver); this.callResolver.setOverloadingConflictResolver(overloadingConflictResolver);
this.callResolver.setTypeResolver(typeResolver);
annotationResolver.setExpressionTypingServices(expressionTypingServices);
annotationResolver.setCallResolver(callResolver); annotationResolver.setCallResolver(callResolver);
annotationResolver.setExpressionTypingServices(expressionTypingServices);
} }
@@ -32,9 +32,7 @@ import java.io.PrintStream;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.util.Collection; import java.util.*;
import java.util.Iterator;
import java.util.Set;
/** /**
* @author abreslav * @author abreslav
@@ -279,7 +277,15 @@ public class DependencyInjectorGenerator {
initializeByConstructorCall(field, neededFor); initializeByConstructorCall(field, neededFor);
} }
for (Method method : field.getType().getDeclaredMethods()) { // Sort setters in order to get deterministic behavior
List<Method> declaredMethods = Lists.newArrayList(field.getType().getDeclaredMethods());
Collections.sort(declaredMethods, new Comparator<Method>() {
@Override
public int compare(Method o1, Method o2) {
return o1.getName().compareTo(o2.getName());
}
});
for (Method method : declaredMethods) {
if (method.getAnnotation(javax.inject.Inject.class) == null if (method.getAnnotation(javax.inject.Inject.class) == null
|| !method.getName().startsWith("set") || !method.getName().startsWith("set")
|| method.getParameterTypes().length != 1) continue; || method.getParameterTypes().length != 1) continue;