• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Javassist, a Java-bytecode translator toolkit.
3  * Copyright (C) 1999-2007 Shigeru Chiba. All Rights Reserved.
4  *
5  * The contents of this file are subject to the Mozilla Public License Version
6  * 1.1 (the "License"); you may not use this file except in compliance with
7  * the License.  Alternatively, the contents of this file may be used under
8  * the terms of the GNU Lesser General Public License Version 2.1 or later.
9  *
10  * Software distributed under the License is distributed on an "AS IS" basis,
11  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12  * for the specific language governing rights and limitations under the
13  * License.
14  */
15 
16 package javassist.compiler.ast;
17 
18 import javassist.compiler.TokenId;
19 import javassist.compiler.CompileError;
20 
21 /**
22  * Variable declarator.
23  */
24 public class Declarator extends ASTList implements TokenId {
25     protected int varType;
26     protected int arrayDim;
27     protected int localVar;
28     protected String qualifiedClass;    // JVM-internal representation
29 
Declarator(int type, int dim)30     public Declarator(int type, int dim) {
31         super(null);
32         varType = type;
33         arrayDim = dim;
34         localVar = -1;
35         qualifiedClass = null;
36     }
37 
Declarator(ASTList className, int dim)38     public Declarator(ASTList className, int dim) {
39         super(null);
40         varType = CLASS;
41         arrayDim = dim;
42         localVar = -1;
43         qualifiedClass = astToClassName(className, '/');
44     }
45 
46     /* For declaring a pre-defined? local variable.
47      */
Declarator(int type, String jvmClassName, int dim, int var, Symbol sym)48     public Declarator(int type, String jvmClassName, int dim,
49                       int var, Symbol sym) {
50         super(null);
51         varType = type;
52         arrayDim = dim;
53         localVar = var;
54         qualifiedClass = jvmClassName;
55         setLeft(sym);
56         append(this, null);     // initializer
57     }
58 
make(Symbol sym, int dim, ASTree init)59     public Declarator make(Symbol sym, int dim, ASTree init) {
60         Declarator d = new Declarator(this.varType, this.arrayDim + dim);
61         d.qualifiedClass = this.qualifiedClass;
62         d.setLeft(sym);
63         append(d, init);
64         return d;
65     }
66 
67     /* Returns CLASS, BOOLEAN, BYTE, CHAR, SHORT, INT, LONG, FLOAT,
68      * or DOUBLE (or VOID)
69      */
getType()70     public int getType() { return varType; }
71 
getArrayDim()72     public int getArrayDim() { return arrayDim; }
73 
addArrayDim(int d)74     public void addArrayDim(int d) { arrayDim += d; }
75 
getClassName()76     public String getClassName() { return qualifiedClass; }
77 
setClassName(String s)78     public void setClassName(String s) { qualifiedClass = s; }
79 
getVariable()80     public Symbol getVariable() { return (Symbol)getLeft(); }
81 
setVariable(Symbol sym)82     public void setVariable(Symbol sym) { setLeft(sym); }
83 
getInitializer()84     public ASTree getInitializer() {
85         ASTList t = tail();
86         if (t != null)
87             return t.head();
88         else
89             return null;
90     }
91 
setLocalVar(int n)92     public void setLocalVar(int n) { localVar = n; }
93 
getLocalVar()94     public int getLocalVar() { return localVar; }
95 
getTag()96     public String getTag() { return "decl"; }
97 
accept(Visitor v)98     public void accept(Visitor v) throws CompileError {
99         v.atDeclarator(this);
100     }
101 
astToClassName(ASTList name, char sep)102     public static String astToClassName(ASTList name, char sep) {
103         if (name == null)
104             return null;
105 
106         StringBuffer sbuf = new StringBuffer();
107         astToClassName(sbuf, name, sep);
108         return sbuf.toString();
109     }
110 
astToClassName(StringBuffer sbuf, ASTList name, char sep)111     private static void astToClassName(StringBuffer sbuf, ASTList name,
112                                        char sep) {
113         for (;;) {
114             ASTree h = name.head();
115             if (h instanceof Symbol)
116                 sbuf.append(((Symbol)h).get());
117             else if (h instanceof ASTList)
118                 astToClassName(sbuf, (ASTList)h, sep);
119 
120             name = name.tail();
121             if (name == null)
122                 break;
123 
124             sbuf.append(sep);
125         }
126     }
127 }
128