summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormihaylov <mihaylov@epfl.ch>2005-10-03 22:15:23 +0000
committermihaylov <mihaylov@epfl.ch>2005-10-03 22:15:23 +0000
commit77464f58b8f3fb180e51a654cc636dbc4d559897 (patch)
tree86db6955f601eb9e596723db7ccaa2f71c7f620f
parent4c83b5e7d2779de15d5ec6deb8105d499d2e3f6f (diff)
downloadscala-77464f58b8f3fb180e51a654cc636dbc4d559897.tar.gz
scala-77464f58b8f3fb180e51a654cc636dbc4d559897.tar.bz2
scala-77464f58b8f3fb180e51a654cc636dbc4d559897.zip
[MSIL]Treat delegate += fun as syntactic sugar ...
[MSIL]Treat delegate += fun as syntactic sugar for delegate = delegate + fun
-rw-r--r--sources/scala/tools/scalac/typechecker/Analyzer.scala31
1 files changed, 18 insertions, 13 deletions
diff --git a/sources/scala/tools/scalac/typechecker/Analyzer.scala b/sources/scala/tools/scalac/typechecker/Analyzer.scala
index 790febf143..c0694878a7 100644
--- a/sources/scala/tools/scalac/typechecker/Analyzer.scala
+++ b/sources/scala/tools/scalac/typechecker/Analyzer.scala
@@ -1835,12 +1835,6 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer(
}
}
}
- // MSIL: Forbid chaining of non-variable delegate objects using += and -=
- if(global.target == scalac_Global.TARGET_MSIL &&
- qual.getType().isSubType(definitions.DELEGATE_TYPE()) &&
- (sym.name == Names.PLUSEQ || sym.name == Names.MINUSEQ) &&
- !qual.symbol().isVariable())
- error(tree.pos, "illegal modification of non-variable delegate");
val qualtype =
if (qual.isInstanceOf[Tree.Super]) context.enclClass.owner.thisType()
else qual.getType();
@@ -2942,12 +2936,24 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer(
}
fn1.getType() match {
- case Type$MethodType(params, restp) =>
- if ((mode & PATTERNmode) != 0) {
+ case Type$MethodType(params, restp) => {
+ if ((mode & PATTERNmode) != 0)
return copy.Apply(tree, fn1, args).setType(restp);
- } else {
- val formals = infer.formalTypes(params, args.length);
- if (formals.length == args.length) {
+ if(global.target == scalac_Global.TARGET_MSIL) {
+ fn1 match {
+ case Tree.Select(qual, name) =>
+ if (qual.getType().isSubType(definitions.DELEGATE_TYPE())
+ && (name == Names.PLUSEQ || name == Names.MINUSEQ)) {
+ val n = if (name == Names.PLUSEQ) Names.PLUS else Names.MINUS;
+ val fun = make.Select(fn1.pos, qual, n);
+ val rhs = copy.Apply(tree, fun, args);
+ return transform(make.Assign(fn1.pos, qual, rhs));
+ }
+ case _ =>
+ }
+ }
+ val formals = infer.formalTypes(params, args.length);
+ if (formals.length == args.length) {
var i = 0; while (i < args.length) {
args(i) = adapt(args(i), argMode, formals(i));
args(i) match {
@@ -2965,8 +2971,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer(
return constfold.tryToFold(
copy.Apply(tree, fn1, args)
.setType(restp));
- }
-
+ }
case _ =>
}