tree-sitter-sh 0.5.0 → 0.6.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/CMakeLists.txt CHANGED
@@ -1,7 +1,7 @@
1
1
  cmake_minimum_required(VERSION 3.13)
2
2
 
3
3
  project(tree-sitter-sh
4
- VERSION "0.5.0"
4
+ VERSION "0.6.0"
5
5
  DESCRIPTION "Tree-sitter grammar for POSIX sh."
6
6
  HOMEPAGE_URL "https://github.com/konomanoasa/tree-sitter-sh"
7
7
  LANGUAGES C)
package/Cargo.toml ADDED
@@ -0,0 +1,39 @@
1
+ [package]
2
+ authors = ["konomanoasa"]
3
+ autoexamples = false
4
+ categories = ["parser-implementations", "parsing", "text-editors"]
5
+ description = "Tree-sitter grammar for POSIX sh."
6
+ edition = "2024"
7
+ keywords = ["incremental", "parsing", "tree-sitter", "sh", "shell"]
8
+ license = "MIT"
9
+ name = "tree-sitter-sh"
10
+ readme = "README.md"
11
+ repository = "https://github.com/konomanoasa/tree-sitter-sh"
12
+ version = "0.6.0"
13
+
14
+ build = "bindings/rust/build.rs"
15
+ include = [
16
+ "/LICENSE",
17
+ "/README.md",
18
+ "/bindings/rust/*.rs",
19
+ "/grammar.js",
20
+ "/queries/*.scm",
21
+ "/src/grammar.json",
22
+ "/src/node-types.json",
23
+ "/src/parser.c",
24
+ "/src/scanner.c",
25
+ "/src/tree_sitter/*.h",
26
+ "/tree-sitter.json",
27
+ ]
28
+
29
+ [lib]
30
+ path = "bindings/rust/lib.rs"
31
+
32
+ [dependencies]
33
+ tree-sitter-language = "0.1"
34
+
35
+ [build-dependencies]
36
+ cc = "1.2"
37
+
38
+ [dev-dependencies]
39
+ tree-sitter = "0.27.0"
package/Makefile CHANGED
@@ -1,6 +1,6 @@
1
1
  LANGUAGE_NAME := tree-sitter-sh
2
2
  HOMEPAGE_URL := https://github.com/konomanoasa/tree-sitter-sh
3
- VERSION := 0.5.0
3
+ VERSION := 0.6.0
4
4
  DESCRIPTION := Tree-sitter grammar for POSIX sh.
5
5
 
6
6
  # repository
package/README.md CHANGED
@@ -12,7 +12,14 @@ POSIX.1-2024 Shell Command Language.
12
12
  npm install tree-sitter-sh
13
13
  ```
14
14
 
15
- ## Specification
15
+ ## Development
16
+
17
+ ```sh
18
+ npm install
19
+ npm run parse -- script.sh
20
+ ```
21
+
22
+ ## Specifications
16
23
 
17
24
  [POSIX.1-2024 Shell Command Language](https://pubs.opengroup.org/onlinepubs/9799919799.2024edition/utilities/V3_chap02.html)
18
25
 
@@ -0,0 +1,28 @@
1
+ use std::path::Path;
2
+
3
+ fn main() {
4
+ let source_directory = Path::new("src");
5
+ let parser_path = source_directory.join("parser.c");
6
+ let scanner_path = source_directory.join("scanner.c");
7
+ let mut c_config = cc::Build::new();
8
+ c_config.std("c11").include(source_directory);
9
+
10
+ #[cfg(target_env = "msvc")]
11
+ c_config.flag("-utf-8");
12
+
13
+ let target = std::env::var("TARGET").expect("Cargo must provide TARGET");
14
+ if target == "wasm32-unknown-unknown" {
15
+ let wasm_headers = std::env::var_os("DEP_TREE_SITTER_LANGUAGE_WASM_HEADERS")
16
+ .map(std::path::PathBuf::from)
17
+ .expect(
18
+ "tree-sitter-language must provide its headers when compiling for wasm32-unknown-unknown",
19
+ );
20
+ c_config.include(wasm_headers);
21
+ }
22
+
23
+ c_config.file(&parser_path).file(&scanner_path);
24
+ c_config.compile("tree-sitter-sh");
25
+
26
+ println!("cargo:rerun-if-changed={}", parser_path.display());
27
+ println!("cargo:rerun-if-changed={}", scanner_path.display());
28
+ }
@@ -0,0 +1,43 @@
1
+ //! POSIX shell grammar for the Tree-sitter parsing library.
2
+ //!
3
+ //! ```
4
+ //! let mut parser = tree_sitter::Parser::new();
5
+ //! parser
6
+ //! .set_language(&tree_sitter_sh::LANGUAGE.into())
7
+ //! .expect("POSIX shell grammar must load");
8
+ //! let tree = parser
9
+ //! .parse("echo hello\n", None)
10
+ //! .expect("parser must return a tree");
11
+ //! assert!(!tree.root_node().has_error());
12
+ //! ```
13
+
14
+ use tree_sitter_language::LanguageFn;
15
+
16
+ unsafe extern "C" {
17
+ fn tree_sitter_sh() -> *const ();
18
+ }
19
+
20
+ /// The Tree-sitter [`LanguageFn`] for POSIX shell.
21
+ pub const LANGUAGE: LanguageFn = unsafe { LanguageFn::from_raw(tree_sitter_sh) };
22
+
23
+ /// The node type definitions for [`LANGUAGE`].
24
+ pub const NODE_TYPES: &str = include_str!("../../src/node-types.json");
25
+
26
+ /// The syntax highlighting query for [`LANGUAGE`].
27
+ pub const HIGHLIGHTS_QUERY: &str = include_str!("../../queries/highlights.scm");
28
+
29
+ #[cfg(test)]
30
+ mod tests {
31
+ #[test]
32
+ fn grammar_loads_and_parses() {
33
+ let mut parser = tree_sitter::Parser::new();
34
+ parser
35
+ .set_language(&super::LANGUAGE.into())
36
+ .expect("POSIX shell grammar must load");
37
+ let tree = parser
38
+ .parse("echo hello\n", None)
39
+ .expect("parser must return a tree");
40
+ assert_eq!(tree.root_node().kind(), "program");
41
+ assert!(!tree.root_node().has_error());
42
+ }
43
+ }
package/package.json CHANGED
@@ -1,11 +1,13 @@
1
1
  {
2
2
  "name": "tree-sitter-sh",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "Tree-sitter grammar for POSIX sh.",
5
5
  "license": "MIT",
6
6
  "repository": "git+https://github.com/konomanoasa/tree-sitter-sh.git",
7
7
  "files": [
8
8
  "bindings/c",
9
+ "bindings/rust",
10
+ "Cargo.toml",
9
11
  "CMakeLists.txt",
10
12
  "grammar.js",
11
13
  "Makefile",
@@ -20,6 +22,7 @@
20
22
  "check": "biome check . && node scripts/check-c.js && node scripts/check-generated.js && npm test",
21
23
  "format": "biome check --write . && node scripts/check-c.js --write",
22
24
  "generate": "npm run tree-sitter -- generate",
25
+ "parse": "npm run tree-sitter -- parse --scope source.sh",
23
26
  "test": "npm run tree-sitter -- test --rebuild && node --test",
24
27
  "test:fuzz": "npm run tree-sitter -- fuzz --rebuild --iterations 100 --edits 5",
25
28
  "tree-sitter": "node scripts/tree-sitter.js"
@@ -99,15 +99,11 @@
99
99
 
100
100
  (parameter_expansion
101
101
  "$" @variable
102
- parameter: (variable_name))
103
-
104
- (parameter_expansion
105
- "$" @variable.parameter
106
- parameter: (positional_parameter))
107
-
108
- (parameter_expansion
109
- "$" @variable.builtin
110
- parameter: (special_parameter))
102
+ parameter: [
103
+ (variable_name)
104
+ (positional_parameter)
105
+ (special_parameter)
106
+ ])
111
107
 
112
108
  (command_substitution
113
109
  "$" @punctuation.special)
@@ -303,7 +299,7 @@
303
299
  (word
304
300
  (pattern_bracket_source
305
301
  "[" @punctuation.bracket
306
- (pattern_bracket_negation_source)? @punctuation.special
302
+ (pattern_bracket_negation_source)? @operator
307
303
  (pattern_bracket_members_source
308
304
  [
309
305
  (pattern_bracket_character_source) @character
@@ -313,26 +309,36 @@
313
309
  (pattern_bracket_character_source)
314
310
  (pattern_bracket_hyphen_source)
315
311
  ] @character
316
- operator: (pattern_bracket_range_operator_source) @punctuation.special
312
+ operator: (pattern_bracket_range_operator_source) @operator
317
313
  end: [
318
314
  (pattern_bracket_character_source)
319
315
  (pattern_bracket_hyphen_source)
320
316
  ] @character)
321
317
  (pattern_character_class_source
322
318
  "[" @punctuation.bracket
323
- ":" @punctuation.bracket
319
+ ":" @punctuation.delimiter
324
320
  content: (pattern_character_class_content_source) @character.special
325
- ":" @punctuation.bracket
321
+ ":" @punctuation.delimiter
322
+ "]" @punctuation.bracket)
323
+ (pattern_collating_symbol_source
324
+ "[" @punctuation.bracket
325
+ "." @punctuation.delimiter
326
+ value: (pattern_collating_symbol_character_source) @character.special
327
+ "." @punctuation.delimiter
328
+ "]" @punctuation.bracket)
329
+ (pattern_equivalence_class_source
330
+ "[" @punctuation.bracket
331
+ "=" @punctuation.delimiter
332
+ value: (pattern_equivalence_class_character_source) @character.special
333
+ "=" @punctuation.delimiter
326
334
  "]" @punctuation.bracket)
327
- (pattern_collating_symbol_source) @character.special
328
- (pattern_equivalence_class_source) @character.special
329
335
  ])
330
336
  "]" @punctuation.bracket)))
331
337
 
332
338
  (parameter_pattern
333
339
  (pattern_bracket_source
334
340
  "[" @punctuation.bracket
335
- (pattern_bracket_negation_source)? @punctuation.special
341
+ (pattern_bracket_negation_source)? @operator
336
342
  (pattern_bracket_members_source
337
343
  [
338
344
  (pattern_bracket_character_source) @character
@@ -342,19 +348,29 @@
342
348
  (pattern_bracket_character_source)
343
349
  (pattern_bracket_hyphen_source)
344
350
  ] @character
345
- operator: (pattern_bracket_range_operator_source) @punctuation.special
351
+ operator: (pattern_bracket_range_operator_source) @operator
346
352
  end: [
347
353
  (pattern_bracket_character_source)
348
354
  (pattern_bracket_hyphen_source)
349
355
  ] @character)
350
356
  (pattern_character_class_source
351
357
  "[" @punctuation.bracket
352
- ":" @punctuation.bracket
358
+ ":" @punctuation.delimiter
353
359
  content: (pattern_character_class_content_source) @character.special
354
- ":" @punctuation.bracket
360
+ ":" @punctuation.delimiter
361
+ "]" @punctuation.bracket)
362
+ (pattern_collating_symbol_source
363
+ "[" @punctuation.bracket
364
+ "." @punctuation.delimiter
365
+ value: (pattern_collating_symbol_character_source) @character.special
366
+ "." @punctuation.delimiter
367
+ "]" @punctuation.bracket)
368
+ (pattern_equivalence_class_source
369
+ "[" @punctuation.bracket
370
+ "=" @punctuation.delimiter
371
+ value: (pattern_equivalence_class_character_source) @character.special
372
+ "=" @punctuation.delimiter
355
373
  "]" @punctuation.bracket)
356
- (pattern_collating_symbol_source) @character.special
357
- (pattern_equivalence_class_source) @character.special
358
374
  ])
359
375
  "]" @punctuation.bracket))
360
376
 
@@ -362,7 +378,7 @@
362
378
  (word
363
379
  (pattern_bracket_source
364
380
  "[" @punctuation.bracket
365
- (pattern_bracket_negation_source)? @punctuation.special
381
+ (pattern_bracket_negation_source)? @operator
366
382
  (pattern_bracket_members_source
367
383
  [
368
384
  (pattern_bracket_character_source) @character
@@ -372,19 +388,29 @@
372
388
  (pattern_bracket_character_source)
373
389
  (pattern_bracket_hyphen_source)
374
390
  ] @character
375
- operator: (pattern_bracket_range_operator_source) @punctuation.special
391
+ operator: (pattern_bracket_range_operator_source) @operator
376
392
  end: [
377
393
  (pattern_bracket_character_source)
378
394
  (pattern_bracket_hyphen_source)
379
395
  ] @character)
380
396
  (pattern_character_class_source
381
397
  "[" @punctuation.bracket
382
- ":" @punctuation.bracket
398
+ ":" @punctuation.delimiter
383
399
  content: (pattern_character_class_content_source) @character.special
384
- ":" @punctuation.bracket
400
+ ":" @punctuation.delimiter
401
+ "]" @punctuation.bracket)
402
+ (pattern_collating_symbol_source
403
+ "[" @punctuation.bracket
404
+ "." @punctuation.delimiter
405
+ value: (pattern_collating_symbol_character_source) @character.special
406
+ "." @punctuation.delimiter
407
+ "]" @punctuation.bracket)
408
+ (pattern_equivalence_class_source
409
+ "[" @punctuation.bracket
410
+ "=" @punctuation.delimiter
411
+ value: (pattern_equivalence_class_character_source) @character.special
412
+ "=" @punctuation.delimiter
385
413
  "]" @punctuation.bracket)
386
- (pattern_collating_symbol_source) @character.special
387
- (pattern_equivalence_class_source) @character.special
388
414
  ])
389
415
  "]" @punctuation.bracket)))
390
416
 
@@ -392,7 +418,7 @@
392
418
  (word
393
419
  (pattern_bracket_source
394
420
  "[" @punctuation.bracket
395
- (pattern_bracket_negation_source)? @punctuation.special
421
+ (pattern_bracket_negation_source)? @operator
396
422
  (pattern_bracket_members_source
397
423
  [
398
424
  (pattern_bracket_character_source) @character
@@ -402,19 +428,29 @@
402
428
  (pattern_bracket_character_source)
403
429
  (pattern_bracket_hyphen_source)
404
430
  ] @character
405
- operator: (pattern_bracket_range_operator_source) @punctuation.special
431
+ operator: (pattern_bracket_range_operator_source) @operator
406
432
  end: [
407
433
  (pattern_bracket_character_source)
408
434
  (pattern_bracket_hyphen_source)
409
435
  ] @character)
410
436
  (pattern_character_class_source
411
437
  "[" @punctuation.bracket
412
- ":" @punctuation.bracket
438
+ ":" @punctuation.delimiter
413
439
  content: (pattern_character_class_content_source) @character.special
414
- ":" @punctuation.bracket
440
+ ":" @punctuation.delimiter
441
+ "]" @punctuation.bracket)
442
+ (pattern_collating_symbol_source
443
+ "[" @punctuation.bracket
444
+ "." @punctuation.delimiter
445
+ value: (pattern_collating_symbol_character_source) @character.special
446
+ "." @punctuation.delimiter
447
+ "]" @punctuation.bracket)
448
+ (pattern_equivalence_class_source
449
+ "[" @punctuation.bracket
450
+ "=" @punctuation.delimiter
451
+ value: (pattern_equivalence_class_character_source) @character.special
452
+ "=" @punctuation.delimiter
415
453
  "]" @punctuation.bracket)
416
- (pattern_collating_symbol_source) @character.special
417
- (pattern_equivalence_class_source) @character.special
418
454
  ])
419
455
  "]" @punctuation.bracket)))
420
456
 
@@ -422,7 +458,7 @@
422
458
  word: (word
423
459
  (pattern_bracket_source
424
460
  "[" @punctuation.bracket
425
- (pattern_bracket_negation_source)? @punctuation.special
461
+ (pattern_bracket_negation_source)? @operator
426
462
  (pattern_bracket_members_source
427
463
  [
428
464
  (pattern_bracket_character_source) @character
@@ -432,19 +468,29 @@
432
468
  (pattern_bracket_character_source)
433
469
  (pattern_bracket_hyphen_source)
434
470
  ] @character
435
- operator: (pattern_bracket_range_operator_source) @punctuation.special
471
+ operator: (pattern_bracket_range_operator_source) @operator
436
472
  end: [
437
473
  (pattern_bracket_character_source)
438
474
  (pattern_bracket_hyphen_source)
439
475
  ] @character)
440
476
  (pattern_character_class_source
441
477
  "[" @punctuation.bracket
442
- ":" @punctuation.bracket
478
+ ":" @punctuation.delimiter
443
479
  content: (pattern_character_class_content_source) @character.special
444
- ":" @punctuation.bracket
480
+ ":" @punctuation.delimiter
481
+ "]" @punctuation.bracket)
482
+ (pattern_collating_symbol_source
483
+ "[" @punctuation.bracket
484
+ "." @punctuation.delimiter
485
+ value: (pattern_collating_symbol_character_source) @character.special
486
+ "." @punctuation.delimiter
487
+ "]" @punctuation.bracket)
488
+ (pattern_equivalence_class_source
489
+ "[" @punctuation.bracket
490
+ "=" @punctuation.delimiter
491
+ value: (pattern_equivalence_class_character_source) @character.special
492
+ "=" @punctuation.delimiter
445
493
  "]" @punctuation.bracket)
446
- (pattern_collating_symbol_source) @character.special
447
- (pattern_equivalence_class_source) @character.special
448
494
  ])
449
495
  "]" @punctuation.bracket)))
450
496
 
@@ -452,7 +498,7 @@
452
498
  word: (word
453
499
  (pattern_bracket_source
454
500
  "[" @punctuation.bracket
455
- (pattern_bracket_negation_source)? @punctuation.special
501
+ (pattern_bracket_negation_source)? @operator
456
502
  (pattern_bracket_members_source
457
503
  [
458
504
  (pattern_bracket_character_source) @character
@@ -462,19 +508,29 @@
462
508
  (pattern_bracket_character_source)
463
509
  (pattern_bracket_hyphen_source)
464
510
  ] @character
465
- operator: (pattern_bracket_range_operator_source) @punctuation.special
511
+ operator: (pattern_bracket_range_operator_source) @operator
466
512
  end: [
467
513
  (pattern_bracket_character_source)
468
514
  (pattern_bracket_hyphen_source)
469
515
  ] @character)
470
516
  (pattern_character_class_source
471
517
  "[" @punctuation.bracket
472
- ":" @punctuation.bracket
518
+ ":" @punctuation.delimiter
473
519
  content: (pattern_character_class_content_source) @character.special
474
- ":" @punctuation.bracket
520
+ ":" @punctuation.delimiter
521
+ "]" @punctuation.bracket)
522
+ (pattern_collating_symbol_source
523
+ "[" @punctuation.bracket
524
+ "." @punctuation.delimiter
525
+ value: (pattern_collating_symbol_character_source) @character.special
526
+ "." @punctuation.delimiter
527
+ "]" @punctuation.bracket)
528
+ (pattern_equivalence_class_source
529
+ "[" @punctuation.bracket
530
+ "=" @punctuation.delimiter
531
+ value: (pattern_equivalence_class_character_source) @character.special
532
+ "=" @punctuation.delimiter
475
533
  "]" @punctuation.bracket)
476
- (pattern_collating_symbol_source) @character.special
477
- (pattern_equivalence_class_source) @character.special
478
534
  ])
479
535
  "]" @punctuation.bracket)))
480
536
 
@@ -482,7 +538,7 @@
482
538
  word: (word
483
539
  (pattern_bracket_source
484
540
  "[" @punctuation.bracket
485
- (pattern_bracket_negation_source)? @punctuation.special
541
+ (pattern_bracket_negation_source)? @operator
486
542
  (pattern_bracket_members_source
487
543
  [
488
544
  (pattern_bracket_character_source) @character
@@ -492,18 +548,28 @@
492
548
  (pattern_bracket_character_source)
493
549
  (pattern_bracket_hyphen_source)
494
550
  ] @character
495
- operator: (pattern_bracket_range_operator_source) @punctuation.special
551
+ operator: (pattern_bracket_range_operator_source) @operator
496
552
  end: [
497
553
  (pattern_bracket_character_source)
498
554
  (pattern_bracket_hyphen_source)
499
555
  ] @character)
500
556
  (pattern_character_class_source
501
557
  "[" @punctuation.bracket
502
- ":" @punctuation.bracket
558
+ ":" @punctuation.delimiter
503
559
  content: (pattern_character_class_content_source) @character.special
504
- ":" @punctuation.bracket
560
+ ":" @punctuation.delimiter
561
+ "]" @punctuation.bracket)
562
+ (pattern_collating_symbol_source
563
+ "[" @punctuation.bracket
564
+ "." @punctuation.delimiter
565
+ value: (pattern_collating_symbol_character_source) @character.special
566
+ "." @punctuation.delimiter
567
+ "]" @punctuation.bracket)
568
+ (pattern_equivalence_class_source
569
+ "[" @punctuation.bracket
570
+ "=" @punctuation.delimiter
571
+ value: (pattern_equivalence_class_character_source) @character.special
572
+ "=" @punctuation.delimiter
505
573
  "]" @punctuation.bracket)
506
- (pattern_collating_symbol_source) @character.special
507
- (pattern_equivalence_class_source) @character.special
508
574
  ])
509
575
  "]" @punctuation.bracket)))
package/src/parser.c CHANGED
@@ -889903,7 +889903,7 @@ TS_PUBLIC const TSLanguage *tree_sitter_sh(void) {
889903
889903
  .max_reserved_word_set_size = 0,
889904
889904
  .metadata = {
889905
889905
  .major_version = 0,
889906
- .minor_version = 5,
889906
+ .minor_version = 6,
889907
889907
  .patch_version = 0,
889908
889908
  },
889909
889909
  };
package/tree-sitter.json CHANGED
@@ -11,7 +11,7 @@
11
11
  }
12
12
  ],
13
13
  "metadata": {
14
- "version": "0.5.0",
14
+ "version": "0.6.0",
15
15
  "license": "MIT",
16
16
  "description": "Tree-sitter grammar for POSIX sh.",
17
17
  "authors": [
@@ -28,7 +28,7 @@
28
28
  "go": false,
29
29
  "node": false,
30
30
  "python": false,
31
- "rust": false,
31
+ "rust": true,
32
32
  "swift": false
33
33
  }
34
34
  }