001 package com.thoughtworks.paranamer.generator;
002
003 import org.objectweb.asm.ClassAdapter;
004 import org.objectweb.asm.ClassVisitor;
005 import org.objectweb.asm.FieldVisitor;
006
007
008 /**
009 * Adapted from ASM 3.0 pagg 23-25
010 * @author Alessandro Colantoni
011 */
012 public class AddFieldAdapter extends ClassAdapter {
013 private int fAcc;
014 private String fName;
015 private String fDesc;
016 private Object fValue; // not present in ASM 3.0
017 private boolean isFieldPresent;
018
019 public AddFieldAdapter(ClassVisitor cv, int fAcc, String fName, String fDesc, Object fValue) {
020 super(cv);
021 this.fAcc = fAcc;
022 this.fName = fName;
023 this.fDesc = fDesc;
024 this.fValue= fValue;
025 }
026
027 public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
028 if (name.equals(fName)) {
029 isFieldPresent = true;
030 }
031 return cv.visitField(access, name, desc, signature, value);
032 }
033
034 public void visitEnd() {
035 if (!isFieldPresent) {
036 FieldVisitor fv = cv.visitField(fAcc, fName, fDesc, null, fValue);
037 if (fv != null) {
038 fv.visitEnd();
039 }
040 }
041 cv.visitEnd();
042 }
043 }