diff options
author | Martin Odersky <odersky@gmail.com> | 2006-01-03 17:07:10 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2006-01-03 17:07:10 +0000 |
commit | dbf2424c54aefddb50f6e7cb12d1fdc220bd9465 (patch) | |
tree | 37354cb10469167013b16dd47de26df0ba58cbb6 /src/compiler/scala/tools/nsc/typechecker/Namers.scala | |
parent | ec25a32375121896a054a3428c3a7f5b1c867cee (diff) | |
download | scala-dbf2424c54aefddb50f6e7cb12d1fdc220bd9465.tar.gz scala-dbf2424c54aefddb50f6e7cb12d1fdc220bd9465.tar.bz2 scala-dbf2424c54aefddb50f6e7cb12d1fdc220bd9465.zip |
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/Namers.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Namers.scala | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala index 6f9df75223..ce53aa40c2 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala @@ -40,7 +40,13 @@ trait Namers: Analyzer { class Namer(val context: Context) { - def setPrivate(sym: Symbol, mods: Modifiers): Symbol = sym; + val typer = newTyper(context); + + def setPrivate(sym: Symbol, mods: Modifiers): Symbol = { + if (!mods.privateWithin.isEmpty) + sym.privateWithin = typer.qualifyingClassContext(EmptyTree, mods.privateWithin).owner; + sym + } def updatePosFlags(sym: Symbol, pos: int, flags: int): Symbol = { if (settings.debug.value) log("overwriting " + sym); @@ -271,8 +277,6 @@ trait Namers: Analyzer { // --- Lazy Type Assignment -------------------------------------------------- - val typer = newTyper(context); - def typeCompleter(tree: Tree) = new TypeCompleter(tree) { override def complete(sym: Symbol): unit = { if (settings.debug.value) log("defining " + sym); @@ -499,7 +503,7 @@ trait Namers: Analyzer { * - `abstract' modifier only for classes * - `override' modifier never for classes * - `def' modifier never for parameters of case classes - * - declarations only in traits or abstract classes + * - declarations only in mixins or abstract classes */ def validate(sym: Symbol): unit = { def checkNoConflict(flag1: int, flag2: int): unit = @@ -512,13 +516,15 @@ trait Namers: Analyzer { Flags.flagsToString(flag1) + " and " + Flags.flagsToString(flag2)); if (sym.hasFlag(IMPLICIT) && !sym.isTerm) context.error(sym.pos, "`implicit' modifier can be used only for values, variables and methods"); + if (sym.hasFlag(MIXIN) && !sym.isClass) + context.error(sym.pos, "`mixin' modifier can be used only for classes"); if (sym.hasFlag(ABSTRACT) && !sym.isClass) context.error(sym.pos, "`abstract' modifier can be used only for classes; " + "\nit should be omitted for abstract members"); if (sym.hasFlag(OVERRIDE | ABSOVERRIDE) && sym.isClass) context.error(sym.pos, "`override' modifier not allowed for classes"); - if (sym.hasFlag(ABSOVERRIDE) && !sym.owner.isTrait) - context.error(sym.pos, "`abstract override' modifier only allowed for members of traits"); + if (sym.hasFlag(ABSOVERRIDE) && !sym.owner.isMixin) + context.error(sym.pos, "`abstract override' modifier only allowed for members of mixin classes"); if (sym.info.symbol == FunctionClass(0) && sym.isValueParameter && sym.owner.isClass && sym.owner.hasFlag(CASE)) context.error(sym.pos, "pass-by-name arguments not allowed for case class parameters"); |