private boolean isFunctionalInterface(Clazz clazz) { // Is it an interface? if ((clazz.getAccessFlags() & ClassConstants.ACC_INTERFACE) == 0) { return false; } // Count the abstract methods in the interface hierarchy. // Subtract any corresponding default methods, since only abstract // methods that don't have a default implementation count. // TODO: Find a better way to count default methods, since there may be more of them for a single abstract method, or we can find one via different paths. MemberCounter abstractMethodCounter = new MemberCounter(); MemberCounter defaultMethodCounter = new MemberCounter(); clazz.hierarchyAccept(true, false, true, false, new AllMethodVisitor( new MemberAccessFilter(ClassConstants.ACC_ABSTRACT, 0, new MultiMemberVisitor( abstractMethodCounter, new SimilarMemberVisitor(clazz, true, false, true, false, new MemberAccessFilter(0, ClassConstants.ACC_ABSTRACT, defaultMethodCounter)) )))); return abstractMethodCounter.getCount() - defaultMethodCounter.getCount() == 1; } }
public void addMemberVisitor(MemberVisitor memberVisitor) { ensureArraySize(); memberVisitors[memberVisitorCount++] = memberVisitor; }
private boolean isFunctionalInterface(Clazz clazz) { // Is it an interface? if ((clazz.getAccessFlags() & ClassConstants.ACC_INTERFACE) == 0) { return false; } // Count the abstract methods in the interface hierarchy. // Subtract any corresponding default methods, since only abstract // methods that don't have a default implementation count. // TODO: Find a better way to count default methods, since there may be more of them for a single abstract method, or we can find one via different paths. MemberCounter abstractMethodCounter = new MemberCounter(); MemberCounter defaultMethodCounter = new MemberCounter(); clazz.hierarchyAccept(true, false, true, false, new AllMethodVisitor( new MemberAccessFilter(ClassConstants.ACC_ABSTRACT, 0, new MultiMemberVisitor( abstractMethodCounter, new SimilarMemberVisitor(clazz, true, false, true, false, new MemberAccessFilter(0, ClassConstants.ACC_ABSTRACT, defaultMethodCounter)) )))); return abstractMethodCounter.getCount() - defaultMethodCounter.getCount() == 1; } }
private boolean isFunctionalInterface(Clazz clazz) { // Is it an interface? if ((clazz.getAccessFlags() & ClassConstants.ACC_INTERFACE) == 0) { return false; } // Count the abstract methods in the interface hierarchy. // Subtract any corresponding default methods, since only abstract // methods that don't have a default implementation count. // TODO: Find a better way to count default methods, since there may be more of them for a single abstract method, or we can find one via different paths. MemberCounter abstractMethodCounter = new MemberCounter(); MemberCounter defaultMethodCounter = new MemberCounter(); clazz.hierarchyAccept(true, false, true, false, new AllMethodVisitor( new MemberAccessFilter(ClassConstants.ACC_ABSTRACT, 0, new MultiMemberVisitor( abstractMethodCounter, new SimilarMemberVisitor(clazz, true, false, true, false, new MemberAccessFilter(0, ClassConstants.ACC_ABSTRACT, defaultMethodCounter)) )))); return abstractMethodCounter.getCount() - defaultMethodCounter.getCount() == 1; } }
/** * Returns whether the given class would introduce any abstract methods * in the target class. */ private boolean introducesUnwantedAbstractMethods(Clazz clazz, ProgramClass targetClass) { // It's ok if the target class is already abstract and does not // have any subclasses except for maybe the source class. if ((targetClass.getAccessFlags() & (ClassConstants.ACC_ABSTRACT | ClassConstants.ACC_INTERFACE)) != 0 && (targetClass.subClasses == null || isOnlySubClass(clazz, targetClass))) { return false; } MemberCounter counter = new MemberCounter(); Set targetSet = new HashSet(); // Collect all abstract methods, and similar abstract methods in the // class hierarchy of the target class. clazz.methodsAccept(new MemberAccessFilter(ClassConstants.ACC_ABSTRACT, 0, new MultiMemberVisitor( counter, new SimilarMemberVisitor(targetClass, true, true, true, false, new MemberAccessFilter(ClassConstants.ACC_ABSTRACT, 0, new MemberCollector(false, true, true, targetSet))) ))); return targetSet.size() < counter.getCount(); }
new MultiMemberVisitor(new MemberVisitor[]
/** * Returns whether the given class would introduce any abstract methods * in the target class. */ private boolean introducesUnwantedAbstractMethods(Clazz clazz, ProgramClass targetClass) { // It's ok if the target class is already abstract and does not // have any subclasses except for maybe the source class. if ((targetClass.getAccessFlags() & (ClassConstants.ACC_ABSTRACT | ClassConstants.ACC_INTERFACE)) != 0 && (targetClass.subClasses == null || isOnlySubClass(clazz, targetClass))) { return false; } MemberCounter counter = new MemberCounter(); Set targetSet = new HashSet(); // Collect all abstract methods, and similar abstract methods in the // class hierarchy of the target class. clazz.methodsAccept(new MemberAccessFilter(ClassConstants.ACC_ABSTRACT, 0, new MultiMemberVisitor( counter, new SimilarMemberVisitor(targetClass, true, true, true, false, new MemberAccessFilter(ClassConstants.ACC_ABSTRACT, 0, new MemberCollector(false, true, true, targetSet))) ))); return targetSet.size() < counter.getCount(); }
/** * Returns whether the given class would introduce any abstract methods * in the target class. */ private boolean introducesUnwantedAbstractMethods(Clazz clazz, ProgramClass targetClass) { // It's ok if the target class is already abstract and does not // have any subclasses except for maybe the source class. if ((targetClass.getAccessFlags() & (ClassConstants.ACC_ABSTRACT | ClassConstants.ACC_INTERFACE)) != 0 && (targetClass.subClasses == null || isOnlySubClass(clazz, targetClass))) { return false; } MemberCounter counter = new MemberCounter(); Set targetSet = new HashSet(); // Collect all abstract methods, and similar abstract methods in the // class hierarchy of the target class. clazz.methodsAccept(new MemberAccessFilter(ClassConstants.ACC_ABSTRACT, 0, new MultiMemberVisitor( counter, new SimilarMemberVisitor(targetClass, true, true, true, false, new MemberAccessFilter(ClassConstants.ACC_ABSTRACT, 0, new MemberCollector(false, true, true, targetSet))) ))); return targetSet.size() < counter.getCount(); }
new MultiMemberVisitor( memberAdder, extraMemberVisitor new MemberAccessFilter(ClassConstants.ACC_STATIC, 0, new InitializerMethodFilter(null, new MultiMemberVisitor(
new MultiMemberVisitor( memberAdder, extraMemberVisitor new MemberAccessFilter(ClassConstants.ACC_STATIC, 0, new InitializerMethodFilter(null, new MultiMemberVisitor(
new MultiMemberVisitor( memberAdder, extraMemberVisitor new MemberAccessFilter(ClassConstants.ACC_STATIC, 0, new InitializerMethodFilter(null, new MultiMemberVisitor(
new MultiMemberVisitor( new MemberVisitor[] new MultiMemberVisitor( new MemberVisitor[]
new MultiMemberVisitor( new MemberVisitor[] new MultiMemberVisitor( new MemberVisitor[]
new MultiMemberVisitor( new MemberVisitor[] new MultiMemberVisitor( new MemberVisitor[]
new MultiMemberVisitor( new NamedAttributeDeleter(ClassConstants.ATTR_Code),
new MultiMemberVisitor( new NamedAttributeDeleter(ClassConstants.ATTR_Code),
new MultiMemberVisitor( new NamedAttributeDeleter(ClassConstants.ATTR_Code),
new PackageVisibleMemberInvokingClassMarker()), new AllMethodVisitor( new MultiMemberVisitor( new MemberVisitor[]
new MultiMemberVisitor( new MemberVisitor[]
new MultiMemberVisitor( new MemberVisitor[]