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    }