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;
012:
013: import de.uka.ilkd.key.java.reference.*;
014: import de.uka.ilkd.key.java.visitor.Visitor;
015: import de.uka.ilkd.key.util.ExtList;
016:
017: /**
018: * Import.
019: *
020: */
021: public class Import extends JavaNonTerminalProgramElement implements
022: TypeReferenceContainer, PackageReferenceContainer {
023:
024: /**
025: * Multi import flag.
026: */
027:
028: protected final boolean isMultiImport;
029:
030: /**
031: * Type reference infix.
032: */
033: protected final TypeReferenceInfix reference;
034:
035: /**
036: * children may contain: TypeReference (for import), a Comment
037: * @param isMultiImport indicates whether the import contains multiple
038: * imports
039: */
040: public Import(ExtList children, boolean isMultiImport) {
041: super (children);
042: reference = (TypeReferenceInfix) children
043: .get(TypeReferenceInfix.class);
044: this .isMultiImport = isMultiImport;
045: }
046:
047: /**
048: * Import.
049: */
050: public Import() {
051: isMultiImport = false;
052: reference = null;
053: }
054:
055: /**
056: * Import.
057: * @param t a type reference.
058: * @param multi indicates the wildcard.
059: */
060: public Import(TypeReference t, boolean multi) {
061: reference = t;
062: isMultiImport = multi;
063: }
064:
065: /**
066: * Import.
067: * @param t a package reference.
068: */
069:
070: public Import(PackageReference t) {
071: reference = t;
072: isMultiImport = true;
073: }
074:
075: public SourceElement getLastElement() {
076: return reference;
077: }
078:
079: /**
080: * Checks if this import is a multi type import, also known as
081: * type-on-demand import.
082: * @return the kind of this import.
083: */
084:
085: public boolean isMultiImport() {
086: return isMultiImport;
087: }
088:
089: /**
090: * Returns the number of children of this node.
091: * @return an int giving the number of children of this node
092: */
093: public int getChildCount() {
094: int result = 0;
095: if (reference != null)
096: result++;
097: return result;
098: }
099:
100: /**
101: * Returns the child at the specified index in this node's "virtual"
102: * child array
103: * @param index an index into this node's "virtual" child array
104: * @return the program element at the given position
105: * @exception ArrayIndexOutOfBoundsException if <tt>index</tt> is out
106: * of bounds
107: */
108: public ProgramElement getChildAt(int index) {
109: if (reference != null) {
110: if (index == 0)
111: return reference;
112: }
113: throw new ArrayIndexOutOfBoundsException();
114: }
115:
116: /**
117: * Get the number of type references in this container.
118: * @return the number of type references.
119: */
120:
121: public int getTypeReferenceCount() {
122: return (reference instanceof TypeReference) ? 1 : 0;
123: }
124:
125: /*
126: Return the type reference at the specified index in this node's
127: "virtual" type reference array.
128: @param index an index for a type reference.
129: @return the type reference with the given index.
130: @exception ArrayIndexOutOfBoundsException if <tt>index</tt> is out
131: of bounds.
132: */
133:
134: public TypeReference getTypeReferenceAt(int index) {
135: if (reference instanceof TypeReference && index == 0) {
136: return (TypeReference) reference;
137: }
138: throw new ArrayIndexOutOfBoundsException();
139: }
140:
141: /**
142: * Returns the type reference of this import, if there is one.
143: * @return the reference of this import statement.
144: */
145:
146: public TypeReference getTypeReference() {
147: return (reference instanceof TypeReference) ? (TypeReference) reference
148: : null;
149: }
150:
151: /**
152: * Returns the package reference of this import, if there is one.
153: * @return the reference of this import statement.
154: */
155:
156: public PackageReference getPackageReference() {
157: return (reference instanceof PackageReference) ? (PackageReference) reference
158: : null;
159: }
160:
161: /**
162: * Returns the reference of this import, either a
163: * type or a package reference.
164: * @return the reference of this import statement.
165: */
166:
167: public TypeReferenceInfix getReference() {
168: return reference;
169: }
170:
171: /** calls the corresponding method of a visitor in order to
172: * perform some action/transformation on this element
173: * @param v the Visitor
174: */
175: public void visit(Visitor v) {
176: v.performActionOnImport(this );
177: }
178:
179: public void prettyPrint(PrettyPrinter p) throws java.io.IOException {
180: p.printImport(this);
181: }
182: }
|