summaryrefslogtreecommitdiff
path: root/sources/scalac/symtab/classfile/CLRPackageParser.java
diff options
context:
space:
mode:
Diffstat (limited to 'sources/scalac/symtab/classfile/CLRPackageParser.java')
-rw-r--r--sources/scalac/symtab/classfile/CLRPackageParser.java137
1 files changed, 71 insertions, 66 deletions
diff --git a/sources/scalac/symtab/classfile/CLRPackageParser.java b/sources/scalac/symtab/classfile/CLRPackageParser.java
index e50e1518b6..4ad89311c2 100644
--- a/sources/scalac/symtab/classfile/CLRPackageParser.java
+++ b/sources/scalac/symtab/classfile/CLRPackageParser.java
@@ -9,22 +9,19 @@
package scalac.symtab.classfile;
import java.util.Iterator;
-import java.util.Map;
import java.util.HashMap;
-import java.util.Set;
+import java.util.HashSet;
import scala.tools.util.AbstractFile;
import scala.tools.util.ByteArrayFile;
+import scala.tools.util.VirtualDirectory;
import scalac.Global;
import scalac.util.Debug;
import scalac.util.Name;
import scalac.symtab.Scope;
import scalac.symtab.Symbol;
-import scalac.symtab.Modifiers;
import scalac.symtab.SymbolLoader;
-import scalac.symtab.SourceCompleter;
-import scalac.symtab.SymbolNameWriter;
import ch.epfl.lamp.compiler.msil.Type;
import ch.epfl.lamp.compiler.msil.Attribute;
@@ -34,63 +31,89 @@ import ch.epfl.lamp.compiler.msil.Attribute;
*/
public final class CLRPackageParser extends PackageParser {
- //##########################################################################
+ //########################################################################
+ // Private Constants
+
+ /** An empty directory */
+ private static final AbstractFile EMPTY = new VirtualDirectory("<empty>");
+
+ //########################################################################
+ // Protected Fields
+
+ /** A table to collect types */
+ protected final HashMap types = new HashMap();
+
+ //########################################################################
+ // Public Constructors
public CLRPackageParser(Global global, AbstractFile directory) {
super(global, directory);
}
- private final SymbolNameWriter snw = new SymbolNameWriter();
+ //########################################################################
+ // Protected Methods
- protected String doComplete(Symbol root) {
- assert root.isRoot() || root.isPackage(): Debug.show(root);
- Symbol peckage = root.isRoot() ? root : root.moduleClass();
- if (directory != null)
- preInitialize(peckage, false);
+ protected PackageParser newPackageParser(AbstractFile directory) {
+ return new CLRPackageParser(global, directory);
+ }
- final CLRTypes clrTypes = CLRTypes.instance();
- java.util.Map types = clrTypes.getTypes(peckage);
- Set namespaces = clrTypes.getNamespaces(peckage);
+ protected void collectAllMembers(Symbol clasz) {
+ super.collectAllMembers(clasz);
+ HashSet namespaces = new HashSet();
+ CLRTypes.instance().collectMembers(clasz, types, namespaces);
+ for (Iterator i = namespaces.iterator(); i.hasNext(); ) {
+ String namespace = (String)i.next();
+ if (!packages.containsKey(namespace))
+ packages.put(namespace, EMPTY);
+ }
+ }
- // create JVM and source members
- Scope members = new Scope();
+ protected void removeHiddenMembers(Symbol clasz) {
+ // Ignore all ".class" files.
+ classes.clear();
+ super.removeHiddenMembers(clasz);
+ // Classes/Objects in the root package are hidden.
+ if (clasz.isRoot()) { types.clear(); }
+ // 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(); ) {
HashMap.Entry entry = (HashMap.Entry)i.next();
String name = (String)entry.getKey();
AbstractFile sfile = (AbstractFile)entry.getValue();
- Type type = (Type)types.remove(name);
- if (global.separate && type != null
- /*&& type.Assembly().getFile().lastModified() > sfile.lastModified()*/
- )
- {
- types.put(name, type);
- } else {
- packages.remove(name);
- Name classname = Name.fromString(name).toTypeName();
- SymbolLoader loader = new SourceCompleter(global, sfile);
- peckage.newLoadedClass(0, classname, loader, members);
- }
+ Type type = (Type)types.get(name);
+ boolean hidden = false;
+ if (type != null)
+ if (separate /* !!! && type.Assembly().getFile().lastModified() > sfile.lastModified() */)
+ hidden = true;
+ else
+ types.remove(name);
+ if (hidden) i.remove();
}
+ // Packages are hidden by classes/objects with the same name.
+ packages.keySet().removeAll(types.keySet());
+ }
+
+ protected Scope createMemberSymbols(Symbol clasz) {
+ CLRTypes clrTypes = CLRTypes.instance();
+ String namespace = clrTypes.getNameSpaceOf(clasz);
+ Scope members = super.createMemberSymbols(clasz);
// import the CLR types contained in the package (namespace)
for (Iterator i = types.values().iterator(); i.hasNext(); ) {
Type type = (Type)i.next();
- // discard top level types
- if (type.Namespace.equals("")) {
- Global.instance.operation("Ignoring top-level type " + type);
- continue;
- }
-
- assert snw.toString(peckage).equals(type.Namespace)
- : Debug.show(peckage) + " << " + type.FullName;
+ assert namespace.equals(type.Namespace)
+ : Debug.show(clasz, namespace) + " << " + type.FullName;
AbstractFile symfile = null;
if (type.IsDefined(clrTypes.SCALA_SYMTAB_ATTR, false)) {
Object[] attrs = type.GetCustomAttributes
(clrTypes.SCALA_SYMTAB_ATTR, false);
assert attrs.length == 1 : attrs.length;
Attribute a = (Attribute)attrs[0];
- assert a.GetType() == clrTypes.SCALA_SYMTAB_ATTR : a.toString();
+ assert a.GetType() == clrTypes.SCALA_SYMTAB_ATTR : a.toString();
byte[] symtab = (byte[])a.getConstructorArguments()[0];
symfile = new ByteArrayFile
(type.FullName, "[" + type.Assembly().GetName() + "]",
@@ -101,40 +124,22 @@ public final class CLRPackageParser extends PackageParser {
: new CLRClassParser(Global.instance, type);
Name classname = Name.fromString(type.Name).toTypeName();
- Symbol clazz = peckage.newLoadedClass
- (Modifiers.JAVA, classname, loader, members);
+ Symbol clazz = clasz.newLoadedClass
+ (JAVA, classname, loader, members);
clrTypes.map(clazz, type);
//Type moduleType = getType(type.FullName + "$");
//map(clazz, moduleType != null ? moduleType : type);
}
- 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();
- SymbolLoader loader = new CLRPackageParser(global, dfile);
- peckage.newLoadedPackage(Name.fromString(name), loader, members);
- namespaces.remove(name);
- }
-
- // import the CLR namespaces contained in the package (namespace)
- for (Iterator i = namespaces.iterator(); i.hasNext(); ) {
- String namespace = (String)i.next();
- Name name = Name.fromString(namespace);
- Symbol p = members.lookup(name);
- if (p == Symbol.NONE) {
- SymbolLoader loader = new CLRPackageParser(global, null);
- peckage.newLoadedPackage(name, this, members);
- } else {
- System.out.println("package already in scope: " + Debug.show(p));
- }
- }
+ return members;
+ }
- // initialize package
- peckage.setInfo(scalac.symtab.Type.compoundType
- (scalac.symtab.Type.EMPTY_ARRAY, members, peckage));
- return "namespace '" + snw.toString(peckage) + "'";
+ protected String doComplete(Symbol root) {
+ String base = super.doComplete(root);
+ base = directory == EMPTY ? "" : base + " and ";
+ String namespace = CLRTypes.instance().getNameSpaceOf(root);
+ return base + "namespace '" + namespace + "'";
}
- //##########################################################################
+ //########################################################################
} // CLRPackageParser