47 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 48 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 49 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 50 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 51 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 52 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 53 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 54 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 55 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 56 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 57 * THE POSSIBILITY OF SUCH DAMAGE. 58 */ 59 60 package jdk.internal.org.objectweb.asm.commons; 61 62 import jdk.internal.org.objectweb.asm.AnnotationVisitor; 63 import jdk.internal.org.objectweb.asm.ClassVisitor; 64 import jdk.internal.org.objectweb.asm.FieldVisitor; 65 import jdk.internal.org.objectweb.asm.MethodVisitor; 66 import jdk.internal.org.objectweb.asm.Opcodes; 67 68 /** 69 * A {@link ClassVisitor} for type remapping. 70 * 71 * @author Eugene Kuleshov 72 */ 73 public class RemappingClassAdapter extends ClassVisitor { 74 75 protected final Remapper remapper; 76 77 protected String className; 78 79 public RemappingClassAdapter(final ClassVisitor cv, final Remapper remapper) 80 { 81 this(Opcodes.ASM4, cv, remapper); 82 } 83 84 protected RemappingClassAdapter( 85 final int api, 86 final ClassVisitor cv, 87 final Remapper remapper) 88 { 89 super(api, cv); 90 this.remapper = remapper; 91 } 92 93 @Override 94 public void visit( 95 int version, 96 int access, 97 String name, 98 String signature, 99 String superName, 100 String[] interfaces) 101 { 102 this.className = name; 103 super.visit(version, 104 access, 105 remapper.mapType(name), 106 remapper.mapSignature(signature, false), 107 remapper.mapType(superName), 108 interfaces == null ? null 109 : remapper.mapTypes(interfaces)); 110 } 111 112 @Override 113 public AnnotationVisitor visitAnnotation(String desc, boolean visible) { 114 AnnotationVisitor av; 115 av = super.visitAnnotation(remapper.mapDesc(desc), visible); 116 return av == null ? null : createRemappingAnnotationAdapter(av); 117 } 118 119 @Override 120 public FieldVisitor visitField( 121 int access, 122 String name, 123 String desc, 124 String signature, 125 Object value) 126 { 127 FieldVisitor fv = super.visitField(access, 128 remapper.mapFieldName(className, name, desc), 129 remapper.mapDesc(desc), 130 remapper.mapSignature(signature, true), 131 remapper.mapValue(value)); 132 return fv == null ? null : createRemappingFieldAdapter(fv); 133 } 134 135 @Override 136 public MethodVisitor visitMethod( 137 int access, 138 String name, 139 String desc, 140 String signature, 141 String[] exceptions) 142 { 143 String newDesc = remapper.mapMethodDesc(desc); 144 MethodVisitor mv = super.visitMethod(access, 145 remapper.mapMethodName(className, name, desc), 146 newDesc, 147 remapper.mapSignature(signature, false), 148 exceptions == null ? null : remapper.mapTypes(exceptions)); 149 return mv == null ? null : createRemappingMethodAdapter(access, newDesc, mv); 150 } 151 152 @Override 153 public void visitInnerClass( 154 String name, 155 String outerName, 156 String innerName, 157 int access) 158 { 159 super.visitInnerClass(remapper.mapType(name), 160 outerName == null ? null : remapper.mapType(outerName), 161 innerName, // TODO should it be changed? 162 access); 163 } 164 165 @Override 166 public void visitOuterClass(String owner, String name, String desc) { 167 super.visitOuterClass(remapper.mapType(owner), 168 name == null ? null : remapper.mapMethodName(owner, name, desc), 169 desc == null ? null : remapper.mapMethodDesc(desc)); 170 } 171 172 protected FieldVisitor createRemappingFieldAdapter(FieldVisitor fv) { 173 return new RemappingFieldAdapter(fv, remapper); 174 } 175 176 protected MethodVisitor createRemappingMethodAdapter( 177 int access, 178 String newDesc, 179 MethodVisitor mv) 180 { 181 return new RemappingMethodAdapter(access, newDesc, mv, remapper); 182 } 183 184 protected AnnotationVisitor createRemappingAnnotationAdapter( 185 AnnotationVisitor av) 186 { 187 return new RemappingAnnotationAdapter(av, remapper); 188 } 189 } | 47 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 48 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 49 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 50 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 51 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 52 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 53 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 54 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 55 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 56 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 57 * THE POSSIBILITY OF SUCH DAMAGE. 58 */ 59 60 package jdk.internal.org.objectweb.asm.commons; 61 62 import jdk.internal.org.objectweb.asm.AnnotationVisitor; 63 import jdk.internal.org.objectweb.asm.ClassVisitor; 64 import jdk.internal.org.objectweb.asm.FieldVisitor; 65 import jdk.internal.org.objectweb.asm.MethodVisitor; 66 import jdk.internal.org.objectweb.asm.Opcodes; 67 import jdk.internal.org.objectweb.asm.TypePath; 68 69 /** 70 * A {@link ClassVisitor} for type remapping. 71 * 72 * @author Eugene Kuleshov 73 */ 74 public class RemappingClassAdapter extends ClassVisitor { 75 76 protected final Remapper remapper; 77 78 protected String className; 79 80 public RemappingClassAdapter(final ClassVisitor cv, final Remapper remapper) { 81 this(Opcodes.ASM5, cv, remapper); 82 } 83 84 protected RemappingClassAdapter(final int api, final ClassVisitor cv, 85 final Remapper remapper) { 86 super(api, cv); 87 this.remapper = remapper; 88 } 89 90 @Override 91 public void visit(int version, int access, String name, String signature, 92 String superName, String[] interfaces) { 93 this.className = name; 94 super.visit(version, access, remapper.mapType(name), remapper 95 .mapSignature(signature, false), remapper.mapType(superName), 96 interfaces == null ? null : remapper.mapTypes(interfaces)); 97 } 98 99 @Override 100 public AnnotationVisitor visitAnnotation(String desc, boolean visible) { 101 AnnotationVisitor av = super.visitAnnotation(remapper.mapDesc(desc), 102 visible); 103 return av == null ? null : createRemappingAnnotationAdapter(av); 104 } 105 106 @Override 107 public AnnotationVisitor visitTypeAnnotation(int typeRef, 108 TypePath typePath, String desc, boolean visible) { 109 AnnotationVisitor av = super.visitTypeAnnotation(typeRef, typePath, 110 remapper.mapDesc(desc), visible); 111 return av == null ? null : createRemappingAnnotationAdapter(av); 112 } 113 114 @Override 115 public FieldVisitor visitField(int access, String name, String desc, 116 String signature, Object value) { 117 FieldVisitor fv = super.visitField(access, 118 remapper.mapFieldName(className, name, desc), 119 remapper.mapDesc(desc), remapper.mapSignature(signature, true), 120 remapper.mapValue(value)); 121 return fv == null ? null : createRemappingFieldAdapter(fv); 122 } 123 124 @Override 125 public MethodVisitor visitMethod(int access, String name, String desc, 126 String signature, String[] exceptions) { 127 String newDesc = remapper.mapMethodDesc(desc); 128 MethodVisitor mv = super.visitMethod(access, remapper.mapMethodName( 129 className, name, desc), newDesc, remapper.mapSignature( 130 signature, false), 131 exceptions == null ? null : remapper.mapTypes(exceptions)); 132 return mv == null ? null : createRemappingMethodAdapter(access, 133 newDesc, mv); 134 } 135 136 @Override 137 public void visitInnerClass(String name, String outerName, 138 String innerName, int access) { 139 // TODO should innerName be changed? 140 super.visitInnerClass(remapper.mapType(name), outerName == null ? null 141 : remapper.mapType(outerName), innerName, access); 142 } 143 144 @Override 145 public void visitOuterClass(String owner, String name, String desc) { 146 super.visitOuterClass(remapper.mapType(owner), name == null ? null 147 : remapper.mapMethodName(owner, name, desc), 148 desc == null ? null : remapper.mapMethodDesc(desc)); 149 } 150 151 protected FieldVisitor createRemappingFieldAdapter(FieldVisitor fv) { 152 return new RemappingFieldAdapter(fv, remapper); 153 } 154 155 protected MethodVisitor createRemappingMethodAdapter(int access, 156 String newDesc, MethodVisitor mv) { 157 return new RemappingMethodAdapter(access, newDesc, mv, remapper); 158 } 159 160 protected AnnotationVisitor createRemappingAnnotationAdapter( 161 AnnotationVisitor av) { 162 return new RemappingAnnotationAdapter(av, remapper); 163 } 164 } |