diff --git a/src/compiler/scala/tools/nsc/Global.scala b/src/compiler/scala/tools/nsc/Global.scala index bea3b0678099..79293579d46d 100644 --- a/src/compiler/scala/tools/nsc/Global.scala +++ b/src/compiler/scala/tools/nsc/Global.scala @@ -80,7 +80,13 @@ class Global(var currentSettings: Settings, reporter0: Reporter) import definitions.findNamedMember def findMemberFromRoot(fullName: Name): Symbol = rootMirror.findMemberFromRoot(fullName) - + override def deferredOpenPackageModule(container: Symbol, dest: Symbol): Unit = { + if (isPast(currentRun.packageobjectsPhase)) { + super.openPackageModule(container, dest) + } else { + analyzer.packageObjects.deferredOpen(dest) = container + } + } // alternate constructors ------------------------------------------ override def settings = currentSettings @@ -1338,7 +1344,7 @@ class Global(var currentSettings: Settings, reporter0: Reporter) */ val parserPhase = phaseNamed("parser") val namerPhase = phaseNamed("namer") - // val packageobjectsPhase = phaseNamed("packageobjects") + val packageobjectsPhase = phaseNamed("packageobjects") val typerPhase = phaseNamed("typer") // val inlineclassesPhase = phaseNamed("inlineclasses") // val superaccessorsPhase = phaseNamed("superaccessors") diff --git a/src/compiler/scala/tools/nsc/typechecker/Analyzer.scala b/src/compiler/scala/tools/nsc/typechecker/Analyzer.scala index a48dad7c960c..1fd2fde5894e 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Analyzer.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Analyzer.scala @@ -52,6 +52,7 @@ trait Analyzer extends AnyRef object packageObjects extends { val global: Analyzer.this.global.type = Analyzer.this.global } with SubComponent { + val deferredOpen = perRunCaches.newMap[Symbol, Symbol]() val phaseName = "packageobjects" val runsAfter = List[String]() val runsRightAfter= Some("namer") @@ -64,6 +65,9 @@ trait Analyzer extends AnyRef override def traverse(tree: Tree): Unit = tree match { case ModuleDef(_, _, _) => if (tree.symbol.name == nme.PACKAGEkw) { + // we've actually got a source file + deferredOpen.remove(tree.symbol.owner) + openPackageModule(tree.symbol, tree.symbol.owner) } case ClassDef(_, _, _, _) => () // make it fast @@ -73,6 +77,10 @@ trait Analyzer extends AnyRef def apply(unit: CompilationUnit): Unit = { openPackageObjectsTraverser(unit.body) + deferredOpen.foreach { + case (dest, container) => + openPackageModule(container, dest) + } } } } diff --git a/src/reflect/scala/reflect/internal/SymbolTable.scala b/src/reflect/scala/reflect/internal/SymbolTable.scala index 3113062c5b51..ec882b71d690 100644 --- a/src/reflect/scala/reflect/internal/SymbolTable.scala +++ b/src/reflect/scala/reflect/internal/SymbolTable.scala @@ -339,6 +339,9 @@ abstract class SymbolTable extends macros.Universe } } + def deferredOpenPackageModule(container: Symbol, dest: Symbol): Unit = { + openPackageModule(container, dest) + } def openPackageModule(container: Symbol, dest: Symbol): Unit = { // unlink existing symbols in the package for (member <- container.info.decls.iterator) { @@ -396,7 +399,7 @@ abstract class SymbolTable extends macros.Universe case _ => false } if (pkgModule.isModule && !fromSource) { - openPackageModule(pkgModule, pkgClass) + deferredOpenPackageModule(pkgModule, pkgClass) } }