From 7ccd1ed4734c6d53b0d5cde4dd6d2e41facd6ab4 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Wed, 16 Jul 2003 16:27:52 +0000 Subject: *** empty log message *** --- config/list/compiler.lst | 2 + sources/scalac/symtab/SourceCompleter.java | 2 +- sources/scalac/symtab/Symbol.java | 33 +++++++-- sources/scalac/symtab/classfile/ClassParser.java | 1 + .../scalac/symtab/classfile/ClassfileParser.java | 3 +- sources/scalac/typechecker/Analyzer.java | 85 +++++++++++----------- sources/scalac/typechecker/RefCheck.java | 6 +- 7 files changed, 75 insertions(+), 57 deletions(-) diff --git a/config/list/compiler.lst b/config/list/compiler.lst index 677ed2baaa..944fe6660f 100644 --- a/config/list/compiler.lst +++ b/config/list/compiler.lst @@ -63,6 +63,8 @@ symtab/classfile/JavaTypeCreator.java symtab/classfile/JavaTypeFactory.java symtab/classfile/PackageParser.java symtab/classfile/Signatures.java +symtab/classfile/UnPickle.java +symtab/classfile/EntryTags.java symtab/Definitions.java symtab/Kinds.java diff --git a/sources/scalac/symtab/SourceCompleter.java b/sources/scalac/symtab/SourceCompleter.java index 1fe722abac..cf4938ccde 100644 --- a/sources/scalac/symtab/SourceCompleter.java +++ b/sources/scalac/symtab/SourceCompleter.java @@ -29,7 +29,7 @@ public class SourceCompleter extends Type.LazyType { this.filename = filename; } - /** complete class symbol c by loading the class + /** complete class symbol c by loading the unit */ public void complete(Symbol c) { if (completed) { diff --git a/sources/scalac/symtab/Symbol.java b/sources/scalac/symtab/Symbol.java index f6466931d7..980e11fd01 100644 --- a/sources/scalac/symtab/Symbol.java +++ b/sources/scalac/symtab/Symbol.java @@ -56,7 +56,7 @@ public abstract class Symbol implements Modifiers, Kinds { /** The infos of the symbol */ private TypeIntervalList infos = TypeIntervalList.EMPTY; - static int FIRST_ID = Global.POST_ANALYZER_PHASE_ID; + static public int FIRST_ID = Global.POST_ANALYZER_PHASE_ID; // Constructors ----------------------------------------------------------- @@ -168,6 +168,10 @@ public abstract class Symbol implements Modifiers, Kinds { // Symbol classification ---------------------------------------------------- + public final boolean isDefined() { + return !(rawInfoAt(FIRST_ID) instanceof Type.LazyType); + } + /** Does this symbol denote a type? */ public final boolean isType() { return kind == TYPE || kind == CLASS || kind == ALIAS; @@ -961,17 +965,25 @@ public class TermSymbol extends Symbol { return newConstructor(clazz, clazz.flags & (ACCESSFLAGS | JAVA)); } - public static TermSymbol newModule(int pos, Name name, Symbol owner, int flags) { + public static TermSymbol newModule(int pos, Name name, Symbol owner, + int flags, ClassSymbol clazz) { TermSymbol sym = new TermSymbol(pos, name, owner, flags | MODUL | FINAL); - Symbol clazz = new ClassSymbol( - pos, name.toTypeName(), owner, flags | MODUL | FINAL, sym); - clazz.constructor().setInfo( - Type.MethodType(Symbol.EMPTY_ARRAY, clazz.typeConstructor())); sym.clazz = clazz; + clazz.setModule(sym); sym.setInfo(clazz.typeConstructor()); return sym; } + public static TermSymbol newModule(int pos, Name name, Symbol owner, + int flags) { + ClassSymbol clazz = new ClassSymbol( + pos, name.toTypeName(), owner, flags | MODUL | FINAL); + clazz.constructor().setInfo( + Type.MethodType(Symbol.EMPTY_ARRAY, clazz.typeConstructor())); + + return newModule(pos, name, owner, flags, clazz); + } + /** Constructor for companion modules to classes, which need to be completed. */ public static TermSymbol newCompanionModule(Symbol clazz, int flags, Type.LazyType parser) { @@ -1257,11 +1269,11 @@ public class ClassSymbol extends TypeSymbol { } /** Constructor for module classes and classes with static members. - */ public ClassSymbol(int pos, Name name, Symbol owner, int flags, Symbol module) { this(pos, name, owner, flags); this.module = module; } + */ /** Constructor for classes to load as source files */ @@ -1282,7 +1294,8 @@ public class ClassSymbol extends TypeSymbol { /** Return a fresh symbol with the same fields as this one. */ public Symbol cloneSymbol(Symbol owner) { - ClassSymbol other = new ClassSymbol(pos, name, owner, flags, module); + ClassSymbol other = new ClassSymbol(pos, name, owner, flags); + other.module = module; other.setInfo(info()); other.constructor.setInfo( fixClonedConstrType( @@ -1320,6 +1333,10 @@ public class ClassSymbol extends TypeSymbol { return module; } + /** Set module; only used internally from TermSymbol + */ + void setModule(Symbol module) { this.module = module; } + /** Set the mangled name of this Symbol */ public Symbol setMangledName(Name name) { this.mangled = name; diff --git a/sources/scalac/symtab/classfile/ClassParser.java b/sources/scalac/symtab/classfile/ClassParser.java index 6f3a5605db..5ebf85e774 100644 --- a/sources/scalac/symtab/classfile/ClassParser.java +++ b/sources/scalac/symtab/classfile/ClassParser.java @@ -19,6 +19,7 @@ public class ClassParser extends Type.LazyType { /** the global compilation environment */ protected Global global; + private boolean completed = false; public ClassParser(Global global) { this.global = global; diff --git a/sources/scalac/symtab/classfile/ClassfileParser.java b/sources/scalac/symtab/classfile/ClassfileParser.java index ae08c390e3..2272b6dc21 100644 --- a/sources/scalac/symtab/classfile/ClassfileParser.java +++ b/sources/scalac/symtab/classfile/ClassfileParser.java @@ -226,8 +226,7 @@ public class ClassfileParser implements ClassfileConstants { transFlags(flags)); s.setInfo(type, phaseId); attrib.readAttributes(s, type, METH_ATTR); - if (!s.isPrivate()) // Don't include PRIVATE methods - ((flags & 0x0008) != 0 ? statics : locals).enterOrOverload(s); + ((flags & 0x0008) != 0 ? statics : locals).enterOrOverload(s); } } } diff --git a/sources/scalac/typechecker/Analyzer.java b/sources/scalac/typechecker/Analyzer.java index 5ddd9b9d5a..2cd0853f76 100644 --- a/sources/scalac/typechecker/Analyzer.java +++ b/sources/scalac/typechecker/Analyzer.java @@ -21,6 +21,7 @@ import scalac.util.*; import scalac.ast.*; import scalac.ast.printer.*; import scalac.symtab.*; +import scalac.symtab.classfile.UnPickle; import Tree.*; import java.util.HashMap; @@ -88,12 +89,12 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { } public void lateEnter(Unit unit, Symbol sym) { - assert sym.pos == Position.NOPOS : sym; + assert sym.rawInfoAt(Symbol.FIRST_ID) instanceof SourceCompleter; enterUnit(unit); - if (sym.pos == Position.NOPOS) { + if (sym.rawInfoAt(Symbol.FIRST_ID) instanceof SourceCompleter) { sym.setInfo(Type.ErrorType); String kind; - if (sym.name.isTermName()) kind = "object or method "; + if (sym.name.isTermName()) kind = "object "; else if (sym.name.isTypeName()) kind = "class "; else kind = "constructor "; throw new Type.Error("file " + unit.source + " does not define public " + @@ -794,18 +795,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { if (other.isPreloaded()) { // symbol was preloaded from package; // need to overwrite definition. - if (global.debug) System.out.println(sym + " overwrites " + other);//debug - sym.copyTo(other); - if (sym.isModule()) { - sym.moduleClass().copyTo( - other.moduleClass()); - sym.moduleClass().constructor().copyTo( - other.moduleClass().constructor()); - other.moduleClass().constructor().setInfo( - Type.MethodType( - Symbol.EMPTY_ARRAY, - other.moduleClass().typeConstructor())); - } + UnPickle.overwrite(sym, other); result = other; } else if (sym.owner().isPackage()) { if (global.compiledNow.get(other) != null) { @@ -2107,7 +2097,9 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { } } else { qual1 = transform(qual, TYPEmode | FUNmode); - clazz = qual1.symbol(); + clazz = qualifyingClass(qual1); + if (clazz.kind == CLASS && !(qual1 instanceof Tree.Ident)) + qual1 = gen.Ident(tree.pos, clazz); } switch (clazz.info()) { case CompoundType(Type[] parents, _): @@ -2133,20 +2125,10 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { } } else { Tree qual1 = transform(qual, TYPEmode | FUNmode); - clazz = qual1.symbol(); - if (clazz.kind == CLASS) { - Context clazzContext = context.outerContext(clazz); - if (clazzContext != Context.NONE) { - if (!(qual1 instanceof Tree.Ident)) - qual1 = gen.Ident(tree.pos, clazz); - tree1 = copy.This(tree, qual1); - } else { - return error(qual.pos, - clazz.name + " is not an enclosing class"); - } - } else { - return error(qual.pos, "class identifier expected"); - } + clazz = qualifyingClass(qual1); + if (clazz.kind == CLASS && !(qual1 instanceof Tree.Ident)) + qual1 = gen.Ident(tree.pos, clazz); + tree1 = copy.This(tree, qual1); } return tree1.setType( (pt != null && pt.isStable() || (mode & QUALmode) != 0) @@ -2253,6 +2235,24 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { return tree; } } + //where + private Symbol qualifyingClass(Tree qual) { + Tree qual1 = transform(qual, TYPEmode | FUNmode); + Symbol clazz = qual1.symbol(); + if (clazz.kind == CLASS) { + Context clazzContext = context.outerContext(clazz); + if (clazzContext != Context.NONE) { + return clazz; + } else { + error(qual.pos, clazz.name + " is not an enclosing class"); + return Symbol.NONE; + } + } else { + error(qual.pos, "class identifier expected"); + return Symbol.NONE; + } + + } // /////////////// // sequence helper function @@ -2266,20 +2266,19 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { public void desug_allIdentPatterns( Tree trees[], Symbol currentOwner ) { for( int i = 0; i < trees.length; i ++ ) - switch( trees[ i ] ) { + switch(trees[i]) { case Ident( Name name ): - if( name != Names.WILDCARD ) - { - Symbol vble = context.scope.lookup( name ); - /* - Symbol vble = new TermSymbol( trees[ i ].pos, name, currentOwner, 0) - .setType( trees[ i ].type() ); - - vble = enterInScope( vble ); - */ - trees[ i ] = desugarize.IdentPattern( trees[ i ] ).setSymbol( vble ) - .setType( vble.type() ); - } + if( name != Names.WILDCARD ) { + Symbol vble = context.scope.lookup( name ); + /* + Symbol vble = new TermSymbol( trees[ i ].pos, name, currentOwner, 0) + .setType( trees[ i ].type() ); + + vble = enterInScope( vble ); + */ + trees[i] = desugarize.IdentPattern(trees[i]).setSymbol(vble) + .setType(vble.type()); + } } } diff --git a/sources/scalac/typechecker/RefCheck.java b/sources/scalac/typechecker/RefCheck.java index 4a3a6379f9..0c11ec8e16 100644 --- a/sources/scalac/typechecker/RefCheck.java +++ b/sources/scalac/typechecker/RefCheck.java @@ -66,9 +66,9 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { for (Scope.SymbolIterator it = closure[i].members().iterator(); it.hasNext();) { Symbol other = it.next(); - Symbol member = clazz.info().lookup(other.name); - if (other != member && (other.flags & PRIVATE) == 0 && - member.kind != NONE) + Symbol member = ((other.flags & PRIVATE) != 0) ? other + : clazz.info().lookup(other.name); + if (member != other && member.kind != NONE) checkOverride(pos, clazz, member, other); if (clazz.kind == CLASS && (clazz.flags & ABSTRACTCLASS) == 0) { if ((member.flags & DEFERRED) != 0) { -- cgit v1.2.3