001    /* This file was generated with JastAdd2 (http://jastadd.org) version R20130213 */
002    package AST;
003    
004    import java.util.HashSet;
005    import java.io.File;
006    import java.util.*;
007    import beaver.*;
008    import java.util.ArrayList;
009    import java.util.zip.*;
010    import java.io.*;
011    import java.io.FileNotFoundException;
012    import java.util.Collection;
013    /**
014     * @production TypeImportOnDemandDecl : {@link ImportDecl};
015     * @ast node
016     * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/java.ast:12
017     */
018    public class TypeImportOnDemandDecl extends ImportDecl implements Cloneable {
019      /**
020       * @apilevel low-level
021       */
022      public void flushCache() {
023      }
024      /**
025       * @apilevel internal
026       */
027      public void flushCollectionCache() {
028      }
029      /**
030       * @apilevel internal
031       */
032      @SuppressWarnings({"unchecked", "cast"})
033      public TypeImportOnDemandDecl clone() throws CloneNotSupportedException {
034        TypeImportOnDemandDecl node = (TypeImportOnDemandDecl)super.clone();
035        node.importedTypes_String_values = null;
036        node.in$Circle(false);
037        node.is$Final(false);
038        return node;
039      }
040    /**
041     * @apilevel internal
042     */
043      @SuppressWarnings({"unchecked", "cast"})
044    public TypeImportOnDemandDecl copy() {
045      
046      try {
047        TypeImportOnDemandDecl node = (TypeImportOnDemandDecl) clone();
048        node.parent = null;
049        if(children != null)
050          node.children = (ASTNode[]) children.clone();
051        
052        return node;
053      } catch (CloneNotSupportedException e) {
054        throw new Error("Error: clone not supported for " + getClass().getName());
055      }
056      
057    }/**
058     * Create a deep copy of the AST subtree at this node.
059     * The copy is dangling, i.e. has no parent.
060     * @return dangling copy of the subtree at this node
061     * @apilevel low-level
062     */
063      @SuppressWarnings({"unchecked", "cast"})
064    public TypeImportOnDemandDecl fullCopy() {
065      
066      TypeImportOnDemandDecl tree = (TypeImportOnDemandDecl) copy();
067      if (children != null) {
068        for (int i = 0; i < children.length; ++i) {
069          
070          ASTNode child = (ASTNode) children[i];
071          if(child != null) {
072            child = child.fullCopy();
073            tree.setChild(child, i);
074          }
075        }
076      }
077      return tree;
078      
079    }  /**
080       * @ast method 
081       * @aspect NameCheck
082       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/NameCheck.jrag:30
083       */
084      public void nameCheck() {
085        if(getAccess().lastAccess().isTypeAccess() && !getAccess().type().typeName().equals(typeName()))
086          error("On demand type import " + typeName() + ".* is not the canonical name of type " + getAccess().type().typeName());
087      }
088      /**
089       * @ast method 
090       * @aspect PrettyPrint
091       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/PrettyPrint.jadd:56
092       */
093      public void toString(StringBuffer s) {
094        s.append("import ");
095        getAccess().toString(s);
096        s.append(".*;\n");
097      }
098      /**
099       * @ast method 
100       * 
101       */
102      public TypeImportOnDemandDecl() {
103        super();
104    
105    
106      }
107      /**
108       * Initializes the child array to the correct size.
109       * Initializes List and Opt nta children.
110       * @apilevel internal
111       * @ast method
112       * @ast method 
113       * 
114       */
115      public void init$Children() {
116        children = new ASTNode[1];
117      }
118      /**
119       * @ast method 
120       * 
121       */
122      public TypeImportOnDemandDecl(Access p0) {
123        setChild(p0, 0);
124      }
125      /**
126       * @apilevel low-level
127       * @ast method 
128       * 
129       */
130      protected int numChildren() {
131        return 1;
132      }
133      /**
134       * @apilevel internal
135       * @ast method 
136       * 
137       */
138      public boolean mayHaveRewrite() {
139        return false;
140      }
141      /**
142       * Replaces the Access child.
143       * @param node The new node to replace the Access child.
144       * @apilevel high-level
145       * @ast method 
146       * 
147       */
148      public void setAccess(Access node) {
149        setChild(node, 0);
150      }
151      /**
152       * Retrieves the Access child.
153       * @return The current node used as the Access child.
154       * @apilevel high-level
155       * @ast method 
156       * 
157       */
158      public Access getAccess() {
159        return (Access)getChild(0);
160      }
161      /**
162       * Retrieves the Access child.
163       * <p><em>This method does not invoke AST transformations.</em></p>
164       * @return The current node used as the Access child.
165       * @apilevel low-level
166       * @ast method 
167       * 
168       */
169      public Access getAccessNoTransform() {
170        return (Access)getChildNoTransform(0);
171      }
172      protected java.util.Map importedTypes_String_values;
173      /**
174       * @attribute syn
175       * @aspect TypeScopePropagation
176       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/LookupType.jrag:329
177       */
178      @SuppressWarnings({"unchecked", "cast"})
179      public SimpleSet importedTypes(String name) {
180        Object _parameters = name;
181        if(importedTypes_String_values == null) importedTypes_String_values = new java.util.HashMap(4);
182        if(importedTypes_String_values.containsKey(_parameters)) {
183          return (SimpleSet)importedTypes_String_values.get(_parameters);
184        }
185          ASTNode$State state = state();
186      int num = state.boundariesCrossed;
187      boolean isFinal = this.is$Final();
188        SimpleSet importedTypes_String_value = importedTypes_compute(name);
189      if(isFinal && num == state().boundariesCrossed){ importedTypes_String_values.put(_parameters, importedTypes_String_value); }
190            return importedTypes_String_value;
191      }
192      /**
193       * @apilevel internal
194       */
195      private SimpleSet importedTypes_compute(String name) {
196        SimpleSet set = SimpleSet.emptySet;
197        if(getAccess() instanceof PackageAccess) {
198          String packageName = ((PackageAccess)getAccess()).getPackage();
199          TypeDecl typeDecl = lookupType(packageName, name);
200          if(typeDecl != null && typeDecl.accessibleFromPackage(packageName()) &&
201             typeDecl.typeName().equals(packageName + "." + name)) // canonical names match
202            set = set.add(typeDecl);
203        }
204        else {
205          for(Iterator iter = getAccess().type().memberTypes(name).iterator(); iter.hasNext(); ) {
206            TypeDecl decl = (TypeDecl)iter.next();
207            if(decl.accessibleFromPackage(packageName()) &&
208               decl.typeName().equals(getAccess().typeName() + "." + name)) // canonical names match
209              set = set.add(decl);
210          }
211        }
212        return set;
213      }
214      /**
215       * @attribute syn
216       * @aspect TypeScopePropagation
217       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/LookupType.jrag:351
218       */
219      public boolean isOnDemand() {
220        ASTNode$State state = state();
221        try {  return true;  }
222        finally {
223        }
224      }
225      /**
226       * @attribute inh
227       * @aspect TypeScopePropagation
228       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/LookupType.jrag:348
229       */
230      @SuppressWarnings({"unchecked", "cast"})
231      public TypeDecl lookupType(String packageName, String typeName) {
232          ASTNode$State state = state();
233        TypeDecl lookupType_String_String_value = getParent().Define_TypeDecl_lookupType(this, null, packageName, typeName);
234            return lookupType_String_String_value;
235      }
236      /**
237       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/SyntacticClassification.jrag:107
238       * @apilevel internal
239       */
240      public NameType Define_NameType_nameType(ASTNode caller, ASTNode child) {
241        if(caller == getAccessNoTransform()) {
242          return NameType.PACKAGE_OR_TYPE_NAME;
243        }
244        else {      return getParent().Define_NameType_nameType(this, caller);
245        }
246      }
247      /**
248       * @apilevel internal
249       */
250      public ASTNode rewriteTo() {
251        return super.rewriteTo();
252      }
253    }