Skip to content

Commit 031532d

Browse files
committed
Desugar toplevel definitions
1 parent c04e041 commit 031532d

File tree

4 files changed

+34
-7
lines changed

4 files changed

+34
-7
lines changed

compiler/src/dotty/tools/dotc/ast/Desugar.scala

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1022,6 +1022,26 @@ object desugar {
10221022
else Apply(ref(tupleTypeRef.classSymbol.companionModule.termRef), ts)
10231023
}
10241024

1025+
/** Group all patterm, value and method definitions and all non-class type definitions
1026+
* in an object named `<source>$object` where `<source>` is the name of the source file.
1027+
*/
1028+
def packageDef(pdef: PackageDef)(implicit ctx: Context): PackageDef = {
1029+
def needsObject(stat: Tree) = stat match {
1030+
case _: ValDef | _: PatDef | _: DefDef => true
1031+
case stat: TypeDef => !stat.isClassDef
1032+
case _ => false
1033+
}
1034+
val (nestedStats, topStats) = pdef.stats.partition(needsObject)
1035+
if (nestedStats.isEmpty) pdef
1036+
else {
1037+
val sourceName = ctx.source.file.name.takeWhile(_ != '.')
1038+
val groupName = (sourceName ++ str.TOPLEVEL_SUFFIX).toTermName
1039+
val templ = Template(emptyConstructor, Nil, Nil, EmptyValDef, nestedStats)
1040+
val grouped = ModuleDef(groupName, templ)
1041+
cpy.PackageDef(pdef)(pdef.pid, grouped :: topStats)
1042+
}
1043+
}
1044+
10251045
/** Make closure corresponding to function.
10261046
* params => body
10271047
* ==>

compiler/src/dotty/tools/dotc/core/StdNames.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ object StdNames {
2020
final val INITIALIZER_PREFIX = "initial$"
2121
final val AVOID_CLASH_SUFFIX = "$_avoid_name_clash_$"
2222
final val MODULE_SUFFIX = "$"
23+
final val TOPLEVEL_SUFFIX = "$object"
2324
final val NAME_JOIN = "$"
2425
final val DEFAULT_GETTER = "$default$"
2526
final val LOCALDUMMY_PREFIX = "<local " // owner of local blocks

compiler/src/dotty/tools/dotc/typer/Namer.scala

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -416,17 +416,22 @@ class Namer { typer: Typer =>
416416
}
417417

418418
/** Expand tree and store in `expandedTree` */
419-
def expand(tree: Tree)(implicit ctx: Context): Unit = tree match {
420-
case mdef: DefTree =>
421-
val expanded = desugar.defTree(mdef)
422-
typr.println(i"Expansion: $mdef expands to $expanded")
423-
if (expanded ne mdef) mdef.pushAttachment(ExpandedTree, expanded)
424-
case _ =>
419+
def expand(tree: Tree)(implicit ctx: Context): Unit = {
420+
def record(expanded: Tree) =
421+
if (expanded `ne` tree) {
422+
typr.println(i"Expansion: $tree expands to $expanded")
423+
tree.pushAttachment(ExpandedTree, expanded)
424+
}
425+
tree match {
426+
case tree: DefTree => record(desugar.defTree(tree))
427+
case tree: PackageDef => record(desugar.packageDef(tree))
428+
case _ =>
429+
}
425430
}
426431

427432
/** The expanded version of this tree, or tree itself if not expanded */
428433
def expanded(tree: Tree)(implicit ctx: Context): Tree = tree match {
429-
case ddef: DefTree => ddef.attachmentOrElse(ExpandedTree, ddef)
434+
case _: DefTree | _: PackageDef => tree.attachmentOrElse(ExpandedTree, tree)
430435
case _ => tree
431436
}
432437

tests/run/toplevel-defs/defs.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
def hello(name: String) = s"hello, $name"

0 commit comments

Comments
 (0)