summaryrefslogtreecommitdiff
path: root/sources/scalac/symtab/classfile/PackageParser.java
diff options
context:
space:
mode:
Diffstat (limited to 'sources/scalac/symtab/classfile/PackageParser.java')
-rw-r--r--sources/scalac/symtab/classfile/PackageParser.java232
1 files changed, 0 insertions, 232 deletions
diff --git a/sources/scalac/symtab/classfile/PackageParser.java b/sources/scalac/symtab/classfile/PackageParser.java
deleted file mode 100644
index fdbc796916..0000000000
--- a/sources/scalac/symtab/classfile/PackageParser.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.symtab.classfile;
-
-import java.util.Iterator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map.Entry;
-
-import scala.tools.util.AbstractFile;
-
-import scalac.Global;
-import scalac.symtab.Scope;
-import scalac.symtab.SourceCompleter;
-import scalac.symtab.Symbol;
-import scalac.symtab.SymbolLoader;
-import scalac.symtab.SymbolOrigin;
-import scalac.symtab.Type;
-import scalac.util.Name;
-import scalac.util.Debug;
-
-/**
- * This class implements a package member loader. It can be used to
- * complete package class symbols.
- */
-public class PackageParser extends SymbolLoader {
-
- //########################################################################
- // Protected Fields
-
- /** The directory to read */
- protected final AbstractFile directory;
-
- /** A table to collect .scala files */
- protected final HashMap/*<String,AbstractFile>*/ sources = new HashMap();
- /** A table to collect .symbl files */
- protected final HashMap/*<String,AbstractFile>*/ symbols = new HashMap();
- /** A table to collect .class files */
- protected final HashMap/*<String,AbstractFile>*/ classes = new HashMap();
- /** A table to collect subdirectories */
- protected final HashMap/*<String,AbstractFile>*/ packages = new HashMap();
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public PackageParser(Global global, AbstractFile directory) {
- super(global);
- this.directory = directory;
- assert directory != null;
- }
-
- //########################################################################
- // Protected Methods
-
- /** Is the given name a valid input file base name? */
- protected boolean isValidName(String name) {
- return name.length() > 0
- &&!name.endsWith("$class")
- && name.indexOf("$$anon") == -1;
- }
-
- /** Returns a new package parser for the given directory. */
- protected PackageParser newPackageParser(AbstractFile directory) {
- return new PackageParser(global, directory);
- }
-
- /**
- * Collects all members of the package. This method is invoked by
- * method "doComplete". It should not be invoked otherwise.
- */
- protected void collectAllMembers(Symbol clasz) {
- for (Iterator i = directory.list(); i.hasNext(); ) {
- AbstractFile file = (AbstractFile)i.next();
- String filename = file.getName();
- if (file.isDirectory()) {
- if (filename.equals("META-INF")) continue;
- packages.put(filename, file);
- continue;
- }
- if (filename.endsWith(".class")) {
- String name = filename.substring(0, filename.length() - 6);
- if (!isValidName(name)) continue;
- if (!classes.containsKey(name)) classes.put(name, file);
- continue;
- }
- if (filename.endsWith(".symbl")) {
- String name = filename.substring(0, filename.length() - 6);
- if (!isValidName(name)) continue;
- if (!symbols.containsKey(name)) symbols.put(name, file);
- continue;
- }
- if (filename.endsWith(".scala")) {
- String name = filename.substring(0, filename.length() - 6);
- if (!isValidName(name)) continue;
- if (!sources.containsKey(name)) sources.put(name, file);
- continue;
- }
- }
- }
-
- /**
- * Removes from the members collected by "collectAllMembers" all
- * those that are hidden. This method is invoked by method
- * "doComplete". It should not be invoked otherwise.
- */
- protected void removeHiddenMembers(Symbol clasz) {
- // Classes/Objects in the root package are hidden.
- if (clasz.isRoot()) sources.clear();
- if (clasz.isRoot()) symbols.clear();
- if (clasz.isRoot()) classes.clear();
- // For all files "<N>.class" find the longest M such that
- // there is a file "<M>.symbl" and M equals N or "<M>$" is a
- // prefix of N. If the file "<N>.class" is less recent than
- // the file "<M>.symbl" ignore the ".class" file. Otherwise,
- // if M equals N, ignore the ".symbl" file.
- for (Iterator i = classes.entrySet().iterator(); i.hasNext(); ) {
- if (symbols.isEmpty()) break;
- Entry entry = (Entry)i.next();
- String cname = (String)entry.getKey();
- AbstractFile cfile = (AbstractFile)entry.getValue();
- for (String zname = cname; true; ) {
- AbstractFile zfile = (AbstractFile)symbols.get(zname);
- if (zfile != null) {
- if (cfile.lastModified() <= zfile.lastModified()) {
- i.remove();
- } else if (zname == cname) {
- symbols.remove(zname);
- }
- break;
- }
- int index = zname.lastIndexOf('$');
- if (index < 0) break;
- zname = zname.substring(0, index);
- }
- }
- // Source versions hide compiled versions except if separate
- // compilation is enabled and the compiled version is more
- // recent. In that case the compiled version hides the source
- // version.
- boolean separate = global.separate;
- for (Iterator i = sources.entrySet().iterator(); i.hasNext(); ) {
- if (symbols.isEmpty() && classes.isEmpty()) break;
- HashMap.Entry entry = (HashMap.Entry)i.next();
- String name = (String)entry.getKey();
- AbstractFile sfile = (AbstractFile)entry.getValue();
- AbstractFile zfile = (AbstractFile)symbols.get(name);
- AbstractFile cfile = (AbstractFile)classes.get(name);
- boolean hidden = false;
- if (zfile != null)
- if (separate && zfile.lastModified() > sfile.lastModified())
- hidden = true;
- else
- symbols.remove(name);
- if (cfile != null)
- if (separate && cfile.lastModified() > sfile.lastModified())
- hidden = true;
- else
- classes.remove(name);
- if (hidden) i.remove();
- }
- // Packages are hidden by classes/objects with the same name.
- packages.keySet().removeAll(sources.keySet());
- packages.keySet().removeAll(symbols.keySet());
- packages.keySet().removeAll(classes.keySet());
- }
-
- /**
- * Creates symbols for all members left by method
- * "removeHiddenMembers". This method is invoked by method
- * "doComplete". It should not be invoked otherwise.
- */
- protected Scope createMemberSymbols(Symbol clasz) {
- Scope members = new Scope();
- for (Iterator i = sources.entrySet().iterator(); i.hasNext(); ) {
- HashMap.Entry entry = (HashMap.Entry)i.next();
- String name = (String)entry.getKey();
- AbstractFile sfile = (AbstractFile)entry.getValue();
- Name classname = Name.fromString(name).toTypeName();
- SymbolLoader loader = new SourceCompleter(global, sfile);
- SymbolOrigin origin = SymbolOrigin.ScalaFile(sfile);
- clasz.newLoadedClass(0, classname, loader, members, origin);
- }
- for (Iterator i = symbols.entrySet().iterator(); i.hasNext(); ) {
- HashMap.Entry entry = (HashMap.Entry)i.next();
- String name = (String)entry.getKey();
- AbstractFile zfile = (AbstractFile)entry.getValue();
- Name classname = Name.fromString(name).toTypeName();
- SymbolLoader loader = new SymblParser(global, zfile);
- SymbolOrigin origin = SymbolOrigin.SymblFile(zfile);
- clasz.newLoadedClass(0, classname, loader, members, origin);
- }
- for (Iterator i = classes.entrySet().iterator(); i.hasNext(); ) {
- HashMap.Entry entry = (HashMap.Entry)i.next();
- String name = (String)entry.getKey();
- AbstractFile cfile = (AbstractFile)entry.getValue();
- Name classname = Name.fromString(name).toTypeName();
- SymbolLoader loader = new ClassParser(global, cfile);
- SymbolOrigin origin = SymbolOrigin.ClassFile(cfile, null);
- clasz.newLoadedClass(JAVA, classname, loader, members, origin);
- }
- for (Iterator i = packages.entrySet().iterator(); i.hasNext(); ) {
- HashMap.Entry entry = (HashMap.Entry)i.next();
- String name = (String)entry.getKey();
- AbstractFile dfile = (AbstractFile)entry.getValue();
- Name packagename = Name.fromString(name);
- SymbolLoader loader = newPackageParser(dfile);
- SymbolOrigin origin = SymbolOrigin.Directory(dfile);
- clasz.newLoadedPackage(packagename, loader, members, origin);
- }
- return members;
- }
-
- /** Completes the package symbol by loading all its members. */
- protected String doComplete(Symbol root) {
- assert root.isRoot() || root.isPackage(): Debug.show(root);
- Symbol clasz = root.isRoot() ? root : root.moduleClass();
- collectAllMembers(clasz);
- removeHiddenMembers(clasz);
- Scope members = createMemberSymbols(clasz);
- clasz.setInfo(Type.compoundType(Type.EMPTY_ARRAY, members, clasz));
- return "directory path '" + directory + "'";
- }
-
- //########################################################################
-}