Skip to content

Commit 1f947a8

Browse files
committed
Desugar toplevel definitions
1 parent 2c3378d commit 1f947a8

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
@@ -954,6 +954,26 @@ object desugar {
954954
else Apply(ref(tupleTypeRef.classSymbol.companionModule.termRef), ts)
955955
}
956956

957+
/** Group all patterm, value and method definitions and all non-class type definitions
958+
* in an object named `<source>$object` where `<source>` is the name of the source file.
959+
*/
960+
def packageDef(pdef: PackageDef)(implicit ctx: Context): PackageDef = {
961+
def needsObject(stat: Tree) = stat match {
962+
case _: ValDef | _: PatDef | _: DefDef => true
963+
case stat: TypeDef => !stat.isClassDef
964+
case _ => false
965+
}
966+
val (nestedStats, topStats) = pdef.stats.partition(needsObject)
967+
if (nestedStats.isEmpty) pdef
968+
else {
969+
val sourceName = ctx.source.file.name.takeWhile(_ != '.')
970+
val groupName = (sourceName ++ str.TOPLEVEL_SUFFIX).toTermName
971+
val templ = Template(emptyConstructor, Nil, Nil, EmptyValDef, nestedStats)
972+
val grouped = ModuleDef(groupName, templ)
973+
cpy.PackageDef(pdef)(pdef.pid, grouped :: topStats)
974+
}
975+
}
976+
957977
/** Make closure corresponding to function.
958978
* params => body
959979
* ==>

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)