Skip to content

Commit ad45e2e

Browse files
committed
New miniphase: Flatten
1 parent d2670a7 commit ad45e2e

File tree

7 files changed

+59
-19
lines changed

7 files changed

+59
-19
lines changed

src/dotty/tools/dotc/Compiler.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ class Compiler {
5555
List(new Erasure),
5656
List(new CapturedVars,
5757
new Constructors),
58-
List(new LambdaLift)
58+
List(new LambdaLift,
59+
new Flatten)
5960
)
6061

6162
var runId = 1

src/dotty/tools/dotc/Flatten.scala

Lines changed: 0 additions & 15 deletions
This file was deleted.
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package dotty.tools.dotc
2+
package transform
3+
4+
import core._
5+
import DenotTransformers.SymTransformer
6+
import Phases.Phase
7+
import Contexts.Context
8+
import Flags._
9+
import SymUtils._
10+
import SymDenotations.SymDenotation
11+
import collection.mutable
12+
import TreeTransforms.MiniPhaseTransform
13+
import dotty.tools.dotc.transform.TreeTransforms.TransformerInfo
14+
15+
class Flatten extends MiniPhaseTransform with SymTransformer { thisTransform =>
16+
import ast.tpd._
17+
override def phaseName = "flatten"
18+
19+
def transformSym(ref: SymDenotation)(implicit ctx: Context) = {
20+
if (ref.isClass && !ref.is(Package) && !ref.owner.is(Package)) {
21+
ref.copySymDenotation(
22+
name = ref.flatName,
23+
owner = ref.enclosingPackageClass)
24+
}
25+
else ref
26+
}
27+
28+
override def treeTransformPhase = thisTransform.next
29+
30+
private val liftedDefs = new mutable.ListBuffer[Tree]
31+
32+
private def liftIfNested(tree: Tree)(implicit ctx: Context, info: TransformerInfo) =
33+
if (ctx.owner is Package) tree
34+
else {
35+
liftedDefs += transformFollowing(tree)
36+
EmptyTree
37+
}
38+
39+
override def transformStats(stats: List[Tree])(implicit ctx: Context, info: TransformerInfo) =
40+
if (ctx.owner is Package) {
41+
val liftedStats = stats ++ liftedDefs
42+
liftedDefs.clear
43+
liftedStats
44+
}
45+
else stats
46+
47+
override def transformTypeDef(tree: TypeDef)(implicit ctx: Context, info: TransformerInfo) =
48+
liftIfNested(tree)
49+
}

src/dotty/tools/dotc/transform/SymUtils.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import core._
55
import Types._
66
import Contexts._
77
import Symbols._
8+
import SymDenotations._
89
import Decorators._
910
import Names._
1011
import StdNames._
@@ -13,7 +14,8 @@ import Flags._
1314
import language.implicitConversions
1415

1516
object SymUtils {
16-
implicit def decorateSymUtils(sym: Symbol): SymUtils = new SymUtils(sym)
17+
implicit def decorateSymbol(sym: Symbol): SymUtils = new SymUtils(sym)
18+
implicit def decorateSymDenot(d: SymDenotation): SymUtils = new SymUtils(d.symbol)
1719
}
1820

1921
/** A decorator that provides methods on symbols
@@ -64,4 +66,7 @@ class SymUtils(val self: Symbol) extends AnyVal {
6466

6567
def field(implicit ctx: Context): Symbol =
6668
self.owner.info.decl(self.asTerm.name.fieldName).suchThat(!_.is(Method)).symbol
69+
70+
/** `fullName` where `$' is the separator character */
71+
def flatName(implicit ctx: Context): Name = self.fullNameSeparated('$')
6772
}

src/dotty/tools/dotc/transform/TreeChecker.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ class TreeChecker {
180180
override def typedStats(trees: List[untpd.Tree], exprOwner: Symbol)(implicit ctx: Context): List[Tree] = {
181181
for (tree <- trees) tree match {
182182
case tree: untpd.DefTree => checkOwner(tree)
183-
case _: untpd.Thicket => assert(false, "unexpanded thicket in statement sequence")
183+
case _: untpd.Thicket => assert(false, i"unexpanded thicket $tree in statement sequence $trees%\n%")
184184
case _ =>
185185
}
186186
super.typedStats(trees, exprOwner)

test/dotc/tests.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class tests extends CompilerTest {
1515

1616
implicit val defaultOptions = noCheckOptions ++ List(
1717
"-Yno-deep-subtypes",
18-
"-Ycheck:patternMatcher,gettersSetters,lambdaLift"
18+
"-Ycheck:patternMatcher,gettersSetters,flatten"
1919
)
2020

2121
val twice = List("#runs", "2", "-YnoDoubleBindings")

0 commit comments

Comments
 (0)