1 21 package proguard.classfile.editor; 22 23 import proguard.classfile.util.*; 24 import proguard.classfile.visitor.*; 25 import proguard.classfile.constant.visitor.ConstantVisitor; 26 import proguard.classfile.constant.*; 27 import proguard.classfile.*; 28 29 35 public class AccessFixer 36 extends SimplifiedVisitor 37 implements ConstantVisitor, 38 ClassVisitor, 39 MemberVisitor 40 { 41 private Clazz referencingClass; 42 43 44 46 public void visitAnyConstant(Clazz clazz, Constant constant) {} 47 48 49 public void visitStringConstant(Clazz clazz, StringConstant stringConstant) 50 { 51 referencingClass = clazz; 52 53 stringConstant.referencedClassAccept(this); 56 stringConstant.referencedMemberAccept(this); 57 } 58 59 60 public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) 61 { 62 referencingClass = clazz; 63 64 refConstant.referencedMemberAccept(this); 66 } 67 68 69 public void visitClassConstant(Clazz clazz, ClassConstant classConstant) 70 { 71 referencingClass = clazz; 72 73 classConstant.referencedClassAccept(this); 75 } 76 77 78 80 public void visitLibraryClass(LibraryClass libraryClass) {} 81 82 83 public void visitProgramClass(ProgramClass programClass) 84 { 85 int currentAccessFlags = programClass.getAccessFlags(); 86 int currentAccessLevel = AccessUtil.accessLevel(currentAccessFlags); 87 88 Clazz referencingClass = this.referencingClass; 90 int requiredAccessLevel = 91 programClass.equals(this.referencingClass) ? AccessUtil.PRIVATE : 92 inSamePackage(programClass, referencingClass) ? AccessUtil.PACKAGE_VISIBLE : 93 referencingClass.extends_(programClass) ? AccessUtil.PROTECTED : 94 AccessUtil.PUBLIC; 95 96 if (currentAccessLevel < requiredAccessLevel) 98 { 99 programClass.u2accessFlags = 100 AccessUtil.replaceAccessFlags(currentAccessFlags, 101 AccessUtil.accessFlags(requiredAccessLevel)); 102 } 103 } 104 105 106 108 public void visitLibraryMember(LibraryClass libraryClass, LibraryMember libraryMember) {} 109 110 111 public void visitProgramMember(ProgramClass programClass, ProgramMember programMember) 112 { 113 int currentAccessFlags = programMember.getAccessFlags(); 114 int currentAccessLevel = AccessUtil.accessLevel(currentAccessFlags); 115 116 int requiredAccessLevel = 118 programClass.equals(referencingClass) ? AccessUtil.PRIVATE : 119 inSamePackage(programClass, referencingClass) ? AccessUtil.PACKAGE_VISIBLE : 120 AccessUtil.PUBLIC; 121 if (currentAccessLevel < requiredAccessLevel) 123 { 124 programMember.u2accessFlags = 125 AccessUtil.replaceAccessFlags(currentAccessFlags, 126 AccessUtil.accessFlags(requiredAccessLevel)); 127 } 128 } 129 130 131 133 private boolean inSamePackage(ProgramClass class1, Clazz class2) 134 { 135 return ClassUtil.internalPackageName(class1.getName()).equals( 136 ClassUtil.internalPackageName(class2.getName())); 137 } 138 } 139 | Popular Tags |