home *** CD-ROM | disk | FTP | other *** search
/ Symantec Visual Cafe for Java 2.5 / symantec-visual-cafe-2.5-database-dev-edition.iso / VPage / Java.bin / CLASSES.ZIP / sun / tools / java / Imports.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-07-08  |  4.9 KB  |  205 lines

  1. package sun.tools.java;
  2.  
  3. import java.io.IOException;
  4. import java.util.Enumeration;
  5. import java.util.Hashtable;
  6. import java.util.Vector;
  7.  
  8. public class Imports implements Constants {
  9.    Identifier currentPackage;
  10.    Hashtable classes = new Hashtable();
  11.    Vector packages = new Vector();
  12.    Vector singles = new Vector();
  13.    protected int checked;
  14.  
  15.    public Imports(Environment var1) {
  16.       this.addPackage(Constants.idJavaLang);
  17.    }
  18.  
  19.    public synchronized void resolve(Environment var1) {
  20.       if (this.checked == 0) {
  21.          this.checked = -1;
  22.          if (this.currentPackage == null) {
  23.             this.currentPackage = Constants.idNull;
  24.          }
  25.  
  26.          this.packages.addElement(new IdentifierToken(this.currentPackage));
  27.          Vector var2 = new Vector();
  28.          Enumeration var3 = this.packages.elements();
  29.  
  30.          while(var3.hasMoreElements()) {
  31.             IdentifierToken var4 = (IdentifierToken)var3.nextElement();
  32.             Identifier var5 = var4.getName();
  33.             int var6 = var4.getWhere();
  34.             if (var6 == 0) {
  35.                var2.addElement(var4);
  36.             } else {
  37.                try {
  38.                   Identifier var7 = var1.resolvePackageQualifiedName(var5);
  39.                   if (var1.innerClasses() && this.importable(var7, var1)) {
  40.                      if (var1.getPackage(var7.getTopName()).exists()) {
  41.                         var1.error(var6, "class.and.package", var7.getTopName());
  42.                      }
  43.  
  44.                      if (!var7.isInner()) {
  45.                         var7 = Identifier.lookupInner(var7, Constants.idNull);
  46.                      }
  47.  
  48.                      var5 = var7;
  49.                   } else if (!var1.getPackage(var5).exists()) {
  50.                      var1.error(var6, "package.not.found", var5, "import");
  51.                   } else if (var7.isInner()) {
  52.                      var1.error(var6, "class.and.package", var7.getTopName());
  53.                   }
  54.  
  55.                   var2.addElement(new IdentifierToken(var6, var5));
  56.                } catch (IOException var15) {
  57.                   var1.error(var6, "io.exception", "import");
  58.                }
  59.             }
  60.          }
  61.  
  62.          this.packages = var2;
  63.          Enumeration var16 = this.singles.elements();
  64.  
  65.          while(var16.hasMoreElements()) {
  66.             IdentifierToken var17 = (IdentifierToken)var16.nextElement();
  67.             Identifier var18 = var17.getName();
  68.             int var20 = var17.getWhere();
  69.             Identifier var8 = var18.getQualifier();
  70.             var18 = var1.resolvePackageQualifiedName(var18);
  71.             if (!var1.classExists(var18.getTopName())) {
  72.                var1.error(var20, "class.not.found", var18, "import");
  73.             }
  74.  
  75.             Identifier var9 = var18.getFlatName().getName();
  76.             Identifier var10 = (Identifier)this.classes.get(var9);
  77.             if (var10 != null) {
  78.                Identifier var11 = Identifier.lookup(var10.getQualifier(), var10.getFlatName());
  79.                Identifier var12 = Identifier.lookup(var18.getQualifier(), var18.getFlatName());
  80.                if (!var11.equals(var12)) {
  81.                   var1.error(var20, "ambig.class", var18, var10);
  82.                }
  83.             }
  84.  
  85.             this.classes.put(var9, var18);
  86.  
  87.             try {
  88.                for(ClassDefinition var21 = var1.getClassDefinition(var18); var21 != null; var21 = var21.getOuterClass()) {
  89.                   if (var21.isPrivate() || !var21.isPublic() && !var8.equals(this.currentPackage)) {
  90.                      var1.error(var20, "cant.access.class", var21);
  91.                      break;
  92.                   }
  93.                }
  94.             } catch (AmbiguousClass var13) {
  95.                var1.error(var20, "ambig.class", var13.name1, var13.name2);
  96.             } catch (ClassNotFound var14) {
  97.                var1.error(var20, "class.not.found", var14.name, "import");
  98.             }
  99.          }
  100.  
  101.          this.checked = 1;
  102.       }
  103.    }
  104.  
  105.    public synchronized Identifier resolve(Environment var1, Identifier var2) throws ClassNotFound {
  106.       if (var2.isQualified()) {
  107.          return var2;
  108.       } else {
  109.          if (this.checked <= 0) {
  110.             this.checked = 0;
  111.             this.resolve(var1);
  112.          }
  113.  
  114.          Identifier var3 = (Identifier)this.classes.get(var2);
  115.          if (var3 != null) {
  116.             return var3;
  117.          } else {
  118.             Enumeration var4 = this.packages.elements();
  119.  
  120.             while(var4.hasMoreElements()) {
  121.                IdentifierToken var5 = (IdentifierToken)var4.nextElement();
  122.                Identifier var6 = Identifier.lookup(var5.getName(), var2);
  123.                if (this.importable(var6, var1)) {
  124.                   if (var6.getQualifier().equals(this.currentPackage)) {
  125.                      var3 = var6;
  126.                      break;
  127.                   }
  128.  
  129.                   if (var3 != null && !var3.equals(var6)) {
  130.                      throw new AmbiguousClass(var6, var3);
  131.                   }
  132.  
  133.                   var3 = var6;
  134.                }
  135.             }
  136.  
  137.             if (var3 == null) {
  138.                throw new ClassNotFound(var2);
  139.             } else {
  140.                this.classes.put(var2, var3);
  141.                return var3;
  142.             }
  143.          }
  144.       }
  145.    }
  146.  
  147.    private boolean importable(Identifier var1, Environment var2) {
  148.       if (!var1.isInner()) {
  149.          return var2.classExists(var1);
  150.       } else if (!var2.classExists(var1.getTopName())) {
  151.          return false;
  152.       } else {
  153.          try {
  154.             ClassDefinition var3 = var2.getClassDefinition(var1.getTopName());
  155.             return var3.innerClassExists(var1.getFlatName().getTail());
  156.          } catch (ClassNotFound var4) {
  157.             return false;
  158.          }
  159.       }
  160.    }
  161.  
  162.    public synchronized Identifier forceResolve(Environment var1, Identifier var2) {
  163.       if (var2.isQualified()) {
  164.          return var2;
  165.       } else {
  166.          Identifier var3 = (Identifier)this.classes.get(var2);
  167.          if (var3 != null) {
  168.             return var3;
  169.          } else {
  170.             var3 = Identifier.lookup(this.currentPackage, var2);
  171.             this.classes.put(var2, var3);
  172.             return var3;
  173.          }
  174.       }
  175.    }
  176.  
  177.    public synchronized void addClass(IdentifierToken var1) {
  178.       this.singles.addElement(var1);
  179.    }
  180.  
  181.    public void addClass(Identifier var1) throws AmbiguousClass {
  182.       this.addClass(new IdentifierToken(var1));
  183.    }
  184.  
  185.    public synchronized void addPackage(IdentifierToken var1) {
  186.       this.packages.addElement(var1);
  187.    }
  188.  
  189.    public void addPackage(Identifier var1) {
  190.       this.addPackage(new IdentifierToken(var1));
  191.    }
  192.  
  193.    public synchronized void setCurrentPackage(Identifier var1) {
  194.       this.currentPackage = var1;
  195.    }
  196.  
  197.    public Identifier getCurrentPackage() {
  198.       return this.currentPackage;
  199.    }
  200.  
  201.    public Environment newEnvironment(Environment var1) {
  202.       return new ImportEnvironment(var1, this);
  203.    }
  204. }
  205.