Skip to content

Commit 1fb73f9

Browse files
authored
Merge pull request #7690 from dotty-staging/sourcepath-toplevel-again-2
sourcepath: Fix handling of top-level definitions and user-written package objects
2 parents 122d759 + d4b2222 commit 1fb73f9

File tree

4 files changed

+42
-11
lines changed

4 files changed

+42
-11
lines changed

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

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -804,6 +804,26 @@ object desugar {
804804
flatTree(cdef1 :: companions ::: implicitWrappers)
805805
}.reporting(i"desugared: $result", Printers.desugar)
806806

807+
/** Expand
808+
*
809+
* package object name { body }
810+
*
811+
* to:
812+
*
813+
* package name {
814+
* object `package` { body }
815+
* }
816+
*/
817+
def packageModuleDef(mdef: ModuleDef)(implicit ctx: Context): Tree =
818+
val impl = mdef.impl
819+
val mods = mdef.mods
820+
val moduleName = normalizeName(mdef, impl).asTermName
821+
if (mods.is(Package))
822+
PackageDef(Ident(moduleName),
823+
cpy.ModuleDef(mdef)(nme.PACKAGE, impl).withMods(mods &~ Package) :: Nil)
824+
else
825+
mdef
826+
807827
/** Expand
808828
*
809829
* object name extends parents { self => body }
@@ -854,7 +874,7 @@ object desugar {
854874
ctx.warning(em"${hl("final")} modifier is redundant for objects", flagSourcePos(Final))
855875

856876
if (mods.is(Package))
857-
PackageDef(Ident(moduleName), cpy.ModuleDef(mdef)(nme.PACKAGE, impl).withMods(mods &~ Package) :: Nil)
877+
packageModuleDef(mdef)
858878
else if (isEnumCase) {
859879
typeParamIsReferenced(enumClass.typeParams, Nil, Nil, impl.parents)
860880
// used to check there are no illegal references to enum's type parameters in parents
@@ -1229,12 +1249,6 @@ object desugar {
12291249
case _ =>
12301250
false
12311251

1232-
/** Does this package contains at least one top-level definition
1233-
* that will require a wrapping object ?
1234-
*/
1235-
def hasTopLevelDef(pdef: PackageDef)(given Context): Boolean =
1236-
pdef.stats.exists(isTopLevelDef)
1237-
12381252
/** Assuming `src` contains top-level definition, returns the name that should
12391253
* be using for the package object that will wrap them.
12401254
*/

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

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import ast.Trees._
1818
import parsing.JavaParsers.OutlineJavaParser
1919
import parsing.Parsers.OutlineParser
2020
import reporting.trace
21-
import ast.desugar.{ packageObjectName, hasTopLevelDef }
21+
import ast.desugar
2222

2323
object SymbolLoaders {
2424
import ast.untpd._
@@ -135,11 +135,18 @@ object SymbolLoaders {
135135
ok
136136
}
137137

138-
def traverse(tree: Tree, path: List[TermName]): Unit = tree match {
138+
/** Run the subset of desugaring necessary to record the correct symbols */
139+
def simpleDesugar(tree: Tree): Tree = tree match
140+
case tree: PackageDef =>
141+
desugar.packageDef(tree)
142+
case tree: ModuleDef =>
143+
desugar.packageModuleDef(tree)
144+
case _ =>
145+
tree
146+
147+
def traverse(tree: Tree, path: List[TermName]): Unit = simpleDesugar(tree) match {
139148
case tree @ PackageDef(pid, body) =>
140149
val path1 = addPrefix(pid, path)
141-
if hasTopLevelDef(tree) && checkPathMatches(path1, "package", pid)
142-
enterModule(owner, packageObjectName(unit.source), completer, scope = scope)
143150
for (stat <- body) traverse(stat, path1)
144151
case tree: TypeDef if tree.isClassDef =>
145152
if (checkPathMatches(path, "class", tree))
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package outer
2+
3+
package object nested2 {
4+
val x: Int = 1
5+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package outer
2+
3+
object pkg {
4+
val y: Int = nested2.x
5+
}

0 commit comments

Comments
 (0)