summaryrefslogtreecommitdiff
path: root/sources/scala/tools/nsc/typechecker/RefChecks.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2005-08-29 14:38:38 +0000
committerMartin Odersky <odersky@gmail.com>2005-08-29 14:38:38 +0000
commit184a284ccc9c842adaaec728914f11a2cad33c18 (patch)
tree25ae4ff123300b6dc24f4c1a2ec0182105e75ec6 /sources/scala/tools/nsc/typechecker/RefChecks.scala
parent7d50bd127a071b84cc3d5e6e989b5f57d5988aaf (diff)
downloadscala-184a284ccc9c842adaaec728914f11a2cad33c18.tar.gz
scala-184a284ccc9c842adaaec728914f11a2cad33c18.tar.bz2
scala-184a284ccc9c842adaaec728914f11a2cad33c18.zip
*** empty log message ***
Diffstat (limited to 'sources/scala/tools/nsc/typechecker/RefChecks.scala')
-rwxr-xr-xsources/scala/tools/nsc/typechecker/RefChecks.scala44
1 files changed, 26 insertions, 18 deletions
diff --git a/sources/scala/tools/nsc/typechecker/RefChecks.scala b/sources/scala/tools/nsc/typechecker/RefChecks.scala
index 885da9c542..0cceb34512 100755
--- a/sources/scala/tools/nsc/typechecker/RefChecks.scala
+++ b/sources/scala/tools/nsc/typechecker/RefChecks.scala
@@ -8,7 +8,7 @@ package scala.tools.nsc.typechecker;
import symtab.Flags._;
import collection.mutable.HashMap;
import util.ListBuffer;
-import transform.Transform;
+import transform.InfoTransform;
/** Post-attribution checking and transformation.
* //todo: check whether we always check type parameter bounds.
@@ -32,7 +32,7 @@ import transform.Transform;
* different from java.lang.Object
* - Calls to case factory methods are replaced by new's.
*/
-abstract class RefChecks extends Transform {
+abstract class RefChecks extends InfoTransform {
import global._;
import definitions._;
@@ -43,6 +43,13 @@ abstract class RefChecks extends Transform {
val phaseName: String = "refchecks";
def newTransformer(unit: CompilationUnit): Transformer = new RefCheckTransformer(unit);
+ def transformInfo(sym: Symbol, tp: Type): Type = {
+ if (sym.isModule && !sym.isStatic) {
+ sym setFlag (METHOD | STABLE);
+ PolyType(List(), tp)
+ } else tp
+ }
+
class RefCheckTransformer(unit: CompilationUnit) extends Transformer {
// Override checking ------------------------------------------------------------
@@ -162,7 +169,6 @@ abstract class RefChecks extends Transform {
"\n and " + infoString(alt2) +
"\n override " + infoString(other));
} else if (member != NoSymbol && !(member hasFlag LOCAL)) {
- member.flags = member.flags | ACCESSED;
checkOverride(clazz, member, other);
}
}
@@ -352,7 +358,7 @@ abstract class RefChecks extends Transform {
}
private def enterReference(pos: int, sym: Symbol): unit =
- if (sym.isLocal && sym.isTerm) {
+ if (sym.isLocal) {
val e = currentLevel.scope.lookupEntry(sym.name);
if (e != null && sym == e.sym) {
var l = currentLevel;
@@ -477,7 +483,9 @@ abstract class RefChecks extends Transform {
val sym = tree.symbol;
val localTyper = typer.atOwner(currentOwner);
val cdef = ClassDef(mods | MODULE, name, List(), EmptyTree, impl)
- setSymbol sym.moduleClass setType NoType;
+ setPos tree.pos
+ setSymbol sym.moduleClass
+ setType NoType;
if (sym.isStatic) List(transform(cdef))
else {
val moduleType = sym.tpe;
@@ -492,17 +500,19 @@ abstract class RefChecks extends Transform {
ValDef(mvar, if (sym.isLocal) Literal(Constant(null)) else EmptyTree));
// def m: T = { if (m$ == null) m$ = new m$class; m$ }
- sym.setFlag(METHOD | STABLE);
- sym.setInfo(PolyType(List(), moduleType));
- val ddef = localTyper.typed(
- DefDef(sym, vparamss =>
- Block(
- List(
- If(
- Apply(Select(Ident(mvar), nme.EQ), List(Literal(Constant(null)))),
- Assign(Ident(mvar), New(TypeTree(moduleType), List(List()))),
- EmptyTree)),
- Ident(mvar))));
+ val ddef =
+ atPhase(phase.next) {
+ localTyper.typed {
+ DefDef(sym, vparamss =>
+ Block(
+ List(
+ If(
+ Apply(Select(Ident(mvar), nme.EQ), List(Literal(Constant(null)))),
+ Assign(Ident(mvar), New(TypeTree(moduleType), List(List()))),
+ EmptyTree)),
+ Ident(mvar)))
+ }
+ }
transformTrees(List(cdef, vdef, ddef))
}
@@ -583,7 +593,6 @@ abstract class RefChecks extends Transform {
if (sym.isSourceMethod && sym.hasFlag(CASE))
result = toConstructor
else if (name != nme.WILDCARD && name != nme.WILDCARD_STAR.toTypeName) {
- sym setFlag ACCESSED;
assert(sym != NoSymbol, tree);//debug
enterReference(tree.pos, sym);
}
@@ -592,7 +601,6 @@ abstract class RefChecks extends Transform {
if (sym.isSourceMethod && sym.hasFlag(CASE))
result = toConstructor
else {
- sym setFlag ACCESSED;
if (sym hasFlag DEFERRED) {
qual match {
case Super(qualifier, mixin) =>