From c6e54b133cdde794b15839eaadc72ddbd12062d2 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 13 Mar 2012 20:00:54 +0400 Subject: [PATCH] Deterministic order of setter calls --- .../jetbrains/jet/di/InjectorForMacros.java | 39 ++++++------ .../jet/di/InjectorForTopDownAnalyzer.java | 63 ++++++++++++------- .../jetbrains/jet/di/InjectorForTests.java | 14 ++--- .../jet/di/DependencyInjectorGenerator.java | 14 +++-- 4 files changed, 76 insertions(+), 54 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForMacros.java b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForMacros.java index 986a6ffb77a..c80ad3cba1d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForMacros.java +++ b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForMacros.java @@ -17,16 +17,15 @@ package org.jetbrains.jet.di; -import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices; 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.TypeResolver; -import org.jetbrains.jet.lang.resolve.AnnotationResolver; import org.jetbrains.jet.lang.resolve.calls.CallResolver; 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 { private ExpressionTypingServices expressionTypingServices; @@ -37,31 +36,31 @@ public class InjectorForMacros { ) { this.expressionTypingServices = new ExpressionTypingServices(); this.project = project; - DescriptorResolver descriptorResolver = new DescriptorResolver(); - TypeResolver typeResolver = new TypeResolver(); - AnnotationResolver annotationResolver = new AnnotationResolver(); CallResolver callResolver = new CallResolver(); + DescriptorResolver descriptorResolver = new DescriptorResolver(); + AnnotationResolver annotationResolver = new AnnotationResolver(); + TypeResolver typeResolver = new TypeResolver(); OverloadingConflictResolver overloadingConflictResolver = new OverloadingConflictResolver(); - this.expressionTypingServices.setDescriptorResolver(descriptorResolver); this.expressionTypingServices.setCallResolver(callResolver); - this.expressionTypingServices.setTypeResolver(typeResolver); + this.expressionTypingServices.setDescriptorResolver(descriptorResolver); this.expressionTypingServices.setProject(project); - - descriptorResolver.setExpressionTypingServices(expressionTypingServices); - descriptorResolver.setTypeResolver(typeResolver); - descriptorResolver.setAnnotationResolver(annotationResolver); - - typeResolver.setDescriptorResolver(descriptorResolver); - typeResolver.setAnnotationResolver(annotationResolver); - - annotationResolver.setExpressionTypingServices(expressionTypingServices); - annotationResolver.setCallResolver(callResolver); + this.expressionTypingServices.setTypeResolver(typeResolver); callResolver.setDescriptorResolver(descriptorResolver); callResolver.setExpressionTypingServices(expressionTypingServices); - callResolver.setTypeResolver(typeResolver); 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); } diff --git a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzer.java b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzer.java index d6eb48dc820..21bed5464d9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzer.java +++ b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzer.java @@ -17,15 +17,32 @@ 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 org.jetbrains.jet.lang.resolve.TopDownAnalysisContext; import org.jetbrains.jet.lang.ModuleConfiguration; 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.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 { private TopDownAnalyzer topDownAnalyzer; @@ -53,68 +70,68 @@ public class InjectorForTopDownAnalyzer { DeclarationResolver declarationResolver = new DeclarationResolver(); AnnotationResolver annotationResolver = new AnnotationResolver(); CallResolver callResolver = new CallResolver(); - TypeResolver typeResolver = new TypeResolver(); OverloadingConflictResolver overloadingConflictResolver = new OverloadingConflictResolver(); + TypeResolver typeResolver = new TypeResolver(); ImportsResolver importsResolver = new ImportsResolver(); - TypeHierarchyResolver typeHierarchyResolver = new TypeHierarchyResolver(); DelegationResolver delegationResolver = new DelegationResolver(); - OverrideResolver overrideResolver = new OverrideResolver(); OverloadResolver overloadResolver = new OverloadResolver(); + OverrideResolver overrideResolver = new OverrideResolver(); + TypeHierarchyResolver typeHierarchyResolver = new TypeHierarchyResolver(); this.topDownAnalyzer.setDeclarationResolver(declarationResolver); - this.topDownAnalyzer.setTypeHierarchyResolver(typeHierarchyResolver); this.topDownAnalyzer.setDelegationResolver(delegationResolver); - this.topDownAnalyzer.setOverrideResolver(overrideResolver); this.topDownAnalyzer.setOverloadResolver(overloadResolver); + this.topDownAnalyzer.setOverrideResolver(overrideResolver); + this.topDownAnalyzer.setTypeHierarchyResolver(typeHierarchyResolver); + this.bodyResolver.setCallResolver(callResolver); this.bodyResolver.setContext(topDownAnalysisContext); this.bodyResolver.setDescriptorResolver(descriptorResolver); this.bodyResolver.setExpressionTypingServices(expressionTypingServices); - this.bodyResolver.setCallResolver(callResolver); this.controlFlowAnalyzer.setContext(topDownAnalysisContext); this.controlFlowAnalyzer.setFlowDataTraceFactory(jetControlFlowDataTraceFactory); this.declarationsChecker.setContext(topDownAnalysisContext); + this.descriptorResolver.setAnnotationResolver(annotationResolver); this.descriptorResolver.setExpressionTypingServices(expressionTypingServices); this.descriptorResolver.setTypeResolver(typeResolver); - this.descriptorResolver.setAnnotationResolver(annotationResolver); - this.expressionTypingServices.setDescriptorResolver(descriptorResolver); this.expressionTypingServices.setCallResolver(callResolver); - this.expressionTypingServices.setTypeResolver(typeResolver); + this.expressionTypingServices.setDescriptorResolver(descriptorResolver); this.expressionTypingServices.setProject(project); + this.expressionTypingServices.setTypeResolver(typeResolver); + declarationResolver.setAnnotationResolver(annotationResolver); declarationResolver.setContext(topDownAnalysisContext); declarationResolver.setDescriptorResolver(descriptorResolver); - declarationResolver.setAnnotationResolver(annotationResolver); declarationResolver.setImportsResolver(importsResolver); - annotationResolver.setExpressionTypingServices(expressionTypingServices); annotationResolver.setCallResolver(callResolver); + annotationResolver.setExpressionTypingServices(expressionTypingServices); callResolver.setDescriptorResolver(descriptorResolver); callResolver.setExpressionTypingServices(expressionTypingServices); - callResolver.setTypeResolver(typeResolver); callResolver.setOverloadingConflictResolver(overloadingConflictResolver); + callResolver.setTypeResolver(typeResolver); - typeResolver.setDescriptorResolver(descriptorResolver); typeResolver.setAnnotationResolver(annotationResolver); + typeResolver.setDescriptorResolver(descriptorResolver); - importsResolver.setContext(topDownAnalysisContext); importsResolver.setConfiguration(moduleConfiguration); - - typeHierarchyResolver.setContext(topDownAnalysisContext); - typeHierarchyResolver.setDescriptorResolver(descriptorResolver); - typeHierarchyResolver.setImportsResolver(importsResolver); - typeHierarchyResolver.setConfiguration(moduleConfiguration); + importsResolver.setContext(topDownAnalysisContext); delegationResolver.setContext(topDownAnalysisContext); + overloadResolver.setContext(topDownAnalysisContext); + overrideResolver.setContext(topDownAnalysisContext); - overloadResolver.setContext(topDownAnalysisContext); + typeHierarchyResolver.setConfiguration(moduleConfiguration); + typeHierarchyResolver.setContext(topDownAnalysisContext); + typeHierarchyResolver.setDescriptorResolver(descriptorResolver); + typeHierarchyResolver.setImportsResolver(importsResolver); } diff --git a/compiler/tests/org/jetbrains/jet/di/InjectorForTests.java b/compiler/tests/org/jetbrains/jet/di/InjectorForTests.java index 3fbc60670b7..6194948c399 100644 --- a/compiler/tests/org/jetbrains/jet/di/InjectorForTests.java +++ b/compiler/tests/org/jetbrains/jet/di/InjectorForTests.java @@ -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.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 { private DescriptorResolver descriptorResolver; @@ -48,25 +48,25 @@ public class InjectorForTests { AnnotationResolver annotationResolver = new AnnotationResolver(); OverloadingConflictResolver overloadingConflictResolver = new OverloadingConflictResolver(); + this.descriptorResolver.setAnnotationResolver(annotationResolver); this.descriptorResolver.setExpressionTypingServices(expressionTypingServices); this.descriptorResolver.setTypeResolver(typeResolver); - this.descriptorResolver.setAnnotationResolver(annotationResolver); - this.expressionTypingServices.setDescriptorResolver(descriptorResolver); this.expressionTypingServices.setCallResolver(callResolver); - this.expressionTypingServices.setTypeResolver(typeResolver); + this.expressionTypingServices.setDescriptorResolver(descriptorResolver); this.expressionTypingServices.setProject(project); + this.expressionTypingServices.setTypeResolver(typeResolver); - this.typeResolver.setDescriptorResolver(descriptorResolver); this.typeResolver.setAnnotationResolver(annotationResolver); + this.typeResolver.setDescriptorResolver(descriptorResolver); this.callResolver.setDescriptorResolver(descriptorResolver); this.callResolver.setExpressionTypingServices(expressionTypingServices); - this.callResolver.setTypeResolver(typeResolver); this.callResolver.setOverloadingConflictResolver(overloadingConflictResolver); + this.callResolver.setTypeResolver(typeResolver); - annotationResolver.setExpressionTypingServices(expressionTypingServices); annotationResolver.setCallResolver(callResolver); + annotationResolver.setExpressionTypingServices(expressionTypingServices); } diff --git a/injector-generator/src/org/jetbrains/jet/di/DependencyInjectorGenerator.java b/injector-generator/src/org/jetbrains/jet/di/DependencyInjectorGenerator.java index 39971df7656..0f39c940160 100644 --- a/injector-generator/src/org/jetbrains/jet/di/DependencyInjectorGenerator.java +++ b/injector-generator/src/org/jetbrains/jet/di/DependencyInjectorGenerator.java @@ -32,9 +32,7 @@ import java.io.PrintStream; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.lang.reflect.Modifier; -import java.util.Collection; -import java.util.Iterator; -import java.util.Set; +import java.util.*; /** * @author abreslav @@ -279,7 +277,15 @@ public class DependencyInjectorGenerator { initializeByConstructorCall(field, neededFor); } - for (Method method : field.getType().getDeclaredMethods()) { + // Sort setters in order to get deterministic behavior + List declaredMethods = Lists.newArrayList(field.getType().getDeclaredMethods()); + Collections.sort(declaredMethods, new Comparator() { + @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 || !method.getName().startsWith("set") || method.getParameterTypes().length != 1) continue;