summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2011-05-31 09:02:29 +0000
committerPaul Phillips <paulp@improving.org>2011-05-31 09:02:29 +0000
commitfb061f22d4c35df626d9651e017820a11f8fe56e (patch)
tree17b7771b77f70b142be50fdbf967199c10ffff18
parent1c2d44dda075ef63933502f0791d500f8650a457 (diff)
downloadscala-fb061f22d4c35df626d9651e017820a11f8fe56e.tar.gz
scala-fb061f22d4c35df626d9651e017820a11f8fe56e.tar.bz2
scala-fb061f22d4c35df626d9651e017820a11f8fe56e.zip
A getter with type params is still a getter.
There were two distinct bugs in here, which if I ran the world would be a wakeup call that robust software cannot emerge from thousands of lines of low-level AST matching. In case you are frozen in suspense: I do not run the world. Review by moors.
-rw-r--r--src/compiler/scala/reflect/internal/TreeInfo.scala9
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala2
-rw-r--r--test/files/pos/bug4237.scala6
3 files changed, 12 insertions, 5 deletions
diff --git a/src/compiler/scala/reflect/internal/TreeInfo.scala b/src/compiler/scala/reflect/internal/TreeInfo.scala
index d61ac792cc..059a95f271 100644
--- a/src/compiler/scala/reflect/internal/TreeInfo.scala
+++ b/src/compiler/scala/reflect/internal/TreeInfo.scala
@@ -95,10 +95,11 @@ abstract class TreeInfo {
false
}
- def mayBeVarGetter(sym: Symbol) = sym.info match {
- case NullaryMethodType(_) => sym.owner.isClass && !sym.isStable
- case mt @ MethodType(_, _) => mt.isImplicit && sym.owner.isClass && !sym.isStable
- case _ => false
+ def mayBeVarGetter(sym: Symbol): Boolean = sym.info match {
+ case NullaryMethodType(_) => sym.owner.isClass && !sym.isStable
+ case PolyType(_, NullaryMethodType(_)) => sym.owner.isClass && !sym.isStable
+ case mt @ MethodType(_, _) => mt.isImplicit && sym.owner.isClass && !sym.isStable
+ case _ => false
}
def isVariableOrGetter(tree: Tree) = {
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index c43fa377a4..114fa7ed1b 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -3120,7 +3120,7 @@ trait Typers extends Modes {
return fail
if (treeInfo.mayBeVarGetter(varsym)) {
- lhs1 match {
+ treeInfo.methPart(lhs1) match {
case Select(qual, name) =>
val sel = Select(qual, nme.getterToSetter(name.toTermName)) setPos lhs.pos
val app = Apply(sel, List(rhs)) setPos tree.pos
diff --git a/test/files/pos/bug4237.scala b/test/files/pos/bug4237.scala
new file mode 100644
index 0000000000..fcf6eb8bf1
--- /dev/null
+++ b/test/files/pos/bug4237.scala
@@ -0,0 +1,6 @@
+class A {
+ (new { def field = 0; def field_=(i: Int) = () }).field = 5 // compiles as expected
+ (new { def field(implicit i: Int) = 0; def field_=(i: Int) = () }).field = 5 // compiles even with implicit params on getter
+ (new { def field = 0; def field_=[T](i: Int) = () }).field = 5 // compiles with type param on setter
+ (new { def field[T] = 0; def field_=(i: Int) = () }).field = 5 // DOESN'T COMPILE
+} \ No newline at end of file