All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.fife.rsta.ac.java.classreader.MemberInfo Maven / Gradle / Ivy

/*
 * 03/21/2010
 *
 * Copyright (C) 2010 Robert Futrell
 * robert_futrell at users.sourceforge.net
 * http://fifesoft.com/rsyntaxtextarea
 *
 * This library is distributed under a modified BSD license.  See the included
 * RSTALanguageSupport.License.txt file for details.
 */
package org.fife.rsta.ac.java.classreader;

import java.io.DataInputStream;
import java.io.IOException;

import org.fife.rsta.ac.java.classreader.attributes.AttributeInfo;
import org.fife.rsta.ac.java.classreader.attributes.Signature;


/**
 * Base class for information about members (fields and methods).
 *
 * @author Robert Futrell
 * @version 1.0
 * @see FieldInfo
 * @see MethodInfo
 */
public abstract class MemberInfo {

	/**
	 * The class file in which this method is defined.
	 */
	protected ClassFile cf;

	/**
	 * A mask of flags used to denote access permission to and properties of
	 * this method.
	 */
	private int accessFlags; // u2

	/**
	 * Whether this member is deprecated.
	 */
	private boolean deprecated;

	/**
	 * Attribute marking a member as deprecated.
	 */
	public static final String DEPRECATED			= "Deprecated";

	/**
	 * Attribute containing index of the member's signature.
	 */
	public static final String SIGNATURE			= "Signature";

	/**
	 * Attribute containing runtime-visible annotations.
	 */
	public static final String RUNTIME_VISIBLE_ANNOTATIONS = "RuntimeVisibleAnnotations";


	/**
	 * Constructor.
	 *
	 * @param cf The class file defining this member.
	 */
	protected MemberInfo(ClassFile cf, int accessFlags) {
		this.cf = cf;
		this.accessFlags = accessFlags;
	}


	/**
	 * Returns the access flags for this field.
	 *
	 * @return The access flags, as a bit field.
	 * @see AccessFlags
	 */
	public int getAccessFlags() {
		return accessFlags;
	}


	/**
	 * Returns the parent class file.
	 *
	 * @return The parent class file.
	 */
	public ClassFile getClassFile() {
		return cf;
	}


	/**
	 * Returns the name of this member.
	 *
	 * @return The name of this member.
	 */
	public abstract String getName();


	/**
	 * Returns whether this member is deprecated.
	 *
	 * @return Whether this member is deprecated.
	 */
	public boolean isDeprecated() {
		return deprecated;
	}


	/**
	 * Returns the descriptor of this member.
	 *
	 * @return The descriptor of this member.
	 */
	public abstract String getDescriptor();


	/**
	 * Returns whether this member is final.
	 *
	 * @return Whether this member is final.
	 */
	public boolean isFinal() {
		return (getAccessFlags()&AccessFlags.ACC_FINAL)>0;
	}


	/**
	 * Returns whether this member is static.
	 *
	 * @return Whether this member is static.
	 */
	public boolean isStatic() {
		return (getAccessFlags()&AccessFlags.ACC_STATIC)>0;
	}


	/**
	 * Reads attributes common to all members.  If the specified attribute is
	 * not common to members, the attribute returned is an "unsupported"
	 * attribute.
	 *
	 * @param in The input stream to read from.
	 * @param attrName The attribute name.
	 * @param attrLength The attribute length.
	 * @return The attribute, or null if it was purposely skipped
	 *         for some reason (known to be useless for our purposes, etc.).
	 * @throws IOException If an IO error occurs.
	 */
	protected AttributeInfo readAttribute(DataInputStream in, String attrName,
										int attrLength) throws IOException {

		AttributeInfo ai = null;

		if (DEPRECATED.equals(attrName)) { // 4.7.10
			// No need to read anything else, attributeLength==0
			deprecated = true;
		}

		else if (SIGNATURE.equals(attrName)) { // 4.8.8
			//System.err.println(">>> " + attributeLength);
			int signatureIndex = in.readUnsignedShort();
			String typeSig = cf.getUtf8ValueFromConstantPool(signatureIndex);
			ai = new Signature(cf, typeSig);
		}

		else if (RUNTIME_VISIBLE_ANNOTATIONS.equals(attrName)) { // 4.8.15
			//String name = getClassFile().getClassName(false) + "." + getName();
			//System.out.println(name + ": Attribute " + attrName + " not supported");
			Util.skipBytes(in, attrLength);
			//ai = null;
		}

		else {
			//String name = getClassFile().getClassName(false) + "." + getName();
			//System.out.println(name + ": Unsupported attribute: " + attrName);
			ai = AttributeInfo.readUnsupportedAttribute(cf, in, attrName,
				attrLength);
		}

		return ai;

	}


}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy