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