summaryrefslogtreecommitdiff
path: root/sources/scala/tools/nsc/transform/Flatten.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2005-09-13 14:35:48 +0000
committerMartin Odersky <odersky@gmail.com>2005-09-13 14:35:48 +0000
commitb058c90501ec726024b2af18fd163f01567911aa (patch)
tree724d395d16ebd2ed1bd1732bcda013e38b37a855 /sources/scala/tools/nsc/transform/Flatten.scala
parentb6f8d5a603fab46e6e8e30fc85a35d36fda6f05e (diff)
downloadscala-b058c90501ec726024b2af18fd163f01567911aa.tar.gz
scala-b058c90501ec726024b2af18fd163f01567911aa.tar.bz2
scala-b058c90501ec726024b2af18fd163f01567911aa.zip
*** empty log message ***
Diffstat (limited to 'sources/scala/tools/nsc/transform/Flatten.scala')
-rwxr-xr-xsources/scala/tools/nsc/transform/Flatten.scala53
1 files changed, 34 insertions, 19 deletions
diff --git a/sources/scala/tools/nsc/transform/Flatten.scala b/sources/scala/tools/nsc/transform/Flatten.scala
index 020f4c54ad..a94b0cf0e9 100755
--- a/sources/scala/tools/nsc/transform/Flatten.scala
+++ b/sources/scala/tools/nsc/transform/Flatten.scala
@@ -17,23 +17,44 @@ abstract class Flatten extends InfoTransform {
/** the following two members override abstract members in Transform */
val phaseName: String = "flatten";
+ private def liftClass(sym: Symbol): unit =
+ if (!(sym hasFlag LIFTED)) {
+ sym setFlag LIFTED;
+ atPhase(phase.next) {
+ if (settings.debug.value) log("re-enter " + sym + " in " + sym.owner);
+ assert(sym.owner.isPackageClass, sym);//debug
+ val scope = sym.owner.info.decls;
+ val old = scope lookup sym.name;
+ if (old != NoSymbol) scope unlink old;
+ scope enter sym;
+ }
+ }
+
private val flattened = new TypeMap {
def apply(tp: Type): Type = tp match {
case TypeRef(pre, sym, args) if (pre.symbol.isClass && !pre.symbol.isPackageClass) =>
assert(args.isEmpty);
typeRef(sym.toplevelClass.owner.thisType, sym, args)
case ClassInfoType(parents, decls, clazz) =>
+ var parents1 = parents;
+ val decls1 = new Scope();
if (clazz.isPackageClass) {
- val decls1 = new Scope();
- for (val member <- decls.toList) {
- atPhase(phase.next)(decls1 enter member)
- }
- ClassInfoType(parents, decls1, clazz)
- } else {
- val parents1 = List.mapConserve(parents)(this);
- if (parents1 eq parents) tp
- else ClassInfoType(parents1, decls, clazz)
- }
+ atPhase(phase.next)(decls.toList foreach (decls1 enter))
+ } else {
+ atPhase(phase.next)(clazz.owner.info);
+ parents1 = List.mapConserve(parents)(this);
+ for (val sym <- decls.toList) {
+ if (sym.isTerm) decls1 enter sym
+ else if (sym.isClass) {
+ liftClass(sym);
+ if (sym.needsImplClass) liftClass(erasure.implClass(sym))
+ }
+ }
+ }
+ ClassInfoType(parents1, decls1, clazz)
+ case PolyType(tparams, restp) =>
+ val restp1 = apply(restp);
+ if (restp1 eq restp) tp else PolyType(tparams, restp1)
case _ =>
mapOver(tp)
}
@@ -73,15 +94,9 @@ abstract class Flatten extends InfoTransform {
tree
}
tree1 setType flattened(tree1.tpe);
- if (sym != null && sym.isNestedClass && !(sym hasFlag FLATTENED)) {
- sym setFlag FLATTENED;
- atPhase(phase.next) {
- if (settings.debug.value) log("re-enter " + sym + " in " + sym.owner);
- val scope = sym.owner.info.decls;
- val old = scope lookup sym.name;
- if (old != NoSymbol) scope unlink old;
- scope enter sym;
- }
+ if (sym != null && sym.isNestedClass && !(sym hasFlag LIFTED)) {
+ liftClass(sym);//todo: remove
+ if (sym.implClass != NoSymbol) liftClass(sym.implClass);
}
tree1
}