aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/parsing/Parsers.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-01-09 14:39:44 +0100
committerMartin Odersky <odersky@gmail.com>2016-02-19 14:00:00 +0100
commit5a8e87004f563feafbaf16e78bd0d6be26ee6e1c (patch)
treee81bb81e43922a24859aaab31986d5f256059788 /src/dotty/tools/dotc/parsing/Parsers.scala
parent91ccb52bda344d74ba7a3e9859346e57051d2aff (diff)
downloaddotty-5a8e87004f563feafbaf16e78bd0d6be26ee6e1c.tar.gz
dotty-5a8e87004f563feafbaf16e78bd0d6be26ee6e1c.tar.bz2
dotty-5a8e87004f563feafbaf16e78bd0d6be26ee6e1c.zip
First version of named type arguments
Diffstat (limited to 'src/dotty/tools/dotc/parsing/Parsers.scala')
-rw-r--r--src/dotty/tools/dotc/parsing/Parsers.scala40
1 files changed, 35 insertions, 5 deletions
diff --git a/src/dotty/tools/dotc/parsing/Parsers.scala b/src/dotty/tools/dotc/parsing/Parsers.scala
index 983ee1ccf..58ec75605 100644
--- a/src/dotty/tools/dotc/parsing/Parsers.scala
+++ b/src/dotty/tools/dotc/parsing/Parsers.scala
@@ -740,7 +740,7 @@ object Parsers {
private def simpleTypeRest(t: Tree): Tree = in.token match {
case HASH => simpleTypeRest(typeProjection(t))
- case LBRACKET => simpleTypeRest(atPos(t.pos.start) { AppliedTypeTree(t, typeArgs()) })
+ case LBRACKET => simpleTypeRest(atPos(t.pos.start) { AppliedTypeTree(t, typeArgs(namedOK = true)) })
case _ => t
}
@@ -759,9 +759,38 @@ object Parsers {
}
else typ()
+ /** NamedTypeArg ::= id `=' ArgType
+ */
+ val namedTypeArg = () => {
+ val name = ident()
+ accept(EQUALS)
+ NamedArg(name.toTypeName, argType())
+ }
+
/** ArgTypes ::= ArgType {`,' ArgType}
+ * NamedTypeArg {`,' NamedTypeArg}
*/
- def argTypes() = commaSeparated(argType)
+ def argTypes(namedOK: Boolean = false) = {
+ def otherArgs(first: Tree, arg: () => Tree): List[Tree] = {
+ val rest =
+ if (in.token == COMMA) {
+ in.nextToken()
+ commaSeparated(arg)
+ }
+ else Nil
+ first :: rest
+ }
+ if (namedOK && in.token == IDENTIFIER)
+ argType() match {
+ case Ident(name) if in.token == EQUALS =>
+ in.nextToken()
+ otherArgs(NamedArg(name, argType()), namedTypeArg)
+ case firstArg =>
+ if (in.token == EQUALS) println(s"??? $firstArg")
+ otherArgs(firstArg, argType)
+ }
+ else commaSeparated(argType)
+ }
/** FunArgType ::= ArgType | `=>' ArgType
*/
@@ -785,9 +814,10 @@ object Parsers {
} else t
}
- /** TypeArgs ::= `[' ArgType {`,' ArgType} `]'
- */
- def typeArgs(): List[Tree] = inBrackets(argTypes())
+ /** TypeArgs ::= `[' ArgType {`,' ArgType} `]'
+ * NamedTypeArgs ::= `[' NamedTypeArg {`,' NamedTypeArg} `]'
+ */
+ def typeArgs(namedOK: Boolean = false): List[Tree] = inBrackets(argTypes(namedOK))
/** Refinement ::= `{' RefineStatSeq `}'
*/