aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-10-28 15:21:33 +0100
committerMartin Odersky <odersky@gmail.com>2014-11-09 10:17:33 +0100
commitad45e2e4b72057499b33a1cb4fbf5eb41ab8651c (patch)
tree11aeea26d275623f69edb2a8eca7e1d4af129b1b
parentd2670a7e6ddfc3a71f7b38aefb831b684059d468 (diff)
downloaddotty-ad45e2e4b72057499b33a1cb4fbf5eb41ab8651c.tar.gz
dotty-ad45e2e4b72057499b33a1cb4fbf5eb41ab8651c.tar.bz2
dotty-ad45e2e4b72057499b33a1cb4fbf5eb41ab8651c.zip
New miniphase: Flatten
-rw-r--r--src/dotty/tools/dotc/Compiler.scala3
-rw-r--r--src/dotty/tools/dotc/Flatten.scala15
-rw-r--r--src/dotty/tools/dotc/transform/ElimLocals.scala (renamed from src/dotty/tools/dotc/ElimLocals.scala)0
-rw-r--r--src/dotty/tools/dotc/transform/Flatten.scala49
-rw-r--r--src/dotty/tools/dotc/transform/SymUtils.scala7
-rw-r--r--src/dotty/tools/dotc/transform/TreeChecker.scala2
-rw-r--r--test/dotc/tests.scala2
7 files changed, 59 insertions, 19 deletions
diff --git a/src/dotty/tools/dotc/Compiler.scala b/src/dotty/tools/dotc/Compiler.scala
index d141b7488..cb70480ce 100644
--- a/src/dotty/tools/dotc/Compiler.scala
+++ b/src/dotty/tools/dotc/Compiler.scala
@@ -55,7 +55,8 @@ class Compiler {
List(new Erasure),
List(new CapturedVars,
new Constructors),
- List(new LambdaLift)
+ List(new LambdaLift,
+ new Flatten)
)
var runId = 1
diff --git a/src/dotty/tools/dotc/Flatten.scala b/src/dotty/tools/dotc/Flatten.scala
deleted file mode 100644
index d7ccc1ae4..000000000
--- a/src/dotty/tools/dotc/Flatten.scala
+++ /dev/null
@@ -1,15 +0,0 @@
-package dotty.tools.dotc
-package transform
-
-import core._
-import DenotTransformers.SymTransformer
-import Phases.Phase
-import Contexts.Context
-import SymDenotations.SymDenotation
-import TreeTransforms.MiniPhaseTransform
-
-class Flatten extends MiniPhaseTransform with SymTransformer { thisTransformer =>
- override def phaseName = "flatten"
-
- def transformSym(ref: SymDenotation)(implicit ctx: Context) = ???
-}
diff --git a/src/dotty/tools/dotc/ElimLocals.scala b/src/dotty/tools/dotc/transform/ElimLocals.scala
index d18ad0288..d18ad0288 100644
--- a/src/dotty/tools/dotc/ElimLocals.scala
+++ b/src/dotty/tools/dotc/transform/ElimLocals.scala
diff --git a/src/dotty/tools/dotc/transform/Flatten.scala b/src/dotty/tools/dotc/transform/Flatten.scala
new file mode 100644
index 000000000..769503f9d
--- /dev/null
+++ b/src/dotty/tools/dotc/transform/Flatten.scala
@@ -0,0 +1,49 @@
+package dotty.tools.dotc
+package transform
+
+import core._
+import DenotTransformers.SymTransformer
+import Phases.Phase
+import Contexts.Context
+import Flags._
+import SymUtils._
+import SymDenotations.SymDenotation
+import collection.mutable
+import TreeTransforms.MiniPhaseTransform
+import dotty.tools.dotc.transform.TreeTransforms.TransformerInfo
+
+class Flatten extends MiniPhaseTransform with SymTransformer { thisTransform =>
+ import ast.tpd._
+ override def phaseName = "flatten"
+
+ def transformSym(ref: SymDenotation)(implicit ctx: Context) = {
+ if (ref.isClass && !ref.is(Package) && !ref.owner.is(Package)) {
+ ref.copySymDenotation(
+ name = ref.flatName,
+ owner = ref.enclosingPackageClass)
+ }
+ else ref
+ }
+
+ override def treeTransformPhase = thisTransform.next
+
+ private val liftedDefs = new mutable.ListBuffer[Tree]
+
+ private def liftIfNested(tree: Tree)(implicit ctx: Context, info: TransformerInfo) =
+ if (ctx.owner is Package) tree
+ else {
+ liftedDefs += transformFollowing(tree)
+ EmptyTree
+ }
+
+ override def transformStats(stats: List[Tree])(implicit ctx: Context, info: TransformerInfo) =
+ if (ctx.owner is Package) {
+ val liftedStats = stats ++ liftedDefs
+ liftedDefs.clear
+ liftedStats
+ }
+ else stats
+
+ override def transformTypeDef(tree: TypeDef)(implicit ctx: Context, info: TransformerInfo) =
+ liftIfNested(tree)
+}
diff --git a/src/dotty/tools/dotc/transform/SymUtils.scala b/src/dotty/tools/dotc/transform/SymUtils.scala
index 2875327c4..ba45d3f04 100644
--- a/src/dotty/tools/dotc/transform/SymUtils.scala
+++ b/src/dotty/tools/dotc/transform/SymUtils.scala
@@ -5,6 +5,7 @@ import core._
import Types._
import Contexts._
import Symbols._
+import SymDenotations._
import Decorators._
import Names._
import StdNames._
@@ -13,7 +14,8 @@ import Flags._
import language.implicitConversions
object SymUtils {
- implicit def decorateSymUtils(sym: Symbol): SymUtils = new SymUtils(sym)
+ implicit def decorateSymbol(sym: Symbol): SymUtils = new SymUtils(sym)
+ implicit def decorateSymDenot(d: SymDenotation): SymUtils = new SymUtils(d.symbol)
}
/** A decorator that provides methods on symbols
@@ -64,4 +66,7 @@ class SymUtils(val self: Symbol) extends AnyVal {
def field(implicit ctx: Context): Symbol =
self.owner.info.decl(self.asTerm.name.fieldName).suchThat(!_.is(Method)).symbol
+
+ /** `fullName` where `$' is the separator character */
+ def flatName(implicit ctx: Context): Name = self.fullNameSeparated('$')
}
diff --git a/src/dotty/tools/dotc/transform/TreeChecker.scala b/src/dotty/tools/dotc/transform/TreeChecker.scala
index d2f30e7ba..f6e36a129 100644
--- a/src/dotty/tools/dotc/transform/TreeChecker.scala
+++ b/src/dotty/tools/dotc/transform/TreeChecker.scala
@@ -180,7 +180,7 @@ class TreeChecker {
override def typedStats(trees: List[untpd.Tree], exprOwner: Symbol)(implicit ctx: Context): List[Tree] = {
for (tree <- trees) tree match {
case tree: untpd.DefTree => checkOwner(tree)
- case _: untpd.Thicket => assert(false, "unexpanded thicket in statement sequence")
+ case _: untpd.Thicket => assert(false, i"unexpanded thicket $tree in statement sequence $trees%\n%")
case _ =>
}
super.typedStats(trees, exprOwner)
diff --git a/test/dotc/tests.scala b/test/dotc/tests.scala
index 71a1600bb..ac1fbe735 100644
--- a/test/dotc/tests.scala
+++ b/test/dotc/tests.scala
@@ -15,7 +15,7 @@ class tests extends CompilerTest {
implicit val defaultOptions = noCheckOptions ++ List(
"-Yno-deep-subtypes",
- "-Ycheck:patternMatcher,gettersSetters,lambdaLift"
+ "-Ycheck:patternMatcher,gettersSetters,flatten"
)
val twice = List("#runs", "2", "-YnoDoubleBindings")