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.JavaNonTerminalProgramElement;
014: import de.uka.ilkd.key.java.ProgramElement;
015: import de.uka.ilkd.key.java.SourceElement;
016: import de.uka.ilkd.key.java.reference.ArrayOfTypeReference;
017: import de.uka.ilkd.key.java.reference.TypeReference;
018: import de.uka.ilkd.key.java.reference.TypeReferenceContainer;
019: import de.uka.ilkd.key.util.ExtList;
020:
021: /**
022: * Inheritance specification.
023: * @author <TT>AutoDoc</TT>
024: */
025:
026: public abstract class InheritanceSpecification extends
027: JavaNonTerminalProgramElement implements TypeReferenceContainer {
028:
029: /**
030: * Supertypes.
031: */
032:
033: protected final ArrayOfTypeReference super types;
034:
035: /**
036: * Inheritance specification.
037: */
038:
039: public InheritanceSpecification() {
040: this .super types = null;
041: }
042:
043: /**
044: * Inheritance specification.
045: * @param supertype a type reference.
046: */
047:
048: public InheritanceSpecification(TypeReference super type) {
049: this .super types = new ArrayOfTypeReference(
050: new TypeReference[] { super type });
051: }
052:
053: /**
054: * Inheritance specification.
055: * @param supertypes a type reference mutable list.
056: */
057:
058: public InheritanceSpecification(TypeReference[] super types) {
059: this .super types = new ArrayOfTypeReference(super types);
060: }
061:
062: /**
063: * Inheritance specification.
064: * @param children the ExtList may include: a Comment
065: * several TypeReference (as references to the supertypes)
066: * a Comment
067: */
068: protected InheritanceSpecification(ExtList children) {
069: super (children);
070: this .super types = new ArrayOfTypeReference(
071: (TypeReference[]) children.collect(TypeReference.class));
072: }
073:
074: public SourceElement getLastElement() {
075: if (super types == null) {
076: return this ;
077: }
078: return super types.getTypeReference(super types.size() - 1);
079: }
080:
081: /**
082: * Returns the number of children of this node.
083: * @return an int giving the number of children of this node
084: */
085:
086: public int getChildCount() {
087: int result = 0;
088: if (super types != null)
089: result += super types.size();
090: return result;
091: }
092:
093: /**
094: * Returns the child at the specified index in this node's "virtual"
095: * child array
096: * @param index an index into this node's "virtual" child array
097: * @return the program element at the given position
098: * @exception ArrayIndexOutOfBoundsException if <tt>index</tt> is out
099: * of bounds
100: */
101:
102: public ProgramElement getChildAt(int index) {
103: if (super types != null) {
104: return super types.getTypeReference(index);
105: }
106: throw new ArrayIndexOutOfBoundsException();
107: }
108:
109: /**
110: * Get supertypes.
111: * @return the type reference array wrapper.
112: */
113:
114: public ArrayOfTypeReference getSupertypes() {
115: return super types;
116: }
117:
118: /**
119: * Get the number of type references in this container.
120: * @return the number of type references.
121: */
122:
123: public int getTypeReferenceCount() {
124: return (super types != null) ? super types.size() : 0;
125: }
126:
127: /*
128: Return the type reference at the specified index in this node's
129: "virtual" type reference array.
130: @param index an index for a type reference.
131: @return the type reference with the given index.
132: @exception ArrayIndexOutOfBoundsException if <tt>index</tt> is out
133: of bounds.
134: */
135:
136: public TypeReference getTypeReferenceAt(int index) {
137: if (super types != null) {
138: return super types.getTypeReference(index);
139: }
140: throw new ArrayIndexOutOfBoundsException();
141: }
142: }
|