/* Software Name : AsmDex
* Version : 1.0
*
* Copyright © 2012 France Télécom
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.ow2.asmdex;
import org.ow2.asmdex.structureWriter.ConstantPool;
import org.ow2.asmdex.structureWriter.Field;
/**
* Class visiting a Field and registering it in order to write it.
*
* @author Julien Névo.
*/
public class FieldWriter extends FieldVisitor {
private ConstantPool constantPool;
/**
* The Field managed by this Class.
*/
private Field field;
/**
* Constructor of a Field Writer.
* @param constantPool the ConstantPool of the Application.
* @param classOwningName the name of the Class owning the Field.
* @param access the access of the Field.
* @param name the name of the Field.
* @param desc the description of the Field.
* @param signature the Signature of the Field. May be Null.
* @param value the value of the Field. May be Null.
*/
public FieldWriter(ConstantPool constantPool, String classOwningName, int access,
String name, String desc, String[] signature, Object value) {
super(Opcodes.ASM4);
this.constantPool = constantPool;
// Registers the Field in the Field constant pool.
field = constantPool.addFieldToConstantPool(name, desc, classOwningName, access,
signature, value);
}
// -----------------------------------------------------
// Getters and Setters.
// -----------------------------------------------------
/**
* Returns the Field managed by the FieldWriter.
* @return the Field managed by the FieldWriter.
*/
public Field getField() {
return field;
}
// -----------------------------------------------------
// Visitor methods.
// -----------------------------------------------------
@Override
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
if (ApplicationWriter.DISPLAY_WRITER_INFORMATION) {
System.out.println(" FieldWriter : visitAnnotation(). "
+ "Desc = " + desc
+ ", visible = " + visible
);
}
// Creates an AnnotationItem, incomplete for now (no Elements), and registers it to the Class.
// We do not add it to the Constant Pool now because of this incompleteness.
AnnotationWriter annotationWriter = AnnotationWriter.createAnnotationWriter(desc, visible, constantPool, null);
field.addAnnotationItem(annotationWriter.getAnnotationItem());
return annotationWriter;
}
@Override
public void visitEnd() {
if (ApplicationWriter.DISPLAY_WRITER_INFORMATION) {
System.out.println(" FieldWriter : visitEnd().");
}
// Now that the annotation_set_item are fully known, we can register it to the Constant Pool.
// Nothing happens if the Field doesn't contain any annotation_set_items.
constantPool.addAnnotationSetItemToConstantPool(field.getAnnotationSetItem());
}
@Override
public void visitAttribute(Object attr) {
// This method has no effect, as Attributes are not supported by AsmDex.
}
}