Skip to content

Commit 83c9f54

Browse files
committed
fix a crash
1 parent 4ca0dcb commit 83c9f54

File tree

2 files changed

+44
-20
lines changed

2 files changed

+44
-20
lines changed

jscomp/syntax/src/res_scanner.ml

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -285,12 +285,15 @@ let scanNumber scanner =
285285
let scanExoticIdentifier scanner =
286286
let startPos = position scanner in
287287
let startOff = scanner.offset in
288+
let closed = ref false in
288289

289290
next2 scanner;
290291

291292
let rec scan () =
292293
match scanner.ch with
293-
| '"' -> next scanner
294+
| '"' ->
295+
closed := true;
296+
next scanner
294297
| '\n' | '\r' ->
295298
(* line break *)
296299
let endPos = position scanner in
@@ -310,20 +313,23 @@ let scanExoticIdentifier scanner =
310313
let ident =
311314
(String.sub [@doesNotRaise]) scanner.src startOff (scanner.offset - startOff)
312315
in
313-
let name =
314-
(String.sub [@doesNotRaise]) scanner.src (startOff + 2)
315-
(scanner.offset - startOff - 3)
316-
in
317-
318-
let _ =
319-
if name = String.empty then
316+
if not !closed then (
317+
let endPos = position scanner in
318+
scanner.err ~startPos ~endPos
319+
(Diagnostics.message "Did you forget a \" here?");
320+
Token.Lident ident)
321+
else
322+
let name =
323+
(String.sub [@doesNotRaise]) scanner.src (startOff + 2)
324+
(scanner.offset - startOff - 3)
325+
in
326+
if name = String.empty then (
320327
let endPos = position scanner in
321328
scanner.err ~startPos ~endPos
322-
(Diagnostics.message "A quoted identifier can't be empty string.")
323-
in
324-
325-
if Token.isInfixOperatorTxt name then Token.Lident name
326-
else Token.Lident ident
329+
(Diagnostics.message "A quoted identifier can't be empty string.");
330+
Token.Lident ident)
331+
else if Token.isInfixOperatorTxt name then Token.Lident name
332+
else Token.Lident ident
327333

328334
let scanStringEscapeSequence ~startPos scanner =
329335
let scan ~n ~base ~max =

jscomp/syntax/tests/parsing/errors/scanner/expected/exoticIdent.res.txt

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
Syntax error!
3-
tests/parsing/errors/scanner/exoticIdent.res:1:7-8
3+
tests/parsing/errors/scanner/exoticIdent.res:1:6-8
44

55
1 │ type \""
66
2 │
@@ -10,7 +10,7 @@
1010

1111

1212
Syntax error!
13-
tests/parsing/errors/scanner/exoticIdent.res:3:7-8
13+
tests/parsing/errors/scanner/exoticIdent.res:3:6-8
1414

1515
1 │ type \""
1616
2 │
@@ -22,7 +22,7 @@
2222

2323

2424
Syntax error!
25-
tests/parsing/errors/scanner/exoticIdent.res:5:6-7
25+
tests/parsing/errors/scanner/exoticIdent.res:5:5-7
2626

2727
3 │ type \"" = int
2828
4 │
@@ -48,7 +48,7 @@
4848

4949

5050
Syntax error!
51-
tests/parsing/errors/scanner/exoticIdent.res:7:6-7
51+
tests/parsing/errors/scanner/exoticIdent.res:7:5-7
5252

5353
5 │ let \""
5454
6 │
@@ -59,6 +59,19 @@
5959
A quoted identifier can't contain line breaks.
6060

6161

62+
Syntax error!
63+
tests/parsing/errors/scanner/exoticIdent.res:7:5-8:0
64+
65+
5 │ let \""
66+
6 │
67+
7 │ let \"a
68+
8 │ b
69+
9 │ c" = 1
70+
10 │
71+
72+
Did you forget a " here?
73+
74+
6275
Syntax error!
6376
tests/parsing/errors/scanner/exoticIdent.res:8:1
6477

@@ -92,6 +105,11 @@
92105

93106
consecutive statements on a line must be separated by ';' or a newline
94107

95-
type nonrec
96-
type nonrec = int
97-
let Fatal error: exception Invalid_argument("index out of bounds")
108+
type nonrec \""
109+
type nonrec \"" = int
110+
let \"" = [%rescript.exprhole ]
111+
let \"a
112+
= b
113+
;;c
114+
;;{js| = 1
115+
|js}

0 commit comments

Comments
 (0)