summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2004-07-08 10:28:37 +0000
committerMartin Odersky <odersky@gmail.com>2004-07-08 10:28:37 +0000
commitce3243d0a453d706dd9b6038b3bee92f4264903c (patch)
treec3e2d4551e5998f9feeb1ac0c9b59e52935c7484
parentbc7e8ae564e604d082ff0cf0a8b9de2fda4c89b6 (diff)
downloadscala-ce3243d0a453d706dd9b6038b3bee92f4264903c.tar.gz
scala-ce3243d0a453d706dd9b6038b3bee92f4264903c.tar.bz2
scala-ce3243d0a453d706dd9b6038b3bee92f4264903c.zip
*** empty log message ***
-rw-r--r--sources/scala/tools/scalac/ast/printer/TextTreePrinter.scala2
-rw-r--r--sources/scala/tools/scalac/transformer/UnCurry.scala7
-rw-r--r--sources/scala/tools/scalac/transformer/UnCurryPhase.scala3
-rw-r--r--sources/scala/tools/scalac/typechecker/Analyzer.scala7
-rwxr-xr-xsources/scala/tools/scalac/typechecker/RefCheck.scala10
-rw-r--r--sources/scala/tools/scalac/wholeprog/MonomorphicCS.scala2
-rw-r--r--sources/scala/tools/scaladoc/HTMLGenerator.java2
-rw-r--r--sources/scala/tools/scaladoc/ScalaSearch.java51
-rw-r--r--sources/scala/tools/scalai/Environment.java2
-rw-r--r--sources/scalac/Global.java1
-rw-r--r--sources/scalac/backend/jvm/GenJVM.java6
-rw-r--r--sources/scalac/backend/msil/TypeCreator.java5
-rw-r--r--sources/scalac/symtab/Scope.java98
-rw-r--r--sources/scalac/symtab/Symbol.java113
-rw-r--r--sources/scalac/symtab/SymbolCloner.java6
-rw-r--r--sources/scalac/symtab/Type.java4
-rw-r--r--sources/scalac/symtab/classfile/ClassfileParser.java5
-rw-r--r--sources/scalac/symtab/classfile/Pickle.java7
-rw-r--r--sources/scalac/transformer/AddInterfaces.java9
-rw-r--r--sources/scalac/transformer/AddInterfacesPhase.java4
-rw-r--r--sources/scalac/transformer/Erasure.java54
-rw-r--r--sources/scalac/transformer/ExpandMixinsPhase.java3
-rw-r--r--sources/scalac/transformer/TypesAsValuesPhase.java3
-rw-r--r--sources/scalac/util/Debug.java2
24 files changed, 150 insertions, 256 deletions
diff --git a/sources/scala/tools/scalac/ast/printer/TextTreePrinter.scala b/sources/scala/tools/scalac/ast/printer/TextTreePrinter.scala
index 98b5d35119..6d1982c948 100644
--- a/sources/scala/tools/scalac/ast/printer/TextTreePrinter.scala
+++ b/sources/scala/tools/scalac/ast/printer/TextTreePrinter.scala
@@ -634,7 +634,7 @@ class TextTreePrinter(writer: PrintWriter) with TreePrinter {
if (symbol != null) {
val global: scalac_Global = scalac_Global.instance;
if (global.currentPhase.id > global.PHASE.EXPLICITOUTER.id()) {
- val i: Scope$SymbolIterator = symbol.members().iterator(true);
+ val i: Scope$SymbolIterator = symbol.members().iterator();
while (i.hasNext()) {
val member: Symbol = i.next();
if (member.isTypeAlias() || member.isAbstractType())
diff --git a/sources/scala/tools/scalac/transformer/UnCurry.scala b/sources/scala/tools/scalac/transformer/UnCurry.scala
index 9502703759..41f159beab 100644
--- a/sources/scala/tools/scalac/transformer/UnCurry.scala
+++ b/sources/scala/tools/scalac/transformer/UnCurry.scala
@@ -116,8 +116,11 @@ class UnCurry(global: scalac_Global, descr: UnCurryPhase) extends OwnerTransform
tree match {
case Tree$ClassDef(_, _, tparams, vparams, tpe, impl) =>
val clazz: Symbol = tree.symbol();
- val it = clazz.members().iterator();
- while (it.hasNext()) checkNoDoubleDef(clazz, it.next());
+ val elems = clazz.members().elements();
+ var i = 0; while (i < elems.length) {
+ checkNoDoubleDef(clazz, elems(i));
+ i = i + 1
+ }
copy.ClassDef(
tree, clazz, tparams,
uncurry(transform(vparams, clazz)),
diff --git a/sources/scala/tools/scalac/transformer/UnCurryPhase.scala b/sources/scala/tools/scalac/transformer/UnCurryPhase.scala
index 54789a84fb..5445d89cf5 100644
--- a/sources/scala/tools/scalac/transformer/UnCurryPhase.scala
+++ b/sources/scala/tools/scalac/transformer/UnCurryPhase.scala
@@ -67,10 +67,11 @@ class UnCurryPhase(global: scalac_Global, descriptor: PhaseDescriptor) extends P
base
case Type$CompoundType(parents, scope) =>
val symbol = tp.symbol();
+ // todo: why not remove all inherited alternatives here?
if (!symbol.isClass() || symbol.isCompoundSym()) tp
else {
val clone = new Scope();
- val it = scope.iterator(true);
+ val it = scope.iterator();
while (it.hasNext()) {
val member = it.next();
if (!isUnaccessedConstant(member) &&
diff --git a/sources/scala/tools/scalac/typechecker/Analyzer.scala b/sources/scala/tools/scalac/typechecker/Analyzer.scala
index 888dfe0c9f..81ef8f414f 100644
--- a/sources/scala/tools/scalac/typechecker/Analyzer.scala
+++ b/sources/scala/tools/scalac/typechecker/Analyzer.scala
@@ -1927,11 +1927,12 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer(
val templ1: Tree$Template = copy.Template(templ, parents, body1);
templ1.setType(owner.getType());
// initialize all members; necessary to initialize overloaded symbols
- val members = owner.members().iterator(false);
- while (members.hasNext()) {
- val sym = members.next();
+ val members: Array[Symbol] = owner.members().elements();
+ var i = 0; while (i < members.length) {
+ val sym = members(i);
sym.initialize();
//System.out.println(owner.toString() + " defines " + sym + ":" + sym.getType());//DEBUG
+ i = i + 1
}
templ1
}
diff --git a/sources/scala/tools/scalac/typechecker/RefCheck.scala b/sources/scala/tools/scalac/typechecker/RefCheck.scala
index fd997b4035..f97b1f77fd 100755
--- a/sources/scala/tools/scalac/typechecker/RefCheck.scala
+++ b/sources/scala/tools/scalac/typechecker/RefCheck.scala
@@ -86,16 +86,14 @@ class RefCheck(globl: scalac.Global) extends Transformer(globl) {
var i = 0; while (i < closure.length) {
val basetype = closure(i);
val baseclazz = basetype.symbol();
- val it = basetype.members().iterator(true);
- while (it.hasNext()) {
- val sym = it.next();
- if (sym.owner() == baseclazz) checkOverride(pos, clazz, sym);
- }
+ val it = basetype.members().iterator();
+ while (it.hasNext())
+ checkOverride(pos, clazz, it.next());
i = i + 1
}
val parents = clazz.info().parents();
- val it = clazz.members().iterator(true);
+ val it = clazz.members().iterator();
while (it.hasNext()) {
val sym = it.next();
if ((sym.flags & OVERRIDE) != 0 && sym.owner() == clazz) {
diff --git a/sources/scala/tools/scalac/wholeprog/MonomorphicCS.scala b/sources/scala/tools/scalac/wholeprog/MonomorphicCS.scala
index 029600a6d3..eb04b72f27 100644
--- a/sources/scala/tools/scalac/wholeprog/MonomorphicCS.scala
+++ b/sources/scala/tools/scalac/wholeprog/MonomorphicCS.scala
@@ -353,7 +353,7 @@ class MonomorphicCallSites(globall: scalac_Global, application: Set[Symbol]) {
// walk all subclasses
hierarchy.getInEdges(cls).foreach( (e) => {
val c = hierarchy.nodes(e.from).info;
- val it = c.members().iterator(true);
+ val it = c.members().iterator();
while (it.hasNext()) {
val m = it.next();
diff --git a/sources/scala/tools/scaladoc/HTMLGenerator.java b/sources/scala/tools/scaladoc/HTMLGenerator.java
index 72d6d5a0ca..8894586ba7 100644
--- a/sources/scala/tools/scaladoc/HTMLGenerator.java
+++ b/sources/scala/tools/scaladoc/HTMLGenerator.java
@@ -1850,7 +1850,7 @@ public abstract class HTMLGenerator {
// look for a member in the scope that has a tag
// @label with the given label
Scope scope = sym.moduleClass().members();
- SymbolIterator it = scope.iterator(true);
+ SymbolIterator it = scope.iterator();
while (it.hasNext()) {
Symbol member = (Symbol) it.next();
Tag[] tags = getComment(member).tags;
diff --git a/sources/scala/tools/scaladoc/ScalaSearch.java b/sources/scala/tools/scaladoc/ScalaSearch.java
index bb4165dfbc..94b8deaea2 100644
--- a/sources/scala/tools/scaladoc/ScalaSearch.java
+++ b/sources/scala/tools/scaladoc/ScalaSearch.java
@@ -106,51 +106,6 @@ public class ScalaSearch {
!isPhantom(sym);
}
- //////////////////////// SCOPE ITERATOR //////////////////////////////
-
- /** A symbol iterator that returns all alternatives of an overloaded symbol
- * instead of the overloaded symbol itself (does not unload lazy symbols).
- */
- public static class UnloadLazyIterator extends SymbolIterator {
- private SymbolIterator iterator;
- private Symbol[] alternatives;
- private int index;
-
- public UnloadLazyIterator(SymbolIterator iterator) {
- this.iterator = iterator;
- this.alternatives = null;
- this.index = -1;
- }
-
- public boolean hasNext() {
- return index >= 0 || iterator.hasNext();
- }
- public Symbol next() {
- if (index >= 0) {
- Symbol symbol = alternatives[index++];
- if (index == alternatives.length) {
- alternatives = null;
- index = -1;
- }
- return symbol;
- } else {
- Symbol symbol = iterator.next();
- if (isLazy(symbol))
- return symbol;
- else {
- switch (symbol.type()) {
- case OverloadedType(Symbol[] alts, _):
- alternatives = alts;
- index = 0;
- return next();
- default:
- return symbol;
- }
- }
- }
- }
- }
-
////////////////////////// TRAVERSER ///////////////////////////////
/** Function from Symbol to void.
@@ -177,7 +132,7 @@ public class ScalaSearch {
if (isContainer(sym) && !isLazy(sym)) {
List memberList = new LinkedList();
SymbolIterator i =
- new UnloadLazyIterator(sym.members().iterator(false));
+ sym.members().iterator();
while (i.hasNext()) {
Symbol member = i.next();
if (isRelevant(member))
@@ -209,7 +164,7 @@ public class ScalaSearch {
if (isContainer(sym) && !isLazy(sym)) {
List memberList = new LinkedList();
SymbolIterator i =
- new UnloadLazyIterator(sym.members().iterator(false));
+ sym.members().iterator();
while (i.hasNext()) {
Symbol member = i.next();
if (isDocumented.apply(member) && isRelevant(sym))
@@ -480,7 +435,7 @@ public class ScalaSearch {
protected static void collectNames(Type tpe, List/*<Name>*/ names) {
// local members
SymbolIterator it =
- new UnloadLazyIterator(tpe.members().iterator(false));
+ tpe.members().iterator();
while (it.hasNext()) {
Name name = ((Symbol) it.next()).name;
if (!names.contains(name))
diff --git a/sources/scala/tools/scalai/Environment.java b/sources/scala/tools/scalai/Environment.java
index 1a1a056975..0099bcff3f 100644
--- a/sources/scala/tools/scalai/Environment.java
+++ b/sources/scala/tools/scalai/Environment.java
@@ -228,7 +228,7 @@ public class Environment {
private void loadTemplateOverrides(Symbol symbol) {
Type[] bases = symbol.parents();
- SymbolIterator i = symbol.members().iterator(true);
+ SymbolIterator i = symbol.members().iterator();
while (i.hasNext()) loadMethodOverride(bases, i.next());
}
diff --git a/sources/scalac/Global.java b/sources/scalac/Global.java
index 9b50265f06..e164dec350 100644
--- a/sources/scalac/Global.java
+++ b/sources/scalac/Global.java
@@ -377,6 +377,7 @@ public abstract class Global {
while (currentPhase.next != null && reporter.errors() == 0) {
currentPhase = currentPhase.next;
start();
+ // System.out.println("*** " + currentPhase.descriptor.description() + " ***");
// !!! new scalac.checkers.SymbolChecker(this).check();
currentPhase.apply(units);
stop(currentPhase.descriptor.taskDescription());
diff --git a/sources/scalac/backend/jvm/GenJVM.java b/sources/scalac/backend/jvm/GenJVM.java
index d9dc030646..16556792c0 100644
--- a/sources/scalac/backend/jvm/GenJVM.java
+++ b/sources/scalac/backend/jvm/GenJVM.java
@@ -1317,7 +1317,7 @@ class GenJVM {
JClass.NO_INTERFACES,
ctx.sourceFileName);
Scope.SymbolIterator memberIt =
- new Scope.UnloadIterator(cSym.members().iterator());
+ cSym.members().iterator();
while (memberIt.hasNext()) {
Symbol member = memberIt.next();
if (!member.isMethod() || member.isInitializer())
@@ -1701,7 +1701,7 @@ class GenJVM {
protected void addValueClassMembers(Context ctx, Tree.ClassDef cDef) {
Symbol cSym = cDef.symbol();
Scope.SymbolIterator memberIt =
- new Scope.UnloadIterator(cSym.members().iterator());
+ cSym.members().iterator();
while (memberIt.hasNext()) {
Symbol member = memberIt.next();
if (member.isTerm() && !member.isMethod())
@@ -1722,7 +1722,7 @@ class GenJVM {
Phase bkpCurrent = global.currentPhase;
global.currentPhase = refCheckPhase;
Scope.SymbolIterator memberIt =
- new Scope.UnloadIterator(iSym.members().iterator());
+ iSym.members().iterator();
while (memberIt.hasNext()) {
Symbol member = memberIt.next();
if (member.isTerm() && !member.isMethod() && member.isPrivate())
diff --git a/sources/scalac/backend/msil/TypeCreator.java b/sources/scalac/backend/msil/TypeCreator.java
index 35c01d4615..1ddda5432e 100644
--- a/sources/scalac/backend/msil/TypeCreator.java
+++ b/sources/scalac/backend/msil/TypeCreator.java
@@ -790,7 +790,7 @@ final class TypeCreator {
if (clazz.isModuleClass() && staticType != null) {
syms2staticTypes.put(clazz, staticType);
}
- for (Scope.SymbolIterator syms = clazz.members().iterator(true);
+ for (Scope.SymbolIterator syms = clazz.members().iterator();
syms.hasNext(); )
{
Symbol member = syms.next();
@@ -815,7 +815,8 @@ final class TypeCreator {
ifaces.removeAll(getInterfacesOf(svper));
for (Iterator i = ifaces.iterator(); i.hasNext(); ) {
Symbol iface = (Symbol)i.next();
- for (Scope.SymbolIterator members = iface.members().iterator(true);
+ for (Scope.SymbolIterator members =
+ iface.members().iterator();
members.hasNext(); )
{
Symbol method = members.next();
diff --git a/sources/scalac/symtab/Scope.java b/sources/scalac/symtab/Scope.java
index cc76b5ab1d..f609bbf64a 100644
--- a/sources/scalac/symtab/Scope.java
+++ b/sources/scalac/symtab/Scope.java
@@ -13,48 +13,9 @@ import scalac.ApplicationError;
public class Scope {
- public static abstract class SymbolIterator {
- public abstract boolean hasNext();
- public abstract Symbol next();
- }
-
- /** A symbol iterator that returns all alternatives of an overloaded symbol
- * instead of the overloaded symbol itself.
- */
- public static class UnloadIterator extends SymbolIterator {
- private SymbolIterator iterator;
- private Symbol[] alternatives;
- private int index;
-
- public UnloadIterator(SymbolIterator iterator) {
- this.iterator = iterator;
- this.alternatives = null;
- this.index = -1;
- }
-
- public boolean hasNext() {
- return index >= 0 || iterator.hasNext();
- }
- public Symbol next() {
- if (index >= 0) {
- Symbol symbol = alternatives[index++];
- if (index == alternatives.length) {
- alternatives = null;
- index = -1;
- }
- return symbol;
- } else {
- Symbol symbol = iterator.next();
- switch (symbol.type()) {
- case OverloadedType(Symbol[] alts, _):
- alternatives = alts;
- index = 0;
- return next();
- default:
- return symbol;
- }
- }
- }
+ public abstract static class SymbolIterator {
+ public abstract boolean hasNext();
+ public abstract Symbol next();
}
public static class Entry {
@@ -198,6 +159,7 @@ public class Scope {
// assert !sym.isConstructor();
return enter(new Entry(sym, this));
}
+
public final Scope enterNoHide(Symbol sym) {
assert lookupEntry(sym.name) == Entry.NONE:
sym + " hides " + lookup(sym.name);
@@ -296,33 +258,45 @@ public class Scope {
return elemsCache;
}
- /** return all symbols as an iterator,
- * in the order they were entered in this scope.
- */
- public SymbolIterator iterator() { return new MySymbols(); }
+ class MySymbolIterator extends SymbolIterator {
+ private Symbol[] alternatives = Symbol.EMPTY_ARRAY;
+ private int altindex = 0;
+ private int elemindex = 0;
- public SymbolIterator iterator(boolean unload) {
- SymbolIterator iterator = iterator();
- return unload ? new UnloadIterator(iterator) : iterator;
- }
-
- class MySymbols extends SymbolIterator {
-
- private int index;
- MySymbols() {
+ public MySymbolIterator() {
elements();
- index = 0;
- }
+ }
- public boolean hasNext() {
- return index < elemsCache.length;
+ public boolean hasNext() {
+ return altindex < alternatives.length ||
+ elemindex < elemsCache.length;
}
- public Symbol next() {
- return elemsCache[index++];
- }
+ public Symbol next() {
+ if (altindex < alternatives.length)
+ return alternatives[altindex++];
+ else {
+ Symbol sym = elemsCache[elemindex++];
+ switch (sym.type()) {
+ case OverloadedType(Symbol[] alts, _):
+ alternatives = alts;
+ altindex = 0;
+ return next();
+ default:
+ return sym;
+ }
+ }
+ }
+ }
+
+ /** return all symbols as an iterator,
+ * in the order they were entered in this scope.
+ */
+ public SymbolIterator iterator() {
+ return new MySymbolIterator();
}
+
public String toString() {
return new SymbolTablePrinter().printScope(this).toString();
}
diff --git a/sources/scalac/symtab/Symbol.java b/sources/scalac/symtab/Symbol.java
index 5c518bc65c..586daeff92 100644
--- a/sources/scalac/symtab/Symbol.java
+++ b/sources/scalac/symtab/Symbol.java
@@ -804,10 +804,10 @@ public abstract class Symbol implements Modifiers, Kinds {
/** Is this symbol an overloaded symbol? */
public final boolean isOverloaded() {
- switch (info()) {
- case OverloadedType(_,_): return true;
- default : return false;
- }
+ Type tp = rawInfo();
+ return
+ tp instanceof Type.OverloadedType ||
+ tp instanceof LazyOverloadedType;
}
/** Does this symbol denote a label? */
@@ -983,21 +983,6 @@ public abstract class Symbol implements Modifiers, Kinds {
return this;
}
- /** Return first alternative if this has a (possibly lazy)
- * overloaded type, otherwise symbol itself.
- * Needed in ClassSymbol.primaryConstructor() and in UnPickle.
- */
- public Symbol firstAlternative() {
- if (infos == null)
- return this;
- else if (infos.info instanceof Type.OverloadedType)
- return infos.info.alternativeSymbols()[0];
- else if (infos.info instanceof LazyOverloadedType)
- return ((LazyOverloadedType) infos.info).sym1.firstAlternative();
- else
- return this;
- }
-
/**
* Returns the class of this module. This method may be invoked
* only on module symbols. It returns always a non-null module
@@ -1519,25 +1504,27 @@ public abstract class Symbol implements Modifiers, Kinds {
// Overloading and Overriding -------------------------------------------
+ /** Return first alternative if this has a (possibly lazy)
+ * overloaded type, otherwise symbol itself.
+ * Needed in ClassSymbol.primaryConstructor() and in UnPickle.
+ */
+ public Symbol firstAlternative() {
+ if (infos == null)
+ return this;
+ else if (infos.info instanceof Type.OverloadedType) {
+ Symbol result = infos.info.alternativeSymbols()[0];
+ assert !result.isOverloaded();
+ return result;
+ } else if (infos.info instanceof LazyOverloadedType)
+ return ((LazyOverloadedType) infos.info).sym1.firstAlternative();
+ else
+ return this;
+ }
+
/** Add another overloaded alternative to this symbol.
*/
public Symbol overloadWith(Symbol that) {
- assert isTerm() : Debug.show(this);
- assert this.name == that.name : Debug.show(this) + " <> " + Debug.show(that);
- //assert this.owner == that.owner : Debug.show(this) + " != " + Debug.show(that);
- assert this.isConstructor() == that.isConstructor();
- int overflags;
- //if (this.owner == that.owner)
- overflags = (this.flags & that.flags &
- (JAVA | ACCESSFLAGS | DEFERRED | PARAM | SYNTHETIC)) |
- ((this.flags | that.flags) & ACCESSOR);
- // else // it's an inherited overloaded alternative
- // overflags = this.flags & SOURCEFLAGS;
- Symbol overloaded = (this.isConstructor())
- ? this.constructorClass().newConstructor(this.constructorClass().pos, overflags)
- : owner.newTerm(pos, overflags, name, 0);
- overloaded.setInfo(new LazyOverloadedType(this, that));
- return overloaded;
+ throw new ApplicationError("overloadWith inapplicable for " + this);
}
/** A lazy type which, when forced computed the overloaded type
@@ -1743,6 +1730,26 @@ class TermSymbol extends Symbol {
return new TermSymbol(owner, pos, flags, name, attrs);
}
+ /** Add another overloaded alternative to this symbol.
+ */
+ public Symbol overloadWith(Symbol that) {
+ assert this.name == that.name : Debug.show(this) + " <> " + Debug.show(that);
+ //assert this.owner == that.owner : Debug.show(this) + " != " + Debug.show(that);
+ assert this.isConstructor() == that.isConstructor();
+
+ int overflags;
+ //if (this.owner == that.owner)
+ overflags = (this.flags & that.flags &
+ (JAVA | ACCESSFLAGS | DEFERRED | PARAM | SYNTHETIC)) |
+ ((this.flags | that.flags) & ACCESSOR);
+ // else // it's an inherited overloaded alternative
+ // overflags = this.flags & SOURCEFLAGS;
+ Symbol overloaded = (this.isConstructor())
+ ? this.constructorClass().newConstructor(this.constructorClass().pos, overflags)
+ : owner().newTerm(pos, overflags, name, 0);
+ overloaded.setInfo(new LazyOverloadedType(this, that));
+ return overloaded;
+ }
}
/** A class for constructor symbols */
@@ -2110,24 +2117,24 @@ public class ClassSymbol extends TypeSymbol {
Scope.SymbolIterator it = info().members().iterator();
Symbol sym = null;
if ((flags & JAVA) == 0) {
- for (int i = 0; i <= index; i++) {
- do {
- sym = it.next();
- } while (sym.kind != VAL || (sym.flags & CASEACCESSOR) == 0 || !sym.isMethod());
- }
- //System.out.println(this + ", case field[" + index + "] = " + sym);//DEBUG
- } else {
- sym = it.next();
- while ((sym.flags & SYNTHETIC) == 0) {
- //System.out.println("skipping " + sym);
- sym = it.next();
- }
- for (int i = 0; i < index; i++)
- sym = it.next();
- //System.out.println("field accessor = " + sym);//DEBUG
- }
- assert sym != null : this;
- return sym;
+ for (int i = 0; i <= index; i++) {
+ do {
+ sym = it.next();
+ } while (sym != NONE && sym.kind != VAL || (sym.flags & CASEACCESSOR) == 0 || !sym.isMethod());
+ }
+ //System.out.println(this + ", case field[" + index + "] = " + sym);//DEBUG
+ } else {
+ sym = it.next();
+ while (sym != NONE && (sym.flags & SYNTHETIC) == 0) {
+ //System.out.println("skipping " + sym);
+ sym = it.next();
+ }
+ for (int i = 0; i < index; i++)
+ sym = it.next();
+ //System.out.println("field accessor = " + sym);//DEBUG
+ }
+ assert sym != null : this;
+ return sym;
}
public final Symbol rebindSym() {
diff --git a/sources/scalac/symtab/SymbolCloner.java b/sources/scalac/symtab/SymbolCloner.java
index f7dd1ad182..a1a534fab6 100644
--- a/sources/scalac/symtab/SymbolCloner.java
+++ b/sources/scalac/symtab/SymbolCloner.java
@@ -90,7 +90,8 @@ public class SymbolCloner {
/** Clones the given scope but not the type of its members. */
public Scope cloneScopeWithoutTypes(Scope scope) {
Scope clone = new Scope();
- for (Scope.SymbolIterator i = scope.iterator(true); i.hasNext(); ) {
+ for (Scope.SymbolIterator i = scope.iterator();
+ i.hasNext(); ) {
clone.enterOrOverload(cloneSymbolWithoutType(i.next()));
}
return clone;
@@ -114,7 +115,8 @@ public class SymbolCloner {
/** Clones the given scope and the type of its members. */
public Scope cloneScope(Scope scope) {
Scope clone = cloneScopeWithoutTypes(scope);
- for (Scope.SymbolIterator i = scope.iterator(true); i.hasNext(); ) {
+ for (Scope.SymbolIterator i = scope.iterator();
+ i.hasNext(); ) {
Symbol member = i.next();
member.setType(cloneType(member.info()));
}
diff --git a/sources/scalac/symtab/Type.java b/sources/scalac/symtab/Type.java
index 65bb56a73a..f0ebe88b1e 100644
--- a/sources/scalac/symtab/Type.java
+++ b/sources/scalac/symtab/Type.java
@@ -2076,7 +2076,8 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags {
/** Does this type implement all symbols in scope `s' with same or stronger types?
*/
public boolean specializes(Scope s) {
- for (Scope.SymbolIterator it = s.iterator(true); it.hasNext();) {
+ for (Scope.SymbolIterator it = s.iterator();
+ it.hasNext();) {
if (!specializes(it.next())) return false;
}
return true;
@@ -2309,6 +2310,7 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags {
private boolean isSubScope(Scope s1, Scope s2) {
for (Scope.SymbolIterator it = s2.iterator(); it.hasNext(); ) {
Symbol sym2 = it.next();
+ // todo: handle overloaded
Symbol sym1 = s1.lookup(sym2.name);
if (sym1.kind != sym2.kind ||
!sym1.info().isSameAs(
diff --git a/sources/scalac/symtab/classfile/ClassfileParser.java b/sources/scalac/symtab/classfile/ClassfileParser.java
index a3470f4964..073df39e90 100644
--- a/sources/scalac/symtab/classfile/ClassfileParser.java
+++ b/sources/scalac/symtab/classfile/ClassfileParser.java
@@ -165,7 +165,7 @@ public class ClassfileParser implements ClassfileConstants {
if (m.isJava() && superclass.isJava()) {
Symbol mclass = m.moduleClass();
SymbolIterator i = superclass.linkedModule().moduleClass()
- .members().iterator(true);
+ .members().iterator();
outer:
while (i.hasNext()) {
Symbol member = i.next();
@@ -190,8 +190,9 @@ public class ClassfileParser implements ClassfileConstants {
private void addInheritedOverloaded() {
Symbol[] elems = c.members().elements();
- for (int i = 0; i < elems.length; i++)
+ for (int i = 0; i < elems.length; i++) {
addInheritedOverloaded(elems[i]);
+ }
}
private void addInheritedOverloaded(Symbol sym) {
diff --git a/sources/scalac/symtab/classfile/Pickle.java b/sources/scalac/symtab/classfile/Pickle.java
index 4bb9419b2b..17245a7eec 100644
--- a/sources/scalac/symtab/classfile/Pickle.java
+++ b/sources/scalac/symtab/classfile/Pickle.java
@@ -133,9 +133,10 @@ public class Pickle implements Kinds, Modifiers, EntryTags {
if (sym.isModuleClass()) putSymbol(sym.sourceModule());
putType(sym.typeOfThis());
putSymbol(sym.allConstructors());
- for (Scope.SymbolIterator it = sym.members().iterator();
- it.hasNext();)
- putSymbol(it.next());
+ Symbol[] elems = sym.members().elements();
+ for (int i = 0; i < elems.length; i++)
+ putSymbol(elems[i]);
+
break;
case VAL:
putType(sym.removeInheritedOverloaded(sym.info()));
diff --git a/sources/scalac/transformer/AddInterfaces.java b/sources/scalac/transformer/AddInterfaces.java
index a54bcc95e8..1f4b057ee4 100644
--- a/sources/scalac/transformer/AddInterfaces.java
+++ b/sources/scalac/transformer/AddInterfaces.java
@@ -227,13 +227,8 @@ public class AddInterfaces extends GenTransformer {
*/
private Tree getClassTree(Symbol clasz, TreeList body, Map methods) {
Scope members = clasz.nextInfo().members();
- /*
- for (Scope.SymbolIterator i = members.iterator(false); i.hasNext(); ) {
- Symbol sym = i.next();
- System.out.println(clasz + " defines " + sym + ":" + sym.getType());
- }
- */
- for (Scope.SymbolIterator i = members.iterator(true); i.hasNext(); ) {
+ for (Scope.SymbolIterator i = members.iterator();
+ i.hasNext(); ) {
Symbol member = i.next();
if (!member.isTerm()) continue;
body.append(getMemberTree(clasz, member, methods));
diff --git a/sources/scalac/transformer/AddInterfacesPhase.java b/sources/scalac/transformer/AddInterfacesPhase.java
index 9b7ebf6675..6cf968bfef 100644
--- a/sources/scalac/transformer/AddInterfacesPhase.java
+++ b/sources/scalac/transformer/AddInterfacesPhase.java
@@ -49,7 +49,7 @@ public class AddInterfacesPhase extends Phase {
Scope newMembers = new Scope();
Scope.SymbolIterator oldMembersIt =
- new Scope.UnloadIterator(tp.members().iterator());
+ tp.members().iterator();
while (oldMembersIt.hasNext()) {
Symbol member = oldMembersIt.next();
@@ -186,7 +186,7 @@ public class AddInterfacesPhase extends Phase {
// Clone all members, entering them in the class scope.
Scope classMembers = new Scope();
Scope.SymbolIterator ifaceMembersIt =
- new Scope.UnloadIterator(ifaceSym.members().iterator());
+ ifaceSym.members().iterator();
while (ifaceMembersIt.hasNext()) {
Symbol ifaceMemberSym = ifaceMembersIt.next();
diff --git a/sources/scalac/transformer/Erasure.java b/sources/scalac/transformer/Erasure.java
index d200aab112..ea77bdf926 100644
--- a/sources/scalac/transformer/Erasure.java
+++ b/sources/scalac/transformer/Erasure.java
@@ -113,7 +113,6 @@ public class Erasure extends GenTransformer implements Modifiers {
case ClassDef(_, _, _, _, _, Template(_, Tree[] body)):
Symbol clasz = tree.symbol();
TreeList members = new TreeList(transform(body));
- checkOverloadedTermsOf(clasz);
addBridges(clasz, members);
return gen.ClassDef(clasz, members.toArray());
@@ -570,56 +569,6 @@ public class Erasure extends GenTransformer implements Modifiers {
throw Debug.abort("non-array type", type);
}
- //########################################################################
- // Private Methods - Overlapping signatures detection
-
- /**
- * Checks that overloaded terms of the given class have no
- * overlapping erased signatures.
- */
- private void checkOverloadedTermsOf(Symbol clasz) {
- // !!! we might also accidentally override an inherited method !
- for (SymbolIterator si = clasz.members().iterator(); si.hasNext(); ) {
- Symbol symbol = si.next();
- if (!symbol.isTerm()) continue;
- switch (symbol.info()) {
- case OverloadedType(Symbol[] symbols, _):
- Type[] types = new Type[symbols.length];
- for (int i = 0; i < symbols.length; i++) {
- types[i] = symbols[i].nextType();
- for (int j = 0; j < i; j++) {
- if (!isSameAs(types[i], types[j])) continue;
- errorOverlappingSignatures(symbols[j], symbols[i]);
- break;
- }
- }
- }
- }
- }
-
- /** Reports an overlapping signature error for given symbols. */
- private void errorOverlappingSignatures(Symbol symbol1, Symbol symbol2) {
- SymbolTablePrinter printer = new SymbolTablePrinter(" ");
- printer.print("overlapping overloaded alternatives;").space();
- printer.print("the two following alternatives of").space();
- printer.printSymbolKindAndName(symbol1).space();
- printer.print("have the same erasure:").space();
- printer.printType(symbol1.nextType());
- Phase phase = global.currentPhase;
- global.currentPhase = global.PHASE.ANALYZER.phase();
- printer.indent();
- printer.line().print("alternative 1:").space().printSignature(symbol1);
- printer.line().print("alternative 2:").space().printSignature(symbol2);
- printer.undent();
- global.currentPhase = phase;
- unit.error(symbol2.pos, printer.toString());
- }
-
- //########################################################################
- //########################################################################
- //########################################################################
- //########################################################################
-
//////////////////////////////////////////////////////////////////////////////////
// Bridge Building
/////////////////////////////////////////////////////////////////////////////////
@@ -732,7 +681,8 @@ public class Erasure extends GenTransformer implements Modifiers {
}
private void addInterfaceBridgesAux(Symbol owner, Scope symbols) {
- for (Scope.SymbolIterator i = symbols.iterator(true); i.hasNext();) {
+ for (Scope.SymbolIterator i = symbols.iterator();
+ i.hasNext();) {
Symbol member = i.next();
if (!member.isTerm() || !member.isDeferred()) continue;
addInterfaceBridges(owner, member);
diff --git a/sources/scalac/transformer/ExpandMixinsPhase.java b/sources/scalac/transformer/ExpandMixinsPhase.java
index e43ed7b975..57c94a8708 100644
--- a/sources/scalac/transformer/ExpandMixinsPhase.java
+++ b/sources/scalac/transformer/ExpandMixinsPhase.java
@@ -394,7 +394,8 @@ public class ExpandMixinsPhase extends Phase {
private void createMixedInMemberSymbols(Scope symbols) {
Scope scope = clasz.members();
- for (SymbolIterator i = symbols.iterator(true); i.hasNext();) {
+ for (SymbolIterator i = symbols.iterator();
+ i.hasNext();) {
Symbol member = i.next();
boolean shadowed = member.isPrivate() || member.isInitializer()
|| member.overridingSymbol(clasz.thisType()) != member;
diff --git a/sources/scalac/transformer/TypesAsValuesPhase.java b/sources/scalac/transformer/TypesAsValuesPhase.java
index d3147ad981..d5b07dd28d 100644
--- a/sources/scalac/transformer/TypesAsValuesPhase.java
+++ b/sources/scalac/transformer/TypesAsValuesPhase.java
@@ -100,7 +100,8 @@ public class TypesAsValuesPhase extends Phase {
if (newSymbols == null) {
newSymbols = new HashMap();
- Scope.SymbolIterator membersIt = classSym.members().iterator(true);
+ Scope.SymbolIterator membersIt =
+ classSym.members().iterator();
while (membersIt.hasNext()) {
Symbol member = membersIt.next();
if (member.isType() /*&& !member.isClass()*/) {
diff --git a/sources/scalac/util/Debug.java b/sources/scalac/util/Debug.java
index 226c4668b8..ec688671a1 100644
--- a/sources/scalac/util/Debug.java
+++ b/sources/scalac/util/Debug.java
@@ -234,7 +234,7 @@ public class ScopeDebugger implements Debugger {
public void append(StringBuffer buffer, Object object) {
Scope scope = (Scope)object;
buffer.append('{');
- for (Scope.SymbolIterator i = scope.iterator(true); i.hasNext();) {
+ for (Scope.SymbolIterator i = scope.iterator(); i.hasNext();) {
Debug.append(buffer, i.next());
if (i.hasNext()) buffer.append(',');
}