tree-sitter-sh 0.3.0 → 0.4.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 ADDED
@@ -0,0 +1,87 @@
1
+ cmake_minimum_required(VERSION 3.13)
2
+
3
+ project(tree-sitter-sh
4
+ VERSION "0.4.0"
5
+ DESCRIPTION "Tree-sitter grammar for POSIX sh."
6
+ HOMEPAGE_URL "https://github.com/konomanoasa/tree-sitter-sh"
7
+ LANGUAGES C)
8
+
9
+ option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
10
+ option(TREE_SITTER_REUSE_ALLOCATOR "Reuse the library allocator" OFF)
11
+
12
+ set(TREE_SITTER_ABI_VERSION 15 CACHE STRING "Tree-sitter ABI version")
13
+ if(NOT ${TREE_SITTER_ABI_VERSION} MATCHES "^[0-9]+$")
14
+ unset(TREE_SITTER_ABI_VERSION CACHE)
15
+ message(FATAL_ERROR "TREE_SITTER_ABI_VERSION must be an integer")
16
+ endif()
17
+
18
+ include(GNUInstallDirs)
19
+ if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
20
+ include(CTest)
21
+ endif()
22
+
23
+ find_program(TREE_SITTER_CLI tree-sitter DOC "Tree-sitter CLI")
24
+
25
+ add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/src/grammar.json"
26
+ "${CMAKE_CURRENT_SOURCE_DIR}/src/node-types.json"
27
+ DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/grammar.js"
28
+ COMMAND "${TREE_SITTER_CLI}" generate grammar.js --no-parser
29
+ WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
30
+ COMMENT "Generating grammar.json")
31
+
32
+ add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/src/parser.c"
33
+ BYPRODUCTS "${CMAKE_CURRENT_SOURCE_DIR}/src/tree_sitter/parser.h"
34
+ "${CMAKE_CURRENT_SOURCE_DIR}/src/tree_sitter/alloc.h"
35
+ "${CMAKE_CURRENT_SOURCE_DIR}/src/tree_sitter/array.h"
36
+ DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/grammar.json"
37
+ COMMAND "${TREE_SITTER_CLI}" generate src/grammar.json
38
+ --abi=${TREE_SITTER_ABI_VERSION}
39
+ WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
40
+ COMMENT "Generating parser.c")
41
+
42
+ add_library(tree-sitter-sh src/parser.c)
43
+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/src/scanner.c)
44
+ target_sources(tree-sitter-sh PRIVATE src/scanner.c)
45
+ endif()
46
+ target_include_directories(tree-sitter-sh
47
+ PRIVATE src
48
+ INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/bindings/c>
49
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
50
+
51
+ target_compile_definitions(tree-sitter-sh PRIVATE
52
+ $<$<BOOL:${TREE_SITTER_REUSE_ALLOCATOR}>:TREE_SITTER_REUSE_ALLOCATOR>
53
+ $<$<CONFIG:Debug>:TREE_SITTER_DEBUG>)
54
+
55
+ set_target_properties(tree-sitter-sh
56
+ PROPERTIES
57
+ C_STANDARD 11
58
+ POSITION_INDEPENDENT_CODE ON
59
+ SOVERSION "${TREE_SITTER_ABI_VERSION}.${PROJECT_VERSION_MAJOR}"
60
+ DEFINE_SYMBOL "")
61
+
62
+ if(BUILD_TESTING AND CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
63
+ add_executable(tree-sitter-sh-binding-test test/binding.test.c)
64
+ target_link_libraries(tree-sitter-sh-binding-test PRIVATE tree-sitter-sh)
65
+ add_test(NAME tree-sitter-sh-binding COMMAND tree-sitter-sh-binding-test)
66
+ endif()
67
+
68
+ configure_file(bindings/c/tree-sitter-sh.pc.in
69
+ "${CMAKE_CURRENT_BINARY_DIR}/tree-sitter-sh.pc" @ONLY)
70
+
71
+ install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bindings/c/tree_sitter"
72
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
73
+ FILES_MATCHING PATTERN "*.h")
74
+ install(FILES "${CMAKE_CURRENT_BINARY_DIR}/tree-sitter-sh.pc"
75
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
76
+ install(TARGETS tree-sitter-sh
77
+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
78
+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
79
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
80
+
81
+ file(GLOB QUERIES queries/*.scm)
82
+ install(FILES ${QUERIES}
83
+ DESTINATION "${CMAKE_INSTALL_DATADIR}/tree-sitter/queries/sh")
84
+
85
+ add_custom_target(ts-test "${TREE_SITTER_CLI}" test
86
+ WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
87
+ COMMENT "tree-sitter test")
package/Makefile ADDED
@@ -0,0 +1,125 @@
1
+ LANGUAGE_NAME := tree-sitter-sh
2
+ HOMEPAGE_URL := https://github.com/konomanoasa/tree-sitter-sh
3
+ VERSION := 0.4.0
4
+ DESCRIPTION := Tree-sitter grammar for POSIX sh.
5
+
6
+ # repository
7
+ SRC_DIR := src
8
+
9
+ TS ?= tree-sitter
10
+
11
+ # install directory layout
12
+ PREFIX ?= /usr/local
13
+ DATADIR ?= $(PREFIX)/share
14
+ INCLUDEDIR ?= $(PREFIX)/include
15
+ LIBDIR ?= $(PREFIX)/lib
16
+ BINDIR ?= $(PREFIX)/bin
17
+ PCLIBDIR ?= $(LIBDIR)/pkgconfig
18
+
19
+ # source/object files
20
+ PARSER := $(SRC_DIR)/parser.c
21
+ EXTRAS := $(filter-out $(PARSER),$(wildcard $(SRC_DIR)/*.c))
22
+ OBJS := $(patsubst %.c,%.o,$(PARSER) $(EXTRAS))
23
+ MAKE_BUILD_DIR := build/make
24
+ TEST := $(MAKE_BUILD_DIR)/binding.test
25
+
26
+ # flags
27
+ ARFLAGS ?= rcs
28
+ override CFLAGS += -I$(SRC_DIR) -std=c11 -fPIC
29
+
30
+ # ABI versioning
31
+ SONAME_MAJOR = $(shell sed -n 's/\#define LANGUAGE_VERSION //p' $(PARSER))
32
+ SONAME_MINOR = $(word 1,$(subst ., ,$(VERSION)))
33
+
34
+ # OS-specific bits
35
+ MACHINE := $(shell $(CC) -dumpmachine)
36
+
37
+ ifneq ($(findstring darwin,$(MACHINE)),)
38
+ SOEXT = dylib
39
+ SOEXTVER_MAJOR = $(SONAME_MAJOR).$(SOEXT)
40
+ SOEXTVER = $(SONAME_MAJOR).$(SONAME_MINOR).$(SOEXT)
41
+ LINKSHARED = -dynamiclib -Wl,-install_name,$(LIBDIR)/lib$(LANGUAGE_NAME).$(SOEXTVER),-rpath,@executable_path/../Frameworks
42
+ else ifneq ($(findstring mingw32,$(MACHINE)),)
43
+ SOEXT = dll
44
+ LINKSHARED += -s -shared -Wl,--out-implib,lib$(LANGUAGE_NAME).dll.a
45
+ TEST := $(MAKE_BUILD_DIR)/binding.test.exe
46
+ else
47
+ SOEXT = so
48
+ SOEXTVER_MAJOR = $(SOEXT).$(SONAME_MAJOR)
49
+ SOEXTVER = $(SOEXT).$(SONAME_MAJOR).$(SONAME_MINOR)
50
+ LINKSHARED = -shared -Wl,-soname,lib$(LANGUAGE_NAME).$(SOEXTVER)
51
+ ifneq ($(filter $(shell uname),FreeBSD NetBSD DragonFly),)
52
+ PCLIBDIR := $(PREFIX)/libdata/pkgconfig
53
+ endif
54
+ endif
55
+
56
+ all: lib$(LANGUAGE_NAME).a lib$(LANGUAGE_NAME).$(SOEXT) $(LANGUAGE_NAME).pc
57
+
58
+ lib$(LANGUAGE_NAME).a: $(OBJS)
59
+ $(AR) $(ARFLAGS) $@ $^
60
+
61
+ lib$(LANGUAGE_NAME).$(SOEXT): $(OBJS)
62
+ $(CC) $(LDFLAGS) $(LINKSHARED) $^ $(LDLIBS) -o $@
63
+ ifneq ($(STRIP),)
64
+ $(STRIP) $@
65
+ endif
66
+
67
+ ifneq ($(findstring mingw32,$(MACHINE)),)
68
+ lib$(LANGUAGE_NAME).dll.a: lib$(LANGUAGE_NAME).$(SOEXT)
69
+ endif
70
+
71
+ $(LANGUAGE_NAME).pc: bindings/c/$(LANGUAGE_NAME).pc.in
72
+ sed -e 's|@PROJECT_VERSION@|$(VERSION)|' \
73
+ -e 's|@CMAKE_INSTALL_LIBDIR@|$(LIBDIR:$(PREFIX)/%=%)|' \
74
+ -e 's|@CMAKE_INSTALL_INCLUDEDIR@|$(INCLUDEDIR:$(PREFIX)/%=%)|' \
75
+ -e 's|@PROJECT_DESCRIPTION@|$(DESCRIPTION)|' \
76
+ -e 's|@PROJECT_HOMEPAGE_URL@|$(HOMEPAGE_URL)|' \
77
+ -e 's|@CMAKE_INSTALL_PREFIX@|$(PREFIX)|' $< > $@
78
+
79
+ $(SRC_DIR)/grammar.json: grammar.js
80
+ $(TS) generate --no-parser $^
81
+
82
+ $(PARSER): $(SRC_DIR)/grammar.json
83
+ $(TS) generate $^
84
+
85
+ $(MAKE_BUILD_DIR):
86
+ mkdir -p $@
87
+
88
+ $(TEST): test/binding.test.c lib$(LANGUAGE_NAME).a | $(MAKE_BUILD_DIR)
89
+ $(CC) $(CPPFLAGS) $(CFLAGS) -Ibindings/c $< lib$(LANGUAGE_NAME).a $(LDFLAGS) $(LDLIBS) -o $@
90
+
91
+ install: all
92
+ install -d '$(DESTDIR)$(DATADIR)'/tree-sitter/queries/sh '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter '$(DESTDIR)$(PCLIBDIR)' '$(DESTDIR)$(LIBDIR)'
93
+ install -m644 bindings/c/tree_sitter/$(LANGUAGE_NAME).h '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter/$(LANGUAGE_NAME).h
94
+ install -m644 $(LANGUAGE_NAME).pc '$(DESTDIR)$(PCLIBDIR)'/$(LANGUAGE_NAME).pc
95
+ install -m644 lib$(LANGUAGE_NAME).a '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).a
96
+ ifneq ($(findstring mingw32,$(MACHINE)),)
97
+ install -d '$(DESTDIR)$(BINDIR)'
98
+ install -m755 lib$(LANGUAGE_NAME).dll '$(DESTDIR)$(BINDIR)'/lib$(LANGUAGE_NAME).dll
99
+ install -m755 lib$(LANGUAGE_NAME).dll.a '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).dll.a
100
+ else
101
+ install -m755 lib$(LANGUAGE_NAME).$(SOEXT) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER)
102
+ cd '$(DESTDIR)$(LIBDIR)' && ln -sf lib$(LANGUAGE_NAME).$(SOEXTVER) lib$(LANGUAGE_NAME).$(SOEXTVER_MAJOR)
103
+ cd '$(DESTDIR)$(LIBDIR)' && ln -sf lib$(LANGUAGE_NAME).$(SOEXTVER_MAJOR) lib$(LANGUAGE_NAME).$(SOEXT)
104
+ endif
105
+ ifneq ($(wildcard queries/*.scm),)
106
+ install -m644 queries/*.scm '$(DESTDIR)$(DATADIR)'/tree-sitter/queries/sh
107
+ endif
108
+
109
+ uninstall:
110
+ $(RM) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).a \
111
+ '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER) \
112
+ '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER_MAJOR) \
113
+ '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXT) \
114
+ '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter/$(LANGUAGE_NAME).h \
115
+ '$(DESTDIR)$(PCLIBDIR)'/$(LANGUAGE_NAME).pc
116
+ $(RM) -r '$(DESTDIR)$(DATADIR)'/tree-sitter/queries/sh
117
+
118
+ clean:
119
+ $(RM) $(OBJS) $(LANGUAGE_NAME).pc lib$(LANGUAGE_NAME).a lib$(LANGUAGE_NAME).$(SOEXT) lib$(LANGUAGE_NAME).dll.a
120
+ $(RM) -r $(MAKE_BUILD_DIR)
121
+
122
+ test: $(TEST)
123
+ ./$(TEST)
124
+
125
+ .PHONY: all install uninstall clean test
@@ -0,0 +1,10 @@
1
+ prefix=@CMAKE_INSTALL_PREFIX@
2
+ libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@
3
+ includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
4
+
5
+ Name: tree-sitter-sh
6
+ Description: @PROJECT_DESCRIPTION@
7
+ URL: @PROJECT_HOMEPAGE_URL@
8
+ Version: @PROJECT_VERSION@
9
+ Libs: -L${libdir} -ltree-sitter-sh
10
+ Cflags: -I${includedir}
@@ -0,0 +1,16 @@
1
+ #ifndef TREE_SITTER_SH_H_
2
+ #define TREE_SITTER_SH_H_
3
+
4
+ typedef struct TSLanguage TSLanguage;
5
+
6
+ #ifdef __cplusplus
7
+ extern "C" {
8
+ #endif
9
+
10
+ const TSLanguage *tree_sitter_sh(void);
11
+
12
+ #ifdef __cplusplus
13
+ }
14
+ #endif
15
+
16
+ #endif // TREE_SITTER_SH_H_
package/grammar.js CHANGED
@@ -95,27 +95,24 @@ const wordPatternSpecialSources = ($) => [
95
95
  $.pattern_equivalence_class_source,
96
96
  ];
97
97
 
98
+ const parameterPatternCollatingSymbolSource = ($) =>
99
+ alias(
100
+ $._parameter_pattern_collating_symbol_source,
101
+ $.pattern_collating_symbol_source,
102
+ );
103
+
98
104
  const parameterPatternSpecialSources = ($) => [
99
105
  alias(
100
106
  $._parameter_pattern_character_class_source,
101
107
  $.pattern_character_class_source,
102
108
  ),
103
- alias(
104
- $._parameter_pattern_collating_symbol_source,
105
- $.pattern_collating_symbol_source,
106
- ),
109
+ parameterPatternCollatingSymbolSource($),
107
110
  alias(
108
111
  $._parameter_pattern_equivalence_class_source,
109
112
  $.pattern_equivalence_class_source,
110
113
  ),
111
114
  ];
112
115
 
113
- const parameterPatternCollatingSymbolSource = ($) =>
114
- alias(
115
- $._parameter_pattern_collating_symbol_source,
116
- $.pattern_collating_symbol_source,
117
- );
118
-
119
116
  const patternSpecialContentCharacters = ($, plain) => [
120
117
  plain,
121
118
  $._pattern_special_marker_character,
@@ -257,12 +254,6 @@ const lineContinuationRun = ($) => prec.right(1, repeat1($.line_continuation));
257
254
 
258
255
  const parameterBraceClose = ($) => choice("}", $._here_document_boundary);
259
256
 
260
- const postOperatorLayout = ($) =>
261
- choice(
262
- seq($.linebreak, optional($._horizontal_layout)),
263
- optional($._horizontal_layout),
264
- );
265
-
266
257
  const arithmeticBinaryExpression = ($, left, right, operatorSegment) =>
267
258
  prec.left(
268
259
  seq(
@@ -707,6 +698,12 @@ const parameterOperatorTail = ($, word, wordTrailingContinuations) =>
707
698
  const parameterExpansionTail = ($, operatorTail) =>
708
699
  choice(parameterBraceClose($), operatorTail);
709
700
 
701
+ const parameterPatternSource = ($) =>
702
+ choice(
703
+ $._parameter_tilde_source,
704
+ seq($._parameter_pattern_part, optional($._parameter_source_tail)),
705
+ );
706
+
710
707
  const caseClauseItems = ($) =>
711
708
  choice(
712
709
  $.esac_keyword,
@@ -1237,7 +1234,7 @@ module.exports = grammar({
1237
1234
  $._and_or_continuation,
1238
1235
  optional($._horizontal_layout),
1239
1236
  field("operator", choice($.and_if, $.or_if)),
1240
- postOperatorLayout($),
1237
+ linebreakLayout($),
1241
1238
  field("pipeline", $.pipeline),
1242
1239
  ),
1243
1240
  ),
@@ -1259,7 +1256,7 @@ module.exports = grammar({
1259
1256
  $._pipe_continuation,
1260
1257
  optional($._horizontal_layout),
1261
1258
  "|",
1262
- postOperatorLayout($),
1259
+ linebreakLayout($),
1263
1260
  field("command", $.command),
1264
1261
  ),
1265
1262
  ),
@@ -2406,11 +2403,7 @@ module.exports = grammar({
2406
2403
 
2407
2404
  parameter_pattern_operator: (_) => prec(2, choice("%%", "##", "%", "#")),
2408
2405
 
2409
- parameter_word: ($) =>
2410
- choice(
2411
- $._parameter_tilde_source,
2412
- seq($._parameter_pattern_part, optional($._parameter_source_tail)),
2413
- ),
2406
+ parameter_word: ($) => parameterPatternSource($),
2414
2407
 
2415
2408
  _double_quoted_parameter_word: ($) =>
2416
2409
  seq(
@@ -2435,14 +2428,7 @@ module.exports = grammar({
2435
2428
  _double_quoted_parameter_word_part: ($) =>
2436
2429
  choice($._double_quoted_parameter_word_lead_part, $.line_continuation),
2437
2430
 
2438
- parameter_pattern: ($) =>
2439
- prec.right(
2440
- 1,
2441
- choice(
2442
- $._parameter_tilde_source,
2443
- seq($._parameter_pattern_part, optional($._parameter_source_tail)),
2444
- ),
2445
- ),
2431
+ parameter_pattern: ($) => prec.right(1, parameterPatternSource($)),
2446
2432
 
2447
2433
  _parameter_source_tail: ($) => repeat1($._parameter_pattern_part),
2448
2434
 
package/package.json CHANGED
@@ -1,20 +1,24 @@
1
1
  {
2
2
  "name": "tree-sitter-sh",
3
- "version": "0.3.0",
3
+ "version": "0.4.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
+ "bindings/c",
9
+ "CMakeLists.txt",
8
10
  "grammar.js",
11
+ "Makefile",
9
12
  "queries/*.scm",
10
13
  "src/*.c",
11
14
  "src/*.json",
12
15
  "src/tree_sitter/*.h",
16
+ "test/binding.test.c",
13
17
  "tree-sitter.json"
14
18
  ],
15
19
  "scripts": {
16
- "check": "biome check . && node scripts/check-scanner.js && node scripts/check-generated.js && npm test",
17
- "format": "biome check --write . && node scripts/check-scanner.js --write",
20
+ "check": "biome check . && node scripts/check-c.js && node scripts/check-generated.js && npm test",
21
+ "format": "biome check --write . && node scripts/check-c.js --write",
18
22
  "generate": "npm run tree-sitter -- generate",
19
23
  "test": "npm run tree-sitter -- test --rebuild && node --test",
20
24
  "test:fuzz": "npm run tree-sitter -- fuzz --rebuild --iterations 100 --edits 5",
package/src/grammar.json CHANGED
@@ -401,26 +401,17 @@
401
401
  }
402
402
  },
403
403
  {
404
- "type": "CHOICE",
404
+ "type": "SEQ",
405
405
  "members": [
406
406
  {
407
- "type": "SEQ",
407
+ "type": "CHOICE",
408
408
  "members": [
409
409
  {
410
410
  "type": "SYMBOL",
411
411
  "name": "linebreak"
412
412
  },
413
413
  {
414
- "type": "CHOICE",
415
- "members": [
416
- {
417
- "type": "SYMBOL",
418
- "name": "_horizontal_layout"
419
- },
420
- {
421
- "type": "BLANK"
422
- }
423
- ]
414
+ "type": "BLANK"
424
415
  }
425
416
  ]
426
417
  },
@@ -534,26 +525,17 @@
534
525
  "value": "|"
535
526
  },
536
527
  {
537
- "type": "CHOICE",
528
+ "type": "SEQ",
538
529
  "members": [
539
530
  {
540
- "type": "SEQ",
531
+ "type": "CHOICE",
541
532
  "members": [
542
533
  {
543
534
  "type": "SYMBOL",
544
535
  "name": "linebreak"
545
536
  },
546
537
  {
547
- "type": "CHOICE",
548
- "members": [
549
- {
550
- "type": "SYMBOL",
551
- "name": "_horizontal_layout"
552
- },
553
- {
554
- "type": "BLANK"
555
- }
556
- ]
538
+ "type": "BLANK"
557
539
  }
558
540
  ]
559
541
  },
package/src/parser.c CHANGED
@@ -932412,7 +932412,7 @@ TS_PUBLIC const TSLanguage *tree_sitter_sh(void) {
932412
932412
  .max_reserved_word_set_size = 0,
932413
932413
  .metadata = {
932414
932414
  .major_version = 0,
932415
- .minor_version = 3,
932415
+ .minor_version = 4,
932416
932416
  .patch_version = 0,
932417
932417
  },
932418
932418
  };