// Path: src/main/java/jasm/util/Pair.java
// public class Pair<FIRST,SECOND> {
// 	protected final FIRST first;
// 	protected final SECOND second;	
// 	
// 	public Pair(FIRST f, SECOND s) {
// 		first=f;
// 		second=s;			
// 	}		
// 	
// 	public FIRST first() { return first; }
// 	public SECOND second() { return second; }
// 	
// 	public int hashCode() {
// 		int fhc = first == null ? 0 : first.hashCode();
// 		int shc = second == null ? 0 : second.hashCode();
// 		return fhc ^ shc; 
// 	}
// 		
// 	public boolean equals(Object o) {
// 		if(o instanceof Pair) {
// 			Pair<FIRST, SECOND> p = (Pair<FIRST, SECOND>) o;
// 			boolean r = false;
// 			if(first != null) { r = first.equals(p.first()); }
// 			else { r = p.first() == first; }
// 			if(second != null) { r &= second.equals(p.second()); }
// 			else { r &= p.second() == second; }
// 			return r;				
// 		}
// 		return false;
// 	}
// 	
// 	public String toString() {
// 		String fstr = first != null ? first.toString() : "null";
// 		String sstr = second != null ? second.toString() : "null";
// 		return "(" + fstr + ", " + sstr + ")";
// 	}
// }


import jasm.attributes.*;
import jasm.util.Pair;
import java.util.*;

	 *            The type to generate the descriptor for
	 * @param generic
	 *            True indicates generic information should be included.
	 * @return
	 */
	public static String descriptor(JvmType t, boolean generic) {
		if(t instanceof JvmType.Bool) {
			return "Z";
		} if(t instanceof JvmType.Byte) {
			return "B";
		} else if(t instanceof JvmType.Char) {
			return "C";
		} else if(t instanceof JvmType.Short) {
			return "S";
		} else if(t instanceof JvmType.Int) {
			return "I";
		} else if(t instanceof JvmType.Long) {
			return "J";
		} else if(t instanceof JvmType.Float) {
			return "F";
		} else if(t instanceof JvmType.Double) {
			return "D";
		} else if(t instanceof JvmType.Void) {
			return "V";
		} else if(t instanceof JvmType.Array) {
			JvmType.Array at = (JvmType.Array) t;
			return "[" + descriptor(at.element(),generic);
		} else if(t instanceof JvmType.Clazz) {
			JvmType.Clazz ref = (JvmType.Clazz) t;
			String r = "L" + ref.pkg().replace(".","/");

// Path: src/main/java/jasm/util/Pair.java
// public class Pair<FIRST,SECOND> {
// 	protected final FIRST first;
// 	protected final SECOND second;	
// 	
// 	public Pair(FIRST f, SECOND s) {
// 		first=f;
// 		second=s;			
// 	}		
// 	
// 	public FIRST first() { return first; }
// 	public SECOND second() { return second; }
// 	
// 	public int hashCode() {
// 		int fhc = first == null ? 0 : first.hashCode();
// 		int shc = second == null ? 0 : second.hashCode();
// 		return fhc ^ shc; 
// 	}
// 		
// 	public boolean equals(Object o) {
// 		if(o instanceof Pair) {
// 			Pair<FIRST, SECOND> p = (Pair<FIRST, SECOND>) o;
// 			boolean r = false;
// 			if(first != null) { r = first.equals(p.first()); }
// 			else { r = p.first() == first; }
// 			if(second != null) { r &= second.equals(p.second()); }
// 			else { r &= p.second() == second; }
// 			return r;				
// 		}
// 		return false;
// 	}
// 	
// 	public String toString() {
// 		String fstr = first != null ? first.toString() : "null";
// 		String sstr = second != null ? second.toString() : "null";
// 		return "(" + fstr + ", " + sstr + ")";
// 	}
// }


// Path: src/main/java/jasm/lang/ClassFile.java
import jasm.attributes.*;
import jasm.util.Pair;
import java.util.*;

	 *            The type to generate the descriptor for
	 * @param generic
	 *            True indicates generic information should be included.
	 * @return
	 */
	public static String descriptor(JvmType t, boolean generic) {
		if(t instanceof JvmType.Bool) {
			return "Z";
		} if(t instanceof JvmType.Byte) {
			return "B";
		} else if(t instanceof JvmType.Char) {
			return "C";
		} else if(t instanceof JvmType.Short) {
			return "S";
		} else if(t instanceof JvmType.Int) {
			return "I";
		} else if(t instanceof JvmType.Long) {
			return "J";
		} else if(t instanceof JvmType.Float) {
			return "F";
		} else if(t instanceof JvmType.Double) {
			return "D";
		} else if(t instanceof JvmType.Void) {
			return "V";
		} else if(t instanceof JvmType.Array) {
			JvmType.Array at = (JvmType.Array) t;
			return "[" + descriptor(at.element(),generic);
		} else if(t instanceof JvmType.Clazz) {
			JvmType.Clazz ref = (JvmType.Clazz) t;
			String r = "L" + ref.pkg().replace(".","/");

			List<Pair<String, List<JvmType.Reference>>> classes = ref.components();
