File tree 2 files changed +13
-9
lines changed
compiler/src/dotty/tools/dotc/parsing 2 files changed +13
-9
lines changed Original file line number Diff line number Diff line change @@ -2738,14 +2738,13 @@ object Parsers {
2738
2738
def pattern3 (): Tree =
2739
2739
val p = infixPattern()
2740
2740
if followingIsVararg() then
2741
- atSpan(in.skipToken()) {
2742
- p match
2743
- case p @ Ident (name) if name.isVarPattern =>
2744
- Typed (p, Ident (tpnme.WILDCARD_STAR ))
2745
- case _ =>
2746
- syntaxError(em " `*` must follow pattern variable " )
2747
- p
2748
- }
2741
+ val start = in.skipToken()
2742
+ p match
2743
+ case p @ Ident (name) if name.isVarPattern =>
2744
+ Typed (p, atSpan(start) { Ident (tpnme.WILDCARD_STAR ) })
2745
+ case _ =>
2746
+ syntaxError(em " `*` must follow pattern variable " , start)
2747
+ p
2749
2748
else p
2750
2749
2751
2750
/** Pattern2 ::= [id `@'] Pattern3
Original file line number Diff line number Diff line change @@ -313,8 +313,13 @@ object Scanners {
313
313
// when skipping and therefore might erroneously end up syncing on a nested OUTDENT.
314
314
if debugTokenStream then
315
315
println(s " \n START SKIP AT ${sourcePos().line + 1 }, $this in $currentRegion" )
316
- while ! atStop do
316
+ var noProgress = 0
317
+ // Defensive measure to ensure we always get out of the following while loop
318
+ // even if source file is weirly formatted (i.e. we never reach EOF
319
+ while ! atStop && noProgress < 3 do
320
+ val prevOffset = offset
317
321
nextToken()
322
+ if offset == prevOffset then noProgress += 1 else noProgress = 0
318
323
if debugTokenStream then
319
324
println(s " \n STOP SKIP AT ${sourcePos().line + 1 }, $this in $currentRegion" )
320
325
if token == OUTDENT then dropUntil(_.isInstanceOf [Indented ])
You can’t perform that action at this time.
0 commit comments