summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/typechecker/Namers.scala
diff options
context:
space:
mode:
authorHubert Plociniczak <hubert.plociniczak@epfl.ch>2009-11-20 09:04:04 +0000
committerHubert Plociniczak <hubert.plociniczak@epfl.ch>2009-11-20 09:04:04 +0000
commit3cf0e5a010ca8d3bd1828bbc096f587a01ba604f (patch)
treef4132bbeb1e14367418540ffbfe8f7b7bf5a0a6c /src/compiler/scala/tools/nsc/typechecker/Namers.scala
parent56ce6c65a54cf8aa130a63d5be8ad80e0f3d3dcc (diff)
downloadscala-3cf0e5a010ca8d3bd1828bbc096f587a01ba604f.tar.gz
scala-3cf0e5a010ca8d3bd1828bbc096f587a01ba604f.tar.bz2
scala-3cf0e5a010ca8d3bd1828bbc096f587a01ba604f.zip
closes #1422
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/Namers.scala')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Namers.scala32
1 files changed, 19 insertions, 13 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
index bd4bde2511..f7069b25ad 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
@@ -362,7 +362,7 @@ trait Namers { self: Analyzer =>
case vd @ ValDef(mods, name, tp, rhs) =>
if ((!context.owner.isClass ||
- (mods.flags & (PRIVATE | LOCAL)) == (PRIVATE | LOCAL).toLong ||
+ (mods.flags & (PRIVATE | LOCAL | CASEACCESSOR)) == (PRIVATE | LOCAL) ||
name.endsWith(nme.OUTER, nme.OUTER.length) ||
context.unit.isJava) &&
!mods.isLazy) {
@@ -370,38 +370,44 @@ trait Namers { self: Analyzer =>
.setFlag(mods.flags))
finish
} else {
+ val mods1 =
+ if (mods.hasFlag(PRIVATE) && mods.hasFlag(LOCAL) && !mods.isLazy) {
+ context.error(tree.pos, "private[this] not allowed for case class parameters")
+ mods &~ LOCAL
+ } else mods
// add getter and possibly also setter
val accflags: Long = ACCESSOR |
- (if (mods.isVariable) mods.flags & ~MUTABLE & ~PRESUPER
- else mods.flags & ~PRESUPER | STABLE)
+ (if (mods1.isVariable) mods1.flags & ~MUTABLE & ~PRESUPER
+ else mods1.flags & ~PRESUPER | STABLE)
if (nme.isSetterName(name))
context.error(tree.pos, "Names of vals or vars may not end in `_='")
// .isInstanceOf[..]: probably for (old) IDE hook. is this obsolete?
- val getter = enterAliasMethod(tree, name, accflags, mods)
+ val getter = enterAliasMethod(tree, name, accflags, mods1)
setInfo(getter)(namerOf(getter).getterTypeCompleter(vd))
- if (mods.isVariable) {
+ if (mods1.isVariable) {
val setter = enterAliasMethod(tree, nme.getterToSetter(name),
accflags & ~STABLE & ~CASEACCESSOR,
- mods)
+ mods1)
setInfo(setter)(namerOf(setter).setterTypeCompleter(vd))
}
+
tree.symbol =
- if (mods.isDeferred) {
+ if (mods1.isDeferred) {
getter setPos tree.pos // unfocus getter position, because there won't be a separate value
} else {
val vsym =
if (!context.owner.isClass) {
- assert(mods.isLazy) // if not a field, it has to be a lazy val
- owner.newValue(tree.pos, name + "$lzy" ).setFlag(mods.flags | MUTABLE)
+ assert(mods1.isLazy) // if not a field, it has to be a lazy val
+ owner.newValue(tree.pos, name + "$lzy" ).setFlag(mods1.flags | MUTABLE)
} else {
- val mflag = if (mods.isLazy) MUTABLE else 0
- val newflags = mods.flags & FieldFlags | PRIVATE | LOCAL | mflag
-
+ val mFlag = if (mods1.isLazy) MUTABLE else 0
+ val lFlag = if (mods.hasFlag(PRIVATE) && mods.hasFlag(LOCAL)) 0 else LOCAL
+ val newflags = mods1.flags & FieldFlags | PRIVATE | lFlag | mFlag
owner.newValue(tree.pos, nme.getterToLocal(name)) setFlag newflags
}
enterInScope(vsym)
setInfo(vsym)(namerOf(vsym).typeCompleter(tree))
- if (mods.isLazy)
+ if (mods1.isLazy)
vsym.setLazyAccessor(getter)
vsym