diff options
author | Martin Odersky <odersky@gmail.com> | 2007-11-01 17:35:15 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2007-11-01 17:35:15 +0000 |
commit | 3a4750825e3b3992adcddd4666f264d508e21f7a (patch) | |
tree | 1ed1eae169a180c46ceb23a3ab93a00d0e5deed0 /src/compiler/scala/tools/nsc/typechecker/RefChecks.scala | |
parent | b14c210baba254900b2b999b4c648526a5a7846e (diff) | |
download | scala-3a4750825e3b3992adcddd4666f264d508e21f7a.tar.gz scala-3a4750825e3b3992adcddd4666f264d508e21f7a.tar.bz2 scala-3a4750825e3b3992adcddd4666f264d508e21f7a.zip |
fixed ticket 91
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/RefChecks.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/RefChecks.scala | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala index fb10d2b1b2..ffecaf5a39 100644 --- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala +++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala @@ -598,8 +598,23 @@ abstract class RefChecks extends InfoTransform { .setPos(tree.pos) .setSymbol(sym.moduleClass) .setType(NoType); - if (sym.isStatic) List(transform(cdef)) - else { + if (sym.isStatic) { + if (!sym.allOverriddenSymbols.isEmpty) { + val factory = sym.owner.newMethod(sym.pos, sym.name) + .setFlag(sym.flags | STABLE).resetFlag(MODULE) + .setInfo(PolyType(List(), sym.moduleClass.tpe)) + sym.owner.info.decls.enter(factory) + val ddef = + atPhase(phase.next) { + localTyper.typed { + gen.mkModuleAccessDef(factory, sym.tpe) + } + } + transformTrees(List(cdef, ddef)) + } else { + List(transform(cdef)) + } + } else { val vdef = localTyper.typed { atPos(tree.pos) { @@ -611,7 +626,7 @@ abstract class RefChecks extends InfoTransform { atPhase(phase.next) { localTyper.typed { if (sym.owner.isTrait) gen.mkModuleAccessDcl(sym) - else gen.mkModuleAccessDef(sym, vdef.symbol) + else gen.mkCachedModuleAccessDef(sym, vdef.symbol) } } |