Skip to content

Commit 53a33e6

Browse files
authored
fix(compiler): Ensure constant number locations are propagated correctly when parsing (#2044)
1 parent 70bc247 commit 53a33e6

File tree

4 files changed

+96
-27
lines changed

4 files changed

+96
-27
lines changed

compiler/src/parsing/parser.messages

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3946,6 +3946,52 @@ program: MODULE UIDENT EOL LET NUMBER_INT SLASH DASH WHILE
39463946
## The known suffix of the stack is as follows:
39473947
## option(DASH) NUMBER_INT SLASH option(DASH)
39483948
##
3949+
program: MODULE UIDENT EOL LET DASH NUMBER_INT SLASH YIELD
3950+
##
3951+
## Ends in an error in state: 372.
3952+
##
3953+
## pattern -> DASH NUMBER_INT SLASH . option(DASH) NUMBER_INT [ WHEN THICKARROW RPAREN RBRACK RBRACE PIPE EQUAL EOL COMMA COLON AS ]
3954+
##
3955+
## The known suffix of the stack is as follows:
3956+
## DASH NUMBER_INT SLASH
3957+
##
3958+
program: MODULE UIDENT EOL LET DASH NUMBER_INT SLASH DASH YIELD
3959+
##
3960+
## Ends in an error in state: 373.
3961+
##
3962+
## pattern -> DASH NUMBER_INT SLASH option(DASH) . NUMBER_INT [ WHEN THICKARROW RPAREN RBRACK RBRACE PIPE EQUAL EOL COMMA COLON AS ]
3963+
##
3964+
## The known suffix of the stack is as follows:
3965+
## DASH NUMBER_INT SLASH option(DASH)
3966+
##
3967+
program: MODULE UIDENT EOL LET LPAREN DASH YIELD
3968+
##
3969+
## Ends in an error in state: 391.
3970+
##
3971+
## const -> DASH . NUMBER_INT [ RPAREN PIPE EOL COMMA COLON AS ]
3972+
## const -> DASH . NUMBER_FLOAT [ RPAREN PIPE EOL COMMA COLON AS ]
3973+
## const -> DASH . INT8 [ RPAREN PIPE EOL COMMA COLON AS ]
3974+
## const -> DASH . INT16 [ RPAREN PIPE EOL COMMA COLON AS ]
3975+
## const -> DASH . INT32 [ RPAREN PIPE EOL COMMA COLON AS ]
3976+
## const -> DASH . INT64 [ RPAREN PIPE EOL COMMA COLON AS ]
3977+
## const -> DASH . UINT8 [ RPAREN PIPE EOL COMMA COLON AS ]
3978+
## const -> DASH . UINT16 [ RPAREN PIPE EOL COMMA COLON AS ]
3979+
## const -> DASH . UINT32 [ RPAREN PIPE EOL COMMA COLON AS ]
3980+
## const -> DASH . UINT64 [ RPAREN PIPE EOL COMMA COLON AS ]
3981+
## const -> DASH . FLOAT32 [ RPAREN PIPE EOL COMMA COLON AS ]
3982+
## const -> DASH . FLOAT64 [ RPAREN PIPE EOL COMMA COLON AS ]
3983+
## const -> DASH . WASMI32 [ RPAREN PIPE EOL COMMA COLON AS ]
3984+
## const -> DASH . WASMI64 [ RPAREN PIPE EOL COMMA COLON AS ]
3985+
## const -> DASH . WASMF32 [ RPAREN PIPE EOL COMMA COLON AS ]
3986+
## const -> DASH . WASMF64 [ RPAREN PIPE EOL COMMA COLON AS ]
3987+
## const -> DASH . BIGINT [ RPAREN PIPE EOL COMMA COLON AS ]
3988+
## const -> DASH . RATIONAL [ RPAREN PIPE EOL COMMA COLON AS ]
3989+
## pattern -> DASH . NUMBER_INT SLASH option(DASH) NUMBER_INT [ RPAREN PIPE EOL COMMA COLON AS ]
3990+
## special_op -> DASH . [ RPAREN EOL ]
3991+
##
3992+
## The known suffix of the stack is as follows:
3993+
## DASH
3994+
##
39493995

39503996
Expected a number.
39513997

compiler/src/parsing/parser.mly

Lines changed: 48 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -204,30 +204,50 @@ equal:
204204

205205
const:
206206
// Rational literals are a special case of the division binop_expr.
207-
| DASH? NUMBER_INT { Constant.number (PConstNumberInt (mkstr $sloc (if Option.is_some $1 then "-" ^ $2 else $2))), $sloc }
208-
| DASH? NUMBER_FLOAT { Constant.number (PConstNumberFloat (mkstr $sloc (if Option.is_some $1 then "-" ^ $2 else $2))), $sloc }
209-
| DASH? INT8 { Constant.int8 (mkstr $sloc (if Option.is_some $1 then "-" ^ $2 else $2)), $sloc }
210-
| DASH? INT16 { Constant.int16 (mkstr $sloc (if Option.is_some $1 then "-" ^ $2 else $2)), $sloc }
211-
| DASH? INT32 { Constant.int32 (mkstr $sloc (if Option.is_some $1 then "-" ^ $2 else $2)), $sloc }
212-
| DASH? INT64 { Constant.int64 (mkstr $sloc (if Option.is_some $1 then "-" ^ $2 else $2)), $sloc }
213-
| DASH? UINT8 { Constant.uint8 (mkstr $sloc (if Option.is_some $1 then "-" ^ $2 else $2)), $sloc }
214-
| DASH? UINT16 { Constant.uint16 (mkstr $sloc (if Option.is_some $1 then "-" ^ $2 else $2)), $sloc }
215-
| DASH? UINT32 { Constant.uint32 (mkstr $sloc (if Option.is_some $1 then "-" ^ $2 else $2)), $sloc }
216-
| DASH? UINT64 { Constant.uint64 (mkstr $sloc (if Option.is_some $1 then "-" ^ $2 else $2)), $sloc }
217-
| DASH? FLOAT32 { Constant.float32 (mkstr $sloc (if Option.is_some $1 then "-" ^ $2 else $2)), $sloc }
218-
| DASH? FLOAT64 { Constant.float64 (mkstr $sloc (if Option.is_some $1 then "-" ^ $2 else $2)), $sloc }
219-
| DASH? WASMI32 { Constant.wasmi32 (mkstr $sloc (if Option.is_some $1 then "-" ^ $2 else $2)), $sloc }
220-
| DASH? WASMI64 { Constant.wasmi64 (mkstr $sloc (if Option.is_some $1 then "-" ^ $2 else $2)), $sloc }
221-
| DASH? WASMF32 { Constant.wasmf32 (mkstr $sloc (if Option.is_some $1 then "-" ^ $2 else $2)), $sloc }
222-
| DASH? WASMF64 { Constant.wasmf64 (mkstr $sloc (if Option.is_some $1 then "-" ^ $2 else $2)), $sloc }
223-
| DASH? BIGINT { Constant.bigint (mkstr $sloc (if Option.is_some $1 then "-" ^ $2 else $2)), $sloc }
224-
| DASH? RATIONAL { Constant.rational (mkstr $sloc (if Option.is_some $1 then "-" ^ $2 else $2)), $sloc }
225-
| TRUE { Constant.bool true, $loc }
226-
| FALSE { Constant.bool false, $loc }
227-
| VOID { Constant.void, $loc }
228-
| STRING { Constant.string (mkstr $loc $1), $loc }
229-
| BYTES { Constant.bytes (mkstr $loc $1), $loc }
230-
| CHAR { Constant.char (mkstr $loc $1), $loc }
207+
| NUMBER_INT { Constant.number (PConstNumberInt (mkstr $loc $1)) }
208+
| NUMBER_FLOAT { Constant.number (PConstNumberFloat (mkstr $loc $1)) }
209+
| INT8 { Constant.int8 (mkstr $loc $1) }
210+
| INT16 { Constant.int16 (mkstr $loc $1) }
211+
| INT32 { Constant.int32 (mkstr $loc $1) }
212+
| INT64 { Constant.int64 (mkstr $loc $1) }
213+
| UINT8 { Constant.uint8 (mkstr $loc $1) }
214+
| UINT16 { Constant.uint16 (mkstr $loc $1) }
215+
| UINT32 { Constant.uint32 (mkstr $loc $1) }
216+
| UINT64 { Constant.uint64 (mkstr $loc $1) }
217+
| FLOAT32 { Constant.float32 (mkstr $loc $1) }
218+
| FLOAT64 { Constant.float64 (mkstr $loc $1) }
219+
| WASMI32 { Constant.wasmi32 (mkstr $loc $1) }
220+
| WASMI64 { Constant.wasmi64 (mkstr $loc $1) }
221+
| WASMF32 { Constant.wasmf32 (mkstr $loc $1) }
222+
| WASMF64 { Constant.wasmf64 (mkstr $loc $1) }
223+
| BIGINT { Constant.bigint (mkstr $loc $1) }
224+
| RATIONAL { Constant.rational (mkstr $loc $1) }
225+
// The minus sign is not an optional non-terminal or inlined to allow propagation
226+
// of correct locations, as $sloc only applies to the current rule.
227+
| DASH NUMBER_INT { Constant.number (PConstNumberInt (mkstr $loc ("-" ^ $2))) }
228+
| DASH NUMBER_FLOAT { Constant.number (PConstNumberFloat (mkstr $loc ("-" ^ $2))) }
229+
| DASH INT8 { Constant.int8 (mkstr $loc ("-" ^ $2)) }
230+
| DASH INT16 { Constant.int16 (mkstr $loc ("-" ^ $2)) }
231+
| DASH INT32 { Constant.int32 (mkstr $loc ("-" ^ $2)) }
232+
| DASH INT64 { Constant.int64 (mkstr $loc ("-" ^ $2)) }
233+
| DASH UINT8 { Constant.uint8 (mkstr $loc ("-" ^ $2)) }
234+
| DASH UINT16 { Constant.uint16 (mkstr $loc ("-" ^ $2)) }
235+
| DASH UINT32 { Constant.uint32 (mkstr $loc ("-" ^ $2)) }
236+
| DASH UINT64 { Constant.uint64 (mkstr $loc ("-" ^ $2)) }
237+
| DASH FLOAT32 { Constant.float32 (mkstr $loc ("-" ^ $2)) }
238+
| DASH FLOAT64 { Constant.float64 (mkstr $loc ("-" ^ $2)) }
239+
| DASH WASMI32 { Constant.wasmi32 (mkstr $loc ("-" ^ $2)) }
240+
| DASH WASMI64 { Constant.wasmi64 (mkstr $loc ("-" ^ $2)) }
241+
| DASH WASMF32 { Constant.wasmf32 (mkstr $loc ("-" ^ $2)) }
242+
| DASH WASMF64 { Constant.wasmf64 (mkstr $loc ("-" ^ $2)) }
243+
| DASH BIGINT { Constant.bigint (mkstr $loc ("-" ^ $2)) }
244+
| DASH RATIONAL { Constant.rational (mkstr $loc ("-" ^ $2)) }
245+
| TRUE { Constant.bool true }
246+
| FALSE { Constant.bool false }
247+
| VOID { Constant.void }
248+
| STRING { Constant.string (mkstr $loc $1) }
249+
| BYTES { Constant.bytes (mkstr $loc $1) }
250+
| CHAR { Constant.char (mkstr $loc $1) }
231251

232252
expr:
233253
| stmt_expr { $1 }
@@ -257,9 +277,10 @@ ellipsis_prefix(X):
257277
pattern:
258278
| pattern colon typ { Pattern.constraint_ ~loc:(to_loc $loc) $1 $3 }
259279
| UNDERSCORE { Pattern.any ~loc:(to_loc $loc) () }
260-
| const { Pattern.constant ~loc:(to_loc (snd $1)) (fst $1) }
280+
| const { Pattern.constant ~loc:(to_loc $loc) $1 }
261281
// Allow rational numbers in patterns
262-
| DASH? NUMBER_INT SLASH DASH? NUMBER_INT { Pattern.constant ~loc:(to_loc $sloc) @@ Constant.number (Number.rational (if Option.is_some $1 then (mkstr (fst $loc($1), snd $loc($2)) ("-" ^ $2)) else mkstr $loc($2) $2) (to_loc($loc($3))) (if Option.is_some $4 then (mkstr (fst $loc($4), snd $loc($5)) ("-" ^ $5)) else mkstr $loc($5) $5)) }
282+
| NUMBER_INT SLASH DASH? NUMBER_INT { Pattern.constant ~loc:(to_loc $sloc) @@ Constant.number (Number.rational (mkstr $loc($1) $1) (to_loc($loc($2))) (if Option.is_some $3 then (mkstr (fst $loc($3), snd $loc($4)) ("-" ^ $4)) else mkstr $loc($4) $4)) }
283+
| DASH NUMBER_INT SLASH DASH? NUMBER_INT { Pattern.constant ~loc:(to_loc $sloc) @@ Constant.number (Number.rational (mkstr (fst $loc($1), snd $loc($2)) ("-" ^ $2)) (to_loc($loc($3))) (if Option.is_some $4 then (mkstr (fst $loc($4), snd $loc($5)) ("-" ^ $5)) else mkstr $loc($5) $5)) }
263284
| LIDENT { Pattern.var ~loc:(to_loc $loc) (mkstr $loc $1) }
264285
| special_id { Pattern.var ~loc:(to_loc $loc) $1 }
265286
| primitive_ { Pattern.var ~loc:(to_loc $loc) (mkstr $loc $1) }
@@ -503,7 +524,7 @@ id_expr:
503524
| qualified_lid %prec COLON { Expression.ident ~loc:(to_loc $loc) ~core_loc:(to_loc $loc) $1 }
504525

505526
simple_expr:
506-
| const { Expression.constant ~loc:(to_loc (snd $1)) ~core_loc:(to_loc (snd $1)) (fst $1) }
527+
| const { Expression.constant ~loc:(to_loc $loc) ~core_loc:(to_loc $loc) $1 }
507528
| lparen tuple_exprs rparen { Expression.tuple ~loc:(to_loc $loc) ~core_loc:(to_loc $loc) $2 }
508529
| id_expr { $1 }
509530

compiler/test/grainfmt/comments.expected.gr

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,7 @@ foo( // yo
394394
foo, // bar
395395
baz // heh
396396
)
397+
foo(/*a*/ 1 /*b*/)
397398

398399
x => /* foo */ /* foo */ 5
399400
x => /* foo */

compiler/test/grainfmt/comments.input.gr

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,7 @@ foo( // yo
329329
foo, // bar
330330
baz // heh
331331
)
332+
foo(/*a*/ 1 /*b*/)
332333

333334
x /* foo */ => /* foo */ 5
334335
x /* foo */ => // foo

0 commit comments

Comments
 (0)