summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sources/scalac/symtab/classfile/CLRPackageParser.java3
-rw-r--r--sources/scalac/symtab/classfile/PackageParser.java52
-rw-r--r--test/files/neg/bug72.check4
3 files changed, 55 insertions, 4 deletions
diff --git a/sources/scalac/symtab/classfile/CLRPackageParser.java b/sources/scalac/symtab/classfile/CLRPackageParser.java
index 4ad89311c2..f82d164f92 100644
--- a/sources/scalac/symtab/classfile/CLRPackageParser.java
+++ b/sources/scalac/symtab/classfile/CLRPackageParser.java
@@ -69,7 +69,8 @@ public final class CLRPackageParser extends PackageParser {
}
protected void removeHiddenMembers(Symbol clasz) {
- // Ignore all ".class" files.
+ // Ignore all ".symbl" and ".class" files.
+ symbols.clear();
classes.clear();
super.removeHiddenMembers(clasz);
// Classes/Objects in the root package are hidden.
diff --git a/sources/scalac/symtab/classfile/PackageParser.java b/sources/scalac/symtab/classfile/PackageParser.java
index 86b62fa6c8..50b2fbbc2c 100644
--- a/sources/scalac/symtab/classfile/PackageParser.java
+++ b/sources/scalac/symtab/classfile/PackageParser.java
@@ -10,6 +10,8 @@ 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;
@@ -36,6 +38,8 @@ public class PackageParser extends SymbolLoader {
/** 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 */
@@ -77,6 +81,11 @@ public class PackageParser extends SymbolLoader {
if (!classes.containsKey(name)) classes.put(name, file);
continue;
}
+ if (filename.endsWith(".symbl")) {
+ String name = filename.substring(0, filename.length() - 6);
+ if (!symbols.containsKey(name)) symbols.put(name, file);
+ continue;
+ }
if (filename.endsWith(".scala")) {
String name = filename.substring(0, filename.length() - 6);
if (!sources.containsKey(name)) sources.put(name, file);
@@ -92,7 +101,33 @@ public class PackageParser extends SymbolLoader {
*/
protected void removeHiddenMembers(Symbol clasz) {
// Classes/Objects in the root package are hidden.
- if (clasz.isRoot()) { sources.clear(); classes.clear(); }
+ 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(); ) {
+ 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
@@ -102,8 +137,14 @@ public class PackageParser extends SymbolLoader {
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;
@@ -113,6 +154,7 @@ public class PackageParser extends SymbolLoader {
}
// 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());
}
@@ -131,6 +173,14 @@ public class PackageParser extends SymbolLoader {
SymbolLoader loader = new SourceCompleter(global, sfile);
clasz.newLoadedClass(0, classname, loader, members);
}
+ 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);
+ clasz.newLoadedClass(0, classname, loader, members);
+ }
for (Iterator i = classes.entrySet().iterator(); i.hasNext(); ) {
HashMap.Entry entry = (HashMap.Entry)i.next();
String name = (String)entry.getKey();
diff --git a/test/files/neg/bug72.check b/test/files/neg/bug72.check
index eea821046d..3deb871cbb 100644
--- a/test/files/neg/bug72.check
+++ b/test/files/neg/bug72.check
@@ -1,4 +1,4 @@
-bug72.scala:5: object Set of type scala.collection.mutable.Set.type cannot be applied to (java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String) with expected result type scala.collection.mutable.Set[java.lang.String]
+bug72.scala:5: not found: value Set
val weekDays : Set[String] = Set("Mon", "Tue", "Wed", "Thu", "Fri");
- ^
+ ^
one error found