From 73033e98247fd38cfcb1f721e69d5c42ab6308de Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Mon, 22 Jul 2019 16:13:40 +0200 Subject: [PATCH 1/2] Fix parsing problem for consecutive anonymous givens --- compiler/src/dotty/tools/dotc/parsing/Parsers.scala | 3 ++- tests/pos/givens.scala | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 tests/pos/givens.scala diff --git a/compiler/src/dotty/tools/dotc/parsing/Parsers.scala b/compiler/src/dotty/tools/dotc/parsing/Parsers.scala index 9fb346246582..059878df8181 100644 --- a/compiler/src/dotty/tools/dotc/parsing/Parsers.scala +++ b/compiler/src/dotty/tools/dotc/parsing/Parsers.scala @@ -2338,7 +2338,8 @@ object Parsers { (ofClass || ofInstance) && { val lookahead = in.lookaheadScanner // skips newline on startup lookahead.nextToken() // skip the `given` - if (lookahead.token == IDENTIFIER || lookahead.token == BACKQUOTED_IDENT) { + if (lookahead.token == IDENTIFIER && lookahead.name != nme.as || + lookahead.token == BACKQUOTED_IDENT) { lookahead.nextToken() if (lookahead.token == LBRACKET) { lookahead.nextToken() diff --git a/tests/pos/givens.scala b/tests/pos/givens.scala new file mode 100644 index 000000000000..4176d8e193dd --- /dev/null +++ b/tests/pos/givens.scala @@ -0,0 +1,5 @@ +class A +class B + +given as A +given as B From 4f5d1367b533746ee80f783f6ffb938d6a6438f3 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Fri, 26 Jul 2019 17:32:52 +0200 Subject: [PATCH 2/2] Refine lookahead test for given instances --- .../dotty/tools/dotc/parsing/Parsers.scala | 23 +++++++++++-------- tests/pos/givens.scala | 5 ---- tests/pos/i6864.scala | 17 ++++++++++++++ 3 files changed, 30 insertions(+), 15 deletions(-) delete mode 100644 tests/pos/givens.scala create mode 100644 tests/pos/i6864.scala diff --git a/compiler/src/dotty/tools/dotc/parsing/Parsers.scala b/compiler/src/dotty/tools/dotc/parsing/Parsers.scala index 059878df8181..28f7ac1f32fa 100644 --- a/compiler/src/dotty/tools/dotc/parsing/Parsers.scala +++ b/compiler/src/dotty/tools/dotc/parsing/Parsers.scala @@ -2338,21 +2338,24 @@ object Parsers { (ofClass || ofInstance) && { val lookahead = in.lookaheadScanner // skips newline on startup lookahead.nextToken() // skip the `given` - if (lookahead.token == IDENTIFIER && lookahead.name != nme.as || - lookahead.token == BACKQUOTED_IDENT) { - lookahead.nextToken() - if (lookahead.token == LBRACKET) { + if (lookahead.token == LBRACKET) true + else { + if (lookahead.token == IDENTIFIER && lookahead.name != nme.as || + lookahead.token == BACKQUOTED_IDENT) { lookahead.nextToken() - var openBrackets = 1 - while (openBrackets > 0 && lookahead.token != EOF) { - if (lookahead.token == LBRACKET) openBrackets += 1 - else if (lookahead.token == RBRACKET) openBrackets -= 1 + if (lookahead.token == LBRACKET) { lookahead.nextToken() + var openBrackets = 1 + while (openBrackets > 0 && lookahead.token != EOF) { + if (lookahead.token == LBRACKET) openBrackets += 1 + else if (lookahead.token == RBRACKET) openBrackets -= 1 + lookahead.nextToken() + } } } + lookahead.token == FOR || + lookahead.token == IDENTIFIER && lookahead.name == nme.as } - lookahead.token == FOR || - lookahead.token == IDENTIFIER && lookahead.name == nme.as } def recur(firstClause: Boolean, nparams: Int, contextualOnly: Boolean): List[List[ValDef]] = { diff --git a/tests/pos/givens.scala b/tests/pos/givens.scala deleted file mode 100644 index 4176d8e193dd..000000000000 --- a/tests/pos/givens.scala +++ /dev/null @@ -1,5 +0,0 @@ -class A -class B - -given as A -given as B diff --git a/tests/pos/i6864.scala b/tests/pos/i6864.scala new file mode 100644 index 000000000000..c5ac6c3d6d4a --- /dev/null +++ b/tests/pos/i6864.scala @@ -0,0 +1,17 @@ +class A +class B + +given as A +given as B + +trait Foo +trait Bar + +given as Foo +given as Bar + +trait C +trait Baz[A] + +given as C +given [A] as Baz[A] \ No newline at end of file