summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2005-10-05 15:36:27 +0000
committerMartin Odersky <odersky@gmail.com>2005-10-05 15:36:27 +0000
commit4dff47967466f90091bc48f06b86c003100e3c4c (patch)
treea4a3ff7181ccc54dffc12a1be82bf3fb73e45246
parenta4409bd62f01d766a0a3dfbc32a3ef5d1fc36aed (diff)
downloadscala-4dff47967466f90091bc48f06b86c003100e3c4c.tar.gz
scala-4dff47967466f90091bc48f06b86c003100e3c4c.tar.bz2
scala-4dff47967466f90091bc48f06b86c003100e3c4c.zip
*** empty log message ***
-rwxr-xr-xsources/scala/tools/nsc/transform/Flatten.scala3
-rwxr-xr-xsources/scala/tools/nsc/transform/Mixin.scala9
-rwxr-xr-xsources/scala/tools/nsc/typechecker/Namers.scala2
-rw-r--r--sources/scala/tools/nsc/typechecker/TreeCheckers.scala2
4 files changed, 9 insertions, 7 deletions
diff --git a/sources/scala/tools/nsc/transform/Flatten.scala b/sources/scala/tools/nsc/transform/Flatten.scala
index b8e7db3e5f..8b03000a4f 100755
--- a/sources/scala/tools/nsc/transform/Flatten.scala
+++ b/sources/scala/tools/nsc/transform/Flatten.scala
@@ -47,7 +47,8 @@ abstract class Flatten extends InfoTransform {
parents1 = List.mapConserve(parents)(this);
for (val sym <- decls.toList) {
if (sym.isTerm && !sym.isStaticModule) {
- decls1 enter sym
+ decls1 enter sym;
+ if (sym.isModule) sym.moduleClass setFlag LIFTED;
} else if (sym.isClass) {
liftClass(sym);
if (sym.needsImplClass) liftClass(erasure.implClass(sym))
diff --git a/sources/scala/tools/nsc/transform/Mixin.scala b/sources/scala/tools/nsc/transform/Mixin.scala
index 7b6a1ed71f..e8a57d2e05 100755
--- a/sources/scala/tools/nsc/transform/Mixin.scala
+++ b/sources/scala/tools/nsc/transform/Mixin.scala
@@ -101,7 +101,7 @@ abstract class Mixin extends InfoTransform {
for (val member <- bc.info.decls.toList) {
if (isForwarded(member) && !isStatic(member) &&
(clazz.info.member(member.name).alternatives contains member)) {
- val member1 = addMember(clazz, member.cloneSymbol(clazz) setFlag MIXEDIN);
+ val member1 = addMember(clazz, member.cloneSymbol(clazz) setFlag MIXEDIN resetFlag DEFERRED);
member1.asInstanceOf[TermSymbol] setAlias member;
}
}
@@ -177,14 +177,15 @@ abstract class Mixin extends InfoTransform {
class MixinTransformer extends Transformer {
private var self: Symbol = _;
- private var localTyper: analyzer.Typer = _;
+ private val rootContext = erasure.NoContext.make(EmptyTree, RootClass, new Scope());
+ private var localTyper: erasure.Typer = _;
private var enclInterface: Symbol = _;
private def preTransform(tree: Tree): Tree = {
val sym = tree.symbol;
tree match {
case Template(parents, body) =>
- localTyper = typer.atOwner(tree, currentOwner);
+ localTyper = erasure.newTyper(rootContext.make(tree, currentOwner));
atPhase(phase.next)(currentOwner.owner.info);//needed?
if (!currentOwner.isTrait) addMixedinMembers(currentOwner)
else if (currentOwner hasFlag lateINTERFACE) addLateInterfaceMembers(currentOwner);
@@ -249,7 +250,7 @@ abstract class Mixin extends InfoTransform {
Apply(Select(Super(clazz, nme.EMPTY.toTypeName), stat.symbol.alias),
vparams map (vparam => Ident(vparam.symbol)));
if (settings.debug.value) log("complete super acc " + stat.symbol + stat.symbol.locationString + " " + rhs0 + " " + stat.symbol.alias + stat.symbol.alias.locationString);//debug
- val rhs1 = postTransform(localTyper.typed(atPos(stat.pos)(rhs0)));
+ val rhs1 = postTransform(localTyper.typed(atPos(stat.pos)(rhs0), stat.symbol.tpe.resultType));
copy.DefDef(stat, mods, name, tparams, List(vparams), tpt, rhs1)
case _ =>
stat
diff --git a/sources/scala/tools/nsc/typechecker/Namers.scala b/sources/scala/tools/nsc/typechecker/Namers.scala
index 11944187aa..f55a201a7b 100755
--- a/sources/scala/tools/nsc/typechecker/Namers.scala
+++ b/sources/scala/tools/nsc/typechecker/Namers.scala
@@ -20,7 +20,7 @@ trait Namers: Analyzer {
sym.reset(NoType);
sym setPos pos;
sym.flags = mods | lockedFlag;
- if (sym.isModule)
+ if (sym.isModule && sym.moduleClass != NoSymbol)
updatePosFlags(sym.moduleClass, pos, (mods & ModuleToClassFlags) | MODULE | FINAL);
if (sym.owner.isPackageClass && sym.linkedSym.rawInfo.isInstanceOf[loaders.SymbolLoader])
// pre-set linked symbol to NoType, in case it is not loaded together with this symbol.
diff --git a/sources/scala/tools/nsc/typechecker/TreeCheckers.scala b/sources/scala/tools/nsc/typechecker/TreeCheckers.scala
index e2bb54384f..84882c26c1 100644
--- a/sources/scala/tools/nsc/typechecker/TreeCheckers.scala
+++ b/sources/scala/tools/nsc/typechecker/TreeCheckers.scala
@@ -49,7 +49,7 @@ abstract class TreeCheckers extends Analyzer {
tree.tpe = null
}
val newtree = super.typed(tree, mode, pt);
- if (newtree ne tree)
+ if ((newtree ne tree) && !newtree.isInstanceOf[Literal])
error(tree.pos, "trees differ\n old: " + tree + " [" + tree.getClass() + "]\n new: " +
newtree + " [" + newtree.getClass() + "]");
}