aboutsummaryrefslogtreecommitdiff
path: root/compiler/src/dotty/tools/dotc/parsing/Parsers.scala
diff options
context:
space:
mode:
authorIgor Mielientiev <igor.melent@gmail.com>2017-03-22 16:24:15 +0200
committerFelix Mulder <felix.mulder@gmail.com>2017-03-22 15:24:15 +0100
commit5fd7a9503e44b8e95c0ca5aa4366270a3cd90155 (patch)
tree3c2f26df17a935c89f8a0238501419c30ed6f793 /compiler/src/dotty/tools/dotc/parsing/Parsers.scala
parent3af0ebbde81ff6429175ff1661f4ba927dc0d295 (diff)
downloaddotty-5fd7a9503e44b8e95c0ca5aa4366270a3cd90155.tar.gz
dotty-5fd7a9503e44b8e95c0ca5aa4366270a3cd90155.tar.bz2
dotty-5fd7a9503e44b8e95c0ca5aa4366270a3cd90155.zip
Fix varargs in methods and constructors (#2135)
* Fix varargs in methods (Issue: #1625) * Fix minor comments * Change varargs parameter message * Fix failed test, fix case for constructor
Diffstat (limited to 'compiler/src/dotty/tools/dotc/parsing/Parsers.scala')
-rw-r--r--compiler/src/dotty/tools/dotc/parsing/Parsers.scala22
1 files changed, 21 insertions, 1 deletions
diff --git a/compiler/src/dotty/tools/dotc/parsing/Parsers.scala b/compiler/src/dotty/tools/dotc/parsing/Parsers.scala
index 65c7a290d..b644c94cc 100644
--- a/compiler/src/dotty/tools/dotc/parsing/Parsers.scala
+++ b/compiler/src/dotty/tools/dotc/parsing/Parsers.scala
@@ -12,7 +12,7 @@ import core._
import Flags._
import Contexts._
import Names._
-import ast.Positioned
+import ast.{Positioned, Trees, untpd}
import ast.Trees._
import Decorators._
import StdNames._
@@ -20,6 +20,7 @@ import util.Positions._
import Constants._
import ScriptParsers._
import Comments._
+
import scala.annotation.{tailrec, switch}
import util.DotClass
import rewrite.Rewrites.patch
@@ -1800,6 +1801,10 @@ object Parsers {
case _ => syntaxError(AuxConstructorNeedsNonImplicitParameter(), start)
}
}
+ val listOfErrors = checkVarArgsRules(result)
+ listOfErrors.foreach { vparam =>
+ syntaxError(VarArgsParamMustComeLast(), vparam.tpt.pos)
+ }
result
}
@@ -1921,6 +1926,21 @@ object Parsers {
}
}
+
+
+ private def checkVarArgsRules(vparamss: List[List[untpd.ValDef]]): List[untpd.ValDef] = {
+ def isVarArgs(tpt: Trees.Tree[Untyped]): Boolean = tpt match {
+ case PostfixOp(_, op) if op.name == nme.raw.STAR => true
+ case _ => false
+ }
+
+ vparamss.flatMap { params =>
+ if (params.nonEmpty) {
+ params.init.filter(valDef => isVarArgs(valDef.tpt))
+ } else List()
+ }
+ }
+
/** DefDef ::= DefSig (`:' Type [`=' Expr] | "=" Expr)
* | this ParamClause ParamClauses `=' ConstrExpr
* DefDcl ::= DefSig `:' Type