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.reference;
012:
013: import de.uka.ilkd.key.java.JavaNonTerminalProgramElement;
014: import de.uka.ilkd.key.java.PrettyPrinter;
015: import de.uka.ilkd.key.java.ProgramElement;
016: import de.uka.ilkd.key.java.SourceElement;
017: import de.uka.ilkd.key.java.visitor.Visitor;
018: import de.uka.ilkd.key.logic.ProgramElementName;
019: import de.uka.ilkd.key.util.ExtList;
020:
021: /**
022: * Package reference.
023: * @author <TT>AutoDoc</TT>
024: */
025: public class PackageReference extends JavaNonTerminalProgramElement
026: implements TypeReferenceInfix, PackageReferenceContainer {
027:
028: /**
029: * Prefix.
030: */
031: protected ReferencePrefix prefix;
032:
033: /**
034: * Name.
035: */
036: protected ProgramElementName name;
037:
038: /**
039: * Constructor for the transformation of COMPOST ASTs to KeY.
040: * @param children the children of this AST element as KeY classes.
041: * May contain:
042: * a ProgramElementName (as the name of the method reference),
043: * a ReferencePrefix (as accessPath to the package),
044: * Comments.
045: */
046: public PackageReference(ExtList children) {
047: prefix = (PackageReference) children
048: .get(PackageReference.class);
049: name = (ProgramElementName) children
050: .get(ProgramElementName.class);
051: }
052:
053: public PackageReference(ProgramElementName name,
054: ReferencePrefix prefix) {
055: this .prefix = prefix;
056: this .name = name;
057: }
058:
059: public SourceElement getFirstElement() {
060: return (prefix == null) ? name : prefix.getFirstElement();
061: }
062:
063: /**
064: * Returns the number of children of this node.
065: * @return an int giving the number of children of this node
066: */
067: public int getChildCount() {
068: int result = 0;
069: if (prefix != null)
070: result++;
071: if (name != null)
072: result++;
073: return result;
074: }
075:
076: /**
077: * Returns the child at the specified index in this node's "virtual"
078: * child array
079: * @param index an index into this node's "virtual" child array
080: * @return the program element at the given position
081: * @exception ArrayIndexOutOfBoundsException if <tt>index</tt> is out
082: * of bounds
083: */
084: public ProgramElement getChildAt(int index) {
085: if (prefix != null) {
086: if (index == 0)
087: return prefix;
088: index--;
089: }
090: if (name != null) {
091: if (index == 0)
092: return name;
093: }
094: throw new ArrayIndexOutOfBoundsException();
095: }
096:
097: /**
098: * Get reference prefix.
099: * @return the reference prefix.
100: */
101: public ReferencePrefix getReferencePrefix() {
102: return prefix;
103: }
104:
105: /**
106: * Get the package reference.
107: * @return the package reference.
108: */
109: public PackageReference getPackageReference() {
110: return (prefix instanceof PackageReference) ? (PackageReference) prefix
111: : null;
112: }
113:
114: /**
115: * Get name.
116: * @return the string.
117: */
118: public final String getName() {
119: return (name == null) ? null : name.toString();
120: }
121:
122: /**
123: * Get identifier.
124: * @return the identifier.
125: */
126: public ProgramElementName getProgramElementName() {
127: return name;
128: }
129:
130: /** calls the corresponding method of a visitor in order to
131: * perform some action/transformation on this element
132: * @param v the Visitor
133: */
134: public void visit(Visitor v) {
135: v.performActionOnPackageReference(this );
136: }
137:
138: public void prettyPrint(PrettyPrinter p) throws java.io.IOException {
139: p.printPackageReference(this );
140: }
141:
142: public ReferencePrefix setReferencePrefix(ReferencePrefix r) {
143: return this;
144: }
145: }
|