8000 Delay package object decls entering to the package object phase · scala/scala@a5d03cd · GitHub
[go: up one dir, main page]

Skip to content

Commit a5d03cd

Browse files
retronymdwijnand
authored andcommitted
Delay package object decls entering to the package object phase
1 parent ca493d8 commit a5d03cd

File tree

4 files changed

+31
-5
lines changed

4 files changed

+31
-5
lines changed

src/compiler/scala/tools/nsc/Global.scala

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,15 @@ class Global(var currentSettings: Settings, reporter0: Reporter)
8080

8181
import definitions.findNamedMember
8282
def findMemberFromRoot(fullName: Name): Symbol = rootMirror.findMemberFromRoot(fullName)
83-
83+
override def deferredOpenPackageModule(container: Symbol, dest: Symbol): Unit = {
84+
// Some compiler runs (e.g. Toolbox and the PC) just initialise Global and then discard the Run
85+
// such that the scala package object decls never get entered into the scala package
86+
if ((curRun eq null) || !isGlobalInitialized || isPastPackageObjects) {
87+
super.openPackageModule(container, dest)
88+
} else {
89+
analyzer.packageObjects.deferredOpen(dest) = container
90+
}
91+
}
8492
// alternate constructors ------------------------------------------
8593

8694
override def settings = currentSettings
@@ -1017,6 +1025,7 @@ class Global(var currentSettings: Settings, reporter0: Reporter)
10171025
)
10181026
override def isPastTyper = isPast(currentRun.typerPhase)
10191027
def isBeforeErasure = isBefore(currentRun.erasurePhase)
1028+
def isPastPackageObjects = isPast(currentRun.packageobjectsPhase)
10201029
def isPast(phase: Phase) = (
10211030
(curRun ne null)
10221031
&& isGlobalInitialized // defense against init order issues
@@ -1338,7 +1347,7 @@ class Global(var currentSettings: Settings, reporter0: Reporter)
13381347
*/
13391348
val parserPhase = phaseNamed("parser")
13401349
val namerPhase = phaseNamed("namer")
1341-
// val packageobjectsPhase = phaseNamed("packageobjects")
1350+
val packageobjectsPhase = phaseNamed("packageobjects")
13421351
val typerPhase = phaseNamed("typer")
13431352
// val inlineclassesPhase = phaseNamed("inlineclasses")
13441353
// val superaccessorsPhase = phaseNamed("superaccessors")
@@ -1649,8 +1658,7 @@ class Global(var currentSettings: Settings, reporter0: Reporter)
16491658
compileLate(new CompilationUnit(scripted(getSourceFile(file))))
16501659
}
16511660

1652-
/** Compile abstract file until `globalPhase`, but at least to phase "namer".
1653-
*/
1661+
/** Compile the unit until `globalPhase`, but at least to phase "typer". */
16541662
def compileLate(unit: CompilationUnit): Unit = {
16551663
addUnit(unit)
16561664

src/compiler/scala/tools/nsc/typechecker/Analyzer.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ trait Analyzer extends AnyRef
5252
object packageObjects extends {
5353
val global: Analyzer.this.global.type = Analyzer.this.global
5454
} with SubComponent {
55+
val deferredOpen = perRunCaches.newMap[Symbol, Symbol]()
5556
val phaseName = "packageobjects"
5657
val runsAfter = List[String]()
5758
val runsRightAfter= Some("namer")
@@ -64,6 +65,9 @@ trait Analyzer extends AnyRef
6465
override def traverse(tree: Tree): Unit = tree match {
6566
case ModuleDef(_, _, _) =>
6667
if (tree.symbol.name == nme.PACKAGEkw) {
68+
// we've actually got a source file
69+
deferredOpen.remove(tree.symbol.owner)
70+
6771
openPackageModule(tree.symbol, tree.symbol.owner)
6872
}
6973
case ClassDef(_, _, _, _) => () // make it fast
@@ -73,6 +77,10 @@ trait Analyzer extends AnyRef
7377

7478
def apply(unit: CompilationUnit): Unit = {
7579
openPackageObjectsTraverser(unit.body)
80+
deferredOpen.foreach {
81+
case (dest, container) =>
82+
openPackageModule(container, dest)
83+
}
7684
}
7785
}
7886
}

src/interactive/scala/tools/nsc/interactive/Global.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1355,6 +1355,13 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "")
13551355
}
13561356
}
13571357

1358+
override def isPastPackageObjects = {
1359+
(if (currentTyperRun == null) NoCompilationUnit else currentTyperRun.currentUnit) match {
1360+
case unit: RichCompilationUnit => unit.isParsed
1361+
case _ => super.isPastPackageObjects
1362+
}
1363+
}
1364+
13581365
def newTyperRun(): Unit = {
13591366
currentTyperRun = new TyperRun
13601367
}

src/reflect/scala/reflect/internal/SymbolTable.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,9 @@ abstract class SymbolTable extends macros.Universe
339339
}
340340
}
341341

342+
def deferredOpenPackageModule(container: Symbol, dest: Symbol): Unit = {
343+
openPackageModule(container, dest)
344+
}
342345
def openPackageModule(container: Symbol, dest: Symbol): Unit = {
343346
// unlink existing symbols in the package
344347
for (member <- container.info.decls.iterator) {
@@ -396,7 +399,7 @@ abstract class SymbolTable extends macros.Universe
396399
case _ => false
397400
}
398401
if (pkgModule.isModule && !fromSource) {
399-
openPackageModule(pkgModule, pkgClass)
402+
deferredOpenPackageModule(pkgModule, pkgClass)
400403
}
401404
}
402405

0 commit comments

Comments
 (0)
0