169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/* 269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Javassist, a Java-bytecode translator toolkit. 369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Copyright (C) 1999-2007 Shigeru Chiba. All Rights Reserved. 469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * 569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * The contents of this file are subject to the Mozilla Public License Version 669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * 1.1 (the "License"); you may not use this file except in compliance with 769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * the License. Alternatively, the contents of this file may be used under 869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * the terms of the GNU Lesser General Public License Version 2.1 or later. 969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * 1069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Software distributed under the License is distributed on an "AS IS" basis, 1169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 1269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * for the specific language governing rights and limitations under the 1369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * License. 1469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 1569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 1669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalpackage javassist.compiler.ast; 1769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 1869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.compiler.CompileError; 1969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 2069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/** 2169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * A linked list. 2269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * The right subtree must be an ASTList object or null. 2369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 2469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalpublic class ASTList extends ASTree { 2569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private ASTree left; 2669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private ASTList right; 2769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 2869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public ASTList(ASTree _head, ASTList _tail) { 2969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal left = _head; 3069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal right = _tail; 3169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 3269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 3369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public ASTList(ASTree _head) { 3469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal left = _head; 3569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal right = null; 3669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 3769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 3869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public static ASTList make(ASTree e1, ASTree e2, ASTree e3) { 3969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return new ASTList(e1, new ASTList(e2, new ASTList(e3))); 4069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 4169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 4269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public ASTree getLeft() { return left; } 4369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 4469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public ASTree getRight() { return right; } 4569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 4669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void setLeft(ASTree _left) { left = _left; } 4769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 4869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void setRight(ASTree _right) { 4969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal right = (ASTList)_right; 5069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 5169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 5269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal /** 5369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Returns the car part of the list. 5469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 5569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public ASTree head() { return left; } 5669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 5769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void setHead(ASTree _head) { 5869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal left = _head; 5969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 6069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 6169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal /** 6269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Returns the cdr part of the list. 6369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 6469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public ASTList tail() { return right; } 6569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 6669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void setTail(ASTList _tail) { 6769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal right = _tail; 6869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 6969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 7069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void accept(Visitor v) throws CompileError { v.atASTList(this); } 7169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 7269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public String toString() { 7369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal StringBuffer sbuf = new StringBuffer(); 7469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal sbuf.append("(<"); 7569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal sbuf.append(getTag()); 7669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal sbuf.append('>'); 7769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ASTList list = this; 7869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (list != null) { 7969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal sbuf.append(' '); 8069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ASTree a = list.left; 8169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal sbuf.append(a == null ? "<null>" : a.toString()); 8269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal list = list.right; 8369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 8469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 8569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal sbuf.append(')'); 8669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return sbuf.toString(); 8769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 8869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 8969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal /** 9069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Returns the number of the elements in this list. 9169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 9269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public int length() { 9369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return length(this); 9469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 9569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 9669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public static int length(ASTList list) { 9769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (list == null) 9869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return 0; 9969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 10069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int n = 0; 10169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (list != null) { 10269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal list = list.right; 10369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ++n; 10469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 10569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 10669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return n; 10769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 10869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 10969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal /** 11069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Returns a sub list of the list. The sub list begins with the 11169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * n-th element of the list. 11269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * 11369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * @param nth zero or more than zero. 11469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 11569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public ASTList sublist(int nth) { 11669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ASTList list = this; 11769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (nth-- > 0) 11869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal list = list.right; 11969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 12069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return list; 12169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 12269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 12369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal /** 12469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Substitutes <code>newObj</code> for <code>oldObj</code> in the 12569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * list. 12669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 12769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public boolean subst(ASTree newObj, ASTree oldObj) { 12869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (ASTList list = this; list != null; list = list.right) 12969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (list.left == oldObj) { 13069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal list.left = newObj; 13169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return true; 13269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 13369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 13469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return false; 13569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 13669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 13769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal /** 13869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Appends an object to a list. 13969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 14069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public static ASTList append(ASTList a, ASTree b) { 14169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return concat(a, new ASTList(b)); 14269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 14369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 14469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal /** 14569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Concatenates two lists. 14669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 14769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public static ASTList concat(ASTList a, ASTList b) { 14869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (a == null) 14969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return b; 15069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else { 15169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ASTList list = a; 15269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (list.right != null) 15369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal list = list.right; 15469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 15569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal list.right = b; 15669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return a; 15769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 15869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 15969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal} 160