aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/typer/Typer.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-01-11 15:08:48 +0100
committerMartin Odersky <odersky@gmail.com>2014-01-11 15:08:48 +0100
commit0bf0d57f988b1fe3f29991f0cde6aaa1b996b0a2 (patch)
treeebfd0ed193541084af16da6d1cbd8232c5209641 /src/dotty/tools/dotc/typer/Typer.scala
parent76fec95265161246471932757a25ab54ea4ee393 (diff)
downloaddotty-0bf0d57f988b1fe3f29991f0cde6aaa1b996b0a2.tar.gz
dotty-0bf0d57f988b1fe3f29991f0cde6aaa1b996b0a2.tar.bz2
dotty-0bf0d57f988b1fe3f29991f0cde6aaa1b996b0a2.zip
Handles setters where the getter takes implicit or other parameters.
Now legal: def foo(implicit ...) = ... def foo_=(x: T): Unit = .... foo = ... And it works even without the implicit (need to clarify the spec on this count).
Diffstat (limited to 'src/dotty/tools/dotc/typer/Typer.scala')
-rw-r--r--src/dotty/tools/dotc/typer/Typer.scala36
1 files changed, 20 insertions, 16 deletions
diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala
index e9f939249..63a37ce90 100644
--- a/src/dotty/tools/dotc/typer/Typer.scala
+++ b/src/dotty/tools/dotc/typer/Typer.scala
@@ -461,27 +461,31 @@ class Typer extends Namer with Applications with Implicits {
(args map untpd.TypedSplice) :+ tree.rhs), pt)
case lhs =>
val lhs1 = typed(lhs)
- def reassignmentToVal =
- errorTree(cpy.Assign(tree, lhs1, typed(tree.rhs, lhs1.tpe.widen)),
- "reassignment to val")
lhs1.tpe match {
case ref: TermRef if ref.symbol is (Mutable, butNot = Accessor) =>
cpy.Assign(tree, lhs1, typed(tree.rhs, ref.info)).withType(defn.UnitType)
- case ref: TermRef if ref.info.isParameterless =>
- val pre = ref.prefix
- val setterName = ref.name.setterName
- val setter = pre.member(setterName)
- lhs1 match {
- case lhs1: RefTree if setter.exists =>
- val setterTypeRaw = pre select (setterName, setter)
- val setterType = checkAccessible(setterTypeRaw, isSuperSelection(lhs1), tree.pos)
- val lhs2 = lhs1.withName(setterName).withType(setterType)
- typed(cpy.Apply(tree, untpd.TypedSplice(lhs2), tree.rhs :: Nil))
- case _ =>
+ case _ =>
+ def reassignmentToVal =
+ errorTree(cpy.Assign(tree, lhs1, typed(tree.rhs, lhs1.tpe.widen)),
+ "reassignment to val")
+ val lhsCore = stripApply(lhs1) // need to strip off any implicit parameters
+ lhsCore.tpe match {
+ case ref: TermRef => // todo: further conditions to impose on getter?
+ val pre = ref.prefix
+ val setterName = ref.name.setterName
+ val setter = pre.member(setterName)
+ lhsCore match {
+ case lhsCore: RefTree if setter.exists =>
+ val setterTypeRaw = pre select (setterName, setter)
+ val setterType = checkAccessible(setterTypeRaw, isSuperSelection(lhsCore), tree.pos)
+ val lhs2 = lhsCore.withName(setterName).withType(setterType)
+ typed(cpy.Apply(tree, untpd.TypedSplice(lhs2), tree.rhs :: Nil))
+ case _ =>
+ reassignmentToVal
+ }
+ case tpe =>
reassignmentToVal
}
- case _ =>
- reassignmentToVal
}
}
}