diff options
author | Martin Odersky <odersky@gmail.com> | 2003-08-06 16:41:30 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2003-08-06 16:41:30 +0000 |
commit | e1d1b2d9b8797b2af95c247f840ccb11b1857dc7 (patch) | |
tree | 64b90516b728f57d4fb6263d5711b4704f0009b3 /sources/scalac/symtab | |
parent | 57fdd4109972ddadc83d5dbb23e50993a6359145 (diff) | |
download | scala-e1d1b2d9b8797b2af95c247f840ccb11b1857dc7.tar.gz scala-e1d1b2d9b8797b2af95c247f840ccb11b1857dc7.tar.bz2 scala-e1d1b2d9b8797b2af95c247f840ccb11b1857dc7.zip |
*** empty log message ***
Diffstat (limited to 'sources/scalac/symtab')
-rw-r--r-- | sources/scalac/symtab/Symbol.java | 21 | ||||
-rw-r--r-- | sources/scalac/symtab/Type.java | 2 | ||||
-rw-r--r-- | sources/scalac/symtab/classfile/AttributeParser.java | 19 | ||||
-rw-r--r-- | sources/scalac/symtab/classfile/ClassParser.java | 3 | ||||
-rw-r--r-- | sources/scalac/symtab/classfile/ClassfileParser.java | 9 | ||||
-rw-r--r-- | sources/scalac/symtab/classfile/PackageParser.java | 41 | ||||
-rw-r--r-- | sources/scalac/symtab/classfile/Pickle.java | 40 | ||||
-rw-r--r-- | sources/scalac/symtab/classfile/UnPickle.java | 3 |
8 files changed, 58 insertions, 80 deletions
diff --git a/sources/scalac/symtab/Symbol.java b/sources/scalac/symtab/Symbol.java index 280d3f73e6..55bb65b6ac 100644 --- a/sources/scalac/symtab/Symbol.java +++ b/sources/scalac/symtab/Symbol.java @@ -148,15 +148,13 @@ public abstract class Symbol implements Modifiers, Kinds { || info instanceof Type.PolyType && ((Type.PolyType)info).result instanceof Type.MethodType : "illegal type for " + this + ": " + info; - //if ((flags & (INITIALIZED | LOCKED)) != (INITIALIZED | LOCKED)) { - if (infos == TypeIntervalList.EMPTY) { - infos = new TypeIntervalList(TypeIntervalList.EMPTY); - } - infos.limit = limit; - infos.info = info; - if (info instanceof Type.LazyType) flags &= ~INITIALIZED; - else flags |= INITIALIZED; - //} + if (infos == TypeIntervalList.EMPTY) { + infos = new TypeIntervalList(TypeIntervalList.EMPTY); + } + infos.limit = limit; + infos.info = info; + if (info instanceof Type.LazyType) flags &= ~INITIALIZED; + else flags |= INITIALIZED; return this; } @@ -205,6 +203,7 @@ public abstract class Symbol implements Modifiers, Kinds { /** Does this symbol denote a value? */ public final boolean isValue() { + preInitialize(); return kind == VAL && !(isModule() && isJava()) && !isPackage(); } @@ -615,7 +614,8 @@ public abstract class Symbol implements Modifiers, Kinds { public final void preInitialize() { //todo: clean up if (infos.info instanceof ClassParser || - infos.info instanceof SourceCompleter) + infos.info instanceof SourceCompleter || + infos.info instanceof ClassParser.StaticsParser) infos.info.complete(this); } @@ -627,6 +627,7 @@ public abstract class Symbol implements Modifiers, Kinds { * its baseclasses and members. */ public Type info() { + //if (isModule()) moduleClass().initialize(); int id = currentPhaseId(); if ((flags & INITIALIZED) == 0) { Type info = rawInfoAt(FIRST_ID); diff --git a/sources/scalac/symtab/Type.java b/sources/scalac/symtab/Type.java index 7b27647e22..10578d02de 100644 --- a/sources/scalac/symtab/Type.java +++ b/sources/scalac/symtab/Type.java @@ -53,7 +53,7 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { */ public case TypeRef(Type pre, Symbol sym, Type[] args) { assert pre.isLegalPrefix() || pre == ErrorType : pre + "#" + sym; - assert sym.kind == ERROR || sym.isType() : pre + "#" + sym; + assert sym.kind == ERROR || sym.isType() : pre + " # " + sym; } /** parts_1 with ... with parts_n { members } diff --git a/sources/scalac/symtab/classfile/AttributeParser.java b/sources/scalac/symtab/classfile/AttributeParser.java index 4df2529b2d..a4cfc6fec6 100644 --- a/sources/scalac/symtab/classfile/AttributeParser.java +++ b/sources/scalac/symtab/classfile/AttributeParser.java @@ -81,18 +81,8 @@ public class AttributeParser implements ClassfileConstants { switch (attr) { // class attributes case SCALA_ATTR: - in.skip(attrLen); - /* not yet - Name sourcefile = (Name)pool.readPool(in.nextChar()); - new UnPickle( - (JavaClassSymbol) sym, in.nextBytes(attrLen - 2), sourcefile); - */ - return; - - case SOURCEFILE_ATTR: - // ((ClassDef)def).sourcefile = (Name)reader.readPool(in.nextChar()); - in.skip(attrLen); - return; + new UnPickle(sym, in.nextBytes(attrLen), Name.fromString(in.path)); + return; case INNERCLASSES_ATTR: /* int n = in.nextChar(); @@ -154,8 +144,11 @@ public class AttributeParser implements ClassfileConstants { new MetaParser(meta, tvars, sym, type).parse(), Symbol.FIRST_ID); return; + + default: + in.skip(attrLen); + return; } - throw new RuntimeException("unknown classfile attribute"); } Scope tvars = new Scope(); diff --git a/sources/scalac/symtab/classfile/ClassParser.java b/sources/scalac/symtab/classfile/ClassParser.java index 19eb931f3b..0dc29c87bb 100644 --- a/sources/scalac/symtab/classfile/ClassParser.java +++ b/sources/scalac/symtab/classfile/ClassParser.java @@ -28,6 +28,7 @@ public class ClassParser extends Type.LazyType { /** complete class symbol c by loading the class */ public void complete(Symbol c) { + c.owner().initialize(); //System.out.println("loading " + c);//DEBUG try { long msec = System.currentTimeMillis(); @@ -59,7 +60,7 @@ public class ClassParser extends Type.LazyType { return new AliasParser(alias); } - class StaticsParser extends Type.LazyType { + public class StaticsParser extends Type.LazyType { Symbol clazz; StaticsParser(Symbol clazz) { diff --git a/sources/scalac/symtab/classfile/ClassfileParser.java b/sources/scalac/symtab/classfile/ClassfileParser.java index 098be96b06..da5300cb42 100644 --- a/sources/scalac/symtab/classfile/ClassfileParser.java +++ b/sources/scalac/symtab/classfile/ClassfileParser.java @@ -97,11 +97,12 @@ public class ClassfileParser implements ClassfileConstants { c.setInfo(classType, Symbol.FIRST_ID); // set type of statics Symbol staticsClass = c.module().moduleClass(); - Type staticsInfo = Type.compoundType(Type.EMPTY_ARRAY, statics, staticsClass); - staticsClass.setInfo(staticsInfo, Symbol.FIRST_ID); - c.module().setInfo(Type.TypeRef(staticsClass.owner().thisType(), + if (staticsClass.isModuleClass()) { + Type staticsInfo = Type.compoundType(Type.EMPTY_ARRAY, statics, staticsClass); + staticsClass.setInfo(staticsInfo, Symbol.FIRST_ID); + c.module().setInfo(Type.TypeRef(staticsClass.owner().thisType(), staticsClass, Type.EMPTY_ARRAY)); - + } basetpes[0] = supertpe; for (int i = 1; i < basetpes.length; i++) basetpes[i] = readClassType(in.nextChar()); diff --git a/sources/scalac/symtab/classfile/PackageParser.java b/sources/scalac/symtab/classfile/PackageParser.java index 9fdbe797ed..1b29c7a0ef 100644 --- a/sources/scalac/symtab/classfile/PackageParser.java +++ b/sources/scalac/symtab/classfile/PackageParser.java @@ -8,10 +8,12 @@ package scalac.symtab.classfile; +import ch.epfl.lamp.util.*; import scalac.*; import scalac.symtab.*; import scalac.util.*; import java.io.*; +import java.util.HashMap; public class PackageParser extends Type.LazyType { @@ -39,18 +41,19 @@ public class PackageParser extends Type.LazyType { Scope members = new Scope(); String dirname = null; Name name = p.fullName(); + HashMap/*<Symbol, AbstractFile>*/ symFile = new HashMap(); if (name.length() == 0) { // includeMembers(AbstractFile.open(null, "."), p, members, false); } else { dirname = SourceRepresentation.externalizeFileName(name); - assert !dirname.startsWith("com") : p;//debug if (!dirname.endsWith("/")) dirname += "/"; } String[] base = global.classPath.components(); for (int i = 0; i < base.length; i++) { includeMembers( - AbstractFile.open(base[i], dirname), p, members, dirname != null); + AbstractFile.open(base[i], dirname), + p, members, dirname != null, symFile); } p.setInfo(Type.compoundType(Type.EMPTY_ARRAY, members, p)); if (dirname == null) @@ -59,11 +62,24 @@ public class PackageParser extends Type.LazyType { (System.currentTimeMillis() - msec) + "ms"); } + private boolean isMostRecent(AbstractFile f, Symbol previous, HashMap symFile) { + if (previous == Symbol.NONE || previous.isPackage()) return true; + if (previous.pos != Position.NOPOS) return false; + AbstractFile pf = (AbstractFile) symFile.get(previous); + if (!global.separate) { + if (f.getName().endsWith(".scala") && + pf.getName().endsWith(".class")) return true; + if (f.getName().endsWith(".class") && + pf.getName().endsWith(".scala")) return false; + } + return f.lastModified() > pf.lastModified(); + } + /** read directory of a classpath directory and include members * in package/module scope */ protected void includeMembers(AbstractFile dir, Symbol p, Scope locals, - boolean inclClasses) { + boolean inclClasses, HashMap symFile) { if (dir == null) return; String[] filenames = null; @@ -72,14 +88,17 @@ public class PackageParser extends Type.LazyType { return; for (int j = 0; j < filenames.length; j++) { String fname = filenames[j]; + AbstractFile f = dir.open(fname); if (inclClasses && fname.endsWith(".class")) { Name n = Name.fromString(fname.substring(0, fname.length() - 6)) .toTypeName(); - if (locals.lookup(n) == Symbol.NONE) { + if (isMostRecent(f, locals.lookup(n), symFile)) { ClassSymbol clazz = new ClassSymbol(n, p, classCompletion); // todo: needed? clazz.allConstructors().setInfo( classCompletion.staticsParser(clazz)); + clazz.module().setInfo( + classCompletion.staticsParser(clazz)); // enter class locals.enter(clazz); // enter module, except for scala.Object class @@ -93,14 +112,18 @@ public class PackageParser extends Type.LazyType { } locals.enter(clazz.module()); } + symFile.put(clazz, f); } } else if (fname.endsWith("/") && !fname.equals("META-INF/")) { Name n = Name.fromString(fname.substring(0, fname.length() - 1)); if (locals.lookup(n) == Symbol.NONE) { TermSymbol module = TermSymbol.newJavaPackageModule(n, p, this); locals.enter(module); + //todo: moduleClass needs to be entered? locals.enter(module.moduleClass()); - } + } + +/* } else if (inclClasses && fname.endsWith(".symbl")) { //todo: compare dates between symbl and scala. Name n = Name.fromString(fname.substring(0, fname.length() - 6)) @@ -117,14 +140,11 @@ public class PackageParser extends Type.LazyType { locals.enter(clazz); locals.enter(clazz.module()); } +*/ } else if (inclClasses && fname.endsWith(".scala")) { Name n = Name.fromString(fname.substring(0, fname.length() - 6)) .toTypeName(); - Symbol sym = locals.lookup(n); - if (sym == Symbol.NONE || - sym.isPackage() || - sym.rawInfoAt(Symbol.FIRST_ID) instanceof ClassParser && - !(sym.rawInfoAt(Symbol.FIRST_ID) instanceof SymblParser)) { + if (isMostRecent(f, locals.lookup(n), symFile)) { SourceCompleter completer = new SourceCompleter(global); ClassSymbol clazz = new ClassSymbol(n, p, completer); //todo: needed? @@ -133,6 +153,7 @@ public class PackageParser extends Type.LazyType { // enter class locals.enter(clazz); locals.enter(clazz.module()); + symFile.put(clazz, f); } } } diff --git a/sources/scalac/symtab/classfile/Pickle.java b/sources/scalac/symtab/classfile/Pickle.java index fe41289f8f..bae101668d 100644 --- a/sources/scalac/symtab/classfile/Pickle.java +++ b/sources/scalac/symtab/classfile/Pickle.java @@ -72,46 +72,6 @@ public class Pickle implements Kinds, Modifiers, EntryTags { return bp; } - /** Create output file with given extension for given class. - */ - public File outputFile(Name fullname, String extension) { - if (Global.instance.outpath != null) { - return new File( - Global.instance.outpath, - SourceRepresentation.externalizeFileName(fullname) + extension); - } else { - String s = fullname.toString(); - int i = s.length(); - while (i > 0 && s.charAt(i - 1) != '.') i--; - return new File(s.substring(i) + extension); - } - } - - private void createPath(File f) { - try { - f.createNewFile(); - } catch (IOException ex) { - f.getParentFile().mkdirs(); - try { - f.createNewFile(); - } catch (IOException ex1) { - } - } - } - - public void writeFile(Name fullname) { - File outfile = outputFile(fullname, ".symbl"); - try { - createPath(outfile); - FileOutputStream out = new FileOutputStream(outfile); - out.write(bytes, 0, bp); - out.close(); - Global.instance.operation("wrote " + outfile); - } catch (IOException ex) { - System.err.println("error writing " + outfile); - } - } - /* ************************************************** * Phase 1: Build entry table ************************************************* */ diff --git a/sources/scalac/symtab/classfile/UnPickle.java b/sources/scalac/symtab/classfile/UnPickle.java index de755fd7fd..07c30a60c4 100644 --- a/sources/scalac/symtab/classfile/UnPickle.java +++ b/sources/scalac/symtab/classfile/UnPickle.java @@ -35,7 +35,6 @@ public class UnPickle implements Kinds, Modifiers, EntryTags { Global global; UnPickle(Symbol root, byte[] data, Name sourceName) { - assert !root.isInitialized(); global = Global.instance; if (root.isConstructor()) { this.classroot = root.primaryConstructorClass(); @@ -70,6 +69,8 @@ public class UnPickle implements Kinds, Modifiers, EntryTags { if (global.debug) global.log("unpickled " + root + ":" + root.rawInfo());//debug if (!root.isInitialized()) throw new BadSignature(this, "it does not define " + root); + if (moduleroot.isModule() && !moduleroot.moduleClass().isInitialized()) + moduleroot.setInfo(Type.NoType); } Type setOwner(Type tp, Symbol owner) { |