@@ -84,6 +84,8 @@ module.exports = grammar({
8484 $ . struct_definition ,
8585 ) ,
8686
87+ visibility : _ => 'pub' ,
88+
8789 _type : $ => choice (
8890 $ . _embedded_type ,
8991 $ . _bracketed_generic_name ,
@@ -261,7 +263,11 @@ module.exports = grammar({
261263 ) ) ,
262264
263265 prefix_unary_expression : $ => prec ( PRECEDENCE . UNARY , seq (
264- field ( 'operator' , $ . unary_not ) ,
266+ field ( 'operator' , choice (
267+ $ . unary_not ,
268+ $ . unary_minus ,
269+ $ . unary_bitnot ,
270+ ) ) ,
265271 $ . _expression ,
266272 ) ) ,
267273
@@ -282,6 +288,7 @@ module.exports = grammar({
282288 [ '+' , PRECEDENCE . ADD ] ,
283289 [ '-' , PRECEDENCE . ADD ] ,
284290 [ '*' , PRECEDENCE . MUL ] ,
291+ [ '/' , PRECEDENCE . MUL ] ,
285292 [ '%' , PRECEDENCE . MUL ] ,
286293 [ '<' , PRECEDENCE . COMPARE ] ,
287294 [ '<=' , PRECEDENCE . COMPARE ] ,
@@ -309,6 +316,7 @@ module.exports = grammar({
309316 ) ,
310317
311318 type_definition_statement : $ => seq (
319+ optional ( field ( 'visibility' , $ . visibility ) ) ,
312320 'type' ,
313321 field ( 'name' , $ . identifier ) ,
314322 '=' ,
@@ -317,6 +325,7 @@ module.exports = grammar({
317325 ) ,
318326
319327 constant_definition : $ => seq (
328+ optional ( field ( 'visibility' , $ . visibility ) ) ,
320329 'const' ,
321330 field ( 'name' , $ . identifier ) ,
322331 ':' ,
@@ -335,6 +344,7 @@ module.exports = grammar({
335344 ) ,
336345
337346 enum_definition : $ => seq (
347+ optional ( field ( 'visibility' , $ . visibility ) ) ,
338348 'enum' ,
339349 field ( 'name' , $ . identifier ) ,
340350 '{' ,
@@ -343,12 +353,13 @@ module.exports = grammar({
343353 ) ,
344354
345355 struct_definition : $ => seq (
356+ optional ( field ( 'visibility' , $ . visibility ) ) ,
346357 'struct' ,
347358 field ( 'name' , $ . identifier ) ,
348359 '{' ,
349360 repeat ( choice (
350361 seq ( field ( 'field' , $ . struct_field ) , ';' ) ,
351- field ( 'value ' , $ . function_definition ) ,
362+ field ( 'method ' , $ . function_definition ) ,
352363 ) ) ,
353364 '}' ,
354365 ) ,
@@ -366,6 +377,7 @@ module.exports = grammar({
366377 ) ,
367378
368379 function_definition : $ => seq (
380+ optional ( field ( 'visibility' , $ . visibility ) ) ,
369381 'fn' ,
370382 field ( 'name' , $ . identifier ) ,
371383 optional ( field ( 'type_parameters' , $ . type_argument_list_definition ) ) ,
@@ -482,6 +494,8 @@ module.exports = grammar({
482494 uzumaki_keyword : _ => '@' ,
483495 mut_keyword : _ => 'mut' ,
484496 unary_not : _ => '!' ,
497+ unary_minus : _ => '-' ,
498+ unary_bitnot : _ => '~' ,
485499 bool_literal : _ => choice (
486500 token ( 'true' ) ,
487501 token ( 'false' ) ,
@@ -495,7 +509,9 @@ module.exports = grammar({
495509
496510 _string_literal_content : _ => token . immediate ( prec ( 1 , / [ ^ " \\ \n ] + / ) ) ,
497511
498- number_literal : _ => seq ( optional ( '-' ) , / \d + / ) ,
512+ // Higher precedence than UNARY ensures -42 parses as a single number_literal,
513+ // not as unary_minus applied to a positive literal
514+ number_literal : _ => token ( prec ( PRECEDENCE . UNARY + 1 , seq ( optional ( '-' ) , / \d + / ) ) ) ,
499515
500516 unit_literal : _ => seq ( '(' , token . immediate ( ')' ) ) ,
501517
@@ -551,10 +567,13 @@ module.exports = grammar({
551567 )
552568 ) ) ,
553569
570+ // Type argument list - space-separated like definitions
571+ // Note: Nested generics are syntactically valid but rejected at compilation
554572 type_argument_list : $ => prec . left ( seq (
555- choice (
556- sep1 ( seq ( field ( 'type' , $ . _type ) , token . immediate ( '\'' ) ) , ',' ) ,
557- ) ,
573+ seq ( field ( 'type' , $ . _type ) , token . immediate ( '\'' ) ) ,
574+ repeat (
575+ seq ( field ( 'type' , $ . _type ) , token . immediate ( '\'' ) ) ,
576+ )
558577 ) ) ,
559578
560579 _reserved_identifier : _ => choice (
0 commit comments