diff options
-rw-r--r-- | sources/scalac/symtab/classfile/CLRPackageParser.java | 3 | ||||
-rw-r--r-- | sources/scalac/symtab/classfile/PackageParser.java | 52 | ||||
-rw-r--r-- | test/files/neg/bug72.check | 4 |
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 |