From 5a8e87004f563feafbaf16e78bd0d6be26ee6e1c Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Sat, 9 Jan 2016 14:39:44 +0100 Subject: First version of named type arguments --- src/dotty/tools/dotc/parsing/Parsers.scala | 40 ++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 5 deletions(-) (limited to 'src/dotty/tools/dotc/parsing/Parsers.scala') 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 `}' */ -- cgit v1.2.3