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.TokenId; 1969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.compiler.CompileError; 2069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 2169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/** 2269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Variable declarator. 2369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 2469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalpublic class Declarator extends ASTList implements TokenId { 2569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal protected int varType; 2669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal protected int arrayDim; 2769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal protected int localVar; 2869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal protected String qualifiedClass; // JVM-internal representation 2969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 3069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public Declarator(int type, int dim) { 3169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal super(null); 3269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal varType = type; 3369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal arrayDim = dim; 3469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal localVar = -1; 3569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal qualifiedClass = null; 3669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 3769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 3869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public Declarator(ASTList className, int dim) { 3969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal super(null); 4069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal varType = CLASS; 4169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal arrayDim = dim; 4269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal localVar = -1; 4369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal qualifiedClass = astToClassName(className, '/'); 4469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 4569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 4669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal /* For declaring a pre-defined? local variable. 4769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 4869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public Declarator(int type, String jvmClassName, int dim, 4969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int var, Symbol sym) { 5069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal super(null); 5169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal varType = type; 5269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal arrayDim = dim; 5369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal localVar = var; 5469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal qualifiedClass = jvmClassName; 5569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal setLeft(sym); 5669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal append(this, null); // initializer 5769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 5869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 5969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public Declarator make(Symbol sym, int dim, ASTree init) { 6069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal Declarator d = new Declarator(this.varType, this.arrayDim + dim); 6169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal d.qualifiedClass = this.qualifiedClass; 6269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal d.setLeft(sym); 6369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal append(d, init); 6469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return d; 6569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 6669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 6769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal /* Returns CLASS, BOOLEAN, BYTE, CHAR, SHORT, INT, LONG, FLOAT, 6869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * or DOUBLE (or VOID) 6969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 7069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public int getType() { return varType; } 7169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 7269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public int getArrayDim() { return arrayDim; } 7369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 7469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void addArrayDim(int d) { arrayDim += d; } 7569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 7669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public String getClassName() { return qualifiedClass; } 7769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 7869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void setClassName(String s) { qualifiedClass = s; } 7969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 8069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public Symbol getVariable() { return (Symbol)getLeft(); } 8169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 8269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void setVariable(Symbol sym) { setLeft(sym); } 8369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 8469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public ASTree getInitializer() { 8569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ASTList t = tail(); 8669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (t != null) 8769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return t.head(); 8869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else 8969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return null; 9069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 9169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 9269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void setLocalVar(int n) { localVar = n; } 9369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 9469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public int getLocalVar() { return localVar; } 9569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 9669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public String getTag() { return "decl"; } 9769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 9869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void accept(Visitor v) throws CompileError { 9969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal v.atDeclarator(this); 10069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 10169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 10269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public static String astToClassName(ASTList name, char sep) { 10369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (name == null) 10469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return null; 10569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 10669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal StringBuffer sbuf = new StringBuffer(); 10769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal astToClassName(sbuf, name, sep); 10869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return sbuf.toString(); 10969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 11069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 11169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private static void astToClassName(StringBuffer sbuf, ASTList name, 11269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal char sep) { 11369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (;;) { 11469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ASTree h = name.head(); 11569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (h instanceof Symbol) 11669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal sbuf.append(((Symbol)h).get()); 11769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else if (h instanceof ASTList) 11869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal astToClassName(sbuf, (ASTList)h, sep); 11969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 12069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal name = name.tail(); 12169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (name == null) 12269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal break; 12369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 12469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal sbuf.append(sep); 12569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 12669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 12769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal} 128