diff options
author | Martin Odersky <odersky@gmail.com> | 2006-09-19 10:48:26 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2006-09-19 10:48:26 +0000 |
commit | f72b4dfe467a967f046e4844b2ab57d4fc074f2c (patch) | |
tree | bc18bbca368b166802e60e22d9a3416e5ed104dd /src/compiler/scala/tools/nsc/typechecker/Namers.scala | |
parent | 13a369ce8d13cba304e9920d1dc445d6f74cca76 (diff) | |
download | scala-f72b4dfe467a967f046e4844b2ab57d4fc074f2c.tar.gz scala-f72b4dfe467a967f046e4844b2ab57d4fc074f2c.tar.bz2 scala-f72b4dfe467a967f046e4844b2ab57d4fc074f2c.zip |
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/Namers.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Namers.scala | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala index be1c97c8b4..e7e6a946a4 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala @@ -242,9 +242,8 @@ trait Namers requires Analyzer { finish case ValDef(mods, name, tp, rhs) => if (context.owner.isClass & (mods.flags & LOCAL) == 0) { - val accflags = - ((if ((mods.flags & MUTABLE) != 0) mods.flags & ~MUTABLE else mods.flags | STABLE) | - (if ((mods.flags & DEFERRED) == 0) ACCESSOR else 0)); + val accflags = ACCESSOR | + (if ((mods.flags & MUTABLE) != 0) mods.flags & ~MUTABLE else mods.flags | STABLE) val getter = owner.newMethod(tree.pos, name) .setFlag(accflags) .setInfo(innerNamer.getterTypeCompleter(tree)); @@ -394,7 +393,6 @@ trait Namers requires Analyzer { val parents = typer.parentTypes(templ) map checkParent val decls = newScope; new Namer(context.make(templ, clazz, decls)).enterSyms(templ.body); - ClassInfoType(parents, decls, clazz) } @@ -597,9 +595,7 @@ trait Namers requires Analyzer { if (!sym.isValueParameter && !sym.isTypeParameterOrSkolem && (!sym.owner.isClass || sym.owner.isModuleClass || sym.owner.isAnonymousClass)) { context.error(sym.pos, - "only classes can have declared but undefined members" + - (if (!sym.isVariable) "" - else "\n(Note that variables need to be initialized to be defined)")); + "only classes can have declared but undefined members" + varNotice(sym)) sym.resetFlag(DEFERRED) } } @@ -654,5 +650,28 @@ trait Namers requires Analyzer { } abstract class TypeCompleter(val tree: Tree) extends LazyType + + /** The symbol that which this accessor represents (possibly in part). + * This is used for error messages, where we want to speak in terms + * of the actual declaration or definition, not in terms of the generated setters + * and getters */ + def underlying(member: Symbol) = + if (member hasFlag ACCESSOR) { + if (member hasFlag DEFERRED) { + val getter = if (member.isSetter) member.getter(member.owner) else member + val result = getter.owner.newValue(getter.pos, getter.name) + .setInfo(getter.tpe.resultType) + .setFlag(DEFERRED) + if (getter.setter(member.owner) != NoSymbol) result.setFlag(MUTABLE) + result + } else member.accessed + } else member + + /** An explanatory note to be added to error messages + * when there's a problem with abstract var defs */ + def varNotice(sym: Symbol) = + if (underlying(sym).isVariable) + "\n(Note that variables need to be initialized to be defined)" + else "" } |