tree-sitter-sed 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/Cargo.toml CHANGED
@@ -10,7 +10,7 @@ name = "tree-sitter-sed"
10
10
  publish = false
11
11
  readme = "README.md"
12
12
  repository = "https://github.com/konomanoasa/tree-sitter-sed"
13
- version = "0.13.0"
13
+ version = "0.14.0"
14
14
 
15
15
  build = "bindings/rust/build.rs"
16
16
  include = [
package/common/grammar.js CHANGED
@@ -935,6 +935,25 @@ function sedRules(mode) {
935
935
  };
936
936
  }
937
937
 
938
+ const missingCommandDefinitions = [
939
+ { reason: "missing_function", atBoundary: true },
940
+ { reason: "missing_label", atBoundary: true },
941
+ { reason: "missing_rfile", atBoundary: true },
942
+ { reason: "missing_wfile", atBoundary: true },
943
+ { reason: "missing_text_introducer", atBoundary: true },
944
+ {
945
+ reason: "incomplete_text_introducer",
946
+ rule: ($) => $._text_incomplete_introducer,
947
+ },
948
+ { reason: "missing_text" },
949
+ { reason: "missing_closing_brace" },
950
+ { reason: "missing_opening_delimiter", atBoundary: true },
951
+ ];
952
+
953
+ const boundaryMissingReasons = missingCommandDefinitions
954
+ .filter(({ atBoundary }) => atBoundary)
955
+ .map(({ reason }) => reason);
956
+
938
957
  function missingMarkerNames(mode) {
939
958
  return [
940
959
  "omitted_address",
@@ -956,12 +975,7 @@ function missingMarkerNames(mode) {
956
975
  "missing_opening_delimiter",
957
976
  "missing_separator_before_unmatched_brace",
958
977
  "missing_separator_after_unmatched_brace",
959
- "nonconforming_missing_function",
960
- "nonconforming_missing_label",
961
- "nonconforming_missing_rfile",
962
- "nonconforming_missing_wfile",
963
- "nonconforming_missing_text_introducer",
964
- "nonconforming_missing_opening_delimiter",
978
+ ...boundaryMissingReasons.map((reason) => `nonconforming_${reason}`),
965
979
  "missing_subexpression_placeholder",
966
980
  "incomplete_bracket_list",
967
981
  "incomplete_bracket_expression",
@@ -975,15 +989,6 @@ function issueDefinitions(mode) {
975
989
  return ($) => $[`_${reason}_marker`];
976
990
  }
977
991
 
978
- const boundaryMissingReasons = [
979
- "missing_function",
980
- "missing_label",
981
- "missing_rfile",
982
- "missing_wfile",
983
- "missing_text_introducer",
984
- "missing_opening_delimiter",
985
- ];
986
-
987
992
  return [
988
993
  {
989
994
  reason: "malformed_bracket_term",
@@ -1403,51 +1408,11 @@ function issueDefinitions(mode) {
1403
1408
  outcome: "nonconforming_syntax",
1404
1409
  rule: missing(`nonconforming_${reason}`),
1405
1410
  })),
1406
- {
1407
- reason: "missing_function",
1408
- outcome: "incomplete_syntax",
1409
- rule: missing("missing_function"),
1410
- },
1411
- {
1412
- reason: "missing_label",
1413
- outcome: "incomplete_syntax",
1414
- rule: missing("missing_label"),
1415
- },
1416
- {
1417
- reason: "missing_rfile",
1418
- outcome: "incomplete_syntax",
1419
- rule: missing("missing_rfile"),
1420
- },
1421
- {
1422
- reason: "missing_wfile",
1423
- outcome: "incomplete_syntax",
1424
- rule: missing("missing_wfile"),
1425
- },
1426
- {
1427
- reason: "missing_text_introducer",
1428
- outcome: "incomplete_syntax",
1429
- rule: missing("missing_text_introducer"),
1430
- },
1431
- {
1432
- reason: "incomplete_text_introducer",
1433
- outcome: "incomplete_syntax",
1434
- rule: ($) => $._text_incomplete_introducer,
1435
- },
1436
- {
1437
- reason: "missing_text",
1438
- outcome: "incomplete_syntax",
1439
- rule: missing("missing_text"),
1440
- },
1441
- {
1442
- reason: "missing_closing_brace",
1443
- outcome: "incomplete_syntax",
1444
- rule: missing("missing_closing_brace"),
1445
- },
1446
- {
1447
- reason: "missing_opening_delimiter",
1411
+ ...missingCommandDefinitions.map(({ reason, rule }) => ({
1412
+ reason,
1448
1413
  outcome: "incomplete_syntax",
1449
- rule: missing("missing_opening_delimiter"),
1450
- },
1414
+ rule: rule ?? missing(reason),
1415
+ })),
1451
1416
  {
1452
1417
  reason: "missing_subexpression",
1453
1418
  outcome: "incomplete_syntax",
package/common/regex.js CHANGED
@@ -316,6 +316,20 @@ function regularExpressionEscape($) {
316
316
  );
317
317
  }
318
318
 
319
+ function oneCharOrCollElem($, ...additional) {
320
+ return choice(
321
+ issueField($, "invalid_regular_expression_character"),
322
+ issueField($, "invalid_encoding"),
323
+ $.ordinary_character,
324
+ regularExpressionEscape($),
325
+ $.sed_newline_escape,
326
+ $.period,
327
+ $._bracket_expression,
328
+ issueField($, "special_delimiter_escape"),
329
+ ...additional,
330
+ );
331
+ }
332
+
319
333
  function commonRegularExpressionRules() {
320
334
  return {
321
335
  dup_count: ($) => $._regex_dup_count,
@@ -432,15 +446,8 @@ function breRules() {
432
446
  backreference: ($) => $._regex_backreference,
433
447
 
434
448
  one_char_or_coll_elem_bre: ($) =>
435
- choice(
436
- issueField($, "invalid_regular_expression_character"),
437
- issueField($, "invalid_encoding"),
438
- $.ordinary_character,
439
- regularExpressionEscape($),
440
- $.sed_newline_escape,
441
- $.period,
442
- $._bracket_expression,
443
- issueField($, "special_delimiter_escape"),
449
+ oneCharOrCollElem(
450
+ $,
444
451
  issueField($, "bre_vertical_line_escape"),
445
452
  issueField($, "bre_question_mark_escape"),
446
453
  issueField($, "bre_plus_escape"),
@@ -524,17 +531,7 @@ function ereRules() {
524
531
  field("operator", issueNode($, "leading_duplication_symbol")),
525
532
  ),
526
533
 
527
- one_char_or_coll_elem_ere: ($) =>
528
- choice(
529
- issueField($, "invalid_regular_expression_character"),
530
- issueField($, "invalid_encoding"),
531
- $.ordinary_character,
532
- regularExpressionEscape($),
533
- $.sed_newline_escape,
534
- $.period,
535
- $._bracket_expression,
536
- issueField($, "special_delimiter_escape"),
537
- ),
534
+ one_char_or_coll_elem_ere: ($) => oneCharOrCollElem($),
538
535
 
539
536
  ere_dupl_symbol: ($) =>
540
537
  seq(
package/common/scanner.h CHANGED
@@ -2339,6 +2339,129 @@ scan_right_brace(TSLexer *lexer, const bool *valid_symbols, TSSymbol *symbol) {
2339
2339
  return false;
2340
2340
  }
2341
2341
 
2342
+ static bool scan_command_recovery(
2343
+ TSLexer *lexer,
2344
+ const bool *valid_symbols,
2345
+ TSSymbol *symbol
2346
+ ) {
2347
+ if (
2348
+ lexer->lookahead ==
2349
+ ',' &&
2350
+ emit_marker(lexer, valid_symbols, OMITTED_FIRST_ADDRESS_MARKER, symbol)
2351
+ ) {
2352
+ return true;
2353
+ }
2354
+
2355
+ if (
2356
+ (valid_symbols[OMITTED_ADDRESS_MARKER] ||
2357
+ valid_symbols[INCOMPLETE_OMITTED_ADDRESS_MARKER]) &&
2358
+ !can_start_address(lexer) &&
2359
+ !is_blank(lexer->lookahead)
2360
+ ) {
2361
+ return emit_marker(
2362
+ lexer,
2363
+ valid_symbols,
2364
+ lexer->eof(lexer) ? INCOMPLETE_OMITTED_ADDRESS_MARKER
2365
+ : OMITTED_ADDRESS_MARKER,
2366
+ symbol
2367
+ );
2368
+ }
2369
+
2370
+ if (is_blank(lexer->lookahead)) {
2371
+ switch (scan_post_blank_recovery(lexer, valid_symbols, symbol)) {
2372
+ case POST_BLANK_RECOVERY_TOKEN:
2373
+ return true;
2374
+ case POST_BLANK_RECOVERY_FAILED:
2375
+ return scan_unexpected_command_text(lexer, valid_symbols, symbol, true);
2376
+ case POST_BLANK_RECOVERY_SKIPPED:
2377
+ break;
2378
+ }
2379
+ }
2380
+
2381
+ if (
2382
+ !at_command_boundary(lexer) &&
2383
+ !is_blank(lexer->lookahead) &&
2384
+ emit_marker(lexer, valid_symbols, OMITTED_FILE_SEPARATOR_MARKER, symbol)
2385
+ ) {
2386
+ return true;
2387
+ }
2388
+
2389
+ if (at_command_boundary(lexer)) {
2390
+ static const TSSymbol boundary_markers[][2] = {
2391
+ {MISSING_FUNCTION_MARKER, NONCONFORMING_MISSING_FUNCTION_MARKER},
2392
+ {MISSING_LABEL_MARKER, NONCONFORMING_MISSING_LABEL_MARKER},
2393
+ {MISSING_RFILE_MARKER, NONCONFORMING_MISSING_RFILE_MARKER},
2394
+ {MISSING_WFILE_MARKER, NONCONFORMING_MISSING_WFILE_MARKER},
2395
+ };
2396
+ const unsigned variant = lexer->eof(lexer) ? 0 : 1;
2397
+ for (
2398
+ unsigned index = 0;
2399
+ index < sizeof(boundary_markers) / sizeof(boundary_markers[0]);
2400
+ index++
2401
+ ) {
2402
+ if (
2403
+ emit_marker(
2404
+ lexer,
2405
+ valid_symbols,
2406
+ boundary_markers[index][variant],
2407
+ symbol
2408
+ )
2409
+ ) {
2410
+ return true;
2411
+ }
2412
+ }
2413
+ }
2414
+
2415
+ if (
2416
+ emit_marker(
2417
+ lexer,
2418
+ valid_symbols,
2419
+ missing_text_introducer_symbol(lexer),
2420
+ symbol
2421
+ )
2422
+ ) {
2423
+ return true;
2424
+ }
2425
+
2426
+ if (
2427
+ lexer->eof(lexer) &&
2428
+ emit_marker(lexer, valid_symbols, MISSING_CLOSING_BRACE_MARKER, symbol)
2429
+ ) {
2430
+ return true;
2431
+ }
2432
+
2433
+ if (
2434
+ !at_command_boundary(lexer) &&
2435
+ !is_blank(lexer->lookahead) &&
2436
+ emit_marker(
2437
+ lexer,
2438
+ valid_symbols,
2439
+ MISSING_SEPARATOR_AFTER_UNMATCHED_BRACE_MARKER,
2440
+ symbol
2441
+ )
2442
+ ) {
2443
+ return true;
2444
+ }
2445
+
2446
+ const TSSymbol separator_marker =
2447
+ missing_command_separator_marker(lexer, valid_symbols);
2448
+ if (separator_marker != ERROR_SENTINEL) {
2449
+ return emit_marker(lexer, valid_symbols, separator_marker, symbol);
2450
+ }
2451
+
2452
+ const TSSymbol missing_opening_delimiter = lexer->eof(lexer)
2453
+ ? MISSING_OPENING_DELIMITER_MARKER
2454
+ : NONCONFORMING_MISSING_OPENING_DELIMITER_MARKER;
2455
+ if (
2456
+ delimiter_is_missing(lexer) &&
2457
+ emit_marker(lexer, valid_symbols, missing_opening_delimiter, symbol)
2458
+ ) {
2459
+ return true;
2460
+ }
2461
+
2462
+ return scan_unexpected_command_text(lexer, valid_symbols, symbol, false);
2463
+ }
2464
+
2342
2465
  static bool scan_command_token(
2343
2466
  TSLexer *lexer,
2344
2467
  ScannerState *state,
@@ -2512,122 +2635,7 @@ static bool scan_command_token(
2512
2635
  return scan_right_brace(lexer, valid_symbols, symbol);
2513
2636
  }
2514
2637
 
2515
- if (
2516
- lexer->lookahead ==
2517
- ',' &&
2518
- emit_marker(lexer, valid_symbols, OMITTED_FIRST_ADDRESS_MARKER, symbol)
2519
- ) {
2520
- return true;
2521
- }
2522
-
2523
- if (
2524
- (valid_symbols[OMITTED_ADDRESS_MARKER] ||
2525
- valid_symbols[INCOMPLETE_OMITTED_ADDRESS_MARKER]) &&
2526
- !can_start_address(lexer) &&
2527
- !is_blank(lexer->lookahead)
2528
- ) {
2529
- return emit_marker(
2530
- lexer,
2531
- valid_symbols,
2532
- lexer->eof(lexer) ? INCOMPLETE_OMITTED_ADDRESS_MARKER
2533
- : OMITTED_ADDRESS_MARKER,
2534
- symbol
2535
- );
2536
- }
2537
-
2538
- if (is_blank(lexer->lookahead)) {
2539
- switch (scan_post_blank_recovery(lexer, valid_symbols, symbol)) {
2540
- case POST_BLANK_RECOVERY_TOKEN:
2541
- return true;
2542
- case POST_BLANK_RECOVERY_FAILED:
2543
- return scan_unexpected_command_text(lexer, valid_symbols, symbol, true);
2544
- case POST_BLANK_RECOVERY_SKIPPED:
2545
- break;
2546
- }
2547
- }
2548
-
2549
- if (
2550
- !at_command_boundary(lexer) &&
2551
- !is_blank(lexer->lookahead) &&
2552
- emit_marker(lexer, valid_symbols, OMITTED_FILE_SEPARATOR_MARKER, symbol)
2553
- ) {
2554
- return true;
2555
- }
2556
-
2557
- if (at_command_boundary(lexer)) {
2558
- static const TSSymbol boundary_markers[][2] = {
2559
- {MISSING_FUNCTION_MARKER, NONCONFORMING_MISSING_FUNCTION_MARKER},
2560
- {MISSING_LABEL_MARKER, NONCONFORMING_MISSING_LABEL_MARKER},
2561
- {MISSING_RFILE_MARKER, NONCONFORMING_MISSING_RFILE_MARKER},
2562
- {MISSING_WFILE_MARKER, NONCONFORMING_MISSING_WFILE_MARKER},
2563
- };
2564
- const unsigned variant = lexer->eof(lexer) ? 0 : 1;
2565
- for (
2566
- unsigned index = 0;
2567
- index < sizeof(boundary_markers) / sizeof(boundary_markers[0]);
2568
- index++
2569
- ) {
2570
- if (
2571
- emit_marker(
2572
- lexer,
2573
- valid_symbols,
2574
- boundary_markers[index][variant],
2575
- symbol
2576
- )
2577
- ) {
2578
- return true;
2579
- }
2580
- }
2581
- }
2582
-
2583
- if (
2584
- emit_marker(
2585
- lexer,
2586
- valid_symbols,
2587
- missing_text_introducer_symbol(lexer),
2588
- symbol
2589
- )
2590
- ) {
2591
- return true;
2592
- }
2593
-
2594
- if (
2595
- lexer->eof(lexer) &&
2596
- emit_marker(lexer, valid_symbols, MISSING_CLOSING_BRACE_MARKER, symbol)
2597
- ) {
2598
- return true;
2599
- }
2600
-
2601
- if (
2602
- !at_command_boundary(lexer) &&
2603
- !is_blank(lexer->lookahead) &&
2604
- emit_marker(
2605
- lexer,
2606
- valid_symbols,
2607
- MISSING_SEPARATOR_AFTER_UNMATCHED_BRACE_MARKER,
2608
- symbol
2609
- )
2610
- ) {
2611
- return true;
2612
- }
2613
-
2614
- const TSSymbol separator_marker =
2615
- missing_command_separator_marker(lexer, valid_symbols);
2616
- if (separator_marker != ERROR_SENTINEL) {
2617
- return emit_marker(lexer, valid_symbols, separator_marker, symbol);
2618
- }
2619
-
2620
- const TSSymbol missing_opening_delimiter = lexer->eof(lexer)
2621
- ? MISSING_OPENING_DELIMITER_MARKER
2622
- : NONCONFORMING_MISSING_OPENING_DELIMITER_MARKER;
2623
- if (
2624
- delimiter_is_missing(lexer) &&
2625
- emit_marker(lexer, valid_symbols, missing_opening_delimiter, symbol)
2626
- ) {
2627
- return true;
2628
- }
2629
-
2630
- return scan_unexpected_command_text(lexer, valid_symbols, symbol, false);
2638
+ return scan_command_recovery(lexer, valid_symbols, symbol);
2631
2639
  }
2632
2640
 
2633
2641
  static bool sed_scanner_scan_impl(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tree-sitter-sed",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
4
4
  "type": "module",
5
5
  "description": "Tree-sitter grammars for POSIX sed.",
6
6
  "license": "MIT",
@@ -56370,7 +56370,7 @@ TS_PUBLIC const TSLanguage *tree_sitter_sed_ere(void) {
56370
56370
  .max_reserved_word_set_size = 0,
56371
56371
  .metadata = {
56372
56372
  .major_version = 0,
56373
- .minor_version = 13,
56373
+ .minor_version = 14,
56374
56374
  .patch_version = 0,
56375
56375
  },
56376
56376
  };
package/src/parser.c CHANGED
@@ -59264,7 +59264,7 @@ TS_PUBLIC const TSLanguage *tree_sitter_sed(void) {
59264
59264
  .max_reserved_word_set_size = 0,
59265
59265
  .metadata = {
59266
59266
  .major_version = 0,
59267
- .minor_version = 13,
59267
+ .minor_version = 14,
59268
59268
  .patch_version = 0,
59269
59269
  },
59270
59270
  };
package/tree-sitter.json CHANGED
@@ -21,7 +21,7 @@
21
21
  }
22
22
  ],
23
23
  "metadata": {
24
- "version": "0.13.0",
24
+ "version": "0.14.0",
25
25
  "license": "MIT",
26
26
  "description": "Tree-sitter grammars for POSIX sed.",
27
27
  "authors": [