diff options
author | schinz <schinz@epfl.ch> | 2003-03-07 16:27:38 +0000 |
---|---|---|
committer | schinz <schinz@epfl.ch> | 2003-03-07 16:27:38 +0000 |
commit | 14bc0c4f0df23f78fcd143a719113b1c1c37c4ea (patch) | |
tree | 9fe916f90afb21b44fc403428e4b7c53807adc5d /sources | |
parent | be7a96e1b5f518421414a81298cad41cb8e52bf5 (diff) | |
download | scala-14bc0c4f0df23f78fcd143a719113b1c1c37c4ea.tar.gz scala-14bc0c4f0df23f78fcd143a719113b1c1c37c4ea.tar.bz2 scala-14bc0c4f0df23f78fcd143a719113b1c1c37c4ea.zip |
- bug fix: correctly pass outer link to constru...
- bug fix: correctly pass outer link to constructors of outer classes
built inside of inner classes
Diffstat (limited to 'sources')
-rw-r--r-- | sources/scalac/transformer/ExplicitOuterClasses.java | 54 |
1 files changed, 23 insertions, 31 deletions
diff --git a/sources/scalac/transformer/ExplicitOuterClasses.java b/sources/scalac/transformer/ExplicitOuterClasses.java index 43f3056d2a..0df2103e1e 100644 --- a/sources/scalac/transformer/ExplicitOuterClasses.java +++ b/sources/scalac/transformer/ExplicitOuterClasses.java @@ -110,22 +110,29 @@ public class ExplicitOuterClasses extends Transformer { (Template)transform((Tree)classDef.impl)); } + // Return the number of outer links to follow to find the given + // symbol. + protected int outerLevel(Symbol sym) { + Iterator classIt = classStack.iterator(); + for (int level = 0; classIt.hasNext(); ++level) { + Symbol classSym = (Symbol)classIt.next(); + if (classSym.closurePos(sym) != -1) + return level; + } + return -1; + } + // Return a tree referencing the "level"th outer class. protected Tree outerRef(int level) { - assert level > 0 : level; + assert level >= 0 : level; - Tree root = null; + Symbol thisSym = (Symbol)classStack.getFirst(); + Tree root = gen.This(thisSym.pos, thisSym); Iterator outerIt = outerLinks.iterator(); - while (level > 0) { + for (int l = 1; l <= level; ++l) { Symbol outerSym = (Symbol)outerIt.next(); - - if (root == null) - root = gen.mkStable(gen.Ident(outerSym)); - else - root = gen.mkStable(gen.Select(root, outerSym)); - - --level; + root = gen.mkStable(gen.Select(root, outerSym)); } return root; @@ -157,22 +164,10 @@ public class ExplicitOuterClasses extends Transformer { return super.transform(tree); // Follow "outer" links to fetch data in outer classes. - Symbol sym = tree.symbol(); - Symbol owner = sym.classOwner(); - - Iterator classIt = classStack.iterator(); - boolean found = false; - int level = -1; - while (!found && classIt.hasNext()) { - Symbol classSym = (Symbol)classIt.next(); - if (classSym.closurePos(owner) != -1) - found = true; - ++level; - } - - if (found && level > 0) { + int level = outerLevel(tree.symbol().classOwner()); + if (level > 0) { Tree root = outerRef(level); - return gen.mkStable(gen.Select(root, sym)); + return gen.mkStable(gen.Select(root, tree.symbol())); } else { return super.transform(tree); } @@ -205,13 +200,10 @@ public class ExplicitOuterClasses extends Transformer { } break; case Ident(Name name): { - Symbol owner = realFun.symbol().owner(); - - if (!classStack.isEmpty() - && ((Symbol)classStack.getFirst()).closurePos(owner) != -1) { - Symbol thisSym = (Symbol)classStack.getFirst(); + int level = outerLevel(realFun.symbol().owner()); + if (level >= 0) { newFun = realFun; - newArg = gen.This(realFun.pos, thisSym); + newArg = outerRef(level); } } break; |