summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config/list/compiler.lst2
-rw-r--r--sources/scalac/symtab/SourceCompleter.java2
-rw-r--r--sources/scalac/symtab/Symbol.java33
-rw-r--r--sources/scalac/symtab/classfile/ClassParser.java1
-rw-r--r--sources/scalac/symtab/classfile/ClassfileParser.java3
-rw-r--r--sources/scalac/typechecker/Analyzer.java85
-rw-r--r--sources/scalac/typechecker/RefCheck.java6
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) {