From 59350a750e2a51a0140a6fa5384cf9f018f92c03 Mon Sep 17 00:00:00 2001 From: Nicolas Stucki Date: Mon, 21 Aug 2017 18:03:46 +0200 Subject: [PATCH 1/3] Fix #3000: Do not flatten across packages --- .../src/dotty/tools/dotc/transform/Flatten.scala | 15 ++++++++++++++- tests/pos/i3000.scala | 5 +++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 tests/pos/i3000.scala diff --git a/compiler/src/dotty/tools/dotc/transform/Flatten.scala b/compiler/src/dotty/tools/dotc/transform/Flatten.scala index a3deee2e3793..47769ccc2a8b 100644 --- a/compiler/src/dotty/tools/dotc/transform/Flatten.scala +++ b/compiler/src/dotty/tools/dotc/transform/Flatten.scala @@ -27,7 +27,20 @@ class Flatten extends MiniPhaseTransform with SymTransformer { thisTransform => else ref } - private val liftedDefs = new mutable.ListBuffer[Tree] + private var liftedDefs = new mutable.ListBuffer[Tree] + + private lazy val liftedDefsQueue = mutable.Stack.empty.asInstanceOf[mutable.Stack[mutable.ListBuffer[Tree]]] + + override def prepareForPackageDef(tree: PackageDef)(implicit ctx: Context) = { + liftedDefsQueue.push(liftedDefs) + liftedDefs = new mutable.ListBuffer[Tree] + this + } + + override def transformPackageDef(tree: PackageDef)(implicit ctx: Context, info: TransformerInfo) = { + liftedDefs = liftedDefsQueue.pop() + tree + } private def liftIfNested(tree: Tree)(implicit ctx: Context, info: TransformerInfo) = if (ctx.owner is Package) tree diff --git a/tests/pos/i3000.scala b/tests/pos/i3000.scala new file mode 100644 index 000000000000..4c132a64c1e8 --- /dev/null +++ b/tests/pos/i3000.scala @@ -0,0 +1,5 @@ +class Foo { + new Object { } +} + +package bar { } From c46cf9ad689dd50b5d70923afb134cb7183a79c4 Mon Sep 17 00:00:00 2001 From: Nicolas Stucki Date: Tue, 22 Aug 2017 07:23:02 +0200 Subject: [PATCH 2/3] Add test --- tests/run/i3000b.check | 2 ++ tests/run/i3000b.scala | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 tests/run/i3000b.check create mode 100644 tests/run/i3000b.scala diff --git a/tests/run/i3000b.check b/tests/run/i3000b.check new file mode 100644 index 000000000000..605021c9b2c0 --- /dev/null +++ b/tests/run/i3000b.check @@ -0,0 +1,2 @@ +Foo$$anon$1 +bar.Bar$$anon$2 diff --git a/tests/run/i3000b.scala b/tests/run/i3000b.scala new file mode 100644 index 000000000000..6bc066b6344e --- /dev/null +++ b/tests/run/i3000b.scala @@ -0,0 +1,18 @@ +object Test { + def main(args: Array[String]): Unit = { + new Foo + new bar.Bar + } +} + +class Foo { + new Object { println(this.getClass.getName) } +} + +package bar { + package baz { } + class Bar { + new Object { println(this.getClass.getName) } + } + package quxx { } +} From 58068b5a87d44ebefa0f2972639eda56c6bde0f8 Mon Sep 17 00:00:00 2001 From: Nicolas Stucki Date: Tue, 22 Aug 2017 07:30:13 +0200 Subject: [PATCH 3/3] Replace Stack with List --- compiler/src/dotty/tools/dotc/transform/Flatten.scala | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/transform/Flatten.scala b/compiler/src/dotty/tools/dotc/transform/Flatten.scala index 47769ccc2a8b..e2181538a9b0 100644 --- a/compiler/src/dotty/tools/dotc/transform/Flatten.scala +++ b/compiler/src/dotty/tools/dotc/transform/Flatten.scala @@ -28,17 +28,17 @@ class Flatten extends MiniPhaseTransform with SymTransformer { thisTransform => } private var liftedDefs = new mutable.ListBuffer[Tree] - - private lazy val liftedDefsQueue = mutable.Stack.empty.asInstanceOf[mutable.Stack[mutable.ListBuffer[Tree]]] + private var liftedDefsQueue = List.empty[mutable.ListBuffer[Tree]] override def prepareForPackageDef(tree: PackageDef)(implicit ctx: Context) = { - liftedDefsQueue.push(liftedDefs) + liftedDefsQueue = liftedDefs :: liftedDefsQueue liftedDefs = new mutable.ListBuffer[Tree] this } override def transformPackageDef(tree: PackageDef)(implicit ctx: Context, info: TransformerInfo) = { - liftedDefs = liftedDefsQueue.pop() + liftedDefs = liftedDefsQueue.head + liftedDefsQueue = liftedDefsQueue.tail tree }