1 21 package proguard.classfile.visitor; 22 23 import proguard.classfile.*; 24 import proguard.classfile.util.*; 25 26 33 public class MemberClassAccessFilter 34 implements MemberVisitor 35 { 36 private Clazz referencingClass; 37 private MemberVisitor memberVisitor; 38 39 40 46 public MemberClassAccessFilter(Clazz referencingClass, 47 MemberVisitor memberVisitor) 48 { 49 this.referencingClass = referencingClass; 50 this.memberVisitor = memberVisitor; 51 } 52 53 54 56 public void visitProgramField(ProgramClass programClass, ProgramField programField) 57 { 58 if (accepted(programClass, programField.getAccessFlags())) 59 { 60 memberVisitor.visitProgramField(programClass, programField); 61 } 62 } 63 64 65 public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) 66 { 67 if (accepted(programClass, programMethod.getAccessFlags())) 68 { 69 memberVisitor.visitProgramMethod(programClass, programMethod); 70 } 71 } 72 73 74 public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) 75 { 76 if (accepted(libraryClass, libraryField.getAccessFlags())) 77 { 78 memberVisitor.visitLibraryField(libraryClass, libraryField); 79 } 80 } 81 82 83 public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) 84 { 85 if (accepted(libraryClass, libraryMethod.getAccessFlags())) 86 { 87 memberVisitor.visitLibraryMethod(libraryClass, libraryMethod); 88 } 89 } 90 91 92 94 private boolean accepted(Clazz clazz, int memberAccessFlags) 95 { 96 int accessLevel = AccessUtil.accessLevel(memberAccessFlags); 97 98 return 99 (accessLevel >= AccessUtil.PUBLIC ) || 100 (accessLevel >= AccessUtil.PRIVATE && referencingClass.equals(clazz) ) || 101 (accessLevel >= AccessUtil.PACKAGE_VISIBLE && (ClassUtil.internalPackageName(referencingClass.getName()).equals( 102 ClassUtil.internalPackageName(clazz.getName())))) || 103 (accessLevel >= AccessUtil.PROTECTED && (referencingClass.extends_(clazz) || 104 referencingClass.extendsOrImplements(clazz)) ); 105 } 106 } 107 | Popular Tags |