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.PrettyPrinter;
014: import de.uka.ilkd.key.java.SourceElement;
015: import de.uka.ilkd.key.java.reference.TypeReference;
016: import de.uka.ilkd.key.java.reference.TypeReferenceContainer;
017: import de.uka.ilkd.key.java.visitor.Visitor;
018: import de.uka.ilkd.key.util.ExtList;
019:
020: /**
021: * Variable declaration.
022: * taken from COMPOST and changed to achieve an immutable structure
023: */
024:
025: public abstract class VariableDeclaration extends JavaDeclaration
026: implements TypeReferenceContainer {
027:
028: /**
029: * Type reference.
030: */
031:
032: protected final TypeReference typeReference;
033:
034: /** this field stores if parent is an InterfaceDeclaration because we will be
035: * unable to walk the tree upwards to check this
036: */
037: protected final boolean parentIsInterfaceDeclaration;
038:
039: /**
040: * Variable declaration.
041: */
042:
043: public VariableDeclaration() {
044: typeReference = null;
045: parentIsInterfaceDeclaration = false;
046: }
047:
048: /**
049: * Variable declaration.
050: * @param mods a modifier mutable list.
051: * @param typeRef a type reference.
052: * @param parentIsInterfaceDeclaration a boolean set true iff
053: * the parent is an InterfaceDeclaration
054: */
055: public VariableDeclaration(Modifier[] mods, TypeReference typeRef,
056: boolean parentIsInterfaceDeclaration) {
057: super (mods);
058: typeReference = typeRef;
059: this .parentIsInterfaceDeclaration = parentIsInterfaceDeclaration;
060: }
061:
062: /**
063: * Variable declaration.
064: * @param mods a modifier immutable list.
065: * @param typeRef a type reference.
066: * @param parentIsInterfaceDeclaration a boolean set true iff
067: * the parent is an InterfaceDeclaration
068: */
069: public VariableDeclaration(ArrayOfModifier mods,
070: TypeReference typeRef, boolean parentIsInterfaceDeclaration) {
071: super (mods);
072: typeReference = typeRef;
073: this .parentIsInterfaceDeclaration = parentIsInterfaceDeclaration;
074: }
075:
076: /**
077: * Variable declaration.
078: * @param children an ExtList of children. May
079: * include:
080: * a TypeReference (as reference to the type of the declared variable)
081: * several Modifier (taken as modifiers of the declaration),
082: * Comments
083: * @param parentIsInterfaceDeclaration a boolean set true iff
084: * the parent is an InterfaceDeclaration
085: */
086: public VariableDeclaration(ExtList children,
087: boolean parentIsInterfaceDeclaration) {
088: super (children);
089: typeReference = (TypeReference) children
090: .get(TypeReference.class);
091: this .parentIsInterfaceDeclaration = parentIsInterfaceDeclaration;
092: }
093:
094: public SourceElement getFirstElement() {
095: return getChildAt(0).getFirstElement();
096: }
097:
098: public SourceElement getLastElement() {
099: return getChildAt(getChildCount() - 1).getLastElement();
100: }
101:
102: /**
103: * Get the number of type references in this container.
104: * @return the number of type references.
105: */
106:
107: public int getTypeReferenceCount() {
108: return (typeReference != null) ? 1 : 0;
109: }
110:
111: /*
112: Return the type reference at the specified index in this node's
113: "virtual" type reference array.
114: @param index an index for a type reference.
115: @return the type reference with the given index.
116: @exception ArrayIndexOutOfBoundsException if <tt>index</tt> is out
117: of bounds.
118: */
119:
120: public TypeReference getTypeReferenceAt(int index) {
121: if (typeReference != null && index == 0) {
122: return typeReference;
123: }
124: throw new ArrayIndexOutOfBoundsException();
125: }
126:
127: /**
128: * Get type reference.
129: * @return the type reference.
130: */
131:
132: public TypeReference getTypeReference() {
133: return typeReference;
134: }
135:
136: /**
137: * Get variables.
138: * @return the variable specification array wrapper
139: */
140:
141: public abstract ArrayOfVariableSpecification getVariables();
142:
143: /**
144: * Test whether the declaration is final.
145: */
146:
147: public boolean isFinal() {
148: return super .isFinal();
149: }
150:
151: /** this field stores if parent is an InterfaceDeclaration because we will be
152: * unable to walk the tree upwards to check this
153: */
154: public boolean parentIsInterfaceDeclaration() {
155: return parentIsInterfaceDeclaration;
156: }
157:
158: /** calls the corresponding method of a visitor in order to
159: * perform some action/transformation on this element
160: * @param v the Visitor
161: */
162: public void visit(Visitor v) {
163: v.performActionOnVariableDeclaration(this );
164: }
165:
166: public void prettyPrint(PrettyPrinter p) throws java.io.IOException {
167: p.printVariableDeclaration(this);
168: }
169: }
|