diff options
author | Som Snytt <som.snytt@gmail.com> | 2012-03-21 16:02:21 -0700 |
---|---|---|
committer | Som Snytt <som.snytt@gmail.com> | 2012-03-23 12:13:11 -0700 |
commit | 47bfd744177121de08fed489a5b0b1b59a1ae06a (patch) | |
tree | 628d19292c3596a94eda799b5583b99af494d44a /src | |
parent | e2951867f51bf464b07f759662bfc50dfaf48e5b (diff) | |
download | scala-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.scala | 9 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 4 |
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) |