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

com.feilong.lib.javassist.compiler.ast.ASTList Maven / Gradle / Ivy

Go to download

feilong is a suite of core and expanded libraries that include utility classes, http, excel,cvs, io classes, and much much more.

There is a newer version: 4.3.0
Show newest version
/*
 * Javassist, a Java-bytecode translator toolkit.
 * Copyright (C) 1999- Shigeru Chiba. All Rights Reserved.
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License.  Alternatively, the contents of this file may be used under
 * the terms of the GNU Lesser General Public License Version 2.1 or later,
 * or the Apache License Version 2.0.
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 */

package com.feilong.lib.javassist.compiler.ast;

import com.feilong.lib.javassist.compiler.CompileError;

/**
 * A linked list.
 * The right subtree must be an ASTList object or null.
 */
public class ASTList extends ASTree{

    /** default serialVersionUID */
    private static final long serialVersionUID = 1L;

    private ASTree            left;

    private ASTList           right;

    public ASTList(ASTree _head, ASTList _tail){
        left = _head;
        right = _tail;
    }

    public ASTList(ASTree _head){
        left = _head;
        right = null;
    }

    public static ASTList make(ASTree e1,ASTree e2,ASTree e3){
        return new ASTList(e1, new ASTList(e2, new ASTList(e3)));
    }

    @Override
    public ASTree getLeft(){
        return left;
    }

    @Override
    public ASTree getRight(){
        return right;
    }

    @Override
    public void setLeft(ASTree _left){
        left = _left;
    }

    @Override
    public void setRight(ASTree _right){
        right = (ASTList) _right;
    }

    /**
     * Returns the car part of the list.
     */
    public ASTree head(){
        return left;
    }

    public void setHead(ASTree _head){
        left = _head;
    }

    /**
     * Returns the cdr part of the list.
     */
    public ASTList tail(){
        return right;
    }

    public void setTail(ASTList _tail){
        right = _tail;
    }

    @Override
    public void accept(Visitor v) throws CompileError{
        v.atASTList(this);
    }

    @Override
    public String toString(){
        StringBuffer sbuf = new StringBuffer();
        sbuf.append("(<");
        sbuf.append(getTag());
        sbuf.append('>');
        ASTList list = this;
        while (list != null){
            sbuf.append(' ');
            ASTree a = list.left;
            sbuf.append(a == null ? "" : a.toString());
            list = list.right;
        }

        sbuf.append(')');
        return sbuf.toString();
    }

    /**
     * Returns the number of the elements in this list.
     */
    public int length(){
        return length(this);
    }

    public static int length(ASTList list){
        if (list == null){
            return 0;
        }

        int n = 0;
        while (list != null){
            list = list.right;
            ++n;
        }

        return n;
    }

    /**
     * Returns a sub list of the list. The sub list begins with the
     * n-th element of the list.
     *
     * @param nth
     *            zero or more than zero.
     */
    public ASTList sublist(int nth){
        ASTList list = this;
        while (nth-- > 0){
            list = list.right;
        }

        return list;
    }

    /**
     * Substitutes newObj for oldObj in the
     * list.
     */
    public boolean subst(ASTree newObj,ASTree oldObj){
        for (ASTList list = this; list != null; list = list.right){
            if (list.left == oldObj){
                list.left = newObj;
                return true;
            }
        }

        return false;
    }

    /**
     * Appends an object to a list.
     */
    public static ASTList append(ASTList a,ASTree b){
        return concat(a, new ASTList(b));
    }

    /**
     * Concatenates two lists.
     */
    public static ASTList concat(ASTList a,ASTList b){
        if (a == null){
            return b;
        }
        ASTList list = a;
        while (list.right != null){
            list = list.right;
        }

        list.right = b;
        return a;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy