/** * Constructs a ClassVisitor to efficiently travel to the specified class * members. * * @param classSpecification the specifications of the class members to visit. * @param memberVisitor the MemberVisitor to be applied to matching * class members. */ private static ClassVisitor createClassVisitor(ClassSpecification classSpecification, MemberVisitor memberVisitor) { MultiClassVisitor multiClassVisitor = new MultiClassVisitor(); addMemberVisitors(classSpecification.fieldSpecifications, true, multiClassVisitor, memberVisitor); addMemberVisitors(classSpecification.methodSpecifications, false, multiClassVisitor, memberVisitor); // Mark the class member in this class and in super classes. return new ClassHierarchyTraveler(true, true, false, false, multiClassVisitor); }
createCombinedClassVisitor(keepClassSpecification, classVisitor, memberVisitor); createClassMemberTester(keepClassSpecification, composedClassVisitor); return createClassPoolVisitor((ClassSpecification)keepClassSpecification, classVisitor, memberVisitor);
/** * Adds elements to the given MultiClassVisitor, to apply the given * MemberVisitor to all class members that match the given List * of options (of the given type). */ private static void addMemberVisitors(List memberSpecifications, boolean isField, MultiClassVisitor multiClassVisitor, MemberVisitor memberVisitor) { if (memberSpecifications != null) { for (int index = 0; index < memberSpecifications.size(); index++) { MemberSpecification memberSpecification = (MemberSpecification)memberSpecifications.get(index); multiClassVisitor.addClassVisitor( createClassVisitor(memberSpecification, isField, memberVisitor)); } } }
/** * Constructs a ClassPoolVisitor that conditionally applies the given * ClassVisitor to all classes that match the given class specification. */ protected ClassPoolVisitor createClassTester(ClassSpecification classSpecification, ClassVisitor classVisitor, List variableStringMatchers) { // Create a placeholder for the class visitor that tests class // members. MultiClassVisitor conditionalMemberTester = new MultiClassVisitor(); // Parse the class condition. ClassPoolVisitor conditionalClassTester = createClassPoolVisitor(classSpecification, conditionalMemberTester, null, null, null, variableStringMatchers); // Parse the member conditions and add the result to the placeholder. conditionalMemberTester.addClassVisitor( createClassMemberTester(classSpecification.fieldSpecifications, classSpecification.methodSpecifications, classVisitor, variableStringMatchers)); return conditionalClassTester; }
new ClassSpecificationVisitorFactory() .createClassPoolVisitor(configuration.whyAreYouKeeping, shortestUsagePrinter, shortestUsagePrinter,
/** * Constructs a ClassPoolVisitor to efficiently travel to the specified * classes, class members, and attributes. * * @param classSpecifications the list of ClassSpecification instances * that specify the classes and class members * to visit. * @param classVisitor an optional ClassVisitor to be applied to * all classes. * @param memberVisitor an optional MemberVisitor to be applied to * matching fields and methods. */ public ClassPoolVisitor createClassPoolVisitor(List classSpecifications, ClassVisitor classVisitor, MemberVisitor memberVisitor) { return createClassPoolVisitor(classSpecifications, classVisitor, memberVisitor, memberVisitor, null); }
createCombinedClassVisitor(classSpecification, classVisitor, memberVisitor); (extendsAnnotationType != null || extendsClassName != null || containsWildCards(className))) if (containsWildCards(extendsClassName))
/** * Constructs a ClassVisitor that conditionally applies the given * ClassVisitor to all classes that contain the given class members. */ private static ClassVisitor createClassMemberTester(ClassSpecification classSpecification, ClassVisitor classVisitor) { // Create a linked list of conditional visitors, for fields and for // methods. return createClassMemberTester(classSpecification.fieldSpecifications, true, createClassMemberTester(classSpecification.methodSpecifications, false, classVisitor)); }
name != null && descriptor != null && !containsWildCards(name) && !containsWildCards(descriptor);
/** * Returns whether the given string contains a wild card. */ private boolean containsWildCards(String string) { return string != null && (string.indexOf('!') >= 0 || string.indexOf('*') >= 0 || string.indexOf('?') >= 0 || string.indexOf('%') >= 0 || string.indexOf(',') >= 0 || string.indexOf("///") >= 0 || containsWildCardReferences(string)); }
/** * Constructs a ClassPoolVisitor that conditionally applies the given * ClassPoolVisitor for all classes that match the given class * specification. */ protected ClassPoolVisitor createClassTester(ClassSpecification classSpecification, ClassPoolVisitor classPoolVisitor, List variableStringMatchers) { ClassPoolClassVisitor classPoolClassVisitor = new ClassPoolClassVisitor(classPoolVisitor); // Parse the class condition. ClassPoolVisitor conditionalClassTester = createClassTester(classSpecification, (ClassVisitor)classPoolClassVisitor, variableStringMatchers); // The ClassPoolClassVisitor first needs to visit the class pool // and then its classes. return new MultiClassPoolVisitor( new ClassPoolVisitor[] { classPoolClassVisitor, conditionalClassTester }); }
new ClassSpecificationVisitorFactory() .createClassPoolVisitor(configuration.whyAreYouKeeping, shortestUsagePrinter, shortestUsagePrinter,
/** * Constructs a ClassPoolVisitor to efficiently travel to the specified * classes, class members, and attributes. * * @param classSpecifications the list of ClassSpecification instances * that specify the classes and class members * to visit. * @param classVisitor an optional ClassVisitor to be applied to * all classes. * @param memberVisitor an optional MemberVisitor to be applied to * matching fields and methods. */ public ClassPoolVisitor createClassPoolVisitor(List classSpecifications, ClassVisitor classVisitor, MemberVisitor memberVisitor) { return createClassPoolVisitor(classSpecifications, classVisitor, memberVisitor, memberVisitor, null); }
createCombinedClassVisitor(classSpecification.attributeNames, classSpecification.fieldSpecifications, classSpecification.methodSpecifications, containsWildCards(className)) if (containsWildCards(extendsClassName))
/** * Constructs a ClassPoolVisitor that conditionally applies the given * ClassVisitor to all classes that match the given class specification. */ protected ClassPoolVisitor createClassTester(ClassSpecification classSpecification, ClassVisitor classVisitor, List variableStringMatchers) { // Create a placeholder for the class visitor that tests class // members. MultiClassVisitor conditionalMemberTester = new MultiClassVisitor(); // Parse the class condition. ClassPoolVisitor conditionalClassTester = createClassPoolVisitor(classSpecification, conditionalMemberTester, null, null, null, variableStringMatchers); // Parse the member conditions and add the result to the placeholder. conditionalMemberTester.addClassVisitor( createClassMemberTester(classSpecification.fieldSpecifications, classSpecification.methodSpecifications, classVisitor, variableStringMatchers)); return conditionalClassTester; }
/** * Constructs a ClassVisitor that conditionally applies the given * ClassVisitor to all classes that contain the given class members. */ private ClassVisitor createClassMemberTester(List fieldSpecifications, List methodSpecifications, ClassVisitor classVisitor, List variableStringMatchers) { // Create a linked list of conditional visitors, for fields and for // methods. return createClassMemberTester(fieldSpecifications, true, createClassMemberTester(methodSpecifications, false, classVisitor, variableStringMatchers), variableStringMatchers); }
!containsWildCards(name) && !containsWildCards(descriptor))
/** * Returns whether the given string contains a wild card. */ private boolean containsWildCards(String string) { return string != null && (string.indexOf('!') >= 0 || string.indexOf('*') >= 0 || string.indexOf('?') >= 0 || string.indexOf('%') >= 0 || string.indexOf(',') >= 0 || string.indexOf("///") >= 0 || containsWildCardReferences(string)); }
/** * Constructs a ClassPoolVisitor that conditionally applies the given * ClassPoolVisitor for all classes that match the given class * specification. */ protected ClassPoolVisitor createClassTester(ClassSpecification classSpecification, ClassPoolVisitor classPoolVisitor, List variableStringMatchers) { ClassPoolClassVisitor classPoolClassVisitor = new ClassPoolClassVisitor(classPoolVisitor); // Parse the class condition. ClassPoolVisitor conditionalClassTester = createClassTester(classSpecification, (ClassVisitor)classPoolClassVisitor, variableStringMatchers); // The ClassPoolClassVisitor first needs to visit the class pool // and then its classes. return new MultiClassPoolVisitor( new ClassPoolVisitor[] { classPoolClassVisitor, conditionalClassTester }); }
new ClassSpecificationVisitorFactory() .createClassPoolVisitor(configuration.whyAreYouKeeping, shortestUsagePrinter, shortestUsagePrinter,