Skip to content
This repository was archived by the owner on Jun 15, 2023. It is now read-only.

checking Eof before calling parseIdent #596

Merged
merged 5 commits into from
Jul 4, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 39 additions & 8 deletions src/res_core.ml
Original file line number Diff line number Diff line change
Expand Up @@ -556,6 +556,9 @@ let rec parseLident p =
Parser.next p;
let loc = mkLoc startPos p.prevEndPos in
(ident, loc)
| Eof ->
Parser.err ~startPos p (Diagnostics.unexpected p.Parser.token p.breadcrumbs);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks good, perhaps put this line, which is repeated many times, in a function?

("_", mkLoc startPos p.prevEndPos)
| _ -> (
match recoverLident p with
| Some () -> parseLident p
Expand Down Expand Up @@ -600,6 +603,9 @@ let parseHashIdent ~startPos p =
in
Parser.next p;
(i, mkLoc startPos p.prevEndPos)
| Eof ->
Parser.err ~startPos p (Diagnostics.unexpected p.token p.breadcrumbs);
("", mkLoc startPos p.prevEndPos)
| _ -> parseIdent ~startPos ~msg:ErrorMessages.variantIdent p

(* Ldot (Ldot (Lident "Foo", "Bar"), "baz") *)
Expand Down Expand Up @@ -635,11 +641,11 @@ let parseValuePath p =
Parser.err p (Diagnostics.unexpected p.Parser.token p.breadcrumbs);
Longident.Lident ident)
in
if p.token <> Eof then Parser.next p;
Parser.nextUnsafe p;
res
| token ->
Parser.err p (Diagnostics.unexpected token p.breadcrumbs);
Parser.next p;
Parser.nextUnsafe p;
Longident.Lident "_"
in
Location.mkloc ident (mkLoc startPos p.prevEndPos)
Expand Down Expand Up @@ -826,7 +832,7 @@ let parseConstant p =
Parser.err p (Diagnostics.unexpected token p.breadcrumbs);
Pconst_string ("", None)
in
Parser.next p;
Parser.nextUnsafe p;
constant

let parseTemplateConstant ~prefix (p : Parser.t) =
Expand Down Expand Up @@ -1090,6 +1096,10 @@ let rec parsePattern ?(alias = true) ?(or_ = true) p =
in
Parser.next p;
(i, mkLoc startPos p.prevEndPos)
| Eof ->
Parser.err ~startPos p
(Diagnostics.unexpected p.token p.breadcrumbs);
("", mkLoc startPos p.prevEndPos)
| _ -> parseIdent ~msg:ErrorMessages.variantIdent ~startPos p
in
match p.Parser.token with
Expand All @@ -1113,6 +1123,9 @@ let rec parsePattern ?(alias = true) ?(or_ = true) p =
let extension = parseExtension p in
let loc = mkLoc startPos p.prevEndPos in
Ast_helper.Pat.extension ~loc ~attrs extension
| Eof ->
Parser.err p (Diagnostics.unexpected p.Parser.token p.breadcrumbs);
Recover.defaultPattern ()
| token -> (
Parser.err p (Diagnostics.unexpected token p.breadcrumbs);
match
Expand Down Expand Up @@ -1859,6 +1872,10 @@ and parseAtomicExpr p =
Parser.err p (Diagnostics.lident token);
Parser.next p;
Recover.defaultExpr ()
| Eof ->
Parser.err ~startPos:p.prevEndPos p
(Diagnostics.unexpected p.Parser.token p.breadcrumbs);
Recover.defaultExpr ()
| token -> (
let errPos = p.prevEndPos in
Parser.err ~startPos:errPos p (Diagnostics.unexpected token p.breadcrumbs);
Expand Down Expand Up @@ -1897,7 +1914,7 @@ and parseFirstClassModuleExpr ~startPos p =
and parseBracketAccess p expr startPos =
Parser.leaveBreadcrumb p Grammar.ExprArrayAccess;
let lbracket = p.startPos in
Parser.next p;
Parser.expect Lbracket p;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Though just using Parser.next is safe as p is always Lbracket, this change would make it more clear.

let stringStart = p.startPos in
match p.Parser.token with
| String s -> (
Expand Down Expand Up @@ -3249,7 +3266,10 @@ and parseForRest hasOpeningParen pattern startPos p =
Parser.err p (Diagnostics.unexpected token p.breadcrumbs);
Asttypes.Upto
in
Parser.next p;
if p.Parser.token = Eof then
Parser.err ~startPos:p.startPos p
(Diagnostics.unexpected p.Parser.token p.breadcrumbs)
else Parser.next p;
let e2 = parseExpr ~context:WhenExpr p in
if hasOpeningParen then Parser.expect Rparen p;
Parser.expect Lbrace p;
Expand Down Expand Up @@ -3607,7 +3627,7 @@ and parseValueOrConstructor p =
Ast_helper.Exp.ident ~loc (Location.mkloc lident loc)
| token ->
if acc = [] then (
Parser.next p;
Parser.nextUnsafe p;
Parser.err p (Diagnostics.unexpected token p.breadcrumbs);
Recover.defaultExpr ())
else
Expand Down Expand Up @@ -3808,7 +3828,11 @@ and parseAtomicTypExpr ~attrs p =
| SingleQuote ->
Parser.next p;
let ident, loc =
parseIdent ~msg:ErrorMessages.typeVar ~startPos:p.startPos p
if p.Parser.token = Eof then (
Parser.err ~startPos:p.startPos p
(Diagnostics.unexpected p.Parser.token p.breadcrumbs);
("", mkLoc p.startPos p.prevEndPos))
else parseIdent ~msg:ErrorMessages.typeVar ~startPos:p.startPos p
in
Ast_helper.Typ.var ~loc ~attrs ident
| Underscore ->
Expand Down Expand Up @@ -3854,6 +3878,9 @@ and parseAtomicTypExpr ~attrs p =
let loc = mkLoc startPos p.prevEndPos in
Ast_helper.Typ.extension ~attrs ~loc extension
| Lbrace -> parseRecordOrObjectType ~attrs p
| Eof ->
Parser.err p (Diagnostics.unexpected p.Parser.token p.breadcrumbs);
Recover.defaultType ()
| token -> (
Parser.err p (Diagnostics.unexpected token p.breadcrumbs);
match
Expand Down Expand Up @@ -4596,7 +4623,11 @@ and parseTypeParam p =
| SingleQuote ->
Parser.next p;
let ident, loc =
parseIdent ~msg:ErrorMessages.typeParam ~startPos:p.startPos p
if p.Parser.token = Eof then (
Parser.err ~startPos:p.startPos p
(Diagnostics.unexpected p.Parser.token p.breadcrumbs);
("", mkLoc p.startPos p.prevEndPos))
else parseIdent ~msg:ErrorMessages.typeParam ~startPos:p.startPos p
in
Some (Ast_helper.Typ.var ~loc ident, variance)
| Underscore ->
Expand Down
12 changes: 12 additions & 0 deletions tests/parsing/errors/other/expected/for.res.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@

Syntax error!
tests/parsing/errors/other/for.res:1:6-2:0

1 │ for x
2 │

Did you forget a `in` here?

;;for x = [%rescript.exprhole ] to [%rescript.exprhole ] do
[%rescript.exprhole ]
done
1 change: 1 addition & 0 deletions tests/parsing/errors/other/for.res
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
for x
9 changes: 9 additions & 0 deletions tests/parsing/errors/typeDef/expected/keywordOnly.res.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@

Syntax error!
tests/parsing/errors/typeDef/keywordOnly.res:1:5

1 │ type

I'm not sure what to parse here when looking at "eof".

type nonrec _
1 change: 1 addition & 0 deletions tests/parsing/errors/typeDef/keywordOnly.res
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
type