aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/transform/RestoreScopes.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-02-11 17:26:54 +0100
committerMartin Odersky <odersky@gmail.com>2016-02-11 17:27:08 +0100
commitd3c331782d19994997d920807b16f2edb26dce0d (patch)
treee79f5a27869ea10d00d59f42b470eba39ec7b343 /src/dotty/tools/dotc/transform/RestoreScopes.scala
parent1839369a65f4c9d9b076ed657b7c40b5a4418154 (diff)
downloaddotty-d3c331782d19994997d920807b16f2edb26dce0d.tar.gz
dotty-d3c331782d19994997d920807b16f2edb26dce0d.tar.bz2
dotty-d3c331782d19994997d920807b16f2edb26dce0d.zip
Fix problems in DropEmptyCompanions
Diffstat (limited to 'src/dotty/tools/dotc/transform/RestoreScopes.scala')
-rw-r--r--src/dotty/tools/dotc/transform/RestoreScopes.scala67
1 files changed, 39 insertions, 28 deletions
diff --git a/src/dotty/tools/dotc/transform/RestoreScopes.scala b/src/dotty/tools/dotc/transform/RestoreScopes.scala
index fe24186ac..41da05691 100644
--- a/src/dotty/tools/dotc/transform/RestoreScopes.scala
+++ b/src/dotty/tools/dotc/transform/RestoreScopes.scala
@@ -23,35 +23,46 @@ class RestoreScopes extends MiniPhaseTransform with IdentityDenotTransformer { t
import ast.tpd._
override def phaseName = "restoreScopes"
- override def transformTypeDef(tree: TypeDef)(implicit ctx: Context, info: TransformerInfo) = {
- val TypeDef(_, impl: Template) = tree
- //
- val restoredDecls = newScope
- for (stat <- impl.constr :: impl.body)
- if (stat.isInstanceOf[MemberDef] && stat.symbol.exists)
- restoredDecls.enter(stat.symbol)
+ /* Note: We need to wait until we see a package definition because
+ * DropEmptyConstructors changes template members when analyzing the
+ * enclosing package definitions. So by the time RestoreScopes gets to
+ * see a typedef or template, it still might be changed by DropEmptyConstructors.
+ */
+ override def transformPackageDef(pdef: PackageDef)(implicit ctx: Context, info: TransformerInfo) = {
+ pdef.stats.foreach(restoreScope)
+ pdef
+ }
+
+ private def restoreScope(tree: Tree)(implicit ctx: Context, info: TransformerInfo) = tree match {
+ case TypeDef(_, impl: Template) =>
+ val restoredDecls = newScope
+ for (stat <- impl.constr :: impl.body)
+ if (stat.isInstanceOf[MemberDef] && stat.symbol.exists)
+ restoredDecls.enter(stat.symbol)
// Enter class in enclosing package scope, in case it was an inner class before flatten.
// For top-level classes this does nothing.
- val cls = tree.symbol.asClass
- val pkg = cls.owner.asClass
-
- // Bring back companion links
- val companionClass = cls.info.decls.lookup(nme.COMPANION_CLASS_METHOD)
- val companionModule = cls.info.decls.lookup(nme.COMPANION_MODULE_METHOD)
-
- if (companionClass.exists) {
- restoredDecls.enter(companionClass)
- }
-
- if (companionModule.exists) {
- restoredDecls.enter(companionModule)
- }
-
- pkg.enter(cls)
- val cinfo = cls.classInfo
- tree.symbol.copySymDenotation(
- info = cinfo.derivedClassInfo( // Dotty deviation: Cannot expand cinfo inline without a type error
- decls = restoredDecls: Scope)).installAfter(thisTransform)
- tree
+ val cls = tree.symbol.asClass
+ val pkg = cls.owner.asClass
+
+ // Bring back companion links
+ val companionClass = cls.info.decls.lookup(nme.COMPANION_CLASS_METHOD)
+ val companionModule = cls.info.decls.lookup(nme.COMPANION_MODULE_METHOD)
+
+ if (companionClass.exists) {
+ restoredDecls.enter(companionClass)
+ }
+
+ if (companionModule.exists) {
+ restoredDecls.enter(companionModule)
+ }
+
+ pkg.enter(cls)
+ val cinfo = cls.classInfo
+ tree.symbol.copySymDenotation(
+ info = cinfo.derivedClassInfo( // Dotty deviation: Cannot expand cinfo inline without a type error
+ decls = restoredDecls: Scope)).installAfter(thisTransform)
+ tree
+ case tree => tree
}
}
+