Skip to content

Commit 33f8e7f

Browse files
committed
fix a crash
1 parent 42f32f4 commit 33f8e7f

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
@@ -293,12 +293,15 @@ let scanNumber scanner =
293293
let scanExoticIdentifier scanner =
294294
let startPos = position scanner in
295295
let startOff = scanner.offset in
296+
let closed = ref false in
296297

297298
next2 scanner;
298299

299300
let rec scan () =
300301
match scanner.ch with
301-
| '"' -> next scanner
302+
| '"' ->
303+
closed := true;
304+
next scanner
302305
| '\n' | '\r' ->
303306
(* line break *)
304307
let endPos = position scanner in
@@ -318,20 +321,23 @@ let scanExoticIdentifier scanner =
318321
let ident =
319322
(String.sub [@doesNotRaise]) scanner.src startOff (scanner.offset - startOff)
320323
in
321-
let name =
322-
(String.sub [@doesNotRaise]) scanner.src (startOff + 2)
323-
(scanner.offset - startOff - 3)
324-
in
325-
326-
let _ =
327-
if name = String.empty then
324+
if not !closed then (
325+
let endPos = position scanner in
326+
scanner.err ~startPos ~endPos
327+
(Diagnostics.message "Did you forget a \" here?");
328+
Token.Lident ident)
329+
else
330+
let name =
331+
(String.sub [@doesNotRaise]) scanner.src (startOff + 2)
332+
(scanner.offset - startOff - 3)
333+
in
334+
if name = String.empty then (
328335
let endPos = position scanner in
329336
scanner.err ~startPos ~endPos
330-
(Diagnostics.message "A quoted identifier can't be empty string.")
331-
in
332-
333-
if Token.isInfixOperatorTxt name then Token.Lident name
334-
else Token.Lident ident
337+
(Diagnostics.message "A quoted identifier can't be empty string.");
338+
Token.Lident ident)
339+
else if Token.isInfixOperatorTxt name then Token.Lident name
340+
else Token.Lident ident
335341

336342
let scanStringEscapeSequence ~startPos scanner =
337343
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)