tree-sitter-beancount 2.2.0 → 2.3.1

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/.gitattributes ADDED
@@ -0,0 +1,6 @@
1
+ /src/** linguist-vendored
2
+ /examples/* linguist-vendored
3
+
4
+ src/grammar.json -diff
5
+ src/node-types.json -diff
6
+ src/parser.c -diff
@@ -15,7 +15,7 @@ jobs:
15
15
  uses: actions/checkout@v4
16
16
 
17
17
  - name: Setup Node
18
- uses: actions/setup-node@v3.8.1
18
+ uses: actions/setup-node@v4.0.2
19
19
  with:
20
20
  node-version: '18'
21
21
 
@@ -9,7 +9,7 @@ jobs:
9
9
  outputs:
10
10
  release_created: ${{ steps.release.outputs.release_created }}
11
11
  steps:
12
- - uses: google-github-actions/release-please-action@v3
12
+ - uses: google-github-actions/release-please-action@v4
13
13
  id: release
14
14
  with:
15
15
  release-type: node
@@ -34,7 +34,7 @@ jobs:
34
34
  - name: Checking out sources
35
35
  uses: actions/checkout@v4
36
36
  - name: Cache Cargo
37
- uses: actions/cache@v3
37
+ uses: actions/cache@v4
38
38
  with:
39
39
  path: |
40
40
  ~/.cargo/registry
@@ -59,7 +59,7 @@ jobs:
59
59
  - name: Checking out sources
60
60
  uses: actions/checkout@v4
61
61
  - name: Set up Node
62
- uses: actions/setup-node@v3.8.1
62
+ uses: actions/setup-node@v4.0.2
63
63
  with:
64
64
  node-version: '16'
65
65
  registry-url: 'https://registry.npmjs.org'
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.3.1](https://github.com/polarmutex/tree-sitter-beancount/compare/v2.3.0...v2.3.1) (2024-02-29)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * cargo version ([01cc2ca](https://github.com/polarmutex/tree-sitter-beancount/commit/01cc2ca9073b1dab75e6d7996f48331b0c3f9057))
9
+
10
+ ## [2.3.0](https://github.com/polarmutex/tree-sitter-beancount/compare/v2.2.0...v2.3.0) (2024-02-29)
11
+
12
+
13
+ ### Features
14
+
15
+ * Add swift bindings ([0e08ee4](https://github.com/polarmutex/tree-sitter-beancount/commit/0e08ee4212edef5088bb3dd93ab0ba01f94792b0))
16
+
17
+
18
+ ### Bug Fixes
19
+
20
+ * remove unneeded excludes ([cd08aef](https://github.com/polarmutex/tree-sitter-beancount/commit/cd08aefa20dc0f3d5984b08b5d468f75bf4fd096))
21
+
3
22
  ## [2.2.0](https://github.com/polarmutex/tree-sitter-beancount/compare/v2.1.3...v2.2.0) (2023-10-10)
4
23
 
5
24
 
package/Cargo.toml CHANGED
@@ -1,7 +1,7 @@
1
1
  [package]
2
2
  name = "tree-sitter-beancount"
3
3
  description = "beancount grammar for the tree-sitter parsing library"
4
- version = "2.2.0" # {x-release-please-version}
4
+ version = "2.3.1" # {x-release-please-version}
5
5
  keywords = ["incremental", "parsing", "beancount", "tree-sitter"]
6
6
  categories = ["parsing", "text-editors"]
7
7
  repository = "https://github.com/polarmutex/tree-sitter-beancount"
package/Package.swift ADDED
@@ -0,0 +1,20 @@
1
+ // swift-tools-version:5.3
2
+ import PackageDescription
3
+
4
+ let package = Package(
5
+ name: "TreeSitterBeancount",
6
+ products: [
7
+ .library(name: "TreeSitterBeancount", targets: ["TreeSitterBeancount"]),
8
+ ],
9
+ dependencies: [],
10
+ targets: [
11
+ .target(name: "TreeSitterBeancount",
12
+ path: ".",
13
+ sources: [
14
+ "src/parser.c",
15
+ "src/scanner.cc",
16
+ ],
17
+ publicHeadersPath: "bindings/swift",
18
+ cSettings: [.headerSearchPath("src")])
19
+ ]
20
+ )
package/binding.gyp CHANGED
@@ -8,8 +8,8 @@
8
8
  ],
9
9
  "sources": [
10
10
  "bindings/node/binding.cc",
11
- "src/parser.c",
12
11
  # If your language uses an external scanner, add it here.
12
+ "src/parser.c",
13
13
  ],
14
14
  "cflags_c": [
15
15
  "-std=c99",
@@ -25,6 +25,7 @@ fn main() {
25
25
  // If your language uses an external scanner written in C++,
26
26
  // then include this block of code:
27
27
 
28
+ /*
28
29
  let mut cpp_config = cc::Build::new();
29
30
  cpp_config.cpp(true);
30
31
  cpp_config.include(&src_dir);
@@ -35,4 +36,5 @@ fn main() {
35
36
  cpp_config.file(&scanner_path);
36
37
  cpp_config.compile("scanner");
37
38
  println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap());
39
+ */
38
40
  }
package/flake.lock CHANGED
@@ -3,11 +3,11 @@
3
3
  "flake-compat": {
4
4
  "flake": false,
5
5
  "locked": {
6
- "lastModified": 1673956053,
7
- "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=",
6
+ "lastModified": 1696426674,
7
+ "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
8
8
  "owner": "edolstra",
9
9
  "repo": "flake-compat",
10
- "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9",
10
+ "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
11
11
  "type": "github"
12
12
  },
13
13
  "original": {
@@ -21,11 +21,11 @@
21
21
  "systems": "systems"
22
22
  },
23
23
  "locked": {
24
- "lastModified": 1694529238,
25
- "narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
24
+ "lastModified": 1709126324,
25
+ "narHash": "sha256-q6EQdSeUZOG26WelxqkmR7kArjgWCdw5sfJVHPH/7j8=",
26
26
  "owner": "numtide",
27
27
  "repo": "flake-utils",
28
- "rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
28
+ "rev": "d465f4819400de7c8d874d50b982301f28a84605",
29
29
  "type": "github"
30
30
  },
31
31
  "original": {
@@ -42,11 +42,11 @@
42
42
  ]
43
43
  },
44
44
  "locked": {
45
- "lastModified": 1660459072,
46
- "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=",
45
+ "lastModified": 1703887061,
46
+ "narHash": "sha256-gGPa9qWNc6eCXT/+Z5/zMkyYOuRZqeFZBDbopNZQkuY=",
47
47
  "owner": "hercules-ci",
48
48
  "repo": "gitignore.nix",
49
- "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73",
49
+ "rev": "43e1aa1308018f37118e34d3a9cb4f5e75dc11d5",
50
50
  "type": "github"
51
51
  },
52
52
  "original": {
@@ -57,11 +57,11 @@
57
57
  },
58
58
  "nixpkgs": {
59
59
  "locked": {
60
- "lastModified": 1696604326,
61
- "narHash": "sha256-YXUNI0kLEcI5g8lqGMb0nh67fY9f2YoJsILafh6zlMo=",
60
+ "lastModified": 1708984720,
61
+ "narHash": "sha256-gJctErLbXx4QZBBbGp78PxtOOzsDaQ+yw1ylNQBuSUY=",
62
62
  "owner": "NixOS",
63
63
  "repo": "nixpkgs",
64
- "rev": "87828a0e03d1418e848d3dd3f3014a632e4a4f64",
64
+ "rev": "13aff9b34cc32e59d35c62ac9356e4a41198a538",
65
65
  "type": "github"
66
66
  },
67
67
  "original": {
@@ -73,16 +73,16 @@
73
73
  },
74
74
  "nixpkgs-stable": {
75
75
  "locked": {
76
- "lastModified": 1685801374,
77
- "narHash": "sha256-otaSUoFEMM+LjBI1XL/xGB5ao6IwnZOXc47qhIgJe8U=",
76
+ "lastModified": 1704874635,
77
+ "narHash": "sha256-YWuCrtsty5vVZvu+7BchAxmcYzTMfolSPP5io8+WYCg=",
78
78
  "owner": "NixOS",
79
79
  "repo": "nixpkgs",
80
- "rev": "c37ca420157f4abc31e26f436c1145f8951ff373",
80
+ "rev": "3dc440faeee9e889fe2d1b4d25ad0f430d449356",
81
81
  "type": "github"
82
82
  },
83
83
  "original": {
84
84
  "owner": "NixOS",
85
- "ref": "nixos-23.05",
85
+ "ref": "nixos-23.11",
86
86
  "repo": "nixpkgs",
87
87
  "type": "github"
88
88
  }
@@ -100,11 +100,11 @@
100
100
  "nixpkgs-stable": "nixpkgs-stable"
101
101
  },
102
102
  "locked": {
103
- "lastModified": 1696846637,
104
- "narHash": "sha256-0hv4kbXxci2+pxhuXlVgftj/Jq79VSmtAyvfabCCtYk=",
103
+ "lastModified": 1708018599,
104
+ "narHash": "sha256-M+Ng6+SePmA8g06CmUZWi1AjG2tFBX9WCXElBHEKnyM=",
105
105
  "owner": "cachix",
106
106
  "repo": "pre-commit-hooks.nix",
107
- "rev": "42e1b6095ef80a51f79595d9951eb38e91c4e6ca",
107
+ "rev": "5df5a70ad7575f6601d91f0efec95dd9bc619431",
108
108
  "type": "github"
109
109
  },
110
110
  "original": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tree-sitter-beancount",
3
- "version": "2.2.0",
3
+ "version": "2.3.1",
4
4
  "description": "a tree-sitter parser for the beancount syntax",
5
5
  "main": "bindings/node",
6
6
  "scripts": {
package/src/parser.c CHANGED
@@ -1,4 +1,4 @@
1
- #include <tree_sitter/parser.h>
1
+ #include "tree_sitter/parser.h"
2
2
 
3
3
  #if defined(__GNUC__) || defined(__clang__)
4
4
  #pragma GCC diagnostic push
@@ -16,7 +16,7 @@
16
16
  #define MAX_ALIAS_SEQUENCE_LENGTH 9
17
17
  #define PRODUCTION_ID_COUNT 88
18
18
 
19
- enum {
19
+ enum ts_symbol_identifiers {
20
20
  sym_identifier = 1,
21
21
  anon_sym_LF = 2,
22
22
  anon_sym_CR = 3,
@@ -974,7 +974,7 @@ static const TSSymbolMetadata ts_symbol_metadata[] = {
974
974
  },
975
975
  };
976
976
 
977
- enum {
977
+ enum ts_field_identifiers {
978
978
  field_account = 1,
979
979
  field_amount = 2,
980
980
  field_comment = 3,
@@ -5715,33 +5715,6 @@ static const TSLexMode ts_lex_modes[STATE_COUNT] = {
5715
5715
  [615] = {.lex_state = 0},
5716
5716
  };
5717
5717
 
5718
- enum {
5719
- ts_external_token__stars = 0,
5720
- ts_external_token__sectionend = 1,
5721
- ts_external_token__eof = 2,
5722
- };
5723
-
5724
- static const TSSymbol ts_external_scanner_symbol_map[EXTERNAL_TOKEN_COUNT] = {
5725
- [ts_external_token__stars] = sym__stars,
5726
- [ts_external_token__sectionend] = sym__sectionend,
5727
- [ts_external_token__eof] = sym__eof,
5728
- };
5729
-
5730
- static const bool ts_external_scanner_states[4][EXTERNAL_TOKEN_COUNT] = {
5731
- [1] = {
5732
- [ts_external_token__stars] = true,
5733
- [ts_external_token__sectionend] = true,
5734
- [ts_external_token__eof] = true,
5735
- },
5736
- [2] = {
5737
- [ts_external_token__stars] = true,
5738
- },
5739
- [3] = {
5740
- [ts_external_token__stars] = true,
5741
- [ts_external_token__sectionend] = true,
5742
- },
5743
- };
5744
-
5745
5718
  static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = {
5746
5719
  [0] = {
5747
5720
  [ts_builtin_sym_end] = ACTIONS(1),
@@ -16333,6 +16306,33 @@ static const TSParseActionEntry ts_parse_actions[] = {
16333
16306
  [1609] = {.entry = {.count = 1, .reusable = true}}, SHIFT(448),
16334
16307
  };
16335
16308
 
16309
+ enum ts_external_scanner_symbol_identifiers {
16310
+ ts_external_token__stars = 0,
16311
+ ts_external_token__sectionend = 1,
16312
+ ts_external_token__eof = 2,
16313
+ };
16314
+
16315
+ static const TSSymbol ts_external_scanner_symbol_map[EXTERNAL_TOKEN_COUNT] = {
16316
+ [ts_external_token__stars] = sym__stars,
16317
+ [ts_external_token__sectionend] = sym__sectionend,
16318
+ [ts_external_token__eof] = sym__eof,
16319
+ };
16320
+
16321
+ static const bool ts_external_scanner_states[4][EXTERNAL_TOKEN_COUNT] = {
16322
+ [1] = {
16323
+ [ts_external_token__stars] = true,
16324
+ [ts_external_token__sectionend] = true,
16325
+ [ts_external_token__eof] = true,
16326
+ },
16327
+ [2] = {
16328
+ [ts_external_token__stars] = true,
16329
+ },
16330
+ [3] = {
16331
+ [ts_external_token__stars] = true,
16332
+ [ts_external_token__sectionend] = true,
16333
+ },
16334
+ };
16335
+
16336
16336
  #ifdef __cplusplus
16337
16337
  extern "C" {
16338
16338
  #endif
package/src/scanner.c ADDED
@@ -0,0 +1,208 @@
1
+ #include <stdio.h> // test
2
+ #include <tree_sitter/parser.h>
3
+ #include <wctype.h>
4
+
5
+ #define MAX(a, b) ((a) > (b) ? (a) : (b))
6
+
7
+ typedef struct {
8
+ uint32_t length;
9
+ uint32_t capacity;
10
+ int16_t *data;
11
+ } vec;
12
+
13
+ #define MAX(a, b) ((a) > (b) ? (a) : (b))
14
+
15
+ #define VEC_RESIZE(vec, _cap) \
16
+ void *tmp = realloc((vec).data, (_cap) * sizeof((vec).data[0])); \
17
+ (vec).data = tmp; \
18
+ (vec).capacity = (_cap);
19
+
20
+ #define VEC_GROW(vec, _cap) \
21
+ if ((vec).capacity < (_cap)) { \
22
+ VEC_RESIZE((vec), (_cap)); \
23
+ }
24
+
25
+ #define VEC_PUSH(vec, el) \
26
+ if ((vec).capacity == (vec).length) { \
27
+ VEC_RESIZE((vec), MAX(16, (vec).length * 2)); \
28
+ } \
29
+ (vec).data[(vec).length++] = (el);
30
+
31
+ #define VEC_POP(vec) (vec).length--;
32
+
33
+ #define VEC_NEW \
34
+ { .len = 0, .capacity = 0, .data = NULL }
35
+
36
+ #define VEC_BACK(vec) ((vec).data[(vec).length - 1])
37
+
38
+ #define VEC_FREE(vec) \
39
+ { \
40
+ if ((vec).data != NULL) \
41
+ free((vec).data); \
42
+ }
43
+
44
+ #define VEC_CLEAR(vec) (vec).length = 0;
45
+
46
+ enum TokenType {
47
+ SECTION,
48
+ SECTIONEND,
49
+ END_OF_FILE,
50
+ };
51
+
52
+ typedef struct {
53
+ vec indent_length_stack;
54
+ vec org_section_stack;
55
+ } Scanner;
56
+
57
+ unsigned serialize(Scanner *scanner, char *buffer) {
58
+ size_t i = 0;
59
+
60
+ size_t indent_count = scanner->indent_length_stack.length - 1;
61
+ if (indent_count > UINT8_MAX)
62
+ indent_count = UINT8_MAX;
63
+ buffer[i++] = (char)indent_count;
64
+
65
+ int iter = 1;
66
+ for (; iter < scanner->indent_length_stack.length
67
+ && i < TREE_SITTER_SERIALIZATION_BUFFER_SIZE;
68
+ ++iter) {
69
+ buffer[i++] = (char)scanner->indent_length_stack.data[iter];
70
+ }
71
+
72
+ size_t org_section_count = scanner->org_section_stack.length - 1;
73
+ if (org_section_count > UINT8_MAX)
74
+ org_section_count = UINT8_MAX;
75
+ buffer[i++] = (char)org_section_count;
76
+
77
+ iter = 1;
78
+ for (; iter < scanner->org_section_stack.length
79
+ && i < TREE_SITTER_SERIALIZATION_BUFFER_SIZE;
80
+ ++iter) {
81
+ buffer[i++] = (char)scanner->org_section_stack.data[iter];
82
+ }
83
+
84
+ return i;
85
+ }
86
+
87
+ void deserialize(Scanner *scanner, const char *buffer, unsigned length) {
88
+ VEC_CLEAR(scanner->org_section_stack);
89
+ VEC_PUSH(scanner->org_section_stack, 0);
90
+ VEC_CLEAR(scanner->indent_length_stack);
91
+ VEC_PUSH(scanner->indent_length_stack, 0);
92
+
93
+ if (length == 0)
94
+ return;
95
+
96
+ size_t i = 0;
97
+
98
+ size_t indent_count = (unsigned char)buffer[i++];
99
+ for (; i <= indent_count; i++) {
100
+ VEC_PUSH(scanner->indent_length_stack, (unsigned char)buffer[i]);
101
+ }
102
+
103
+ size_t org_section_count = (unsigned char)buffer[i++];
104
+ for (; i < length; i++) {
105
+ VEC_PUSH(scanner->org_section_stack, (unsigned char)buffer[i]);
106
+ }
107
+ }
108
+
109
+ void advance(TSLexer *lexer) {
110
+ lexer->advance(lexer, false);
111
+ }
112
+
113
+ void skip(TSLexer *lexer) {
114
+ lexer->advance(lexer, true);
115
+ }
116
+
117
+ static bool in_error_recovery(const bool *valid_symbols) {
118
+ return (valid_symbols[SECTION] && valid_symbols[SECTIONEND]
119
+ && valid_symbols[END_OF_FILE]);
120
+ }
121
+
122
+ bool scan(Scanner *scanner, TSLexer *lexer, const bool *valid_symbols) {
123
+
124
+ if (in_error_recovery(valid_symbols))
125
+ return false;
126
+
127
+ // - Section ends
128
+ int16_t indent_length = 0;
129
+ lexer->mark_end(lexer);
130
+ for (;;) {
131
+ if (lexer->lookahead == ' ') {
132
+ indent_length++;
133
+ } else if (lexer->lookahead == '\t') {
134
+ indent_length += 8;
135
+ } else if (lexer->lookahead == '\0') {
136
+
137
+ if (valid_symbols[SECTIONEND]) {
138
+ lexer->result_symbol = SECTIONEND;
139
+ } else if (valid_symbols[END_OF_FILE]) {
140
+ lexer->result_symbol = END_OF_FILE;
141
+ } else {
142
+ return false;
143
+ }
144
+
145
+ return true;
146
+ } else {
147
+ break;
148
+ }
149
+ skip(lexer);
150
+ }
151
+
152
+ if (indent_length == 0 && lexer->lookahead == '*') {
153
+ lexer->mark_end(lexer);
154
+ int16_t stars = 1;
155
+ skip(lexer);
156
+ while (lexer->lookahead == '*') {
157
+ stars++;
158
+ skip(lexer);
159
+ }
160
+
161
+ if (valid_symbols[SECTIONEND] && iswspace(lexer->lookahead) && stars > 0
162
+ && stars <= VEC_BACK(scanner->org_section_stack)) {
163
+ VEC_POP(scanner->org_section_stack);
164
+ lexer->result_symbol = SECTIONEND;
165
+ return true;
166
+ } else if (valid_symbols[SECTION] && iswspace(lexer->lookahead)) {
167
+ VEC_PUSH(scanner->org_section_stack, stars);
168
+ lexer->result_symbol = SECTION;
169
+ return true;
170
+ }
171
+ return false;
172
+ }
173
+
174
+ return false; // default
175
+ }
176
+
177
+ void *tree_sitter_beancount_external_scanner_create() {
178
+ Scanner *scanner = (Scanner *)calloc(1, sizeof(Scanner));
179
+ deserialize(scanner, NULL, 0);
180
+ return scanner;
181
+ }
182
+
183
+ bool tree_sitter_beancount_external_scanner_scan(void *payload,
184
+ TSLexer *lexer,
185
+ const bool *valid_symbols) {
186
+ Scanner *scanner = (Scanner *)payload;
187
+ return scan(scanner, lexer, valid_symbols);
188
+ }
189
+
190
+ unsigned tree_sitter_beancount_external_scanner_serialize(void *payload,
191
+ char *buffer) {
192
+ Scanner *scanner = (Scanner *)payload;
193
+ return serialize(scanner, buffer);
194
+ }
195
+
196
+ void tree_sitter_beancount_external_scanner_deserialize(void *payload,
197
+ const char *buffer,
198
+ unsigned length) {
199
+ Scanner *scanner = (Scanner *)payload;
200
+ deserialize(scanner, buffer, length);
201
+ }
202
+
203
+ void tree_sitter_beancount_external_scanner_destroy(void *payload) {
204
+ Scanner *scanner = (Scanner *)payload;
205
+ VEC_FREE(scanner->indent_length_stack);
206
+ VEC_FREE(scanner->org_section_stack);
207
+ free(scanner);
208
+ }
@@ -13,9 +13,8 @@ extern "C" {
13
13
  #define ts_builtin_sym_end 0
14
14
  #define TREE_SITTER_SERIALIZATION_BUFFER_SIZE 1024
15
15
 
16
- typedef uint16_t TSStateId;
17
-
18
16
  #ifndef TREE_SITTER_API_H_
17
+ typedef uint16_t TSStateId;
19
18
  typedef uint16_t TSSymbol;
20
19
  typedef uint16_t TSFieldId;
21
20
  typedef struct TSLanguage TSLanguage;
@@ -130,9 +129,16 @@ struct TSLanguage {
130
129
  * Lexer Macros
131
130
  */
132
131
 
132
+ #ifdef _MSC_VER
133
+ #define UNUSED __pragma(warning(suppress : 4101))
134
+ #else
135
+ #define UNUSED __attribute__((unused))
136
+ #endif
137
+
133
138
  #define START_LEXER() \
134
139
  bool result = false; \
135
140
  bool skip = false; \
141
+ UNUSED \
136
142
  bool eof = false; \
137
143
  int32_t lookahead; \
138
144
  goto start; \
@@ -166,7 +172,7 @@ struct TSLanguage {
166
172
  * Parse Table Macros
167
173
  */
168
174
 
169
- #define SMALL_STATE(id) id - LARGE_STATE_COUNT
175
+ #define SMALL_STATE(id) ((id) - LARGE_STATE_COUNT)
170
176
 
171
177
  #define STATE(id) id
172
178
 
@@ -176,7 +182,7 @@ struct TSLanguage {
176
182
  {{ \
177
183
  .shift = { \
178
184
  .type = TSParseActionTypeShift, \
179
- .state = state_value \
185
+ .state = (state_value) \
180
186
  } \
181
187
  }}
182
188
 
@@ -184,7 +190,7 @@ struct TSLanguage {
184
190
  {{ \
185
191
  .shift = { \
186
192
  .type = TSParseActionTypeShift, \
187
- .state = state_value, \
193
+ .state = (state_value), \
188
194
  .repetition = true \
189
195
  } \
190
196
  }}
package/src/scanner.cc DELETED
@@ -1,171 +0,0 @@
1
- #include <cwctype>
2
- #include <tree_sitter/parser.h>
3
- #include <vector>
4
-
5
- namespace {
6
-
7
- using std::iswspace;
8
- using std::vector;
9
-
10
- enum TokenType {
11
- SECTION,
12
- SECTIONEND,
13
- END_OF_FILE,
14
- };
15
-
16
- struct Scanner {
17
- vector<int16_t> indent_length_stack;
18
- vector<int16_t> org_section_stack;
19
-
20
- Scanner() {
21
- deserialize(NULL, 0);
22
- }
23
-
24
- unsigned serialize(char *buffer) {
25
- size_t i = 0;
26
-
27
- size_t indent_count = indent_length_stack.size() - 1;
28
- if (indent_count > UINT8_MAX)
29
- indent_count = UINT8_MAX;
30
- buffer[i++] = indent_count;
31
-
32
- vector<int16_t>::iterator iter = indent_length_stack.begin() + 1,
33
- end = indent_length_stack.end();
34
-
35
- for (; iter != end && i < TREE_SITTER_SERIALIZATION_BUFFER_SIZE;
36
- ++iter) {
37
- buffer[i++] = *iter;
38
- }
39
-
40
- iter = org_section_stack.begin() + 1;
41
- end = org_section_stack.end();
42
-
43
- for (; iter != end && i < TREE_SITTER_SERIALIZATION_BUFFER_SIZE;
44
- ++iter) {
45
- buffer[i++] = *iter;
46
- }
47
-
48
- return i;
49
- }
50
-
51
- void deserialize(const char *buffer, unsigned length) {
52
- org_section_stack.clear();
53
- org_section_stack.push_back(0);
54
- indent_length_stack.clear();
55
- indent_length_stack.push_back(-1);
56
-
57
- if (length == 0)
58
- return;
59
-
60
- size_t i = 0;
61
-
62
- size_t indent_count = (uint8_t)buffer[i++];
63
-
64
- for (; i <= indent_count; i++)
65
- indent_length_stack.push_back(buffer[i]);
66
- for (; i < length; i++)
67
- org_section_stack.push_back(buffer[i]);
68
- }
69
-
70
- void advance(TSLexer *lexer) {
71
- lexer->advance(lexer, false);
72
- }
73
-
74
- void skip(TSLexer *lexer) {
75
- lexer->advance(lexer, true);
76
- }
77
-
78
- static bool in_error_recovery(const bool *valid_symbols) {
79
- return (valid_symbols[SECTION] && valid_symbols[SECTIONEND]
80
- && valid_symbols[END_OF_FILE]);
81
- }
82
-
83
- bool scan(TSLexer *lexer, const bool *valid_symbols) {
84
-
85
- if (in_error_recovery(valid_symbols))
86
- return false;
87
-
88
- // - Section ends
89
- int16_t indent_length = 0;
90
- lexer->mark_end(lexer);
91
- for (;;) {
92
- if (lexer->lookahead == ' ') {
93
- indent_length++;
94
- } else if (lexer->lookahead == '\t') {
95
- indent_length += 8;
96
- } else if (lexer->lookahead == '\0') {
97
-
98
- if (valid_symbols[SECTIONEND]) {
99
- lexer->result_symbol = SECTIONEND;
100
- } else if (valid_symbols[END_OF_FILE]) {
101
- lexer->result_symbol = END_OF_FILE;
102
- } else {
103
- return false;
104
- }
105
-
106
- return true;
107
- } else {
108
- break;
109
- }
110
- skip(lexer);
111
- }
112
-
113
- if (indent_length == 0 && lexer->lookahead == '*') {
114
- lexer->mark_end(lexer);
115
- int16_t stars = 1;
116
- skip(lexer);
117
- while (lexer->lookahead == '*') {
118
- stars++;
119
- skip(lexer);
120
- }
121
-
122
- if (valid_symbols[SECTIONEND] && iswspace(lexer->lookahead)
123
- && stars > 0 && stars <= org_section_stack.back()) {
124
- org_section_stack.pop_back();
125
- lexer->result_symbol = SECTIONEND;
126
- return true;
127
- } else if (valid_symbols[SECTION] && iswspace(lexer->lookahead)) {
128
- org_section_stack.push_back(stars);
129
- lexer->result_symbol = SECTION;
130
- return true;
131
- }
132
- return false;
133
- }
134
-
135
- return false; // default
136
- }
137
- };
138
-
139
- } // namespace
140
-
141
- extern "C" {
142
-
143
- void *tree_sitter_beancount_external_scanner_create() {
144
- return new Scanner();
145
- }
146
-
147
- bool tree_sitter_beancount_external_scanner_scan(void *payload,
148
- TSLexer *lexer,
149
- const bool *valid_symbols) {
150
- Scanner *scanner = static_cast<Scanner *>(payload);
151
- return scanner->scan(lexer, valid_symbols);
152
- }
153
-
154
- unsigned tree_sitter_beancount_external_scanner_serialize(void *payload,
155
- char *buffer) {
156
- Scanner *scanner = static_cast<Scanner *>(payload);
157
- return scanner->serialize(buffer);
158
- }
159
-
160
- void tree_sitter_beancount_external_scanner_deserialize(void *payload,
161
- const char *buffer,
162
- unsigned length) {
163
- Scanner *scanner = static_cast<Scanner *>(payload);
164
- scanner->deserialize(buffer, length);
165
- }
166
-
167
- void tree_sitter_beancount_external_scanner_destroy(void *payload) {
168
- Scanner *scanner = static_cast<Scanner *>(payload);
169
- delete scanner;
170
- }
171
- }