001: // This file is part of KeY - Integrated Deductive Software Design
002: // Copyright (C) 2001-2007 Universitaet Karlsruhe, Germany
003: // Universitaet Koblenz-Landau, Germany
004: // Chalmers University of Technology, Sweden
005: //
006: // The KeY system is protected by the GNU General Public License.
007: // See LICENSE.TXT for details.
008: //
009: //
010:
011: package de.uka.ilkd.key.java.declaration;
012:
013: import de.uka.ilkd.key.java.LoopInitializer;
014: import de.uka.ilkd.key.java.PrettyPrinter;
015: import de.uka.ilkd.key.java.ProgramElement;
016: import de.uka.ilkd.key.java.reference.TypeReference;
017: import de.uka.ilkd.key.java.visitor.Visitor;
018: import de.uka.ilkd.key.util.ExtList;
019:
020: /**
021: * Local variable declaration.
022: * taken from COMPOST and changed to achieve an immutable structure
023: */
024:
025: public class LocalVariableDeclaration extends VariableDeclaration
026: implements LoopInitializer {
027:
028: /**
029: * Var specs.
030: */
031:
032: protected final ArrayOfVariableSpecification varSpecs;
033:
034: /**
035: * Local variable declaration.
036: */
037:
038: public LocalVariableDeclaration() {
039: super ();
040: this .varSpecs = null;
041: }
042:
043: /**
044: * Local variable declaration.
045: * @param mods a modifier array.
046: * @param typeRef a type reference.
047: * @param vars a variable specification array.
048: */
049: public LocalVariableDeclaration(Modifier[] mods,
050: TypeReference typeRef, VariableSpecification[] vars) {
051: super (mods, typeRef, false);
052: this .varSpecs = new ArrayOfVariableSpecification(vars);
053: }
054:
055: /**
056: * Local variable declaration which declared exactly
057: * one variable.
058: * @param typeRef a type reference.
059: * @param var the variable specification
060: */
061: public LocalVariableDeclaration(TypeReference typeRef,
062: VariableSpecification var) {
063: this (new ArrayOfModifier(new Modifier[0]), typeRef, var);
064: }
065:
066: /**
067: * Local variable declaration.
068: * @param mods a modifier array.
069: * @param typeRef a type reference.
070: * @param var a variable specification .
071: */
072: public LocalVariableDeclaration(ArrayOfModifier mods,
073: TypeReference typeRef, VariableSpecification var) {
074: super (mods, typeRef, false);
075: this .varSpecs = new ArrayOfVariableSpecification(var);
076: }
077:
078: /**
079: * Local variable declaration.
080: * @param mods a modifier array.
081: * @param typeRef a type reference.
082: * @param vars a variable specification array.
083: */
084: public LocalVariableDeclaration(ArrayOfModifier mods,
085: TypeReference typeRef, VariableSpecification[] vars) {
086: super (mods, typeRef, false);
087: this .varSpecs = new ArrayOfVariableSpecification(vars);
088: }
089:
090: /**
091: * Local variable declaration.
092: * @param children an ExtList containing the children. May include:
093: * several VariableSpecification (specifying the declared local variable),
094: * a TypeReference (as reference to the type of the declared variable),
095: * several Modifier (taken as modifiers of the declaration),
096: * a Comment
097: */
098:
099: public LocalVariableDeclaration(ExtList children) {
100: super (children, false);
101:
102: this .varSpecs = new ArrayOfVariableSpecification(
103: (VariableSpecification[]) children
104: .collect(VariableSpecification.class));
105: }
106:
107: public ArrayOfVariableSpecification getVariableSpecifications() {
108: return varSpecs;
109: }
110:
111: public ArrayOfVariableSpecification getVariables() {
112: return varSpecs;
113: }
114:
115: /**
116: * Returns the number of children of this node.
117: * @return an int giving the number of children of this node
118: */
119:
120: public int getChildCount() {
121: int result = 0;
122: if (modArray != null)
123: result += modArray.size();
124: if (typeReference != null)
125: result++;
126: if (varSpecs != null)
127: result += varSpecs.size();
128: return result;
129: }
130:
131: /**
132: * Returns the child at the specified index in this node's "virtual"
133: * child array
134: * @param index an index into this node's "virtual" child array
135: * @return the program element at the given position
136: * @exception ArrayIndexOutOfBoundsException if <tt>index</tt> is out
137: * of bounds
138: */
139:
140: public ProgramElement getChildAt(int index) {
141: int len;
142: if (modArray != null) {
143: len = modArray.size();
144: if (len > index) {
145: return modArray.getModifier(index);
146: }
147: index -= len;
148: }
149: if (typeReference != null) {
150: if (index == 0)
151: return typeReference;
152: index--;
153: }
154: if (varSpecs != null) {
155: return varSpecs.getVariableSpecification(index);
156: }
157: throw new ArrayIndexOutOfBoundsException();
158: }
159:
160: /**
161: * Local variables are never private.
162: */
163:
164: public boolean isPrivate() {
165: return false;
166: }
167:
168: /**
169: * Local variables are never protected..
170: */
171:
172: public boolean isProtected() {
173: return false;
174: }
175:
176: /**
177: * Local variables are never "public".
178: */
179:
180: public boolean isPublic() {
181: return false;
182: }
183:
184: /**
185: * Local variables are never static.
186: */
187:
188: public boolean isStatic() {
189: return false;
190: }
191:
192: /**
193: * Local variables are never transient.
194: */
195:
196: public boolean isTransient() {
197: return false;
198: }
199:
200: /** calls the corresponding method of a visitor in order to
201: * perform some action/transformation on this element
202: * @param v the Visitor
203: */
204: public void visit(Visitor v) {
205: v.performActionOnLocalVariableDeclaration(this );
206: }
207:
208: public void prettyPrint(PrettyPrinter p) throws java.io.IOException {
209: p.printLocalVariableDeclaration(this);
210: }
211:
212: }
|