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.ProgramElement;
014: import de.uka.ilkd.key.java.reference.TypeReference;
015: import de.uka.ilkd.key.java.visitor.Visitor;
016: import de.uka.ilkd.key.util.ExtList;
017:
018: /**
019: * Formal parameters require a VariableSpecificationList of size() <= 1
020: * (size() == 0 for abstract methods) without initializer (for Java).
021: */
022: public class ParameterDeclaration extends VariableDeclaration {
023:
024: /**
025: * Var spec.
026: */
027: protected final ArrayOfVariableSpecification varSpec;
028:
029: /**
030: * Parameter declaration.
031: */
032:
033: public ParameterDeclaration() {
034: this .varSpec = null;
035: }
036:
037: /**
038: * Parameter declaration.
039: * @param mods a modifier array.
040: * @param typeRef a type reference.
041: * @param var the VariableSpecification belonging to this parameter declaration.
042: * @param parentIsInterfaceDeclaration a boolean set true iff
043: * the parent is an InterfaceDeclaration
044: */
045:
046: public ParameterDeclaration(Modifier[] mods, TypeReference typeRef,
047: VariableSpecification var,
048: boolean parentIsInterfaceDeclaration) {
049: super (mods, typeRef, parentIsInterfaceDeclaration);
050: this .varSpec = new ArrayOfVariableSpecification(var);
051: }
052:
053: /**
054: * Parameter declaration.
055: * @param children an ExtList of children. May contain:
056: * a VariableSpecification (specifying the parameter)
057: * a TypeReference (as reference to the type of the declared variable)
058: * several Modifier (taken as modifiers of the declaration),
059: * a Comment
060: * @param parentIsInterfaceDeclaration a boolean set true iff
061: * the parent is an InterfaceDeclaration
062: */
063:
064: public ParameterDeclaration(ExtList children,
065: boolean parentIsInterfaceDeclaration) {
066: super (children, parentIsInterfaceDeclaration);
067: this .varSpec = new ArrayOfVariableSpecification(
068: new VariableSpecification[] { (VariableSpecification) children
069: .get(VariableSpecification.class) });
070: }
071:
072: public VariableSpecification getVariableSpecification() {
073: return varSpec.getVariableSpecification(0);
074: }
075:
076: public ArrayOfVariableSpecification getVariables() {
077: return varSpec;
078: }
079:
080: /**
081: * Returns the number of children of this node.
082: * @return an int giving the number of children of this node
083: */
084:
085: public int getChildCount() {
086: int result = 0;
087: if (modArray != null)
088: result += modArray.size();
089: if (typeReference != null)
090: result++;
091: if (varSpec != null)
092: result++;
093: return result;
094: }
095:
096: /**
097: * Returns the child at the specified index in this node's "virtual"
098: * child array
099: * @param index an index into this node's "virtual" child array
100: * @return the program element at the given position
101: * @exception ArrayIndexOutOfBoundsException if <tt>index</tt> is out
102: * of bounds
103: */
104:
105: public ProgramElement getChildAt(int index) {
106: int len;
107: if (modArray != null) {
108: len = modArray.size();
109: if (len > index) {
110: return modArray.getModifier(index);
111: }
112: index -= len;
113: }
114: if (typeReference != null) {
115: if (index == 0)
116: return typeReference;
117: index--;
118: }
119: if (varSpec != null) {
120: if (index == 0)
121: return varSpec.getVariableSpecification(0);
122: }
123: throw new ArrayIndexOutOfBoundsException();
124: }
125:
126: /**
127: * Parameters are never private.
128: */
129:
130: public boolean isPrivate() {
131: return false;
132: }
133:
134: /**
135: * Parameters are never protected..
136: */
137:
138: public boolean isProtected() {
139: return false;
140: }
141:
142: /**
143: * Parameters are never "public".
144: */
145:
146: public boolean isPublic() {
147: return false;
148: }
149:
150: /**
151: * Parameters are never static.
152: */
153:
154: public boolean isStatic() {
155: return false;
156: }
157:
158: /**
159: * Parameters are never transient.
160: */
161:
162: public boolean isTransient() {
163: return false;
164: }
165:
166: /** calls the corresponding method of a visitor in order to
167: * perform some action/transformation on this element
168: * @param v the Visitor
169: */
170: public void visit(Visitor v) {
171: v.performActionOnParameterDeclaration(this);
172: }
173:
174: }
|