summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
diff options
context:
space:
mode:
authorHubert Plociniczak <hubert.plociniczak@epfl.ch>2010-09-29 09:47:54 +0000
committerHubert Plociniczak <hubert.plociniczak@epfl.ch>2010-09-29 09:47:54 +0000
commite1eb91714d2129ea460e8c4da4ff65074acb736a (patch)
treeaf7ed3198bf5f2dcf0e35f8a18da03e77767ec9c /src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
parentc0cc1dda85480c91df908d89d5d10c2293a03961 (diff)
downloadscala-e1eb91714d2129ea460e8c4da4ff65074acb736a.tar.gz
scala-e1eb91714d2129ea460e8c4da4ff65074acb736a.tar.bz2
scala-e1eb91714d2129ea460e8c4da4ff65074acb736a.zip
Revert changes related to #1591. no review.
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/RefChecks.scala')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/RefChecks.scala76
1 files changed, 16 insertions, 60 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
index dbbc9ed3e5..5c90a69c94 100644
--- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
@@ -51,23 +51,11 @@ abstract class RefChecks extends InfoTransform {
new RefCheckTransformer(unit)
override def changesBaseClasses = false
- def transformInfo(sym: Symbol, tp: Type): Type = {
- def isNestedModule = sym.isModule && !sym.isRootPackage && !sym.owner.isPackageClass
-
+ def transformInfo(sym: Symbol, tp: Type): Type =
if (sym.isModule && !sym.isStatic) {
-
sym setFlag (lateMETHOD | STABLE)
- if (isNestedModule) {
- val moduleVar = sym.owner.info.decl(nme.moduleVarName(sym.name))
- if (moduleVar == NoSymbol) {
- gen.mkModuleVarDef(sym).symbol.setInfo(tp)
- sym.resetFlag(MODULE)
- sym.setFlag(LAZY | ACCESSOR)
- }
- }
PolyType(List(), tp)
} else tp
- }
val toJavaRepeatedParam = new TypeMap {
def apply(tp: Type) = tp match {
@@ -920,12 +908,11 @@ abstract class RefChecks extends InfoTransform {
def transformStat(tree: Tree, index: Int): List[Tree] = tree match {
case ModuleDef(mods, name, impl) =>
val sym = tree.symbol
+ val cdef = ClassDef(mods | MODULE, name, List(), impl)
+ .setPos(tree.pos)
+ .setSymbol(sym.moduleClass)
+ .setType(NoType)
if (sym.isStatic) {
- val cdef = ClassDef(mods | MODULE, name, List(), impl)
- .setPos(tree.pos)
- .setSymbol(sym.moduleClass)
- .setType(NoType)
-
if (!sym.allOverriddenSymbols.isEmpty) {
val factory = sym.owner.newMethod(sym.pos, sym.name)
.setFlag(sym.flags | STABLE).resetFlag(MODULE)
@@ -942,48 +929,17 @@ abstract class RefChecks extends InfoTransform {
List(transform(cdef))
}
} else {
- def lazyNestedObjectTrees(transformedInfo: Boolean) = {
- val cdef = ClassDef(mods | MODULE, name, List(), impl)
- .setPos(tree.pos)
- .setSymbol(if (!transformedInfo) sym.moduleClass else sym.lazyAccessor)
- .setType(NoType)
-
- val vdef = localTyper.typedPos(tree.pos){
- if (!transformedInfo)
- gen.mkModuleVarDef(sym)
- else {
- val vsym = sym.owner.info.decl(nme.moduleVarName(sym.name))
- assert(vsym != NoSymbol, "Nested object after transformInfo set module variable")
- ValDef(vsym, EmptyTree)
- }
- }
- val vsym = vdef.symbol
-
- val ddef = atPhase(phase.next) {
+ val vdef = localTyper.typedPos(tree.pos) { gen.mkModuleVarDef(sym) }
+ val ddef =
+ atPhase(phase.next) {
localTyper.typed {
- val rhs = gen.newModule(sym, vsym.tpe)
- if (!transformedInfo) {
- sym.resetFlag(MODULE | FINAL | CASE)
- sym.setFlag(LAZY | ACCESSOR | SYNTHETIC)
-
- sym.setInfo(PolyType(List(), sym.tpe))
- sym setFlag (lateMETHOD | STABLE)
- }
-
- val ownerTransformer = new ChangeOwnerTraverser(vsym, sym)
- val lazyDef = atPos(tree.pos)(
- DefDef(sym, ownerTransformer(
- if (sym.owner.isTrait) rhs
- else Block(List(
- Assign(gen.mkAttributedRef(vsym), rhs)),
- gen.mkAttributedRef(vsym)))
- ))
- lazyDef
+ if (sym.owner.isTrait) gen.mkModuleAccessDcl(sym)
+ else gen.mkCachedModuleAccessDef(sym, vdef.symbol)
}
}
- transformTrees(List(cdef, vdef, ddef))
- }
- lazyNestedObjectTrees(sym.hasFlag(LAZY))
+
+ if (sym.owner.isTrait) transformTrees(List(cdef, ddef))
+ else transformTrees(List(cdef, vdef, ddef))
}
case ValDef(_, _, _, _) =>
@@ -1007,11 +963,11 @@ abstract class RefChecks extends InfoTransform {
if (hasUnitType)
typed(lazyDef) :: Nil
else
- typed(ValDef(vsym, EmptyTree)) :: atPhase(phase.next) { typed(lazyDef) } :: Nil
+ typed(ValDef(vsym, EmptyTree)) :: typed(lazyDef) :: Nil
} else {
- if (tree.symbol.isLocal && index <= currentLevel.maxindex) {
+ if (tree.symbol.isLocal && index <= currentLevel.maxindex && !tree.symbol.hasFlag(LAZY)) {
if (settings.debug.value) Console.println(currentLevel.refsym);
- unit.error(currentLevel.refpos, "forward reference extends over definition of " + tree.symbol)
+ unit.error(currentLevel.refpos, "forward reference extends over definition of " + tree.symbol);
}
List(tree1)
}