summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSom Snytt <som.snytt@gmail.com>2012-03-21 16:02:21 -0700
committerSom Snytt <som.snytt@gmail.com>2012-03-23 12:13:11 -0700
commit47bfd744177121de08fed489a5b0b1b59a1ae06a (patch)
tree628d19292c3596a94eda799b5583b99af494d44a /src
parente2951867f51bf464b07f759662bfc50dfaf48e5b (diff)
downloadscala-47bfd744177121de08fed489a5b0b1b59a1ae06a.tar.gz
scala-47bfd744177121de08fed489a5b0b1b59a1ae06a.tar.bz2
scala-47bfd744177121de08fed489a5b0b1b59a1ae06a.zip
Ctor default-getters unique name and are typed in constructor context
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/reflect/internal/NameManglers.scala9
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala4
2 files changed, 9 insertions, 4 deletions
diff --git a/src/compiler/scala/reflect/internal/NameManglers.scala b/src/compiler/scala/reflect/internal/NameManglers.scala
index 48f21721da..5ec8d08ffb 100644
--- a/src/compiler/scala/reflect/internal/NameManglers.scala
+++ b/src/compiler/scala/reflect/internal/NameManglers.scala
@@ -77,6 +77,7 @@ trait NameManglers {
val PROTECTED_SET_PREFIX = PROTECTED_PREFIX + "set"
val SINGLETON_SUFFIX = ".type"
val SUPER_PREFIX_STRING = "super$"
+ val INIT_DEFAULT_PREFIX = "init$"
val TRAIT_SETTER_SEPARATOR_STRING = "$_setter_$"
val SETTER_SUFFIX: TermName = encode("_=")
@@ -170,13 +171,15 @@ trait NameManglers {
}
def defaultGetterName(name: Name, pos: Int): TermName = {
- val prefix = if (isConstructorName(name)) "init" else name
+ val prefix = if (isConstructorName(name)) INIT_DEFAULT_PREFIX else name
newTermName(prefix + DEFAULT_GETTER_STRING + pos)
}
def defaultGetterToMethod(name: Name): TermName = {
val p = name.pos(DEFAULT_GETTER_STRING)
- if (p < name.length) name.toTermName.subName(0, p)
- else name.toTermName
+ if (p < name.length) {
+ val q = name.toTermName.subName(0, p)
+ if (q.decoded == INIT_DEFAULT_PREFIX) CONSTRUCTOR else q
+ } else name.toTermName
}
// This isn't needed at the moment since I fixed $class$1 but
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index ad48712a32..c3a7453df0 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -4399,7 +4399,9 @@ trait Typers extends Modes with Adaptations with PatMatVirtualiser {
typedValDef(vdef)
case ddef @ DefDef(_, _, _, _, _, _) =>
- newTyper(context.makeNewScope(tree, sym)).typedDefDef(ddef)
+ // flag default getters for constructors. An actual flag would be nice. See SI-5543.
+ val flag = ddef.mods.hasDefaultFlag && nme.defaultGetterToMethod(sym.name) == nme.CONSTRUCTOR
+ newTyper(context.makeNewScope(tree, sym)).constrTyperIf(flag).typedDefDef(ddef)
case tdef @ TypeDef(_, _, _, _) =>
typedTypeDef(tdef)