From 84b5a77e4114aa7a14b97b8f51c10c512162f208 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Sun, 14 Aug 2022 22:45:45 +0200 Subject: [PATCH 001/105] WIP: tree-sitter grammar --- flake.nix | 1 + tree-sitter-smithyql/Cargo.toml | 26 ++ tree-sitter-smithyql/binding.gyp | 19 ++ tree-sitter-smithyql/bindings/node/binding.cc | 28 +++ tree-sitter-smithyql/bindings/node/index.js | 19 ++ tree-sitter-smithyql/bindings/rust/build.rs | 40 ++++ tree-sitter-smithyql/bindings/rust/lib.rs | 52 ++++ tree-sitter-smithyql/example-file | 1 + tree-sitter-smithyql/grammar.js | 8 + tree-sitter-smithyql/package.json | 11 + tree-sitter-smithyql/src/grammar.json | 21 ++ tree-sitter-smithyql/src/node-types.json | 11 + tree-sitter-smithyql/src/parser.c | 169 +++++++++++++ tree-sitter-smithyql/src/tree_sitter/parser.h | 224 ++++++++++++++++++ 14 files changed, 630 insertions(+) create mode 100644 tree-sitter-smithyql/Cargo.toml create mode 100644 tree-sitter-smithyql/binding.gyp create mode 100644 tree-sitter-smithyql/bindings/node/binding.cc create mode 100644 tree-sitter-smithyql/bindings/node/index.js create mode 100644 tree-sitter-smithyql/bindings/rust/build.rs create mode 100644 tree-sitter-smithyql/bindings/rust/lib.rs create mode 100644 tree-sitter-smithyql/example-file create mode 100644 tree-sitter-smithyql/grammar.js create mode 100644 tree-sitter-smithyql/package.json create mode 100644 tree-sitter-smithyql/src/grammar.json create mode 100644 tree-sitter-smithyql/src/node-types.json create mode 100644 tree-sitter-smithyql/src/parser.c create mode 100644 tree-sitter-smithyql/src/tree_sitter/parser.h diff --git a/flake.nix b/flake.nix index c25dc60d..ebcd39bd 100644 --- a/flake.nix +++ b/flake.nix @@ -22,6 +22,7 @@ pkgs.sbt pkgs.jless pkgs.gnupg + pkgs.tree-sitter ]; }; } diff --git a/tree-sitter-smithyql/Cargo.toml b/tree-sitter-smithyql/Cargo.toml new file mode 100644 index 00000000..5449ce0e --- /dev/null +++ b/tree-sitter-smithyql/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "tree-sitter-smithyql" +description = "smithyql grammar for the tree-sitter parsing library" +version = "0.0.1" +keywords = ["incremental", "parsing", "smithyql"] +categories = ["parsing", "text-editors"] +repository = "https://github.com/tree-sitter/tree-sitter-smithyql" +edition = "2018" +license = "MIT" + +build = "bindings/rust/build.rs" +include = [ + "bindings/rust/*", + "grammar.js", + "queries/*", + "src/*", +] + +[lib] +path = "bindings/rust/lib.rs" + +[dependencies] +tree-sitter = "~0.20" + +[build-dependencies] +cc = "1.0" diff --git a/tree-sitter-smithyql/binding.gyp b/tree-sitter-smithyql/binding.gyp new file mode 100644 index 00000000..d7e1fb6e --- /dev/null +++ b/tree-sitter-smithyql/binding.gyp @@ -0,0 +1,19 @@ +{ + "targets": [ + { + "target_name": "tree_sitter_smithyql_binding", + "include_dirs": [ + " +#include "nan.h" + +using namespace v8; + +extern "C" TSLanguage * tree_sitter_smithyql(); + +namespace { + +NAN_METHOD(New) {} + +void Init(Local exports, Local module) { + Local tpl = Nan::New(New); + tpl->SetClassName(Nan::New("Language").ToLocalChecked()); + tpl->InstanceTemplate()->SetInternalFieldCount(1); + + Local constructor = Nan::GetFunction(tpl).ToLocalChecked(); + Local instance = constructor->NewInstance(Nan::GetCurrentContext()).ToLocalChecked(); + Nan::SetInternalFieldPointer(instance, 0, tree_sitter_smithyql()); + + Nan::Set(instance, Nan::New("name").ToLocalChecked(), Nan::New("smithyql").ToLocalChecked()); + Nan::Set(module, Nan::New("exports").ToLocalChecked(), instance); +} + +NODE_MODULE(tree_sitter_smithyql_binding, Init) + +} // namespace diff --git a/tree-sitter-smithyql/bindings/node/index.js b/tree-sitter-smithyql/bindings/node/index.js new file mode 100644 index 00000000..f571d735 --- /dev/null +++ b/tree-sitter-smithyql/bindings/node/index.js @@ -0,0 +1,19 @@ +try { + module.exports = require("../../build/Release/tree_sitter_smithyql_binding"); +} catch (error1) { + if (error1.code !== 'MODULE_NOT_FOUND') { + throw error1; + } + try { + module.exports = require("../../build/Debug/tree_sitter_smithyql_binding"); + } catch (error2) { + if (error2.code !== 'MODULE_NOT_FOUND') { + throw error2; + } + throw error1 + } +} + +try { + module.exports.nodeTypeInfo = require("../../src/node-types.json"); +} catch (_) {} diff --git a/tree-sitter-smithyql/bindings/rust/build.rs b/tree-sitter-smithyql/bindings/rust/build.rs new file mode 100644 index 00000000..c6061f09 --- /dev/null +++ b/tree-sitter-smithyql/bindings/rust/build.rs @@ -0,0 +1,40 @@ +fn main() { + let src_dir = std::path::Path::new("src"); + + let mut c_config = cc::Build::new(); + c_config.include(&src_dir); + c_config + .flag_if_supported("-Wno-unused-parameter") + .flag_if_supported("-Wno-unused-but-set-variable") + .flag_if_supported("-Wno-trigraphs"); + let parser_path = src_dir.join("parser.c"); + c_config.file(&parser_path); + + // If your language uses an external scanner written in C, + // then include this block of code: + + /* + let scanner_path = src_dir.join("scanner.c"); + c_config.file(&scanner_path); + println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap()); + */ + + c_config.compile("parser"); + println!("cargo:rerun-if-changed={}", parser_path.to_str().unwrap()); + + // If your language uses an external scanner written in C++, + // then include this block of code: + + /* + let mut cpp_config = cc::Build::new(); + cpp_config.cpp(true); + cpp_config.include(&src_dir); + cpp_config + .flag_if_supported("-Wno-unused-parameter") + .flag_if_supported("-Wno-unused-but-set-variable"); + let scanner_path = src_dir.join("scanner.cc"); + cpp_config.file(&scanner_path); + cpp_config.compile("scanner"); + println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap()); + */ +} diff --git a/tree-sitter-smithyql/bindings/rust/lib.rs b/tree-sitter-smithyql/bindings/rust/lib.rs new file mode 100644 index 00000000..80e4f04b --- /dev/null +++ b/tree-sitter-smithyql/bindings/rust/lib.rs @@ -0,0 +1,52 @@ +//! This crate provides smithyql language support for the [tree-sitter][] parsing library. +//! +//! Typically, you will use the [language][language func] function to add this language to a +//! tree-sitter [Parser][], and then use the parser to parse some code: +//! +//! ``` +//! let code = ""; +//! let mut parser = tree_sitter::Parser::new(); +//! parser.set_language(tree_sitter_smithyql::language()).expect("Error loading smithyql grammar"); +//! let tree = parser.parse(code, None).unwrap(); +//! ``` +//! +//! [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html +//! [language func]: fn.language.html +//! [Parser]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Parser.html +//! [tree-sitter]: https://tree-sitter.github.io/ + +use tree_sitter::Language; + +extern "C" { + fn tree_sitter_smithyql() -> Language; +} + +/// Get the tree-sitter [Language][] for this grammar. +/// +/// [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html +pub fn language() -> Language { + unsafe { tree_sitter_smithyql() } +} + +/// The content of the [`node-types.json`][] file for this grammar. +/// +/// [`node-types.json`]: https://tree-sitter.github.io/tree-sitter/using-parsers#static-node-types +pub const NODE_TYPES: &'static str = include_str!("../../src/node-types.json"); + +// Uncomment these to include any queries that this grammar contains + +// pub const HIGHLIGHTS_QUERY: &'static str = include_str!("../../queries/highlights.scm"); +// pub const INJECTIONS_QUERY: &'static str = include_str!("../../queries/injections.scm"); +// pub const LOCALS_QUERY: &'static str = include_str!("../../queries/locals.scm"); +// pub const TAGS_QUERY: &'static str = include_str!("../../queries/tags.scm"); + +#[cfg(test)] +mod tests { + #[test] + fn test_can_load_grammar() { + let mut parser = tree_sitter::Parser::new(); + parser + .set_language(super::language()) + .expect("Error loading smithyql language"); + } +} diff --git a/tree-sitter-smithyql/example-file b/tree-sitter-smithyql/example-file new file mode 100644 index 00000000..ce013625 --- /dev/null +++ b/tree-sitter-smithyql/example-file @@ -0,0 +1 @@ +hello diff --git a/tree-sitter-smithyql/grammar.js b/tree-sitter-smithyql/grammar.js new file mode 100644 index 00000000..4e237b89 --- /dev/null +++ b/tree-sitter-smithyql/grammar.js @@ -0,0 +1,8 @@ +module.exports = grammar({ + name: "smithyql", + + rules: { + // TODO: add the actual grammar rules + source_file: ($) => "hello", + }, +}); diff --git a/tree-sitter-smithyql/package.json b/tree-sitter-smithyql/package.json new file mode 100644 index 00000000..5264f389 --- /dev/null +++ b/tree-sitter-smithyql/package.json @@ -0,0 +1,11 @@ +{ + "name": "tree-sitter-smithyql", + "version": "1.0.0", + "description": "", + "main": "bindings/node", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC" +} diff --git a/tree-sitter-smithyql/src/grammar.json b/tree-sitter-smithyql/src/grammar.json new file mode 100644 index 00000000..d5a2a7f0 --- /dev/null +++ b/tree-sitter-smithyql/src/grammar.json @@ -0,0 +1,21 @@ +{ + "name": "smithyql", + "rules": { + "source_file": { + "type": "STRING", + "value": "hello" + } + }, + "extras": [ + { + "type": "PATTERN", + "value": "\\s" + } + ], + "conflicts": [], + "precedences": [], + "externals": [], + "inline": [], + "supertypes": [] +} + diff --git a/tree-sitter-smithyql/src/node-types.json b/tree-sitter-smithyql/src/node-types.json new file mode 100644 index 00000000..43a64428 --- /dev/null +++ b/tree-sitter-smithyql/src/node-types.json @@ -0,0 +1,11 @@ +[ + { + "type": "source_file", + "named": true, + "fields": {} + }, + { + "type": "hello", + "named": false + } +] \ No newline at end of file diff --git a/tree-sitter-smithyql/src/parser.c b/tree-sitter-smithyql/src/parser.c new file mode 100644 index 00000000..426dc93c --- /dev/null +++ b/tree-sitter-smithyql/src/parser.c @@ -0,0 +1,169 @@ +#include + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" +#endif + +#define LANGUAGE_VERSION 13 +#define STATE_COUNT 4 +#define LARGE_STATE_COUNT 2 +#define SYMBOL_COUNT 3 +#define ALIAS_COUNT 0 +#define TOKEN_COUNT 2 +#define EXTERNAL_TOKEN_COUNT 0 +#define FIELD_COUNT 0 +#define MAX_ALIAS_SEQUENCE_LENGTH 1 +#define PRODUCTION_ID_COUNT 1 + +enum { + anon_sym_hello = 1, + sym_source_file = 2, +}; + +static const char * const ts_symbol_names[] = { + [ts_builtin_sym_end] = "end", + [anon_sym_hello] = "hello", + [sym_source_file] = "source_file", +}; + +static const TSSymbol ts_symbol_map[] = { + [ts_builtin_sym_end] = ts_builtin_sym_end, + [anon_sym_hello] = anon_sym_hello, + [sym_source_file] = sym_source_file, +}; + +static const TSSymbolMetadata ts_symbol_metadata[] = { + [ts_builtin_sym_end] = { + .visible = false, + .named = true, + }, + [anon_sym_hello] = { + .visible = true, + .named = false, + }, + [sym_source_file] = { + .visible = true, + .named = true, + }, +}; + +static const TSSymbol ts_alias_sequences[PRODUCTION_ID_COUNT][MAX_ALIAS_SEQUENCE_LENGTH] = { + [0] = {0}, +}; + +static const uint16_t ts_non_terminal_alias_map[] = { + 0, +}; + +static bool ts_lex(TSLexer *lexer, TSStateId state) { + START_LEXER(); + eof = lexer->eof(lexer); + switch (state) { + case 0: + if (eof) ADVANCE(5); + if (lookahead == 'h') ADVANCE(1); + if (lookahead == '\t' || + lookahead == '\n' || + lookahead == '\r' || + lookahead == ' ') SKIP(0) + END_STATE(); + case 1: + if (lookahead == 'e') ADVANCE(3); + END_STATE(); + case 2: + if (lookahead == 'l') ADVANCE(4); + END_STATE(); + case 3: + if (lookahead == 'l') ADVANCE(2); + END_STATE(); + case 4: + if (lookahead == 'o') ADVANCE(6); + END_STATE(); + case 5: + ACCEPT_TOKEN(ts_builtin_sym_end); + END_STATE(); + case 6: + ACCEPT_TOKEN(anon_sym_hello); + END_STATE(); + default: + return false; + } +} + +static const TSLexMode ts_lex_modes[STATE_COUNT] = { + [0] = {.lex_state = 0}, + [1] = {.lex_state = 0}, + [2] = {.lex_state = 0}, + [3] = {.lex_state = 0}, +}; + +static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { + [0] = { + [ts_builtin_sym_end] = ACTIONS(1), + [anon_sym_hello] = ACTIONS(1), + }, + [1] = { + [sym_source_file] = STATE(3), + [anon_sym_hello] = ACTIONS(3), + }, +}; + +static const uint16_t ts_small_parse_table[] = { + [0] = 1, + ACTIONS(5), 1, + ts_builtin_sym_end, + [4] = 1, + ACTIONS(7), 1, + ts_builtin_sym_end, +}; + +static const uint32_t ts_small_parse_table_map[] = { + [SMALL_STATE(2)] = 0, + [SMALL_STATE(3)] = 4, +}; + +static const TSParseActionEntry ts_parse_actions[] = { + [0] = {.entry = {.count = 0, .reusable = false}}, + [1] = {.entry = {.count = 1, .reusable = false}}, RECOVER(), + [3] = {.entry = {.count = 1, .reusable = true}}, SHIFT(2), + [5] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source_file, 1), + [7] = {.entry = {.count = 1, .reusable = true}}, ACCEPT_INPUT(), +}; + +#ifdef __cplusplus +extern "C" { +#endif +#ifdef _WIN32 +#define extern __declspec(dllexport) +#endif + +extern const TSLanguage *tree_sitter_smithyql(void) { + static const TSLanguage language = { + .version = LANGUAGE_VERSION, + .symbol_count = SYMBOL_COUNT, + .alias_count = ALIAS_COUNT, + .token_count = TOKEN_COUNT, + .external_token_count = EXTERNAL_TOKEN_COUNT, + .state_count = STATE_COUNT, + .large_state_count = LARGE_STATE_COUNT, + .production_id_count = PRODUCTION_ID_COUNT, + .field_count = FIELD_COUNT, + .max_alias_sequence_length = MAX_ALIAS_SEQUENCE_LENGTH, + .parse_table = &ts_parse_table[0][0], + .small_parse_table = ts_small_parse_table, + .small_parse_table_map = ts_small_parse_table_map, + .parse_actions = ts_parse_actions, + .symbol_names = ts_symbol_names, + .symbol_metadata = ts_symbol_metadata, + .public_symbol_map = ts_symbol_map, + .alias_map = ts_non_terminal_alias_map, + .alias_sequences = &ts_alias_sequences[0][0], + .lex_modes = ts_lex_modes, + .lex_fn = ts_lex, + }; + return &language; +} +#ifdef __cplusplus +} +#endif diff --git a/tree-sitter-smithyql/src/tree_sitter/parser.h b/tree-sitter-smithyql/src/tree_sitter/parser.h new file mode 100644 index 00000000..2b14ac10 --- /dev/null +++ b/tree-sitter-smithyql/src/tree_sitter/parser.h @@ -0,0 +1,224 @@ +#ifndef TREE_SITTER_PARSER_H_ +#define TREE_SITTER_PARSER_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +#define ts_builtin_sym_error ((TSSymbol)-1) +#define ts_builtin_sym_end 0 +#define TREE_SITTER_SERIALIZATION_BUFFER_SIZE 1024 + +typedef uint16_t TSStateId; + +#ifndef TREE_SITTER_API_H_ +typedef uint16_t TSSymbol; +typedef uint16_t TSFieldId; +typedef struct TSLanguage TSLanguage; +#endif + +typedef struct { + TSFieldId field_id; + uint8_t child_index; + bool inherited; +} TSFieldMapEntry; + +typedef struct { + uint16_t index; + uint16_t length; +} TSFieldMapSlice; + +typedef struct { + bool visible; + bool named; + bool supertype; +} TSSymbolMetadata; + +typedef struct TSLexer TSLexer; + +struct TSLexer { + int32_t lookahead; + TSSymbol result_symbol; + void (*advance)(TSLexer *, bool); + void (*mark_end)(TSLexer *); + uint32_t (*get_column)(TSLexer *); + bool (*is_at_included_range_start)(const TSLexer *); + bool (*eof)(const TSLexer *); +}; + +typedef enum { + TSParseActionTypeShift, + TSParseActionTypeReduce, + TSParseActionTypeAccept, + TSParseActionTypeRecover, +} TSParseActionType; + +typedef union { + struct { + uint8_t type; + TSStateId state; + bool extra; + bool repetition; + } shift; + struct { + uint8_t type; + uint8_t child_count; + TSSymbol symbol; + int16_t dynamic_precedence; + uint16_t production_id; + } reduce; + uint8_t type; +} TSParseAction; + +typedef struct { + uint16_t lex_state; + uint16_t external_lex_state; +} TSLexMode; + +typedef union { + TSParseAction action; + struct { + uint8_t count; + bool reusable; + } entry; +} TSParseActionEntry; + +struct TSLanguage { + uint32_t version; + uint32_t symbol_count; + uint32_t alias_count; + uint32_t token_count; + uint32_t external_token_count; + uint32_t state_count; + uint32_t large_state_count; + uint32_t production_id_count; + uint32_t field_count; + uint16_t max_alias_sequence_length; + const uint16_t *parse_table; + const uint16_t *small_parse_table; + const uint32_t *small_parse_table_map; + const TSParseActionEntry *parse_actions; + const char * const *symbol_names; + const char * const *field_names; + const TSFieldMapSlice *field_map_slices; + const TSFieldMapEntry *field_map_entries; + const TSSymbolMetadata *symbol_metadata; + const TSSymbol *public_symbol_map; + const uint16_t *alias_map; + const TSSymbol *alias_sequences; + const TSLexMode *lex_modes; + bool (*lex_fn)(TSLexer *, TSStateId); + bool (*keyword_lex_fn)(TSLexer *, TSStateId); + TSSymbol keyword_capture_token; + struct { + const bool *states; + const TSSymbol *symbol_map; + void *(*create)(void); + void (*destroy)(void *); + bool (*scan)(void *, TSLexer *, const bool *symbol_whitelist); + unsigned (*serialize)(void *, char *); + void (*deserialize)(void *, const char *, unsigned); + } external_scanner; + const TSStateId *primary_state_ids; +}; + +/* + * Lexer Macros + */ + +#define START_LEXER() \ + bool result = false; \ + bool skip = false; \ + bool eof = false; \ + int32_t lookahead; \ + goto start; \ + next_state: \ + lexer->advance(lexer, skip); \ + start: \ + skip = false; \ + lookahead = lexer->lookahead; + +#define ADVANCE(state_value) \ + { \ + state = state_value; \ + goto next_state; \ + } + +#define SKIP(state_value) \ + { \ + skip = true; \ + state = state_value; \ + goto next_state; \ + } + +#define ACCEPT_TOKEN(symbol_value) \ + result = true; \ + lexer->result_symbol = symbol_value; \ + lexer->mark_end(lexer); + +#define END_STATE() return result; + +/* + * Parse Table Macros + */ + +#define SMALL_STATE(id) id - LARGE_STATE_COUNT + +#define STATE(id) id + +#define ACTIONS(id) id + +#define SHIFT(state_value) \ + {{ \ + .shift = { \ + .type = TSParseActionTypeShift, \ + .state = state_value \ + } \ + }} + +#define SHIFT_REPEAT(state_value) \ + {{ \ + .shift = { \ + .type = TSParseActionTypeShift, \ + .state = state_value, \ + .repetition = true \ + } \ + }} + +#define SHIFT_EXTRA() \ + {{ \ + .shift = { \ + .type = TSParseActionTypeShift, \ + .extra = true \ + } \ + }} + +#define REDUCE(symbol_val, child_count_val, ...) \ + {{ \ + .reduce = { \ + .type = TSParseActionTypeReduce, \ + .symbol = symbol_val, \ + .child_count = child_count_val, \ + __VA_ARGS__ \ + }, \ + }} + +#define RECOVER() \ + {{ \ + .type = TSParseActionTypeRecover \ + }} + +#define ACCEPT_INPUT() \ + {{ \ + .type = TSParseActionTypeAccept \ + }} + +#ifdef __cplusplus +} +#endif + +#endif // TREE_SITTER_PARSER_H_ From df716b706abe00d5f1b6307420830930faa59359 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 15 Aug 2022 01:58:54 +0200 Subject: [PATCH 002/105] Add tree-sitter submodule --- .gitignore | 2 ++ .gitmodules | 3 +++ tree-sitter-smithyql/package-lock.json | 13 +++++++++++++ tree-sitter-smithyql/package.json | 5 ++++- tree-sitter-smithyql/tree-sitter | 1 + 5 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 .gitmodules create mode 100644 tree-sitter-smithyql/package-lock.json create mode 160000 tree-sitter-smithyql/tree-sitter diff --git a/.gitignore b/.gitignore index 4231dfbe..0ed83601 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ **/.DS_Store .smithy.lsp.log .sbt +**/node_modules +tree-sitter-smithyql/build diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..35a6628a --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "tree-sitter-smithyql/tree-sitter"] + path = tree-sitter-smithyql/tree-sitter + url = git@github.com:tree-sitter/tree-sitter diff --git a/tree-sitter-smithyql/package-lock.json b/tree-sitter-smithyql/package-lock.json new file mode 100644 index 00000000..d06ff185 --- /dev/null +++ b/tree-sitter-smithyql/package-lock.json @@ -0,0 +1,13 @@ +{ + "name": "tree-sitter-smithyql", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "nan": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", + "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==" + } + } +} diff --git a/tree-sitter-smithyql/package.json b/tree-sitter-smithyql/package.json index 5264f389..6e43731e 100644 --- a/tree-sitter-smithyql/package.json +++ b/tree-sitter-smithyql/package.json @@ -7,5 +7,8 @@ "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", - "license": "ISC" + "license": "ISC", + "dependencies": { + "nan": "^2.16.0" + } } diff --git a/tree-sitter-smithyql/tree-sitter b/tree-sitter-smithyql/tree-sitter new file mode 160000 index 00000000..a882d0b0 --- /dev/null +++ b/tree-sitter-smithyql/tree-sitter @@ -0,0 +1 @@ +Subproject commit a882d0b036b0da23cde5caa1325089b4ca4750ba From 3a881b0b9b9d7848e36c92cb88960833dbe6e1c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 15 Aug 2022 19:55:04 +0200 Subject: [PATCH 003/105] Add grammar --- .gitignore | 1 + tree-sitter-smithyql/corpus/comment.txt | 14 + tree-sitter-smithyql/corpus/empty.txt | 7 + .../corpus/full-of-comments.txt | 112 ++ tree-sitter-smithyql/corpus/just-query.txt | 11 + tree-sitter-smithyql/corpus/just-use.txt | 15 + tree-sitter-smithyql/corpus/statements.txt | 148 +++ tree-sitter-smithyql/corpus/string.txt | 9 + tree-sitter-smithyql/corpus/struct-1.txt | 19 + tree-sitter-smithyql/corpus/struct-2.txt | 27 + tree-sitter-smithyql/corpus/struct-3.txt | 35 + tree-sitter-smithyql/example-file | 1 - tree-sitter-smithyql/example.smithyql | 25 + tree-sitter-smithyql/grammar.js | 51 +- tree-sitter-smithyql/package-lock.json | 6 + tree-sitter-smithyql/package.json | 3 + tree-sitter-smithyql/src/grammar.json | 338 ++++- tree-sitter-smithyql/src/node-types.json | 294 +++- tree-sitter-smithyql/src/parser.c | 1179 ++++++++++++++++- .../src/tree_sitter/parser.h.gch | Bin 0 -> 885612 bytes tree-sitter-smithyql/tree-sitter | 1 - 21 files changed, 2253 insertions(+), 43 deletions(-) create mode 100644 tree-sitter-smithyql/corpus/comment.txt create mode 100644 tree-sitter-smithyql/corpus/empty.txt create mode 100644 tree-sitter-smithyql/corpus/full-of-comments.txt create mode 100644 tree-sitter-smithyql/corpus/just-query.txt create mode 100644 tree-sitter-smithyql/corpus/just-use.txt create mode 100644 tree-sitter-smithyql/corpus/statements.txt create mode 100644 tree-sitter-smithyql/corpus/string.txt create mode 100644 tree-sitter-smithyql/corpus/struct-1.txt create mode 100644 tree-sitter-smithyql/corpus/struct-2.txt create mode 100644 tree-sitter-smithyql/corpus/struct-3.txt delete mode 100644 tree-sitter-smithyql/example-file create mode 100644 tree-sitter-smithyql/example.smithyql create mode 100644 tree-sitter-smithyql/src/tree_sitter/parser.h.gch delete mode 160000 tree-sitter-smithyql/tree-sitter diff --git a/.gitignore b/.gitignore index 0ed83601..dc87a738 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ .sbt **/node_modules tree-sitter-smithyql/build +tree-sitter-smithyql/*.wasm diff --git a/tree-sitter-smithyql/corpus/comment.txt b/tree-sitter-smithyql/corpus/comment.txt new file mode 100644 index 00000000..9c7debfb --- /dev/null +++ b/tree-sitter-smithyql/corpus/comment.txt @@ -0,0 +1,14 @@ +================================================================================ +File with comments +================================================================================ +//comm +hello {} +-------------------------------------------------------------------------------- + +(source_file + (comment) + (whitespace) + (operation_name + (identifier)) + (whitespace) + (struct)) diff --git a/tree-sitter-smithyql/corpus/empty.txt b/tree-sitter-smithyql/corpus/empty.txt new file mode 100644 index 00000000..a66d7e19 --- /dev/null +++ b/tree-sitter-smithyql/corpus/empty.txt @@ -0,0 +1,7 @@ +================================================================================ +Empty file +================================================================================ + +-------------------------------------------------------------------------------- + +(source_file) diff --git a/tree-sitter-smithyql/corpus/full-of-comments.txt b/tree-sitter-smithyql/corpus/full-of-comments.txt new file mode 100644 index 00000000..e330695b --- /dev/null +++ b/tree-sitter-smithyql/corpus/full-of-comments.txt @@ -0,0 +1,112 @@ +================================================================================ +Full of comments +================================================================================ + +// before use clause +use//after use +service //after service +some //after ident +.//after dot +api//after api ident +#//after hash +Service//after service +// before op +op +// after op + { + + //before key + firstKey + // after key + = + // before value + "firstValue" + // after value + , + // before another key + secondKey + // after second key + = + // before value + "secondValue" + // after value +, + //after trailing comma, technically this is part of the struct + } +// after whole thing + +-------------------------------------------------------------------------------- + +(source_file + (whitespace) + (comment) + (whitespace) + (use_clause + (comment) + (whitespace) + (whitespace) + (comment) + (whitespace) + (qualified_identifier + (identifier) + (whitespace) + (comment) + (whitespace) + (comment) + (whitespace) + (identifier) + (comment) + (whitespace) + (comment) + (whitespace) + (identifier))) + (comment) + (whitespace) + (comment) + (whitespace) + (operation_name + (identifier)) + (whitespace) + (comment) + (whitespace) + (struct + (whitespace) + (comment) + (whitespace) + (fields + (field + (identifier) + (whitespace) + (comment) + (whitespace) + (whitespace) + (comment) + (whitespace) + (input_node + (string))) + (whitespace) + (comment) + (whitespace) + (whitespace) + (comment) + (whitespace) + (fields + (field + (identifier) + (whitespace) + (comment) + (whitespace) + (whitespace) + (comment) + (whitespace) + (input_node + (string))) + (whitespace) + (comment) + (whitespace))) + (whitespace) + (comment) + (whitespace)) + (whitespace) + (comment) + (whitespace)) diff --git a/tree-sitter-smithyql/corpus/just-query.txt b/tree-sitter-smithyql/corpus/just-query.txt new file mode 100644 index 00000000..a1091fbc --- /dev/null +++ b/tree-sitter-smithyql/corpus/just-query.txt @@ -0,0 +1,11 @@ +================================================================================ +Just query, no use clause +================================================================================ +hello {} +-------------------------------------------------------------------------------- + +(source_file + (operation_name + (identifier)) + (whitespace) + (struct)) diff --git a/tree-sitter-smithyql/corpus/just-use.txt b/tree-sitter-smithyql/corpus/just-use.txt new file mode 100644 index 00000000..ae7641c7 --- /dev/null +++ b/tree-sitter-smithyql/corpus/just-use.txt @@ -0,0 +1,15 @@ +================================================================================ +Just use clause +================================================================================ +use service playground.std#Clock +-------------------------------------------------------------------------------- + +(source_file + (ERROR + (use_clause + (whitespace) + (whitespace) + (qualified_identifier + (identifier) + (identifier) + (identifier))))) diff --git a/tree-sitter-smithyql/corpus/statements.txt b/tree-sitter-smithyql/corpus/statements.txt new file mode 100644 index 00000000..0c397aa9 --- /dev/null +++ b/tree-sitter-smithyql/corpus/statements.txt @@ -0,0 +1,148 @@ +================================================================================ +Return statements +================================================================================ + +use service a.b#C + +hello { + a = 42, + b = 50, + c = { + d = "foo", + e=false, + f=true, + list = [ 50, 100, 100, + [null, false, true, null, "a", 40, ] + ], + }, + nul = null, +} +-------------------------------------------------------------------------------- + +(source_file + (whitespace) + (use_clause + (whitespace) + (whitespace) + (qualified_identifier + (identifier) + (identifier) + (identifier))) + (whitespace) + (operation_name + (identifier)) + (whitespace) + (struct + (whitespace) + (fields + (field + (identifier) + (whitespace) + (whitespace) + (input_node + (number))) + (whitespace) + (fields + (field + (identifier) + (whitespace) + (whitespace) + (input_node + (number))) + (whitespace) + (fields + (field + (identifier) + (whitespace) + (whitespace) + (input_node + (struct + (whitespace) + (fields + (field + (identifier) + (whitespace) + (whitespace) + (input_node + (string))) + (whitespace) + (fields + (field + (identifier) + (input_node + (boolean))) + (whitespace) + (fields + (field + (identifier) + (input_node + (boolean))) + (whitespace) + (fields + (field + (identifier) + (whitespace) + (whitespace) + (input_node + (list + (whitespace) + (list_fields + (list_field + (input_node + (number))) + (whitespace) + (list_fields + (list_field + (input_node + (number))) + (whitespace) + (list_fields + (list_field + (input_node + (number))) + (whitespace) + (list_fields + (list_field + (input_node + (list + (list_fields + (list_field + (input_node + (null))) + (whitespace) + (list_fields + (list_field + (input_node + (boolean))) + (whitespace) + (list_fields + (list_field + (input_node + (boolean))) + (whitespace) + (list_fields + (list_field + (input_node + (null))) + (whitespace) + (list_fields + (list_field + (input_node + (string))) + (whitespace) + (list_fields + (list_field + (input_node + (number))))))))) + (whitespace)))))))) + (whitespace)))))))) + (whitespace)))) + (whitespace) + (fields + (field + (identifier) + (whitespace) + (whitespace) + (input_node + (null))))))) + (whitespace))) diff --git a/tree-sitter-smithyql/corpus/string.txt b/tree-sitter-smithyql/corpus/string.txt new file mode 100644 index 00000000..140d036a --- /dev/null +++ b/tree-sitter-smithyql/corpus/string.txt @@ -0,0 +1,9 @@ +================================================================================ +Just a string +================================================================================ +"hello" +-------------------------------------------------------------------------------- + +(source_file + (ERROR + (string))) diff --git a/tree-sitter-smithyql/corpus/struct-1.txt b/tree-sitter-smithyql/corpus/struct-1.txt new file mode 100644 index 00000000..45a7891c --- /dev/null +++ b/tree-sitter-smithyql/corpus/struct-1.txt @@ -0,0 +1,19 @@ +================================================================================ +Struct with 1 field +================================================================================ +{ a = 42 } +-------------------------------------------------------------------------------- + +(source_file + (operation_name + (MISSING identifier)) + (struct + (whitespace) + (fields + (field + (identifier) + (whitespace) + (whitespace) + (input_node + (number)))) + (whitespace))) diff --git a/tree-sitter-smithyql/corpus/struct-2.txt b/tree-sitter-smithyql/corpus/struct-2.txt new file mode 100644 index 00000000..f2a2688a --- /dev/null +++ b/tree-sitter-smithyql/corpus/struct-2.txt @@ -0,0 +1,27 @@ +================================================================================ +Struct with 2 fields +================================================================================ +{ a = 42, b = "false" } +-------------------------------------------------------------------------------- + +(source_file + (operation_name + (MISSING identifier)) + (struct + (whitespace) + (fields + (field + (identifier) + (whitespace) + (whitespace) + (input_node + (number))) + (whitespace) + (fields + (field + (identifier) + (whitespace) + (whitespace) + (input_node + (string))))) + (whitespace))) diff --git a/tree-sitter-smithyql/corpus/struct-3.txt b/tree-sitter-smithyql/corpus/struct-3.txt new file mode 100644 index 00000000..9568cf18 --- /dev/null +++ b/tree-sitter-smithyql/corpus/struct-3.txt @@ -0,0 +1,35 @@ +================================================================================ +Struct with 3 fields +================================================================================ +{ a = 42, b = "false", c = true, } +-------------------------------------------------------------------------------- + +(source_file + (operation_name + (MISSING identifier)) + (struct + (whitespace) + (fields + (field + (identifier) + (whitespace) + (whitespace) + (input_node + (number))) + (whitespace) + (fields + (field + (identifier) + (whitespace) + (whitespace) + (input_node + (string))) + (whitespace) + (fields + (field + (identifier) + (whitespace) + (whitespace) + (input_node + (boolean)))))) + (whitespace))) diff --git a/tree-sitter-smithyql/example-file b/tree-sitter-smithyql/example-file deleted file mode 100644 index ce013625..00000000 --- a/tree-sitter-smithyql/example-file +++ /dev/null @@ -1 +0,0 @@ -hello diff --git a/tree-sitter-smithyql/example.smithyql b/tree-sitter-smithyql/example.smithyql new file mode 100644 index 00000000..8124bf33 --- /dev/null +++ b/tree-sitter-smithyql/example.smithyql @@ -0,0 +1,25 @@ +use service a.b#C + +hello { + a = 42, + b = 50, + c = { + d = "foo", + e = false, + f = true, + list = [ + 50, + 100, + 100, + [ + null, + false, + true, + null, + "a", + 40, + ], + ], + }, + nul = null, +} diff --git a/tree-sitter-smithyql/grammar.js b/tree-sitter-smithyql/grammar.js index 4e237b89..18f476ec 100644 --- a/tree-sitter-smithyql/grammar.js +++ b/tree-sitter-smithyql/grammar.js @@ -1,8 +1,55 @@ +// Comma-separated sequence of field, with an optional trailing comma. +function comma_separated_trailing(name, $, field) { + return seq(field, optional(seq(",", optional($[name])))); +} + module.exports = grammar({ name: "smithyql", + extras: ($) => [$.whitespace, $.comment], rules: { - // TODO: add the actual grammar rules - source_file: ($) => "hello", + source_file: ($) => + optional( + seq( + field("use_clause", optional($.use_clause)), + field("operation_name", $.operation_name), + field("input", $.struct) + ) + ), + + use_clause: ($) => + seq("use", $.whitespace, "service", $.whitespace, $.qualified_identifier), + + qualified_identifier: ($) => + seq($.identifier, repeat(seq(".", $.identifier)), "#", $.identifier), + + operation_name: ($) => $.identifier, + + input_node: ($) => + choice($.struct, $.list, $.number, $.string, $.boolean, $.null), + + struct: ($) => seq("{", optional($.fields), "}"), + list: ($) => seq("[", optional($.list_fields), "]"), + + fields: ($) => comma_separated_trailing("fields", $, $.field), + + field: ($) => seq($.identifier, "=", $.input_node), + + list_fields: ($) => + comma_separated_trailing("list_fields", $, $.list_field), + + list_field: ($) => $.input_node, + + identifier: ($) => /[a-zA-Z_][a-zA-Z0-9_]*/, + + boolean: ($) => choice("true", "false"), + number: ($) => /-?(0|[1-9]\d*)(\.\d+)?([eE][+-]?\d+)?/, + string: ($) => /"([^"\\]|\\.)*"/, + + null: ($) => "null", + + comment: ($) => token(seq("//", /.*/)), + whitespace: ($) => /\s+/, }, }); +// diff --git a/tree-sitter-smithyql/package-lock.json b/tree-sitter-smithyql/package-lock.json index d06ff185..80adcd32 100644 --- a/tree-sitter-smithyql/package-lock.json +++ b/tree-sitter-smithyql/package-lock.json @@ -8,6 +8,12 @@ "version": "2.16.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==" + }, + "tree-sitter-cli": { + "version": "0.20.6", + "resolved": "https://registry.npmjs.org/tree-sitter-cli/-/tree-sitter-cli-0.20.6.tgz", + "integrity": "sha512-tjbAeuGSMhco/EnsThjWkQbDIYMDmdkWsTPsa/NJAW7bjaki9P7oM9TkLxfdlnm4LXd1wR5wVSM2/RTLtZbm6A==", + "dev": true } } } diff --git a/tree-sitter-smithyql/package.json b/tree-sitter-smithyql/package.json index 6e43731e..14f3ecdd 100644 --- a/tree-sitter-smithyql/package.json +++ b/tree-sitter-smithyql/package.json @@ -10,5 +10,8 @@ "license": "ISC", "dependencies": { "nan": "^2.16.0" + }, + "devDependencies": { + "tree-sitter-cli": "^0.20.6" } } diff --git a/tree-sitter-smithyql/src/grammar.json b/tree-sitter-smithyql/src/grammar.json index d5a2a7f0..94b25129 100644 --- a/tree-sitter-smithyql/src/grammar.json +++ b/tree-sitter-smithyql/src/grammar.json @@ -2,14 +2,346 @@ "name": "smithyql", "rules": { "source_file": { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "use_clause", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "use_clause" + }, + { + "type": "BLANK" + } + ] + } + }, + { + "type": "FIELD", + "name": "operation_name", + "content": { + "type": "SYMBOL", + "name": "operation_name" + } + }, + { + "type": "FIELD", + "name": "input", + "content": { + "type": "SYMBOL", + "name": "struct" + } + } + ] + }, + { + "type": "BLANK" + } + ] + }, + "use_clause": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "use" + }, + { + "type": "SYMBOL", + "name": "whitespace" + }, + { + "type": "STRING", + "value": "service" + }, + { + "type": "SYMBOL", + "name": "whitespace" + }, + { + "type": "SYMBOL", + "name": "qualified_identifier" + } + ] + }, + "qualified_identifier": { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "identifier" + }, + { + "type": "REPEAT", + "content": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "." + }, + { + "type": "SYMBOL", + "name": "identifier" + } + ] + } + }, + { + "type": "STRING", + "value": "#" + }, + { + "type": "SYMBOL", + "name": "identifier" + } + ] + }, + "operation_name": { + "type": "SYMBOL", + "name": "identifier" + }, + "input_node": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "struct" + }, + { + "type": "SYMBOL", + "name": "list" + }, + { + "type": "SYMBOL", + "name": "number" + }, + { + "type": "SYMBOL", + "name": "string" + }, + { + "type": "SYMBOL", + "name": "boolean" + }, + { + "type": "SYMBOL", + "name": "null" + } + ] + }, + "struct": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "fields" + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "list": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "[" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "list_fields" + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "STRING", + "value": "]" + } + ] + }, + "fields": { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "field" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "," + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "fields" + }, + { + "type": "BLANK" + } + ] + } + ] + }, + { + "type": "BLANK" + } + ] + } + ] + }, + "field": { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "identifier" + }, + { + "type": "STRING", + "value": "=" + }, + { + "type": "SYMBOL", + "name": "input_node" + } + ] + }, + "list_fields": { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "list_field" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "," + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "list_fields" + }, + { + "type": "BLANK" + } + ] + } + ] + }, + { + "type": "BLANK" + } + ] + } + ] + }, + "list_field": { + "type": "SYMBOL", + "name": "input_node" + }, + "identifier": { + "type": "PATTERN", + "value": "[a-zA-Z_][a-zA-Z0-9_]*" + }, + "boolean": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "true" + }, + { + "type": "STRING", + "value": "false" + } + ] + }, + "number": { + "type": "PATTERN", + "value": "-?(0|[1-9]\\d*)(\\.\\d+)?([eE][+-]?\\d+)?" + }, + "string": { + "type": "PATTERN", + "value": "\"([^\"\\\\]|\\\\.)*\"" + }, + "null": { "type": "STRING", - "value": "hello" + "value": "null" + }, + "comment": { + "type": "TOKEN", + "content": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "//" + }, + { + "type": "PATTERN", + "value": ".*" + } + ] + } + }, + "whitespace": { + "type": "PATTERN", + "value": "\\s+" } }, "extras": [ { - "type": "PATTERN", - "value": "\\s" + "type": "SYMBOL", + "name": "whitespace" + }, + { + "type": "SYMBOL", + "name": "comment" } ], "conflicts": [], diff --git a/tree-sitter-smithyql/src/node-types.json b/tree-sitter-smithyql/src/node-types.json index 43a64428..ca7e7a48 100644 --- a/tree-sitter-smithyql/src/node-types.json +++ b/tree-sitter-smithyql/src/node-types.json @@ -1,11 +1,301 @@ [ { - "type": "source_file", + "type": "boolean", "named": true, "fields": {} }, { - "type": "hello", + "type": "field", + "named": true, + "fields": {}, + "children": { + "multiple": true, + "required": true, + "types": [ + { + "type": "identifier", + "named": true + }, + { + "type": "input_node", + "named": true + } + ] + } + }, + { + "type": "fields", + "named": true, + "fields": {}, + "children": { + "multiple": true, + "required": true, + "types": [ + { + "type": "field", + "named": true + }, + { + "type": "fields", + "named": true + } + ] + } + }, + { + "type": "input_node", + "named": true, + "fields": {}, + "children": { + "multiple": false, + "required": true, + "types": [ + { + "type": "boolean", + "named": true + }, + { + "type": "list", + "named": true + }, + { + "type": "null", + "named": true + }, + { + "type": "number", + "named": true + }, + { + "type": "string", + "named": true + }, + { + "type": "struct", + "named": true + } + ] + } + }, + { + "type": "list", + "named": true, + "fields": {}, + "children": { + "multiple": false, + "required": false, + "types": [ + { + "type": "list_fields", + "named": true + } + ] + } + }, + { + "type": "list_field", + "named": true, + "fields": {}, + "children": { + "multiple": false, + "required": true, + "types": [ + { + "type": "input_node", + "named": true + } + ] + } + }, + { + "type": "list_fields", + "named": true, + "fields": {}, + "children": { + "multiple": true, + "required": true, + "types": [ + { + "type": "list_field", + "named": true + }, + { + "type": "list_fields", + "named": true + } + ] + } + }, + { + "type": "operation_name", + "named": true, + "fields": {}, + "children": { + "multiple": false, + "required": true, + "types": [ + { + "type": "identifier", + "named": true + } + ] + } + }, + { + "type": "qualified_identifier", + "named": true, + "fields": {}, + "children": { + "multiple": true, + "required": true, + "types": [ + { + "type": "identifier", + "named": true + } + ] + } + }, + { + "type": "source_file", + "named": true, + "fields": { + "input": { + "multiple": false, + "required": false, + "types": [ + { + "type": "struct", + "named": true + } + ] + }, + "operation_name": { + "multiple": false, + "required": false, + "types": [ + { + "type": "operation_name", + "named": true + } + ] + }, + "use_clause": { + "multiple": false, + "required": false, + "types": [ + { + "type": "use_clause", + "named": true + } + ] + } + } + }, + { + "type": "struct", + "named": true, + "fields": {}, + "children": { + "multiple": false, + "required": false, + "types": [ + { + "type": "fields", + "named": true + } + ] + } + }, + { + "type": "use_clause", + "named": true, + "fields": {}, + "children": { + "multiple": true, + "required": true, + "types": [ + { + "type": "qualified_identifier", + "named": true + }, + { + "type": "whitespace", + "named": true + } + ] + } + }, + { + "type": "#", + "named": false + }, + { + "type": ",", + "named": false + }, + { + "type": ".", + "named": false + }, + { + "type": "=", + "named": false + }, + { + "type": "[", + "named": false + }, + { + "type": "]", + "named": false + }, + { + "type": "comment", + "named": true + }, + { + "type": "false", + "named": false + }, + { + "type": "identifier", + "named": true + }, + { + "type": "null", + "named": true + }, + { + "type": "number", + "named": true + }, + { + "type": "service", + "named": false + }, + { + "type": "string", + "named": true + }, + { + "type": "true", + "named": false + }, + { + "type": "use", + "named": false + }, + { + "type": "whitespace", + "named": true + }, + { + "type": "{", + "named": false + }, + { + "type": "}", "named": false } ] \ No newline at end of file diff --git a/tree-sitter-smithyql/src/parser.c b/tree-sitter-smithyql/src/parser.c index 426dc93c..6015efbf 100644 --- a/tree-sitter-smithyql/src/parser.c +++ b/tree-sitter-smithyql/src/parser.c @@ -6,31 +6,118 @@ #endif #define LANGUAGE_VERSION 13 -#define STATE_COUNT 4 +#define STATE_COUNT 43 #define LARGE_STATE_COUNT 2 -#define SYMBOL_COUNT 3 +#define SYMBOL_COUNT 32 #define ALIAS_COUNT 0 -#define TOKEN_COUNT 2 +#define TOKEN_COUNT 19 #define EXTERNAL_TOKEN_COUNT 0 -#define FIELD_COUNT 0 -#define MAX_ALIAS_SEQUENCE_LENGTH 1 -#define PRODUCTION_ID_COUNT 1 +#define FIELD_COUNT 3 +#define MAX_ALIAS_SEQUENCE_LENGTH 5 +#define PRODUCTION_ID_COUNT 3 enum { - anon_sym_hello = 1, - sym_source_file = 2, + anon_sym_use = 1, + anon_sym_service = 2, + anon_sym_DOT = 3, + anon_sym_POUND = 4, + anon_sym_LBRACE = 5, + anon_sym_RBRACE = 6, + anon_sym_LBRACK = 7, + anon_sym_RBRACK = 8, + anon_sym_COMMA = 9, + anon_sym_EQ = 10, + sym_identifier = 11, + anon_sym_true = 12, + anon_sym_false = 13, + sym_number = 14, + sym_string = 15, + sym_null = 16, + sym_comment = 17, + sym_whitespace = 18, + sym_source_file = 19, + sym_use_clause = 20, + sym_qualified_identifier = 21, + sym_operation_name = 22, + sym_input_node = 23, + sym_struct = 24, + sym_list = 25, + sym_fields = 26, + sym_field = 27, + sym_list_fields = 28, + sym_list_field = 29, + sym_boolean = 30, + aux_sym_qualified_identifier_repeat1 = 31, }; static const char * const ts_symbol_names[] = { [ts_builtin_sym_end] = "end", - [anon_sym_hello] = "hello", + [anon_sym_use] = "use", + [anon_sym_service] = "service", + [anon_sym_DOT] = ".", + [anon_sym_POUND] = "#", + [anon_sym_LBRACE] = "{", + [anon_sym_RBRACE] = "}", + [anon_sym_LBRACK] = "[", + [anon_sym_RBRACK] = "]", + [anon_sym_COMMA] = ",", + [anon_sym_EQ] = "=", + [sym_identifier] = "identifier", + [anon_sym_true] = "true", + [anon_sym_false] = "false", + [sym_number] = "number", + [sym_string] = "string", + [sym_null] = "null", + [sym_comment] = "comment", + [sym_whitespace] = "whitespace", [sym_source_file] = "source_file", + [sym_use_clause] = "use_clause", + [sym_qualified_identifier] = "qualified_identifier", + [sym_operation_name] = "operation_name", + [sym_input_node] = "input_node", + [sym_struct] = "struct", + [sym_list] = "list", + [sym_fields] = "fields", + [sym_field] = "field", + [sym_list_fields] = "list_fields", + [sym_list_field] = "list_field", + [sym_boolean] = "boolean", + [aux_sym_qualified_identifier_repeat1] = "qualified_identifier_repeat1", }; static const TSSymbol ts_symbol_map[] = { [ts_builtin_sym_end] = ts_builtin_sym_end, - [anon_sym_hello] = anon_sym_hello, + [anon_sym_use] = anon_sym_use, + [anon_sym_service] = anon_sym_service, + [anon_sym_DOT] = anon_sym_DOT, + [anon_sym_POUND] = anon_sym_POUND, + [anon_sym_LBRACE] = anon_sym_LBRACE, + [anon_sym_RBRACE] = anon_sym_RBRACE, + [anon_sym_LBRACK] = anon_sym_LBRACK, + [anon_sym_RBRACK] = anon_sym_RBRACK, + [anon_sym_COMMA] = anon_sym_COMMA, + [anon_sym_EQ] = anon_sym_EQ, + [sym_identifier] = sym_identifier, + [anon_sym_true] = anon_sym_true, + [anon_sym_false] = anon_sym_false, + [sym_number] = sym_number, + [sym_string] = sym_string, + [sym_null] = sym_null, + [sym_comment] = sym_comment, + [sym_whitespace] = sym_whitespace, [sym_source_file] = sym_source_file, + [sym_use_clause] = sym_use_clause, + [sym_qualified_identifier] = sym_qualified_identifier, + [sym_operation_name] = sym_operation_name, + [sym_input_node] = sym_input_node, + [sym_struct] = sym_struct, + [sym_list] = sym_list, + [sym_fields] = sym_fields, + [sym_field] = sym_field, + [sym_list_fields] = sym_list_fields, + [sym_list_field] = sym_list_field, + [sym_boolean] = sym_boolean, + [aux_sym_qualified_identifier_repeat1] = aux_sym_qualified_identifier_repeat1, }; static const TSSymbolMetadata ts_symbol_metadata[] = { @@ -38,14 +125,158 @@ static const TSSymbolMetadata ts_symbol_metadata[] = { .visible = false, .named = true, }, - [anon_sym_hello] = { + [anon_sym_use] = { .visible = true, .named = false, }, + [anon_sym_service] = { + .visible = true, + .named = false, + }, + [anon_sym_DOT] = { + .visible = true, + .named = false, + }, + [anon_sym_POUND] = { + .visible = true, + .named = false, + }, + [anon_sym_LBRACE] = { + .visible = true, + .named = false, + }, + [anon_sym_RBRACE] = { + .visible = true, + .named = false, + }, + [anon_sym_LBRACK] = { + .visible = true, + .named = false, + }, + [anon_sym_RBRACK] = { + .visible = true, + .named = false, + }, + [anon_sym_COMMA] = { + .visible = true, + .named = false, + }, + [anon_sym_EQ] = { + .visible = true, + .named = false, + }, + [sym_identifier] = { + .visible = true, + .named = true, + }, + [anon_sym_true] = { + .visible = true, + .named = false, + }, + [anon_sym_false] = { + .visible = true, + .named = false, + }, + [sym_number] = { + .visible = true, + .named = true, + }, + [sym_string] = { + .visible = true, + .named = true, + }, + [sym_null] = { + .visible = true, + .named = true, + }, + [sym_comment] = { + .visible = true, + .named = true, + }, + [sym_whitespace] = { + .visible = true, + .named = true, + }, [sym_source_file] = { .visible = true, .named = true, }, + [sym_use_clause] = { + .visible = true, + .named = true, + }, + [sym_qualified_identifier] = { + .visible = true, + .named = true, + }, + [sym_operation_name] = { + .visible = true, + .named = true, + }, + [sym_input_node] = { + .visible = true, + .named = true, + }, + [sym_struct] = { + .visible = true, + .named = true, + }, + [sym_list] = { + .visible = true, + .named = true, + }, + [sym_fields] = { + .visible = true, + .named = true, + }, + [sym_field] = { + .visible = true, + .named = true, + }, + [sym_list_fields] = { + .visible = true, + .named = true, + }, + [sym_list_field] = { + .visible = true, + .named = true, + }, + [sym_boolean] = { + .visible = true, + .named = true, + }, + [aux_sym_qualified_identifier_repeat1] = { + .visible = false, + .named = false, + }, +}; + +enum { + field_input = 1, + field_operation_name = 2, + field_use_clause = 3, +}; + +static const char * const ts_field_names[] = { + [0] = NULL, + [field_input] = "input", + [field_operation_name] = "operation_name", + [field_use_clause] = "use_clause", +}; + +static const TSFieldMapSlice ts_field_map_slices[PRODUCTION_ID_COUNT] = { + [1] = {.index = 0, .length = 2}, + [2] = {.index = 2, .length = 3}, +}; + +static const TSFieldMapEntry ts_field_map_entries[] = { + [0] = + {field_input, 1}, + {field_operation_name, 0}, + [2] = + {field_input, 2}, + {field_operation_name, 1}, + {field_use_clause, 0}, }; static const TSSymbol ts_alias_sequences[PRODUCTION_ID_COUNT][MAX_ALIAS_SEQUENCE_LENGTH] = { @@ -61,30 +292,411 @@ static bool ts_lex(TSLexer *lexer, TSStateId state) { eof = lexer->eof(lexer); switch (state) { case 0: - if (eof) ADVANCE(5); - if (lookahead == 'h') ADVANCE(1); + if (eof) ADVANCE(27); + if (lookahead == '"') ADVANCE(2); + if (lookahead == '#') ADVANCE(32); + if (lookahead == ',') ADVANCE(37); + if (lookahead == '-') ADVANCE(5); + if (lookahead == '.') ADVANCE(31); + if (lookahead == '/') ADVANCE(4); + if (lookahead == '0') ADVANCE(62); + if (lookahead == '=') ADVANCE(38); + if (lookahead == '[') ADVANCE(35); + if (lookahead == ']') ADVANCE(36); + if (lookahead == 'f') ADVANCE(39); + if (lookahead == 'n') ADVANCE(54); + if (lookahead == 's') ADVANCE(45); + if (lookahead == 't') ADVANCE(51); + if (lookahead == 'u') ADVANCE(52); + if (lookahead == '{') ADVANCE(33); + if (lookahead == '}') ADVANCE(34); if (lookahead == '\t' || lookahead == '\n' || lookahead == '\r' || - lookahead == ' ') SKIP(0) + lookahead == ' ') ADVANCE(70); + if (('1' <= lookahead && lookahead <= '9')) ADVANCE(63); + if (('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); END_STATE(); case 1: - if (lookahead == 'e') ADVANCE(3); + if (lookahead == '"') ADVANCE(2); + if (lookahead == '-') ADVANCE(5); + if (lookahead == '/') ADVANCE(4); + if (lookahead == '0') ADVANCE(62); + if (lookahead == '[') ADVANCE(35); + if (lookahead == ']') ADVANCE(36); + if (lookahead == 'f') ADVANCE(6); + if (lookahead == 'n') ADVANCE(20); + if (lookahead == 's') ADVANCE(11); + if (lookahead == 't') ADVANCE(17); + if (lookahead == '{') ADVANCE(33); + if (lookahead == '\t' || + lookahead == '\n' || + lookahead == '\r' || + lookahead == ' ') ADVANCE(70); + if (('1' <= lookahead && lookahead <= '9')) ADVANCE(63); END_STATE(); case 2: - if (lookahead == 'l') ADVANCE(4); + if (lookahead == '"') ADVANCE(66); + if (lookahead == '\\') ADVANCE(25); + if (lookahead != 0) ADVANCE(2); END_STATE(); case 3: - if (lookahead == 'l') ADVANCE(2); + if (lookahead == '/') ADVANCE(4); + if (lookahead == '}') ADVANCE(34); + if (lookahead == '\t' || + lookahead == '\n' || + lookahead == '\r' || + lookahead == ' ') ADVANCE(70); + if (('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); END_STATE(); case 4: - if (lookahead == 'o') ADVANCE(6); + if (lookahead == '/') ADVANCE(69); END_STATE(); case 5: - ACCEPT_TOKEN(ts_builtin_sym_end); + if (lookahead == '0') ADVANCE(62); + if (('1' <= lookahead && lookahead <= '9')) ADVANCE(63); END_STATE(); case 6: - ACCEPT_TOKEN(anon_sym_hello); + if (lookahead == 'a') ADVANCE(13); + END_STATE(); + case 7: + if (lookahead == 'c') ADVANCE(10); + END_STATE(); + case 8: + if (lookahead == 'e') ADVANCE(58); + END_STATE(); + case 9: + if (lookahead == 'e') ADVANCE(60); + END_STATE(); + case 10: + if (lookahead == 'e') ADVANCE(29); + END_STATE(); + case 11: + if (lookahead == 'e') ADVANCE(16); + END_STATE(); + case 12: + if (lookahead == 'i') ADVANCE(7); + END_STATE(); + case 13: + if (lookahead == 'l') ADVANCE(18); + END_STATE(); + case 14: + if (lookahead == 'l') ADVANCE(67); + END_STATE(); + case 15: + if (lookahead == 'l') ADVANCE(14); + END_STATE(); + case 16: + if (lookahead == 'r') ADVANCE(21); + END_STATE(); + case 17: + if (lookahead == 'r') ADVANCE(19); + END_STATE(); + case 18: + if (lookahead == 's') ADVANCE(9); + END_STATE(); + case 19: + if (lookahead == 'u') ADVANCE(8); + END_STATE(); + case 20: + if (lookahead == 'u') ADVANCE(15); + END_STATE(); + case 21: + if (lookahead == 'v') ADVANCE(12); + END_STATE(); + case 22: + if (lookahead == '+' || + lookahead == '-') ADVANCE(24); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(65); + END_STATE(); + case 23: + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(64); + END_STATE(); + case 24: + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(65); + END_STATE(); + case 25: + if (lookahead != 0 && + lookahead != '\n') ADVANCE(2); + END_STATE(); + case 26: + if (eof) ADVANCE(27); + if (lookahead == '/') ADVANCE(4); + if (lookahead == 'u') ADVANCE(52); + if (lookahead == '\t' || + lookahead == '\n' || + lookahead == '\r' || + lookahead == ' ') ADVANCE(70); + if (('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 27: + ACCEPT_TOKEN(ts_builtin_sym_end); + END_STATE(); + case 28: + ACCEPT_TOKEN(anon_sym_use); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 29: + ACCEPT_TOKEN(anon_sym_service); + END_STATE(); + case 30: + ACCEPT_TOKEN(anon_sym_service); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 31: + ACCEPT_TOKEN(anon_sym_DOT); + END_STATE(); + case 32: + ACCEPT_TOKEN(anon_sym_POUND); + END_STATE(); + case 33: + ACCEPT_TOKEN(anon_sym_LBRACE); + END_STATE(); + case 34: + ACCEPT_TOKEN(anon_sym_RBRACE); + END_STATE(); + case 35: + ACCEPT_TOKEN(anon_sym_LBRACK); + END_STATE(); + case 36: + ACCEPT_TOKEN(anon_sym_RBRACK); + END_STATE(); + case 37: + ACCEPT_TOKEN(anon_sym_COMMA); + END_STATE(); + case 38: + ACCEPT_TOKEN(anon_sym_EQ); + END_STATE(); + case 39: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'a') ADVANCE(49); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('b' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 40: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'c') ADVANCE(44); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 41: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'e') ADVANCE(28); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 42: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'e') ADVANCE(59); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 43: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'e') ADVANCE(61); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 44: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'e') ADVANCE(30); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 45: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'e') ADVANCE(50); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 46: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'i') ADVANCE(40); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 47: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'l') ADVANCE(68); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 48: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'l') ADVANCE(47); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 49: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'l') ADVANCE(53); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 50: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'r') ADVANCE(56); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 51: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'r') ADVANCE(55); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 52: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 's') ADVANCE(41); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 53: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 's') ADVANCE(43); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 54: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'u') ADVANCE(48); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 55: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'u') ADVANCE(42); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 56: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'v') ADVANCE(46); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 57: + ACCEPT_TOKEN(sym_identifier); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 58: + ACCEPT_TOKEN(anon_sym_true); + END_STATE(); + case 59: + ACCEPT_TOKEN(anon_sym_true); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 60: + ACCEPT_TOKEN(anon_sym_false); + END_STATE(); + case 61: + ACCEPT_TOKEN(anon_sym_false); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 62: + ACCEPT_TOKEN(sym_number); + if (lookahead == '.') ADVANCE(23); + if (lookahead == 'E' || + lookahead == 'e') ADVANCE(22); + END_STATE(); + case 63: + ACCEPT_TOKEN(sym_number); + if (lookahead == '.') ADVANCE(23); + if (lookahead == 'E' || + lookahead == 'e') ADVANCE(22); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(63); + END_STATE(); + case 64: + ACCEPT_TOKEN(sym_number); + if (lookahead == 'E' || + lookahead == 'e') ADVANCE(22); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(64); + END_STATE(); + case 65: + ACCEPT_TOKEN(sym_number); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(65); + END_STATE(); + case 66: + ACCEPT_TOKEN(sym_string); + END_STATE(); + case 67: + ACCEPT_TOKEN(sym_null); + END_STATE(); + case 68: + ACCEPT_TOKEN(sym_null); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 69: + ACCEPT_TOKEN(sym_comment); + if (lookahead != 0 && + lookahead != '\n') ADVANCE(69); + END_STATE(); + case 70: + ACCEPT_TOKEN(sym_whitespace); + if (lookahead == '\t' || + lookahead == '\n' || + lookahead == '\r' || + lookahead == ' ') ADVANCE(70); END_STATE(); default: return false; @@ -93,42 +705,538 @@ static bool ts_lex(TSLexer *lexer, TSStateId state) { static const TSLexMode ts_lex_modes[STATE_COUNT] = { [0] = {.lex_state = 0}, - [1] = {.lex_state = 0}, - [2] = {.lex_state = 0}, - [3] = {.lex_state = 0}, + [1] = {.lex_state = 26}, + [2] = {.lex_state = 1}, + [3] = {.lex_state = 1}, + [4] = {.lex_state = 1}, + [5] = {.lex_state = 3}, + [6] = {.lex_state = 3}, + [7] = {.lex_state = 0}, + [8] = {.lex_state = 0}, + [9] = {.lex_state = 0}, + [10] = {.lex_state = 0}, + [11] = {.lex_state = 0}, + [12] = {.lex_state = 0}, + [13] = {.lex_state = 0}, + [14] = {.lex_state = 0}, + [15] = {.lex_state = 0}, + [16] = {.lex_state = 0}, + [17] = {.lex_state = 0}, + [18] = {.lex_state = 0}, + [19] = {.lex_state = 0}, + [20] = {.lex_state = 3}, + [21] = {.lex_state = 0}, + [22] = {.lex_state = 3}, + [23] = {.lex_state = 0}, + [24] = {.lex_state = 0}, + [25] = {.lex_state = 3}, + [26] = {.lex_state = 0}, + [27] = {.lex_state = 3}, + [28] = {.lex_state = 3}, + [29] = {.lex_state = 0}, + [30] = {.lex_state = 0}, + [31] = {.lex_state = 0}, + [32] = {.lex_state = 0}, + [33] = {.lex_state = 0}, + [34] = {.lex_state = 3}, + [35] = {.lex_state = 3}, + [36] = {.lex_state = 0}, + [37] = {.lex_state = 1}, + [38] = {.lex_state = 0}, + [39] = {.lex_state = 3}, + [40] = {.lex_state = 0}, + [41] = {.lex_state = 0}, + [42] = {.lex_state = 0}, }; static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [0] = { [ts_builtin_sym_end] = ACTIONS(1), - [anon_sym_hello] = ACTIONS(1), + [anon_sym_use] = ACTIONS(1), + [anon_sym_service] = ACTIONS(1), + [anon_sym_DOT] = ACTIONS(1), + [anon_sym_POUND] = ACTIONS(1), + [anon_sym_LBRACE] = ACTIONS(1), + [anon_sym_RBRACE] = ACTIONS(1), + [anon_sym_LBRACK] = ACTIONS(1), + [anon_sym_RBRACK] = ACTIONS(1), + [anon_sym_COMMA] = ACTIONS(1), + [anon_sym_EQ] = ACTIONS(1), + [sym_identifier] = ACTIONS(1), + [anon_sym_true] = ACTIONS(1), + [anon_sym_false] = ACTIONS(1), + [sym_number] = ACTIONS(1), + [sym_string] = ACTIONS(1), + [sym_null] = ACTIONS(1), + [sym_comment] = ACTIONS(3), + [sym_whitespace] = ACTIONS(3), }, [1] = { - [sym_source_file] = STATE(3), - [anon_sym_hello] = ACTIONS(3), + [sym_source_file] = STATE(29), + [sym_use_clause] = STATE(20), + [sym_operation_name] = STATE(17), + [ts_builtin_sym_end] = ACTIONS(5), + [anon_sym_use] = ACTIONS(7), + [sym_identifier] = ACTIONS(9), + [sym_comment] = ACTIONS(3), + [sym_whitespace] = ACTIONS(3), }, }; static const uint16_t ts_small_parse_table[] = { - [0] = 1, - ACTIONS(5), 1, + [0] = 10, + ACTIONS(11), 1, + anon_sym_LBRACE, + ACTIONS(13), 1, + anon_sym_LBRACK, + ACTIONS(15), 1, + anon_sym_RBRACK, + STATE(16), 1, + sym_list_field, + STATE(23), 1, + sym_input_node, + STATE(40), 1, + sym_list_fields, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + ACTIONS(17), 2, + anon_sym_true, + anon_sym_false, + ACTIONS(19), 3, + sym_number, + sym_string, + sym_null, + STATE(14), 3, + sym_struct, + sym_list, + sym_boolean, + [37] = 10, + ACTIONS(11), 1, + anon_sym_LBRACE, + ACTIONS(13), 1, + anon_sym_LBRACK, + ACTIONS(21), 1, + anon_sym_RBRACK, + STATE(16), 1, + sym_list_field, + STATE(23), 1, + sym_input_node, + STATE(32), 1, + sym_list_fields, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + ACTIONS(17), 2, + anon_sym_true, + anon_sym_false, + ACTIONS(19), 3, + sym_number, + sym_string, + sym_null, + STATE(14), 3, + sym_struct, + sym_list, + sym_boolean, + [74] = 7, + ACTIONS(11), 1, + anon_sym_LBRACE, + ACTIONS(13), 1, + anon_sym_LBRACK, + STATE(24), 1, + sym_input_node, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + ACTIONS(17), 2, + anon_sym_true, + anon_sym_false, + ACTIONS(19), 3, + sym_number, + sym_string, + sym_null, + STATE(14), 3, + sym_struct, + sym_list, + sym_boolean, + [102] = 5, + ACTIONS(23), 1, + anon_sym_RBRACE, + ACTIONS(25), 1, + sym_identifier, + STATE(21), 1, + sym_field, + STATE(33), 1, + sym_fields, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [119] = 5, + ACTIONS(25), 1, + sym_identifier, + ACTIONS(27), 1, + anon_sym_RBRACE, + STATE(21), 1, + sym_field, + STATE(26), 1, + sym_fields, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [136] = 2, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + ACTIONS(29), 4, + ts_builtin_sym_end, + anon_sym_RBRACE, + anon_sym_RBRACK, + anon_sym_COMMA, + [147] = 2, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + ACTIONS(31), 4, + ts_builtin_sym_end, + anon_sym_RBRACE, + anon_sym_RBRACK, + anon_sym_COMMA, + [158] = 4, + ACTIONS(33), 1, + anon_sym_DOT, + ACTIONS(35), 1, + anon_sym_POUND, + STATE(12), 1, + aux_sym_qualified_identifier_repeat1, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [172] = 2, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + ACTIONS(37), 3, + anon_sym_RBRACE, + anon_sym_RBRACK, + anon_sym_COMMA, + [182] = 2, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + ACTIONS(39), 3, + anon_sym_RBRACE, + anon_sym_RBRACK, + anon_sym_COMMA, + [192] = 4, + ACTIONS(41), 1, + anon_sym_DOT, + ACTIONS(44), 1, + anon_sym_POUND, + STATE(12), 1, + aux_sym_qualified_identifier_repeat1, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [206] = 2, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + ACTIONS(46), 3, + anon_sym_RBRACE, + anon_sym_RBRACK, + anon_sym_COMMA, + [216] = 2, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + ACTIONS(48), 3, + anon_sym_RBRACE, + anon_sym_RBRACK, + anon_sym_COMMA, + [226] = 4, + ACTIONS(33), 1, + anon_sym_DOT, + ACTIONS(50), 1, + anon_sym_POUND, + STATE(9), 1, + aux_sym_qualified_identifier_repeat1, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [240] = 3, + ACTIONS(52), 1, + anon_sym_RBRACK, + ACTIONS(54), 1, + anon_sym_COMMA, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [251] = 3, + ACTIONS(11), 1, + anon_sym_LBRACE, + STATE(30), 1, + sym_struct, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [262] = 3, + ACTIONS(11), 1, + anon_sym_LBRACE, + STATE(31), 1, + sym_struct, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [273] = 2, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + ACTIONS(44), 2, + anon_sym_DOT, + anon_sym_POUND, + [282] = 3, + ACTIONS(56), 1, + sym_identifier, + STATE(18), 1, + sym_operation_name, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [293] = 3, + ACTIONS(58), 1, + anon_sym_RBRACE, + ACTIONS(60), 1, + anon_sym_COMMA, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [304] = 3, + ACTIONS(62), 1, + sym_identifier, + STATE(25), 1, + sym_qualified_identifier, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [315] = 2, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + ACTIONS(64), 2, + anon_sym_RBRACK, + anon_sym_COMMA, + [324] = 2, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + ACTIONS(66), 2, + anon_sym_RBRACE, + anon_sym_COMMA, + [333] = 2, + ACTIONS(68), 1, + sym_identifier, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [341] = 2, + ACTIONS(70), 1, + anon_sym_RBRACE, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [349] = 2, + ACTIONS(72), 1, + sym_identifier, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [357] = 2, + ACTIONS(74), 1, + sym_identifier, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [365] = 2, + ACTIONS(76), 1, + ts_builtin_sym_end, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [373] = 2, + ACTIONS(78), 1, ts_builtin_sym_end, - [4] = 1, - ACTIONS(7), 1, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [381] = 2, + ACTIONS(80), 1, ts_builtin_sym_end, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [389] = 2, + ACTIONS(82), 1, + anon_sym_RBRACK, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [397] = 2, + ACTIONS(84), 1, + anon_sym_RBRACE, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [405] = 2, + ACTIONS(86), 1, + sym_identifier, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [413] = 2, + ACTIONS(88), 1, + sym_identifier, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [421] = 2, + ACTIONS(90), 1, + anon_sym_EQ, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [429] = 2, + ACTIONS(92), 1, + anon_sym_service, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [437] = 2, + ACTIONS(94), 1, + anon_sym_LBRACE, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [445] = 2, + ACTIONS(96), 1, + sym_identifier, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [453] = 2, + ACTIONS(98), 1, + anon_sym_RBRACK, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [461] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(100), 1, + sym_whitespace, + [468] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(102), 1, + sym_whitespace, }; static const uint32_t ts_small_parse_table_map[] = { [SMALL_STATE(2)] = 0, - [SMALL_STATE(3)] = 4, + [SMALL_STATE(3)] = 37, + [SMALL_STATE(4)] = 74, + [SMALL_STATE(5)] = 102, + [SMALL_STATE(6)] = 119, + [SMALL_STATE(7)] = 136, + [SMALL_STATE(8)] = 147, + [SMALL_STATE(9)] = 158, + [SMALL_STATE(10)] = 172, + [SMALL_STATE(11)] = 182, + [SMALL_STATE(12)] = 192, + [SMALL_STATE(13)] = 206, + [SMALL_STATE(14)] = 216, + [SMALL_STATE(15)] = 226, + [SMALL_STATE(16)] = 240, + [SMALL_STATE(17)] = 251, + [SMALL_STATE(18)] = 262, + [SMALL_STATE(19)] = 273, + [SMALL_STATE(20)] = 282, + [SMALL_STATE(21)] = 293, + [SMALL_STATE(22)] = 304, + [SMALL_STATE(23)] = 315, + [SMALL_STATE(24)] = 324, + [SMALL_STATE(25)] = 333, + [SMALL_STATE(26)] = 341, + [SMALL_STATE(27)] = 349, + [SMALL_STATE(28)] = 357, + [SMALL_STATE(29)] = 365, + [SMALL_STATE(30)] = 373, + [SMALL_STATE(31)] = 381, + [SMALL_STATE(32)] = 389, + [SMALL_STATE(33)] = 397, + [SMALL_STATE(34)] = 405, + [SMALL_STATE(35)] = 413, + [SMALL_STATE(36)] = 421, + [SMALL_STATE(37)] = 429, + [SMALL_STATE(38)] = 437, + [SMALL_STATE(39)] = 445, + [SMALL_STATE(40)] = 453, + [SMALL_STATE(41)] = 461, + [SMALL_STATE(42)] = 468, }; static const TSParseActionEntry ts_parse_actions[] = { [0] = {.entry = {.count = 0, .reusable = false}}, [1] = {.entry = {.count = 1, .reusable = false}}, RECOVER(), - [3] = {.entry = {.count = 1, .reusable = true}}, SHIFT(2), - [5] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source_file, 1), - [7] = {.entry = {.count = 1, .reusable = true}}, ACCEPT_INPUT(), + [3] = {.entry = {.count = 1, .reusable = true}}, SHIFT_EXTRA(), + [5] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source_file, 0), + [7] = {.entry = {.count = 1, .reusable = false}}, SHIFT(41), + [9] = {.entry = {.count = 1, .reusable = false}}, SHIFT(38), + [11] = {.entry = {.count = 1, .reusable = true}}, SHIFT(5), + [13] = {.entry = {.count = 1, .reusable = true}}, SHIFT(3), + [15] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_fields, 2), + [17] = {.entry = {.count = 1, .reusable = true}}, SHIFT(10), + [19] = {.entry = {.count = 1, .reusable = true}}, SHIFT(14), + [21] = {.entry = {.count = 1, .reusable = true}}, SHIFT(13), + [23] = {.entry = {.count = 1, .reusable = true}}, SHIFT(8), + [25] = {.entry = {.count = 1, .reusable = true}}, SHIFT(36), + [27] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_fields, 2), + [29] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_struct, 3), + [31] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_struct, 2), + [33] = {.entry = {.count = 1, .reusable = true}}, SHIFT(27), + [35] = {.entry = {.count = 1, .reusable = true}}, SHIFT(35), + [37] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_boolean, 1), + [39] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list, 3), + [41] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_qualified_identifier_repeat1, 2), SHIFT_REPEAT(27), + [44] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_qualified_identifier_repeat1, 2), + [46] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list, 2), + [48] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_input_node, 1), + [50] = {.entry = {.count = 1, .reusable = true}}, SHIFT(28), + [52] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_fields, 1), + [54] = {.entry = {.count = 1, .reusable = true}}, SHIFT(2), + [56] = {.entry = {.count = 1, .reusable = true}}, SHIFT(38), + [58] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_fields, 1), + [60] = {.entry = {.count = 1, .reusable = true}}, SHIFT(6), + [62] = {.entry = {.count = 1, .reusable = true}}, SHIFT(15), + [64] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_field, 1), + [66] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_field, 3), + [68] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_use_clause, 5), + [70] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_fields, 3), + [72] = {.entry = {.count = 1, .reusable = true}}, SHIFT(19), + [74] = {.entry = {.count = 1, .reusable = true}}, SHIFT(34), + [76] = {.entry = {.count = 1, .reusable = true}}, ACCEPT_INPUT(), + [78] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source_file, 2, .production_id = 1), + [80] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source_file, 3, .production_id = 2), + [82] = {.entry = {.count = 1, .reusable = true}}, SHIFT(11), + [84] = {.entry = {.count = 1, .reusable = true}}, SHIFT(7), + [86] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_qualified_identifier, 3), + [88] = {.entry = {.count = 1, .reusable = true}}, SHIFT(39), + [90] = {.entry = {.count = 1, .reusable = true}}, SHIFT(4), + [92] = {.entry = {.count = 1, .reusable = true}}, SHIFT(42), + [94] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_operation_name, 1), + [96] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_qualified_identifier, 4), + [98] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_fields, 3), + [100] = {.entry = {.count = 1, .reusable = true}}, SHIFT(37), + [102] = {.entry = {.count = 1, .reusable = true}}, SHIFT(22), }; #ifdef __cplusplus @@ -155,6 +1263,9 @@ extern const TSLanguage *tree_sitter_smithyql(void) { .small_parse_table_map = ts_small_parse_table_map, .parse_actions = ts_parse_actions, .symbol_names = ts_symbol_names, + .field_names = ts_field_names, + .field_map_slices = ts_field_map_slices, + .field_map_entries = ts_field_map_entries, .symbol_metadata = ts_symbol_metadata, .public_symbol_map = ts_symbol_map, .alias_map = ts_non_terminal_alias_map, diff --git a/tree-sitter-smithyql/src/tree_sitter/parser.h.gch b/tree-sitter-smithyql/src/tree_sitter/parser.h.gch new file mode 100644 index 0000000000000000000000000000000000000000..791a13ebc506d690c291679ab9ec200838de771c GIT binary patch literal 885612 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�h)BDf?Hg5tzQcDkW8a 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�dJin6SN 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"@Kvo60iGEO==5^_W#erlHfk8H!HuH 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

y0uB*Ha61{}bNbfThuXn|Lo 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

^b;t+=@xi}OIaTe$1#hQ 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 sI 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 literal 0 HcmV?d00001 diff --git a/tree-sitter-smithyql/tree-sitter b/tree-sitter-smithyql/tree-sitter deleted file mode 160000 index a882d0b0..00000000 --- a/tree-sitter-smithyql/tree-sitter +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a882d0b036b0da23cde5caa1325089b4ca4750ba From be256cb3108dd35b043ec300cae67cc4b9c46595 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 16 Aug 2022 03:06:38 +0200 Subject: [PATCH 004/105] Improve grammar, start working on adaptation --- build.sbt | 2 + .../playground/smithyql/ParserAdapter.scala | 178 +++++ .../corpus/full-of-comments.txt | 23 +- tree-sitter-smithyql/corpus/statements.txt | 170 ++--- tree-sitter-smithyql/corpus/struct-2.txt | 13 +- tree-sitter-smithyql/corpus/struct-3.txt | 26 +- tree-sitter-smithyql/grammar.js | 38 +- tree-sitter-smithyql/src/grammar.json | 238 +++--- tree-sitter-smithyql/src/node-types.json | 185 ++--- tree-sitter-smithyql/src/parser.c | 696 +++++++++++------- 10 files changed, 976 insertions(+), 593 deletions(-) create mode 100644 core/src/main/scala/playground/smithyql/ParserAdapter.scala diff --git a/build.sbt b/build.sbt index 3e749aad..0fa66f12 100644 --- a/build.sbt +++ b/build.sbt @@ -50,6 +50,7 @@ val commonSettings = Seq( scalacOptions ++= Seq("-Xsource:3.0"), javacOptions ++= Seq("-source", "8", "-target", "8"), mimaFailOnNoPrevious := false, + resolvers += Resolver.mavenLocal, ) lazy val pluginCore = project.settings( @@ -70,6 +71,7 @@ lazy val core = project "org.typelevel" %% "cats-parse" % "0.3.8", "org.typelevel" %% "paiges-cats" % "0.4.2", "com.softwaremill.diffx" %% "diffx-core" % "0.7.1" % Test, + "ai.serenade" % "java-tree-sitter" % "1.1.2", ), commonSettings, Smithy4sCodegenPlugin.defaultSettings(Test), diff --git a/core/src/main/scala/playground/smithyql/ParserAdapter.scala b/core/src/main/scala/playground/smithyql/ParserAdapter.scala new file mode 100644 index 00000000..1f3235cf --- /dev/null +++ b/core/src/main/scala/playground/smithyql/ParserAdapter.scala @@ -0,0 +1,178 @@ +package playground.smithyql + +import ai.serenade.treesitter.Languages +import ai.serenade.treesitter.Node +import ai.serenade.treesitter.Parser +import cats.implicits._ + +import java.io.Closeable +import scala.util.Using +import cats.data.NonEmptyList + +object ParserAdapter { + + System.load("/Users/kubukoz/projects/java-tree-sitter/out.dylib") + + implicit object CloseableIsReleasable extends Using.Releasable[Closeable] { + def release(resource: Closeable): Unit = resource.close() + } + + def children(node: Node): List[Node] = List.tabulate(node.getChildCount())(node.getChild(_)) + + def downType( + tpe: String + )( + node: Node + ): Node = downTypeOpt(tpe)(node) + .getOrElse( + sys.error( + "no children with type " + tpe + ", existing types: " + children(node) + .map(_.getType()) + .mkString(",") + ) + ) + + def downTypeAll( + tpe: String + )( + node: Node + ): List[Node] = children(node).filter(_.getType() == tpe) + + def downTypeOpt( + tpe: String + )( + node: Node + ): Option[Node] = children(node) + .find(_.getType() == tpe) + + def childTypes( + node: Node + ): String = children(node) + .map(_.getType()) + .mkString(", ") + + case class QualifiedIdentifier( + path: NonEmptyList[Identifier], + selection: Identifier, + ) + + case class UseClause( + ident: QualifiedIdentifier + ) + + case class Op( + useClause: Option[UseClause], + name: String, + input: Struct, + ) + + case class Identifier(value: String) + + case class Field(identifier: Identifier, inputNode: InputNode) + case class Fields(fields: List[Field]) + case class Struct(fields: Option[Fields]) + case class ListItems(items: List[InputNode]) + case class Listed(items: Option[ListItems]) + sealed trait InputNode + + object InputNode { + case class StructCase(s: Struct) extends InputNode + case class ListCase(l: Listed) extends InputNode + case class NumberCase(n: String) extends InputNode + case class StringCase(n: String) extends InputNode + case class BoolCase(v: Boolean) extends InputNode + case object NullCase extends InputNode + } + + def union[A](decoders: (String, Node => A)*): Node => A = + node => + decoders + .collectFirstSome { case (key, v) => downTypeOpt(key)(node).map(v) } + .getOrElse(sys.error("missing case: " + childTypes(node))) + + class OpDecoders(src: String) { + def text(node: Node) = src.substring(node.getStartByte(), node.getEndByte()) + + val identifier: Node => Identifier = text.map(Identifier(_)) + + val listItems: Node => ListItems = downTypeAll("input_node") + .map(_.map(inputNode)) + .map(ListItems.apply) + + val listed: Node => Listed = downTypeOpt("list_fields") + .map(_.map(listItems)) + .map(Listed.apply) + + val bool: Node => Boolean = text + .map(_.toBoolean) + + lazy val inputNode: Node => InputNode = union( + "number" -> text.map(InputNode.NumberCase(_)), + "string" -> text.map(InputNode.StringCase(_)), + "null" -> Function.const(InputNode.NullCase), + "struct" -> struct.map(InputNode.StructCase(_)), + "list" -> listed.map(InputNode.ListCase(_)), + "boolean" -> bool.map(InputNode.BoolCase(_)), + ) + + val field: Node => Field = + ( + downType("identifier") >>> identifier, + downType("input_node") >>> inputNode, + ).mapN(Field.apply) + + val fields: Node => Fields = downTypeAll("field") + .map(_.map(field)) + .map(Fields.apply) + + lazy val struct: Node => Struct = downTypeOpt("fields") + .map(_.map(fields)) + .map(Struct.apply) + + val qualifiedIdentifier: Node => QualifiedIdentifier = downTypeAll("identifier") + .map { + case _ :: Nil | Nil => sys.error("no ident??") + case all => + val prefix = NonEmptyList.fromListUnsafe(all.init) + + QualifiedIdentifier(prefix.map(identifier), identifier(all.last)) + } + + val useClause: Node => UseClause = + ( + downType("qualified_identifier") >>> + qualifiedIdentifier + ) + .map(UseClause) + + val op: Node => Op = + ( + downTypeOpt("use_clause").map(_.map(useClause)), + downType("operation_name") >>> + downType("identifier") >>> + text, + downType("struct") >>> + struct, + ).mapN(Op.apply) + + } + + def parse(s: String) = { + + val p = new Parser() + p.setLanguage(Languages.smithyql()) + Using.resource(p.parseString(s)) { tree => + new OpDecoders(s).op(tree.getRootNode()) + } + } + +} + +object ParserAdapterDemo extends App { + println( + ParserAdapter + .parse( + "use service a.b#C\n helalsdfhl //a\n{ hello = 42, foo = 50, x = { y = \"hello\"} , z = null, aa = [10, true, false, null]}" + ) + ) +} diff --git a/tree-sitter-smithyql/corpus/full-of-comments.txt b/tree-sitter-smithyql/corpus/full-of-comments.txt index e330695b..5c4e8fcb 100644 --- a/tree-sitter-smithyql/corpus/full-of-comments.txt +++ b/tree-sitter-smithyql/corpus/full-of-comments.txt @@ -90,20 +90,19 @@ op (whitespace) (comment) (whitespace) - (fields - (field - (identifier) - (whitespace) - (comment) - (whitespace) - (whitespace) - (comment) - (whitespace) - (input_node - (string))) + (field + (identifier) + (whitespace) + (comment) + (whitespace) (whitespace) (comment) - (whitespace))) + (whitespace) + (input_node + (string))) + (whitespace) + (comment) + (whitespace)) (whitespace) (comment) (whitespace)) diff --git a/tree-sitter-smithyql/corpus/statements.txt b/tree-sitter-smithyql/corpus/statements.txt index 0c397aa9..7bfb2fd2 100644 --- a/tree-sitter-smithyql/corpus/statements.txt +++ b/tree-sitter-smithyql/corpus/statements.txt @@ -42,107 +42,83 @@ hello { (input_node (number))) (whitespace) - (fields - (field - (identifier) - (whitespace) - (whitespace) - (input_node - (number))) + (field + (identifier) (whitespace) - (fields - (field - (identifier) - (whitespace) + (whitespace) + (input_node + (number))) + (whitespace) + (field + (identifier) + (whitespace) + (whitespace) + (input_node + (struct (whitespace) - (input_node - (struct + (fields + (field + (identifier) (whitespace) - (fields - (field - (identifier) - (whitespace) + (whitespace) + (input_node + (string))) + (whitespace) + (field + (identifier) + (input_node + (boolean))) + (whitespace) + (field + (identifier) + (input_node + (boolean))) + (whitespace) + (field + (identifier) + (whitespace) + (whitespace) + (input_node + (list (whitespace) - (input_node - (string))) - (whitespace) - (fields - (field - (identifier) + (list_fields (input_node - (boolean))) - (whitespace) - (fields - (field - (identifier) - (input_node - (boolean))) + (number)) (whitespace) - (fields - (field - (identifier) - (whitespace) - (whitespace) - (input_node - (list - (whitespace) - (list_fields - (list_field - (input_node - (number))) - (whitespace) - (list_fields - (list_field - (input_node - (number))) - (whitespace) - (list_fields - (list_field - (input_node - (number))) - (whitespace) - (list_fields - (list_field - (input_node - (list - (list_fields - (list_field - (input_node - (null))) - (whitespace) - (list_fields - (list_field - (input_node - (boolean))) - (whitespace) - (list_fields - (list_field - (input_node - (boolean))) - (whitespace) - (list_fields - (list_field - (input_node - (null))) - (whitespace) - (list_fields - (list_field - (input_node - (string))) - (whitespace) - (list_fields - (list_field - (input_node - (number))))))))) - (whitespace)))))))) - (whitespace)))))))) - (whitespace)))) - (whitespace) - (fields - (field - (identifier) - (whitespace) - (whitespace) - (input_node - (null))))))) + (input_node + (number)) + (whitespace) + (input_node + (number)) + (whitespace) + (input_node + (list + (list_fields + (input_node + (null)) + (whitespace) + (input_node + (boolean)) + (whitespace) + (input_node + (boolean)) + (whitespace) + (input_node + (null)) + (whitespace) + (input_node + (string)) + (whitespace) + (input_node + (number))) + (whitespace)))) + (whitespace))))) + (whitespace)))) + (whitespace) + (field + (identifier) + (whitespace) + (whitespace) + (input_node + (null)))) (whitespace))) diff --git a/tree-sitter-smithyql/corpus/struct-2.txt b/tree-sitter-smithyql/corpus/struct-2.txt index f2a2688a..7eea0854 100644 --- a/tree-sitter-smithyql/corpus/struct-2.txt +++ b/tree-sitter-smithyql/corpus/struct-2.txt @@ -17,11 +17,10 @@ Struct with 2 fields (input_node (number))) (whitespace) - (fields - (field - (identifier) - (whitespace) - (whitespace) - (input_node - (string))))) + (field + (identifier) + (whitespace) + (whitespace) + (input_node + (string)))) (whitespace))) diff --git a/tree-sitter-smithyql/corpus/struct-3.txt b/tree-sitter-smithyql/corpus/struct-3.txt index 9568cf18..a59eea34 100644 --- a/tree-sitter-smithyql/corpus/struct-3.txt +++ b/tree-sitter-smithyql/corpus/struct-3.txt @@ -17,19 +17,17 @@ Struct with 3 fields (input_node (number))) (whitespace) - (fields - (field - (identifier) - (whitespace) - (whitespace) - (input_node - (string))) + (field + (identifier) + (whitespace) + (whitespace) + (input_node + (string))) + (whitespace) + (field + (identifier) (whitespace) - (fields - (field - (identifier) - (whitespace) - (whitespace) - (input_node - (boolean)))))) + (whitespace) + (input_node + (boolean)))) (whitespace))) diff --git a/tree-sitter-smithyql/grammar.js b/tree-sitter-smithyql/grammar.js index 18f476ec..50e3cbf8 100644 --- a/tree-sitter-smithyql/grammar.js +++ b/tree-sitter-smithyql/grammar.js @@ -1,6 +1,9 @@ // Comma-separated sequence of field, with an optional trailing comma. -function comma_separated_trailing(name, $, field) { - return seq(field, optional(seq(",", optional($[name])))); +function comma_separated_trailing(field_grammar) { + return prec.left( + 1, + seq(field_grammar, repeat(seq(",", field_grammar)), optional(",")) + ); } module.exports = grammar({ @@ -18,27 +21,36 @@ module.exports = grammar({ ), use_clause: ($) => - seq("use", $.whitespace, "service", $.whitespace, $.qualified_identifier), + seq( + "use", + $.whitespace, + "service", + $.whitespace, + field("identifier", $.qualified_identifier) + ), qualified_identifier: ($) => - seq($.identifier, repeat(seq(".", $.identifier)), "#", $.identifier), + seq( + field("head", $.identifier), + field("tail", repeat(seq(".", $.identifier))), + "#", + field("selection", $.identifier) + ), - operation_name: ($) => $.identifier, + operation_name: ($) => field("name", $.identifier), input_node: ($) => choice($.struct, $.list, $.number, $.string, $.boolean, $.null), - struct: ($) => seq("{", optional($.fields), "}"), - list: ($) => seq("[", optional($.list_fields), "]"), - - fields: ($) => comma_separated_trailing("fields", $, $.field), + struct: ($) => seq("{", field("fields", optional($.fields)), "}"), + list: ($) => seq("[", field("list_fields", optional($.list_fields)), "]"), - field: ($) => seq($.identifier, "=", $.input_node), + fields: ($) => comma_separated_trailing($.field), - list_fields: ($) => - comma_separated_trailing("list_fields", $, $.list_field), + field: ($) => + seq(field("key", $.identifier), "=", field("value", $.input_node)), - list_field: ($) => $.input_node, + list_fields: ($) => comma_separated_trailing($.input_node), identifier: ($) => /[a-zA-Z_][a-zA-Z0-9_]*/, diff --git a/tree-sitter-smithyql/src/grammar.json b/tree-sitter-smithyql/src/grammar.json index 94b25129..48ef5698 100644 --- a/tree-sitter-smithyql/src/grammar.json +++ b/tree-sitter-smithyql/src/grammar.json @@ -66,8 +66,12 @@ "name": "whitespace" }, { - "type": "SYMBOL", - "name": "qualified_identifier" + "type": "FIELD", + "name": "identifier", + "content": { + "type": "SYMBOL", + "name": "qualified_identifier" + } } ] }, @@ -75,23 +79,31 @@ "type": "SEQ", "members": [ { - "type": "SYMBOL", - "name": "identifier" + "type": "FIELD", + "name": "head", + "content": { + "type": "SYMBOL", + "name": "identifier" + } }, { - "type": "REPEAT", + "type": "FIELD", + "name": "tail", "content": { - "type": "SEQ", - "members": [ - { - "type": "STRING", - "value": "." - }, - { - "type": "SYMBOL", - "name": "identifier" - } - ] + "type": "REPEAT", + "content": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "." + }, + { + "type": "SYMBOL", + "name": "identifier" + } + ] + } } }, { @@ -99,14 +111,22 @@ "value": "#" }, { - "type": "SYMBOL", - "name": "identifier" + "type": "FIELD", + "name": "selection", + "content": { + "type": "SYMBOL", + "name": "identifier" + } } ] }, "operation_name": { - "type": "SYMBOL", - "name": "identifier" + "type": "FIELD", + "name": "name", + "content": { + "type": "SYMBOL", + "name": "identifier" + } }, "input_node": { "type": "CHOICE", @@ -145,16 +165,20 @@ "value": "{" }, { - "type": "CHOICE", - "members": [ - { - "type": "SYMBOL", - "name": "fields" - }, - { - "type": "BLANK" - } - ] + "type": "FIELD", + "name": "fields", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "fields" + }, + { + "type": "BLANK" + } + ] + } }, { "type": "STRING", @@ -170,16 +194,20 @@ "value": "[" }, { - "type": "CHOICE", - "members": [ - { - "type": "SYMBOL", - "name": "list_fields" - }, - { - "type": "BLANK" - } - ] + "type": "FIELD", + "name": "list_fields", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "list_fields" + }, + { + "type": "BLANK" + } + ] + } }, { "type": "STRING", @@ -188,16 +216,18 @@ ] }, "fields": { - "type": "SEQ", - "members": [ - { - "type": "SYMBOL", - "name": "field" - }, - { - "type": "CHOICE", - "members": [ - { + "type": "PREC_LEFT", + "value": 1, + "content": { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "field" + }, + { + "type": "REPEAT", + "content": { "type": "SEQ", "members": [ { @@ -205,54 +235,65 @@ "value": "," }, { - "type": "CHOICE", - "members": [ - { - "type": "SYMBOL", - "name": "fields" - }, - { - "type": "BLANK" - } - ] + "type": "SYMBOL", + "name": "field" } ] - }, - { - "type": "BLANK" } - ] - } - ] + }, + { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "," + }, + { + "type": "BLANK" + } + ] + } + ] + } }, "field": { "type": "SEQ", "members": [ { - "type": "SYMBOL", - "name": "identifier" + "type": "FIELD", + "name": "key", + "content": { + "type": "SYMBOL", + "name": "identifier" + } }, { "type": "STRING", "value": "=" }, { - "type": "SYMBOL", - "name": "input_node" + "type": "FIELD", + "name": "value", + "content": { + "type": "SYMBOL", + "name": "input_node" + } } ] }, "list_fields": { - "type": "SEQ", - "members": [ - { - "type": "SYMBOL", - "name": "list_field" - }, - { - "type": "CHOICE", - "members": [ - { + "type": "PREC_LEFT", + "value": 1, + "content": { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "input_node" + }, + { + "type": "REPEAT", + "content": { "type": "SEQ", "members": [ { @@ -260,29 +301,26 @@ "value": "," }, { - "type": "CHOICE", - "members": [ - { - "type": "SYMBOL", - "name": "list_fields" - }, - { - "type": "BLANK" - } - ] + "type": "SYMBOL", + "name": "input_node" } ] - }, - { - "type": "BLANK" } - ] - } - ] - }, - "list_field": { - "type": "SYMBOL", - "name": "input_node" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "," + }, + { + "type": "BLANK" + } + ] + } + ] + } }, "identifier": { "type": "PATTERN", diff --git a/tree-sitter-smithyql/src/node-types.json b/tree-sitter-smithyql/src/node-types.json index ca7e7a48..a7e8fcdd 100644 --- a/tree-sitter-smithyql/src/node-types.json +++ b/tree-sitter-smithyql/src/node-types.json @@ -7,20 +7,27 @@ { "type": "field", "named": true, - "fields": {}, - "children": { - "multiple": true, - "required": true, - "types": [ - { - "type": "identifier", - "named": true - }, - { - "type": "input_node", - "named": true - } - ] + "fields": { + "key": { + "multiple": false, + "required": true, + "types": [ + { + "type": "identifier", + "named": true + } + ] + }, + "value": { + "multiple": false, + "required": true, + "types": [ + { + "type": "input_node", + "named": true + } + ] + } } }, { @@ -34,10 +41,6 @@ { "type": "field", "named": true - }, - { - "type": "fields", - "named": true } ] } @@ -80,31 +83,17 @@ { "type": "list", "named": true, - "fields": {}, - "children": { - "multiple": false, - "required": false, - "types": [ - { - "type": "list_fields", - "named": true - } - ] - } - }, - { - "type": "list_field", - "named": true, - "fields": {}, - "children": { - "multiple": false, - "required": true, - "types": [ - { - "type": "input_node", - "named": true - } - ] + "fields": { + "list_fields": { + "multiple": false, + "required": false, + "types": [ + { + "type": "list_fields", + "named": true + } + ] + } } }, { @@ -116,11 +105,7 @@ "required": true, "types": [ { - "type": "list_field", - "named": true - }, - { - "type": "list_fields", + "type": "input_node", "named": true } ] @@ -129,31 +114,57 @@ { "type": "operation_name", "named": true, - "fields": {}, - "children": { - "multiple": false, - "required": true, - "types": [ - { - "type": "identifier", - "named": true - } - ] + "fields": { + "name": { + "multiple": false, + "required": true, + "types": [ + { + "type": "identifier", + "named": true + } + ] + } } }, { "type": "qualified_identifier", "named": true, - "fields": {}, - "children": { - "multiple": true, - "required": true, - "types": [ - { - "type": "identifier", - "named": true - } - ] + "fields": { + "head": { + "multiple": false, + "required": true, + "types": [ + { + "type": "identifier", + "named": true + } + ] + }, + "selection": { + "multiple": false, + "required": true, + "types": [ + { + "type": "identifier", + "named": true + } + ] + }, + "tail": { + "multiple": true, + "required": false, + "types": [ + { + "type": ".", + "named": false + }, + { + "type": "identifier", + "named": true + } + ] + } } }, { @@ -195,30 +206,38 @@ { "type": "struct", "named": true, - "fields": {}, - "children": { - "multiple": false, - "required": false, - "types": [ - { - "type": "fields", - "named": true - } - ] + "fields": { + "fields": { + "multiple": false, + "required": false, + "types": [ + { + "type": "fields", + "named": true + } + ] + } } }, { "type": "use_clause", "named": true, - "fields": {}, + "fields": { + "identifier": { + "multiple": false, + "required": true, + "types": [ + { + "type": "qualified_identifier", + "named": true + } + ] + } + }, "children": { "multiple": true, "required": true, "types": [ - { - "type": "qualified_identifier", - "named": true - }, { "type": "whitespace", "named": true diff --git a/tree-sitter-smithyql/src/parser.c b/tree-sitter-smithyql/src/parser.c index 6015efbf..b1def446 100644 --- a/tree-sitter-smithyql/src/parser.c +++ b/tree-sitter-smithyql/src/parser.c @@ -6,15 +6,15 @@ #endif #define LANGUAGE_VERSION 13 -#define STATE_COUNT 43 +#define STATE_COUNT 50 #define LARGE_STATE_COUNT 2 -#define SYMBOL_COUNT 32 +#define SYMBOL_COUNT 33 #define ALIAS_COUNT 0 #define TOKEN_COUNT 19 #define EXTERNAL_TOKEN_COUNT 0 -#define FIELD_COUNT 3 +#define FIELD_COUNT 12 #define MAX_ALIAS_SEQUENCE_LENGTH 5 -#define PRODUCTION_ID_COUNT 3 +#define PRODUCTION_ID_COUNT 10 enum { anon_sym_use = 1, @@ -45,9 +45,10 @@ enum { sym_fields = 26, sym_field = 27, sym_list_fields = 28, - sym_list_field = 29, - sym_boolean = 30, - aux_sym_qualified_identifier_repeat1 = 31, + sym_boolean = 29, + aux_sym_qualified_identifier_repeat1 = 30, + aux_sym_fields_repeat1 = 31, + aux_sym_list_fields_repeat1 = 32, }; static const char * const ts_symbol_names[] = { @@ -80,9 +81,10 @@ static const char * const ts_symbol_names[] = { [sym_fields] = "fields", [sym_field] = "field", [sym_list_fields] = "list_fields", - [sym_list_field] = "list_field", [sym_boolean] = "boolean", [aux_sym_qualified_identifier_repeat1] = "qualified_identifier_repeat1", + [aux_sym_fields_repeat1] = "fields_repeat1", + [aux_sym_list_fields_repeat1] = "list_fields_repeat1", }; static const TSSymbol ts_symbol_map[] = { @@ -115,9 +117,10 @@ static const TSSymbol ts_symbol_map[] = { [sym_fields] = sym_fields, [sym_field] = sym_field, [sym_list_fields] = sym_list_fields, - [sym_list_field] = sym_list_field, [sym_boolean] = sym_boolean, [aux_sym_qualified_identifier_repeat1] = aux_sym_qualified_identifier_repeat1, + [aux_sym_fields_repeat1] = aux_sym_fields_repeat1, + [aux_sym_list_fields_repeat1] = aux_sym_list_fields_repeat1, }; static const TSSymbolMetadata ts_symbol_metadata[] = { @@ -237,10 +240,6 @@ static const TSSymbolMetadata ts_symbol_metadata[] = { .visible = true, .named = true, }, - [sym_list_field] = { - .visible = true, - .named = true, - }, [sym_boolean] = { .visible = true, .named = true, @@ -249,34 +248,85 @@ static const TSSymbolMetadata ts_symbol_metadata[] = { .visible = false, .named = false, }, + [aux_sym_fields_repeat1] = { + .visible = false, + .named = false, + }, + [aux_sym_list_fields_repeat1] = { + .visible = false, + .named = false, + }, }; enum { - field_input = 1, - field_operation_name = 2, - field_use_clause = 3, + field_fields = 1, + field_head = 2, + field_identifier = 3, + field_input = 4, + field_key = 5, + field_list_fields = 6, + field_name = 7, + field_operation_name = 8, + field_selection = 9, + field_tail = 10, + field_use_clause = 11, + field_value = 12, }; static const char * const ts_field_names[] = { [0] = NULL, + [field_fields] = "fields", + [field_head] = "head", + [field_identifier] = "identifier", [field_input] = "input", + [field_key] = "key", + [field_list_fields] = "list_fields", + [field_name] = "name", [field_operation_name] = "operation_name", + [field_selection] = "selection", + [field_tail] = "tail", [field_use_clause] = "use_clause", + [field_value] = "value", }; static const TSFieldMapSlice ts_field_map_slices[PRODUCTION_ID_COUNT] = { - [1] = {.index = 0, .length = 2}, - [2] = {.index = 2, .length = 3}, + [1] = {.index = 0, .length = 1}, + [2] = {.index = 1, .length = 2}, + [3] = {.index = 3, .length = 3}, + [4] = {.index = 6, .length = 1}, + [5] = {.index = 7, .length = 1}, + [6] = {.index = 8, .length = 2}, + [7] = {.index = 10, .length = 2}, + [8] = {.index = 12, .length = 1}, + [9] = {.index = 13, .length = 3}, }; static const TSFieldMapEntry ts_field_map_entries[] = { [0] = + {field_name, 0}, + [1] = {field_input, 1}, {field_operation_name, 0}, - [2] = + [3] = {field_input, 2}, {field_operation_name, 1}, {field_use_clause, 0}, + [6] = + {field_fields, 1}, + [7] = + {field_identifier, 4}, + [8] = + {field_key, 0}, + {field_value, 2}, + [10] = + {field_head, 0}, + {field_selection, 2}, + [12] = + {field_list_fields, 1}, + [13] = + {field_head, 0}, + {field_selection, 3}, + {field_tail, 1}, }; static const TSSymbol ts_alias_sequences[PRODUCTION_ID_COUNT][MAX_ALIAS_SEQUENCE_LENGTH] = { @@ -709,11 +759,11 @@ static const TSLexMode ts_lex_modes[STATE_COUNT] = { [2] = {.lex_state = 1}, [3] = {.lex_state = 1}, [4] = {.lex_state = 1}, - [5] = {.lex_state = 3}, - [6] = {.lex_state = 3}, + [5] = {.lex_state = 1}, + [6] = {.lex_state = 1}, [7] = {.lex_state = 0}, [8] = {.lex_state = 0}, - [9] = {.lex_state = 0}, + [9] = {.lex_state = 3}, [10] = {.lex_state = 0}, [11] = {.lex_state = 0}, [12] = {.lex_state = 0}, @@ -721,32 +771,39 @@ static const TSLexMode ts_lex_modes[STATE_COUNT] = { [14] = {.lex_state = 0}, [15] = {.lex_state = 0}, [16] = {.lex_state = 0}, - [17] = {.lex_state = 0}, + [17] = {.lex_state = 3}, [18] = {.lex_state = 0}, [19] = {.lex_state = 0}, [20] = {.lex_state = 3}, [21] = {.lex_state = 0}, - [22] = {.lex_state = 3}, + [22] = {.lex_state = 0}, [23] = {.lex_state = 0}, [24] = {.lex_state = 0}, [25] = {.lex_state = 3}, [26] = {.lex_state = 0}, - [27] = {.lex_state = 3}, - [28] = {.lex_state = 3}, - [29] = {.lex_state = 0}, - [30] = {.lex_state = 0}, + [27] = {.lex_state = 0}, + [28] = {.lex_state = 0}, + [29] = {.lex_state = 3}, + [30] = {.lex_state = 3}, [31] = {.lex_state = 0}, [32] = {.lex_state = 0}, [33] = {.lex_state = 0}, - [34] = {.lex_state = 3}, - [35] = {.lex_state = 3}, + [34] = {.lex_state = 0}, + [35] = {.lex_state = 0}, [36] = {.lex_state = 0}, - [37] = {.lex_state = 1}, - [38] = {.lex_state = 0}, + [37] = {.lex_state = 0}, + [38] = {.lex_state = 3}, [39] = {.lex_state = 3}, [40] = {.lex_state = 0}, - [41] = {.lex_state = 0}, - [42] = {.lex_state = 0}, + [41] = {.lex_state = 3}, + [42] = {.lex_state = 1}, + [43] = {.lex_state = 3}, + [44] = {.lex_state = 3}, + [45] = {.lex_state = 3}, + [46] = {.lex_state = 0}, + [47] = {.lex_state = 0}, + [48] = {.lex_state = 0}, + [49] = {.lex_state = 0}, }; static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { @@ -772,9 +829,9 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym_whitespace] = ACTIONS(3), }, [1] = { - [sym_source_file] = STATE(29), - [sym_use_clause] = STATE(20), - [sym_operation_name] = STATE(17), + [sym_source_file] = STATE(46), + [sym_use_clause] = STATE(29), + [sym_operation_name] = STATE(26), [ts_builtin_sym_end] = ACTIONS(5), [anon_sym_use] = ACTIONS(7), [sym_identifier] = ACTIONS(9), @@ -784,18 +841,16 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { }; static const uint16_t ts_small_parse_table[] = { - [0] = 10, + [0] = 9, ACTIONS(11), 1, anon_sym_LBRACE, ACTIONS(13), 1, anon_sym_LBRACK, ACTIONS(15), 1, anon_sym_RBRACK, - STATE(16), 1, - sym_list_field, - STATE(23), 1, + STATE(12), 1, sym_input_node, - STATE(40), 1, + STATE(36), 1, sym_list_fields, ACTIONS(3), 2, sym_comment, @@ -807,23 +862,19 @@ static const uint16_t ts_small_parse_table[] = { sym_number, sym_string, sym_null, - STATE(14), 3, + STATE(23), 3, sym_struct, sym_list, sym_boolean, - [37] = 10, + [34] = 8, ACTIONS(11), 1, anon_sym_LBRACE, ACTIONS(13), 1, anon_sym_LBRACK, ACTIONS(21), 1, anon_sym_RBRACK, - STATE(16), 1, - sym_list_field, - STATE(23), 1, + STATE(31), 1, sym_input_node, - STATE(32), 1, - sym_list_fields, ACTIONS(3), 2, sym_comment, sym_whitespace, @@ -834,16 +885,18 @@ static const uint16_t ts_small_parse_table[] = { sym_number, sym_string, sym_null, - STATE(14), 3, + STATE(23), 3, sym_struct, sym_list, sym_boolean, - [74] = 7, + [65] = 8, ACTIONS(11), 1, anon_sym_LBRACE, ACTIONS(13), 1, anon_sym_LBRACK, - STATE(24), 1, + ACTIONS(23), 1, + anon_sym_RBRACK, + STATE(31), 1, sym_input_node, ACTIONS(3), 2, sym_comment, @@ -855,333 +908,437 @@ static const uint16_t ts_small_parse_table[] = { sym_number, sym_string, sym_null, - STATE(14), 3, + STATE(23), 3, sym_struct, sym_list, sym_boolean, - [102] = 5, - ACTIONS(23), 1, - anon_sym_RBRACE, - ACTIONS(25), 1, - sym_identifier, - STATE(21), 1, - sym_field, - STATE(33), 1, - sym_fields, + [96] = 7, + ACTIONS(11), 1, + anon_sym_LBRACE, + ACTIONS(13), 1, + anon_sym_LBRACK, + STATE(31), 1, + sym_input_node, ACTIONS(3), 2, sym_comment, sym_whitespace, - [119] = 5, - ACTIONS(25), 1, - sym_identifier, - ACTIONS(27), 1, - anon_sym_RBRACE, - STATE(21), 1, - sym_field, - STATE(26), 1, - sym_fields, + ACTIONS(17), 2, + anon_sym_true, + anon_sym_false, + ACTIONS(19), 3, + sym_number, + sym_string, + sym_null, + STATE(23), 3, + sym_struct, + sym_list, + sym_boolean, + [124] = 7, + ACTIONS(11), 1, + anon_sym_LBRACE, + ACTIONS(13), 1, + anon_sym_LBRACK, + STATE(27), 1, + sym_input_node, ACTIONS(3), 2, sym_comment, sym_whitespace, - [136] = 2, + ACTIONS(17), 2, + anon_sym_true, + anon_sym_false, + ACTIONS(19), 3, + sym_number, + sym_string, + sym_null, + STATE(23), 3, + sym_struct, + sym_list, + sym_boolean, + [152] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(29), 4, + ACTIONS(25), 4, ts_builtin_sym_end, anon_sym_RBRACE, anon_sym_RBRACK, anon_sym_COMMA, - [147] = 2, + [163] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(31), 4, + ACTIONS(27), 4, ts_builtin_sym_end, anon_sym_RBRACE, anon_sym_RBRACK, anon_sym_COMMA, - [158] = 4, + [174] = 5, + ACTIONS(29), 1, + anon_sym_RBRACE, + ACTIONS(31), 1, + sym_identifier, + STATE(16), 1, + sym_field, + STATE(37), 1, + sym_fields, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [191] = 4, + ACTIONS(23), 1, + anon_sym_RBRACK, ACTIONS(33), 1, - anon_sym_DOT, + anon_sym_COMMA, + STATE(18), 1, + aux_sym_list_fields_repeat1, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [205] = 4, ACTIONS(35), 1, + anon_sym_DOT, + ACTIONS(38), 1, anon_sym_POUND, - STATE(12), 1, + STATE(11), 1, aux_sym_qualified_identifier_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - [172] = 2, + [219] = 4, + ACTIONS(40), 1, + anon_sym_RBRACK, + ACTIONS(42), 1, + anon_sym_COMMA, + STATE(10), 1, + aux_sym_list_fields_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(37), 3, - anon_sym_RBRACE, - anon_sym_RBRACK, - anon_sym_COMMA, - [182] = 2, + [233] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(39), 3, + ACTIONS(44), 3, anon_sym_RBRACE, anon_sym_RBRACK, anon_sym_COMMA, - [192] = 4, - ACTIONS(41), 1, + [243] = 4, + ACTIONS(46), 1, anon_sym_DOT, - ACTIONS(44), 1, + ACTIONS(48), 1, anon_sym_POUND, - STATE(12), 1, + STATE(11), 1, aux_sym_qualified_identifier_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - [206] = 2, + [257] = 4, + ACTIONS(50), 1, + anon_sym_RBRACE, + ACTIONS(52), 1, + anon_sym_COMMA, + STATE(15), 1, + aux_sym_fields_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(46), 3, + [271] = 4, + ACTIONS(55), 1, anon_sym_RBRACE, - anon_sym_RBRACK, + ACTIONS(57), 1, anon_sym_COMMA, - [216] = 2, + STATE(21), 1, + aux_sym_fields_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(48), 3, + [285] = 4, + ACTIONS(31), 1, + sym_identifier, + ACTIONS(59), 1, anon_sym_RBRACE, - anon_sym_RBRACK, - anon_sym_COMMA, - [226] = 4, - ACTIONS(33), 1, - anon_sym_DOT, - ACTIONS(50), 1, - anon_sym_POUND, - STATE(9), 1, - aux_sym_qualified_identifier_repeat1, + STATE(28), 1, + sym_field, ACTIONS(3), 2, sym_comment, sym_whitespace, - [240] = 3, - ACTIONS(52), 1, + [299] = 4, + ACTIONS(61), 1, anon_sym_RBRACK, - ACTIONS(54), 1, + ACTIONS(63), 1, anon_sym_COMMA, + STATE(18), 1, + aux_sym_list_fields_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - [251] = 3, - ACTIONS(11), 1, - anon_sym_LBRACE, - STATE(30), 1, - sym_struct, + [313] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - [262] = 3, - ACTIONS(11), 1, - anon_sym_LBRACE, - STATE(31), 1, - sym_struct, + ACTIONS(66), 3, + anon_sym_RBRACE, + anon_sym_RBRACK, + anon_sym_COMMA, + [323] = 4, + ACTIONS(31), 1, + sym_identifier, + ACTIONS(68), 1, + anon_sym_RBRACE, + STATE(28), 1, + sym_field, ACTIONS(3), 2, sym_comment, sym_whitespace, - [273] = 2, + [337] = 4, + ACTIONS(68), 1, + anon_sym_RBRACE, + ACTIONS(70), 1, + anon_sym_COMMA, + STATE(15), 1, + aux_sym_fields_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(44), 2, + [351] = 4, + ACTIONS(46), 1, anon_sym_DOT, + ACTIONS(72), 1, anon_sym_POUND, - [282] = 3, - ACTIONS(56), 1, - sym_identifier, - STATE(18), 1, - sym_operation_name, + STATE(14), 1, + aux_sym_qualified_identifier_repeat1, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [365] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - [293] = 3, - ACTIONS(58), 1, + ACTIONS(74), 3, anon_sym_RBRACE, - ACTIONS(60), 1, + anon_sym_RBRACK, anon_sym_COMMA, + [375] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - [304] = 3, - ACTIONS(62), 1, + ACTIONS(76), 3, + anon_sym_RBRACE, + anon_sym_RBRACK, + anon_sym_COMMA, + [385] = 3, + ACTIONS(31), 1, sym_identifier, - STATE(25), 1, - sym_qualified_identifier, + STATE(28), 1, + sym_field, ACTIONS(3), 2, sym_comment, sym_whitespace, - [315] = 2, + [396] = 3, + ACTIONS(11), 1, + anon_sym_LBRACE, + STATE(40), 1, + sym_struct, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(64), 2, - anon_sym_RBRACK, - anon_sym_COMMA, - [324] = 2, + [407] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(66), 2, + ACTIONS(78), 2, anon_sym_RBRACE, anon_sym_COMMA, - [333] = 2, - ACTIONS(68), 1, - sym_identifier, + [416] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - [341] = 2, - ACTIONS(70), 1, + ACTIONS(50), 2, anon_sym_RBRACE, + anon_sym_COMMA, + [425] = 3, + ACTIONS(80), 1, + sym_identifier, + STATE(32), 1, + sym_operation_name, ACTIONS(3), 2, sym_comment, sym_whitespace, - [349] = 2, - ACTIONS(72), 1, + [436] = 3, + ACTIONS(82), 1, sym_identifier, + STATE(45), 1, + sym_qualified_identifier, ACTIONS(3), 2, sym_comment, sym_whitespace, - [357] = 2, - ACTIONS(74), 1, - sym_identifier, + [447] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - [365] = 2, - ACTIONS(76), 1, - ts_builtin_sym_end, + ACTIONS(61), 2, + anon_sym_RBRACK, + anon_sym_COMMA, + [456] = 3, + ACTIONS(11), 1, + anon_sym_LBRACE, + STATE(35), 1, + sym_struct, ACTIONS(3), 2, sym_comment, sym_whitespace, - [373] = 2, - ACTIONS(78), 1, - ts_builtin_sym_end, + [467] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - [381] = 2, - ACTIONS(80), 1, + ACTIONS(38), 2, + anon_sym_DOT, + anon_sym_POUND, + [476] = 2, + ACTIONS(84), 1, + anon_sym_EQ, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [484] = 2, + ACTIONS(86), 1, ts_builtin_sym_end, ACTIONS(3), 2, sym_comment, sym_whitespace, - [389] = 2, - ACTIONS(82), 1, + [492] = 2, + ACTIONS(88), 1, anon_sym_RBRACK, ACTIONS(3), 2, sym_comment, sym_whitespace, - [397] = 2, - ACTIONS(84), 1, + [500] = 2, + ACTIONS(90), 1, anon_sym_RBRACE, ACTIONS(3), 2, sym_comment, sym_whitespace, - [405] = 2, - ACTIONS(86), 1, + [508] = 2, + ACTIONS(92), 1, sym_identifier, ACTIONS(3), 2, sym_comment, sym_whitespace, - [413] = 2, - ACTIONS(88), 1, + [516] = 2, + ACTIONS(94), 1, sym_identifier, ACTIONS(3), 2, sym_comment, sym_whitespace, - [421] = 2, - ACTIONS(90), 1, - anon_sym_EQ, + [524] = 2, + ACTIONS(96), 1, + ts_builtin_sym_end, ACTIONS(3), 2, sym_comment, sym_whitespace, - [429] = 2, - ACTIONS(92), 1, + [532] = 2, + ACTIONS(98), 1, + sym_identifier, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [540] = 2, + ACTIONS(100), 1, anon_sym_service, ACTIONS(3), 2, sym_comment, sym_whitespace, - [437] = 2, - ACTIONS(94), 1, - anon_sym_LBRACE, + [548] = 2, + ACTIONS(102), 1, + sym_identifier, ACTIONS(3), 2, sym_comment, sym_whitespace, - [445] = 2, - ACTIONS(96), 1, + [556] = 2, + ACTIONS(104), 1, sym_identifier, ACTIONS(3), 2, sym_comment, sym_whitespace, - [453] = 2, - ACTIONS(98), 1, - anon_sym_RBRACK, + [564] = 2, + ACTIONS(106), 1, + sym_identifier, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [572] = 2, + ACTIONS(108), 1, + ts_builtin_sym_end, ACTIONS(3), 2, sym_comment, sym_whitespace, - [461] = 2, + [580] = 2, + ACTIONS(110), 1, + anon_sym_LBRACE, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [588] = 2, ACTIONS(3), 1, sym_comment, - ACTIONS(100), 1, + ACTIONS(112), 1, sym_whitespace, - [468] = 2, + [595] = 2, ACTIONS(3), 1, sym_comment, - ACTIONS(102), 1, + ACTIONS(114), 1, sym_whitespace, }; static const uint32_t ts_small_parse_table_map[] = { [SMALL_STATE(2)] = 0, - [SMALL_STATE(3)] = 37, - [SMALL_STATE(4)] = 74, - [SMALL_STATE(5)] = 102, - [SMALL_STATE(6)] = 119, - [SMALL_STATE(7)] = 136, - [SMALL_STATE(8)] = 147, - [SMALL_STATE(9)] = 158, - [SMALL_STATE(10)] = 172, - [SMALL_STATE(11)] = 182, - [SMALL_STATE(12)] = 192, - [SMALL_STATE(13)] = 206, - [SMALL_STATE(14)] = 216, - [SMALL_STATE(15)] = 226, - [SMALL_STATE(16)] = 240, - [SMALL_STATE(17)] = 251, - [SMALL_STATE(18)] = 262, - [SMALL_STATE(19)] = 273, - [SMALL_STATE(20)] = 282, - [SMALL_STATE(21)] = 293, - [SMALL_STATE(22)] = 304, - [SMALL_STATE(23)] = 315, - [SMALL_STATE(24)] = 324, - [SMALL_STATE(25)] = 333, - [SMALL_STATE(26)] = 341, - [SMALL_STATE(27)] = 349, - [SMALL_STATE(28)] = 357, - [SMALL_STATE(29)] = 365, - [SMALL_STATE(30)] = 373, - [SMALL_STATE(31)] = 381, - [SMALL_STATE(32)] = 389, - [SMALL_STATE(33)] = 397, - [SMALL_STATE(34)] = 405, - [SMALL_STATE(35)] = 413, - [SMALL_STATE(36)] = 421, - [SMALL_STATE(37)] = 429, - [SMALL_STATE(38)] = 437, - [SMALL_STATE(39)] = 445, - [SMALL_STATE(40)] = 453, - [SMALL_STATE(41)] = 461, - [SMALL_STATE(42)] = 468, + [SMALL_STATE(3)] = 34, + [SMALL_STATE(4)] = 65, + [SMALL_STATE(5)] = 96, + [SMALL_STATE(6)] = 124, + [SMALL_STATE(7)] = 152, + [SMALL_STATE(8)] = 163, + [SMALL_STATE(9)] = 174, + [SMALL_STATE(10)] = 191, + [SMALL_STATE(11)] = 205, + [SMALL_STATE(12)] = 219, + [SMALL_STATE(13)] = 233, + [SMALL_STATE(14)] = 243, + [SMALL_STATE(15)] = 257, + [SMALL_STATE(16)] = 271, + [SMALL_STATE(17)] = 285, + [SMALL_STATE(18)] = 299, + [SMALL_STATE(19)] = 313, + [SMALL_STATE(20)] = 323, + [SMALL_STATE(21)] = 337, + [SMALL_STATE(22)] = 351, + [SMALL_STATE(23)] = 365, + [SMALL_STATE(24)] = 375, + [SMALL_STATE(25)] = 385, + [SMALL_STATE(26)] = 396, + [SMALL_STATE(27)] = 407, + [SMALL_STATE(28)] = 416, + [SMALL_STATE(29)] = 425, + [SMALL_STATE(30)] = 436, + [SMALL_STATE(31)] = 447, + [SMALL_STATE(32)] = 456, + [SMALL_STATE(33)] = 467, + [SMALL_STATE(34)] = 476, + [SMALL_STATE(35)] = 484, + [SMALL_STATE(36)] = 492, + [SMALL_STATE(37)] = 500, + [SMALL_STATE(38)] = 508, + [SMALL_STATE(39)] = 516, + [SMALL_STATE(40)] = 524, + [SMALL_STATE(41)] = 532, + [SMALL_STATE(42)] = 540, + [SMALL_STATE(43)] = 548, + [SMALL_STATE(44)] = 556, + [SMALL_STATE(45)] = 564, + [SMALL_STATE(46)] = 572, + [SMALL_STATE(47)] = 580, + [SMALL_STATE(48)] = 588, + [SMALL_STATE(49)] = 595, }; static const TSParseActionEntry ts_parse_actions[] = { @@ -1189,54 +1346,59 @@ static const TSParseActionEntry ts_parse_actions[] = { [1] = {.entry = {.count = 1, .reusable = false}}, RECOVER(), [3] = {.entry = {.count = 1, .reusable = true}}, SHIFT_EXTRA(), [5] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source_file, 0), - [7] = {.entry = {.count = 1, .reusable = false}}, SHIFT(41), - [9] = {.entry = {.count = 1, .reusable = false}}, SHIFT(38), - [11] = {.entry = {.count = 1, .reusable = true}}, SHIFT(5), - [13] = {.entry = {.count = 1, .reusable = true}}, SHIFT(3), - [15] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_fields, 2), - [17] = {.entry = {.count = 1, .reusable = true}}, SHIFT(10), - [19] = {.entry = {.count = 1, .reusable = true}}, SHIFT(14), - [21] = {.entry = {.count = 1, .reusable = true}}, SHIFT(13), - [23] = {.entry = {.count = 1, .reusable = true}}, SHIFT(8), - [25] = {.entry = {.count = 1, .reusable = true}}, SHIFT(36), - [27] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_fields, 2), - [29] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_struct, 3), - [31] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_struct, 2), - [33] = {.entry = {.count = 1, .reusable = true}}, SHIFT(27), - [35] = {.entry = {.count = 1, .reusable = true}}, SHIFT(35), - [37] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_boolean, 1), - [39] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list, 3), - [41] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_qualified_identifier_repeat1, 2), SHIFT_REPEAT(27), - [44] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_qualified_identifier_repeat1, 2), - [46] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list, 2), - [48] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_input_node, 1), - [50] = {.entry = {.count = 1, .reusable = true}}, SHIFT(28), - [52] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_fields, 1), - [54] = {.entry = {.count = 1, .reusable = true}}, SHIFT(2), - [56] = {.entry = {.count = 1, .reusable = true}}, SHIFT(38), - [58] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_fields, 1), - [60] = {.entry = {.count = 1, .reusable = true}}, SHIFT(6), - [62] = {.entry = {.count = 1, .reusable = true}}, SHIFT(15), - [64] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_field, 1), - [66] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_field, 3), - [68] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_use_clause, 5), - [70] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_fields, 3), - [72] = {.entry = {.count = 1, .reusable = true}}, SHIFT(19), - [74] = {.entry = {.count = 1, .reusable = true}}, SHIFT(34), - [76] = {.entry = {.count = 1, .reusable = true}}, ACCEPT_INPUT(), - [78] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source_file, 2, .production_id = 1), - [80] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source_file, 3, .production_id = 2), - [82] = {.entry = {.count = 1, .reusable = true}}, SHIFT(11), - [84] = {.entry = {.count = 1, .reusable = true}}, SHIFT(7), - [86] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_qualified_identifier, 3), - [88] = {.entry = {.count = 1, .reusable = true}}, SHIFT(39), - [90] = {.entry = {.count = 1, .reusable = true}}, SHIFT(4), - [92] = {.entry = {.count = 1, .reusable = true}}, SHIFT(42), - [94] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_operation_name, 1), - [96] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_qualified_identifier, 4), - [98] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_fields, 3), - [100] = {.entry = {.count = 1, .reusable = true}}, SHIFT(37), - [102] = {.entry = {.count = 1, .reusable = true}}, SHIFT(22), + [7] = {.entry = {.count = 1, .reusable = false}}, SHIFT(49), + [9] = {.entry = {.count = 1, .reusable = false}}, SHIFT(47), + [11] = {.entry = {.count = 1, .reusable = true}}, SHIFT(9), + [13] = {.entry = {.count = 1, .reusable = true}}, SHIFT(2), + [15] = {.entry = {.count = 1, .reusable = true}}, SHIFT(13), + [17] = {.entry = {.count = 1, .reusable = true}}, SHIFT(19), + [19] = {.entry = {.count = 1, .reusable = true}}, SHIFT(23), + [21] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_fields, 3), + [23] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_fields, 2), + [25] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_struct, 3, .production_id = 4), + [27] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_struct, 2), + [29] = {.entry = {.count = 1, .reusable = true}}, SHIFT(8), + [31] = {.entry = {.count = 1, .reusable = true}}, SHIFT(34), + [33] = {.entry = {.count = 1, .reusable = true}}, SHIFT(3), + [35] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_qualified_identifier_repeat1, 2), SHIFT_REPEAT(44), + [38] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_qualified_identifier_repeat1, 2), + [40] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_fields, 1), + [42] = {.entry = {.count = 1, .reusable = true}}, SHIFT(4), + [44] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list, 2), + [46] = {.entry = {.count = 1, .reusable = true}}, SHIFT(44), + [48] = {.entry = {.count = 1, .reusable = true}}, SHIFT(39), + [50] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_fields_repeat1, 2), + [52] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_fields_repeat1, 2), SHIFT_REPEAT(25), + [55] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_fields, 1), + [57] = {.entry = {.count = 1, .reusable = true}}, SHIFT(20), + [59] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_fields, 3), + [61] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_list_fields_repeat1, 2), + [63] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_list_fields_repeat1, 2), SHIFT_REPEAT(5), + [66] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_boolean, 1), + [68] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_fields, 2), + [70] = {.entry = {.count = 1, .reusable = true}}, SHIFT(17), + [72] = {.entry = {.count = 1, .reusable = true}}, SHIFT(41), + [74] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_input_node, 1), + [76] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list, 3, .production_id = 8), + [78] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_field, 3, .production_id = 6), + [80] = {.entry = {.count = 1, .reusable = true}}, SHIFT(47), + [82] = {.entry = {.count = 1, .reusable = true}}, SHIFT(22), + [84] = {.entry = {.count = 1, .reusable = true}}, SHIFT(6), + [86] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source_file, 3, .production_id = 3), + [88] = {.entry = {.count = 1, .reusable = true}}, SHIFT(24), + [90] = {.entry = {.count = 1, .reusable = true}}, SHIFT(7), + [92] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_qualified_identifier, 3, .production_id = 7), + [94] = {.entry = {.count = 1, .reusable = true}}, SHIFT(43), + [96] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source_file, 2, .production_id = 2), + [98] = {.entry = {.count = 1, .reusable = true}}, SHIFT(38), + [100] = {.entry = {.count = 1, .reusable = true}}, SHIFT(48), + [102] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_qualified_identifier, 4, .production_id = 9), + [104] = {.entry = {.count = 1, .reusable = true}}, SHIFT(33), + [106] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_use_clause, 5, .production_id = 5), + [108] = {.entry = {.count = 1, .reusable = true}}, ACCEPT_INPUT(), + [110] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_operation_name, 1, .production_id = 1), + [112] = {.entry = {.count = 1, .reusable = true}}, SHIFT(30), + [114] = {.entry = {.count = 1, .reusable = true}}, SHIFT(42), }; #ifdef __cplusplus From 4b322528df1f9368fd262771f1b700c4b87d5654 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 16 Aug 2022 03:17:00 +0200 Subject: [PATCH 005/105] wip --- .../playground/smithyql/ParserAdapter.scala | 116 +++++++++++++----- 1 file changed, 88 insertions(+), 28 deletions(-) diff --git a/core/src/main/scala/playground/smithyql/ParserAdapter.scala b/core/src/main/scala/playground/smithyql/ParserAdapter.scala index 1f3235cf..f47e42b2 100644 --- a/core/src/main/scala/playground/smithyql/ParserAdapter.scala +++ b/core/src/main/scala/playground/smithyql/ParserAdapter.scala @@ -8,6 +8,8 @@ import cats.implicits._ import java.io.Closeable import scala.util.Using import cats.data.NonEmptyList +import cats.Id +import cats.Monad object ParserAdapter { @@ -51,37 +53,93 @@ object ParserAdapter { .map(_.getType()) .mkString(", ") - case class QualifiedIdentifier( - path: NonEmptyList[Identifier], - selection: Identifier, - ) + object ast { - case class UseClause( - ident: QualifiedIdentifier - ) + case class QualifiedIdentifier[F[_]]( + path: F[NonEmptyList[Identifier[F]]], + selection: F[Identifier[F]], + ) { - case class Op( - useClause: Option[UseClause], - name: String, - input: Struct, - ) + def sequenceK( + implicit F: Monad[F] + ): F[QualifiedIdentifier[Id]] = + ( + path.flatMap(_.nonEmptyTraverse(_.sequenceK)), + selection.flatMap(_.sequenceK), + ) + .mapN(QualifiedIdentifier.apply[Id]) + + } + + case class UseClause[F[_]]( + ident: F[QualifiedIdentifier[F]] + ) + + case class Op[F[_]]( + useClause: F[Option[UseClause[F]]], + name: F[String], + input: F[Struct[F]], + ) + + case class Identifier[F[_]](value: F[String]) { + def sequenceK(implicit F: Monad[F]): F[Identifier[Id]] = value.map(Identifier.apply[Id]) + } + + case class Field[F[_]](identifier: F[Identifier[F]], inputNode: F[InputNode[F]]) + case class Fields[F[_]](fields: F[List[Field[F]]]) + case class Struct[F[_]](fields: F[Option[Fields[F]]]) + case class ListItems[F[_]](items: F[List[InputNode[F]]]) + case class Listed[F[_]](items: F[Option[ListItems[F]]]) + sealed trait InputNode[F[_]] + + object InputNode { + case class StructCase[F[_]](s: Struct[F]) extends InputNode[F] + case class ListCase[F[_]](l: Listed[F]) extends InputNode[F] + case class NumberCase[F[_]](n: F[String]) extends InputNode[F] + case class StringCase[F[_]](n: F[String]) extends InputNode[F] + case class BoolCase[F[_]](v: F[Boolean]) extends InputNode[F] + case class NullCase[F[_]]() extends InputNode[F] + } + + } + + object ast1 { + + type QualifiedIdentifier = ast.QualifiedIdentifier[Id] + val QualifiedIdentifier = ast.QualifiedIdentifier[Id] + type UseClause = ast.UseClause[Id] + val UseClause = ast.UseClause[Id] + type Op = ast.Op[Id] + val Op = ast.Op[Id] + type Identifier = ast.Identifier[Id] + val Identifier = ast.Identifier[Id] + type Field = ast.Field[Id] + val Field = ast.Field[Id] + type Fields = ast.Fields[Id] + val Fields = ast.Fields[Id] + type Struct = ast.Struct[Id] + val Struct = ast.Struct[Id] + type ListItems = ast.ListItems[Id] + val ListItems = ast.ListItems[Id] + type Listed = ast.Listed[Id] + val Listed = ast.Listed[Id] + type InputNode = ast.InputNode[Id] + + object InputNode { + type StructCase = ast.InputNode.StructCase[Id] + val StructCase = ast.InputNode.StructCase[Id] + type ListCase = ast.InputNode.ListCase[Id] + val ListCase = ast.InputNode.ListCase[Id] + type NumberCase = ast.InputNode.NumberCase[Id] + val NumberCase = ast.InputNode.NumberCase[Id] + type StringCase = ast.InputNode.StringCase[Id] + val StringCase = ast.InputNode.StringCase[Id] + type BoolCase = ast.InputNode.BoolCase[Id] + val BoolCase = ast.InputNode.BoolCase[Id] + type NullCase = ast.InputNode.NullCase[Id] + val NullCase = ast.InputNode.NullCase[Id]() + } - case class Identifier(value: String) - - case class Field(identifier: Identifier, inputNode: InputNode) - case class Fields(fields: List[Field]) - case class Struct(fields: Option[Fields]) - case class ListItems(items: List[InputNode]) - case class Listed(items: Option[ListItems]) - sealed trait InputNode - - object InputNode { - case class StructCase(s: Struct) extends InputNode - case class ListCase(l: Listed) extends InputNode - case class NumberCase(n: String) extends InputNode - case class StringCase(n: String) extends InputNode - case class BoolCase(v: Boolean) extends InputNode - case object NullCase extends InputNode } def union[A](decoders: (String, Node => A)*): Node => A = @@ -90,6 +148,8 @@ object ParserAdapter { .collectFirstSome { case (key, v) => downTypeOpt(key)(node).map(v) } .getOrElse(sys.error("missing case: " + childTypes(node))) + import ast1._ + class OpDecoders(src: String) { def text(node: Node) = src.substring(node.getStartByte(), node.getEndByte()) From bf09246449f5b097166e106706e5fc5cff3005c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 16 Aug 2022 03:38:13 +0200 Subject: [PATCH 006/105] reintroduce NodeDecoder --- .../playground/smithyql/ParserAdapter.scala | 143 ++++++++++-------- 1 file changed, 83 insertions(+), 60 deletions(-) diff --git a/core/src/main/scala/playground/smithyql/ParserAdapter.scala b/core/src/main/scala/playground/smithyql/ParserAdapter.scala index f47e42b2..ff9d0f55 100644 --- a/core/src/main/scala/playground/smithyql/ParserAdapter.scala +++ b/core/src/main/scala/playground/smithyql/ParserAdapter.scala @@ -10,6 +10,10 @@ import scala.util.Using import cats.data.NonEmptyList import cats.Id import cats.Monad +import cats.Applicative +import scala.util.matching.Regex +import cats.~> +import cats.StackSafeMonad object ParserAdapter { @@ -19,40 +23,6 @@ object ParserAdapter { def release(resource: Closeable): Unit = resource.close() } - def children(node: Node): List[Node] = List.tabulate(node.getChildCount())(node.getChild(_)) - - def downType( - tpe: String - )( - node: Node - ): Node = downTypeOpt(tpe)(node) - .getOrElse( - sys.error( - "no children with type " + tpe + ", existing types: " + children(node) - .map(_.getType()) - .mkString(",") - ) - ) - - def downTypeAll( - tpe: String - )( - node: Node - ): List[Node] = children(node).filter(_.getType() == tpe) - - def downTypeOpt( - tpe: String - )( - node: Node - ): Option[Node] = children(node) - .find(_.getType() == tpe) - - def childTypes( - node: Node - ): String = children(node) - .map(_.getType()) - .mkString(", ") - object ast { case class QualifiedIdentifier[F[_]]( @@ -142,72 +112,125 @@ object ParserAdapter { } - def union[A](decoders: (String, Node => A)*): Node => A = - node => - decoders - .collectFirstSome { case (key, v) => downTypeOpt(key)(node).map(v) } - .getOrElse(sys.error("missing case: " + childTypes(node))) - import ast1._ + trait NodeDecoder[+A] { + def decode(node: Node): A + def >>>[B](another: NodeDecoder[B])(implicit aIsNode: A <:< Node): NodeDecoder[B] = + node => another.decode(decode(node)) + } + + object NodeDecoder { + + implicit val instances: Monad[NodeDecoder] = + new StackSafeMonad[NodeDecoder] { + + def flatMap[A, B](fa: NodeDecoder[A])(f: A => NodeDecoder[B]): NodeDecoder[B] = { node => + f(fa.decode(node)).decode(node) + } + + def pure[A](x: A): NodeDecoder[A] = _ => x + + } + + val children: NodeDecoder[List[Node]] = + node => List.tabulate(node.getChildCount())(node.getChild(_)) + + def downType( + tpe: String + ): NodeDecoder[Node] = + node => + downTypeOpt(tpe) + .decode(node) + .getOrElse( + sys.error( + "no children with type " + tpe + ", existing types: " + children + .decode(node) + .map(_.getType()) + .mkString(",") + ) + ) + + def downTypeAll( + tpe: String + ): NodeDecoder[List[Node]] = children.map(_.filter(_.getType() == tpe)) + + def downTypeOpt( + tpe: String + ): NodeDecoder[Option[Node]] = children + .map(_.find(_.getType() == tpe)) + + def childTypes: NodeDecoder[String] = children + .map(_.map(_.getType()).mkString(", ")) + + def union[A](decoders: (String, NodeDecoder[A])*): NodeDecoder[A] = + node => + decoders + .collectFirstSome { case (key, v) => downTypeOpt(key).decode(node).map(v.decode) } + .getOrElse(sys.error("missing case: " + childTypes.decode(node))) + + } + class OpDecoders(src: String) { - def text(node: Node) = src.substring(node.getStartByte(), node.getEndByte()) + import NodeDecoder._ + + val text: NodeDecoder[String] = node => src.substring(node.getStartByte(), node.getEndByte()) - val identifier: Node => Identifier = text.map(Identifier(_)) + val identifier: NodeDecoder[Identifier] = text.map(Identifier(_)) - val listItems: Node => ListItems = downTypeAll("input_node") - .map(_.map(inputNode)) + val listItems: NodeDecoder[ListItems] = downTypeAll("input_node") + .map(_.map(inputNode.decode)) .map(ListItems.apply) - val listed: Node => Listed = downTypeOpt("list_fields") - .map(_.map(listItems)) + val listed: NodeDecoder[Listed] = downTypeOpt("list_fields") + .map(_.map(listItems.decode)) .map(Listed.apply) - val bool: Node => Boolean = text + val bool: NodeDecoder[Boolean] = text .map(_.toBoolean) - lazy val inputNode: Node => InputNode = union( + lazy val inputNode: NodeDecoder[InputNode] = union( "number" -> text.map(InputNode.NumberCase(_)), "string" -> text.map(InputNode.StringCase(_)), - "null" -> Function.const(InputNode.NullCase), + "null" -> InputNode.NullCase.pure[NodeDecoder], "struct" -> struct.map(InputNode.StructCase(_)), "list" -> listed.map(InputNode.ListCase(_)), "boolean" -> bool.map(InputNode.BoolCase(_)), ) - val field: Node => Field = + val field: NodeDecoder[Field] = ( downType("identifier") >>> identifier, downType("input_node") >>> inputNode, ).mapN(Field.apply) - val fields: Node => Fields = downTypeAll("field") - .map(_.map(field)) + val fields: NodeDecoder[Fields] = downTypeAll("field") + .map(_.map(field.decode)) .map(Fields.apply) - lazy val struct: Node => Struct = downTypeOpt("fields") - .map(_.map(fields)) + lazy val struct: NodeDecoder[Struct] = downTypeOpt("fields") + .map(_.map(fields.decode)) .map(Struct.apply) - val qualifiedIdentifier: Node => QualifiedIdentifier = downTypeAll("identifier") + val qualifiedIdentifier: NodeDecoder[QualifiedIdentifier] = downTypeAll("identifier") .map { case _ :: Nil | Nil => sys.error("no ident??") case all => val prefix = NonEmptyList.fromListUnsafe(all.init) - QualifiedIdentifier(prefix.map(identifier), identifier(all.last)) + QualifiedIdentifier(prefix.map(identifier.decode), identifier.decode(all.last)) } - val useClause: Node => UseClause = + val useClause: NodeDecoder[UseClause] = ( downType("qualified_identifier") >>> qualifiedIdentifier ) .map(UseClause) - val op: Node => Op = + val op: NodeDecoder[Op] = ( - downTypeOpt("use_clause").map(_.map(useClause)), + downTypeOpt("use_clause").map(_.map(useClause.decode)), downType("operation_name") >>> downType("identifier") >>> text, @@ -222,7 +245,7 @@ object ParserAdapter { val p = new Parser() p.setLanguage(Languages.smithyql()) Using.resource(p.parseString(s)) { tree => - new OpDecoders(s).op(tree.getRootNode()) + new OpDecoders(s).op.decode(tree.getRootNode()) } } From a81baa9149a6a98f36952ee124f8a1e6fcb9467a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 16 Aug 2022 14:39:31 +0200 Subject: [PATCH 007/105] wip field extraction --- build.sbt | 2 +- .../playground/smithyql/ParserAdapter.scala | 167 +++++++++--------- 2 files changed, 88 insertions(+), 81 deletions(-) diff --git a/build.sbt b/build.sbt index 0fa66f12..91966c91 100644 --- a/build.sbt +++ b/build.sbt @@ -71,7 +71,7 @@ lazy val core = project "org.typelevel" %% "cats-parse" % "0.3.8", "org.typelevel" %% "paiges-cats" % "0.4.2", "com.softwaremill.diffx" %% "diffx-core" % "0.7.1" % Test, - "ai.serenade" % "java-tree-sitter" % "1.1.2", + "ai.serenade" % "java-tree-sitter" % "1.1.3-SNAPSHOT", ), commonSettings, Smithy4sCodegenPlugin.defaultSettings(Test), diff --git a/core/src/main/scala/playground/smithyql/ParserAdapter.scala b/core/src/main/scala/playground/smithyql/ParserAdapter.scala index ff9d0f55..f78598a9 100644 --- a/core/src/main/scala/playground/smithyql/ParserAdapter.scala +++ b/core/src/main/scala/playground/smithyql/ParserAdapter.scala @@ -3,17 +3,15 @@ package playground.smithyql import ai.serenade.treesitter.Languages import ai.serenade.treesitter.Node import ai.serenade.treesitter.Parser +import cats.Id +import cats.Monad +import cats.StackSafeMonad +import cats.data.NonEmptyList import cats.implicits._ import java.io.Closeable import scala.util.Using -import cats.data.NonEmptyList -import cats.Id -import cats.Monad -import cats.Applicative -import scala.util.matching.Regex -import cats.~> -import cats.StackSafeMonad +import ai.serenade.treesitter.TreeSitter object ParserAdapter { @@ -47,7 +45,7 @@ object ParserAdapter { case class Op[F[_]]( useClause: F[Option[UseClause[F]]], - name: F[String], + name: F[Identifier[F]], input: F[Struct[F]], ) @@ -115,137 +113,146 @@ object ParserAdapter { import ast1._ trait NodeDecoder[+A] { - def decode(node: Node): A - def >>>[B](another: NodeDecoder[B])(implicit aIsNode: A <:< Node): NodeDecoder[B] = - node => another.decode(decode(node)) + + def decode(node: Node, text: String): A + + def text: NodeDecoder[String] = + (node, src) => src.substring(node.getStartByte(), node.getEndByte()) + + def firstMatch[B](implicit ev: A <:< List[B]): NodeDecoder[Option[B]] = this.map { + _.headOption + } + + def unNone[B]( + implicit ev: A <:< Option[B] + ): NodeDecoder[B] = this.map(_.getOrElse(sys.error("missing item"))) + + def atType( + tpe: String + ): NodeDecoder[A] = atTypeOpt(tpe).unNone + + def atTypeOpt( + tpe: String + ): NodeDecoder[Option[A]] = atTypeSeq(tpe).firstMatch + + def atTypeSeq(tpe: String): NodeDecoder[List[A]] = + (node, text) => + NodeDecoder + .children + .map(_.filter(_.getType() == tpe)) + .map(_.map(this.decode(_, text))) + .decode(node, text) + } object NodeDecoder { + val id: NodeDecoder[Node] = (node, _) => node implicit val instances: Monad[NodeDecoder] = new StackSafeMonad[NodeDecoder] { - def flatMap[A, B](fa: NodeDecoder[A])(f: A => NodeDecoder[B]): NodeDecoder[B] = { node => - f(fa.decode(node)).decode(node) + def flatMap[A, B]( + fa: NodeDecoder[A] + )( + f: A => NodeDecoder[B] + ): NodeDecoder[B] = { (node, text) => + f(fa.decode(node, text)).decode(node, text) } - def pure[A](x: A): NodeDecoder[A] = _ => x + def pure[A](x: A): NodeDecoder[A] = (_, _) => x } val children: NodeDecoder[List[Node]] = - node => List.tabulate(node.getChildCount())(node.getChild(_)) - - def downType( - tpe: String - ): NodeDecoder[Node] = - node => - downTypeOpt(tpe) - .decode(node) - .getOrElse( - sys.error( - "no children with type " + tpe + ", existing types: " + children - .decode(node) - .map(_.getType()) - .mkString(",") - ) - ) - - def downTypeAll( - tpe: String - ): NodeDecoder[List[Node]] = children.map(_.filter(_.getType() == tpe)) - - def downTypeOpt( - tpe: String - ): NodeDecoder[Option[Node]] = children - .map(_.find(_.getType() == tpe)) + (node, _) => List.tabulate(node.getChildCount())(node.getChild(_)) - def childTypes: NodeDecoder[String] = children + val childTypes: NodeDecoder[String] = children .map(_.map(_.getType()).mkString(", ")) def union[A](decoders: (String, NodeDecoder[A])*): NodeDecoder[A] = - node => + (node, text) => decoders - .collectFirstSome { case (key, v) => downTypeOpt(key).decode(node).map(v.decode) } - .getOrElse(sys.error("missing case: " + childTypes.decode(node))) + .collectFirstSome { case (key, v) => v.atTypeOpt(key).decode(node, text) } + .getOrElse(sys.error("missing case: " + childTypes.decode(node, text))) + + val text: NodeDecoder[String] = id.text + + implicit final class NodeDecoderOps[A](nd: => NodeDecoder[A]) { + def deferred: NodeDecoder[A] = nd.decode(_, _) + } } - class OpDecoders(src: String) { + object OpDecoders { import NodeDecoder._ - - val text: NodeDecoder[String] = node => src.substring(node.getStartByte(), node.getEndByte()) + import NodeDecoder.NodeDecoderOps val identifier: NodeDecoder[Identifier] = text.map(Identifier(_)) - val listItems: NodeDecoder[ListItems] = downTypeAll("input_node") - .map(_.map(inputNode.decode)) + val listItems: NodeDecoder[ListItems] = inputNode + .atTypeSeq("input_node") .map(ListItems.apply) - val listed: NodeDecoder[Listed] = downTypeOpt("list_fields") - .map(_.map(listItems.decode)) + val listed: NodeDecoder[Listed] = listItems + .atTypeOpt("list_fields") .map(Listed.apply) val bool: NodeDecoder[Boolean] = text .map(_.toBoolean) - lazy val inputNode: NodeDecoder[InputNode] = union( - "number" -> text.map(InputNode.NumberCase(_)), - "string" -> text.map(InputNode.StringCase(_)), - "null" -> InputNode.NullCase.pure[NodeDecoder], - "struct" -> struct.map(InputNode.StructCase(_)), - "list" -> listed.map(InputNode.ListCase(_)), - "boolean" -> bool.map(InputNode.BoolCase(_)), - ) + lazy val inputNode: NodeDecoder[InputNode] = + union( + "number" -> text.map(InputNode.NumberCase(_)), + "string" -> text.map(InputNode.StringCase(_)), + "null" -> InputNode.NullCase.pure[NodeDecoder], + "struct" -> struct.map(InputNode.StructCase(_)), + "list" -> listed.map(InputNode.ListCase(_)), + "boolean" -> bool.map(InputNode.BoolCase(_)), + ).deferred val field: NodeDecoder[Field] = ( - downType("identifier") >>> identifier, - downType("input_node") >>> inputNode, + identifier.atType("identifier"), + inputNode.atType("input_node"), ).mapN(Field.apply) - val fields: NodeDecoder[Fields] = downTypeAll("field") - .map(_.map(field.decode)) + val fields: NodeDecoder[Fields] = field + .atTypeSeq("field") .map(Fields.apply) - lazy val struct: NodeDecoder[Struct] = downTypeOpt("fields") - .map(_.map(fields.decode)) + val struct: NodeDecoder[Struct] = fields + .atTypeOpt("fields") .map(Struct.apply) - val qualifiedIdentifier: NodeDecoder[QualifiedIdentifier] = downTypeAll("identifier") + val qualifiedIdentifier: NodeDecoder[QualifiedIdentifier] = identifier + .atTypeSeq("identifier") .map { case _ :: Nil | Nil => sys.error("no ident??") case all => val prefix = NonEmptyList.fromListUnsafe(all.init) - QualifiedIdentifier(prefix.map(identifier.decode), identifier.decode(all.last)) + QualifiedIdentifier(prefix, all.last) } - val useClause: NodeDecoder[UseClause] = - ( - downType("qualified_identifier") >>> - qualifiedIdentifier - ) - .map(UseClause) + val useClause: NodeDecoder[UseClause] = qualifiedIdentifier + .atType("qualified_identifier") + .map(UseClause) val op: NodeDecoder[Op] = ( - downTypeOpt("use_clause").map(_.map(useClause.decode)), - downType("operation_name") >>> - downType("identifier") >>> - text, - downType("struct") >>> - struct, + useClause.atTypeOpt("use_clause"), + identifier.atType("operation_name"), + struct.atType("struct"), ).mapN(Op.apply) } def parse(s: String) = { - val p = new Parser() p.setLanguage(Languages.smithyql()) Using.resource(p.parseString(s)) { tree => - new OpDecoders(s).op.decode(tree.getRootNode()) + println(tree.getRootNode().getChildByFieldName("operation_name").getType()) + OpDecoders.op.decode(tree.getRootNode(), s) } } From 1380ee851c90588103ef2978ac710433167a831d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Sun, 11 Sep 2022 05:05:00 +0200 Subject: [PATCH 008/105] Support raw service references --- .../corpus/service-reference.txt | 14 + tree-sitter-smithyql/grammar.js | 6 +- tree-sitter-smithyql/src/grammar.json | 42 +- tree-sitter-smithyql/src/node-types.json | 14 + tree-sitter-smithyql/src/parser.c | 634 ++++++++++-------- 5 files changed, 408 insertions(+), 302 deletions(-) create mode 100644 tree-sitter-smithyql/corpus/service-reference.txt diff --git a/tree-sitter-smithyql/corpus/service-reference.txt b/tree-sitter-smithyql/corpus/service-reference.txt new file mode 100644 index 00000000..39779974 --- /dev/null +++ b/tree-sitter-smithyql/corpus/service-reference.txt @@ -0,0 +1,14 @@ +================================================================================ +Service reference +================================================================================ +namespace#Service.OpName {} +-------------------------------------------------------------------------------- + +(source_file + (operation_name + (qualified_identifier + (identifier) + (identifier)) + (identifier)) + (whitespace) + (struct)) diff --git a/tree-sitter-smithyql/grammar.js b/tree-sitter-smithyql/grammar.js index 50e3cbf8..b4dd67f2 100644 --- a/tree-sitter-smithyql/grammar.js +++ b/tree-sitter-smithyql/grammar.js @@ -37,7 +37,11 @@ module.exports = grammar({ field("selection", $.identifier) ), - operation_name: ($) => field("name", $.identifier), + operation_name: ($) => + seq( + field("identifier", optional(seq($.qualified_identifier, "."))), + field("name", $.identifier) + ), input_node: ($) => choice($.struct, $.list, $.number, $.string, $.boolean, $.null), diff --git a/tree-sitter-smithyql/src/grammar.json b/tree-sitter-smithyql/src/grammar.json index 48ef5698..c8f6e389 100644 --- a/tree-sitter-smithyql/src/grammar.json +++ b/tree-sitter-smithyql/src/grammar.json @@ -121,12 +121,42 @@ ] }, "operation_name": { - "type": "FIELD", - "name": "name", - "content": { - "type": "SYMBOL", - "name": "identifier" - } + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "identifier", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "qualified_identifier" + }, + { + "type": "STRING", + "value": "." + } + ] + }, + { + "type": "BLANK" + } + ] + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "SYMBOL", + "name": "identifier" + } + } + ] }, "input_node": { "type": "CHOICE", diff --git a/tree-sitter-smithyql/src/node-types.json b/tree-sitter-smithyql/src/node-types.json index a7e8fcdd..e64e19a7 100644 --- a/tree-sitter-smithyql/src/node-types.json +++ b/tree-sitter-smithyql/src/node-types.json @@ -115,6 +115,20 @@ "type": "operation_name", "named": true, "fields": { + "identifier": { + "multiple": true, + "required": false, + "types": [ + { + "type": ".", + "named": false + }, + { + "type": "qualified_identifier", + "named": true + } + ] + }, "name": { "multiple": false, "required": true, diff --git a/tree-sitter-smithyql/src/parser.c b/tree-sitter-smithyql/src/parser.c index b1def446..c092b9c0 100644 --- a/tree-sitter-smithyql/src/parser.c +++ b/tree-sitter-smithyql/src/parser.c @@ -6,7 +6,7 @@ #endif #define LANGUAGE_VERSION 13 -#define STATE_COUNT 50 +#define STATE_COUNT 53 #define LARGE_STATE_COUNT 2 #define SYMBOL_COUNT 33 #define ALIAS_COUNT 0 @@ -14,7 +14,7 @@ #define EXTERNAL_TOKEN_COUNT 0 #define FIELD_COUNT 12 #define MAX_ALIAS_SEQUENCE_LENGTH 5 -#define PRODUCTION_ID_COUNT 10 +#define PRODUCTION_ID_COUNT 11 enum { anon_sym_use = 1, @@ -292,13 +292,14 @@ static const char * const ts_field_names[] = { static const TSFieldMapSlice ts_field_map_slices[PRODUCTION_ID_COUNT] = { [1] = {.index = 0, .length = 1}, [2] = {.index = 1, .length = 2}, - [3] = {.index = 3, .length = 3}, - [4] = {.index = 6, .length = 1}, - [5] = {.index = 7, .length = 1}, - [6] = {.index = 8, .length = 2}, - [7] = {.index = 10, .length = 2}, - [8] = {.index = 12, .length = 1}, - [9] = {.index = 13, .length = 3}, + [3] = {.index = 3, .length = 2}, + [4] = {.index = 5, .length = 3}, + [5] = {.index = 8, .length = 3}, + [6] = {.index = 11, .length = 3}, + [7] = {.index = 14, .length = 1}, + [8] = {.index = 15, .length = 1}, + [9] = {.index = 16, .length = 2}, + [10] = {.index = 18, .length = 1}, }; static const TSFieldMapEntry ts_field_map_entries[] = { @@ -308,25 +309,29 @@ static const TSFieldMapEntry ts_field_map_entries[] = { {field_input, 1}, {field_operation_name, 0}, [3] = + {field_head, 0}, + {field_selection, 2}, + [5] = {field_input, 2}, {field_operation_name, 1}, {field_use_clause, 0}, - [6] = + [8] = + {field_identifier, 0}, + {field_identifier, 1}, + {field_name, 2}, + [11] = + {field_head, 0}, + {field_selection, 3}, + {field_tail, 1}, + [14] = {field_fields, 1}, - [7] = + [15] = {field_identifier, 4}, - [8] = + [16] = {field_key, 0}, {field_value, 2}, - [10] = - {field_head, 0}, - {field_selection, 2}, - [12] = + [18] = {field_list_fields, 1}, - [13] = - {field_head, 0}, - {field_selection, 3}, - {field_tail, 1}, }; static const TSSymbol ts_alias_sequences[PRODUCTION_ID_COUNT][MAX_ALIAS_SEQUENCE_LENGTH] = { @@ -393,6 +398,7 @@ static bool ts_lex(TSLexer *lexer, TSStateId state) { if (lookahead != 0) ADVANCE(2); END_STATE(); case 3: + if (lookahead == '.') ADVANCE(31); if (lookahead == '/') ADVANCE(4); if (lookahead == '}') ADVANCE(34); if (lookahead == '\t' || @@ -761,9 +767,9 @@ static const TSLexMode ts_lex_modes[STATE_COUNT] = { [4] = {.lex_state = 1}, [5] = {.lex_state = 1}, [6] = {.lex_state = 1}, - [7] = {.lex_state = 0}, + [7] = {.lex_state = 3}, [8] = {.lex_state = 0}, - [9] = {.lex_state = 3}, + [9] = {.lex_state = 0}, [10] = {.lex_state = 0}, [11] = {.lex_state = 0}, [12] = {.lex_state = 0}, @@ -774,36 +780,39 @@ static const TSLexMode ts_lex_modes[STATE_COUNT] = { [17] = {.lex_state = 3}, [18] = {.lex_state = 0}, [19] = {.lex_state = 0}, - [20] = {.lex_state = 3}, + [20] = {.lex_state = 0}, [21] = {.lex_state = 0}, [22] = {.lex_state = 0}, [23] = {.lex_state = 0}, - [24] = {.lex_state = 0}, + [24] = {.lex_state = 3}, [25] = {.lex_state = 3}, [26] = {.lex_state = 0}, - [27] = {.lex_state = 0}, + [27] = {.lex_state = 3}, [28] = {.lex_state = 0}, - [29] = {.lex_state = 3}, - [30] = {.lex_state = 3}, - [31] = {.lex_state = 0}, - [32] = {.lex_state = 0}, + [29] = {.lex_state = 0}, + [30] = {.lex_state = 0}, + [31] = {.lex_state = 3}, + [32] = {.lex_state = 3}, [33] = {.lex_state = 0}, [34] = {.lex_state = 0}, [35] = {.lex_state = 0}, - [36] = {.lex_state = 0}, - [37] = {.lex_state = 0}, + [36] = {.lex_state = 3}, + [37] = {.lex_state = 3}, [38] = {.lex_state = 3}, [39] = {.lex_state = 3}, [40] = {.lex_state = 0}, [41] = {.lex_state = 3}, - [42] = {.lex_state = 1}, - [43] = {.lex_state = 3}, - [44] = {.lex_state = 3}, + [42] = {.lex_state = 0}, + [43] = {.lex_state = 0}, + [44] = {.lex_state = 0}, [45] = {.lex_state = 3}, - [46] = {.lex_state = 0}, + [46] = {.lex_state = 1}, [47] = {.lex_state = 0}, [48] = {.lex_state = 0}, [49] = {.lex_state = 0}, + [50] = {.lex_state = 0}, + [51] = {.lex_state = 0}, + [52] = {.lex_state = 0}, }; static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { @@ -829,9 +838,10 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym_whitespace] = ACTIONS(3), }, [1] = { - [sym_source_file] = STATE(46), - [sym_use_clause] = STATE(29), - [sym_operation_name] = STATE(26), + [sym_source_file] = STATE(50), + [sym_use_clause] = STATE(25), + [sym_qualified_identifier] = STATE(49), + [sym_operation_name] = STATE(29), [ts_builtin_sym_end] = ACTIONS(5), [anon_sym_use] = ACTIONS(7), [sym_identifier] = ACTIONS(9), @@ -848,9 +858,9 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, ACTIONS(15), 1, anon_sym_RBRACK, - STATE(12), 1, + STATE(13), 1, sym_input_node, - STATE(36), 1, + STATE(42), 1, sym_list_fields, ACTIONS(3), 2, sym_comment, @@ -862,7 +872,7 @@ static const uint16_t ts_small_parse_table[] = { sym_number, sym_string, sym_null, - STATE(23), 3, + STATE(18), 3, sym_struct, sym_list, sym_boolean, @@ -873,7 +883,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, ACTIONS(21), 1, anon_sym_RBRACK, - STATE(31), 1, + STATE(30), 1, sym_input_node, ACTIONS(3), 2, sym_comment, @@ -885,7 +895,7 @@ static const uint16_t ts_small_parse_table[] = { sym_number, sym_string, sym_null, - STATE(23), 3, + STATE(18), 3, sym_struct, sym_list, sym_boolean, @@ -896,7 +906,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, ACTIONS(23), 1, anon_sym_RBRACK, - STATE(31), 1, + STATE(30), 1, sym_input_node, ACTIONS(3), 2, sym_comment, @@ -908,7 +918,7 @@ static const uint16_t ts_small_parse_table[] = { sym_number, sym_string, sym_null, - STATE(23), 3, + STATE(18), 3, sym_struct, sym_list, sym_boolean, @@ -917,7 +927,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACE, ACTIONS(13), 1, anon_sym_LBRACK, - STATE(31), 1, + STATE(34), 1, sym_input_node, ACTIONS(3), 2, sym_comment, @@ -929,7 +939,7 @@ static const uint16_t ts_small_parse_table[] = { sym_number, sym_string, sym_null, - STATE(23), 3, + STATE(18), 3, sym_struct, sym_list, sym_boolean, @@ -938,7 +948,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACE, ACTIONS(13), 1, anon_sym_LBRACK, - STATE(27), 1, + STATE(30), 1, sym_input_node, ACTIONS(3), 2, sym_comment, @@ -950,225 +960,224 @@ static const uint16_t ts_small_parse_table[] = { sym_number, sym_string, sym_null, - STATE(23), 3, + STATE(18), 3, sym_struct, sym_list, sym_boolean, - [152] = 2, + [152] = 5, + ACTIONS(25), 1, + anon_sym_RBRACE, + ACTIONS(27), 1, + sym_identifier, + STATE(26), 1, + sym_field, + STATE(48), 1, + sym_fields, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [169] = 5, + ACTIONS(29), 1, + anon_sym_DOT, + ACTIONS(31), 1, + anon_sym_POUND, + ACTIONS(33), 1, + anon_sym_LBRACE, + STATE(14), 1, + aux_sym_qualified_identifier_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(25), 4, + [186] = 2, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + ACTIONS(35), 4, ts_builtin_sym_end, anon_sym_RBRACE, anon_sym_RBRACK, anon_sym_COMMA, - [163] = 2, + [197] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(27), 4, + ACTIONS(37), 4, ts_builtin_sym_end, anon_sym_RBRACE, anon_sym_RBRACK, anon_sym_COMMA, - [174] = 5, - ACTIONS(29), 1, - anon_sym_RBRACE, - ACTIONS(31), 1, - sym_identifier, - STATE(16), 1, - sym_field, - STATE(37), 1, - sym_fields, + [208] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - [191] = 4, + ACTIONS(39), 3, + anon_sym_RBRACE, + anon_sym_RBRACK, + anon_sym_COMMA, + [218] = 4, ACTIONS(23), 1, anon_sym_RBRACK, - ACTIONS(33), 1, + ACTIONS(41), 1, anon_sym_COMMA, - STATE(18), 1, + STATE(20), 1, aux_sym_list_fields_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - [205] = 4, - ACTIONS(35), 1, - anon_sym_DOT, - ACTIONS(38), 1, - anon_sym_POUND, - STATE(11), 1, - aux_sym_qualified_identifier_repeat1, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [219] = 4, - ACTIONS(40), 1, + [232] = 4, + ACTIONS(43), 1, anon_sym_RBRACK, - ACTIONS(42), 1, + ACTIONS(45), 1, anon_sym_COMMA, - STATE(10), 1, + STATE(12), 1, aux_sym_list_fields_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - [233] = 2, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - ACTIONS(44), 3, - anon_sym_RBRACE, - anon_sym_RBRACK, - anon_sym_COMMA, - [243] = 4, - ACTIONS(46), 1, + [246] = 4, + ACTIONS(29), 1, anon_sym_DOT, - ACTIONS(48), 1, + ACTIONS(47), 1, anon_sym_POUND, - STATE(11), 1, + STATE(22), 1, aux_sym_qualified_identifier_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - [257] = 4, - ACTIONS(50), 1, - anon_sym_RBRACE, - ACTIONS(52), 1, - anon_sym_COMMA, - STATE(15), 1, - aux_sym_fields_repeat1, + [260] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - [271] = 4, - ACTIONS(55), 1, + ACTIONS(49), 3, + anon_sym_RBRACE, + anon_sym_RBRACK, + anon_sym_COMMA, + [270] = 4, + ACTIONS(51), 1, anon_sym_RBRACE, - ACTIONS(57), 1, + ACTIONS(53), 1, anon_sym_COMMA, - STATE(21), 1, + STATE(16), 1, aux_sym_fields_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - [285] = 4, - ACTIONS(31), 1, + [284] = 4, + ACTIONS(27), 1, sym_identifier, - ACTIONS(59), 1, + ACTIONS(56), 1, anon_sym_RBRACE, - STATE(28), 1, + STATE(35), 1, sym_field, ACTIONS(3), 2, sym_comment, sym_whitespace, - [299] = 4, - ACTIONS(61), 1, - anon_sym_RBRACK, - ACTIONS(63), 1, - anon_sym_COMMA, - STATE(18), 1, - aux_sym_list_fields_repeat1, + [298] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - [313] = 2, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - ACTIONS(66), 3, + ACTIONS(58), 3, anon_sym_RBRACE, anon_sym_RBRACK, anon_sym_COMMA, - [323] = 4, - ACTIONS(31), 1, - sym_identifier, - ACTIONS(68), 1, - anon_sym_RBRACE, - STATE(28), 1, - sym_field, + [308] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - [337] = 4, - ACTIONS(68), 1, + ACTIONS(60), 3, anon_sym_RBRACE, - ACTIONS(70), 1, + anon_sym_RBRACK, anon_sym_COMMA, - STATE(15), 1, - aux_sym_fields_repeat1, + [318] = 4, + ACTIONS(62), 1, + anon_sym_RBRACK, + ACTIONS(64), 1, + anon_sym_COMMA, + STATE(20), 1, + aux_sym_list_fields_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - [351] = 4, - ACTIONS(46), 1, + [332] = 4, + ACTIONS(29), 1, anon_sym_DOT, - ACTIONS(72), 1, + ACTIONS(31), 1, anon_sym_POUND, STATE(14), 1, aux_sym_qualified_identifier_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - [365] = 2, + [346] = 4, + ACTIONS(67), 1, + anon_sym_DOT, + ACTIONS(70), 1, + anon_sym_POUND, + STATE(22), 1, + aux_sym_qualified_identifier_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(74), 3, + [360] = 4, + ACTIONS(72), 1, anon_sym_RBRACE, - anon_sym_RBRACK, + ACTIONS(74), 1, anon_sym_COMMA, - [375] = 2, + STATE(16), 1, + aux_sym_fields_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(76), 3, - anon_sym_RBRACE, - anon_sym_RBRACK, - anon_sym_COMMA, - [385] = 3, - ACTIONS(31), 1, + [374] = 4, + ACTIONS(27), 1, sym_identifier, - STATE(28), 1, + ACTIONS(72), 1, + anon_sym_RBRACE, + STATE(35), 1, sym_field, ACTIONS(3), 2, sym_comment, sym_whitespace, - [396] = 3, - ACTIONS(11), 1, - anon_sym_LBRACE, - STATE(40), 1, - sym_struct, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [407] = 2, + [388] = 4, + ACTIONS(76), 1, + sym_identifier, + STATE(33), 1, + sym_operation_name, + STATE(49), 1, + sym_qualified_identifier, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(78), 2, + [402] = 4, + ACTIONS(78), 1, anon_sym_RBRACE, + ACTIONS(80), 1, anon_sym_COMMA, - [416] = 2, + STATE(23), 1, + aux_sym_fields_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(50), 2, - anon_sym_RBRACE, - anon_sym_COMMA, - [425] = 3, - ACTIONS(80), 1, + [416] = 3, + ACTIONS(82), 1, sym_identifier, - STATE(32), 1, - sym_operation_name, + STATE(38), 1, + sym_qualified_identifier, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [427] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, + ACTIONS(70), 2, + anon_sym_DOT, + anon_sym_POUND, [436] = 3, - ACTIONS(82), 1, - sym_identifier, - STATE(45), 1, - sym_qualified_identifier, + ACTIONS(11), 1, + anon_sym_LBRACE, + STATE(40), 1, + sym_struct, ACTIONS(3), 2, sym_comment, sym_whitespace, @@ -1176,117 +1185,146 @@ static const uint16_t ts_small_parse_table[] = { ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(61), 2, + ACTIONS(62), 2, anon_sym_RBRACK, anon_sym_COMMA, - [456] = 3, - ACTIONS(11), 1, - anon_sym_LBRACE, + [456] = 2, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + ACTIONS(84), 2, + anon_sym_DOT, + sym_identifier, + [465] = 3, + ACTIONS(27), 1, + sym_identifier, STATE(35), 1, - sym_struct, + sym_field, ACTIONS(3), 2, sym_comment, sym_whitespace, - [467] = 2, + [476] = 3, + ACTIONS(11), 1, + anon_sym_LBRACE, + STATE(43), 1, + sym_struct, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(38), 2, - anon_sym_DOT, - anon_sym_POUND, - [476] = 2, - ACTIONS(84), 1, - anon_sym_EQ, + [487] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - [484] = 2, - ACTIONS(86), 1, - ts_builtin_sym_end, + ACTIONS(86), 2, + anon_sym_RBRACE, + anon_sym_COMMA, + [496] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - [492] = 2, - ACTIONS(88), 1, - anon_sym_RBRACK, + ACTIONS(51), 2, + anon_sym_RBRACE, + anon_sym_COMMA, + [505] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - [500] = 2, + ACTIONS(88), 2, + anon_sym_DOT, + sym_identifier, + [514] = 2, ACTIONS(90), 1, - anon_sym_RBRACE, + sym_identifier, ACTIONS(3), 2, sym_comment, sym_whitespace, - [508] = 2, + [522] = 2, ACTIONS(92), 1, sym_identifier, ACTIONS(3), 2, sym_comment, sym_whitespace, - [516] = 2, + [530] = 2, ACTIONS(94), 1, sym_identifier, ACTIONS(3), 2, sym_comment, sym_whitespace, - [524] = 2, + [538] = 2, ACTIONS(96), 1, ts_builtin_sym_end, ACTIONS(3), 2, sym_comment, sym_whitespace, - [532] = 2, + [546] = 2, ACTIONS(98), 1, sym_identifier, ACTIONS(3), 2, sym_comment, sym_whitespace, - [540] = 2, + [554] = 2, ACTIONS(100), 1, - anon_sym_service, + anon_sym_RBRACK, ACTIONS(3), 2, sym_comment, sym_whitespace, - [548] = 2, + [562] = 2, ACTIONS(102), 1, - sym_identifier, + ts_builtin_sym_end, ACTIONS(3), 2, sym_comment, sym_whitespace, - [556] = 2, + [570] = 2, ACTIONS(104), 1, - sym_identifier, + anon_sym_LBRACE, ACTIONS(3), 2, sym_comment, sym_whitespace, - [564] = 2, + [578] = 2, ACTIONS(106), 1, sym_identifier, ACTIONS(3), 2, sym_comment, sym_whitespace, - [572] = 2, + [586] = 2, ACTIONS(108), 1, - ts_builtin_sym_end, + anon_sym_service, ACTIONS(3), 2, sym_comment, sym_whitespace, - [580] = 2, + [594] = 2, ACTIONS(110), 1, - anon_sym_LBRACE, + anon_sym_EQ, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [602] = 2, + ACTIONS(112), 1, + anon_sym_RBRACE, ACTIONS(3), 2, sym_comment, sym_whitespace, - [588] = 2, + [610] = 2, + ACTIONS(114), 1, + anon_sym_DOT, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [618] = 2, + ACTIONS(116), 1, + ts_builtin_sym_end, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [626] = 2, ACTIONS(3), 1, sym_comment, - ACTIONS(112), 1, + ACTIONS(118), 1, sym_whitespace, - [595] = 2, + [633] = 2, ACTIONS(3), 1, sym_comment, - ACTIONS(114), 1, + ACTIONS(120), 1, sym_whitespace, }; @@ -1297,48 +1335,51 @@ static const uint32_t ts_small_parse_table_map[] = { [SMALL_STATE(5)] = 96, [SMALL_STATE(6)] = 124, [SMALL_STATE(7)] = 152, - [SMALL_STATE(8)] = 163, - [SMALL_STATE(9)] = 174, - [SMALL_STATE(10)] = 191, - [SMALL_STATE(11)] = 205, - [SMALL_STATE(12)] = 219, - [SMALL_STATE(13)] = 233, - [SMALL_STATE(14)] = 243, - [SMALL_STATE(15)] = 257, - [SMALL_STATE(16)] = 271, - [SMALL_STATE(17)] = 285, - [SMALL_STATE(18)] = 299, - [SMALL_STATE(19)] = 313, - [SMALL_STATE(20)] = 323, - [SMALL_STATE(21)] = 337, - [SMALL_STATE(22)] = 351, - [SMALL_STATE(23)] = 365, - [SMALL_STATE(24)] = 375, - [SMALL_STATE(25)] = 385, - [SMALL_STATE(26)] = 396, - [SMALL_STATE(27)] = 407, - [SMALL_STATE(28)] = 416, - [SMALL_STATE(29)] = 425, - [SMALL_STATE(30)] = 436, - [SMALL_STATE(31)] = 447, - [SMALL_STATE(32)] = 456, - [SMALL_STATE(33)] = 467, - [SMALL_STATE(34)] = 476, - [SMALL_STATE(35)] = 484, - [SMALL_STATE(36)] = 492, - [SMALL_STATE(37)] = 500, - [SMALL_STATE(38)] = 508, - [SMALL_STATE(39)] = 516, - [SMALL_STATE(40)] = 524, - [SMALL_STATE(41)] = 532, - [SMALL_STATE(42)] = 540, - [SMALL_STATE(43)] = 548, - [SMALL_STATE(44)] = 556, - [SMALL_STATE(45)] = 564, - [SMALL_STATE(46)] = 572, - [SMALL_STATE(47)] = 580, - [SMALL_STATE(48)] = 588, - [SMALL_STATE(49)] = 595, + [SMALL_STATE(8)] = 169, + [SMALL_STATE(9)] = 186, + [SMALL_STATE(10)] = 197, + [SMALL_STATE(11)] = 208, + [SMALL_STATE(12)] = 218, + [SMALL_STATE(13)] = 232, + [SMALL_STATE(14)] = 246, + [SMALL_STATE(15)] = 260, + [SMALL_STATE(16)] = 270, + [SMALL_STATE(17)] = 284, + [SMALL_STATE(18)] = 298, + [SMALL_STATE(19)] = 308, + [SMALL_STATE(20)] = 318, + [SMALL_STATE(21)] = 332, + [SMALL_STATE(22)] = 346, + [SMALL_STATE(23)] = 360, + [SMALL_STATE(24)] = 374, + [SMALL_STATE(25)] = 388, + [SMALL_STATE(26)] = 402, + [SMALL_STATE(27)] = 416, + [SMALL_STATE(28)] = 427, + [SMALL_STATE(29)] = 436, + [SMALL_STATE(30)] = 447, + [SMALL_STATE(31)] = 456, + [SMALL_STATE(32)] = 465, + [SMALL_STATE(33)] = 476, + [SMALL_STATE(34)] = 487, + [SMALL_STATE(35)] = 496, + [SMALL_STATE(36)] = 505, + [SMALL_STATE(37)] = 514, + [SMALL_STATE(38)] = 522, + [SMALL_STATE(39)] = 530, + [SMALL_STATE(40)] = 538, + [SMALL_STATE(41)] = 546, + [SMALL_STATE(42)] = 554, + [SMALL_STATE(43)] = 562, + [SMALL_STATE(44)] = 570, + [SMALL_STATE(45)] = 578, + [SMALL_STATE(46)] = 586, + [SMALL_STATE(47)] = 594, + [SMALL_STATE(48)] = 602, + [SMALL_STATE(49)] = 610, + [SMALL_STATE(50)] = 618, + [SMALL_STATE(51)] = 626, + [SMALL_STATE(52)] = 633, }; static const TSParseActionEntry ts_parse_actions[] = { @@ -1346,59 +1387,62 @@ static const TSParseActionEntry ts_parse_actions[] = { [1] = {.entry = {.count = 1, .reusable = false}}, RECOVER(), [3] = {.entry = {.count = 1, .reusable = true}}, SHIFT_EXTRA(), [5] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source_file, 0), - [7] = {.entry = {.count = 1, .reusable = false}}, SHIFT(49), - [9] = {.entry = {.count = 1, .reusable = false}}, SHIFT(47), - [11] = {.entry = {.count = 1, .reusable = true}}, SHIFT(9), + [7] = {.entry = {.count = 1, .reusable = false}}, SHIFT(52), + [9] = {.entry = {.count = 1, .reusable = false}}, SHIFT(8), + [11] = {.entry = {.count = 1, .reusable = true}}, SHIFT(7), [13] = {.entry = {.count = 1, .reusable = true}}, SHIFT(2), - [15] = {.entry = {.count = 1, .reusable = true}}, SHIFT(13), + [15] = {.entry = {.count = 1, .reusable = true}}, SHIFT(15), [17] = {.entry = {.count = 1, .reusable = true}}, SHIFT(19), - [19] = {.entry = {.count = 1, .reusable = true}}, SHIFT(23), + [19] = {.entry = {.count = 1, .reusable = true}}, SHIFT(18), [21] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_fields, 3), [23] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_fields, 2), - [25] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_struct, 3, .production_id = 4), - [27] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_struct, 2), - [29] = {.entry = {.count = 1, .reusable = true}}, SHIFT(8), - [31] = {.entry = {.count = 1, .reusable = true}}, SHIFT(34), - [33] = {.entry = {.count = 1, .reusable = true}}, SHIFT(3), - [35] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_qualified_identifier_repeat1, 2), SHIFT_REPEAT(44), - [38] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_qualified_identifier_repeat1, 2), - [40] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_fields, 1), - [42] = {.entry = {.count = 1, .reusable = true}}, SHIFT(4), - [44] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list, 2), - [46] = {.entry = {.count = 1, .reusable = true}}, SHIFT(44), - [48] = {.entry = {.count = 1, .reusable = true}}, SHIFT(39), - [50] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_fields_repeat1, 2), - [52] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_fields_repeat1, 2), SHIFT_REPEAT(25), - [55] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_fields, 1), - [57] = {.entry = {.count = 1, .reusable = true}}, SHIFT(20), - [59] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_fields, 3), - [61] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_list_fields_repeat1, 2), - [63] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_list_fields_repeat1, 2), SHIFT_REPEAT(5), - [66] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_boolean, 1), - [68] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_fields, 2), - [70] = {.entry = {.count = 1, .reusable = true}}, SHIFT(17), - [72] = {.entry = {.count = 1, .reusable = true}}, SHIFT(41), - [74] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_input_node, 1), - [76] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list, 3, .production_id = 8), - [78] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_field, 3, .production_id = 6), - [80] = {.entry = {.count = 1, .reusable = true}}, SHIFT(47), - [82] = {.entry = {.count = 1, .reusable = true}}, SHIFT(22), - [84] = {.entry = {.count = 1, .reusable = true}}, SHIFT(6), - [86] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source_file, 3, .production_id = 3), - [88] = {.entry = {.count = 1, .reusable = true}}, SHIFT(24), - [90] = {.entry = {.count = 1, .reusable = true}}, SHIFT(7), - [92] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_qualified_identifier, 3, .production_id = 7), - [94] = {.entry = {.count = 1, .reusable = true}}, SHIFT(43), + [25] = {.entry = {.count = 1, .reusable = true}}, SHIFT(9), + [27] = {.entry = {.count = 1, .reusable = true}}, SHIFT(47), + [29] = {.entry = {.count = 1, .reusable = true}}, SHIFT(45), + [31] = {.entry = {.count = 1, .reusable = true}}, SHIFT(37), + [33] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_operation_name, 1, .production_id = 1), + [35] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_struct, 2), + [37] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_struct, 3, .production_id = 7), + [39] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list, 3, .production_id = 10), + [41] = {.entry = {.count = 1, .reusable = true}}, SHIFT(3), + [43] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_fields, 1), + [45] = {.entry = {.count = 1, .reusable = true}}, SHIFT(4), + [47] = {.entry = {.count = 1, .reusable = true}}, SHIFT(39), + [49] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list, 2), + [51] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_fields_repeat1, 2), + [53] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_fields_repeat1, 2), SHIFT_REPEAT(32), + [56] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_fields, 3), + [58] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_input_node, 1), + [60] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_boolean, 1), + [62] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_list_fields_repeat1, 2), + [64] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_list_fields_repeat1, 2), SHIFT_REPEAT(6), + [67] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_qualified_identifier_repeat1, 2), SHIFT_REPEAT(45), + [70] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_qualified_identifier_repeat1, 2), + [72] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_fields, 2), + [74] = {.entry = {.count = 1, .reusable = true}}, SHIFT(17), + [76] = {.entry = {.count = 1, .reusable = true}}, SHIFT(8), + [78] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_fields, 1), + [80] = {.entry = {.count = 1, .reusable = true}}, SHIFT(24), + [82] = {.entry = {.count = 1, .reusable = true}}, SHIFT(21), + [84] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_qualified_identifier, 4, .production_id = 6), + [86] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_field, 3, .production_id = 9), + [88] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_qualified_identifier, 3, .production_id = 3), + [90] = {.entry = {.count = 1, .reusable = true}}, SHIFT(36), + [92] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_use_clause, 5, .production_id = 8), + [94] = {.entry = {.count = 1, .reusable = true}}, SHIFT(31), [96] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source_file, 2, .production_id = 2), - [98] = {.entry = {.count = 1, .reusable = true}}, SHIFT(38), - [100] = {.entry = {.count = 1, .reusable = true}}, SHIFT(48), - [102] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_qualified_identifier, 4, .production_id = 9), - [104] = {.entry = {.count = 1, .reusable = true}}, SHIFT(33), - [106] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_use_clause, 5, .production_id = 5), - [108] = {.entry = {.count = 1, .reusable = true}}, ACCEPT_INPUT(), - [110] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_operation_name, 1, .production_id = 1), - [112] = {.entry = {.count = 1, .reusable = true}}, SHIFT(30), - [114] = {.entry = {.count = 1, .reusable = true}}, SHIFT(42), + [98] = {.entry = {.count = 1, .reusable = true}}, SHIFT(44), + [100] = {.entry = {.count = 1, .reusable = true}}, SHIFT(11), + [102] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source_file, 3, .production_id = 4), + [104] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_operation_name, 3, .production_id = 5), + [106] = {.entry = {.count = 1, .reusable = true}}, SHIFT(28), + [108] = {.entry = {.count = 1, .reusable = true}}, SHIFT(51), + [110] = {.entry = {.count = 1, .reusable = true}}, SHIFT(5), + [112] = {.entry = {.count = 1, .reusable = true}}, SHIFT(10), + [114] = {.entry = {.count = 1, .reusable = true}}, SHIFT(41), + [116] = {.entry = {.count = 1, .reusable = true}}, ACCEPT_INPUT(), + [118] = {.entry = {.count = 1, .reusable = true}}, SHIFT(27), + [120] = {.entry = {.count = 1, .reusable = true}}, SHIFT(46), }; #ifdef __cplusplus From b0735974818f9cf08376efd74b96c204538802d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Wed, 14 Sep 2022 21:31:51 +0200 Subject: [PATCH 009/105] WIP POC more syntax --- .../corpus/bindings-comma.txt | 19 + .../corpus/bindings-multiple.txt | 40 + tree-sitter-smithyql/corpus/bindings.txt | 21 + tree-sitter-smithyql/corpus/comment.txt | 10 +- tree-sitter-smithyql/corpus/empty.txt | 2 +- .../corpus/full-of-comments.txt | 70 +- tree-sitter-smithyql/corpus/just-query.txt | 10 +- tree-sitter-smithyql/corpus/just-use.txt | 17 +- .../corpus/service-reference.txt | 16 +- tree-sitter-smithyql/corpus/statements.txt | 178 +-- tree-sitter-smithyql/corpus/string.txt | 5 +- tree-sitter-smithyql/corpus/struct-1.txt | 24 +- tree-sitter-smithyql/corpus/struct-2.txt | 38 +- tree-sitter-smithyql/corpus/struct-3.txt | 52 +- tree-sitter-smithyql/grammar.js | 31 +- tree-sitter-smithyql/src/grammar.json | 198 ++- tree-sitter-smithyql/src/node-types.json | 104 +- tree-sitter-smithyql/src/parser.c | 1234 +++++++++-------- 18 files changed, 1210 insertions(+), 859 deletions(-) create mode 100644 tree-sitter-smithyql/corpus/bindings-comma.txt create mode 100644 tree-sitter-smithyql/corpus/bindings-multiple.txt create mode 100644 tree-sitter-smithyql/corpus/bindings.txt diff --git a/tree-sitter-smithyql/corpus/bindings-comma.txt b/tree-sitter-smithyql/corpus/bindings-comma.txt new file mode 100644 index 00000000..b397ae46 --- /dev/null +++ b/tree-sitter-smithyql/corpus/bindings-comma.txt @@ -0,0 +1,19 @@ +================================================================================ +Simple let binding with trailing comma +================================================================================ +let label = 42, +Op {} +-------------------------------------------------------------------------------- + +(ERROR + (whitespace) + (ERROR + (binding + (identifier) + (whitespace) + (whitespace) + (input_node + (number)))) + (whitespace) + (identifier) + (whitespace)) diff --git a/tree-sitter-smithyql/corpus/bindings-multiple.txt b/tree-sitter-smithyql/corpus/bindings-multiple.txt new file mode 100644 index 00000000..054a8123 --- /dev/null +++ b/tree-sitter-smithyql/corpus/bindings-multiple.txt @@ -0,0 +1,40 @@ +================================================================================ +Multiple let bindings in one go +================================================================================ +let label = 42, +let y = { a = "test", } +Op {} +-------------------------------------------------------------------------------- + +(source_file + (ERROR + (whitespace) + (binding + (identifier) + (whitespace) + (whitespace) + (input_node + (number)))) + (whitespace) + (top_level_statement + (let_binding + (whitespace) + (binding + (identifier) + (whitespace) + (whitespace) + (input_node + (struct + (whitespace) + (bindings + (binding + (identifier) + (whitespace) + (whitespace) + (input_node + (string)))) + (whitespace)))))) + (whitespace) + (ERROR + (identifier) + (whitespace))) diff --git a/tree-sitter-smithyql/corpus/bindings.txt b/tree-sitter-smithyql/corpus/bindings.txt new file mode 100644 index 00000000..fffb78b5 --- /dev/null +++ b/tree-sitter-smithyql/corpus/bindings.txt @@ -0,0 +1,21 @@ +================================================================================ +Simple let binding +================================================================================ +let label = 42 +Op {} +-------------------------------------------------------------------------------- + +(source_file + (top_level_statement + (let_binding + (whitespace) + (binding + (identifier) + (whitespace) + (whitespace) + (input_node + (number))))) + (whitespace) + (ERROR + (identifier) + (whitespace))) diff --git a/tree-sitter-smithyql/corpus/comment.txt b/tree-sitter-smithyql/corpus/comment.txt index 9c7debfb..22ca0f24 100644 --- a/tree-sitter-smithyql/corpus/comment.txt +++ b/tree-sitter-smithyql/corpus/comment.txt @@ -8,7 +8,9 @@ hello {} (source_file (comment) (whitespace) - (operation_name - (identifier)) - (whitespace) - (struct)) + (top_level_statement + (operation_call + (operation_name + (identifier)) + (whitespace) + (struct)))) diff --git a/tree-sitter-smithyql/corpus/empty.txt b/tree-sitter-smithyql/corpus/empty.txt index a66d7e19..a7aeecd9 100644 --- a/tree-sitter-smithyql/corpus/empty.txt +++ b/tree-sitter-smithyql/corpus/empty.txt @@ -4,4 +4,4 @@ Empty file -------------------------------------------------------------------------------- -(source_file) +(ERROR) diff --git a/tree-sitter-smithyql/corpus/full-of-comments.txt b/tree-sitter-smithyql/corpus/full-of-comments.txt index 5c4e8fcb..c305d50a 100644 --- a/tree-sitter-smithyql/corpus/full-of-comments.txt +++ b/tree-sitter-smithyql/corpus/full-of-comments.txt @@ -64,48 +64,50 @@ op (whitespace) (comment) (whitespace) - (operation_name - (identifier)) - (whitespace) - (comment) - (whitespace) - (struct - (whitespace) - (comment) - (whitespace) - (fields - (field - (identifier) - (whitespace) - (comment) - (whitespace) - (whitespace) - (comment) - (whitespace) - (input_node - (string))) - (whitespace) - (comment) - (whitespace) + (top_level_statement + (operation_call + (operation_name + (identifier)) (whitespace) (comment) (whitespace) - (field - (identifier) + (struct (whitespace) (comment) (whitespace) + (bindings + (binding + (identifier) + (whitespace) + (comment) + (whitespace) + (whitespace) + (comment) + (whitespace) + (input_node + (string))) + (whitespace) + (comment) + (whitespace) + (whitespace) + (comment) + (whitespace) + (binding + (identifier) + (whitespace) + (comment) + (whitespace) + (whitespace) + (comment) + (whitespace) + (input_node + (string))) + (whitespace) + (comment) + (whitespace)) (whitespace) (comment) - (whitespace) - (input_node - (string))) - (whitespace) - (comment) - (whitespace)) - (whitespace) - (comment) - (whitespace)) + (whitespace)))) (whitespace) (comment) (whitespace)) diff --git a/tree-sitter-smithyql/corpus/just-query.txt b/tree-sitter-smithyql/corpus/just-query.txt index a1091fbc..37091b3d 100644 --- a/tree-sitter-smithyql/corpus/just-query.txt +++ b/tree-sitter-smithyql/corpus/just-query.txt @@ -5,7 +5,9 @@ hello {} -------------------------------------------------------------------------------- (source_file - (operation_name - (identifier)) - (whitespace) - (struct)) + (top_level_statement + (operation_call + (operation_name + (identifier)) + (whitespace) + (struct)))) diff --git a/tree-sitter-smithyql/corpus/just-use.txt b/tree-sitter-smithyql/corpus/just-use.txt index ae7641c7..8f57a4d8 100644 --- a/tree-sitter-smithyql/corpus/just-use.txt +++ b/tree-sitter-smithyql/corpus/just-use.txt @@ -4,12 +4,11 @@ Just use clause use service playground.std#Clock -------------------------------------------------------------------------------- -(source_file - (ERROR - (use_clause - (whitespace) - (whitespace) - (qualified_identifier - (identifier) - (identifier) - (identifier))))) +(ERROR + (use_clause + (whitespace) + (whitespace) + (qualified_identifier + (identifier) + (identifier) + (identifier)))) diff --git a/tree-sitter-smithyql/corpus/service-reference.txt b/tree-sitter-smithyql/corpus/service-reference.txt index 39779974..a5e5be3d 100644 --- a/tree-sitter-smithyql/corpus/service-reference.txt +++ b/tree-sitter-smithyql/corpus/service-reference.txt @@ -5,10 +5,12 @@ namespace#Service.OpName {} -------------------------------------------------------------------------------- (source_file - (operation_name - (qualified_identifier - (identifier) - (identifier)) - (identifier)) - (whitespace) - (struct)) + (top_level_statement + (operation_call + (operation_name + (qualified_identifier + (identifier) + (identifier)) + (identifier)) + (whitespace) + (struct)))) diff --git a/tree-sitter-smithyql/corpus/statements.txt b/tree-sitter-smithyql/corpus/statements.txt index 7bfb2fd2..7d54dcbd 100644 --- a/tree-sitter-smithyql/corpus/statements.txt +++ b/tree-sitter-smithyql/corpus/statements.txt @@ -29,96 +29,98 @@ hello { (identifier) (identifier))) (whitespace) - (operation_name - (identifier)) - (whitespace) - (struct - (whitespace) - (fields - (field - (identifier) - (whitespace) - (whitespace) - (input_node - (number))) - (whitespace) - (field - (identifier) - (whitespace) - (whitespace) - (input_node - (number))) + (top_level_statement + (operation_call + (operation_name + (identifier)) (whitespace) - (field - (identifier) - (whitespace) + (struct (whitespace) - (input_node - (struct + (bindings + (binding + (identifier) (whitespace) - (fields - (field - (identifier) - (whitespace) - (whitespace) - (input_node - (string))) - (whitespace) - (field - (identifier) - (input_node - (boolean))) - (whitespace) - (field - (identifier) - (input_node - (boolean))) - (whitespace) - (field - (identifier) - (whitespace) + (whitespace) + (input_node + (number))) + (whitespace) + (binding + (identifier) + (whitespace) + (whitespace) + (input_node + (number))) + (whitespace) + (binding + (identifier) + (whitespace) + (whitespace) + (input_node + (struct (whitespace) - (input_node - (list + (bindings + (binding + (identifier) (whitespace) - (list_fields - (input_node - (number)) - (whitespace) - (input_node - (number)) - (whitespace) - (input_node - (number)) - (whitespace) - (input_node - (list - (list_fields - (input_node - (null)) - (whitespace) - (input_node - (boolean)) - (whitespace) - (input_node - (boolean)) - (whitespace) - (input_node - (null)) - (whitespace) - (input_node - (string)) - (whitespace) - (input_node - (number))) - (whitespace)))) - (whitespace))))) - (whitespace)))) - (whitespace) - (field - (identifier) - (whitespace) - (whitespace) - (input_node - (null)))) - (whitespace))) + (whitespace) + (input_node + (string))) + (whitespace) + (binding + (identifier) + (input_node + (boolean))) + (whitespace) + (binding + (identifier) + (input_node + (boolean))) + (whitespace) + (binding + (identifier) + (whitespace) + (whitespace) + (input_node + (list + (whitespace) + (list_fields + (input_node + (number)) + (whitespace) + (input_node + (number)) + (whitespace) + (input_node + (number)) + (whitespace) + (input_node + (list + (list_fields + (input_node + (null)) + (whitespace) + (input_node + (boolean)) + (whitespace) + (input_node + (boolean)) + (whitespace) + (input_node + (null)) + (whitespace) + (input_node + (string)) + (whitespace) + (input_node + (number))) + (whitespace)))) + (whitespace))))) + (whitespace)))) + (whitespace) + (binding + (identifier) + (whitespace) + (whitespace) + (input_node + (null)))) + (whitespace))))) diff --git a/tree-sitter-smithyql/corpus/string.txt b/tree-sitter-smithyql/corpus/string.txt index 140d036a..c2d766e3 100644 --- a/tree-sitter-smithyql/corpus/string.txt +++ b/tree-sitter-smithyql/corpus/string.txt @@ -4,6 +4,5 @@ Just a string "hello" -------------------------------------------------------------------------------- -(source_file - (ERROR - (string))) +(ERROR + (string)) diff --git a/tree-sitter-smithyql/corpus/struct-1.txt b/tree-sitter-smithyql/corpus/struct-1.txt index 45a7891c..8defe483 100644 --- a/tree-sitter-smithyql/corpus/struct-1.txt +++ b/tree-sitter-smithyql/corpus/struct-1.txt @@ -5,15 +5,17 @@ Struct with 1 field -------------------------------------------------------------------------------- (source_file - (operation_name - (MISSING identifier)) - (struct - (whitespace) - (fields - (field - (identifier) + (top_level_statement + (operation_call + (operation_name + (MISSING identifier)) + (struct (whitespace) - (whitespace) - (input_node - (number)))) - (whitespace))) + (bindings + (binding + (identifier) + (whitespace) + (whitespace) + (input_node + (number)))) + (whitespace))))) diff --git a/tree-sitter-smithyql/corpus/struct-2.txt b/tree-sitter-smithyql/corpus/struct-2.txt index 7eea0854..7425bcbe 100644 --- a/tree-sitter-smithyql/corpus/struct-2.txt +++ b/tree-sitter-smithyql/corpus/struct-2.txt @@ -5,22 +5,24 @@ Struct with 2 fields -------------------------------------------------------------------------------- (source_file - (operation_name - (MISSING identifier)) - (struct - (whitespace) - (fields - (field - (identifier) + (top_level_statement + (operation_call + (operation_name + (MISSING identifier)) + (struct (whitespace) - (whitespace) - (input_node - (number))) - (whitespace) - (field - (identifier) - (whitespace) - (whitespace) - (input_node - (string)))) - (whitespace))) + (bindings + (binding + (identifier) + (whitespace) + (whitespace) + (input_node + (number))) + (whitespace) + (binding + (identifier) + (whitespace) + (whitespace) + (input_node + (string)))) + (whitespace))))) diff --git a/tree-sitter-smithyql/corpus/struct-3.txt b/tree-sitter-smithyql/corpus/struct-3.txt index a59eea34..48f334fd 100644 --- a/tree-sitter-smithyql/corpus/struct-3.txt +++ b/tree-sitter-smithyql/corpus/struct-3.txt @@ -5,29 +5,31 @@ Struct with 3 fields -------------------------------------------------------------------------------- (source_file - (operation_name - (MISSING identifier)) - (struct - (whitespace) - (fields - (field - (identifier) + (top_level_statement + (operation_call + (operation_name + (MISSING identifier)) + (struct (whitespace) - (whitespace) - (input_node - (number))) - (whitespace) - (field - (identifier) - (whitespace) - (whitespace) - (input_node - (string))) - (whitespace) - (field - (identifier) - (whitespace) - (whitespace) - (input_node - (boolean)))) - (whitespace))) + (bindings + (binding + (identifier) + (whitespace) + (whitespace) + (input_node + (number))) + (whitespace) + (binding + (identifier) + (whitespace) + (whitespace) + (input_node + (string))) + (whitespace) + (binding + (identifier) + (whitespace) + (whitespace) + (input_node + (boolean)))) + (whitespace))))) diff --git a/tree-sitter-smithyql/grammar.js b/tree-sitter-smithyql/grammar.js index b4dd67f2..2e395bb5 100644 --- a/tree-sitter-smithyql/grammar.js +++ b/tree-sitter-smithyql/grammar.js @@ -12,14 +12,18 @@ module.exports = grammar({ extras: ($) => [$.whitespace, $.comment], rules: { source_file: ($) => - optional( - seq( - field("use_clause", optional($.use_clause)), - field("operation_name", $.operation_name), - field("input", $.struct) - ) + seq( + field("use_clause", optional($.use_clause)), + field("statements", seq($.top_level_statement)) ), + top_level_statement: ($) => choice($.let_binding, $.operation_call), + + let_binding: ($) => seq("let", $.whitespace, $.binding, optional(",")), + + operation_call: ($) => + seq(field("operation_name", $.operation_name), field("input", $.struct)), + use_clause: ($) => seq( "use", @@ -38,20 +42,23 @@ module.exports = grammar({ ), operation_name: ($) => - seq( - field("identifier", optional(seq($.qualified_identifier, "."))), - field("name", $.identifier) + prec.left( + 1, + seq( + field("identifier", optional(seq($.qualified_identifier, "."))), + field("name", $.identifier) + ) ), input_node: ($) => choice($.struct, $.list, $.number, $.string, $.boolean, $.null), - struct: ($) => seq("{", field("fields", optional($.fields)), "}"), + struct: ($) => seq("{", field("bindings", optional($.bindings)), "}"), list: ($) => seq("[", field("list_fields", optional($.list_fields)), "]"), - fields: ($) => comma_separated_trailing($.field), + bindings: ($) => comma_separated_trailing($.binding), - field: ($) => + binding: ($) => seq(field("key", $.identifier), "=", field("value", $.input_node)), list_fields: ($) => comma_separated_trailing($.input_node), diff --git a/tree-sitter-smithyql/src/grammar.json b/tree-sitter-smithyql/src/grammar.json index c8f6e389..21a866ab 100644 --- a/tree-sitter-smithyql/src/grammar.json +++ b/tree-sitter-smithyql/src/grammar.json @@ -2,47 +2,99 @@ "name": "smithyql", "rules": { "source_file": { - "type": "CHOICE", + "type": "SEQ", "members": [ { - "type": "SEQ", - "members": [ - { - "type": "FIELD", - "name": "use_clause", - "content": { - "type": "CHOICE", - "members": [ - { - "type": "SYMBOL", - "name": "use_clause" - }, - { - "type": "BLANK" - } - ] + "type": "FIELD", + "name": "use_clause", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "use_clause" + }, + { + "type": "BLANK" } - }, - { - "type": "FIELD", - "name": "operation_name", - "content": { + ] + } + }, + { + "type": "FIELD", + "name": "statements", + "content": { + "type": "SEQ", + "members": [ + { "type": "SYMBOL", - "name": "operation_name" + "name": "top_level_statement" } + ] + } + } + ] + }, + "top_level_statement": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "let_binding" + }, + { + "type": "SYMBOL", + "name": "operation_call" + } + ] + }, + "let_binding": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "let" + }, + { + "type": "SYMBOL", + "name": "whitespace" + }, + { + "type": "SYMBOL", + "name": "binding" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "," }, { - "type": "FIELD", - "name": "input", - "content": { - "type": "SYMBOL", - "name": "struct" - } + "type": "BLANK" } ] + } + ] + }, + "operation_call": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "operation_name", + "content": { + "type": "SYMBOL", + "name": "operation_name" + } }, { - "type": "BLANK" + "type": "FIELD", + "name": "input", + "content": { + "type": "SYMBOL", + "name": "struct" + } } ] }, @@ -121,42 +173,46 @@ ] }, "operation_name": { - "type": "SEQ", - "members": [ - { - "type": "FIELD", - "name": "identifier", - "content": { - "type": "CHOICE", - "members": [ - { - "type": "SEQ", - "members": [ - { - "type": "SYMBOL", - "name": "qualified_identifier" - }, - { - "type": "STRING", - "value": "." - } - ] - }, - { - "type": "BLANK" - } - ] - } - }, - { - "type": "FIELD", - "name": "name", - "content": { - "type": "SYMBOL", - "name": "identifier" + "type": "PREC_LEFT", + "value": 1, + "content": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "identifier", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "qualified_identifier" + }, + { + "type": "STRING", + "value": "." + } + ] + }, + { + "type": "BLANK" + } + ] + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "SYMBOL", + "name": "identifier" + } } - } - ] + ] + } }, "input_node": { "type": "CHOICE", @@ -196,13 +252,13 @@ }, { "type": "FIELD", - "name": "fields", + "name": "bindings", "content": { "type": "CHOICE", "members": [ { "type": "SYMBOL", - "name": "fields" + "name": "bindings" }, { "type": "BLANK" @@ -245,7 +301,7 @@ } ] }, - "fields": { + "bindings": { "type": "PREC_LEFT", "value": 1, "content": { @@ -253,7 +309,7 @@ "members": [ { "type": "SYMBOL", - "name": "field" + "name": "binding" }, { "type": "REPEAT", @@ -266,7 +322,7 @@ }, { "type": "SYMBOL", - "name": "field" + "name": "binding" } ] } @@ -286,7 +342,7 @@ ] } }, - "field": { + "binding": { "type": "SEQ", "members": [ { diff --git a/tree-sitter-smithyql/src/node-types.json b/tree-sitter-smithyql/src/node-types.json index e64e19a7..139bf2e7 100644 --- a/tree-sitter-smithyql/src/node-types.json +++ b/tree-sitter-smithyql/src/node-types.json @@ -1,11 +1,6 @@ [ { - "type": "boolean", - "named": true, - "fields": {} - }, - { - "type": "field", + "type": "binding", "named": true, "fields": { "key": { @@ -31,7 +26,7 @@ } }, { - "type": "fields", + "type": "bindings", "named": true, "fields": {}, "children": { @@ -39,12 +34,17 @@ "required": true, "types": [ { - "type": "field", + "type": "binding", "named": true } ] } }, + { + "type": "boolean", + "named": true, + "fields": {} + }, { "type": "input_node", "named": true, @@ -80,6 +80,25 @@ ] } }, + { + "type": "let_binding", + "named": true, + "fields": {}, + "children": { + "multiple": true, + "required": true, + "types": [ + { + "type": "binding", + "named": true + }, + { + "type": "whitespace", + "named": true + } + ] + } + }, { "type": "list", "named": true, @@ -111,6 +130,32 @@ ] } }, + { + "type": "operation_call", + "named": true, + "fields": { + "input": { + "multiple": false, + "required": true, + "types": [ + { + "type": "struct", + "named": true + } + ] + }, + "operation_name": { + "multiple": false, + "required": true, + "types": [ + { + "type": "operation_name", + "named": true + } + ] + } + } + }, { "type": "operation_name", "named": true, @@ -185,22 +230,12 @@ "type": "source_file", "named": true, "fields": { - "input": { + "statements": { "multiple": false, - "required": false, - "types": [ - { - "type": "struct", - "named": true - } - ] - }, - "operation_name": { - "multiple": false, - "required": false, + "required": true, "types": [ { - "type": "operation_name", + "type": "top_level_statement", "named": true } ] @@ -221,18 +256,37 @@ "type": "struct", "named": true, "fields": { - "fields": { + "bindings": { "multiple": false, "required": false, "types": [ { - "type": "fields", + "type": "bindings", "named": true } ] } } }, + { + "type": "top_level_statement", + "named": true, + "fields": {}, + "children": { + "multiple": false, + "required": true, + "types": [ + { + "type": "let_binding", + "named": true + }, + { + "type": "operation_call", + "named": true + } + ] + } + }, { "type": "use_clause", "named": true, @@ -295,6 +349,10 @@ "type": "identifier", "named": true }, + { + "type": "let", + "named": false + }, { "type": "null", "named": true diff --git a/tree-sitter-smithyql/src/parser.c b/tree-sitter-smithyql/src/parser.c index c092b9c0..32e2bc5a 100644 --- a/tree-sitter-smithyql/src/parser.c +++ b/tree-sitter-smithyql/src/parser.c @@ -6,53 +6,59 @@ #endif #define LANGUAGE_VERSION 13 -#define STATE_COUNT 53 +#define STATE_COUNT 58 #define LARGE_STATE_COUNT 2 -#define SYMBOL_COUNT 33 +#define SYMBOL_COUNT 37 #define ALIAS_COUNT 0 -#define TOKEN_COUNT 19 +#define TOKEN_COUNT 20 #define EXTERNAL_TOKEN_COUNT 0 -#define FIELD_COUNT 12 +#define FIELD_COUNT 13 #define MAX_ALIAS_SEQUENCE_LENGTH 5 -#define PRODUCTION_ID_COUNT 11 +#define PRODUCTION_ID_COUNT 12 enum { - anon_sym_use = 1, - anon_sym_service = 2, - anon_sym_DOT = 3, - anon_sym_POUND = 4, - anon_sym_LBRACE = 5, - anon_sym_RBRACE = 6, - anon_sym_LBRACK = 7, - anon_sym_RBRACK = 8, - anon_sym_COMMA = 9, - anon_sym_EQ = 10, - sym_identifier = 11, - anon_sym_true = 12, - anon_sym_false = 13, - sym_number = 14, - sym_string = 15, - sym_null = 16, - sym_comment = 17, - sym_whitespace = 18, - sym_source_file = 19, - sym_use_clause = 20, - sym_qualified_identifier = 21, - sym_operation_name = 22, - sym_input_node = 23, - sym_struct = 24, - sym_list = 25, - sym_fields = 26, - sym_field = 27, - sym_list_fields = 28, - sym_boolean = 29, - aux_sym_qualified_identifier_repeat1 = 30, - aux_sym_fields_repeat1 = 31, - aux_sym_list_fields_repeat1 = 32, + anon_sym_let = 1, + anon_sym_COMMA = 2, + anon_sym_use = 3, + anon_sym_service = 4, + anon_sym_DOT = 5, + anon_sym_POUND = 6, + anon_sym_LBRACE = 7, + anon_sym_RBRACE = 8, + anon_sym_LBRACK = 9, + anon_sym_RBRACK = 10, + anon_sym_EQ = 11, + sym_identifier = 12, + anon_sym_true = 13, + anon_sym_false = 14, + sym_number = 15, + sym_string = 16, + sym_null = 17, + sym_comment = 18, + sym_whitespace = 19, + sym_source_file = 20, + sym_top_level_statement = 21, + sym_let_binding = 22, + sym_operation_call = 23, + sym_use_clause = 24, + sym_qualified_identifier = 25, + sym_operation_name = 26, + sym_input_node = 27, + sym_struct = 28, + sym_list = 29, + sym_bindings = 30, + sym_binding = 31, + sym_list_fields = 32, + sym_boolean = 33, + aux_sym_qualified_identifier_repeat1 = 34, + aux_sym_bindings_repeat1 = 35, + aux_sym_list_fields_repeat1 = 36, }; static const char * const ts_symbol_names[] = { [ts_builtin_sym_end] = "end", + [anon_sym_let] = "let", + [anon_sym_COMMA] = ",", [anon_sym_use] = "use", [anon_sym_service] = "service", [anon_sym_DOT] = ".", @@ -61,7 +67,6 @@ static const char * const ts_symbol_names[] = { [anon_sym_RBRACE] = "}", [anon_sym_LBRACK] = "[", [anon_sym_RBRACK] = "]", - [anon_sym_COMMA] = ",", [anon_sym_EQ] = "=", [sym_identifier] = "identifier", [anon_sym_true] = "true", @@ -72,23 +77,28 @@ static const char * const ts_symbol_names[] = { [sym_comment] = "comment", [sym_whitespace] = "whitespace", [sym_source_file] = "source_file", + [sym_top_level_statement] = "top_level_statement", + [sym_let_binding] = "let_binding", + [sym_operation_call] = "operation_call", [sym_use_clause] = "use_clause", [sym_qualified_identifier] = "qualified_identifier", [sym_operation_name] = "operation_name", [sym_input_node] = "input_node", [sym_struct] = "struct", [sym_list] = "list", - [sym_fields] = "fields", - [sym_field] = "field", + [sym_bindings] = "bindings", + [sym_binding] = "binding", [sym_list_fields] = "list_fields", [sym_boolean] = "boolean", [aux_sym_qualified_identifier_repeat1] = "qualified_identifier_repeat1", - [aux_sym_fields_repeat1] = "fields_repeat1", + [aux_sym_bindings_repeat1] = "bindings_repeat1", [aux_sym_list_fields_repeat1] = "list_fields_repeat1", }; static const TSSymbol ts_symbol_map[] = { [ts_builtin_sym_end] = ts_builtin_sym_end, + [anon_sym_let] = anon_sym_let, + [anon_sym_COMMA] = anon_sym_COMMA, [anon_sym_use] = anon_sym_use, [anon_sym_service] = anon_sym_service, [anon_sym_DOT] = anon_sym_DOT, @@ -97,7 +107,6 @@ static const TSSymbol ts_symbol_map[] = { [anon_sym_RBRACE] = anon_sym_RBRACE, [anon_sym_LBRACK] = anon_sym_LBRACK, [anon_sym_RBRACK] = anon_sym_RBRACK, - [anon_sym_COMMA] = anon_sym_COMMA, [anon_sym_EQ] = anon_sym_EQ, [sym_identifier] = sym_identifier, [anon_sym_true] = anon_sym_true, @@ -108,18 +117,21 @@ static const TSSymbol ts_symbol_map[] = { [sym_comment] = sym_comment, [sym_whitespace] = sym_whitespace, [sym_source_file] = sym_source_file, + [sym_top_level_statement] = sym_top_level_statement, + [sym_let_binding] = sym_let_binding, + [sym_operation_call] = sym_operation_call, [sym_use_clause] = sym_use_clause, [sym_qualified_identifier] = sym_qualified_identifier, [sym_operation_name] = sym_operation_name, [sym_input_node] = sym_input_node, [sym_struct] = sym_struct, [sym_list] = sym_list, - [sym_fields] = sym_fields, - [sym_field] = sym_field, + [sym_bindings] = sym_bindings, + [sym_binding] = sym_binding, [sym_list_fields] = sym_list_fields, [sym_boolean] = sym_boolean, [aux_sym_qualified_identifier_repeat1] = aux_sym_qualified_identifier_repeat1, - [aux_sym_fields_repeat1] = aux_sym_fields_repeat1, + [aux_sym_bindings_repeat1] = aux_sym_bindings_repeat1, [aux_sym_list_fields_repeat1] = aux_sym_list_fields_repeat1, }; @@ -128,6 +140,14 @@ static const TSSymbolMetadata ts_symbol_metadata[] = { .visible = false, .named = true, }, + [anon_sym_let] = { + .visible = true, + .named = false, + }, + [anon_sym_COMMA] = { + .visible = true, + .named = false, + }, [anon_sym_use] = { .visible = true, .named = false, @@ -160,10 +180,6 @@ static const TSSymbolMetadata ts_symbol_metadata[] = { .visible = true, .named = false, }, - [anon_sym_COMMA] = { - .visible = true, - .named = false, - }, [anon_sym_EQ] = { .visible = true, .named = false, @@ -204,6 +220,18 @@ static const TSSymbolMetadata ts_symbol_metadata[] = { .visible = true, .named = true, }, + [sym_top_level_statement] = { + .visible = true, + .named = true, + }, + [sym_let_binding] = { + .visible = true, + .named = true, + }, + [sym_operation_call] = { + .visible = true, + .named = true, + }, [sym_use_clause] = { .visible = true, .named = true, @@ -228,11 +256,11 @@ static const TSSymbolMetadata ts_symbol_metadata[] = { .visible = true, .named = true, }, - [sym_fields] = { + [sym_bindings] = { .visible = true, .named = true, }, - [sym_field] = { + [sym_binding] = { .visible = true, .named = true, }, @@ -248,7 +276,7 @@ static const TSSymbolMetadata ts_symbol_metadata[] = { .visible = false, .named = false, }, - [aux_sym_fields_repeat1] = { + [aux_sym_bindings_repeat1] = { .visible = false, .named = false, }, @@ -259,7 +287,7 @@ static const TSSymbolMetadata ts_symbol_metadata[] = { }; enum { - field_fields = 1, + field_bindings = 1, field_head = 2, field_identifier = 3, field_input = 4, @@ -268,14 +296,15 @@ enum { field_name = 7, field_operation_name = 8, field_selection = 9, - field_tail = 10, - field_use_clause = 11, - field_value = 12, + field_statements = 10, + field_tail = 11, + field_use_clause = 12, + field_value = 13, }; static const char * const ts_field_names[] = { [0] = NULL, - [field_fields] = "fields", + [field_bindings] = "bindings", [field_head] = "head", [field_identifier] = "identifier", [field_input] = "input", @@ -284,6 +313,7 @@ static const char * const ts_field_names[] = { [field_name] = "name", [field_operation_name] = "operation_name", [field_selection] = "selection", + [field_statements] = "statements", [field_tail] = "tail", [field_use_clause] = "use_clause", [field_value] = "value", @@ -291,30 +321,32 @@ static const char * const ts_field_names[] = { static const TSFieldMapSlice ts_field_map_slices[PRODUCTION_ID_COUNT] = { [1] = {.index = 0, .length = 1}, - [2] = {.index = 1, .length = 2}, - [3] = {.index = 3, .length = 2}, - [4] = {.index = 5, .length = 3}, - [5] = {.index = 8, .length = 3}, - [6] = {.index = 11, .length = 3}, - [7] = {.index = 14, .length = 1}, - [8] = {.index = 15, .length = 1}, - [9] = {.index = 16, .length = 2}, - [10] = {.index = 18, .length = 1}, + [2] = {.index = 1, .length = 1}, + [3] = {.index = 2, .length = 2}, + [4] = {.index = 4, .length = 2}, + [5] = {.index = 6, .length = 2}, + [6] = {.index = 8, .length = 3}, + [7] = {.index = 11, .length = 3}, + [8] = {.index = 14, .length = 1}, + [9] = {.index = 15, .length = 2}, + [10] = {.index = 17, .length = 1}, + [11] = {.index = 18, .length = 1}, }; static const TSFieldMapEntry ts_field_map_entries[] = { [0] = {field_name, 0}, [1] = + {field_statements, 0}, + [2] = + {field_statements, 1}, + {field_use_clause, 0}, + [4] = {field_input, 1}, {field_operation_name, 0}, - [3] = + [6] = {field_head, 0}, {field_selection, 2}, - [5] = - {field_input, 2}, - {field_operation_name, 1}, - {field_use_clause, 0}, [8] = {field_identifier, 0}, {field_identifier, 1}, @@ -324,12 +356,12 @@ static const TSFieldMapEntry ts_field_map_entries[] = { {field_selection, 3}, {field_tail, 1}, [14] = - {field_fields, 1}, + {field_bindings, 1}, [15] = - {field_identifier, 4}, - [16] = {field_key, 0}, {field_value, 2}, + [17] = + {field_identifier, 4}, [18] = {field_list_fields, 1}, }; @@ -347,412 +379,447 @@ static bool ts_lex(TSLexer *lexer, TSStateId state) { eof = lexer->eof(lexer); switch (state) { case 0: - if (eof) ADVANCE(27); + if (eof) ADVANCE(28); if (lookahead == '"') ADVANCE(2); - if (lookahead == '#') ADVANCE(32); - if (lookahead == ',') ADVANCE(37); - if (lookahead == '-') ADVANCE(5); - if (lookahead == '.') ADVANCE(31); - if (lookahead == '/') ADVANCE(4); - if (lookahead == '0') ADVANCE(62); - if (lookahead == '=') ADVANCE(38); - if (lookahead == '[') ADVANCE(35); - if (lookahead == ']') ADVANCE(36); - if (lookahead == 'f') ADVANCE(39); - if (lookahead == 'n') ADVANCE(54); - if (lookahead == 's') ADVANCE(45); - if (lookahead == 't') ADVANCE(51); - if (lookahead == 'u') ADVANCE(52); - if (lookahead == '{') ADVANCE(33); - if (lookahead == '}') ADVANCE(34); + if (lookahead == '#') ADVANCE(35); + if (lookahead == ',') ADVANCE(30); + if (lookahead == '-') ADVANCE(7); + if (lookahead == '.') ADVANCE(34); + if (lookahead == '/') ADVANCE(6); + if (lookahead == '0') ADVANCE(66); + if (lookahead == '=') ADVANCE(40); + if (lookahead == '[') ADVANCE(38); + if (lookahead == ']') ADVANCE(39); + if (lookahead == 'f') ADVANCE(41); + if (lookahead == 'l') ADVANCE(43); + if (lookahead == 'n') ADVANCE(58); + if (lookahead == 's') ADVANCE(48); + if (lookahead == 't') ADVANCE(54); + if (lookahead == 'u') ADVANCE(55); + if (lookahead == '{') ADVANCE(36); + if (lookahead == '}') ADVANCE(37); if (lookahead == '\t' || lookahead == '\n' || lookahead == '\r' || - lookahead == ' ') ADVANCE(70); - if (('1' <= lookahead && lookahead <= '9')) ADVANCE(63); + lookahead == ' ') ADVANCE(74); + if (('1' <= lookahead && lookahead <= '9')) ADVANCE(67); if (('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 1: if (lookahead == '"') ADVANCE(2); - if (lookahead == '-') ADVANCE(5); - if (lookahead == '/') ADVANCE(4); - if (lookahead == '0') ADVANCE(62); - if (lookahead == '[') ADVANCE(35); - if (lookahead == ']') ADVANCE(36); - if (lookahead == 'f') ADVANCE(6); - if (lookahead == 'n') ADVANCE(20); - if (lookahead == 's') ADVANCE(11); - if (lookahead == 't') ADVANCE(17); - if (lookahead == '{') ADVANCE(33); + if (lookahead == '-') ADVANCE(7); + if (lookahead == '/') ADVANCE(6); + if (lookahead == '0') ADVANCE(66); + if (lookahead == '[') ADVANCE(38); + if (lookahead == ']') ADVANCE(39); + if (lookahead == 'f') ADVANCE(8); + if (lookahead == 'n') ADVANCE(22); + if (lookahead == 's') ADVANCE(13); + if (lookahead == 't') ADVANCE(19); + if (lookahead == '{') ADVANCE(36); if (lookahead == '\t' || lookahead == '\n' || lookahead == '\r' || - lookahead == ' ') ADVANCE(70); - if (('1' <= lookahead && lookahead <= '9')) ADVANCE(63); + lookahead == ' ') ADVANCE(74); + if (('1' <= lookahead && lookahead <= '9')) ADVANCE(67); END_STATE(); case 2: - if (lookahead == '"') ADVANCE(66); - if (lookahead == '\\') ADVANCE(25); + if (lookahead == '"') ADVANCE(70); + if (lookahead == '\\') ADVANCE(27); if (lookahead != 0) ADVANCE(2); END_STATE(); case 3: - if (lookahead == '.') ADVANCE(31); - if (lookahead == '/') ADVANCE(4); - if (lookahead == '}') ADVANCE(34); + if (lookahead == '.') ADVANCE(34); + if (lookahead == '/') ADVANCE(6); + if (lookahead == 'l') ADVANCE(43); if (lookahead == '\t' || lookahead == '\n' || lookahead == '\r' || - lookahead == ' ') ADVANCE(70); + lookahead == ' ') ADVANCE(74); if (('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 4: - if (lookahead == '/') ADVANCE(69); + if (lookahead == '/') ADVANCE(6); + if (lookahead == 'l') ADVANCE(43); + if (lookahead == 'u') ADVANCE(55); + if (lookahead == '\t' || + lookahead == '\n' || + lookahead == '\r' || + lookahead == ' ') ADVANCE(74); + if (('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 5: - if (lookahead == '0') ADVANCE(62); - if (('1' <= lookahead && lookahead <= '9')) ADVANCE(63); + if (lookahead == '/') ADVANCE(6); + if (lookahead == '}') ADVANCE(37); + if (lookahead == '\t' || + lookahead == '\n' || + lookahead == '\r' || + lookahead == ' ') ADVANCE(74); + if (('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 6: - if (lookahead == 'a') ADVANCE(13); + if (lookahead == '/') ADVANCE(73); END_STATE(); case 7: - if (lookahead == 'c') ADVANCE(10); + if (lookahead == '0') ADVANCE(66); + if (('1' <= lookahead && lookahead <= '9')) ADVANCE(67); END_STATE(); case 8: - if (lookahead == 'e') ADVANCE(58); + if (lookahead == 'a') ADVANCE(15); END_STATE(); case 9: - if (lookahead == 'e') ADVANCE(60); + if (lookahead == 'c') ADVANCE(12); END_STATE(); case 10: - if (lookahead == 'e') ADVANCE(29); + if (lookahead == 'e') ADVANCE(62); END_STATE(); case 11: - if (lookahead == 'e') ADVANCE(16); + if (lookahead == 'e') ADVANCE(64); END_STATE(); case 12: - if (lookahead == 'i') ADVANCE(7); + if (lookahead == 'e') ADVANCE(32); END_STATE(); case 13: - if (lookahead == 'l') ADVANCE(18); + if (lookahead == 'e') ADVANCE(18); END_STATE(); case 14: - if (lookahead == 'l') ADVANCE(67); + if (lookahead == 'i') ADVANCE(9); END_STATE(); case 15: - if (lookahead == 'l') ADVANCE(14); + if (lookahead == 'l') ADVANCE(20); END_STATE(); case 16: - if (lookahead == 'r') ADVANCE(21); + if (lookahead == 'l') ADVANCE(71); END_STATE(); case 17: - if (lookahead == 'r') ADVANCE(19); + if (lookahead == 'l') ADVANCE(16); END_STATE(); case 18: - if (lookahead == 's') ADVANCE(9); + if (lookahead == 'r') ADVANCE(23); END_STATE(); case 19: - if (lookahead == 'u') ADVANCE(8); + if (lookahead == 'r') ADVANCE(21); END_STATE(); case 20: - if (lookahead == 'u') ADVANCE(15); + if (lookahead == 's') ADVANCE(11); END_STATE(); case 21: - if (lookahead == 'v') ADVANCE(12); + if (lookahead == 'u') ADVANCE(10); END_STATE(); case 22: - if (lookahead == '+' || - lookahead == '-') ADVANCE(24); - if (('0' <= lookahead && lookahead <= '9')) ADVANCE(65); + if (lookahead == 'u') ADVANCE(17); END_STATE(); case 23: - if (('0' <= lookahead && lookahead <= '9')) ADVANCE(64); + if (lookahead == 'v') ADVANCE(14); END_STATE(); case 24: - if (('0' <= lookahead && lookahead <= '9')) ADVANCE(65); + if (lookahead == '+' || + lookahead == '-') ADVANCE(26); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(69); END_STATE(); case 25: - if (lookahead != 0 && - lookahead != '\n') ADVANCE(2); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(68); END_STATE(); case 26: - if (eof) ADVANCE(27); - if (lookahead == '/') ADVANCE(4); - if (lookahead == 'u') ADVANCE(52); - if (lookahead == '\t' || - lookahead == '\n' || - lookahead == '\r' || - lookahead == ' ') ADVANCE(70); - if (('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(69); END_STATE(); case 27: - ACCEPT_TOKEN(ts_builtin_sym_end); + if (lookahead != 0 && + lookahead != '\n') ADVANCE(2); END_STATE(); case 28: - ACCEPT_TOKEN(anon_sym_use); + ACCEPT_TOKEN(ts_builtin_sym_end); + END_STATE(); + case 29: + ACCEPT_TOKEN(anon_sym_let); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); - END_STATE(); - case 29: - ACCEPT_TOKEN(anon_sym_service); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 30: - ACCEPT_TOKEN(anon_sym_service); + ACCEPT_TOKEN(anon_sym_COMMA); + END_STATE(); + case 31: + ACCEPT_TOKEN(anon_sym_use); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); - END_STATE(); - case 31: - ACCEPT_TOKEN(anon_sym_DOT); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 32: - ACCEPT_TOKEN(anon_sym_POUND); + ACCEPT_TOKEN(anon_sym_service); END_STATE(); case 33: - ACCEPT_TOKEN(anon_sym_LBRACE); + ACCEPT_TOKEN(anon_sym_service); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 34: - ACCEPT_TOKEN(anon_sym_RBRACE); + ACCEPT_TOKEN(anon_sym_DOT); END_STATE(); case 35: - ACCEPT_TOKEN(anon_sym_LBRACK); + ACCEPT_TOKEN(anon_sym_POUND); END_STATE(); case 36: - ACCEPT_TOKEN(anon_sym_RBRACK); + ACCEPT_TOKEN(anon_sym_LBRACE); END_STATE(); case 37: - ACCEPT_TOKEN(anon_sym_COMMA); + ACCEPT_TOKEN(anon_sym_RBRACE); END_STATE(); case 38: - ACCEPT_TOKEN(anon_sym_EQ); + ACCEPT_TOKEN(anon_sym_LBRACK); END_STATE(); case 39: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'a') ADVANCE(49); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('b' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ACCEPT_TOKEN(anon_sym_RBRACK); END_STATE(); case 40: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'c') ADVANCE(44); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ACCEPT_TOKEN(anon_sym_EQ); END_STATE(); case 41: ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'e') ADVANCE(28); + if (lookahead == 'a') ADVANCE(52); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ('b' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 42: ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'e') ADVANCE(59); + if (lookahead == 'c') ADVANCE(47); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 43: ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'e') ADVANCE(61); + if (lookahead == 'e') ADVANCE(57); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 44: ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'e') ADVANCE(30); + if (lookahead == 'e') ADVANCE(31); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 45: ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'e') ADVANCE(50); + if (lookahead == 'e') ADVANCE(63); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 46: ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'i') ADVANCE(40); + if (lookahead == 'e') ADVANCE(65); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 47: ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'l') ADVANCE(68); + if (lookahead == 'e') ADVANCE(33); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 48: ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'l') ADVANCE(47); + if (lookahead == 'e') ADVANCE(53); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 49: ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'l') ADVANCE(53); + if (lookahead == 'i') ADVANCE(42); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 50: ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'r') ADVANCE(56); + if (lookahead == 'l') ADVANCE(72); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 51: ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'r') ADVANCE(55); + if (lookahead == 'l') ADVANCE(50); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 52: ACCEPT_TOKEN(sym_identifier); - if (lookahead == 's') ADVANCE(41); + if (lookahead == 'l') ADVANCE(56); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 53: ACCEPT_TOKEN(sym_identifier); - if (lookahead == 's') ADVANCE(43); + if (lookahead == 'r') ADVANCE(60); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 54: ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'u') ADVANCE(48); + if (lookahead == 'r') ADVANCE(59); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 55: ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'u') ADVANCE(42); + if (lookahead == 's') ADVANCE(44); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 56: ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'v') ADVANCE(46); + if (lookahead == 's') ADVANCE(46); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 57: ACCEPT_TOKEN(sym_identifier); + if (lookahead == 't') ADVANCE(29); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 58: - ACCEPT_TOKEN(anon_sym_true); + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'u') ADVANCE(51); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 59: - ACCEPT_TOKEN(anon_sym_true); + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'u') ADVANCE(45); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 60: - ACCEPT_TOKEN(anon_sym_false); + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'v') ADVANCE(49); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 61: - ACCEPT_TOKEN(anon_sym_false); + ACCEPT_TOKEN(sym_identifier); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); case 62: + ACCEPT_TOKEN(anon_sym_true); + END_STATE(); + case 63: + ACCEPT_TOKEN(anon_sym_true); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); + END_STATE(); + case 64: + ACCEPT_TOKEN(anon_sym_false); + END_STATE(); + case 65: + ACCEPT_TOKEN(anon_sym_false); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); + END_STATE(); + case 66: ACCEPT_TOKEN(sym_number); - if (lookahead == '.') ADVANCE(23); + if (lookahead == '.') ADVANCE(25); if (lookahead == 'E' || - lookahead == 'e') ADVANCE(22); + lookahead == 'e') ADVANCE(24); END_STATE(); - case 63: + case 67: ACCEPT_TOKEN(sym_number); - if (lookahead == '.') ADVANCE(23); + if (lookahead == '.') ADVANCE(25); if (lookahead == 'E' || - lookahead == 'e') ADVANCE(22); - if (('0' <= lookahead && lookahead <= '9')) ADVANCE(63); + lookahead == 'e') ADVANCE(24); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(67); END_STATE(); - case 64: + case 68: ACCEPT_TOKEN(sym_number); if (lookahead == 'E' || - lookahead == 'e') ADVANCE(22); - if (('0' <= lookahead && lookahead <= '9')) ADVANCE(64); + lookahead == 'e') ADVANCE(24); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(68); END_STATE(); - case 65: + case 69: ACCEPT_TOKEN(sym_number); - if (('0' <= lookahead && lookahead <= '9')) ADVANCE(65); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(69); END_STATE(); - case 66: + case 70: ACCEPT_TOKEN(sym_string); END_STATE(); - case 67: + case 71: ACCEPT_TOKEN(sym_null); END_STATE(); - case 68: + case 72: ACCEPT_TOKEN(sym_null); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); END_STATE(); - case 69: + case 73: ACCEPT_TOKEN(sym_comment); if (lookahead != 0 && - lookahead != '\n') ADVANCE(69); + lookahead != '\n') ADVANCE(73); END_STATE(); - case 70: + case 74: ACCEPT_TOKEN(sym_whitespace); if (lookahead == '\t' || lookahead == '\n' || lookahead == '\r' || - lookahead == ' ') ADVANCE(70); + lookahead == ' ') ADVANCE(74); END_STATE(); default: return false; @@ -761,14 +828,14 @@ static bool ts_lex(TSLexer *lexer, TSStateId state) { static const TSLexMode ts_lex_modes[STATE_COUNT] = { [0] = {.lex_state = 0}, - [1] = {.lex_state = 26}, + [1] = {.lex_state = 4}, [2] = {.lex_state = 1}, [3] = {.lex_state = 1}, [4] = {.lex_state = 1}, [5] = {.lex_state = 1}, [6] = {.lex_state = 1}, [7] = {.lex_state = 3}, - [8] = {.lex_state = 0}, + [8] = {.lex_state = 5}, [9] = {.lex_state = 0}, [10] = {.lex_state = 0}, [11] = {.lex_state = 0}, @@ -777,47 +844,54 @@ static const TSLexMode ts_lex_modes[STATE_COUNT] = { [14] = {.lex_state = 0}, [15] = {.lex_state = 0}, [16] = {.lex_state = 0}, - [17] = {.lex_state = 3}, + [17] = {.lex_state = 0}, [18] = {.lex_state = 0}, [19] = {.lex_state = 0}, - [20] = {.lex_state = 0}, + [20] = {.lex_state = 5}, [21] = {.lex_state = 0}, [22] = {.lex_state = 0}, - [23] = {.lex_state = 0}, + [23] = {.lex_state = 5}, [24] = {.lex_state = 3}, [25] = {.lex_state = 3}, [26] = {.lex_state = 0}, - [27] = {.lex_state = 3}, + [27] = {.lex_state = 0}, [28] = {.lex_state = 0}, [29] = {.lex_state = 0}, [30] = {.lex_state = 0}, - [31] = {.lex_state = 3}, - [32] = {.lex_state = 3}, + [31] = {.lex_state = 5}, + [32] = {.lex_state = 5}, [33] = {.lex_state = 0}, - [34] = {.lex_state = 0}, - [35] = {.lex_state = 0}, - [36] = {.lex_state = 3}, - [37] = {.lex_state = 3}, - [38] = {.lex_state = 3}, - [39] = {.lex_state = 3}, + [34] = {.lex_state = 5}, + [35] = {.lex_state = 3}, + [36] = {.lex_state = 0}, + [37] = {.lex_state = 0}, + [38] = {.lex_state = 0}, + [39] = {.lex_state = 5}, [40] = {.lex_state = 0}, - [41] = {.lex_state = 3}, + [41] = {.lex_state = 0}, [42] = {.lex_state = 0}, - [43] = {.lex_state = 0}, + [43] = {.lex_state = 5}, [44] = {.lex_state = 0}, - [45] = {.lex_state = 3}, - [46] = {.lex_state = 1}, + [45] = {.lex_state = 0}, + [46] = {.lex_state = 5}, [47] = {.lex_state = 0}, [48] = {.lex_state = 0}, - [49] = {.lex_state = 0}, - [50] = {.lex_state = 0}, + [49] = {.lex_state = 5}, + [50] = {.lex_state = 1}, [51] = {.lex_state = 0}, [52] = {.lex_state = 0}, + [53] = {.lex_state = 0}, + [54] = {.lex_state = 0}, + [55] = {.lex_state = 0}, + [56] = {.lex_state = 0}, + [57] = {.lex_state = 0}, }; static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [0] = { [ts_builtin_sym_end] = ACTIONS(1), + [anon_sym_let] = ACTIONS(1), + [anon_sym_COMMA] = ACTIONS(1), [anon_sym_use] = ACTIONS(1), [anon_sym_service] = ACTIONS(1), [anon_sym_DOT] = ACTIONS(1), @@ -826,7 +900,6 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [anon_sym_RBRACE] = ACTIONS(1), [anon_sym_LBRACK] = ACTIONS(1), [anon_sym_RBRACK] = ACTIONS(1), - [anon_sym_COMMA] = ACTIONS(1), [anon_sym_EQ] = ACTIONS(1), [sym_identifier] = ACTIONS(1), [anon_sym_true] = ACTIONS(1), @@ -838,11 +911,14 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym_whitespace] = ACTIONS(3), }, [1] = { - [sym_source_file] = STATE(50), - [sym_use_clause] = STATE(25), - [sym_qualified_identifier] = STATE(49), - [sym_operation_name] = STATE(29), - [ts_builtin_sym_end] = ACTIONS(5), + [sym_source_file] = STATE(54), + [sym_top_level_statement] = STATE(53), + [sym_let_binding] = STATE(52), + [sym_operation_call] = STATE(52), + [sym_use_clause] = STATE(7), + [sym_qualified_identifier] = STATE(51), + [sym_operation_name] = STATE(37), + [anon_sym_let] = ACTIONS(5), [anon_sym_use] = ACTIONS(7), [sym_identifier] = ACTIONS(9), [sym_comment] = ACTIONS(3), @@ -858,9 +934,9 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, ACTIONS(15), 1, anon_sym_RBRACK, - STATE(13), 1, + STATE(18), 1, sym_input_node, - STATE(42), 1, + STATE(47), 1, sym_list_fields, ACTIONS(3), 2, sym_comment, @@ -872,7 +948,7 @@ static const uint16_t ts_small_parse_table[] = { sym_number, sym_string, sym_null, - STATE(18), 3, + STATE(12), 3, sym_struct, sym_list, sym_boolean, @@ -883,7 +959,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, ACTIONS(21), 1, anon_sym_RBRACK, - STATE(30), 1, + STATE(38), 1, sym_input_node, ACTIONS(3), 2, sym_comment, @@ -895,7 +971,7 @@ static const uint16_t ts_small_parse_table[] = { sym_number, sym_string, sym_null, - STATE(18), 3, + STATE(12), 3, sym_struct, sym_list, sym_boolean, @@ -906,7 +982,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACK, ACTIONS(23), 1, anon_sym_RBRACK, - STATE(30), 1, + STATE(38), 1, sym_input_node, ACTIONS(3), 2, sym_comment, @@ -918,7 +994,7 @@ static const uint16_t ts_small_parse_table[] = { sym_number, sym_string, sym_null, - STATE(18), 3, + STATE(12), 3, sym_struct, sym_list, sym_boolean, @@ -927,7 +1003,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACE, ACTIONS(13), 1, anon_sym_LBRACK, - STATE(34), 1, + STATE(38), 1, sym_input_node, ACTIONS(3), 2, sym_comment, @@ -939,7 +1015,7 @@ static const uint16_t ts_small_parse_table[] = { sym_number, sym_string, sym_null, - STATE(18), 3, + STATE(12), 3, sym_struct, sym_list, sym_boolean, @@ -948,7 +1024,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_LBRACE, ACTIONS(13), 1, anon_sym_LBRACK, - STATE(30), 1, + STATE(29), 1, sym_input_node, ACTIONS(3), 2, sym_comment, @@ -960,371 +1036,419 @@ static const uint16_t ts_small_parse_table[] = { sym_number, sym_string, sym_null, - STATE(18), 3, + STATE(12), 3, sym_struct, sym_list, sym_boolean, - [152] = 5, + [152] = 7, + ACTIONS(5), 1, + anon_sym_let, + ACTIONS(9), 1, + sym_identifier, + STATE(37), 1, + sym_operation_name, + STATE(48), 1, + sym_top_level_statement, + STATE(51), 1, + sym_qualified_identifier, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + STATE(52), 2, + sym_let_binding, + sym_operation_call, + [176] = 5, ACTIONS(25), 1, anon_sym_RBRACE, ACTIONS(27), 1, sym_identifier, - STATE(26), 1, - sym_field, - STATE(48), 1, - sym_fields, + STATE(17), 1, + sym_binding, + STATE(41), 1, + sym_bindings, ACTIONS(3), 2, sym_comment, sym_whitespace, - [169] = 5, - ACTIONS(29), 1, - anon_sym_DOT, + [193] = 2, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + ACTIONS(29), 4, + ts_builtin_sym_end, + anon_sym_COMMA, + anon_sym_RBRACE, + anon_sym_RBRACK, + [204] = 5, ACTIONS(31), 1, - anon_sym_POUND, + anon_sym_DOT, ACTIONS(33), 1, + anon_sym_POUND, + ACTIONS(35), 1, anon_sym_LBRACE, - STATE(14), 1, + STATE(22), 1, aux_sym_qualified_identifier_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - [186] = 2, + [221] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(35), 4, + ACTIONS(37), 4, ts_builtin_sym_end, + anon_sym_COMMA, anon_sym_RBRACE, anon_sym_RBRACK, - anon_sym_COMMA, - [197] = 2, + [232] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(37), 4, + ACTIONS(39), 4, ts_builtin_sym_end, + anon_sym_COMMA, anon_sym_RBRACE, anon_sym_RBRACK, - anon_sym_COMMA, - [208] = 2, + [243] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(39), 3, + ACTIONS(41), 4, + ts_builtin_sym_end, + anon_sym_COMMA, anon_sym_RBRACE, anon_sym_RBRACK, + [254] = 2, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + ACTIONS(43), 4, + ts_builtin_sym_end, anon_sym_COMMA, - [218] = 4, - ACTIONS(23), 1, + anon_sym_RBRACE, anon_sym_RBRACK, - ACTIONS(41), 1, - anon_sym_COMMA, - STATE(20), 1, - aux_sym_list_fields_repeat1, + [265] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - [232] = 4, - ACTIONS(43), 1, + ACTIONS(45), 4, + ts_builtin_sym_end, + anon_sym_COMMA, + anon_sym_RBRACE, anon_sym_RBRACK, - ACTIONS(45), 1, + [276] = 4, + ACTIONS(23), 1, + anon_sym_RBRACK, + ACTIONS(47), 1, anon_sym_COMMA, - STATE(12), 1, + STATE(28), 1, aux_sym_list_fields_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - [246] = 4, - ACTIONS(29), 1, - anon_sym_DOT, - ACTIONS(47), 1, - anon_sym_POUND, - STATE(22), 1, - aux_sym_qualified_identifier_repeat1, + [290] = 4, + ACTIONS(49), 1, + anon_sym_COMMA, + ACTIONS(51), 1, + anon_sym_RBRACE, + STATE(21), 1, + aux_sym_bindings_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - [260] = 2, + [304] = 4, + ACTIONS(53), 1, + anon_sym_COMMA, + ACTIONS(55), 1, + anon_sym_RBRACK, + STATE(16), 1, + aux_sym_list_fields_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(49), 3, - anon_sym_RBRACE, - anon_sym_RBRACK, + [318] = 4, + ACTIONS(57), 1, anon_sym_COMMA, - [270] = 4, - ACTIONS(51), 1, + ACTIONS(60), 1, anon_sym_RBRACE, - ACTIONS(53), 1, - anon_sym_COMMA, - STATE(16), 1, - aux_sym_fields_repeat1, + STATE(19), 1, + aux_sym_bindings_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - [284] = 4, + [332] = 4, ACTIONS(27), 1, sym_identifier, - ACTIONS(56), 1, + ACTIONS(62), 1, anon_sym_RBRACE, - STATE(35), 1, - sym_field, + STATE(30), 1, + sym_binding, ACTIONS(3), 2, sym_comment, sym_whitespace, - [298] = 2, + [346] = 4, + ACTIONS(64), 1, + anon_sym_COMMA, + ACTIONS(66), 1, + anon_sym_RBRACE, + STATE(19), 1, + aux_sym_bindings_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(58), 3, - anon_sym_RBRACE, - anon_sym_RBRACK, - anon_sym_COMMA, - [308] = 2, + [360] = 4, + ACTIONS(31), 1, + anon_sym_DOT, + ACTIONS(68), 1, + anon_sym_POUND, + STATE(26), 1, + aux_sym_qualified_identifier_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(60), 3, + [374] = 4, + ACTIONS(27), 1, + sym_identifier, + ACTIONS(66), 1, anon_sym_RBRACE, - anon_sym_RBRACK, - anon_sym_COMMA, - [318] = 4, - ACTIONS(62), 1, - anon_sym_RBRACK, - ACTIONS(64), 1, - anon_sym_COMMA, - STATE(20), 1, - aux_sym_list_fields_repeat1, + STATE(30), 1, + sym_binding, ACTIONS(3), 2, sym_comment, sym_whitespace, - [332] = 4, - ACTIONS(29), 1, + [388] = 3, + ACTIONS(72), 1, anon_sym_DOT, - ACTIONS(31), 1, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + ACTIONS(70), 2, + anon_sym_let, + sym_identifier, + [400] = 3, + ACTIONS(76), 1, + anon_sym_DOT, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + ACTIONS(74), 2, + anon_sym_let, + sym_identifier, + [412] = 4, + ACTIONS(78), 1, + anon_sym_DOT, + ACTIONS(81), 1, anon_sym_POUND, - STATE(14), 1, + STATE(26), 1, aux_sym_qualified_identifier_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - [346] = 4, - ACTIONS(67), 1, + [426] = 4, + ACTIONS(31), 1, anon_sym_DOT, - ACTIONS(70), 1, + ACTIONS(33), 1, anon_sym_POUND, STATE(22), 1, aux_sym_qualified_identifier_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - [360] = 4, - ACTIONS(72), 1, - anon_sym_RBRACE, - ACTIONS(74), 1, + [440] = 4, + ACTIONS(83), 1, anon_sym_COMMA, - STATE(16), 1, - aux_sym_fields_repeat1, + ACTIONS(86), 1, + anon_sym_RBRACK, + STATE(28), 1, + aux_sym_list_fields_repeat1, ACTIONS(3), 2, sym_comment, sym_whitespace, - [374] = 4, - ACTIONS(27), 1, - sym_identifier, - ACTIONS(72), 1, - anon_sym_RBRACE, - STATE(35), 1, - sym_field, + [454] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - [388] = 4, - ACTIONS(76), 1, - sym_identifier, - STATE(33), 1, - sym_operation_name, - STATE(49), 1, - sym_qualified_identifier, + ACTIONS(88), 3, + ts_builtin_sym_end, + anon_sym_COMMA, + anon_sym_RBRACE, + [464] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - [402] = 4, - ACTIONS(78), 1, - anon_sym_RBRACE, - ACTIONS(80), 1, + ACTIONS(60), 2, anon_sym_COMMA, - STATE(23), 1, - aux_sym_fields_repeat1, + anon_sym_RBRACE, + [473] = 3, + ACTIONS(27), 1, + sym_identifier, + STATE(30), 1, + sym_binding, ACTIONS(3), 2, sym_comment, sym_whitespace, - [416] = 3, - ACTIONS(82), 1, + [484] = 3, + ACTIONS(90), 1, sym_identifier, - STATE(38), 1, + STATE(35), 1, sym_qualified_identifier, ACTIONS(3), 2, sym_comment, sym_whitespace, - [427] = 2, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - ACTIONS(70), 2, - anon_sym_DOT, - anon_sym_POUND, - [436] = 3, - ACTIONS(11), 1, - anon_sym_LBRACE, - STATE(40), 1, - sym_struct, + [495] = 3, + ACTIONS(92), 1, + ts_builtin_sym_end, + ACTIONS(94), 1, + anon_sym_COMMA, ACTIONS(3), 2, sym_comment, sym_whitespace, - [447] = 2, + [506] = 3, + ACTIONS(27), 1, + sym_identifier, + STATE(33), 1, + sym_binding, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(62), 2, - anon_sym_RBRACK, - anon_sym_COMMA, - [456] = 2, + [517] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(84), 2, - anon_sym_DOT, - sym_identifier, - [465] = 3, - ACTIONS(27), 1, + ACTIONS(96), 2, + anon_sym_let, sym_identifier, - STATE(35), 1, - sym_field, + [526] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - [476] = 3, + ACTIONS(81), 2, + anon_sym_DOT, + anon_sym_POUND, + [535] = 3, ACTIONS(11), 1, anon_sym_LBRACE, - STATE(43), 1, + STATE(45), 1, sym_struct, ACTIONS(3), 2, sym_comment, sym_whitespace, - [487] = 2, + [546] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, ACTIONS(86), 2, - anon_sym_RBRACE, anon_sym_COMMA, - [496] = 2, + anon_sym_RBRACK, + [555] = 2, + ACTIONS(98), 1, + sym_identifier, + ACTIONS(3), 2, + sym_comment, + sym_whitespace, + [563] = 2, + ACTIONS(100), 1, + ts_builtin_sym_end, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(51), 2, + [571] = 2, + ACTIONS(102), 1, anon_sym_RBRACE, - anon_sym_COMMA, - [505] = 2, ACTIONS(3), 2, sym_comment, sym_whitespace, - ACTIONS(88), 2, - anon_sym_DOT, - sym_identifier, - [514] = 2, - ACTIONS(90), 1, - sym_identifier, + [579] = 2, + ACTIONS(104), 1, + anon_sym_LBRACE, ACTIONS(3), 2, sym_comment, sym_whitespace, - [522] = 2, - ACTIONS(92), 1, + [587] = 2, + ACTIONS(106), 1, sym_identifier, ACTIONS(3), 2, sym_comment, sym_whitespace, - [530] = 2, - ACTIONS(94), 1, - sym_identifier, + [595] = 2, + ACTIONS(108), 1, + anon_sym_EQ, ACTIONS(3), 2, sym_comment, sym_whitespace, - [538] = 2, - ACTIONS(96), 1, + [603] = 2, + ACTIONS(110), 1, ts_builtin_sym_end, ACTIONS(3), 2, sym_comment, sym_whitespace, - [546] = 2, - ACTIONS(98), 1, + [611] = 2, + ACTIONS(112), 1, sym_identifier, ACTIONS(3), 2, sym_comment, sym_whitespace, - [554] = 2, - ACTIONS(100), 1, + [619] = 2, + ACTIONS(114), 1, anon_sym_RBRACK, ACTIONS(3), 2, sym_comment, sym_whitespace, - [562] = 2, - ACTIONS(102), 1, + [627] = 2, + ACTIONS(116), 1, ts_builtin_sym_end, ACTIONS(3), 2, sym_comment, sym_whitespace, - [570] = 2, - ACTIONS(104), 1, - anon_sym_LBRACE, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [578] = 2, - ACTIONS(106), 1, + [635] = 2, + ACTIONS(118), 1, sym_identifier, ACTIONS(3), 2, sym_comment, sym_whitespace, - [586] = 2, - ACTIONS(108), 1, + [643] = 2, + ACTIONS(120), 1, anon_sym_service, ACTIONS(3), 2, sym_comment, sym_whitespace, - [594] = 2, - ACTIONS(110), 1, - anon_sym_EQ, + [651] = 2, + ACTIONS(122), 1, + anon_sym_DOT, ACTIONS(3), 2, sym_comment, sym_whitespace, - [602] = 2, - ACTIONS(112), 1, - anon_sym_RBRACE, + [659] = 2, + ACTIONS(124), 1, + ts_builtin_sym_end, ACTIONS(3), 2, sym_comment, sym_whitespace, - [610] = 2, - ACTIONS(114), 1, - anon_sym_DOT, + [667] = 2, + ACTIONS(126), 1, + ts_builtin_sym_end, ACTIONS(3), 2, sym_comment, sym_whitespace, - [618] = 2, - ACTIONS(116), 1, + [675] = 2, + ACTIONS(128), 1, ts_builtin_sym_end, ACTIONS(3), 2, sym_comment, sym_whitespace, - [626] = 2, + [683] = 2, ACTIONS(3), 1, sym_comment, - ACTIONS(118), 1, + ACTIONS(130), 1, sym_whitespace, - [633] = 2, + [690] = 2, ACTIONS(3), 1, sym_comment, - ACTIONS(120), 1, + ACTIONS(132), 1, + sym_whitespace, + [697] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(134), 1, sym_whitespace, }; @@ -1335,114 +1459,126 @@ static const uint32_t ts_small_parse_table_map[] = { [SMALL_STATE(5)] = 96, [SMALL_STATE(6)] = 124, [SMALL_STATE(7)] = 152, - [SMALL_STATE(8)] = 169, - [SMALL_STATE(9)] = 186, - [SMALL_STATE(10)] = 197, - [SMALL_STATE(11)] = 208, - [SMALL_STATE(12)] = 218, - [SMALL_STATE(13)] = 232, - [SMALL_STATE(14)] = 246, - [SMALL_STATE(15)] = 260, - [SMALL_STATE(16)] = 270, - [SMALL_STATE(17)] = 284, - [SMALL_STATE(18)] = 298, - [SMALL_STATE(19)] = 308, - [SMALL_STATE(20)] = 318, - [SMALL_STATE(21)] = 332, - [SMALL_STATE(22)] = 346, - [SMALL_STATE(23)] = 360, - [SMALL_STATE(24)] = 374, - [SMALL_STATE(25)] = 388, - [SMALL_STATE(26)] = 402, - [SMALL_STATE(27)] = 416, - [SMALL_STATE(28)] = 427, - [SMALL_STATE(29)] = 436, - [SMALL_STATE(30)] = 447, - [SMALL_STATE(31)] = 456, - [SMALL_STATE(32)] = 465, - [SMALL_STATE(33)] = 476, - [SMALL_STATE(34)] = 487, - [SMALL_STATE(35)] = 496, - [SMALL_STATE(36)] = 505, - [SMALL_STATE(37)] = 514, - [SMALL_STATE(38)] = 522, - [SMALL_STATE(39)] = 530, - [SMALL_STATE(40)] = 538, - [SMALL_STATE(41)] = 546, - [SMALL_STATE(42)] = 554, - [SMALL_STATE(43)] = 562, - [SMALL_STATE(44)] = 570, - [SMALL_STATE(45)] = 578, - [SMALL_STATE(46)] = 586, - [SMALL_STATE(47)] = 594, - [SMALL_STATE(48)] = 602, - [SMALL_STATE(49)] = 610, - [SMALL_STATE(50)] = 618, - [SMALL_STATE(51)] = 626, - [SMALL_STATE(52)] = 633, + [SMALL_STATE(8)] = 176, + [SMALL_STATE(9)] = 193, + [SMALL_STATE(10)] = 204, + [SMALL_STATE(11)] = 221, + [SMALL_STATE(12)] = 232, + [SMALL_STATE(13)] = 243, + [SMALL_STATE(14)] = 254, + [SMALL_STATE(15)] = 265, + [SMALL_STATE(16)] = 276, + [SMALL_STATE(17)] = 290, + [SMALL_STATE(18)] = 304, + [SMALL_STATE(19)] = 318, + [SMALL_STATE(20)] = 332, + [SMALL_STATE(21)] = 346, + [SMALL_STATE(22)] = 360, + [SMALL_STATE(23)] = 374, + [SMALL_STATE(24)] = 388, + [SMALL_STATE(25)] = 400, + [SMALL_STATE(26)] = 412, + [SMALL_STATE(27)] = 426, + [SMALL_STATE(28)] = 440, + [SMALL_STATE(29)] = 454, + [SMALL_STATE(30)] = 464, + [SMALL_STATE(31)] = 473, + [SMALL_STATE(32)] = 484, + [SMALL_STATE(33)] = 495, + [SMALL_STATE(34)] = 506, + [SMALL_STATE(35)] = 517, + [SMALL_STATE(36)] = 526, + [SMALL_STATE(37)] = 535, + [SMALL_STATE(38)] = 546, + [SMALL_STATE(39)] = 555, + [SMALL_STATE(40)] = 563, + [SMALL_STATE(41)] = 571, + [SMALL_STATE(42)] = 579, + [SMALL_STATE(43)] = 587, + [SMALL_STATE(44)] = 595, + [SMALL_STATE(45)] = 603, + [SMALL_STATE(46)] = 611, + [SMALL_STATE(47)] = 619, + [SMALL_STATE(48)] = 627, + [SMALL_STATE(49)] = 635, + [SMALL_STATE(50)] = 643, + [SMALL_STATE(51)] = 651, + [SMALL_STATE(52)] = 659, + [SMALL_STATE(53)] = 667, + [SMALL_STATE(54)] = 675, + [SMALL_STATE(55)] = 683, + [SMALL_STATE(56)] = 690, + [SMALL_STATE(57)] = 697, }; static const TSParseActionEntry ts_parse_actions[] = { [0] = {.entry = {.count = 0, .reusable = false}}, [1] = {.entry = {.count = 1, .reusable = false}}, RECOVER(), [3] = {.entry = {.count = 1, .reusable = true}}, SHIFT_EXTRA(), - [5] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source_file, 0), - [7] = {.entry = {.count = 1, .reusable = false}}, SHIFT(52), - [9] = {.entry = {.count = 1, .reusable = false}}, SHIFT(8), - [11] = {.entry = {.count = 1, .reusable = true}}, SHIFT(7), + [5] = {.entry = {.count = 1, .reusable = false}}, SHIFT(55), + [7] = {.entry = {.count = 1, .reusable = false}}, SHIFT(57), + [9] = {.entry = {.count = 1, .reusable = false}}, SHIFT(10), + [11] = {.entry = {.count = 1, .reusable = true}}, SHIFT(8), [13] = {.entry = {.count = 1, .reusable = true}}, SHIFT(2), [15] = {.entry = {.count = 1, .reusable = true}}, SHIFT(15), - [17] = {.entry = {.count = 1, .reusable = true}}, SHIFT(19), - [19] = {.entry = {.count = 1, .reusable = true}}, SHIFT(18), + [17] = {.entry = {.count = 1, .reusable = true}}, SHIFT(9), + [19] = {.entry = {.count = 1, .reusable = true}}, SHIFT(12), [21] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_fields, 3), [23] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_fields, 2), - [25] = {.entry = {.count = 1, .reusable = true}}, SHIFT(9), - [27] = {.entry = {.count = 1, .reusable = true}}, SHIFT(47), - [29] = {.entry = {.count = 1, .reusable = true}}, SHIFT(45), - [31] = {.entry = {.count = 1, .reusable = true}}, SHIFT(37), - [33] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_operation_name, 1, .production_id = 1), - [35] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_struct, 2), - [37] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_struct, 3, .production_id = 7), - [39] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list, 3, .production_id = 10), - [41] = {.entry = {.count = 1, .reusable = true}}, SHIFT(3), - [43] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_fields, 1), - [45] = {.entry = {.count = 1, .reusable = true}}, SHIFT(4), - [47] = {.entry = {.count = 1, .reusable = true}}, SHIFT(39), - [49] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list, 2), - [51] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_fields_repeat1, 2), - [53] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_fields_repeat1, 2), SHIFT_REPEAT(32), - [56] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_fields, 3), - [58] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_input_node, 1), - [60] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_boolean, 1), - [62] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_list_fields_repeat1, 2), - [64] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_list_fields_repeat1, 2), SHIFT_REPEAT(6), - [67] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_qualified_identifier_repeat1, 2), SHIFT_REPEAT(45), - [70] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_qualified_identifier_repeat1, 2), - [72] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_fields, 2), - [74] = {.entry = {.count = 1, .reusable = true}}, SHIFT(17), - [76] = {.entry = {.count = 1, .reusable = true}}, SHIFT(8), - [78] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_fields, 1), - [80] = {.entry = {.count = 1, .reusable = true}}, SHIFT(24), - [82] = {.entry = {.count = 1, .reusable = true}}, SHIFT(21), - [84] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_qualified_identifier, 4, .production_id = 6), - [86] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_field, 3, .production_id = 9), - [88] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_qualified_identifier, 3, .production_id = 3), - [90] = {.entry = {.count = 1, .reusable = true}}, SHIFT(36), - [92] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_use_clause, 5, .production_id = 8), - [94] = {.entry = {.count = 1, .reusable = true}}, SHIFT(31), - [96] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source_file, 2, .production_id = 2), - [98] = {.entry = {.count = 1, .reusable = true}}, SHIFT(44), - [100] = {.entry = {.count = 1, .reusable = true}}, SHIFT(11), - [102] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source_file, 3, .production_id = 4), - [104] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_operation_name, 3, .production_id = 5), - [106] = {.entry = {.count = 1, .reusable = true}}, SHIFT(28), - [108] = {.entry = {.count = 1, .reusable = true}}, SHIFT(51), - [110] = {.entry = {.count = 1, .reusable = true}}, SHIFT(5), - [112] = {.entry = {.count = 1, .reusable = true}}, SHIFT(10), - [114] = {.entry = {.count = 1, .reusable = true}}, SHIFT(41), - [116] = {.entry = {.count = 1, .reusable = true}}, ACCEPT_INPUT(), - [118] = {.entry = {.count = 1, .reusable = true}}, SHIFT(27), - [120] = {.entry = {.count = 1, .reusable = true}}, SHIFT(46), + [25] = {.entry = {.count = 1, .reusable = true}}, SHIFT(14), + [27] = {.entry = {.count = 1, .reusable = true}}, SHIFT(44), + [29] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_boolean, 1), + [31] = {.entry = {.count = 1, .reusable = true}}, SHIFT(39), + [33] = {.entry = {.count = 1, .reusable = true}}, SHIFT(49), + [35] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_operation_name, 1, .production_id = 1), + [37] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list, 3, .production_id = 11), + [39] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_input_node, 1), + [41] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_struct, 3, .production_id = 8), + [43] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_struct, 2), + [45] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list, 2), + [47] = {.entry = {.count = 1, .reusable = true}}, SHIFT(3), + [49] = {.entry = {.count = 1, .reusable = true}}, SHIFT(23), + [51] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_bindings, 1), + [53] = {.entry = {.count = 1, .reusable = true}}, SHIFT(4), + [55] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_fields, 1), + [57] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_bindings_repeat1, 2), SHIFT_REPEAT(31), + [60] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_bindings_repeat1, 2), + [62] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_bindings, 3), + [64] = {.entry = {.count = 1, .reusable = true}}, SHIFT(20), + [66] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_bindings, 2), + [68] = {.entry = {.count = 1, .reusable = true}}, SHIFT(43), + [70] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_qualified_identifier, 3, .production_id = 5), + [72] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_qualified_identifier, 3, .production_id = 5), + [74] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_qualified_identifier, 4, .production_id = 7), + [76] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_qualified_identifier, 4, .production_id = 7), + [78] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_qualified_identifier_repeat1, 2), SHIFT_REPEAT(39), + [81] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_qualified_identifier_repeat1, 2), + [83] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_list_fields_repeat1, 2), SHIFT_REPEAT(5), + [86] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_list_fields_repeat1, 2), + [88] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_binding, 3, .production_id = 9), + [90] = {.entry = {.count = 1, .reusable = true}}, SHIFT(27), + [92] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_let_binding, 3), + [94] = {.entry = {.count = 1, .reusable = true}}, SHIFT(40), + [96] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_use_clause, 5, .production_id = 10), + [98] = {.entry = {.count = 1, .reusable = true}}, SHIFT(36), + [100] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_let_binding, 4), + [102] = {.entry = {.count = 1, .reusable = true}}, SHIFT(13), + [104] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_operation_name, 3, .production_id = 6), + [106] = {.entry = {.count = 1, .reusable = true}}, SHIFT(25), + [108] = {.entry = {.count = 1, .reusable = true}}, SHIFT(6), + [110] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_operation_call, 2, .production_id = 4), + [112] = {.entry = {.count = 1, .reusable = true}}, SHIFT(42), + [114] = {.entry = {.count = 1, .reusable = true}}, SHIFT(11), + [116] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source_file, 2, .production_id = 3), + [118] = {.entry = {.count = 1, .reusable = true}}, SHIFT(24), + [120] = {.entry = {.count = 1, .reusable = true}}, SHIFT(56), + [122] = {.entry = {.count = 1, .reusable = true}}, SHIFT(46), + [124] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_top_level_statement, 1), + [126] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source_file, 1, .production_id = 2), + [128] = {.entry = {.count = 1, .reusable = true}}, ACCEPT_INPUT(), + [130] = {.entry = {.count = 1, .reusable = true}}, SHIFT(34), + [132] = {.entry = {.count = 1, .reusable = true}}, SHIFT(32), + [134] = {.entry = {.count = 1, .reusable = true}}, SHIFT(50), }; #ifdef __cplusplus From fe168445a42459829fb8160a495fcb090432c9ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Fri, 14 Oct 2022 00:49:21 +0200 Subject: [PATCH 010/105] Add treesitter4s --- build.sbt | 3 +- .../libtree-sitter-smithyql.dylib | Bin 0 -> 51488 bytes .../libtree-sitter-smithyql.dylib | Bin 0 -> 17056 bytes .../linux-aarch64/libtree-sitter-smithyql.so | Bin 0 -> 16976 bytes .../linux-x86_64/libtree-sitter-smithyql.so | Bin 0 -> 20096 bytes .../playground/smithyql/ParserAdapter.scala | 29 +- .../smithyql/SmithyQLLanguageBindings.java | 18 + flake.nix | 15 +- tree-sitter-smithyql/src/parser.c | 3240 +++++++++-------- update-libs.sh | 14 + 10 files changed, 1816 insertions(+), 1503 deletions(-) create mode 100755 core/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib create mode 100755 core/src/main/resources/darwin-x86_64/libtree-sitter-smithyql.dylib create mode 100755 core/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so create mode 100755 core/src/main/resources/linux-x86_64/libtree-sitter-smithyql.so create mode 100644 core/src/main/scala/playground/smithyql/SmithyQLLanguageBindings.java create mode 100755 update-libs.sh diff --git a/build.sbt b/build.sbt index 33711bb0..453ebe81 100644 --- a/build.sbt +++ b/build.sbt @@ -45,6 +45,7 @@ val commonSettings = Seq( ), testFrameworks += new TestFramework("weaver.framework.CatsEffect"), compilerPlugins, + scalacOptions -= "-Xfatal-warnings", scalacOptions -= "-Vtype-diffs", scalacOptions += "-Wnonunit-statement", scalacOptions ++= Seq("-Xsource:3.0"), @@ -72,7 +73,7 @@ lazy val core = project "org.typelevel" %% "cats-parse" % "0.3.8", "org.typelevel" %% "paiges-cats" % "0.4.2", "com.softwaremill.diffx" %% "diffx-core" % "0.7.1" % Test, - "ai.serenade" % "java-tree-sitter" % "1.1.3-SNAPSHOT", + "org.polyvariant.treesitter4s" %% "bindings" % "0.1.0-2-36a569a-SNAPSHOT", ), commonSettings, Smithy4sCodegenPlugin.defaultSettings(Test), diff --git a/core/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib b/core/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib new file mode 100755 index 0000000000000000000000000000000000000000..2f81905238516214e9789aa4aef552863c1cfbde GIT binary patch literal 51488 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 H3=I4~nK6rG literal 0 HcmV?d00001 diff --git a/core/src/main/resources/darwin-x86_64/libtree-sitter-smithyql.dylib b/core/src/main/resources/darwin-x86_64/libtree-sitter-smithyql.dylib new file mode 100755 index 0000000000000000000000000000000000000000..1d816866c56ec8a970ebf43acba7f500e3f39dba GIT binary patch literal 17056 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

Soug?d`(t1GT}qrS-amE!9MB2-r@q&v zMU5j(dJcStpfiB{vt5th?mpwCc(HiP~fB|=P}7y1>*ng2TI9iVSRk7?XV^fTQd^bF%0y)~J-JJyE>z+mZa9M)4!UyO5W>Dn0_cl=Ed4MVM>QUr1xE?(6+RGGq zL|u4!4BifkJPt5L-Wr%%dHN1~?M0sU&!j}{sZ4!WNxE*Yq~BW${Z5o|71h7>W~RD_ zanxb&THwe}|4LBQO#|!Meql4DeE((2cOUzK{lIEtpI!lqI&4@|zz<}$pOV*%pL^5~ z=L2=#zkI0u&7lJJzccoCiTwj7GxgP@(sg$*kNRzZjn>J*-_+x0pmBJtRb*6q2>U6ovnJ-G$-Kg?kW$HI$OfF{rpJ5Na z8vd?h9(8-*m+%ky0^!TSpMk%*Dt`t3AitXV@4_DZ8SqyMf8Yel3VsIjKY$#37yMt& zJnH+L*MP5-r0X0>gVg|GqWji@MZW%eu^Pi ztOVFTV6G2qdCBOVzW~23B_5i3OHcpLkv7KlIbb{=+%NM1k9D3)UKX6^K%Va!eDlQv zoIb`5_l;oL%{|^2+I?rw5v0xbJdR!w`w)1xHFJoWr@jqY18`3FRpgUtx`5ulLyvKm z>%7%lK=1RCR(}E6XGJzpK=w}}Bh;~-$EQRVEFgPaWT67GJtAu;Ap1L!rA3yVx6!vl z6;#jlnjYzFTt15uC&r}f2zC0{7txEnBYN=HcoDtwKS;Xhr&}(fcVbZV zFlN_ZMDM^kqjz{@x^C5QdKll4vqo?8h;-cz!|7q%m%nZFCShKxx`^HhJTtgoZ$`Sa zFQRwgwD?24OdC!Q^GD>rjov=!O}L0&`I|0!P(@rL+Ac`uxoac1`e=pA_7 z=pBRJTf^!75c$J1#2eq}2d@sNhk331_mV%<%fLnSPP{7qknZu}^mrb`GlSEuhQIGa zkH-(s2|tsv_ez=kbIj+U$2jZ#r|9(;(EAMZ7-v16mzWNSUUq!qxtkt^d6(A=lQFKo zVDd8w^>9$~UC3sj*gXGcOvGG?v8HqM?!(6Z#qm~WJv-#v_ z!ZSwiLD3^TPwcsEo5+F%WDSsYW4`8kcnI~e4`plzwi&by^cdPU&4D2?`{XVpF9m_F4Y+%acAM_abbxfgu zi_lt@gI@#6X|Do31N#*s4>2E@IOir%_P302_`88A^0$QL;IC&2KZ`&)y@jBY&=0CW zIlW4zsIPe}M|tLe9)`REbQ02?%{cte0^JAunV?m*O{Er1a3_qhmIh_(vp6~JQ(ntOC9_bI5_bYv;)AzZV zbO-IA`{-fnh2pdHCHg9TgT77QqyL~6=*RRk`UU-xeoL>>8+4k^(jO?`lsK0-6Pz-q z!dc)fbe1~HoR!Wk&PHd86Lz*bZO;A9hn>C7Q_ex>8RyH+x16KSPn};muRG@)*B$Fl zc7yI5caeLOTjSQcx4L!iX1CEzxF2+PyB~8ObBV@LE;w?l@5H{JWUxQ0zkaaNVoy`` ziI!UYXv1d}N-Q1;Bjo *OZ#E!R-w6cs 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 literal 0 HcmV?d00001 diff --git a/core/src/main/resources/linux-x86_64/libtree-sitter-smithyql.so b/core/src/main/resources/linux-x86_64/libtree-sitter-smithyql.so new file mode 100755 index 0000000000000000000000000000000000000000..feafc0a7afbcd827bcde508eb242cce1f8e28a35 GIT binary patch literal 20096 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 src.substring(node.getStartByte(), node.getEndByte()) + def text: NodeDecoder[String] = (node, _) => node.source def firstMatch[B](implicit ev: A <:< List[B]): NodeDecoder[Option[B]] = this.map { _.headOption @@ -139,7 +135,7 @@ object ParserAdapter { (node, text) => NodeDecoder .children - .map(_.filter(_.getType() == tpe)) + .map(_.filter(_.tpe == tpe)) .map(_.map(this.decode(_, text))) .decode(node, text) @@ -163,11 +159,10 @@ object ParserAdapter { } - val children: NodeDecoder[List[Node]] = - (node, _) => List.tabulate(node.getChildCount())(node.getChild(_)) + val children: NodeDecoder[List[Node]] = (node, _) => node.children val childTypes: NodeDecoder[String] = children - .map(_.map(_.getType()).mkString(", ")) + .map(_.map(_.tpe).mkString(", ")) def union[A](decoders: (String, NodeDecoder[A])*): NodeDecoder[A] = (node, text) => @@ -248,12 +243,10 @@ object ParserAdapter { } def parse(s: String) = { - val p = new Parser() - p.setLanguage(Languages.smithyql()) - Using.resource(p.parseString(s)) { tree => - println(tree.getRootNode().getChildByFieldName("operation_name").getType()) - OpDecoders.op.decode(tree.getRootNode(), s) - } + val p = TreeSitterInstance.make(SmithyQLLanguageBindings.SmithyQL) + val tree = p.parse(s) + println(tree.rootNode.get.children.find(_.tpe == "top_level_statement").get.children.map(_.tpe)) + // OpDecoders.op.decode(tree.rootNode.get, s) } } diff --git a/core/src/main/scala/playground/smithyql/SmithyQLLanguageBindings.java b/core/src/main/scala/playground/smithyql/SmithyQLLanguageBindings.java new file mode 100644 index 00000000..82f75904 --- /dev/null +++ b/core/src/main/scala/playground/smithyql/SmithyQLLanguageBindings.java @@ -0,0 +1,18 @@ +package playground.smithyql; + +import com.sun.jna.Library; +import com.sun.jna.NativeLibrary; +import com.sun.jna.Native; +import org.polyvariant.treesitter4s.bindings.kernel.Language; + +public class SmithyQLLanguageBindings { + + private static interface Bindings extends Library { + Language tree_sitter_smithyql(); + } + + private static final Bindings LIBRARY = Language.loadLanguageLibrary("smithyql", Bindings.class); + + public static final Language SmithyQL = LIBRARY.tree_sitter_smithyql(); + +} diff --git a/flake.nix b/flake.nix index ebcd39bd..ad407afa 100644 --- a/flake.nix +++ b/flake.nix @@ -13,9 +13,21 @@ inherit system; overlays = [ jvm ]; }; + grammar = pkgs.stdenv.mkDerivation { + pname = "tree-sitter-smithyql"; + version = "0.0.0"; + src = ./tree-sitter-smithyql; + buildPhase = '' + cc src/parser.c -o parser.so -Isrc -shared + ''; + installPhase = '' + mkdir -p $out + cp parser.so $out/parser + ''; + }; in { - devShell = pkgs.mkShell { + devShells.default = pkgs.mkShell { buildInputs = [ pkgs.yarn pkgs.nodejs-14_x @@ -25,6 +37,7 @@ pkgs.tree-sitter ]; }; + packages.grammar = grammar; } ); } diff --git a/tree-sitter-smithyql/src/parser.c b/tree-sitter-smithyql/src/parser.c index 32e2bc5a..259d2116 100644 --- a/tree-sitter-smithyql/src/parser.c +++ b/tree-sitter-smithyql/src/parser.c @@ -55,235 +55,273 @@ enum { aux_sym_list_fields_repeat1 = 36, }; -static const char * const ts_symbol_names[] = { - [ts_builtin_sym_end] = "end", - [anon_sym_let] = "let", - [anon_sym_COMMA] = ",", - [anon_sym_use] = "use", - [anon_sym_service] = "service", - [anon_sym_DOT] = ".", - [anon_sym_POUND] = "#", - [anon_sym_LBRACE] = "{", - [anon_sym_RBRACE] = "}", - [anon_sym_LBRACK] = "[", - [anon_sym_RBRACK] = "]", - [anon_sym_EQ] = "=", - [sym_identifier] = "identifier", - [anon_sym_true] = "true", - [anon_sym_false] = "false", - [sym_number] = "number", - [sym_string] = "string", - [sym_null] = "null", - [sym_comment] = "comment", - [sym_whitespace] = "whitespace", - [sym_source_file] = "source_file", - [sym_top_level_statement] = "top_level_statement", - [sym_let_binding] = "let_binding", - [sym_operation_call] = "operation_call", - [sym_use_clause] = "use_clause", - [sym_qualified_identifier] = "qualified_identifier", - [sym_operation_name] = "operation_name", - [sym_input_node] = "input_node", - [sym_struct] = "struct", - [sym_list] = "list", - [sym_bindings] = "bindings", - [sym_binding] = "binding", - [sym_list_fields] = "list_fields", - [sym_boolean] = "boolean", - [aux_sym_qualified_identifier_repeat1] = "qualified_identifier_repeat1", - [aux_sym_bindings_repeat1] = "bindings_repeat1", - [aux_sym_list_fields_repeat1] = "list_fields_repeat1", +static const char *const ts_symbol_names[] = { + [ts_builtin_sym_end] = "end", + [anon_sym_let] = "let", + [anon_sym_COMMA] = ",", + [anon_sym_use] = "use", + [anon_sym_service] = "service", + [anon_sym_DOT] = ".", + [anon_sym_POUND] = "#", + [anon_sym_LBRACE] = "{", + [anon_sym_RBRACE] = "}", + [anon_sym_LBRACK] = "[", + [anon_sym_RBRACK] = "]", + [anon_sym_EQ] = "=", + [sym_identifier] = "identifier", + [anon_sym_true] = "true", + [anon_sym_false] = "false", + [sym_number] = "number", + [sym_string] = "string", + [sym_null] = "null", + [sym_comment] = "comment", + [sym_whitespace] = "whitespace", + [sym_source_file] = "source_file", + [sym_top_level_statement] = "top_level_statement", + [sym_let_binding] = "let_binding", + [sym_operation_call] = "operation_call", + [sym_use_clause] = "use_clause", + [sym_qualified_identifier] = "qualified_identifier", + [sym_operation_name] = "operation_name", + [sym_input_node] = "input_node", + [sym_struct] = "struct", + [sym_list] = "list", + [sym_bindings] = "bindings", + [sym_binding] = "binding", + [sym_list_fields] = "list_fields", + [sym_boolean] = "boolean", + [aux_sym_qualified_identifier_repeat1] = "qualified_identifier_repeat1", + [aux_sym_bindings_repeat1] = "bindings_repeat1", + [aux_sym_list_fields_repeat1] = "list_fields_repeat1", }; static const TSSymbol ts_symbol_map[] = { - [ts_builtin_sym_end] = ts_builtin_sym_end, - [anon_sym_let] = anon_sym_let, - [anon_sym_COMMA] = anon_sym_COMMA, - [anon_sym_use] = anon_sym_use, - [anon_sym_service] = anon_sym_service, - [anon_sym_DOT] = anon_sym_DOT, - [anon_sym_POUND] = anon_sym_POUND, - [anon_sym_LBRACE] = anon_sym_LBRACE, - [anon_sym_RBRACE] = anon_sym_RBRACE, - [anon_sym_LBRACK] = anon_sym_LBRACK, - [anon_sym_RBRACK] = anon_sym_RBRACK, - [anon_sym_EQ] = anon_sym_EQ, - [sym_identifier] = sym_identifier, - [anon_sym_true] = anon_sym_true, - [anon_sym_false] = anon_sym_false, - [sym_number] = sym_number, - [sym_string] = sym_string, - [sym_null] = sym_null, - [sym_comment] = sym_comment, - [sym_whitespace] = sym_whitespace, - [sym_source_file] = sym_source_file, - [sym_top_level_statement] = sym_top_level_statement, - [sym_let_binding] = sym_let_binding, - [sym_operation_call] = sym_operation_call, - [sym_use_clause] = sym_use_clause, - [sym_qualified_identifier] = sym_qualified_identifier, - [sym_operation_name] = sym_operation_name, - [sym_input_node] = sym_input_node, - [sym_struct] = sym_struct, - [sym_list] = sym_list, - [sym_bindings] = sym_bindings, - [sym_binding] = sym_binding, - [sym_list_fields] = sym_list_fields, - [sym_boolean] = sym_boolean, - [aux_sym_qualified_identifier_repeat1] = aux_sym_qualified_identifier_repeat1, - [aux_sym_bindings_repeat1] = aux_sym_bindings_repeat1, - [aux_sym_list_fields_repeat1] = aux_sym_list_fields_repeat1, + [ts_builtin_sym_end] = ts_builtin_sym_end, + [anon_sym_let] = anon_sym_let, + [anon_sym_COMMA] = anon_sym_COMMA, + [anon_sym_use] = anon_sym_use, + [anon_sym_service] = anon_sym_service, + [anon_sym_DOT] = anon_sym_DOT, + [anon_sym_POUND] = anon_sym_POUND, + [anon_sym_LBRACE] = anon_sym_LBRACE, + [anon_sym_RBRACE] = anon_sym_RBRACE, + [anon_sym_LBRACK] = anon_sym_LBRACK, + [anon_sym_RBRACK] = anon_sym_RBRACK, + [anon_sym_EQ] = anon_sym_EQ, + [sym_identifier] = sym_identifier, + [anon_sym_true] = anon_sym_true, + [anon_sym_false] = anon_sym_false, + [sym_number] = sym_number, + [sym_string] = sym_string, + [sym_null] = sym_null, + [sym_comment] = sym_comment, + [sym_whitespace] = sym_whitespace, + [sym_source_file] = sym_source_file, + [sym_top_level_statement] = sym_top_level_statement, + [sym_let_binding] = sym_let_binding, + [sym_operation_call] = sym_operation_call, + [sym_use_clause] = sym_use_clause, + [sym_qualified_identifier] = sym_qualified_identifier, + [sym_operation_name] = sym_operation_name, + [sym_input_node] = sym_input_node, + [sym_struct] = sym_struct, + [sym_list] = sym_list, + [sym_bindings] = sym_bindings, + [sym_binding] = sym_binding, + [sym_list_fields] = sym_list_fields, + [sym_boolean] = sym_boolean, + [aux_sym_qualified_identifier_repeat1] = + aux_sym_qualified_identifier_repeat1, + [aux_sym_bindings_repeat1] = aux_sym_bindings_repeat1, + [aux_sym_list_fields_repeat1] = aux_sym_list_fields_repeat1, }; static const TSSymbolMetadata ts_symbol_metadata[] = { - [ts_builtin_sym_end] = { - .visible = false, - .named = true, - }, - [anon_sym_let] = { - .visible = true, - .named = false, - }, - [anon_sym_COMMA] = { - .visible = true, - .named = false, - }, - [anon_sym_use] = { - .visible = true, - .named = false, - }, - [anon_sym_service] = { - .visible = true, - .named = false, - }, - [anon_sym_DOT] = { - .visible = true, - .named = false, - }, - [anon_sym_POUND] = { - .visible = true, - .named = false, - }, - [anon_sym_LBRACE] = { - .visible = true, - .named = false, - }, - [anon_sym_RBRACE] = { - .visible = true, - .named = false, - }, - [anon_sym_LBRACK] = { - .visible = true, - .named = false, - }, - [anon_sym_RBRACK] = { - .visible = true, - .named = false, - }, - [anon_sym_EQ] = { - .visible = true, - .named = false, - }, - [sym_identifier] = { - .visible = true, - .named = true, - }, - [anon_sym_true] = { - .visible = true, - .named = false, - }, - [anon_sym_false] = { - .visible = true, - .named = false, - }, - [sym_number] = { - .visible = true, - .named = true, - }, - [sym_string] = { - .visible = true, - .named = true, - }, - [sym_null] = { - .visible = true, - .named = true, - }, - [sym_comment] = { - .visible = true, - .named = true, - }, - [sym_whitespace] = { - .visible = true, - .named = true, - }, - [sym_source_file] = { - .visible = true, - .named = true, - }, - [sym_top_level_statement] = { - .visible = true, - .named = true, - }, - [sym_let_binding] = { - .visible = true, - .named = true, - }, - [sym_operation_call] = { - .visible = true, - .named = true, - }, - [sym_use_clause] = { - .visible = true, - .named = true, - }, - [sym_qualified_identifier] = { - .visible = true, - .named = true, - }, - [sym_operation_name] = { - .visible = true, - .named = true, - }, - [sym_input_node] = { - .visible = true, - .named = true, - }, - [sym_struct] = { - .visible = true, - .named = true, - }, - [sym_list] = { - .visible = true, - .named = true, - }, - [sym_bindings] = { - .visible = true, - .named = true, - }, - [sym_binding] = { - .visible = true, - .named = true, - }, - [sym_list_fields] = { - .visible = true, - .named = true, - }, - [sym_boolean] = { - .visible = true, - .named = true, - }, - [aux_sym_qualified_identifier_repeat1] = { - .visible = false, - .named = false, - }, - [aux_sym_bindings_repeat1] = { - .visible = false, - .named = false, - }, - [aux_sym_list_fields_repeat1] = { - .visible = false, - .named = false, - }, + [ts_builtin_sym_end] = + { + .visible = false, + .named = true, + }, + [anon_sym_let] = + { + .visible = true, + .named = false, + }, + [anon_sym_COMMA] = + { + .visible = true, + .named = false, + }, + [anon_sym_use] = + { + .visible = true, + .named = false, + }, + [anon_sym_service] = + { + .visible = true, + .named = false, + }, + [anon_sym_DOT] = + { + .visible = true, + .named = false, + }, + [anon_sym_POUND] = + { + .visible = true, + .named = false, + }, + [anon_sym_LBRACE] = + { + .visible = true, + .named = false, + }, + [anon_sym_RBRACE] = + { + .visible = true, + .named = false, + }, + [anon_sym_LBRACK] = + { + .visible = true, + .named = false, + }, + [anon_sym_RBRACK] = + { + .visible = true, + .named = false, + }, + [anon_sym_EQ] = + { + .visible = true, + .named = false, + }, + [sym_identifier] = + { + .visible = true, + .named = true, + }, + [anon_sym_true] = + { + .visible = true, + .named = false, + }, + [anon_sym_false] = + { + .visible = true, + .named = false, + }, + [sym_number] = + { + .visible = true, + .named = true, + }, + [sym_string] = + { + .visible = true, + .named = true, + }, + [sym_null] = + { + .visible = true, + .named = true, + }, + [sym_comment] = + { + .visible = true, + .named = true, + }, + [sym_whitespace] = + { + .visible = true, + .named = true, + }, + [sym_source_file] = + { + .visible = true, + .named = true, + }, + [sym_top_level_statement] = + { + .visible = true, + .named = true, + }, + [sym_let_binding] = + { + .visible = true, + .named = true, + }, + [sym_operation_call] = + { + .visible = true, + .named = true, + }, + [sym_use_clause] = + { + .visible = true, + .named = true, + }, + [sym_qualified_identifier] = + { + .visible = true, + .named = true, + }, + [sym_operation_name] = + { + .visible = true, + .named = true, + }, + [sym_input_node] = + { + .visible = true, + .named = true, + }, + [sym_struct] = + { + .visible = true, + .named = true, + }, + [sym_list] = + { + .visible = true, + .named = true, + }, + [sym_bindings] = + { + .visible = true, + .named = true, + }, + [sym_binding] = + { + .visible = true, + .named = true, + }, + [sym_list_fields] = + { + .visible = true, + .named = true, + }, + [sym_boolean] = + { + .visible = true, + .named = true, + }, + [aux_sym_qualified_identifier_repeat1] = + { + .visible = false, + .named = false, + }, + [aux_sym_bindings_repeat1] = + { + .visible = false, + .named = false, + }, + [aux_sym_list_fields_repeat1] = + { + .visible = false, + .named = false, + }, }; enum { @@ -302,1283 +340,1519 @@ enum { field_value = 13, }; -static const char * const ts_field_names[] = { - [0] = NULL, - [field_bindings] = "bindings", - [field_head] = "head", - [field_identifier] = "identifier", - [field_input] = "input", - [field_key] = "key", - [field_list_fields] = "list_fields", - [field_name] = "name", - [field_operation_name] = "operation_name", - [field_selection] = "selection", - [field_statements] = "statements", - [field_tail] = "tail", - [field_use_clause] = "use_clause", - [field_value] = "value", +static const char *const ts_field_names[] = { + [0] = NULL, + [field_bindings] = "bindings", + [field_head] = "head", + [field_identifier] = "identifier", + [field_input] = "input", + [field_key] = "key", + [field_list_fields] = "list_fields", + [field_name] = "name", + [field_operation_name] = "operation_name", + [field_selection] = "selection", + [field_statements] = "statements", + [field_tail] = "tail", + [field_use_clause] = "use_clause", + [field_value] = "value", }; static const TSFieldMapSlice ts_field_map_slices[PRODUCTION_ID_COUNT] = { - [1] = {.index = 0, .length = 1}, - [2] = {.index = 1, .length = 1}, - [3] = {.index = 2, .length = 2}, - [4] = {.index = 4, .length = 2}, - [5] = {.index = 6, .length = 2}, - [6] = {.index = 8, .length = 3}, - [7] = {.index = 11, .length = 3}, - [8] = {.index = 14, .length = 1}, - [9] = {.index = 15, .length = 2}, - [10] = {.index = 17, .length = 1}, - [11] = {.index = 18, .length = 1}, + [1] = {.index = 0, .length = 1}, [2] = {.index = 1, .length = 1}, + [3] = {.index = 2, .length = 2}, [4] = {.index = 4, .length = 2}, + [5] = {.index = 6, .length = 2}, [6] = {.index = 8, .length = 3}, + [7] = {.index = 11, .length = 3}, [8] = {.index = 14, .length = 1}, + [9] = {.index = 15, .length = 2}, [10] = {.index = 17, .length = 1}, + [11] = {.index = 18, .length = 1}, }; static const TSFieldMapEntry ts_field_map_entries[] = { - [0] = - {field_name, 0}, - [1] = - {field_statements, 0}, - [2] = - {field_statements, 1}, + [0] = {field_name, 0}, + [1] = {field_statements, 0}, + [2] = {field_statements, 1}, {field_use_clause, 0}, - [4] = - {field_input, 1}, + [4] = {field_input, 1}, {field_operation_name, 0}, - [6] = - {field_head, 0}, + [6] = {field_head, 0}, {field_selection, 2}, - [8] = - {field_identifier, 0}, + [8] = {field_identifier, 0}, {field_identifier, 1}, {field_name, 2}, - [11] = - {field_head, 0}, + [11] = {field_head, 0}, {field_selection, 3}, {field_tail, 1}, - [14] = - {field_bindings, 1}, - [15] = - {field_key, 0}, + [14] = {field_bindings, 1}, + [15] = {field_key, 0}, {field_value, 2}, - [17] = - {field_identifier, 4}, - [18] = - {field_list_fields, 1}, + [17] = {field_identifier, 4}, + [18] = {field_list_fields, 1}, }; -static const TSSymbol ts_alias_sequences[PRODUCTION_ID_COUNT][MAX_ALIAS_SEQUENCE_LENGTH] = { - [0] = {0}, +static const TSSymbol ts_alias_sequences[PRODUCTION_ID_COUNT] + [MAX_ALIAS_SEQUENCE_LENGTH] = { + [0] = {0}, }; static const uint16_t ts_non_terminal_alias_map[] = { - 0, + 0, }; static bool ts_lex(TSLexer *lexer, TSStateId state) { START_LEXER(); eof = lexer->eof(lexer); switch (state) { - case 0: - if (eof) ADVANCE(28); - if (lookahead == '"') ADVANCE(2); - if (lookahead == '#') ADVANCE(35); - if (lookahead == ',') ADVANCE(30); - if (lookahead == '-') ADVANCE(7); - if (lookahead == '.') ADVANCE(34); - if (lookahead == '/') ADVANCE(6); - if (lookahead == '0') ADVANCE(66); - if (lookahead == '=') ADVANCE(40); - if (lookahead == '[') ADVANCE(38); - if (lookahead == ']') ADVANCE(39); - if (lookahead == 'f') ADVANCE(41); - if (lookahead == 'l') ADVANCE(43); - if (lookahead == 'n') ADVANCE(58); - if (lookahead == 's') ADVANCE(48); - if (lookahead == 't') ADVANCE(54); - if (lookahead == 'u') ADVANCE(55); - if (lookahead == '{') ADVANCE(36); - if (lookahead == '}') ADVANCE(37); - if (lookahead == '\t' || - lookahead == '\n' || - lookahead == '\r' || - lookahead == ' ') ADVANCE(74); - if (('1' <= lookahead && lookahead <= '9')) ADVANCE(67); - if (('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 1: - if (lookahead == '"') ADVANCE(2); - if (lookahead == '-') ADVANCE(7); - if (lookahead == '/') ADVANCE(6); - if (lookahead == '0') ADVANCE(66); - if (lookahead == '[') ADVANCE(38); - if (lookahead == ']') ADVANCE(39); - if (lookahead == 'f') ADVANCE(8); - if (lookahead == 'n') ADVANCE(22); - if (lookahead == 's') ADVANCE(13); - if (lookahead == 't') ADVANCE(19); - if (lookahead == '{') ADVANCE(36); - if (lookahead == '\t' || - lookahead == '\n' || - lookahead == '\r' || - lookahead == ' ') ADVANCE(74); - if (('1' <= lookahead && lookahead <= '9')) ADVANCE(67); - END_STATE(); - case 2: - if (lookahead == '"') ADVANCE(70); - if (lookahead == '\\') ADVANCE(27); - if (lookahead != 0) ADVANCE(2); - END_STATE(); - case 3: - if (lookahead == '.') ADVANCE(34); - if (lookahead == '/') ADVANCE(6); - if (lookahead == 'l') ADVANCE(43); - if (lookahead == '\t' || - lookahead == '\n' || - lookahead == '\r' || - lookahead == ' ') ADVANCE(74); - if (('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 4: - if (lookahead == '/') ADVANCE(6); - if (lookahead == 'l') ADVANCE(43); - if (lookahead == 'u') ADVANCE(55); - if (lookahead == '\t' || - lookahead == '\n' || - lookahead == '\r' || - lookahead == ' ') ADVANCE(74); - if (('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 5: - if (lookahead == '/') ADVANCE(6); - if (lookahead == '}') ADVANCE(37); - if (lookahead == '\t' || - lookahead == '\n' || - lookahead == '\r' || - lookahead == ' ') ADVANCE(74); - if (('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 6: - if (lookahead == '/') ADVANCE(73); - END_STATE(); - case 7: - if (lookahead == '0') ADVANCE(66); - if (('1' <= lookahead && lookahead <= '9')) ADVANCE(67); - END_STATE(); - case 8: - if (lookahead == 'a') ADVANCE(15); - END_STATE(); - case 9: - if (lookahead == 'c') ADVANCE(12); - END_STATE(); - case 10: - if (lookahead == 'e') ADVANCE(62); - END_STATE(); - case 11: - if (lookahead == 'e') ADVANCE(64); - END_STATE(); - case 12: - if (lookahead == 'e') ADVANCE(32); - END_STATE(); - case 13: - if (lookahead == 'e') ADVANCE(18); - END_STATE(); - case 14: - if (lookahead == 'i') ADVANCE(9); - END_STATE(); - case 15: - if (lookahead == 'l') ADVANCE(20); - END_STATE(); - case 16: - if (lookahead == 'l') ADVANCE(71); - END_STATE(); - case 17: - if (lookahead == 'l') ADVANCE(16); - END_STATE(); - case 18: - if (lookahead == 'r') ADVANCE(23); - END_STATE(); - case 19: - if (lookahead == 'r') ADVANCE(21); - END_STATE(); - case 20: - if (lookahead == 's') ADVANCE(11); - END_STATE(); - case 21: - if (lookahead == 'u') ADVANCE(10); - END_STATE(); - case 22: - if (lookahead == 'u') ADVANCE(17); - END_STATE(); - case 23: - if (lookahead == 'v') ADVANCE(14); - END_STATE(); - case 24: - if (lookahead == '+' || - lookahead == '-') ADVANCE(26); - if (('0' <= lookahead && lookahead <= '9')) ADVANCE(69); - END_STATE(); - case 25: - if (('0' <= lookahead && lookahead <= '9')) ADVANCE(68); - END_STATE(); - case 26: - if (('0' <= lookahead && lookahead <= '9')) ADVANCE(69); - END_STATE(); - case 27: - if (lookahead != 0 && - lookahead != '\n') ADVANCE(2); - END_STATE(); - case 28: - ACCEPT_TOKEN(ts_builtin_sym_end); - END_STATE(); - case 29: - ACCEPT_TOKEN(anon_sym_let); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 30: - ACCEPT_TOKEN(anon_sym_COMMA); - END_STATE(); - case 31: - ACCEPT_TOKEN(anon_sym_use); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 32: - ACCEPT_TOKEN(anon_sym_service); - END_STATE(); - case 33: - ACCEPT_TOKEN(anon_sym_service); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 34: - ACCEPT_TOKEN(anon_sym_DOT); - END_STATE(); - case 35: - ACCEPT_TOKEN(anon_sym_POUND); - END_STATE(); - case 36: - ACCEPT_TOKEN(anon_sym_LBRACE); - END_STATE(); - case 37: - ACCEPT_TOKEN(anon_sym_RBRACE); - END_STATE(); - case 38: - ACCEPT_TOKEN(anon_sym_LBRACK); - END_STATE(); - case 39: - ACCEPT_TOKEN(anon_sym_RBRACK); - END_STATE(); - case 40: - ACCEPT_TOKEN(anon_sym_EQ); - END_STATE(); - case 41: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'a') ADVANCE(52); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('b' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 42: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'c') ADVANCE(47); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 43: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'e') ADVANCE(57); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 44: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'e') ADVANCE(31); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 45: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'e') ADVANCE(63); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 46: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'e') ADVANCE(65); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 47: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'e') ADVANCE(33); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 48: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'e') ADVANCE(53); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 49: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'i') ADVANCE(42); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 50: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'l') ADVANCE(72); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 51: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'l') ADVANCE(50); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 52: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'l') ADVANCE(56); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 53: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'r') ADVANCE(60); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 54: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'r') ADVANCE(59); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 55: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 's') ADVANCE(44); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 56: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 's') ADVANCE(46); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 57: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 't') ADVANCE(29); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 58: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'u') ADVANCE(51); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 59: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'u') ADVANCE(45); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 60: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'v') ADVANCE(49); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 61: - ACCEPT_TOKEN(sym_identifier); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 62: - ACCEPT_TOKEN(anon_sym_true); - END_STATE(); - case 63: - ACCEPT_TOKEN(anon_sym_true); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 64: - ACCEPT_TOKEN(anon_sym_false); - END_STATE(); - case 65: - ACCEPT_TOKEN(anon_sym_false); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 66: - ACCEPT_TOKEN(sym_number); - if (lookahead == '.') ADVANCE(25); - if (lookahead == 'E' || - lookahead == 'e') ADVANCE(24); - END_STATE(); - case 67: - ACCEPT_TOKEN(sym_number); - if (lookahead == '.') ADVANCE(25); - if (lookahead == 'E' || - lookahead == 'e') ADVANCE(24); - if (('0' <= lookahead && lookahead <= '9')) ADVANCE(67); - END_STATE(); - case 68: - ACCEPT_TOKEN(sym_number); - if (lookahead == 'E' || - lookahead == 'e') ADVANCE(24); - if (('0' <= lookahead && lookahead <= '9')) ADVANCE(68); - END_STATE(); - case 69: - ACCEPT_TOKEN(sym_number); - if (('0' <= lookahead && lookahead <= '9')) ADVANCE(69); - END_STATE(); - case 70: - ACCEPT_TOKEN(sym_string); - END_STATE(); - case 71: - ACCEPT_TOKEN(sym_null); - END_STATE(); - case 72: - ACCEPT_TOKEN(sym_null); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); - END_STATE(); - case 73: - ACCEPT_TOKEN(sym_comment); - if (lookahead != 0 && - lookahead != '\n') ADVANCE(73); - END_STATE(); - case 74: - ACCEPT_TOKEN(sym_whitespace); - if (lookahead == '\t' || - lookahead == '\n' || - lookahead == '\r' || - lookahead == ' ') ADVANCE(74); - END_STATE(); - default: - return false; + case 0: + if (eof) + ADVANCE(28); + if (lookahead == '"') + ADVANCE(2); + if (lookahead == '#') + ADVANCE(35); + if (lookahead == ',') + ADVANCE(30); + if (lookahead == '-') + ADVANCE(7); + if (lookahead == '.') + ADVANCE(34); + if (lookahead == '/') + ADVANCE(6); + if (lookahead == '0') + ADVANCE(66); + if (lookahead == '=') + ADVANCE(40); + if (lookahead == '[') + ADVANCE(38); + if (lookahead == ']') + ADVANCE(39); + if (lookahead == 'f') + ADVANCE(41); + if (lookahead == 'l') + ADVANCE(43); + if (lookahead == 'n') + ADVANCE(58); + if (lookahead == 's') + ADVANCE(48); + if (lookahead == 't') + ADVANCE(54); + if (lookahead == 'u') + ADVANCE(55); + if (lookahead == '{') + ADVANCE(36); + if (lookahead == '}') + ADVANCE(37); + if (lookahead == '\t' || lookahead == '\n' || lookahead == '\r' || + lookahead == ' ') + ADVANCE(74); + if (('1' <= lookahead && lookahead <= '9')) + ADVANCE(67); + if (('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 1: + if (lookahead == '"') + ADVANCE(2); + if (lookahead == '-') + ADVANCE(7); + if (lookahead == '/') + ADVANCE(6); + if (lookahead == '0') + ADVANCE(66); + if (lookahead == '[') + ADVANCE(38); + if (lookahead == ']') + ADVANCE(39); + if (lookahead == 'f') + ADVANCE(8); + if (lookahead == 'n') + ADVANCE(22); + if (lookahead == 's') + ADVANCE(13); + if (lookahead == 't') + ADVANCE(19); + if (lookahead == '{') + ADVANCE(36); + if (lookahead == '\t' || lookahead == '\n' || lookahead == '\r' || + lookahead == ' ') + ADVANCE(74); + if (('1' <= lookahead && lookahead <= '9')) + ADVANCE(67); + END_STATE(); + case 2: + if (lookahead == '"') + ADVANCE(70); + if (lookahead == '\\') + ADVANCE(27); + if (lookahead != 0) + ADVANCE(2); + END_STATE(); + case 3: + if (lookahead == '.') + ADVANCE(34); + if (lookahead == '/') + ADVANCE(6); + if (lookahead == 'l') + ADVANCE(43); + if (lookahead == '\t' || lookahead == '\n' || lookahead == '\r' || + lookahead == ' ') + ADVANCE(74); + if (('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 4: + if (lookahead == '/') + ADVANCE(6); + if (lookahead == 'l') + ADVANCE(43); + if (lookahead == 'u') + ADVANCE(55); + if (lookahead == '\t' || lookahead == '\n' || lookahead == '\r' || + lookahead == ' ') + ADVANCE(74); + if (('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 5: + if (lookahead == '/') + ADVANCE(6); + if (lookahead == '}') + ADVANCE(37); + if (lookahead == '\t' || lookahead == '\n' || lookahead == '\r' || + lookahead == ' ') + ADVANCE(74); + if (('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 6: + if (lookahead == '/') + ADVANCE(73); + END_STATE(); + case 7: + if (lookahead == '0') + ADVANCE(66); + if (('1' <= lookahead && lookahead <= '9')) + ADVANCE(67); + END_STATE(); + case 8: + if (lookahead == 'a') + ADVANCE(15); + END_STATE(); + case 9: + if (lookahead == 'c') + ADVANCE(12); + END_STATE(); + case 10: + if (lookahead == 'e') + ADVANCE(62); + END_STATE(); + case 11: + if (lookahead == 'e') + ADVANCE(64); + END_STATE(); + case 12: + if (lookahead == 'e') + ADVANCE(32); + END_STATE(); + case 13: + if (lookahead == 'e') + ADVANCE(18); + END_STATE(); + case 14: + if (lookahead == 'i') + ADVANCE(9); + END_STATE(); + case 15: + if (lookahead == 'l') + ADVANCE(20); + END_STATE(); + case 16: + if (lookahead == 'l') + ADVANCE(71); + END_STATE(); + case 17: + if (lookahead == 'l') + ADVANCE(16); + END_STATE(); + case 18: + if (lookahead == 'r') + ADVANCE(23); + END_STATE(); + case 19: + if (lookahead == 'r') + ADVANCE(21); + END_STATE(); + case 20: + if (lookahead == 's') + ADVANCE(11); + END_STATE(); + case 21: + if (lookahead == 'u') + ADVANCE(10); + END_STATE(); + case 22: + if (lookahead == 'u') + ADVANCE(17); + END_STATE(); + case 23: + if (lookahead == 'v') + ADVANCE(14); + END_STATE(); + case 24: + if (lookahead == '+' || lookahead == '-') + ADVANCE(26); + if (('0' <= lookahead && lookahead <= '9')) + ADVANCE(69); + END_STATE(); + case 25: + if (('0' <= lookahead && lookahead <= '9')) + ADVANCE(68); + END_STATE(); + case 26: + if (('0' <= lookahead && lookahead <= '9')) + ADVANCE(69); + END_STATE(); + case 27: + if (lookahead != 0 && lookahead != '\n') + ADVANCE(2); + END_STATE(); + case 28: + ACCEPT_TOKEN(ts_builtin_sym_end); + END_STATE(); + case 29: + ACCEPT_TOKEN(anon_sym_let); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 30: + ACCEPT_TOKEN(anon_sym_COMMA); + END_STATE(); + case 31: + ACCEPT_TOKEN(anon_sym_use); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 32: + ACCEPT_TOKEN(anon_sym_service); + END_STATE(); + case 33: + ACCEPT_TOKEN(anon_sym_service); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 34: + ACCEPT_TOKEN(anon_sym_DOT); + END_STATE(); + case 35: + ACCEPT_TOKEN(anon_sym_POUND); + END_STATE(); + case 36: + ACCEPT_TOKEN(anon_sym_LBRACE); + END_STATE(); + case 37: + ACCEPT_TOKEN(anon_sym_RBRACE); + END_STATE(); + case 38: + ACCEPT_TOKEN(anon_sym_LBRACK); + END_STATE(); + case 39: + ACCEPT_TOKEN(anon_sym_RBRACK); + END_STATE(); + case 40: + ACCEPT_TOKEN(anon_sym_EQ); + END_STATE(); + case 41: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'a') + ADVANCE(52); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('b' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 42: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'c') + ADVANCE(47); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 43: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'e') + ADVANCE(57); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 44: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'e') + ADVANCE(31); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 45: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'e') + ADVANCE(63); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 46: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'e') + ADVANCE(65); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 47: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'e') + ADVANCE(33); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 48: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'e') + ADVANCE(53); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 49: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'i') + ADVANCE(42); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 50: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'l') + ADVANCE(72); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 51: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'l') + ADVANCE(50); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 52: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'l') + ADVANCE(56); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 53: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'r') + ADVANCE(60); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 54: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'r') + ADVANCE(59); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 55: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 's') + ADVANCE(44); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 56: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 's') + ADVANCE(46); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 57: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 't') + ADVANCE(29); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 58: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'u') + ADVANCE(51); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 59: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'u') + ADVANCE(45); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 60: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'v') + ADVANCE(49); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 61: + ACCEPT_TOKEN(sym_identifier); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 62: + ACCEPT_TOKEN(anon_sym_true); + END_STATE(); + case 63: + ACCEPT_TOKEN(anon_sym_true); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 64: + ACCEPT_TOKEN(anon_sym_false); + END_STATE(); + case 65: + ACCEPT_TOKEN(anon_sym_false); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 66: + ACCEPT_TOKEN(sym_number); + if (lookahead == '.') + ADVANCE(25); + if (lookahead == 'E' || lookahead == 'e') + ADVANCE(24); + END_STATE(); + case 67: + ACCEPT_TOKEN(sym_number); + if (lookahead == '.') + ADVANCE(25); + if (lookahead == 'E' || lookahead == 'e') + ADVANCE(24); + if (('0' <= lookahead && lookahead <= '9')) + ADVANCE(67); + END_STATE(); + case 68: + ACCEPT_TOKEN(sym_number); + if (lookahead == 'E' || lookahead == 'e') + ADVANCE(24); + if (('0' <= lookahead && lookahead <= '9')) + ADVANCE(68); + END_STATE(); + case 69: + ACCEPT_TOKEN(sym_number); + if (('0' <= lookahead && lookahead <= '9')) + ADVANCE(69); + END_STATE(); + case 70: + ACCEPT_TOKEN(sym_string); + END_STATE(); + case 71: + ACCEPT_TOKEN(sym_null); + END_STATE(); + case 72: + ACCEPT_TOKEN(sym_null); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) + ADVANCE(61); + END_STATE(); + case 73: + ACCEPT_TOKEN(sym_comment); + if (lookahead != 0 && lookahead != '\n') + ADVANCE(73); + END_STATE(); + case 74: + ACCEPT_TOKEN(sym_whitespace); + if (lookahead == '\t' || lookahead == '\n' || lookahead == '\r' || + lookahead == ' ') + ADVANCE(74); + END_STATE(); + default: + return false; } } static const TSLexMode ts_lex_modes[STATE_COUNT] = { - [0] = {.lex_state = 0}, - [1] = {.lex_state = 4}, - [2] = {.lex_state = 1}, - [3] = {.lex_state = 1}, - [4] = {.lex_state = 1}, - [5] = {.lex_state = 1}, - [6] = {.lex_state = 1}, - [7] = {.lex_state = 3}, - [8] = {.lex_state = 5}, - [9] = {.lex_state = 0}, - [10] = {.lex_state = 0}, - [11] = {.lex_state = 0}, - [12] = {.lex_state = 0}, - [13] = {.lex_state = 0}, - [14] = {.lex_state = 0}, - [15] = {.lex_state = 0}, - [16] = {.lex_state = 0}, - [17] = {.lex_state = 0}, - [18] = {.lex_state = 0}, - [19] = {.lex_state = 0}, - [20] = {.lex_state = 5}, - [21] = {.lex_state = 0}, - [22] = {.lex_state = 0}, - [23] = {.lex_state = 5}, - [24] = {.lex_state = 3}, - [25] = {.lex_state = 3}, - [26] = {.lex_state = 0}, - [27] = {.lex_state = 0}, - [28] = {.lex_state = 0}, - [29] = {.lex_state = 0}, - [30] = {.lex_state = 0}, - [31] = {.lex_state = 5}, - [32] = {.lex_state = 5}, - [33] = {.lex_state = 0}, - [34] = {.lex_state = 5}, - [35] = {.lex_state = 3}, - [36] = {.lex_state = 0}, - [37] = {.lex_state = 0}, - [38] = {.lex_state = 0}, - [39] = {.lex_state = 5}, - [40] = {.lex_state = 0}, - [41] = {.lex_state = 0}, - [42] = {.lex_state = 0}, - [43] = {.lex_state = 5}, - [44] = {.lex_state = 0}, - [45] = {.lex_state = 0}, - [46] = {.lex_state = 5}, - [47] = {.lex_state = 0}, - [48] = {.lex_state = 0}, - [49] = {.lex_state = 5}, - [50] = {.lex_state = 1}, - [51] = {.lex_state = 0}, - [52] = {.lex_state = 0}, - [53] = {.lex_state = 0}, - [54] = {.lex_state = 0}, - [55] = {.lex_state = 0}, - [56] = {.lex_state = 0}, - [57] = {.lex_state = 0}, + [0] = {.lex_state = 0}, [1] = {.lex_state = 4}, [2] = {.lex_state = 1}, + [3] = {.lex_state = 1}, [4] = {.lex_state = 1}, [5] = {.lex_state = 1}, + [6] = {.lex_state = 1}, [7] = {.lex_state = 3}, [8] = {.lex_state = 5}, + [9] = {.lex_state = 0}, [10] = {.lex_state = 0}, [11] = {.lex_state = 0}, + [12] = {.lex_state = 0}, [13] = {.lex_state = 0}, [14] = {.lex_state = 0}, + [15] = {.lex_state = 0}, [16] = {.lex_state = 0}, [17] = {.lex_state = 0}, + [18] = {.lex_state = 0}, [19] = {.lex_state = 0}, [20] = {.lex_state = 5}, + [21] = {.lex_state = 0}, [22] = {.lex_state = 0}, [23] = {.lex_state = 5}, + [24] = {.lex_state = 3}, [25] = {.lex_state = 3}, [26] = {.lex_state = 0}, + [27] = {.lex_state = 0}, [28] = {.lex_state = 0}, [29] = {.lex_state = 0}, + [30] = {.lex_state = 0}, [31] = {.lex_state = 5}, [32] = {.lex_state = 5}, + [33] = {.lex_state = 0}, [34] = {.lex_state = 5}, [35] = {.lex_state = 3}, + [36] = {.lex_state = 0}, [37] = {.lex_state = 0}, [38] = {.lex_state = 0}, + [39] = {.lex_state = 5}, [40] = {.lex_state = 0}, [41] = {.lex_state = 0}, + [42] = {.lex_state = 0}, [43] = {.lex_state = 5}, [44] = {.lex_state = 0}, + [45] = {.lex_state = 0}, [46] = {.lex_state = 5}, [47] = {.lex_state = 0}, + [48] = {.lex_state = 0}, [49] = {.lex_state = 5}, [50] = {.lex_state = 1}, + [51] = {.lex_state = 0}, [52] = {.lex_state = 0}, [53] = {.lex_state = 0}, + [54] = {.lex_state = 0}, [55] = {.lex_state = 0}, [56] = {.lex_state = 0}, + [57] = {.lex_state = 0}, }; static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { - [0] = { - [ts_builtin_sym_end] = ACTIONS(1), - [anon_sym_let] = ACTIONS(1), - [anon_sym_COMMA] = ACTIONS(1), - [anon_sym_use] = ACTIONS(1), - [anon_sym_service] = ACTIONS(1), - [anon_sym_DOT] = ACTIONS(1), - [anon_sym_POUND] = ACTIONS(1), - [anon_sym_LBRACE] = ACTIONS(1), - [anon_sym_RBRACE] = ACTIONS(1), - [anon_sym_LBRACK] = ACTIONS(1), - [anon_sym_RBRACK] = ACTIONS(1), - [anon_sym_EQ] = ACTIONS(1), - [sym_identifier] = ACTIONS(1), - [anon_sym_true] = ACTIONS(1), - [anon_sym_false] = ACTIONS(1), - [sym_number] = ACTIONS(1), - [sym_string] = ACTIONS(1), - [sym_null] = ACTIONS(1), - [sym_comment] = ACTIONS(3), - [sym_whitespace] = ACTIONS(3), - }, - [1] = { - [sym_source_file] = STATE(54), - [sym_top_level_statement] = STATE(53), - [sym_let_binding] = STATE(52), - [sym_operation_call] = STATE(52), - [sym_use_clause] = STATE(7), - [sym_qualified_identifier] = STATE(51), - [sym_operation_name] = STATE(37), - [anon_sym_let] = ACTIONS(5), - [anon_sym_use] = ACTIONS(7), - [sym_identifier] = ACTIONS(9), - [sym_comment] = ACTIONS(3), - [sym_whitespace] = ACTIONS(3), - }, + [0] = + { + [ts_builtin_sym_end] = ACTIONS(1), [anon_sym_let] = ACTIONS(1), + [anon_sym_COMMA] = ACTIONS(1), [anon_sym_use] = ACTIONS(1), + [anon_sym_service] = ACTIONS(1), [anon_sym_DOT] = ACTIONS(1), + [anon_sym_POUND] = ACTIONS(1), [anon_sym_LBRACE] = ACTIONS(1), + [anon_sym_RBRACE] = ACTIONS(1), [anon_sym_LBRACK] = ACTIONS(1), + [anon_sym_RBRACK] = ACTIONS(1), [anon_sym_EQ] = ACTIONS(1), + [sym_identifier] = ACTIONS(1), [anon_sym_true] = ACTIONS(1), + [anon_sym_false] = ACTIONS(1), [sym_number] = ACTIONS(1), + [sym_string] = ACTIONS(1), [sym_null] = ACTIONS(1), + [sym_comment] = ACTIONS(3), [sym_whitespace] = ACTIONS(3), + }, + [1] = + { + [sym_source_file] = STATE(54), + [sym_top_level_statement] = STATE(53), + [sym_let_binding] = STATE(52), + [sym_operation_call] = STATE(52), + [sym_use_clause] = STATE(7), + [sym_qualified_identifier] = STATE(51), + [sym_operation_name] = STATE(37), + [anon_sym_let] = ACTIONS(5), + [anon_sym_use] = ACTIONS(7), + [sym_identifier] = ACTIONS(9), + [sym_comment] = ACTIONS(3), + [sym_whitespace] = ACTIONS(3), + }, }; static const uint16_t ts_small_parse_table[] = { - [0] = 9, - ACTIONS(11), 1, - anon_sym_LBRACE, - ACTIONS(13), 1, - anon_sym_LBRACK, - ACTIONS(15), 1, - anon_sym_RBRACK, - STATE(18), 1, - sym_input_node, - STATE(47), 1, - sym_list_fields, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - ACTIONS(17), 2, - anon_sym_true, - anon_sym_false, - ACTIONS(19), 3, - sym_number, - sym_string, - sym_null, - STATE(12), 3, - sym_struct, - sym_list, - sym_boolean, - [34] = 8, - ACTIONS(11), 1, - anon_sym_LBRACE, - ACTIONS(13), 1, - anon_sym_LBRACK, - ACTIONS(21), 1, - anon_sym_RBRACK, - STATE(38), 1, - sym_input_node, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - ACTIONS(17), 2, - anon_sym_true, - anon_sym_false, - ACTIONS(19), 3, - sym_number, - sym_string, - sym_null, - STATE(12), 3, - sym_struct, - sym_list, - sym_boolean, - [65] = 8, - ACTIONS(11), 1, - anon_sym_LBRACE, - ACTIONS(13), 1, - anon_sym_LBRACK, - ACTIONS(23), 1, - anon_sym_RBRACK, - STATE(38), 1, - sym_input_node, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - ACTIONS(17), 2, - anon_sym_true, - anon_sym_false, - ACTIONS(19), 3, - sym_number, - sym_string, - sym_null, - STATE(12), 3, - sym_struct, - sym_list, - sym_boolean, - [96] = 7, - ACTIONS(11), 1, - anon_sym_LBRACE, - ACTIONS(13), 1, - anon_sym_LBRACK, - STATE(38), 1, - sym_input_node, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - ACTIONS(17), 2, - anon_sym_true, - anon_sym_false, - ACTIONS(19), 3, - sym_number, - sym_string, - sym_null, - STATE(12), 3, - sym_struct, - sym_list, - sym_boolean, - [124] = 7, - ACTIONS(11), 1, - anon_sym_LBRACE, - ACTIONS(13), 1, - anon_sym_LBRACK, - STATE(29), 1, - sym_input_node, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - ACTIONS(17), 2, - anon_sym_true, - anon_sym_false, - ACTIONS(19), 3, - sym_number, - sym_string, - sym_null, - STATE(12), 3, - sym_struct, - sym_list, - sym_boolean, - [152] = 7, - ACTIONS(5), 1, - anon_sym_let, - ACTIONS(9), 1, - sym_identifier, - STATE(37), 1, - sym_operation_name, - STATE(48), 1, - sym_top_level_statement, - STATE(51), 1, - sym_qualified_identifier, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - STATE(52), 2, - sym_let_binding, - sym_operation_call, - [176] = 5, - ACTIONS(25), 1, - anon_sym_RBRACE, - ACTIONS(27), 1, - sym_identifier, - STATE(17), 1, - sym_binding, - STATE(41), 1, - sym_bindings, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [193] = 2, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - ACTIONS(29), 4, - ts_builtin_sym_end, - anon_sym_COMMA, - anon_sym_RBRACE, - anon_sym_RBRACK, - [204] = 5, - ACTIONS(31), 1, - anon_sym_DOT, - ACTIONS(33), 1, - anon_sym_POUND, - ACTIONS(35), 1, - anon_sym_LBRACE, - STATE(22), 1, - aux_sym_qualified_identifier_repeat1, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [221] = 2, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - ACTIONS(37), 4, - ts_builtin_sym_end, - anon_sym_COMMA, - anon_sym_RBRACE, - anon_sym_RBRACK, - [232] = 2, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - ACTIONS(39), 4, - ts_builtin_sym_end, - anon_sym_COMMA, - anon_sym_RBRACE, - anon_sym_RBRACK, - [243] = 2, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - ACTIONS(41), 4, - ts_builtin_sym_end, - anon_sym_COMMA, - anon_sym_RBRACE, - anon_sym_RBRACK, - [254] = 2, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - ACTIONS(43), 4, - ts_builtin_sym_end, - anon_sym_COMMA, - anon_sym_RBRACE, - anon_sym_RBRACK, - [265] = 2, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - ACTIONS(45), 4, - ts_builtin_sym_end, - anon_sym_COMMA, - anon_sym_RBRACE, - anon_sym_RBRACK, - [276] = 4, - ACTIONS(23), 1, - anon_sym_RBRACK, - ACTIONS(47), 1, - anon_sym_COMMA, - STATE(28), 1, - aux_sym_list_fields_repeat1, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [290] = 4, - ACTIONS(49), 1, - anon_sym_COMMA, - ACTIONS(51), 1, - anon_sym_RBRACE, - STATE(21), 1, - aux_sym_bindings_repeat1, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [304] = 4, - ACTIONS(53), 1, - anon_sym_COMMA, - ACTIONS(55), 1, - anon_sym_RBRACK, - STATE(16), 1, - aux_sym_list_fields_repeat1, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [318] = 4, - ACTIONS(57), 1, - anon_sym_COMMA, - ACTIONS(60), 1, - anon_sym_RBRACE, - STATE(19), 1, - aux_sym_bindings_repeat1, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [332] = 4, - ACTIONS(27), 1, - sym_identifier, - ACTIONS(62), 1, - anon_sym_RBRACE, - STATE(30), 1, - sym_binding, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [346] = 4, - ACTIONS(64), 1, - anon_sym_COMMA, - ACTIONS(66), 1, - anon_sym_RBRACE, - STATE(19), 1, - aux_sym_bindings_repeat1, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [360] = 4, - ACTIONS(31), 1, - anon_sym_DOT, - ACTIONS(68), 1, - anon_sym_POUND, - STATE(26), 1, - aux_sym_qualified_identifier_repeat1, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [374] = 4, - ACTIONS(27), 1, - sym_identifier, - ACTIONS(66), 1, - anon_sym_RBRACE, - STATE(30), 1, - sym_binding, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [388] = 3, - ACTIONS(72), 1, - anon_sym_DOT, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - ACTIONS(70), 2, - anon_sym_let, - sym_identifier, - [400] = 3, - ACTIONS(76), 1, - anon_sym_DOT, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - ACTIONS(74), 2, - anon_sym_let, - sym_identifier, - [412] = 4, - ACTIONS(78), 1, - anon_sym_DOT, - ACTIONS(81), 1, - anon_sym_POUND, - STATE(26), 1, - aux_sym_qualified_identifier_repeat1, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [426] = 4, - ACTIONS(31), 1, - anon_sym_DOT, - ACTIONS(33), 1, - anon_sym_POUND, - STATE(22), 1, - aux_sym_qualified_identifier_repeat1, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [440] = 4, - ACTIONS(83), 1, - anon_sym_COMMA, - ACTIONS(86), 1, - anon_sym_RBRACK, - STATE(28), 1, - aux_sym_list_fields_repeat1, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [454] = 2, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - ACTIONS(88), 3, - ts_builtin_sym_end, - anon_sym_COMMA, - anon_sym_RBRACE, - [464] = 2, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - ACTIONS(60), 2, - anon_sym_COMMA, - anon_sym_RBRACE, - [473] = 3, - ACTIONS(27), 1, - sym_identifier, - STATE(30), 1, - sym_binding, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [484] = 3, - ACTIONS(90), 1, - sym_identifier, - STATE(35), 1, - sym_qualified_identifier, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [495] = 3, - ACTIONS(92), 1, - ts_builtin_sym_end, - ACTIONS(94), 1, - anon_sym_COMMA, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [506] = 3, - ACTIONS(27), 1, - sym_identifier, - STATE(33), 1, - sym_binding, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [517] = 2, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - ACTIONS(96), 2, - anon_sym_let, - sym_identifier, - [526] = 2, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - ACTIONS(81), 2, - anon_sym_DOT, - anon_sym_POUND, - [535] = 3, - ACTIONS(11), 1, - anon_sym_LBRACE, - STATE(45), 1, - sym_struct, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [546] = 2, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - ACTIONS(86), 2, - anon_sym_COMMA, - anon_sym_RBRACK, - [555] = 2, - ACTIONS(98), 1, - sym_identifier, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [563] = 2, - ACTIONS(100), 1, - ts_builtin_sym_end, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [571] = 2, - ACTIONS(102), 1, - anon_sym_RBRACE, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [579] = 2, - ACTIONS(104), 1, - anon_sym_LBRACE, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [587] = 2, - ACTIONS(106), 1, - sym_identifier, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [595] = 2, - ACTIONS(108), 1, - anon_sym_EQ, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [603] = 2, - ACTIONS(110), 1, - ts_builtin_sym_end, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [611] = 2, - ACTIONS(112), 1, - sym_identifier, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [619] = 2, - ACTIONS(114), 1, - anon_sym_RBRACK, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [627] = 2, - ACTIONS(116), 1, - ts_builtin_sym_end, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [635] = 2, - ACTIONS(118), 1, - sym_identifier, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [643] = 2, - ACTIONS(120), 1, - anon_sym_service, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [651] = 2, - ACTIONS(122), 1, - anon_sym_DOT, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [659] = 2, - ACTIONS(124), 1, - ts_builtin_sym_end, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [667] = 2, - ACTIONS(126), 1, - ts_builtin_sym_end, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [675] = 2, - ACTIONS(128), 1, - ts_builtin_sym_end, - ACTIONS(3), 2, - sym_comment, - sym_whitespace, - [683] = 2, - ACTIONS(3), 1, - sym_comment, - ACTIONS(130), 1, - sym_whitespace, - [690] = 2, - ACTIONS(3), 1, - sym_comment, - ACTIONS(132), 1, - sym_whitespace, - [697] = 2, - ACTIONS(3), 1, - sym_comment, - ACTIONS(134), 1, - sym_whitespace, + [0] = 9, + ACTIONS(11), + 1, + anon_sym_LBRACE, + ACTIONS(13), + 1, + anon_sym_LBRACK, + ACTIONS(15), + 1, + anon_sym_RBRACK, + STATE(18), + 1, + sym_input_node, + STATE(47), + 1, + sym_list_fields, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + ACTIONS(17), + 2, + anon_sym_true, + anon_sym_false, + ACTIONS(19), + 3, + sym_number, + sym_string, + sym_null, + STATE(12), + 3, + sym_struct, + sym_list, + sym_boolean, + [34] = 8, + ACTIONS(11), + 1, + anon_sym_LBRACE, + ACTIONS(13), + 1, + anon_sym_LBRACK, + ACTIONS(21), + 1, + anon_sym_RBRACK, + STATE(38), + 1, + sym_input_node, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + ACTIONS(17), + 2, + anon_sym_true, + anon_sym_false, + ACTIONS(19), + 3, + sym_number, + sym_string, + sym_null, + STATE(12), + 3, + sym_struct, + sym_list, + sym_boolean, + [65] = 8, + ACTIONS(11), + 1, + anon_sym_LBRACE, + ACTIONS(13), + 1, + anon_sym_LBRACK, + ACTIONS(23), + 1, + anon_sym_RBRACK, + STATE(38), + 1, + sym_input_node, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + ACTIONS(17), + 2, + anon_sym_true, + anon_sym_false, + ACTIONS(19), + 3, + sym_number, + sym_string, + sym_null, + STATE(12), + 3, + sym_struct, + sym_list, + sym_boolean, + [96] = 7, + ACTIONS(11), + 1, + anon_sym_LBRACE, + ACTIONS(13), + 1, + anon_sym_LBRACK, + STATE(38), + 1, + sym_input_node, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + ACTIONS(17), + 2, + anon_sym_true, + anon_sym_false, + ACTIONS(19), + 3, + sym_number, + sym_string, + sym_null, + STATE(12), + 3, + sym_struct, + sym_list, + sym_boolean, + [124] = 7, + ACTIONS(11), + 1, + anon_sym_LBRACE, + ACTIONS(13), + 1, + anon_sym_LBRACK, + STATE(29), + 1, + sym_input_node, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + ACTIONS(17), + 2, + anon_sym_true, + anon_sym_false, + ACTIONS(19), + 3, + sym_number, + sym_string, + sym_null, + STATE(12), + 3, + sym_struct, + sym_list, + sym_boolean, + [152] = 7, + ACTIONS(5), + 1, + anon_sym_let, + ACTIONS(9), + 1, + sym_identifier, + STATE(37), + 1, + sym_operation_name, + STATE(48), + 1, + sym_top_level_statement, + STATE(51), + 1, + sym_qualified_identifier, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + STATE(52), + 2, + sym_let_binding, + sym_operation_call, + [176] = 5, + ACTIONS(25), + 1, + anon_sym_RBRACE, + ACTIONS(27), + 1, + sym_identifier, + STATE(17), + 1, + sym_binding, + STATE(41), + 1, + sym_bindings, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [193] = 2, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + ACTIONS(29), + 4, + ts_builtin_sym_end, + anon_sym_COMMA, + anon_sym_RBRACE, + anon_sym_RBRACK, + [204] = 5, + ACTIONS(31), + 1, + anon_sym_DOT, + ACTIONS(33), + 1, + anon_sym_POUND, + ACTIONS(35), + 1, + anon_sym_LBRACE, + STATE(22), + 1, + aux_sym_qualified_identifier_repeat1, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [221] = 2, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + ACTIONS(37), + 4, + ts_builtin_sym_end, + anon_sym_COMMA, + anon_sym_RBRACE, + anon_sym_RBRACK, + [232] = 2, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + ACTIONS(39), + 4, + ts_builtin_sym_end, + anon_sym_COMMA, + anon_sym_RBRACE, + anon_sym_RBRACK, + [243] = 2, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + ACTIONS(41), + 4, + ts_builtin_sym_end, + anon_sym_COMMA, + anon_sym_RBRACE, + anon_sym_RBRACK, + [254] = 2, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + ACTIONS(43), + 4, + ts_builtin_sym_end, + anon_sym_COMMA, + anon_sym_RBRACE, + anon_sym_RBRACK, + [265] = 2, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + ACTIONS(45), + 4, + ts_builtin_sym_end, + anon_sym_COMMA, + anon_sym_RBRACE, + anon_sym_RBRACK, + [276] = 4, + ACTIONS(23), + 1, + anon_sym_RBRACK, + ACTIONS(47), + 1, + anon_sym_COMMA, + STATE(28), + 1, + aux_sym_list_fields_repeat1, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [290] = 4, + ACTIONS(49), + 1, + anon_sym_COMMA, + ACTIONS(51), + 1, + anon_sym_RBRACE, + STATE(21), + 1, + aux_sym_bindings_repeat1, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [304] = 4, + ACTIONS(53), + 1, + anon_sym_COMMA, + ACTIONS(55), + 1, + anon_sym_RBRACK, + STATE(16), + 1, + aux_sym_list_fields_repeat1, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [318] = 4, + ACTIONS(57), + 1, + anon_sym_COMMA, + ACTIONS(60), + 1, + anon_sym_RBRACE, + STATE(19), + 1, + aux_sym_bindings_repeat1, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [332] = 4, + ACTIONS(27), + 1, + sym_identifier, + ACTIONS(62), + 1, + anon_sym_RBRACE, + STATE(30), + 1, + sym_binding, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [346] = 4, + ACTIONS(64), + 1, + anon_sym_COMMA, + ACTIONS(66), + 1, + anon_sym_RBRACE, + STATE(19), + 1, + aux_sym_bindings_repeat1, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [360] = 4, + ACTIONS(31), + 1, + anon_sym_DOT, + ACTIONS(68), + 1, + anon_sym_POUND, + STATE(26), + 1, + aux_sym_qualified_identifier_repeat1, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [374] = 4, + ACTIONS(27), + 1, + sym_identifier, + ACTIONS(66), + 1, + anon_sym_RBRACE, + STATE(30), + 1, + sym_binding, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [388] = 3, + ACTIONS(72), + 1, + anon_sym_DOT, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + ACTIONS(70), + 2, + anon_sym_let, + sym_identifier, + [400] = 3, + ACTIONS(76), + 1, + anon_sym_DOT, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + ACTIONS(74), + 2, + anon_sym_let, + sym_identifier, + [412] = 4, + ACTIONS(78), + 1, + anon_sym_DOT, + ACTIONS(81), + 1, + anon_sym_POUND, + STATE(26), + 1, + aux_sym_qualified_identifier_repeat1, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [426] = 4, + ACTIONS(31), + 1, + anon_sym_DOT, + ACTIONS(33), + 1, + anon_sym_POUND, + STATE(22), + 1, + aux_sym_qualified_identifier_repeat1, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [440] = 4, + ACTIONS(83), + 1, + anon_sym_COMMA, + ACTIONS(86), + 1, + anon_sym_RBRACK, + STATE(28), + 1, + aux_sym_list_fields_repeat1, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [454] = 2, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + ACTIONS(88), + 3, + ts_builtin_sym_end, + anon_sym_COMMA, + anon_sym_RBRACE, + [464] = 2, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + ACTIONS(60), + 2, + anon_sym_COMMA, + anon_sym_RBRACE, + [473] = 3, + ACTIONS(27), + 1, + sym_identifier, + STATE(30), + 1, + sym_binding, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [484] = 3, + ACTIONS(90), + 1, + sym_identifier, + STATE(35), + 1, + sym_qualified_identifier, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [495] = 3, + ACTIONS(92), + 1, + ts_builtin_sym_end, + ACTIONS(94), + 1, + anon_sym_COMMA, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [506] = 3, + ACTIONS(27), + 1, + sym_identifier, + STATE(33), + 1, + sym_binding, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [517] = 2, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + ACTIONS(96), + 2, + anon_sym_let, + sym_identifier, + [526] = 2, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + ACTIONS(81), + 2, + anon_sym_DOT, + anon_sym_POUND, + [535] = 3, + ACTIONS(11), + 1, + anon_sym_LBRACE, + STATE(45), + 1, + sym_struct, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [546] = 2, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + ACTIONS(86), + 2, + anon_sym_COMMA, + anon_sym_RBRACK, + [555] = 2, + ACTIONS(98), + 1, + sym_identifier, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [563] = 2, + ACTIONS(100), + 1, + ts_builtin_sym_end, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [571] = 2, + ACTIONS(102), + 1, + anon_sym_RBRACE, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [579] = 2, + ACTIONS(104), + 1, + anon_sym_LBRACE, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [587] = 2, + ACTIONS(106), + 1, + sym_identifier, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [595] = 2, + ACTIONS(108), + 1, + anon_sym_EQ, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [603] = 2, + ACTIONS(110), + 1, + ts_builtin_sym_end, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [611] = 2, + ACTIONS(112), + 1, + sym_identifier, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [619] = 2, + ACTIONS(114), + 1, + anon_sym_RBRACK, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [627] = 2, + ACTIONS(116), + 1, + ts_builtin_sym_end, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [635] = 2, + ACTIONS(118), + 1, + sym_identifier, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [643] = 2, + ACTIONS(120), + 1, + anon_sym_service, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [651] = 2, + ACTIONS(122), + 1, + anon_sym_DOT, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [659] = 2, + ACTIONS(124), + 1, + ts_builtin_sym_end, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [667] = 2, + ACTIONS(126), + 1, + ts_builtin_sym_end, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [675] = 2, + ACTIONS(128), + 1, + ts_builtin_sym_end, + ACTIONS(3), + 2, + sym_comment, + sym_whitespace, + [683] = 2, + ACTIONS(3), + 1, + sym_comment, + ACTIONS(130), + 1, + sym_whitespace, + [690] = 2, + ACTIONS(3), + 1, + sym_comment, + ACTIONS(132), + 1, + sym_whitespace, + [697] = 2, + ACTIONS(3), + 1, + sym_comment, + ACTIONS(134), + 1, + sym_whitespace, }; static const uint32_t ts_small_parse_table_map[] = { - [SMALL_STATE(2)] = 0, - [SMALL_STATE(3)] = 34, - [SMALL_STATE(4)] = 65, - [SMALL_STATE(5)] = 96, - [SMALL_STATE(6)] = 124, - [SMALL_STATE(7)] = 152, - [SMALL_STATE(8)] = 176, - [SMALL_STATE(9)] = 193, - [SMALL_STATE(10)] = 204, - [SMALL_STATE(11)] = 221, - [SMALL_STATE(12)] = 232, - [SMALL_STATE(13)] = 243, - [SMALL_STATE(14)] = 254, - [SMALL_STATE(15)] = 265, - [SMALL_STATE(16)] = 276, - [SMALL_STATE(17)] = 290, - [SMALL_STATE(18)] = 304, - [SMALL_STATE(19)] = 318, - [SMALL_STATE(20)] = 332, - [SMALL_STATE(21)] = 346, - [SMALL_STATE(22)] = 360, - [SMALL_STATE(23)] = 374, - [SMALL_STATE(24)] = 388, - [SMALL_STATE(25)] = 400, - [SMALL_STATE(26)] = 412, - [SMALL_STATE(27)] = 426, - [SMALL_STATE(28)] = 440, - [SMALL_STATE(29)] = 454, - [SMALL_STATE(30)] = 464, - [SMALL_STATE(31)] = 473, - [SMALL_STATE(32)] = 484, - [SMALL_STATE(33)] = 495, - [SMALL_STATE(34)] = 506, - [SMALL_STATE(35)] = 517, - [SMALL_STATE(36)] = 526, - [SMALL_STATE(37)] = 535, - [SMALL_STATE(38)] = 546, - [SMALL_STATE(39)] = 555, - [SMALL_STATE(40)] = 563, - [SMALL_STATE(41)] = 571, - [SMALL_STATE(42)] = 579, - [SMALL_STATE(43)] = 587, - [SMALL_STATE(44)] = 595, - [SMALL_STATE(45)] = 603, - [SMALL_STATE(46)] = 611, - [SMALL_STATE(47)] = 619, - [SMALL_STATE(48)] = 627, - [SMALL_STATE(49)] = 635, - [SMALL_STATE(50)] = 643, - [SMALL_STATE(51)] = 651, - [SMALL_STATE(52)] = 659, - [SMALL_STATE(53)] = 667, - [SMALL_STATE(54)] = 675, - [SMALL_STATE(55)] = 683, - [SMALL_STATE(56)] = 690, - [SMALL_STATE(57)] = 697, + [SMALL_STATE(2)] = 0, [SMALL_STATE(3)] = 34, [SMALL_STATE(4)] = 65, + [SMALL_STATE(5)] = 96, [SMALL_STATE(6)] = 124, [SMALL_STATE(7)] = 152, + [SMALL_STATE(8)] = 176, [SMALL_STATE(9)] = 193, [SMALL_STATE(10)] = 204, + [SMALL_STATE(11)] = 221, [SMALL_STATE(12)] = 232, [SMALL_STATE(13)] = 243, + [SMALL_STATE(14)] = 254, [SMALL_STATE(15)] = 265, [SMALL_STATE(16)] = 276, + [SMALL_STATE(17)] = 290, [SMALL_STATE(18)] = 304, [SMALL_STATE(19)] = 318, + [SMALL_STATE(20)] = 332, [SMALL_STATE(21)] = 346, [SMALL_STATE(22)] = 360, + [SMALL_STATE(23)] = 374, [SMALL_STATE(24)] = 388, [SMALL_STATE(25)] = 400, + [SMALL_STATE(26)] = 412, [SMALL_STATE(27)] = 426, [SMALL_STATE(28)] = 440, + [SMALL_STATE(29)] = 454, [SMALL_STATE(30)] = 464, [SMALL_STATE(31)] = 473, + [SMALL_STATE(32)] = 484, [SMALL_STATE(33)] = 495, [SMALL_STATE(34)] = 506, + [SMALL_STATE(35)] = 517, [SMALL_STATE(36)] = 526, [SMALL_STATE(37)] = 535, + [SMALL_STATE(38)] = 546, [SMALL_STATE(39)] = 555, [SMALL_STATE(40)] = 563, + [SMALL_STATE(41)] = 571, [SMALL_STATE(42)] = 579, [SMALL_STATE(43)] = 587, + [SMALL_STATE(44)] = 595, [SMALL_STATE(45)] = 603, [SMALL_STATE(46)] = 611, + [SMALL_STATE(47)] = 619, [SMALL_STATE(48)] = 627, [SMALL_STATE(49)] = 635, + [SMALL_STATE(50)] = 643, [SMALL_STATE(51)] = 651, [SMALL_STATE(52)] = 659, + [SMALL_STATE(53)] = 667, [SMALL_STATE(54)] = 675, [SMALL_STATE(55)] = 683, + [SMALL_STATE(56)] = 690, [SMALL_STATE(57)] = 697, }; static const TSParseActionEntry ts_parse_actions[] = { - [0] = {.entry = {.count = 0, .reusable = false}}, - [1] = {.entry = {.count = 1, .reusable = false}}, RECOVER(), - [3] = {.entry = {.count = 1, .reusable = true}}, SHIFT_EXTRA(), - [5] = {.entry = {.count = 1, .reusable = false}}, SHIFT(55), - [7] = {.entry = {.count = 1, .reusable = false}}, SHIFT(57), - [9] = {.entry = {.count = 1, .reusable = false}}, SHIFT(10), - [11] = {.entry = {.count = 1, .reusable = true}}, SHIFT(8), - [13] = {.entry = {.count = 1, .reusable = true}}, SHIFT(2), - [15] = {.entry = {.count = 1, .reusable = true}}, SHIFT(15), - [17] = {.entry = {.count = 1, .reusable = true}}, SHIFT(9), - [19] = {.entry = {.count = 1, .reusable = true}}, SHIFT(12), - [21] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_fields, 3), - [23] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_fields, 2), - [25] = {.entry = {.count = 1, .reusable = true}}, SHIFT(14), - [27] = {.entry = {.count = 1, .reusable = true}}, SHIFT(44), - [29] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_boolean, 1), - [31] = {.entry = {.count = 1, .reusable = true}}, SHIFT(39), - [33] = {.entry = {.count = 1, .reusable = true}}, SHIFT(49), - [35] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_operation_name, 1, .production_id = 1), - [37] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list, 3, .production_id = 11), - [39] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_input_node, 1), - [41] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_struct, 3, .production_id = 8), - [43] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_struct, 2), - [45] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list, 2), - [47] = {.entry = {.count = 1, .reusable = true}}, SHIFT(3), - [49] = {.entry = {.count = 1, .reusable = true}}, SHIFT(23), - [51] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_bindings, 1), - [53] = {.entry = {.count = 1, .reusable = true}}, SHIFT(4), - [55] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_fields, 1), - [57] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_bindings_repeat1, 2), SHIFT_REPEAT(31), - [60] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_bindings_repeat1, 2), - [62] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_bindings, 3), - [64] = {.entry = {.count = 1, .reusable = true}}, SHIFT(20), - [66] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_bindings, 2), - [68] = {.entry = {.count = 1, .reusable = true}}, SHIFT(43), - [70] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_qualified_identifier, 3, .production_id = 5), - [72] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_qualified_identifier, 3, .production_id = 5), - [74] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_qualified_identifier, 4, .production_id = 7), - [76] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_qualified_identifier, 4, .production_id = 7), - [78] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_qualified_identifier_repeat1, 2), SHIFT_REPEAT(39), - [81] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_qualified_identifier_repeat1, 2), - [83] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_list_fields_repeat1, 2), SHIFT_REPEAT(5), - [86] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_list_fields_repeat1, 2), - [88] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_binding, 3, .production_id = 9), - [90] = {.entry = {.count = 1, .reusable = true}}, SHIFT(27), - [92] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_let_binding, 3), - [94] = {.entry = {.count = 1, .reusable = true}}, SHIFT(40), - [96] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_use_clause, 5, .production_id = 10), - [98] = {.entry = {.count = 1, .reusable = true}}, SHIFT(36), - [100] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_let_binding, 4), - [102] = {.entry = {.count = 1, .reusable = true}}, SHIFT(13), - [104] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_operation_name, 3, .production_id = 6), - [106] = {.entry = {.count = 1, .reusable = true}}, SHIFT(25), - [108] = {.entry = {.count = 1, .reusable = true}}, SHIFT(6), - [110] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_operation_call, 2, .production_id = 4), - [112] = {.entry = {.count = 1, .reusable = true}}, SHIFT(42), - [114] = {.entry = {.count = 1, .reusable = true}}, SHIFT(11), - [116] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source_file, 2, .production_id = 3), - [118] = {.entry = {.count = 1, .reusable = true}}, SHIFT(24), - [120] = {.entry = {.count = 1, .reusable = true}}, SHIFT(56), - [122] = {.entry = {.count = 1, .reusable = true}}, SHIFT(46), - [124] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_top_level_statement, 1), - [126] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source_file, 1, .production_id = 2), - [128] = {.entry = {.count = 1, .reusable = true}}, ACCEPT_INPUT(), - [130] = {.entry = {.count = 1, .reusable = true}}, SHIFT(34), - [132] = {.entry = {.count = 1, .reusable = true}}, SHIFT(32), - [134] = {.entry = {.count = 1, .reusable = true}}, SHIFT(50), + [0] = {.entry = {.count = 0, .reusable = false}}, + [1] = {.entry = {.count = 1, .reusable = false}}, + RECOVER(), + [3] = {.entry = {.count = 1, .reusable = true}}, + SHIFT_EXTRA(), + [5] = {.entry = {.count = 1, .reusable = false}}, + SHIFT(55), + [7] = {.entry = {.count = 1, .reusable = false}}, + SHIFT(57), + [9] = {.entry = {.count = 1, .reusable = false}}, + SHIFT(10), + [11] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(8), + [13] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(2), + [15] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(15), + [17] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(9), + [19] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(12), + [21] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(sym_list_fields, 3), + [23] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(sym_list_fields, 2), + [25] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(14), + [27] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(44), + [29] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(sym_boolean, 1), + [31] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(39), + [33] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(49), + [35] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(sym_operation_name, 1, .production_id = 1), + [37] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(sym_list, 3, .production_id = 11), + [39] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(sym_input_node, 1), + [41] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(sym_struct, 3, .production_id = 8), + [43] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(sym_struct, 2), + [45] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(sym_list, 2), + [47] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(3), + [49] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(23), + [51] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(sym_bindings, 1), + [53] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(4), + [55] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(sym_list_fields, 1), + [57] = {.entry = {.count = 2, .reusable = true}}, + REDUCE(aux_sym_bindings_repeat1, 2), + SHIFT_REPEAT(31), + [60] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(aux_sym_bindings_repeat1, 2), + [62] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(sym_bindings, 3), + [64] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(20), + [66] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(sym_bindings, 2), + [68] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(43), + [70] = {.entry = {.count = 1, .reusable = false}}, + REDUCE(sym_qualified_identifier, 3, .production_id = 5), + [72] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(sym_qualified_identifier, 3, .production_id = 5), + [74] = {.entry = {.count = 1, .reusable = false}}, + REDUCE(sym_qualified_identifier, 4, .production_id = 7), + [76] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(sym_qualified_identifier, 4, .production_id = 7), + [78] = {.entry = {.count = 2, .reusable = true}}, + REDUCE(aux_sym_qualified_identifier_repeat1, 2), + SHIFT_REPEAT(39), + [81] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(aux_sym_qualified_identifier_repeat1, 2), + [83] = {.entry = {.count = 2, .reusable = true}}, + REDUCE(aux_sym_list_fields_repeat1, 2), + SHIFT_REPEAT(5), + [86] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(aux_sym_list_fields_repeat1, 2), + [88] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(sym_binding, 3, .production_id = 9), + [90] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(27), + [92] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(sym_let_binding, 3), + [94] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(40), + [96] = {.entry = {.count = 1, .reusable = false}}, + REDUCE(sym_use_clause, 5, .production_id = 10), + [98] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(36), + [100] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(sym_let_binding, 4), + [102] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(13), + [104] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(sym_operation_name, 3, .production_id = 6), + [106] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(25), + [108] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(6), + [110] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(sym_operation_call, 2, .production_id = 4), + [112] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(42), + [114] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(11), + [116] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(sym_source_file, 2, .production_id = 3), + [118] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(24), + [120] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(56), + [122] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(46), + [124] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(sym_top_level_statement, 1), + [126] = {.entry = {.count = 1, .reusable = true}}, + REDUCE(sym_source_file, 1, .production_id = 2), + [128] = {.entry = {.count = 1, .reusable = true}}, + ACCEPT_INPUT(), + [130] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(34), + [132] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(32), + [134] = {.entry = {.count = 1, .reusable = true}}, + SHIFT(50), }; #ifdef __cplusplus @@ -1590,30 +1864,30 @@ extern "C" { extern const TSLanguage *tree_sitter_smithyql(void) { static const TSLanguage language = { - .version = LANGUAGE_VERSION, - .symbol_count = SYMBOL_COUNT, - .alias_count = ALIAS_COUNT, - .token_count = TOKEN_COUNT, - .external_token_count = EXTERNAL_TOKEN_COUNT, - .state_count = STATE_COUNT, - .large_state_count = LARGE_STATE_COUNT, - .production_id_count = PRODUCTION_ID_COUNT, - .field_count = FIELD_COUNT, - .max_alias_sequence_length = MAX_ALIAS_SEQUENCE_LENGTH, - .parse_table = &ts_parse_table[0][0], - .small_parse_table = ts_small_parse_table, - .small_parse_table_map = ts_small_parse_table_map, - .parse_actions = ts_parse_actions, - .symbol_names = ts_symbol_names, - .field_names = ts_field_names, - .field_map_slices = ts_field_map_slices, - .field_map_entries = ts_field_map_entries, - .symbol_metadata = ts_symbol_metadata, - .public_symbol_map = ts_symbol_map, - .alias_map = ts_non_terminal_alias_map, - .alias_sequences = &ts_alias_sequences[0][0], - .lex_modes = ts_lex_modes, - .lex_fn = ts_lex, + .version = LANGUAGE_VERSION, + .symbol_count = SYMBOL_COUNT, + .alias_count = ALIAS_COUNT, + .token_count = TOKEN_COUNT, + .external_token_count = EXTERNAL_TOKEN_COUNT, + .state_count = STATE_COUNT, + .large_state_count = LARGE_STATE_COUNT, + .production_id_count = PRODUCTION_ID_COUNT, + .field_count = FIELD_COUNT, + .max_alias_sequence_length = MAX_ALIAS_SEQUENCE_LENGTH, + .parse_table = &ts_parse_table[0][0], + .small_parse_table = ts_small_parse_table, + .small_parse_table_map = ts_small_parse_table_map, + .parse_actions = ts_parse_actions, + .symbol_names = ts_symbol_names, + .field_names = ts_field_names, + .field_map_slices = ts_field_map_slices, + .field_map_entries = ts_field_map_entries, + .symbol_metadata = ts_symbol_metadata, + .public_symbol_map = ts_symbol_map, + .alias_map = ts_non_terminal_alias_map, + .alias_sequences = &ts_alias_sequences[0][0], + .lex_modes = ts_lex_modes, + .lex_fn = ts_lex, }; return &language; } diff --git a/update-libs.sh b/update-libs.sh new file mode 100755 index 00000000..4090133e --- /dev/null +++ b/update-libs.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +function build_grammar() { + OUT_DIR="core/src/main/resources/$2" + OUT="$OUT_DIR/libtree-sitter-smithyql.$3" + mkdir -p "$OUT_DIR" + cp "$(nix build ".#packages.$1.grammar" --no-link --print-out-paths)/parser" "$OUT" + chmod +w "$OUT" +} + +build_grammar x86_64-darwin darwin-x86_64 dylib +build_grammar aarch64-darwin darwin-aarch64 dylib +build_grammar x86_64-linux linux-x86_64 so +build_grammar aarch64-linux linux-aarch64 so From 02943aa8baf74e39ff5a3019ccc852cffc2b3c80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Fri, 14 Oct 2022 00:55:16 +0200 Subject: [PATCH 011/105] rename, add flag --- update-libs.sh | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/update-libs.sh b/update-libs.sh index 4090133e..3849937b 100755 --- a/update-libs.sh +++ b/update-libs.sh @@ -1,6 +1,8 @@ #!/bin/bash -function build_grammar() { +set -e + +function update_grammar() { OUT_DIR="core/src/main/resources/$2" OUT="$OUT_DIR/libtree-sitter-smithyql.$3" mkdir -p "$OUT_DIR" @@ -8,7 +10,7 @@ function build_grammar() { chmod +w "$OUT" } -build_grammar x86_64-darwin darwin-x86_64 dylib -build_grammar aarch64-darwin darwin-aarch64 dylib -build_grammar x86_64-linux linux-x86_64 so -build_grammar aarch64-linux linux-aarch64 so +update_grammar x86_64-darwin darwin-x86_64 dylib +update_grammar aarch64-darwin darwin-aarch64 dylib +update_grammar x86_64-linux linux-x86_64 so +update_grammar aarch64-linux linux-aarch64 so From d3a34b47c12d836c230bfc958c1e580fd86c83d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Fri, 14 Oct 2022 01:11:47 +0200 Subject: [PATCH 012/105] Add binaries, remove codegen'd code --- .gitignore | 2 + .../libtree-sitter-smithyql.dylib | Bin .../libtree-sitter-smithyql.dylib | Bin .../linux-aarch64/libtree-sitter-smithyql.so | Bin 16976 -> 16976 bytes .../linux-x86_64/libtree-sitter-smithyql.so | Bin 20096 -> 20096 bytes .../playground/smithyql/ParserAdapter.scala | 1 - flake.nix | 24 +- tree-sitter-smithyql/bindings/node/binding.cc | 28 - tree-sitter-smithyql/bindings/node/index.js | 19 - tree-sitter-smithyql/bindings/rust/build.rs | 40 - tree-sitter-smithyql/bindings/rust/lib.rs | 52 - tree-sitter-smithyql/src/grammar.json | 477 ----- tree-sitter-smithyql/src/node-types.json | 392 ---- tree-sitter-smithyql/src/parser.c | 1896 ----------------- tree-sitter-smithyql/src/tree_sitter/parser.h | 224 -- .../src/tree_sitter/parser.h.gch | Bin 885612 -> 0 bytes update-libs.sh | 15 +- 17 files changed, 28 insertions(+), 3142 deletions(-) mode change 100755 => 100644 core/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib mode change 100755 => 100644 core/src/main/resources/darwin-x86_64/libtree-sitter-smithyql.dylib mode change 100755 => 100644 core/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so mode change 100755 => 100644 core/src/main/resources/linux-x86_64/libtree-sitter-smithyql.so delete mode 100644 tree-sitter-smithyql/bindings/node/binding.cc delete mode 100644 tree-sitter-smithyql/bindings/node/index.js delete mode 100644 tree-sitter-smithyql/bindings/rust/build.rs delete mode 100644 tree-sitter-smithyql/bindings/rust/lib.rs delete mode 100644 tree-sitter-smithyql/src/grammar.json delete mode 100644 tree-sitter-smithyql/src/node-types.json delete mode 100644 tree-sitter-smithyql/src/parser.c delete mode 100644 tree-sitter-smithyql/src/tree_sitter/parser.h delete mode 100644 tree-sitter-smithyql/src/tree_sitter/parser.h.gch diff --git a/.gitignore b/.gitignore index bd9c9791..8b3cf0eb 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,6 @@ **/node_modules tree-sitter-smithyql/build tree-sitter-smithyql/*.wasm +tree-sitter-smithyql/src +tree-sitter-smithyql/bindings smithyql-log.txt diff --git a/core/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib b/core/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib old mode 100755 new mode 100644 diff --git a/core/src/main/resources/darwin-x86_64/libtree-sitter-smithyql.dylib b/core/src/main/resources/darwin-x86_64/libtree-sitter-smithyql.dylib old mode 100755 new mode 100644 diff --git a/core/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so b/core/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so old mode 100755 new mode 100644 index eee070c100405ef79b42037e073c7686170ce710..4f9a644016b8d9baabb82df85c54fe47dbaf1555 GIT binary patch delta 146 zcmWm6K@Ni;5J1rw&NG0CsJJjaM|WzdP|(&HV$`)a=tY|JBA%w}+WhtV$DSN}@~+sW zoHIpK=5t%*TPmNK4l8rpGZ9={y#%Z4N{nt16d!1W oa*bB&{bqIM#!s-8y&zD{6AA^rFZ~y=R delta 157 icmcc6!g!&Daf21}ojrzBsH6og5Yl$Bcj(+Zn0Og?XYXL$bTof|`Qx07 zb8>s8S4@y&ns6pWrCZ}LWnL+~iI<8K#SsWjO5k+}(gAODIQ4A?HgjTmNXq^hme6Z;?hUYIbN$jfhcppgG1zHSkz=y^WrLsw_dCXCy;l+4(HpU#n^V E2AQg$<-{z^$Zci6KsCVGT9RVsohck diff --git a/core/src/main/scala/playground/smithyql/ParserAdapter.scala b/core/src/main/scala/playground/smithyql/ParserAdapter.scala index 49255a9e..ff0afe4a 100644 --- a/core/src/main/scala/playground/smithyql/ParserAdapter.scala +++ b/core/src/main/scala/playground/smithyql/ParserAdapter.scala @@ -10,7 +10,6 @@ import java.io.Closeable import scala.util.Using import org.polyvariant.treesitter4s.Node import org.polyvariant.treesitter4s.bindings.TreeSitterInstance -import org.polyvariant.treesitter4s.bindings.kernel.Language object ParserAdapter { diff --git a/flake.nix b/flake.nix index ad407afa..d312a1ed 100644 --- a/flake.nix +++ b/flake.nix @@ -17,12 +17,13 @@ pname = "tree-sitter-smithyql"; version = "0.0.0"; src = ./tree-sitter-smithyql; + buildInputs = [ pkgs.tree-sitter pkgs.nodejs ]; buildPhase = '' + tree-sitter generate cc src/parser.c -o parser.so -Isrc -shared ''; installPhase = '' - mkdir -p $out - cp parser.so $out/parser + cp parser.so $out ''; }; in @@ -38,6 +39,25 @@ ]; }; packages.grammar = grammar; + packages.grammar-all = pkgs.linkFarm "grammar-all" [ + { + name = "darwin-x86_64/libtree-sitter-smithyql.dylib"; + path = self.packages.x86_64-darwin.grammar; + } + { + name = "darwin-aarch64/libtree-sitter-smithyql.dylib"; + path = self.packages.aarch64-darwin.grammar; + } + { + name = "linux-x86_64/libtree-sitter-smithyql.so"; + path = self.packages.x86_64-linux.grammar; + } + { + name = "linux-aarch64/libtree-sitter-smithyql.so"; + path = self.packages.aarch64-linux.grammar; + } + + ]; } ); } diff --git a/tree-sitter-smithyql/bindings/node/binding.cc b/tree-sitter-smithyql/bindings/node/binding.cc deleted file mode 100644 index ad036e0c..00000000 --- a/tree-sitter-smithyql/bindings/node/binding.cc +++ /dev/null @@ -1,28 +0,0 @@ -#include "tree_sitter/parser.h" -#include -#include "nan.h" - -using namespace v8; - -extern "C" TSLanguage * tree_sitter_smithyql(); - -namespace { - -NAN_METHOD(New) {} - -void Init(Local exports, Local module) { - Local tpl = Nan::New(New); - tpl->SetClassName(Nan::New("Language").ToLocalChecked()); - tpl->InstanceTemplate()->SetInternalFieldCount(1); - - Local constructor = Nan::GetFunction(tpl).ToLocalChecked(); - Local instance = constructor->NewInstance(Nan::GetCurrentContext()).ToLocalChecked(); - Nan::SetInternalFieldPointer(instance, 0, tree_sitter_smithyql()); - - Nan::Set(instance, Nan::New("name").ToLocalChecked(), Nan::New("smithyql").ToLocalChecked()); - Nan::Set(module, Nan::New("exports").ToLocalChecked(), instance); -} - -NODE_MODULE(tree_sitter_smithyql_binding, Init) - -} // namespace diff --git a/tree-sitter-smithyql/bindings/node/index.js b/tree-sitter-smithyql/bindings/node/index.js deleted file mode 100644 index f571d735..00000000 --- a/tree-sitter-smithyql/bindings/node/index.js +++ /dev/null @@ -1,19 +0,0 @@ -try { - module.exports = require("../../build/Release/tree_sitter_smithyql_binding"); -} catch (error1) { - if (error1.code !== 'MODULE_NOT_FOUND') { - throw error1; - } - try { - module.exports = require("../../build/Debug/tree_sitter_smithyql_binding"); - } catch (error2) { - if (error2.code !== 'MODULE_NOT_FOUND') { - throw error2; - } - throw error1 - } -} - -try { - module.exports.nodeTypeInfo = require("../../src/node-types.json"); -} catch (_) {} diff --git a/tree-sitter-smithyql/bindings/rust/build.rs b/tree-sitter-smithyql/bindings/rust/build.rs deleted file mode 100644 index c6061f09..00000000 --- a/tree-sitter-smithyql/bindings/rust/build.rs +++ /dev/null @@ -1,40 +0,0 @@ -fn main() { - let src_dir = std::path::Path::new("src"); - - let mut c_config = cc::Build::new(); - c_config.include(&src_dir); - c_config - .flag_if_supported("-Wno-unused-parameter") - .flag_if_supported("-Wno-unused-but-set-variable") - .flag_if_supported("-Wno-trigraphs"); - let parser_path = src_dir.join("parser.c"); - c_config.file(&parser_path); - - // If your language uses an external scanner written in C, - // then include this block of code: - - /* - let scanner_path = src_dir.join("scanner.c"); - c_config.file(&scanner_path); - println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap()); - */ - - c_config.compile("parser"); - println!("cargo:rerun-if-changed={}", parser_path.to_str().unwrap()); - - // If your language uses an external scanner written in C++, - // then include this block of code: - - /* - let mut cpp_config = cc::Build::new(); - cpp_config.cpp(true); - cpp_config.include(&src_dir); - cpp_config - .flag_if_supported("-Wno-unused-parameter") - .flag_if_supported("-Wno-unused-but-set-variable"); - let scanner_path = src_dir.join("scanner.cc"); - cpp_config.file(&scanner_path); - cpp_config.compile("scanner"); - println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap()); - */ -} diff --git a/tree-sitter-smithyql/bindings/rust/lib.rs b/tree-sitter-smithyql/bindings/rust/lib.rs deleted file mode 100644 index 80e4f04b..00000000 --- a/tree-sitter-smithyql/bindings/rust/lib.rs +++ /dev/null @@ -1,52 +0,0 @@ -//! This crate provides smithyql language support for the [tree-sitter][] parsing library. -//! -//! Typically, you will use the [language][language func] function to add this language to a -//! tree-sitter [Parser][], and then use the parser to parse some code: -//! -//! ``` -//! let code = ""; -//! let mut parser = tree_sitter::Parser::new(); -//! parser.set_language(tree_sitter_smithyql::language()).expect("Error loading smithyql grammar"); -//! let tree = parser.parse(code, None).unwrap(); -//! ``` -//! -//! [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html -//! [language func]: fn.language.html -//! [Parser]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Parser.html -//! [tree-sitter]: https://tree-sitter.github.io/ - -use tree_sitter::Language; - -extern "C" { - fn tree_sitter_smithyql() -> Language; -} - -/// Get the tree-sitter [Language][] for this grammar. -/// -/// [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html -pub fn language() -> Language { - unsafe { tree_sitter_smithyql() } -} - -/// The content of the [`node-types.json`][] file for this grammar. -/// -/// [`node-types.json`]: https://tree-sitter.github.io/tree-sitter/using-parsers#static-node-types -pub const NODE_TYPES: &'static str = include_str!("../../src/node-types.json"); - -// Uncomment these to include any queries that this grammar contains - -// pub const HIGHLIGHTS_QUERY: &'static str = include_str!("../../queries/highlights.scm"); -// pub const INJECTIONS_QUERY: &'static str = include_str!("../../queries/injections.scm"); -// pub const LOCALS_QUERY: &'static str = include_str!("../../queries/locals.scm"); -// pub const TAGS_QUERY: &'static str = include_str!("../../queries/tags.scm"); - -#[cfg(test)] -mod tests { - #[test] - fn test_can_load_grammar() { - let mut parser = tree_sitter::Parser::new(); - parser - .set_language(super::language()) - .expect("Error loading smithyql language"); - } -} diff --git a/tree-sitter-smithyql/src/grammar.json b/tree-sitter-smithyql/src/grammar.json deleted file mode 100644 index 21a866ab..00000000 --- a/tree-sitter-smithyql/src/grammar.json +++ /dev/null @@ -1,477 +0,0 @@ -{ - "name": "smithyql", - "rules": { - "source_file": { - "type": "SEQ", - "members": [ - { - "type": "FIELD", - "name": "use_clause", - "content": { - "type": "CHOICE", - "members": [ - { - "type": "SYMBOL", - "name": "use_clause" - }, - { - "type": "BLANK" - } - ] - } - }, - { - "type": "FIELD", - "name": "statements", - "content": { - "type": "SEQ", - "members": [ - { - "type": "SYMBOL", - "name": "top_level_statement" - } - ] - } - } - ] - }, - "top_level_statement": { - "type": "CHOICE", - "members": [ - { - "type": "SYMBOL", - "name": "let_binding" - }, - { - "type": "SYMBOL", - "name": "operation_call" - } - ] - }, - "let_binding": { - "type": "SEQ", - "members": [ - { - "type": "STRING", - "value": "let" - }, - { - "type": "SYMBOL", - "name": "whitespace" - }, - { - "type": "SYMBOL", - "name": "binding" - }, - { - "type": "CHOICE", - "members": [ - { - "type": "STRING", - "value": "," - }, - { - "type": "BLANK" - } - ] - } - ] - }, - "operation_call": { - "type": "SEQ", - "members": [ - { - "type": "FIELD", - "name": "operation_name", - "content": { - "type": "SYMBOL", - "name": "operation_name" - } - }, - { - "type": "FIELD", - "name": "input", - "content": { - "type": "SYMBOL", - "name": "struct" - } - } - ] - }, - "use_clause": { - "type": "SEQ", - "members": [ - { - "type": "STRING", - "value": "use" - }, - { - "type": "SYMBOL", - "name": "whitespace" - }, - { - "type": "STRING", - "value": "service" - }, - { - "type": "SYMBOL", - "name": "whitespace" - }, - { - "type": "FIELD", - "name": "identifier", - "content": { - "type": "SYMBOL", - "name": "qualified_identifier" - } - } - ] - }, - "qualified_identifier": { - "type": "SEQ", - "members": [ - { - "type": "FIELD", - "name": "head", - "content": { - "type": "SYMBOL", - "name": "identifier" - } - }, - { - "type": "FIELD", - "name": "tail", - "content": { - "type": "REPEAT", - "content": { - "type": "SEQ", - "members": [ - { - "type": "STRING", - "value": "." - }, - { - "type": "SYMBOL", - "name": "identifier" - } - ] - } - } - }, - { - "type": "STRING", - "value": "#" - }, - { - "type": "FIELD", - "name": "selection", - "content": { - "type": "SYMBOL", - "name": "identifier" - } - } - ] - }, - "operation_name": { - "type": "PREC_LEFT", - "value": 1, - "content": { - "type": "SEQ", - "members": [ - { - "type": "FIELD", - "name": "identifier", - "content": { - "type": "CHOICE", - "members": [ - { - "type": "SEQ", - "members": [ - { - "type": "SYMBOL", - "name": "qualified_identifier" - }, - { - "type": "STRING", - "value": "." - } - ] - }, - { - "type": "BLANK" - } - ] - } - }, - { - "type": "FIELD", - "name": "name", - "content": { - "type": "SYMBOL", - "name": "identifier" - } - } - ] - } - }, - "input_node": { - "type": "CHOICE", - "members": [ - { - "type": "SYMBOL", - "name": "struct" - }, - { - "type": "SYMBOL", - "name": "list" - }, - { - "type": "SYMBOL", - "name": "number" - }, - { - "type": "SYMBOL", - "name": "string" - }, - { - "type": "SYMBOL", - "name": "boolean" - }, - { - "type": "SYMBOL", - "name": "null" - } - ] - }, - "struct": { - "type": "SEQ", - "members": [ - { - "type": "STRING", - "value": "{" - }, - { - "type": "FIELD", - "name": "bindings", - "content": { - "type": "CHOICE", - "members": [ - { - "type": "SYMBOL", - "name": "bindings" - }, - { - "type": "BLANK" - } - ] - } - }, - { - "type": "STRING", - "value": "}" - } - ] - }, - "list": { - "type": "SEQ", - "members": [ - { - "type": "STRING", - "value": "[" - }, - { - "type": "FIELD", - "name": "list_fields", - "content": { - "type": "CHOICE", - "members": [ - { - "type": "SYMBOL", - "name": "list_fields" - }, - { - "type": "BLANK" - } - ] - } - }, - { - "type": "STRING", - "value": "]" - } - ] - }, - "bindings": { - "type": "PREC_LEFT", - "value": 1, - "content": { - "type": "SEQ", - "members": [ - { - "type": "SYMBOL", - "name": "binding" - }, - { - "type": "REPEAT", - "content": { - "type": "SEQ", - "members": [ - { - "type": "STRING", - "value": "," - }, - { - "type": "SYMBOL", - "name": "binding" - } - ] - } - }, - { - "type": "CHOICE", - "members": [ - { - "type": "STRING", - "value": "," - }, - { - "type": "BLANK" - } - ] - } - ] - } - }, - "binding": { - "type": "SEQ", - "members": [ - { - "type": "FIELD", - "name": "key", - "content": { - "type": "SYMBOL", - "name": "identifier" - } - }, - { - "type": "STRING", - "value": "=" - }, - { - "type": "FIELD", - "name": "value", - "content": { - "type": "SYMBOL", - "name": "input_node" - } - } - ] - }, - "list_fields": { - "type": "PREC_LEFT", - "value": 1, - "content": { - "type": "SEQ", - "members": [ - { - "type": "SYMBOL", - "name": "input_node" - }, - { - "type": "REPEAT", - "content": { - "type": "SEQ", - "members": [ - { - "type": "STRING", - "value": "," - }, - { - "type": "SYMBOL", - "name": "input_node" - } - ] - } - }, - { - "type": "CHOICE", - "members": [ - { - "type": "STRING", - "value": "," - }, - { - "type": "BLANK" - } - ] - } - ] - } - }, - "identifier": { - "type": "PATTERN", - "value": "[a-zA-Z_][a-zA-Z0-9_]*" - }, - "boolean": { - "type": "CHOICE", - "members": [ - { - "type": "STRING", - "value": "true" - }, - { - "type": "STRING", - "value": "false" - } - ] - }, - "number": { - "type": "PATTERN", - "value": "-?(0|[1-9]\\d*)(\\.\\d+)?([eE][+-]?\\d+)?" - }, - "string": { - "type": "PATTERN", - "value": "\"([^\"\\\\]|\\\\.)*\"" - }, - "null": { - "type": "STRING", - "value": "null" - }, - "comment": { - "type": "TOKEN", - "content": { - "type": "SEQ", - "members": [ - { - "type": "STRING", - "value": "//" - }, - { - "type": "PATTERN", - "value": ".*" - } - ] - } - }, - "whitespace": { - "type": "PATTERN", - "value": "\\s+" - } - }, - "extras": [ - { - "type": "SYMBOL", - "name": "whitespace" - }, - { - "type": "SYMBOL", - "name": "comment" - } - ], - "conflicts": [], - "precedences": [], - "externals": [], - "inline": [], - "supertypes": [] -} - diff --git a/tree-sitter-smithyql/src/node-types.json b/tree-sitter-smithyql/src/node-types.json deleted file mode 100644 index 139bf2e7..00000000 --- a/tree-sitter-smithyql/src/node-types.json +++ /dev/null @@ -1,392 +0,0 @@ -[ - { - "type": "binding", - "named": true, - "fields": { - "key": { - "multiple": false, - "required": true, - "types": [ - { - "type": "identifier", - "named": true - } - ] - }, - "value": { - "multiple": false, - "required": true, - "types": [ - { - "type": "input_node", - "named": true - } - ] - } - } - }, - { - "type": "bindings", - "named": true, - "fields": {}, - "children": { - "multiple": true, - "required": true, - "types": [ - { - "type": "binding", - "named": true - } - ] - } - }, - { - "type": "boolean", - "named": true, - "fields": {} - }, - { - "type": "input_node", - "named": true, - "fields": {}, - "children": { - "multiple": false, - "required": true, - "types": [ - { - "type": "boolean", - "named": true - }, - { - "type": "list", - "named": true - }, - { - "type": "null", - "named": true - }, - { - "type": "number", - "named": true - }, - { - "type": "string", - "named": true - }, - { - "type": "struct", - "named": true - } - ] - } - }, - { - "type": "let_binding", - "named": true, - "fields": {}, - "children": { - "multiple": true, - "required": true, - "types": [ - { - "type": "binding", - "named": true - }, - { - "type": "whitespace", - "named": true - } - ] - } - }, - { - "type": "list", - "named": true, - "fields": { - "list_fields": { - "multiple": false, - "required": false, - "types": [ - { - "type": "list_fields", - "named": true - } - ] - } - } - }, - { - "type": "list_fields", - "named": true, - "fields": {}, - "children": { - "multiple": true, - "required": true, - "types": [ - { - "type": "input_node", - "named": true - } - ] - } - }, - { - "type": "operation_call", - "named": true, - "fields": { - "input": { - "multiple": false, - "required": true, - "types": [ - { - "type": "struct", - "named": true - } - ] - }, - "operation_name": { - "multiple": false, - "required": true, - "types": [ - { - "type": "operation_name", - "named": true - } - ] - } - } - }, - { - "type": "operation_name", - "named": true, - "fields": { - "identifier": { - "multiple": true, - "required": false, - "types": [ - { - "type": ".", - "named": false - }, - { - "type": "qualified_identifier", - "named": true - } - ] - }, - "name": { - "multiple": false, - "required": true, - "types": [ - { - "type": "identifier", - "named": true - } - ] - } - } - }, - { - "type": "qualified_identifier", - "named": true, - "fields": { - "head": { - "multiple": false, - "required": true, - "types": [ - { - "type": "identifier", - "named": true - } - ] - }, - "selection": { - "multiple": false, - "required": true, - "types": [ - { - "type": "identifier", - "named": true - } - ] - }, - "tail": { - "multiple": true, - "required": false, - "types": [ - { - "type": ".", - "named": false - }, - { - "type": "identifier", - "named": true - } - ] - } - } - }, - { - "type": "source_file", - "named": true, - "fields": { - "statements": { - "multiple": false, - "required": true, - "types": [ - { - "type": "top_level_statement", - "named": true - } - ] - }, - "use_clause": { - "multiple": false, - "required": false, - "types": [ - { - "type": "use_clause", - "named": true - } - ] - } - } - }, - { - "type": "struct", - "named": true, - "fields": { - "bindings": { - "multiple": false, - "required": false, - "types": [ - { - "type": "bindings", - "named": true - } - ] - } - } - }, - { - "type": "top_level_statement", - "named": true, - "fields": {}, - "children": { - "multiple": false, - "required": true, - "types": [ - { - "type": "let_binding", - "named": true - }, - { - "type": "operation_call", - "named": true - } - ] - } - }, - { - "type": "use_clause", - "named": true, - "fields": { - "identifier": { - "multiple": false, - "required": true, - "types": [ - { - "type": "qualified_identifier", - "named": true - } - ] - } - }, - "children": { - "multiple": true, - "required": true, - "types": [ - { - "type": "whitespace", - "named": true - } - ] - } - }, - { - "type": "#", - "named": false - }, - { - "type": ",", - "named": false - }, - { - "type": ".", - "named": false - }, - { - "type": "=", - "named": false - }, - { - "type": "[", - "named": false - }, - { - "type": "]", - "named": false - }, - { - "type": "comment", - "named": true - }, - { - "type": "false", - "named": false - }, - { - "type": "identifier", - "named": true - }, - { - "type": "let", - "named": false - }, - { - "type": "null", - "named": true - }, - { - "type": "number", - "named": true - }, - { - "type": "service", - "named": false - }, - { - "type": "string", - "named": true - }, - { - "type": "true", - "named": false - }, - { - "type": "use", - "named": false - }, - { - "type": "whitespace", - "named": true - }, - { - "type": "{", - "named": false - }, - { - "type": "}", - "named": false - } -] \ No newline at end of file diff --git a/tree-sitter-smithyql/src/parser.c b/tree-sitter-smithyql/src/parser.c deleted file mode 100644 index 259d2116..00000000 --- a/tree-sitter-smithyql/src/parser.c +++ /dev/null @@ -1,1896 +0,0 @@ -#include - -#if defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" -#endif - -#define LANGUAGE_VERSION 13 -#define STATE_COUNT 58 -#define LARGE_STATE_COUNT 2 -#define SYMBOL_COUNT 37 -#define ALIAS_COUNT 0 -#define TOKEN_COUNT 20 -#define EXTERNAL_TOKEN_COUNT 0 -#define FIELD_COUNT 13 -#define MAX_ALIAS_SEQUENCE_LENGTH 5 -#define PRODUCTION_ID_COUNT 12 - -enum { - anon_sym_let = 1, - anon_sym_COMMA = 2, - anon_sym_use = 3, - anon_sym_service = 4, - anon_sym_DOT = 5, - anon_sym_POUND = 6, - anon_sym_LBRACE = 7, - anon_sym_RBRACE = 8, - anon_sym_LBRACK = 9, - anon_sym_RBRACK = 10, - anon_sym_EQ = 11, - sym_identifier = 12, - anon_sym_true = 13, - anon_sym_false = 14, - sym_number = 15, - sym_string = 16, - sym_null = 17, - sym_comment = 18, - sym_whitespace = 19, - sym_source_file = 20, - sym_top_level_statement = 21, - sym_let_binding = 22, - sym_operation_call = 23, - sym_use_clause = 24, - sym_qualified_identifier = 25, - sym_operation_name = 26, - sym_input_node = 27, - sym_struct = 28, - sym_list = 29, - sym_bindings = 30, - sym_binding = 31, - sym_list_fields = 32, - sym_boolean = 33, - aux_sym_qualified_identifier_repeat1 = 34, - aux_sym_bindings_repeat1 = 35, - aux_sym_list_fields_repeat1 = 36, -}; - -static const char *const ts_symbol_names[] = { - [ts_builtin_sym_end] = "end", - [anon_sym_let] = "let", - [anon_sym_COMMA] = ",", - [anon_sym_use] = "use", - [anon_sym_service] = "service", - [anon_sym_DOT] = ".", - [anon_sym_POUND] = "#", - [anon_sym_LBRACE] = "{", - [anon_sym_RBRACE] = "}", - [anon_sym_LBRACK] = "[", - [anon_sym_RBRACK] = "]", - [anon_sym_EQ] = "=", - [sym_identifier] = "identifier", - [anon_sym_true] = "true", - [anon_sym_false] = "false", - [sym_number] = "number", - [sym_string] = "string", - [sym_null] = "null", - [sym_comment] = "comment", - [sym_whitespace] = "whitespace", - [sym_source_file] = "source_file", - [sym_top_level_statement] = "top_level_statement", - [sym_let_binding] = "let_binding", - [sym_operation_call] = "operation_call", - [sym_use_clause] = "use_clause", - [sym_qualified_identifier] = "qualified_identifier", - [sym_operation_name] = "operation_name", - [sym_input_node] = "input_node", - [sym_struct] = "struct", - [sym_list] = "list", - [sym_bindings] = "bindings", - [sym_binding] = "binding", - [sym_list_fields] = "list_fields", - [sym_boolean] = "boolean", - [aux_sym_qualified_identifier_repeat1] = "qualified_identifier_repeat1", - [aux_sym_bindings_repeat1] = "bindings_repeat1", - [aux_sym_list_fields_repeat1] = "list_fields_repeat1", -}; - -static const TSSymbol ts_symbol_map[] = { - [ts_builtin_sym_end] = ts_builtin_sym_end, - [anon_sym_let] = anon_sym_let, - [anon_sym_COMMA] = anon_sym_COMMA, - [anon_sym_use] = anon_sym_use, - [anon_sym_service] = anon_sym_service, - [anon_sym_DOT] = anon_sym_DOT, - [anon_sym_POUND] = anon_sym_POUND, - [anon_sym_LBRACE] = anon_sym_LBRACE, - [anon_sym_RBRACE] = anon_sym_RBRACE, - [anon_sym_LBRACK] = anon_sym_LBRACK, - [anon_sym_RBRACK] = anon_sym_RBRACK, - [anon_sym_EQ] = anon_sym_EQ, - [sym_identifier] = sym_identifier, - [anon_sym_true] = anon_sym_true, - [anon_sym_false] = anon_sym_false, - [sym_number] = sym_number, - [sym_string] = sym_string, - [sym_null] = sym_null, - [sym_comment] = sym_comment, - [sym_whitespace] = sym_whitespace, - [sym_source_file] = sym_source_file, - [sym_top_level_statement] = sym_top_level_statement, - [sym_let_binding] = sym_let_binding, - [sym_operation_call] = sym_operation_call, - [sym_use_clause] = sym_use_clause, - [sym_qualified_identifier] = sym_qualified_identifier, - [sym_operation_name] = sym_operation_name, - [sym_input_node] = sym_input_node, - [sym_struct] = sym_struct, - [sym_list] = sym_list, - [sym_bindings] = sym_bindings, - [sym_binding] = sym_binding, - [sym_list_fields] = sym_list_fields, - [sym_boolean] = sym_boolean, - [aux_sym_qualified_identifier_repeat1] = - aux_sym_qualified_identifier_repeat1, - [aux_sym_bindings_repeat1] = aux_sym_bindings_repeat1, - [aux_sym_list_fields_repeat1] = aux_sym_list_fields_repeat1, -}; - -static const TSSymbolMetadata ts_symbol_metadata[] = { - [ts_builtin_sym_end] = - { - .visible = false, - .named = true, - }, - [anon_sym_let] = - { - .visible = true, - .named = false, - }, - [anon_sym_COMMA] = - { - .visible = true, - .named = false, - }, - [anon_sym_use] = - { - .visible = true, - .named = false, - }, - [anon_sym_service] = - { - .visible = true, - .named = false, - }, - [anon_sym_DOT] = - { - .visible = true, - .named = false, - }, - [anon_sym_POUND] = - { - .visible = true, - .named = false, - }, - [anon_sym_LBRACE] = - { - .visible = true, - .named = false, - }, - [anon_sym_RBRACE] = - { - .visible = true, - .named = false, - }, - [anon_sym_LBRACK] = - { - .visible = true, - .named = false, - }, - [anon_sym_RBRACK] = - { - .visible = true, - .named = false, - }, - [anon_sym_EQ] = - { - .visible = true, - .named = false, - }, - [sym_identifier] = - { - .visible = true, - .named = true, - }, - [anon_sym_true] = - { - .visible = true, - .named = false, - }, - [anon_sym_false] = - { - .visible = true, - .named = false, - }, - [sym_number] = - { - .visible = true, - .named = true, - }, - [sym_string] = - { - .visible = true, - .named = true, - }, - [sym_null] = - { - .visible = true, - .named = true, - }, - [sym_comment] = - { - .visible = true, - .named = true, - }, - [sym_whitespace] = - { - .visible = true, - .named = true, - }, - [sym_source_file] = - { - .visible = true, - .named = true, - }, - [sym_top_level_statement] = - { - .visible = true, - .named = true, - }, - [sym_let_binding] = - { - .visible = true, - .named = true, - }, - [sym_operation_call] = - { - .visible = true, - .named = true, - }, - [sym_use_clause] = - { - .visible = true, - .named = true, - }, - [sym_qualified_identifier] = - { - .visible = true, - .named = true, - }, - [sym_operation_name] = - { - .visible = true, - .named = true, - }, - [sym_input_node] = - { - .visible = true, - .named = true, - }, - [sym_struct] = - { - .visible = true, - .named = true, - }, - [sym_list] = - { - .visible = true, - .named = true, - }, - [sym_bindings] = - { - .visible = true, - .named = true, - }, - [sym_binding] = - { - .visible = true, - .named = true, - }, - [sym_list_fields] = - { - .visible = true, - .named = true, - }, - [sym_boolean] = - { - .visible = true, - .named = true, - }, - [aux_sym_qualified_identifier_repeat1] = - { - .visible = false, - .named = false, - }, - [aux_sym_bindings_repeat1] = - { - .visible = false, - .named = false, - }, - [aux_sym_list_fields_repeat1] = - { - .visible = false, - .named = false, - }, -}; - -enum { - field_bindings = 1, - field_head = 2, - field_identifier = 3, - field_input = 4, - field_key = 5, - field_list_fields = 6, - field_name = 7, - field_operation_name = 8, - field_selection = 9, - field_statements = 10, - field_tail = 11, - field_use_clause = 12, - field_value = 13, -}; - -static const char *const ts_field_names[] = { - [0] = NULL, - [field_bindings] = "bindings", - [field_head] = "head", - [field_identifier] = "identifier", - [field_input] = "input", - [field_key] = "key", - [field_list_fields] = "list_fields", - [field_name] = "name", - [field_operation_name] = "operation_name", - [field_selection] = "selection", - [field_statements] = "statements", - [field_tail] = "tail", - [field_use_clause] = "use_clause", - [field_value] = "value", -}; - -static const TSFieldMapSlice ts_field_map_slices[PRODUCTION_ID_COUNT] = { - [1] = {.index = 0, .length = 1}, [2] = {.index = 1, .length = 1}, - [3] = {.index = 2, .length = 2}, [4] = {.index = 4, .length = 2}, - [5] = {.index = 6, .length = 2}, [6] = {.index = 8, .length = 3}, - [7] = {.index = 11, .length = 3}, [8] = {.index = 14, .length = 1}, - [9] = {.index = 15, .length = 2}, [10] = {.index = 17, .length = 1}, - [11] = {.index = 18, .length = 1}, -}; - -static const TSFieldMapEntry ts_field_map_entries[] = { - [0] = {field_name, 0}, - [1] = {field_statements, 0}, - [2] = {field_statements, 1}, - {field_use_clause, 0}, - [4] = {field_input, 1}, - {field_operation_name, 0}, - [6] = {field_head, 0}, - {field_selection, 2}, - [8] = {field_identifier, 0}, - {field_identifier, 1}, - {field_name, 2}, - [11] = {field_head, 0}, - {field_selection, 3}, - {field_tail, 1}, - [14] = {field_bindings, 1}, - [15] = {field_key, 0}, - {field_value, 2}, - [17] = {field_identifier, 4}, - [18] = {field_list_fields, 1}, -}; - -static const TSSymbol ts_alias_sequences[PRODUCTION_ID_COUNT] - [MAX_ALIAS_SEQUENCE_LENGTH] = { - [0] = {0}, -}; - -static const uint16_t ts_non_terminal_alias_map[] = { - 0, -}; - -static bool ts_lex(TSLexer *lexer, TSStateId state) { - START_LEXER(); - eof = lexer->eof(lexer); - switch (state) { - case 0: - if (eof) - ADVANCE(28); - if (lookahead == '"') - ADVANCE(2); - if (lookahead == '#') - ADVANCE(35); - if (lookahead == ',') - ADVANCE(30); - if (lookahead == '-') - ADVANCE(7); - if (lookahead == '.') - ADVANCE(34); - if (lookahead == '/') - ADVANCE(6); - if (lookahead == '0') - ADVANCE(66); - if (lookahead == '=') - ADVANCE(40); - if (lookahead == '[') - ADVANCE(38); - if (lookahead == ']') - ADVANCE(39); - if (lookahead == 'f') - ADVANCE(41); - if (lookahead == 'l') - ADVANCE(43); - if (lookahead == 'n') - ADVANCE(58); - if (lookahead == 's') - ADVANCE(48); - if (lookahead == 't') - ADVANCE(54); - if (lookahead == 'u') - ADVANCE(55); - if (lookahead == '{') - ADVANCE(36); - if (lookahead == '}') - ADVANCE(37); - if (lookahead == '\t' || lookahead == '\n' || lookahead == '\r' || - lookahead == ' ') - ADVANCE(74); - if (('1' <= lookahead && lookahead <= '9')) - ADVANCE(67); - if (('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 1: - if (lookahead == '"') - ADVANCE(2); - if (lookahead == '-') - ADVANCE(7); - if (lookahead == '/') - ADVANCE(6); - if (lookahead == '0') - ADVANCE(66); - if (lookahead == '[') - ADVANCE(38); - if (lookahead == ']') - ADVANCE(39); - if (lookahead == 'f') - ADVANCE(8); - if (lookahead == 'n') - ADVANCE(22); - if (lookahead == 's') - ADVANCE(13); - if (lookahead == 't') - ADVANCE(19); - if (lookahead == '{') - ADVANCE(36); - if (lookahead == '\t' || lookahead == '\n' || lookahead == '\r' || - lookahead == ' ') - ADVANCE(74); - if (('1' <= lookahead && lookahead <= '9')) - ADVANCE(67); - END_STATE(); - case 2: - if (lookahead == '"') - ADVANCE(70); - if (lookahead == '\\') - ADVANCE(27); - if (lookahead != 0) - ADVANCE(2); - END_STATE(); - case 3: - if (lookahead == '.') - ADVANCE(34); - if (lookahead == '/') - ADVANCE(6); - if (lookahead == 'l') - ADVANCE(43); - if (lookahead == '\t' || lookahead == '\n' || lookahead == '\r' || - lookahead == ' ') - ADVANCE(74); - if (('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 4: - if (lookahead == '/') - ADVANCE(6); - if (lookahead == 'l') - ADVANCE(43); - if (lookahead == 'u') - ADVANCE(55); - if (lookahead == '\t' || lookahead == '\n' || lookahead == '\r' || - lookahead == ' ') - ADVANCE(74); - if (('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 5: - if (lookahead == '/') - ADVANCE(6); - if (lookahead == '}') - ADVANCE(37); - if (lookahead == '\t' || lookahead == '\n' || lookahead == '\r' || - lookahead == ' ') - ADVANCE(74); - if (('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 6: - if (lookahead == '/') - ADVANCE(73); - END_STATE(); - case 7: - if (lookahead == '0') - ADVANCE(66); - if (('1' <= lookahead && lookahead <= '9')) - ADVANCE(67); - END_STATE(); - case 8: - if (lookahead == 'a') - ADVANCE(15); - END_STATE(); - case 9: - if (lookahead == 'c') - ADVANCE(12); - END_STATE(); - case 10: - if (lookahead == 'e') - ADVANCE(62); - END_STATE(); - case 11: - if (lookahead == 'e') - ADVANCE(64); - END_STATE(); - case 12: - if (lookahead == 'e') - ADVANCE(32); - END_STATE(); - case 13: - if (lookahead == 'e') - ADVANCE(18); - END_STATE(); - case 14: - if (lookahead == 'i') - ADVANCE(9); - END_STATE(); - case 15: - if (lookahead == 'l') - ADVANCE(20); - END_STATE(); - case 16: - if (lookahead == 'l') - ADVANCE(71); - END_STATE(); - case 17: - if (lookahead == 'l') - ADVANCE(16); - END_STATE(); - case 18: - if (lookahead == 'r') - ADVANCE(23); - END_STATE(); - case 19: - if (lookahead == 'r') - ADVANCE(21); - END_STATE(); - case 20: - if (lookahead == 's') - ADVANCE(11); - END_STATE(); - case 21: - if (lookahead == 'u') - ADVANCE(10); - END_STATE(); - case 22: - if (lookahead == 'u') - ADVANCE(17); - END_STATE(); - case 23: - if (lookahead == 'v') - ADVANCE(14); - END_STATE(); - case 24: - if (lookahead == '+' || lookahead == '-') - ADVANCE(26); - if (('0' <= lookahead && lookahead <= '9')) - ADVANCE(69); - END_STATE(); - case 25: - if (('0' <= lookahead && lookahead <= '9')) - ADVANCE(68); - END_STATE(); - case 26: - if (('0' <= lookahead && lookahead <= '9')) - ADVANCE(69); - END_STATE(); - case 27: - if (lookahead != 0 && lookahead != '\n') - ADVANCE(2); - END_STATE(); - case 28: - ACCEPT_TOKEN(ts_builtin_sym_end); - END_STATE(); - case 29: - ACCEPT_TOKEN(anon_sym_let); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 30: - ACCEPT_TOKEN(anon_sym_COMMA); - END_STATE(); - case 31: - ACCEPT_TOKEN(anon_sym_use); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 32: - ACCEPT_TOKEN(anon_sym_service); - END_STATE(); - case 33: - ACCEPT_TOKEN(anon_sym_service); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 34: - ACCEPT_TOKEN(anon_sym_DOT); - END_STATE(); - case 35: - ACCEPT_TOKEN(anon_sym_POUND); - END_STATE(); - case 36: - ACCEPT_TOKEN(anon_sym_LBRACE); - END_STATE(); - case 37: - ACCEPT_TOKEN(anon_sym_RBRACE); - END_STATE(); - case 38: - ACCEPT_TOKEN(anon_sym_LBRACK); - END_STATE(); - case 39: - ACCEPT_TOKEN(anon_sym_RBRACK); - END_STATE(); - case 40: - ACCEPT_TOKEN(anon_sym_EQ); - END_STATE(); - case 41: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'a') - ADVANCE(52); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('b' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 42: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'c') - ADVANCE(47); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 43: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'e') - ADVANCE(57); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 44: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'e') - ADVANCE(31); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 45: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'e') - ADVANCE(63); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 46: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'e') - ADVANCE(65); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 47: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'e') - ADVANCE(33); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 48: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'e') - ADVANCE(53); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 49: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'i') - ADVANCE(42); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 50: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'l') - ADVANCE(72); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 51: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'l') - ADVANCE(50); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 52: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'l') - ADVANCE(56); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 53: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'r') - ADVANCE(60); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 54: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'r') - ADVANCE(59); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 55: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 's') - ADVANCE(44); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 56: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 's') - ADVANCE(46); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 57: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 't') - ADVANCE(29); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 58: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'u') - ADVANCE(51); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 59: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'u') - ADVANCE(45); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 60: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'v') - ADVANCE(49); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 61: - ACCEPT_TOKEN(sym_identifier); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 62: - ACCEPT_TOKEN(anon_sym_true); - END_STATE(); - case 63: - ACCEPT_TOKEN(anon_sym_true); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 64: - ACCEPT_TOKEN(anon_sym_false); - END_STATE(); - case 65: - ACCEPT_TOKEN(anon_sym_false); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 66: - ACCEPT_TOKEN(sym_number); - if (lookahead == '.') - ADVANCE(25); - if (lookahead == 'E' || lookahead == 'e') - ADVANCE(24); - END_STATE(); - case 67: - ACCEPT_TOKEN(sym_number); - if (lookahead == '.') - ADVANCE(25); - if (lookahead == 'E' || lookahead == 'e') - ADVANCE(24); - if (('0' <= lookahead && lookahead <= '9')) - ADVANCE(67); - END_STATE(); - case 68: - ACCEPT_TOKEN(sym_number); - if (lookahead == 'E' || lookahead == 'e') - ADVANCE(24); - if (('0' <= lookahead && lookahead <= '9')) - ADVANCE(68); - END_STATE(); - case 69: - ACCEPT_TOKEN(sym_number); - if (('0' <= lookahead && lookahead <= '9')) - ADVANCE(69); - END_STATE(); - case 70: - ACCEPT_TOKEN(sym_string); - END_STATE(); - case 71: - ACCEPT_TOKEN(sym_null); - END_STATE(); - case 72: - ACCEPT_TOKEN(sym_null); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) - ADVANCE(61); - END_STATE(); - case 73: - ACCEPT_TOKEN(sym_comment); - if (lookahead != 0 && lookahead != '\n') - ADVANCE(73); - END_STATE(); - case 74: - ACCEPT_TOKEN(sym_whitespace); - if (lookahead == '\t' || lookahead == '\n' || lookahead == '\r' || - lookahead == ' ') - ADVANCE(74); - END_STATE(); - default: - return false; - } -} - -static const TSLexMode ts_lex_modes[STATE_COUNT] = { - [0] = {.lex_state = 0}, [1] = {.lex_state = 4}, [2] = {.lex_state = 1}, - [3] = {.lex_state = 1}, [4] = {.lex_state = 1}, [5] = {.lex_state = 1}, - [6] = {.lex_state = 1}, [7] = {.lex_state = 3}, [8] = {.lex_state = 5}, - [9] = {.lex_state = 0}, [10] = {.lex_state = 0}, [11] = {.lex_state = 0}, - [12] = {.lex_state = 0}, [13] = {.lex_state = 0}, [14] = {.lex_state = 0}, - [15] = {.lex_state = 0}, [16] = {.lex_state = 0}, [17] = {.lex_state = 0}, - [18] = {.lex_state = 0}, [19] = {.lex_state = 0}, [20] = {.lex_state = 5}, - [21] = {.lex_state = 0}, [22] = {.lex_state = 0}, [23] = {.lex_state = 5}, - [24] = {.lex_state = 3}, [25] = {.lex_state = 3}, [26] = {.lex_state = 0}, - [27] = {.lex_state = 0}, [28] = {.lex_state = 0}, [29] = {.lex_state = 0}, - [30] = {.lex_state = 0}, [31] = {.lex_state = 5}, [32] = {.lex_state = 5}, - [33] = {.lex_state = 0}, [34] = {.lex_state = 5}, [35] = {.lex_state = 3}, - [36] = {.lex_state = 0}, [37] = {.lex_state = 0}, [38] = {.lex_state = 0}, - [39] = {.lex_state = 5}, [40] = {.lex_state = 0}, [41] = {.lex_state = 0}, - [42] = {.lex_state = 0}, [43] = {.lex_state = 5}, [44] = {.lex_state = 0}, - [45] = {.lex_state = 0}, [46] = {.lex_state = 5}, [47] = {.lex_state = 0}, - [48] = {.lex_state = 0}, [49] = {.lex_state = 5}, [50] = {.lex_state = 1}, - [51] = {.lex_state = 0}, [52] = {.lex_state = 0}, [53] = {.lex_state = 0}, - [54] = {.lex_state = 0}, [55] = {.lex_state = 0}, [56] = {.lex_state = 0}, - [57] = {.lex_state = 0}, -}; - -static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { - [0] = - { - [ts_builtin_sym_end] = ACTIONS(1), [anon_sym_let] = ACTIONS(1), - [anon_sym_COMMA] = ACTIONS(1), [anon_sym_use] = ACTIONS(1), - [anon_sym_service] = ACTIONS(1), [anon_sym_DOT] = ACTIONS(1), - [anon_sym_POUND] = ACTIONS(1), [anon_sym_LBRACE] = ACTIONS(1), - [anon_sym_RBRACE] = ACTIONS(1), [anon_sym_LBRACK] = ACTIONS(1), - [anon_sym_RBRACK] = ACTIONS(1), [anon_sym_EQ] = ACTIONS(1), - [sym_identifier] = ACTIONS(1), [anon_sym_true] = ACTIONS(1), - [anon_sym_false] = ACTIONS(1), [sym_number] = ACTIONS(1), - [sym_string] = ACTIONS(1), [sym_null] = ACTIONS(1), - [sym_comment] = ACTIONS(3), [sym_whitespace] = ACTIONS(3), - }, - [1] = - { - [sym_source_file] = STATE(54), - [sym_top_level_statement] = STATE(53), - [sym_let_binding] = STATE(52), - [sym_operation_call] = STATE(52), - [sym_use_clause] = STATE(7), - [sym_qualified_identifier] = STATE(51), - [sym_operation_name] = STATE(37), - [anon_sym_let] = ACTIONS(5), - [anon_sym_use] = ACTIONS(7), - [sym_identifier] = ACTIONS(9), - [sym_comment] = ACTIONS(3), - [sym_whitespace] = ACTIONS(3), - }, -}; - -static const uint16_t ts_small_parse_table[] = { - [0] = 9, - ACTIONS(11), - 1, - anon_sym_LBRACE, - ACTIONS(13), - 1, - anon_sym_LBRACK, - ACTIONS(15), - 1, - anon_sym_RBRACK, - STATE(18), - 1, - sym_input_node, - STATE(47), - 1, - sym_list_fields, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - ACTIONS(17), - 2, - anon_sym_true, - anon_sym_false, - ACTIONS(19), - 3, - sym_number, - sym_string, - sym_null, - STATE(12), - 3, - sym_struct, - sym_list, - sym_boolean, - [34] = 8, - ACTIONS(11), - 1, - anon_sym_LBRACE, - ACTIONS(13), - 1, - anon_sym_LBRACK, - ACTIONS(21), - 1, - anon_sym_RBRACK, - STATE(38), - 1, - sym_input_node, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - ACTIONS(17), - 2, - anon_sym_true, - anon_sym_false, - ACTIONS(19), - 3, - sym_number, - sym_string, - sym_null, - STATE(12), - 3, - sym_struct, - sym_list, - sym_boolean, - [65] = 8, - ACTIONS(11), - 1, - anon_sym_LBRACE, - ACTIONS(13), - 1, - anon_sym_LBRACK, - ACTIONS(23), - 1, - anon_sym_RBRACK, - STATE(38), - 1, - sym_input_node, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - ACTIONS(17), - 2, - anon_sym_true, - anon_sym_false, - ACTIONS(19), - 3, - sym_number, - sym_string, - sym_null, - STATE(12), - 3, - sym_struct, - sym_list, - sym_boolean, - [96] = 7, - ACTIONS(11), - 1, - anon_sym_LBRACE, - ACTIONS(13), - 1, - anon_sym_LBRACK, - STATE(38), - 1, - sym_input_node, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - ACTIONS(17), - 2, - anon_sym_true, - anon_sym_false, - ACTIONS(19), - 3, - sym_number, - sym_string, - sym_null, - STATE(12), - 3, - sym_struct, - sym_list, - sym_boolean, - [124] = 7, - ACTIONS(11), - 1, - anon_sym_LBRACE, - ACTIONS(13), - 1, - anon_sym_LBRACK, - STATE(29), - 1, - sym_input_node, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - ACTIONS(17), - 2, - anon_sym_true, - anon_sym_false, - ACTIONS(19), - 3, - sym_number, - sym_string, - sym_null, - STATE(12), - 3, - sym_struct, - sym_list, - sym_boolean, - [152] = 7, - ACTIONS(5), - 1, - anon_sym_let, - ACTIONS(9), - 1, - sym_identifier, - STATE(37), - 1, - sym_operation_name, - STATE(48), - 1, - sym_top_level_statement, - STATE(51), - 1, - sym_qualified_identifier, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - STATE(52), - 2, - sym_let_binding, - sym_operation_call, - [176] = 5, - ACTIONS(25), - 1, - anon_sym_RBRACE, - ACTIONS(27), - 1, - sym_identifier, - STATE(17), - 1, - sym_binding, - STATE(41), - 1, - sym_bindings, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [193] = 2, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - ACTIONS(29), - 4, - ts_builtin_sym_end, - anon_sym_COMMA, - anon_sym_RBRACE, - anon_sym_RBRACK, - [204] = 5, - ACTIONS(31), - 1, - anon_sym_DOT, - ACTIONS(33), - 1, - anon_sym_POUND, - ACTIONS(35), - 1, - anon_sym_LBRACE, - STATE(22), - 1, - aux_sym_qualified_identifier_repeat1, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [221] = 2, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - ACTIONS(37), - 4, - ts_builtin_sym_end, - anon_sym_COMMA, - anon_sym_RBRACE, - anon_sym_RBRACK, - [232] = 2, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - ACTIONS(39), - 4, - ts_builtin_sym_end, - anon_sym_COMMA, - anon_sym_RBRACE, - anon_sym_RBRACK, - [243] = 2, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - ACTIONS(41), - 4, - ts_builtin_sym_end, - anon_sym_COMMA, - anon_sym_RBRACE, - anon_sym_RBRACK, - [254] = 2, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - ACTIONS(43), - 4, - ts_builtin_sym_end, - anon_sym_COMMA, - anon_sym_RBRACE, - anon_sym_RBRACK, - [265] = 2, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - ACTIONS(45), - 4, - ts_builtin_sym_end, - anon_sym_COMMA, - anon_sym_RBRACE, - anon_sym_RBRACK, - [276] = 4, - ACTIONS(23), - 1, - anon_sym_RBRACK, - ACTIONS(47), - 1, - anon_sym_COMMA, - STATE(28), - 1, - aux_sym_list_fields_repeat1, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [290] = 4, - ACTIONS(49), - 1, - anon_sym_COMMA, - ACTIONS(51), - 1, - anon_sym_RBRACE, - STATE(21), - 1, - aux_sym_bindings_repeat1, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [304] = 4, - ACTIONS(53), - 1, - anon_sym_COMMA, - ACTIONS(55), - 1, - anon_sym_RBRACK, - STATE(16), - 1, - aux_sym_list_fields_repeat1, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [318] = 4, - ACTIONS(57), - 1, - anon_sym_COMMA, - ACTIONS(60), - 1, - anon_sym_RBRACE, - STATE(19), - 1, - aux_sym_bindings_repeat1, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [332] = 4, - ACTIONS(27), - 1, - sym_identifier, - ACTIONS(62), - 1, - anon_sym_RBRACE, - STATE(30), - 1, - sym_binding, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [346] = 4, - ACTIONS(64), - 1, - anon_sym_COMMA, - ACTIONS(66), - 1, - anon_sym_RBRACE, - STATE(19), - 1, - aux_sym_bindings_repeat1, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [360] = 4, - ACTIONS(31), - 1, - anon_sym_DOT, - ACTIONS(68), - 1, - anon_sym_POUND, - STATE(26), - 1, - aux_sym_qualified_identifier_repeat1, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [374] = 4, - ACTIONS(27), - 1, - sym_identifier, - ACTIONS(66), - 1, - anon_sym_RBRACE, - STATE(30), - 1, - sym_binding, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [388] = 3, - ACTIONS(72), - 1, - anon_sym_DOT, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - ACTIONS(70), - 2, - anon_sym_let, - sym_identifier, - [400] = 3, - ACTIONS(76), - 1, - anon_sym_DOT, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - ACTIONS(74), - 2, - anon_sym_let, - sym_identifier, - [412] = 4, - ACTIONS(78), - 1, - anon_sym_DOT, - ACTIONS(81), - 1, - anon_sym_POUND, - STATE(26), - 1, - aux_sym_qualified_identifier_repeat1, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [426] = 4, - ACTIONS(31), - 1, - anon_sym_DOT, - ACTIONS(33), - 1, - anon_sym_POUND, - STATE(22), - 1, - aux_sym_qualified_identifier_repeat1, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [440] = 4, - ACTIONS(83), - 1, - anon_sym_COMMA, - ACTIONS(86), - 1, - anon_sym_RBRACK, - STATE(28), - 1, - aux_sym_list_fields_repeat1, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [454] = 2, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - ACTIONS(88), - 3, - ts_builtin_sym_end, - anon_sym_COMMA, - anon_sym_RBRACE, - [464] = 2, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - ACTIONS(60), - 2, - anon_sym_COMMA, - anon_sym_RBRACE, - [473] = 3, - ACTIONS(27), - 1, - sym_identifier, - STATE(30), - 1, - sym_binding, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [484] = 3, - ACTIONS(90), - 1, - sym_identifier, - STATE(35), - 1, - sym_qualified_identifier, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [495] = 3, - ACTIONS(92), - 1, - ts_builtin_sym_end, - ACTIONS(94), - 1, - anon_sym_COMMA, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [506] = 3, - ACTIONS(27), - 1, - sym_identifier, - STATE(33), - 1, - sym_binding, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [517] = 2, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - ACTIONS(96), - 2, - anon_sym_let, - sym_identifier, - [526] = 2, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - ACTIONS(81), - 2, - anon_sym_DOT, - anon_sym_POUND, - [535] = 3, - ACTIONS(11), - 1, - anon_sym_LBRACE, - STATE(45), - 1, - sym_struct, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [546] = 2, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - ACTIONS(86), - 2, - anon_sym_COMMA, - anon_sym_RBRACK, - [555] = 2, - ACTIONS(98), - 1, - sym_identifier, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [563] = 2, - ACTIONS(100), - 1, - ts_builtin_sym_end, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [571] = 2, - ACTIONS(102), - 1, - anon_sym_RBRACE, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [579] = 2, - ACTIONS(104), - 1, - anon_sym_LBRACE, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [587] = 2, - ACTIONS(106), - 1, - sym_identifier, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [595] = 2, - ACTIONS(108), - 1, - anon_sym_EQ, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [603] = 2, - ACTIONS(110), - 1, - ts_builtin_sym_end, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [611] = 2, - ACTIONS(112), - 1, - sym_identifier, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [619] = 2, - ACTIONS(114), - 1, - anon_sym_RBRACK, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [627] = 2, - ACTIONS(116), - 1, - ts_builtin_sym_end, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [635] = 2, - ACTIONS(118), - 1, - sym_identifier, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [643] = 2, - ACTIONS(120), - 1, - anon_sym_service, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [651] = 2, - ACTIONS(122), - 1, - anon_sym_DOT, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [659] = 2, - ACTIONS(124), - 1, - ts_builtin_sym_end, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [667] = 2, - ACTIONS(126), - 1, - ts_builtin_sym_end, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [675] = 2, - ACTIONS(128), - 1, - ts_builtin_sym_end, - ACTIONS(3), - 2, - sym_comment, - sym_whitespace, - [683] = 2, - ACTIONS(3), - 1, - sym_comment, - ACTIONS(130), - 1, - sym_whitespace, - [690] = 2, - ACTIONS(3), - 1, - sym_comment, - ACTIONS(132), - 1, - sym_whitespace, - [697] = 2, - ACTIONS(3), - 1, - sym_comment, - ACTIONS(134), - 1, - sym_whitespace, -}; - -static const uint32_t ts_small_parse_table_map[] = { - [SMALL_STATE(2)] = 0, [SMALL_STATE(3)] = 34, [SMALL_STATE(4)] = 65, - [SMALL_STATE(5)] = 96, [SMALL_STATE(6)] = 124, [SMALL_STATE(7)] = 152, - [SMALL_STATE(8)] = 176, [SMALL_STATE(9)] = 193, [SMALL_STATE(10)] = 204, - [SMALL_STATE(11)] = 221, [SMALL_STATE(12)] = 232, [SMALL_STATE(13)] = 243, - [SMALL_STATE(14)] = 254, [SMALL_STATE(15)] = 265, [SMALL_STATE(16)] = 276, - [SMALL_STATE(17)] = 290, [SMALL_STATE(18)] = 304, [SMALL_STATE(19)] = 318, - [SMALL_STATE(20)] = 332, [SMALL_STATE(21)] = 346, [SMALL_STATE(22)] = 360, - [SMALL_STATE(23)] = 374, [SMALL_STATE(24)] = 388, [SMALL_STATE(25)] = 400, - [SMALL_STATE(26)] = 412, [SMALL_STATE(27)] = 426, [SMALL_STATE(28)] = 440, - [SMALL_STATE(29)] = 454, [SMALL_STATE(30)] = 464, [SMALL_STATE(31)] = 473, - [SMALL_STATE(32)] = 484, [SMALL_STATE(33)] = 495, [SMALL_STATE(34)] = 506, - [SMALL_STATE(35)] = 517, [SMALL_STATE(36)] = 526, [SMALL_STATE(37)] = 535, - [SMALL_STATE(38)] = 546, [SMALL_STATE(39)] = 555, [SMALL_STATE(40)] = 563, - [SMALL_STATE(41)] = 571, [SMALL_STATE(42)] = 579, [SMALL_STATE(43)] = 587, - [SMALL_STATE(44)] = 595, [SMALL_STATE(45)] = 603, [SMALL_STATE(46)] = 611, - [SMALL_STATE(47)] = 619, [SMALL_STATE(48)] = 627, [SMALL_STATE(49)] = 635, - [SMALL_STATE(50)] = 643, [SMALL_STATE(51)] = 651, [SMALL_STATE(52)] = 659, - [SMALL_STATE(53)] = 667, [SMALL_STATE(54)] = 675, [SMALL_STATE(55)] = 683, - [SMALL_STATE(56)] = 690, [SMALL_STATE(57)] = 697, -}; - -static const TSParseActionEntry ts_parse_actions[] = { - [0] = {.entry = {.count = 0, .reusable = false}}, - [1] = {.entry = {.count = 1, .reusable = false}}, - RECOVER(), - [3] = {.entry = {.count = 1, .reusable = true}}, - SHIFT_EXTRA(), - [5] = {.entry = {.count = 1, .reusable = false}}, - SHIFT(55), - [7] = {.entry = {.count = 1, .reusable = false}}, - SHIFT(57), - [9] = {.entry = {.count = 1, .reusable = false}}, - SHIFT(10), - [11] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(8), - [13] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(2), - [15] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(15), - [17] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(9), - [19] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(12), - [21] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(sym_list_fields, 3), - [23] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(sym_list_fields, 2), - [25] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(14), - [27] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(44), - [29] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(sym_boolean, 1), - [31] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(39), - [33] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(49), - [35] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(sym_operation_name, 1, .production_id = 1), - [37] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(sym_list, 3, .production_id = 11), - [39] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(sym_input_node, 1), - [41] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(sym_struct, 3, .production_id = 8), - [43] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(sym_struct, 2), - [45] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(sym_list, 2), - [47] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(3), - [49] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(23), - [51] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(sym_bindings, 1), - [53] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(4), - [55] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(sym_list_fields, 1), - [57] = {.entry = {.count = 2, .reusable = true}}, - REDUCE(aux_sym_bindings_repeat1, 2), - SHIFT_REPEAT(31), - [60] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(aux_sym_bindings_repeat1, 2), - [62] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(sym_bindings, 3), - [64] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(20), - [66] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(sym_bindings, 2), - [68] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(43), - [70] = {.entry = {.count = 1, .reusable = false}}, - REDUCE(sym_qualified_identifier, 3, .production_id = 5), - [72] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(sym_qualified_identifier, 3, .production_id = 5), - [74] = {.entry = {.count = 1, .reusable = false}}, - REDUCE(sym_qualified_identifier, 4, .production_id = 7), - [76] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(sym_qualified_identifier, 4, .production_id = 7), - [78] = {.entry = {.count = 2, .reusable = true}}, - REDUCE(aux_sym_qualified_identifier_repeat1, 2), - SHIFT_REPEAT(39), - [81] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(aux_sym_qualified_identifier_repeat1, 2), - [83] = {.entry = {.count = 2, .reusable = true}}, - REDUCE(aux_sym_list_fields_repeat1, 2), - SHIFT_REPEAT(5), - [86] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(aux_sym_list_fields_repeat1, 2), - [88] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(sym_binding, 3, .production_id = 9), - [90] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(27), - [92] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(sym_let_binding, 3), - [94] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(40), - [96] = {.entry = {.count = 1, .reusable = false}}, - REDUCE(sym_use_clause, 5, .production_id = 10), - [98] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(36), - [100] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(sym_let_binding, 4), - [102] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(13), - [104] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(sym_operation_name, 3, .production_id = 6), - [106] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(25), - [108] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(6), - [110] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(sym_operation_call, 2, .production_id = 4), - [112] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(42), - [114] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(11), - [116] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(sym_source_file, 2, .production_id = 3), - [118] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(24), - [120] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(56), - [122] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(46), - [124] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(sym_top_level_statement, 1), - [126] = {.entry = {.count = 1, .reusable = true}}, - REDUCE(sym_source_file, 1, .production_id = 2), - [128] = {.entry = {.count = 1, .reusable = true}}, - ACCEPT_INPUT(), - [130] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(34), - [132] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(32), - [134] = {.entry = {.count = 1, .reusable = true}}, - SHIFT(50), -}; - -#ifdef __cplusplus -extern "C" { -#endif -#ifdef _WIN32 -#define extern __declspec(dllexport) -#endif - -extern const TSLanguage *tree_sitter_smithyql(void) { - static const TSLanguage language = { - .version = LANGUAGE_VERSION, - .symbol_count = SYMBOL_COUNT, - .alias_count = ALIAS_COUNT, - .token_count = TOKEN_COUNT, - .external_token_count = EXTERNAL_TOKEN_COUNT, - .state_count = STATE_COUNT, - .large_state_count = LARGE_STATE_COUNT, - .production_id_count = PRODUCTION_ID_COUNT, - .field_count = FIELD_COUNT, - .max_alias_sequence_length = MAX_ALIAS_SEQUENCE_LENGTH, - .parse_table = &ts_parse_table[0][0], - .small_parse_table = ts_small_parse_table, - .small_parse_table_map = ts_small_parse_table_map, - .parse_actions = ts_parse_actions, - .symbol_names = ts_symbol_names, - .field_names = ts_field_names, - .field_map_slices = ts_field_map_slices, - .field_map_entries = ts_field_map_entries, - .symbol_metadata = ts_symbol_metadata, - .public_symbol_map = ts_symbol_map, - .alias_map = ts_non_terminal_alias_map, - .alias_sequences = &ts_alias_sequences[0][0], - .lex_modes = ts_lex_modes, - .lex_fn = ts_lex, - }; - return &language; -} -#ifdef __cplusplus -} -#endif diff --git a/tree-sitter-smithyql/src/tree_sitter/parser.h b/tree-sitter-smithyql/src/tree_sitter/parser.h deleted file mode 100644 index 2b14ac10..00000000 --- a/tree-sitter-smithyql/src/tree_sitter/parser.h +++ /dev/null @@ -1,224 +0,0 @@ -#ifndef TREE_SITTER_PARSER_H_ -#define TREE_SITTER_PARSER_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include - -#define ts_builtin_sym_error ((TSSymbol)-1) -#define ts_builtin_sym_end 0 -#define TREE_SITTER_SERIALIZATION_BUFFER_SIZE 1024 - -typedef uint16_t TSStateId; - -#ifndef TREE_SITTER_API_H_ -typedef uint16_t TSSymbol; -typedef uint16_t TSFieldId; -typedef struct TSLanguage TSLanguage; -#endif - -typedef struct { - TSFieldId field_id; - uint8_t child_index; - bool inherited; -} TSFieldMapEntry; - -typedef struct { - uint16_t index; - uint16_t length; -} TSFieldMapSlice; - -typedef struct { - bool visible; - bool named; - bool supertype; -} TSSymbolMetadata; - -typedef struct TSLexer TSLexer; - -struct TSLexer { - int32_t lookahead; - TSSymbol result_symbol; - void (*advance)(TSLexer *, bool); - void (*mark_end)(TSLexer *); - uint32_t (*get_column)(TSLexer *); - bool (*is_at_included_range_start)(const TSLexer *); - bool (*eof)(const TSLexer *); -}; - -typedef enum { - TSParseActionTypeShift, - TSParseActionTypeReduce, - TSParseActionTypeAccept, - TSParseActionTypeRecover, -} TSParseActionType; - -typedef union { - struct { - uint8_t type; - TSStateId state; - bool extra; - bool repetition; - } shift; - struct { - uint8_t type; - uint8_t child_count; - TSSymbol symbol; - int16_t dynamic_precedence; - uint16_t production_id; - } reduce; - uint8_t type; -} TSParseAction; - -typedef struct { - uint16_t lex_state; - uint16_t external_lex_state; -} TSLexMode; - -typedef union { - TSParseAction action; - struct { - uint8_t count; - bool reusable; - } entry; -} TSParseActionEntry; - -struct TSLanguage { - uint32_t version; - uint32_t symbol_count; - uint32_t alias_count; - uint32_t token_count; - uint32_t external_token_count; - uint32_t state_count; - uint32_t large_state_count; - uint32_t production_id_count; - uint32_t field_count; - uint16_t max_alias_sequence_length; - const uint16_t *parse_table; - const uint16_t *small_parse_table; - const uint32_t *small_parse_table_map; - const TSParseActionEntry *parse_actions; - const char * const *symbol_names; - const char * const *field_names; - const TSFieldMapSlice *field_map_slices; - const TSFieldMapEntry *field_map_entries; - const TSSymbolMetadata *symbol_metadata; - const TSSymbol *public_symbol_map; - const uint16_t *alias_map; - const TSSymbol *alias_sequences; - const TSLexMode *lex_modes; - bool (*lex_fn)(TSLexer *, TSStateId); - bool (*keyword_lex_fn)(TSLexer *, TSStateId); - TSSymbol keyword_capture_token; - struct { - const bool *states; - const TSSymbol *symbol_map; - void *(*create)(void); - void (*destroy)(void *); - bool (*scan)(void *, TSLexer *, const bool *symbol_whitelist); - unsigned (*serialize)(void *, char *); - void (*deserialize)(void *, const char *, unsigned); - } external_scanner; - const TSStateId *primary_state_ids; -}; - -/* - * Lexer Macros - */ - -#define START_LEXER() \ - bool result = false; \ - bool skip = false; \ - bool eof = false; \ - int32_t lookahead; \ - goto start; \ - next_state: \ - lexer->advance(lexer, skip); \ - start: \ - skip = false; \ - lookahead = lexer->lookahead; - -#define ADVANCE(state_value) \ - { \ - state = state_value; \ - goto next_state; \ - } - -#define SKIP(state_value) \ - { \ - skip = true; \ - state = state_value; \ - goto next_state; \ - } - -#define ACCEPT_TOKEN(symbol_value) \ - result = true; \ - lexer->result_symbol = symbol_value; \ - lexer->mark_end(lexer); - -#define END_STATE() return result; - -/* - * Parse Table Macros - */ - -#define SMALL_STATE(id) id - LARGE_STATE_COUNT - -#define STATE(id) id - -#define ACTIONS(id) id - -#define SHIFT(state_value) \ - {{ \ - .shift = { \ - .type = TSParseActionTypeShift, \ - .state = state_value \ - } \ - }} - -#define SHIFT_REPEAT(state_value) \ - {{ \ - .shift = { \ - .type = TSParseActionTypeShift, \ - .state = state_value, \ - .repetition = true \ - } \ - }} - -#define SHIFT_EXTRA() \ - {{ \ - .shift = { \ - .type = TSParseActionTypeShift, \ - .extra = true \ - } \ - }} - -#define REDUCE(symbol_val, child_count_val, ...) \ - {{ \ - .reduce = { \ - .type = TSParseActionTypeReduce, \ - .symbol = symbol_val, \ - .child_count = child_count_val, \ - __VA_ARGS__ \ - }, \ - }} - -#define RECOVER() \ - {{ \ - .type = TSParseActionTypeRecover \ - }} - -#define ACCEPT_INPUT() \ - {{ \ - .type = TSParseActionTypeAccept \ - }} - -#ifdef __cplusplus -} -#endif - -#endif // TREE_SITTER_PARSER_H_ diff --git a/tree-sitter-smithyql/src/tree_sitter/parser.h.gch b/tree-sitter-smithyql/src/tree_sitter/parser.h.gch deleted file mode 100644 index 791a13ebc506d690c291679ab9ec200838de771c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 885612 zcmd?Sd3;kv7dJjPNf#2@rmO`DhDB-V7NC>@QPTxP#mB0M?4-~N2&EN@l+|=$5mCbf zJffn8ML{2yvR5dQ1`tG+qJStMLAI)h5oCKrc)#c7+%~r^@ALlT`RjK-O~0ABGv}N+ zbLN~gb8jInBdw4!_qUdGRRoiM=YK+SrvquxR&t2RRjhDHjmldH&jM5}6T~(`zoug@YOM^zSmh@dQ zds5piN^J)LAnC%?b~1x@4)=~M5OJl(RaV!!V-^-g@52b(v5~q%saN!+R>KEg{c5ve zyGg&&t6y5G4|~F;U+mE@&oC^`)4%66tPzF{4*eRBe!bTlyuqknhgz#)ySJum*ipOw zJ)?eEhJKybus%b-*ko90*Q;7Ilnm=K^ra@l8ngaAvthlLn$}RxGg=K#v@6rZ9@fMu zBZhV`oR~T8c9z(bTKBYVY7b1)uEZVdbf?&3+blL4Hh2w7Tzc^Ox7VfH;4qYCkT~z# z^pI|Y*A)y=m%99`Od%gw_3wG~80q^C{d*=FpVHjeu=YKxVKKCop$~iO2|X#vWLW7i zYzG0e0pC9`>Q_4STQc;^yapem^oZj3Y5lDs?C z1zSmNN3*VpJFAJEkJ{Khv9Pns)OPzcam(CMFpmY5snIaY5|oSLV0MnwXiRxoYCAM4 zFN)dcPTPP9h6(u0?v~$_Tg<&;=4;}dutIkN?5$iAV@VH*b-5E@>W7PBKzWZl;TX&) z6_mB-_fc)^9GI(yte;q7Nw^cri=r30V?hbbuKigfR}osolw+x280i_&9-3N^jjDv9 z%VN*bKw531BSkTXiCT2^%tIQe0y1K3a-+0+D>ShvLtz*texMrlz~;q4O<1H*2oVFz ztOc?2i=blsj=>PnTcs9FY&k9L;;cidakoWHoC>iG7JlQ#!zb2ql~4u$)R8G(8H47^IFHV&1TfxUSre04~w&6 zIaThIqGdZuI1ELR!9?$K?`RmfG{dmWsNZg;6#%Y_Vf19CSn9MM(K~E@gfkUGCq>mbxTBoz1Vx+0iGlA6!**dv*^YH&HLP)audoRf_ zAfi!dlOz2SuQ&WJZyT0+$z8!stS2X<59{0Bk6nhoOpxz_e?n?dEmKh8I#UG=GZtwR zye>=yc}qFE!zW7s` z+HNH>t={siR1+&NidsSOA`Ygr%nki(d;4gVYdAwwnx=K28)TI25F8?P``sN48%_G^ z1zM8})i`<+C_Ud%X8eWS9OuDq@c3#6;w>MVmmzWG#2`i1{=|2GRf3{Z-q1q|Ie|}!; zo;<7MuyC(_2X#M?H5xWLNdEO+=e@NUW6dF>+KBPM@%RZCU8^0U-|ABRb{9m`BczZS ze_4x>nJfx=TrNA=rN|k*=JvJ7z&2OgD9u`GHH7u6HG42xhkg^H1r|$U9LD z`a%C@8V}3_A*;G)P{lg0gVqKday%k7Jg~B%DX#CUx+M?oR%)y~y0ng5>y9dyLj>ft zBk1*_NcnTl(txHUvhC4Vu_e?0z6eb&CuGw?N*DAY6ih z_}@0yt-j3}wZ$63Rh05jzO39B7|J&mrXnRl5=IF*Vir6dtf-tEj`pgeFO^4AZl`Gv z$rA+UbXG&r0zuD`9?oQaUCWCgJ?s!JR@++D9I3ur+mWlFXiQ!a(&pk+u0nd28n?l% zeVWT|PC|Gxi=yS+Dec)>xBVQe-`plQW~uxQ%VLe-TIBvvCHT|I(L`Gcn(z%;UYI9J zvZCebpk$TD>q|~jV=R4}a%;GKWZlTFU_lf-Q{(o@`Hv;58MlD&KDSS|-IzSACqx`y zqL8-p&&Fc0HD>~UB}aaXKWgNz*{NZHV}Np4(q3g=m^I9uyf+|QWKniBu}e%08p9$) zE`dh174gTkcQgv*Z7f!}khc`FOF(Y$fs>*$@|<-h!(zD8mm}E1G_fVHfua~o@8_+C zkI<>cpBmO;cMl(oRFQH+>nn<6$PH-?%jQ*56a!tuf-Tl8g#eOZq!#eq$Sf%*7?z>P zC5JFMe=@vRsV_x@LklI-M>2^+0VFG>M*UJ8G0bklGNwiyrd5$PULk`NR*nkWk>VI> z!$9d-r9P}~)9N1BKW@Md&7C$+=_GqSjGZKUwWgt?s2y@iOs~V8wo7U2)h}^UGR5kY z1zQXT3nIyXrNWERHV-odX9@i&lN)PE99QjJ<=qPfd#|@r*?0NGBbQGGSo~xV?$a3q zrU_x+>pG@11a&x~Jy;UGCMXo)^%1$rV^{A9y&jL!!{3`&(kCjNcxNJ~B*OQvlQ;xw|2 zWnS~mTD|4tg8A-fIh)g7t4(969G;hBa&dAZrz9)AjzX*mH_bq`{62pT&yRs9Q?a8F z_ECI(n;IoXQYKmeiHsRR%V;R7@S9v`v zl;&7?dr}cA;$U-@j8zH)PWjCg^1%ZmL(U%dG9NqKDuS{o=vsQ?%)loS8e)5ZbPQ~; zTPOod%5XAvDV$(@WEC8`+F^;y$0j>E@?q6>j~?p*M_II1GxT8%<5-96$Kd+s$U5j@Q2v;I^@FwpX>4s%4@o+(1!43ZpaUdgK!ip zE!OI@k)?J+nS4S5ZLWh;$w*f0D9WRW$F>A#UrstjOS?CeZPBbRvm2^c@VX2GhJ#Ex z?6A5kv9I1e;~Y%e{SOFif(i0biE)7zJ!nlJHv2YIIHp1LnB&$CQ@Yx)iYRl$F8^(% z`NE=Dm@8roLhF3LUH){X6J`w71OtY()HrN&;CG5f;k~eiu*Q)n)47!|p@v;xs<6Be zKAiHJgTZ-A1Hb?4ZnB@+KR8}YY84%* z$Wd!q%3t-N1&6?mKFa*p?mzI7GNktrmCSlb5BIEAmwlTebmd=UGkIQx(rQwc5_?pN zmwf`(_CN~{R5fiXZ6N=J4mP;cI)+snA0)$K#c4&@!k&tzaGHl~o_5&C_i4ic#UUlr zM4xr1-KTV|j_jCE*n@hu!=AdIiBTLS#m*r^jNOOB3{9LR>zXny--1~J0&r4_iBN2y zbC}YTijwAN;ypOL(a`e{ica!buHQCkM~Na9)~*$ML<1bl202SviDmelL%A()RB`-( z@#AFe|Eg8WKj>kAGw?r(#PE=CaCBYdYnP|ZyUoF zJ**gG?4H!9MX5NBp>x?v%8szf!ZAxM&QvPhI5FNaqh57XhPPl>3Q=GX7>-rHQCUG@ zpDQ|$_hS@DG`_RGxcTnlf7U}1xe6JEnKrSd2$4HsdNGxB!W)N%F#bw}$i$fTh7FYz zOTplML{#L9UT3MgttB~5X$40Psc_ha84sKN=sr!{28;kniW{y!?TW$_=3vt=#wjfp zlA#y3qC_wX`x%S1y+W>b9z08Fo7#@HVD+oVu-SqAyncnZv{Di6gr?mx4bCvNPb#gf z`ZZq1G3EY3B!}+evC7Rn{Tc)kulclcAMwW8;Wthv&ls!<&@!8|7j8tq2qV}ai8JSPe z86Zw8VLO=L>T~C?SNpQFQDQAT&_Z`wr$)5qOqA|XhLR_rMZ)XgJB-hz4_mlZaZ)(h zjfa);IfFX^ejPRk6T}0X?g|;4|9EMaA*USlSOx1AhQHFAx1hUkdz`S0ELMJ!N@t4x zWVG1|8Q7WW4`{rt(7;hH?E~DjO~rF7KT&oRDKum!fdCwq(O(%lZ@%QSNGx*gdrI5t z9gdvQL138qI&a2Wg&z{Ks#K)SoMA00ib3`Y^&L?NU`;_^NSl3IE;9vxa{PM-FmFn| z@n}n{ZOjTsI)`&XXa{Ma!e$n^U*w$ebZ{^07W*m~UR$LTEU6Ofk9-Xl0*Dc ziS694(38_j%$vLymZNI9h7xUL?eKDzUipf(_|obR;2LR>Q;M;{Ydlgz2CF^36#1pR zHY?r5*?%mM-+bFoD!riqIEv~68SG<0$+vs3SPH5o@W{Mjdc-^9oYLEYK$+SO3Wv<{ zS%Vy)+}h=e1Qa_AALP+FJ!}nHf$7mGGOC}+Ic_S%V0tbM9Ap$!Qk}1I%yXx$S4euW z_L)rBz9EYJN9#vwF46~IPeyG@R@WQ(PX6w=Be;g0D_53E`bEnLhW>SUsH>o74yn6;n3kDsLWCA8jKaSNz&6xq(tz?jheBlm3=NW2*oUw^LQ4{ zYyY$s0r^P>mJaM6nWRqx7Tfw-GRf!Bm_1*x^6?3a%&Da?|J~^=cx>_kzDeGZU0b++ z+ps58)BCbEJy<@@!hCximMm+F;@esKHhQETeqAshRd`cW#p`~Z} z?+9QOz+TIp0k6r6_4>EtI${Z`P19K<1|=Dl*G^yCS$=q{(pK zF^f{8Ed$Rh{Cp`c9+6VC^4SEu7sicE*F(G%ef*$y--Ax_VYJ|OL^#zg5D-sbf2N5; zOu@73Kk>yo=C@#r{G-if*w>R3^N|I|0;4o922s-I)p6p1ons}=zG{&%Y=G_^dYBId zcSMdplhu@>&%y^%b{AFch0m*Lm<;dvqPWQy{i{8>b(?ym6c*fc+KZz#=-FcPs`ZH{ zV9T&aKmawIBHb(FlvR^H|sg_`$Z0)o=SB_^CdTCeG^e{nrhA`u-+HxQ*h84SaG-{>N zzo0i5aL9y6i7f^Uw&rwYp+bZGWWot#ikfyXTLgYA;lmodZJ>>q(^IuT5$KWfRG+^? zaLQHO3DpbNGD~{tcf!FR)43ZC&u{_*y9S9{6gcPvLC$cCpHa(=Ob_eCY=CRUi4OFK zO$bi3k#5pn$Xoh`TB^fESi5l8)sH%2u%KsA(z)Y>{|jLx!fQ(P8wK8MnXQuBrxrO3 z_#T~O?^FU6xr^tkNqY2a5Pq=+1yUl@2a06SO9>q!;JKZ0%waxaVkd|&I=Nq zqc_lVMA{KxI|>bKkRM#pL9DHVGSc@k{g`GsH>&;o-PxUpqWvXS0Ht7*vRnj13=a6oHpbnYQP z7jiit<@JFXw%3!x{)mf9cIC zGg`1?!`Y1Q)sV2KYu&c;P7$*&&!4?csWA9*X?lZzXH|VBoM-H5cpM@khs5@iPWNh# zzI&ypZ={kF!C5mDTjEYJ$MwYqW(DG$U5*M!bmX^VuqJCp@CcZ4R!>6?drc0D)%Wod z0d^@XyylQ)4n0muaNGnZgd~&pLcUSpSwn-u>bExhUV??q!eQff?@ZDfLL5>a^u~rv z)q6n-9ThE?H`9C&1BF6$4m!kMFYa$3L;>DSZWUsT&;=Hz*c_&mqJIVnVGpzm@wA8< zHac_6@VNFJ+b6}F<2$sE?-1W9S_sjyNQf$6{YAZuI-u`L5jtU{uU4T;nf;C=-?IDe zDZeGTfl?B}sN))6NBlPGtf)i_A`ICCeU~q*vF3Yqr742$q3HX9?^fU1e7wwy@oTBfzk z* zX_PheCu^A36!w!fbWhWTTFcJD<_puhm1@@pUN(kav96T5?Mv%o9AyeSTN%2m>7E_Q zt{ut7QO>Y4m7zPER_#cxB3>C`7hR#?_`EG>XVZOY-6~Vo241m4c(C55?OIYCX&hw? zJ!cN9w>I!}29d2u2B}Dr#}VeWhW%t;DRn8=-tQ{5lxw@R8D$IgRtBCnh5cv?E3mID z?BYs`JXY9cgSH#py6OtOhz7=>7g)RoqdcMKyrGw@D+?_pJ1h+#?HLhvhKi1~ZVg76 z!>Wv-V>4D(Se$9e`y|L#8JcffS$Myvu-V}h^>B97yss@TJ+gy-ITzJYliK4`lav? za2+kZUe5-P3q-p8BWdS1L>2cX($0dv!KXm-4+(`*} zV{@O&9+p2YVO-A0{1Fr5@vjD_N$izf zdH7q3yUVj?OjqytuE$e78x~G2PHBh!T@D?4Fae%4U5g33fS{o>?! z>&sttj(AeKEA&T>$tUtP^mRD~YstyNh>ZV^{!{6Xj!SqfbJ*ig^^G5wHA)_jpZGHQ zYT0+$Zhr8@tineBrEdO`_QY`sL-Hr)Wdpz@c?gD4&8NrEtKhTvf54}G5;5}E*F*m^ zUL8Bs=GF6m#w#hYHm^FF_aAFMtL5F$p)yb7m5K7#-y=hbPs-iqqfAt_O?)Pg=dSZn zCaIcFuVMd_@hB5i&1e7qAlJK1r$_X?3+uFcE%~jXS4-3EN&lK2(dX{aAC{H<>^Q8P zYWWWi=wK)LN8cU#L&ijvkpmQSB4v&XYcTVwQ9_Y&s`%*a!p*_H};q^W=sgyYueMf9BYn-_!qMN04{~ zabVKj(pmn9vDukf2}AOHUwlqMt+)Blli#km8+sd8ZPRjm$jcw=b8yx6cVx+L;C1@H zjnjV>ip{NB@~&{}X+Uua2mGc|qT2iP!17JvTBhcGlH% z(=Y3P$BP|yHLw2vLtgB(t9iZk;{Rq`h^vZ$SMxeC`>w|!u*u0RsI`vXo=bc(?}lCY z=Lrg<>hZJ~)IxMZJi0r1DN=4fU;6HpcJ^e@9{BftT}rK>P%XdBwNRIl^nxjHz<-su z|CPV-=g|i{w2`@ED74nZ)=bCk&%Li?x4g@|9v*}J-Iz@Eeq?Cn%aX{PU<&O0x5uS~ zgle4)bIuI#Ebq}W@aexzo8rNQ%#m{PUQIvCG+^3u4TdfZ`0w^=e>Erm@g{F%mb^%+ z`DEJ$O$8svUFO4VYUce}$HHJ)Uw!V1zQ&ClF3)!LIEEVwB^S*{zq>*|GcRv+c4pql z+`N3X{f_Wt*`Y7{UC@^jn}0W!k&cKW@UYzl9u%8@NB=obHjUwK*p@PeAvwcxu>=dq zh^yyhl=&mcw4z7L8PELfIg#_gKjJak_-rA@f+L~7&4b30P(7e=`D4f9M9F_VIpU?d zMjFrGw=tQQJg7h5GsZL|YJAX8?_C&^y!JV*t;ugQ^M99f=Gv!_AJ}uZc=GuNY%g-o}w1PMcY=w}N{9I`Fk?HG`i{epUru+;HCiD@~xS*n;82LDr( zXiDpGFiMw<$9+R)`<_bge1*}$IM0X6{^i57Z}>3%ZLW9vP`8Zhm;12fLm%#3#rM}T zZeZN(!>lbnJiCqSD;RhBaM^Ayf9AtB2N)0eu;j20&wlB{^y5BU_Kgp9-*WvqAC^@4 zFzW{{U-IGEpM98q)rW0vF#hVptlK_ZCTXBKA(rWUcs9s~Is;><57WbanAO0CI~(); zWoHc_vws?urVXOgF)pcj7=GvF-9^rXKcZE52J~(C1Web){Jc!?`6D?u`Od1 zBgsIYc8oEMv5awy@r((KX2$l69T+<@CNg$nOk(WJn9SIPu`6RYMhoNpj1MqA$Y^Cu zVN7MjV{Umobr{na(;2%n_F#O7u_xohjE^ur%GitXF~)x|KF*lI_ypsVj88H4W_+5l z592e8eHr^P_GcWxIFNA=<6y=ij5fwh#-WVE7_%6&fn+Psa(Or-?VZRDMlwFfIEryJ zV-DjO#$3ic#^)KwGLB=+XB^M?0^+7qlNcv6PGOwNIF0c|Mmu96V-aI9V+rGQ z#u-4;!%W6mj4v_HW_+1(4&y6~uQI;I=m3)b<}&`1aUSD*#s!T3Vtk!(A>$j2Z!*5c zxQOv>#&;OsWppwwW?aI!lyMp3dyMZhE@xc9_yOaGjQ?g_$+(JfHLxWxR!Ap z<9Zga1yBYT| ze#*EPNOFJ1xQ}r^kmw)a@RPms~!^<*&H>HREx{ z6O1PrzhOKDBsv~0pJx0PNc_$)o@G48c%JbBV-@3fjNdc4e6~8A` z#^#JI81G>;F}7rE#n_s$4dcCx_c69*jAD#tY{wYG7|R&P7|)o%Xl88B*nzPlVG{$ts?uMP;?bOJH%~C)6*am16k~73ry22BT)zJdBVJ{Z%l#PpGY(+H<2m{MAjZLrLl|w0 znT$h$v>t{rW^sKs5wDxb?Z+|ZGmd9` zfpG$30pmo*NsN;jr!Y=soW}Sfqn)vkv52vlv4n9t;|#``jI$VDVw}zRGUFV^R~TOf zlD~KjNP2cK&Sm^3ko?U&F3;!k0xtiH%dc~JA(!9a@|#?Ki_43+{5G&9=)S}C?{dA9 z%Zs_Zgv(30yo}55aru4V(6gqcnTzq>Xjgo%Yf4Mo<1L(1BBT;su+f@o7m`M28kV&) z*AO*PdCCmmPI{cQmttt@nvHMAjaisdY=yq(hG$1J_ao zh@i8pP@qp8>x{ZhI@D{^(_x)KRQ5PpwoWP16&9g3_2nd~nop?0XOCkp-mlkzA-&RC zq^m=nO(`W_>x?FF?9)6ofS z(>~cVE4EdDslGfgjV{?p1C#bZ$R0C-!+m^wN`N+I)D7>^BfovDJRnHW(jHvLHz0Ic zmqjwA+9h8nmNKP>(~+5#Ubnk;k5Bd{9Z2?;Rt#L%t*Nz#+-{E}<-Xu174HQ423n^> z7Ic!fVS|(<4-}e_+U%KYN{?zdbpESdR@jB0ABld8V_IR`mlB|p-(9XNzxwZKfh8Z> z&LjkWZ1Rsl=!_VbAz{Mtqm>(11qs)}VtugOCqjrQ(0ovcPa=C;<(KzeG7oWE66W(x zjRx=i%RApt+%$uzKU45=f{}_`Pjs)qr+rXEBi_Xp0-c;F(_&OfhjLv=F_=Az+7E0z!MvtXcx@fpDMJ63__&$(^VKgmAI71q>3Re{BJwt+Ltz zLR$q*YH9ER2-vZffOarlQM;jAzyNDggr3Ei+N?1l!ctpCkh7By^B;^8PZGUE7CNTB|<+Us%fq9P#zu;Qpu^FTxSE&*cLsZDzhVkTvzR9*rJKz=m>or|3Ys5->;e+N!2aDiE4KMz)F@{suu9W!4|M zzHF&6m3of1Yz0RP*=!AaKA0|abw@myuESJ9_|l@#*}-;uansrIpFu%;ee4f~7Y>k8 zw2lVhR_Gnmy4wC`tD?=CqR_JFR#>1kt%EBb>aNQV(1o7pogONa3Uw82n;rbUKKOx! zD`yFpJgu_=jy4QG*3g*Y85Ay+zy~x;HW{9cZB-Uy^4fOeC>3)UlV@wxw|~0p8LP*> zy!%;rT$_^j+XZELR`7-aAn^b3r z=Iw^b8HTR?THT0=FvYIOen~vnua&*aO1m`Bdc2+#e5;{%Q#xt$Y|;I%2isjcE-l$3 zLEx1xX^`Ww`YD-GMe()nbJH+37{pew`#z1)9BW_q5}Cdy;GNFlk&TS`D>55&0aNIx z(oj0Fl`Yno9BaQoZ6dq@Z`>a)Qf9X3F&E2{h-^1~-Bx2NFdc8J2__}lMC8EV(uF2J zV90~v)Zn!9HX3-HciOU+t&s!kb+7De^;EQdLMLDkeO#_&=T8p`-S_$%zlM?B@2PnE zj%4!o@m_e5#K;J3b2}_A)>sfzdE-G6!yGj2PLL?n{_D=nG@lq3OfyW9DbF<1^gPB( zVl>aF--g6Ep{qlt^POw8sc^SO+M?NBq$7olw`V#;cA>q+X$3;HsoPTxksWeulvZbLdR*IH)k ztj^Wq^Oh2fNwlz8+T``aD8v;9jlvj~e@{J6tkD_cm?l$j1U=E9PJW}{@`hPY5QWfv z+ML-si$PbVKO0Rl1Xfi%(_Le-K9l#%Tu?A)gn47?xrz=J-Se_8`sH-tZUtk(@p*G0 z_O_BTSpg0LdB8H0uA(NnszBiG-{r*?9 zxFl`vr+Y6z8)Y6I-f?uea30#KPl&L;St84{9^^>24M6p}I{(JjIp8@3H>uGh#X0w( zIF;Ly6w11a7S}352I$@gkMX0!kAsKD{>Zj~M-7i{XiPjl2L34zYUIa*+TzELN4oo$ z0lGEd5uP7DAwOK0?;W01!(%%d6Au^gPkB%yKOWQ;KYl!VxLXX;Z2*t0`QaVMhl|Q? zAN*XyqXLbIha32(JgAW$4{D1aKOQ~Zj}6jo1dqw%!>@yfsktMQcxYwXJJ6VT>}1>p zRIgn>;&f9I_qtzs1S@3*_mYI)N+NQqwTmLhB>LuC$L)Myu}6QzJ#CO~6J$$#A^f)& zU@P}UW+zA3zt%@4*9o5xexgxbZ=bGSJ7B1@OCH1xkC5o$H8`w^!UfYCb$kHHVdo=8%uR>HS%8RF6vK}NyRQ+ouG*@ z#aI3CvWWUsCe^>_#UVO##z5QY#!~(bnN(TH1KWdbt}^H62^!BYFH@{2sAGIF+~s;+ z`ecaC`*ULnepJ*?y3@)fo!4C2KI^OP!Pe_|R*HP-zR~7h$Vv8@dvQ*(r{wL|>e!uy zAG}t_gg6Dk-pCl#d-`tfhwHzMBT^sFDL35ElVu{rN^jekgJvI7cE zLh?dwQpjdXE#yO5;#T^I8kS+94OLSkUaMK-|uNH3eOika5CZ&jV- z^Wk=DKWY9%Bq1*Q;|pJWP3Yb$kYf){5ChSg3+aRB8 zZnxzJoz?4E{=-?L9GvZakG0AT6h)!u_q;{MOA@YiKKxBxp=-Y9pPh?25y;AXx4el! z?7D9+&Rcq78zLw+FGml;4;WVf)%M!p(QB{6Jm2TWlK7@+)48Zv&b=ft^PzjLpkf6o zsQd5i6;<*@afdF7J!G>>Lo3;q<^1aHwg<(*fMTR6rpcG<=DlmtO7VL&c5O1HdSlkV z`kT(YLmckovG!YGnHcDdk6003g)jC4^M;G^UHZtLhA-bgD2@hbUJp2hFUSt<{mXuy z8dw%@EQq~K|X84qV@Jn$cGIb>1`iK67FX_z<7|c5?KFUY$ceiBnm>B^?`Wn zQ9+F)(f;LOnW)&nR3uTp;mv8N*oX=uCyDIN>s~>{CR7kTNj$r^sw*n!0UHT`i^hS& z3mN@$9J04=`1Hbuu4r*~NyEvV>=;wi^mB>E=et1Xhd`3X^f}`f zjE5PIFdk+65?CKwVLLIvr5X}-l0?x`%|{UUBitpbsv!{>m0F0tB)*;}TBFMrbRmIM zY9WavvE6oX2U=`J3lc&8*EVSTMHlI#wjSgg_(l4lOVP<7Us3)&2EU_)cWB$mom`}& z$9_ySR&>K;-*+S7`^DlwVTn&S$H0(u^c7GYQ@eb7u?eKw#y9<@iu#b8HTmF;R{xmX zNlb)&4IkO5bVz^L*CUe-RMo4J{S?vvn)w`OJOT8#e~lP-DcS;l+tHYAF8$izLea&2 zC2@UFi`P(5feIpm%isRx3a(SW6Gq_^EpD|MJh_t<@-@AGR43b)kk9_w^ny3Z{&{_# z1WA(f8^%+>Kb4Pe`pHLqRq_!LT>rg%>BGjrmLcCGqepczpMiYhp`h#X`UEMG%LA;B zYHTCqOA;-fl=?y+JNYJnxYCFCMvES;r(y1i=E2-f*6RbXK4R7nu!olQG~+(eJk7Mf zWjw=p7B~+FZ;D-^Xlz7l{S$Peo052B>*mX-*o_M6C5eEsYY(Dg4=RY9B*x4bycrcZ zAe8x#ObB3&~{M1_#ZK5JKL0o#2PTf@lB0j1CkpQ@8Op33fva(Kp@2h$*eH-?N zG0pBVzLPV15XNMwXjMqQD&6O+z6VJf(+`Xn8GmHF1pL!6Q6trusJCiN)Lk_u;-eZ9 z34rUrA5-7ft6{SklYaO3POe=TlhttH&i6SqCf`_o0!g*a{?u>yGtlw@Fru5d=r?_c zZ?x#&dOK{E^fU9&lABW@S`0pO5VkoL@?F@UnDJ>x%wy{x zhWY!ED=gP9j8}nwDjzk%mbpeg>YbU@wK=3a42IMh7s>T!^2rVOSG0KcOxV;;R+8_h zgNYfBCSuKd>(3!Sg1k8?ulZwIkA13i;ZS1Fr-y{t2V6ZOXIVK5pDhb4OE8wj9m5x4 zBK^|m8rTzFXS@Mak7Y^LyW|&+abt~WK5^|msQ8L|J^ibLjy1kUkvij2#v&KEtbF&^ zeY6-e?7`1Ei5HPmt^Tx=dB<3cW%h*U=gDKSbv{-)Q0ub3nE4O1N!>V5D;#;UtT$QK z|1kc_c#H8j#@oPo@j{Gd=8|wO&uj=;PojbvX~fa&pU6zUK?PCy^(!n2HH2yAsbOUvd;4^^l zMT>%^@kct@p_|#~4|THtnvZqzjn{p6lGsv#ljpEgkAEo!1!(U~-}LmC;@E)kA$0oX z2rAe#N)&0O1DYxLf+IAir7C=|wn1cYgGN2;4c5|T>b!LOa#NSb>RK=ETy84t$P#=u za0l{}El|)`=Ly|1+D^wHt8kARJ+m`x4T|4!Th#dF2?x?PKAPyNs4%`+{%E4@S2%R* zzs$>4)UWD^2PHCn3G|5%J7P?k zopLGq?ScyAziA1XiPl}n1udD0wj9W9|7vHKw7_liu8Lh1 zL8B5q6-`49qnNbvkUeBnqH{-63?+0_;+~dGRvyCt#x9?~HwAMV1HIBu7ztF5CCagg zTzddiNjD|&WYc6?D1oS;-jdkRryY5Oyl8#cqtH zVNPP{fMys=(5ulO(^&w^)0~n1)Ie>Ee({tV{qu=-Hy}hE2tjQDe!etg=YzS4R`AjH z0-gpR>%IGK+3Q!;wL}D%WSMM2Si6gYNLRy$w4y~2*{HD7FZoK#c|Or`q~j;`tv6bl z-OogZc+u?LT~OncMh_L=qiH=J-v>RPC}>RqcI~c1R&>FGv|Wcxb7Y#L4cQ;* z7|-}*Z2h}2{nqQgW*9_WNKZE})Sr=sVhD=VM?I!K%X*AUa$!tOZ#|#n*uMz6`}z5l zMfI!jK&kQEVN*k_V@-r2bg74=a;d?m5A&6AWcG(ZIj3NyU;6D7-VigMKe^;ShZr? zwSSNdk*FXgy}clQAd1aVB%L%5OznVT3lvEOl6YYG28y=#pn`O1f-We}seLIvKw0;6 zpVp4D@2lOO%1Vr-?}O+UE;`qsi{im*`J3+-9UD~QL++F= zT^YME;s{x;zn}2|;JkD^-yxxJX@n?89-FB#;;r$d)LN*qIB8@)m_&pm@j75? zX9J^!yCkT4k_&U9Z`eJ_JZdi1_wtd3qh(@tQF@S88nhn*%}Q@ zWox7%KU*V(z#&bjdmUEL2~v{ee*TFRqB1=ivC8yl$STt#9jQ!@CPO3M&Y2$y9!cOq zTJdvPG#M&OByFoKk)~0Y@Trf_-L}JRpjrDmz!j%}UVJ1--4Y*KTG65^ed9w(R@mX* zj~_}B6aEQ1%&+SIeOKx8VqKVQ2g4vR*+Uj%HsiC5!x={~j%0j}aTMcd#vH~mjJb?? zjL$QUWgN$t&p4j(1;z=C1&k9JCoxWDoWeMjaT;(Q0v#RS(}nlIYJwXHt1@63mCArg zJe2{{xFlhCqhS$DBN;@Ak>qcnq$yRzB-QxYD~(WPk2G{i95-B{Cu?0mlE$R*w>MI{ zpEZ(hROUxYmi&V_&6*^JF77lOB)ftnsZk@oYj}(vZFNHh=_R_|EZSIGP$adg)+No8 zYF*MqOCsmzLH*I?esm#COa4KDOh_X-yfXC&T0DRjG)H5XK70qo2T`OcRIN<10ZD9} zzJ!8;6)k8IRV$OMMzu1@JXH&g?9_^RrDqVd&ir#Z6yO2nr-m-{f%z2W?QCUBu&J>65T4^Y3w?;bsV z#d}t|lMg4^vCe0oe>llAavtqfo_+d<%hLDLb@k=-{UY>5>)g&*$XLW!%vi!WopA=^ zOvYJ^FEP$$e3@|$<137>GQP&>V4TbNPsVwS^BET~{)_Q-#)XV;Fuuw77ULquw;A7I ze3#M5xR`MXaNY?aC>GGA@)I;zm7gH3sQd&CPvs{_FDgGlf=Xh}%&W8lQ!!h_S>x|G zNcFEJ&7$+$G~6diRepq2@8?HIgDO8ls#WVcg1C&bW>7W5(@_F2)K*H{%Y*os7E} zKVjSroQKCil)})Z@>euymA@kGsQeWTQ{}HnKPrDk0;~KLNucsqGzEVCiX>L~E1Cj7 ze?^*9`72Vf%3qQ0RQ`%4*Uw+k9H{&iO{U6Uk#_w26)D-zUy+Vg{)&uA<*#UVRsM?9 zuku$ke}4XoreEc+$evXGiVRZaugD@){)$Xp<*&$={QMP}n#y01t*ZPL8Jo&qkrin~ zw+qrfxSvO{Jjq=AHrr(VD)&XpOy$04z4^H>7mC7)4_>$W|DFHpN`vR?QGAaUy?0%G zB1!D85Rcq>BFS}V0nYJ8ct(FWLi3+b^bxj(=0RTxbH+IP7r5~tzT-%meAyoKCHxeq zK4YKoWk?ui>K~XXx*3i$p@jk-z6N8fM;H^J9C`o+!I`(n_WuYJA zy(Wq)M1LFc5Ko( zFF3zXY$mF@*hyePr~UF3@$@9Wz|-ObYneAIn=r)HJ8 z`vc7bF&VDB{ee_DeM_fiv~3e+ud9(A|HPQRvG9x^pHwjDZR}fcWlYO#vA3|r*}~?Z zFK+&MVGEcjrW}90W6Ssc2o*;(cggKg@4Mzi9{tK0IQeN^fVFbfNzKo1hFHs=)plEh z*}aG_C%=w6wfZZM-1a5>w&HUFowZ?J*{2oJWP2Klhh`p2Iw@R-q`D<0zsWY)(zb>4 z>7Y9k7+mo3kt<2ItK}iq2Xdk8o8=(|kM6sY6l}+z0Cg4ix>u8|kq7i9@y$O|wuQ7h zpocyWNg}Doz}PDA#AUzX{3Z~8#N#ZQ)XWq*JisV&Prvw0VEFI=VVZ?D&05Dd%J(%* z?wOHW9NyT_)mQ8pzhZNR)ez8JE|%UY57~$NPc#k#7x{9{Sg*NxA;)xkVzWw+9M)E6 zzjh@lBCfrz&AXeWX5Z(SpVT;lt!R6)_SmZ$ie59XVeI0I+GEcfxh>?EE4PQ#4W9I9 zo2yC2hqr}Xd=g_XeRNyMBtzq?7<(TPc}#Dzf1^RuR>v@A^9!lsY`&?Zf=bF-^= zZgDUItT7q+XKB!j-{%+)<>QZ8e{NJ)wgMdKKlkBg$>ZuHq+c3MhMeCHl?M1s&gp)9 zTS$*b>lO|EKF9O)mnt7LhLvOTL#Vnnm@3%hK zOjL{_#YijTV~y)OYKEmvuEUCteAz2dIqN@f9{o+|J`ND}both)+B&+?P&_`fL1);< z?{#!?TgcFQ*;9jpr@dT$HOZ8_EhKLsbmV$|TgbFW*FZ<2pNRY#Iy$A92pxS59eG@M zTc<_&>dh&-Ba)c($pEucmc}Yplz$WGI#x%@8!r!CdhLfC&z8x5JoFnh^dB(vEq+7C zchL18x<}*uo|^rB=%_56bZW*;q4UT?m*dB2jGbN`@l6lKhi0CSFCt*j=74VEBJ%X1 z*s~+_BG43ksr5in_RVpz`g)T6hixHlZ2@k|p48Y_yn@Oj6+&YQ9z8Kv`#PFcFEQs2 zLnef5lN!_7r1`Dz9*oG(*|1*EZpKjv%Gyb}9y@ufWeozrr)C;j=G?sR)> z`WI5;Iv{EV?XzG(cn+uy`$g8VtVVNVF=%E7*r4^x+UwLf`Qwnvjt3@(829|Uyy}fy z?WFU^?b~j`(_h1v^1Uz5zlo(cQBAxHP z1l96o54fONeI>{C!<1$#x}6GyW3u>eM0wxNEiP=N#~UQLtaRUUDsX9hn*yJ25_bLI zpuQK5TlayzXHl-!jPFNpCPj=`?4mcL;00g1lHYcsSR`APW!Y-M_i;*cI8s8GX7t zkCs+6y#Q3{FuAeFo|!>9{HnGNy;nXCIr{m`@4}4xekiw<b zz%b=k=_SfOU#gu@0wR&oP~v+H7HgN{1uL{d6ek{zO@a3#)bbY|u4u zT?6)gx8`a;#`kT%$~wGADiHR;*K_RWr;-l$RO`@MegbrbIE>%yb3yM1>FCsE>5F_i z)Y4uDmt?;%Ro0>PeUOC?V^3}_eD}J)4y#y)-__QkwXqmIb1-y>x8G~U%F3MWA;08} z|13}Fet9He)79hloZpg6!?q(^o%36gbF}%5qpP`1IN-y!upz-*7pLXjX8wJ9YcGZNpBZ z=klq**xQ>cde*THmG$}~>-7@jPqp=%(O8V1`6jLRleKNtnp+w2^&5-E_ZBm*ja_qn zNx#aF5smV-$$>CzPegt(RX+JlWr)U>Bq*2hY|Cqw@4v22f9d@Fx-xy^Y$iev1Q_j; zPbXFdh95v`m*?ze7hfCROX)nz3ClaZ;^iPz%a^NYT;V$@ogKp~LwYsMr-aYvS4D%w zkS&z(`HbC;`}=VJiN^Kzh5CA01J-N16_4@k2EUbcw@CNk`vGUOx*IZVm~&j#*HSuL zM^%Od4(yo~LlvZU)8H{7TT+C04%D%fM*GCDKe8sJGkJl05SmmxhH}LSE1G**uRk+h zuC3p`jl~Ny%b;KT@APZ`u`*=u?dyXIMBt6t2{+e$Ss8M%Q@%Db6#C6e&eu}q&?C^V zvy+$!{aQb^cFQlGCFhD3_^lr^k1lSOUdFy(@mtQX7yI;Uol=Xq}2E6`~xeE$VV`Nvf*U*qz1 zp!%J`eb26Fg?uar6H1*W5tp)tUVa~g3TiEh3-uPz1G`*Q5INc3aK?;M%|-c}^6ab~ zzT@u)r{^E<=sH#i*@Ah*W&gJErIwM^ z`!w-_n&pB`~?kyEq8Uni5Er*)RW$k(<39WfN-p z*W;aMo%_PK2~D1Mx`mt00-En>36j_$&T1^C1>K%=P}on^J`Py;;};?4H=a8(Q3T)q zKH<)P5+YwYC>}b~vGNEF?wKe*eQYH zcBoCR#H9JI8ISEAF20@G?=7v_-gnkZ3lnw^_k8wqlVka4Z2RKpCR7;_jW%>B@PP0s z8k?Z=0pfJw@-rQUwScxh{)YlLx;;>QqsP^`+F9YP*VgOUe(S3TU8^DBPmt8U{Y=M* z_Vr@g*FWexpCq9*e{{gy%K`T7>*k7b+J?Cp<)VcnRVS-7e!R{{pYWW!ac}VR^ES>g!;MPmU z9b<$v`{vZ|1E;;aMfw3P#Y%jcU4fcs@kRba?7_X)kJs9*LsB{q=uH29hAm-A@K(uc zU+bD(ianA(vaE57MJL6~AkEBxBz&Q_MQN?ofqDq_K=ql~GSTOLte}aYPmKcdF47y( zlTf6#09oC>{g3M3cKPCbeRGStreI;;bhG5}&2&@v6lyJB8Bc87^x6RWw_WTBFYIqS z!V-~ZS(x;$cz=Ie*DU4Vn=!CV^iO^LsZ7+!PbO;n7c%8vsBe*Fa(#0%{kNOx=DAa= zWpe#ExOb5J@6D7ZlpSd6v_!11IJ>tMSLROMeS`YrUzAi0)udw zsBg8es*6g`0|V9%2{IMHKmuFLDV{Cb)vGyquo}gE@3+09Dc^W0Fn86~iUB{2F}HJJ z$R>kHdu#Khz)`EWN=6CcyJc{ZDT;{W=53ABYyGmUnJ`=IvMiMJ$X7%z+E3j(DpHc> ztWCNUxbl^)(xfvm_9}dtbFz8i(rRN4s zDDMB|N$1h=og*50K*bT@koFFqP<-smlVX-VNZ5_K6k~&Q{LTPv&j@j!CZZSzgHAqyunX&2co)bqSMp9Yy+~c*kf3ULVEE;t%8Y03bk7q-P4UnCc`BmI zf<1VzRhQDm*G4DVhvFNUw9vjnqn&pwATs_TDZ#8)#AJS! zPKfD5#H;w10=>>io6bHL<6O++EE37>@4wmDb7y?#8!w&=xjke;@e>lIgZ)GkPs0hF zkL^AgVh=9BoTfnYU`LvdXd;#c8TTQ<{jRp=Z=n4z^M8Cg*f_S=?tJqEZF4khG!E{% z@4l0!-TA!&@V$bx8Bvg@x5AppcIThF6u9=IKd{|4T9?=PAx8Fl+uiul){5Ls(Pe?w z(qZ4exwWwD{1~x@bWnbNOzE%K!Lp*aM`Di(#gXkJI z_FdSyJq5!PHLC-aDb40>X>PE)hTR`X@$T5da9aA4g04)BU+7D0844&9|#na9H)ye8zd(W`nPK5M*aDq1C zF#MA(V}kacU)z@*JSi^H6vD=oZ*R*5R-e(--tdk?rKk~e;MHWiQ( z!6;H=1!Iefg3=Z&*a;f2Yq+zWl~YtygbiRrPr0*kHUfG|QQ*{5Y`9=K?6IRFL`B6O z6&0nu&ulg%=J)%(|Nr}W_cNKganP+C6d1iKY=AD2UQA6FIH&v^0FEy|G61MJ3 zx!P*_X&eVBVH!p+{IQD!8*48v+g(|L@40qA6%9hpAaz7dQU^8XuH8aJ>{ya`=lLV$ zKTEwm`IvDGv&d;^r<<}Y6l@xMAr51Mwch2$Bgvu_n_MK#@pHc_=b_y zsf2EstSAs{1Xa+KiIuugdb?K;VR6k`*vJz$4zO+HA@IC*h1XcgL{|xyvuz(V#Br|nU$NZq<~gJtK2wS6I2>eDoJYaAXI+Yf9?X^s97{$1w) zHt-)8x8XYL-MDve<57iBGPu{xItMTn5KMP9a7Zs49;XX(3*J273*yRpp*ePQzI%YJ zWc-@SZdIqowZp#p9~YA8(`R3pKKJ?becwH>sq;X}OYs@3=i=`kI6AWSlkp{pl8DxB zC0^}XlDO=}BX#*wZy#d=pr)fTH~M=hwwa`i4Pf(&N604Z&q-V|rkBs2*MaG;1ADxM zHgKz9lXqgT{04n9_z8EZ#pYeAMBk-S+X;F(`5q#fsqoy>jl6+Dx6TVCYkJ|#?+i{w zk)Zz=gf{3uFvo>?A@7A^>`v8tfNjQ$K`)`wm$!A{MPIHu9%w??OhQyLw>HY*+O^Tu;uY8xvk<+V5UpG*6PQ9k74~?yddl;&0 zzDOrdkZfXxDyy1?D(cFaTy(A>6bvwrLLy5fsts&j3mFDcB4I>~b~>tYV*;3I6%aCP zf~(*YVNu15VxHnXn_(1V-870JFWwNKHT7v=0FOsV?7MPz2EG@(xPG$e+oyR^Ry0%h zX=v?Nk*kuz6!(Q6n&*uF=8wWUo8G zaV#xoVrhBJTw2Pow4BTng8@uNTE;Y2fPp82v@B_j&Iy?SX3`RZmF!&oc_HHX>80gP z%czb&NJ}M_mZvPFU;q%LCA_<9n+XP&=hxDs%gf+lC67Vf0I0&JS`YvPghE#8(-b8p2Vp8vyM zyLn{{kcQr1oXE-?g&%FXnDR|x`xVCbLbibjlfjP)^yFh?Xmmea%2&E zcSfC+6ijq8DI$-li)XA@m8)iICa5p|Yym;^7y1u2AJh5}46?$$iEs2Nfw#ojN$J3%& z8GU9|T1&y?+W_Ams_n5)uC-L(&6_Utpl2X2_i7gf*ff)bk!9}I;;71tUs|Dr+e5G3 z9%*woh<`Weys$qX#mW?e58fXB_BM_P$|Y?}V&&2{kXtwPy`aql7?}%j!zg7C5h@CA z_DOE56xn{1*+xt39>b=)I@`BM@KS60iL`qrvaQrIT*moJvOzDntyfur?TDk3EC!;& zGEO_Ec0RRtnZAy8EDB`KH% zD-Q_k;vlyRD%;97E@dj0@^n{P;#wBzR+a8jta2%10^$bzH=&EwT$h85m?m!25rU5` z;eJ?uxq#p(5^u;=H{{K4LH+4rBUapk@OVrr^5EK$#7MI-Db+$hCUta1w}m@wpuL$j zr#XET#eKTf2BIXz=-yZ+ui@@QQ6Q5gtRf9ExzmMaNM3x}d2>W+PBKDwEC_`3_|M!RNDZ+Y|}=5|!-{MS3zd5Bfo* zSljkr4U2Nft zj`}PgH+PcaGZHNraqpa;0?b5z1)}ft?{F{L2BL64>R@K>#?16HXXbc4GqrP2lzU0Q ze=<{2EC2na@76nniT@<6+PU?#~jbEge@mv{--^3I%@L}EtU9s3Hq)7sf* z1oIZSOToxIq4FhWJi$IvceW?!Yw=~OHpsJTh}pNwiGt86sEjno%?C&qkeZbVHWp{5 zW5T%3(vMfNzw|?iCk{HFROMt+Ihi#FGhyO8IT`!>39*VHhD=9}pdg2durc_&c<T`fgmo~{ za#W-nt#z#=tS3gcoY}_Zd8C;Xw$^CH5c1|@@pP39jod09yIx3#U~aV1P20xhU6Jd} zBG+pW0DRPLWo=yE;8zr`#X&Bm=`Ljwpc9YN2i;$ixcv)Dm^xy!o-(lUPe_hp`LRpOq6#67`(?BSsHeWi>K#KMxn!5pRZLABF&Dq8~MfigbO@CA)%tQm~bbpT20|R#38GXvrt< zPF6^nx96w4J)A?pe2K3V0yD9#{d8Oj6GaL3Je2A_e6a#-n(@OGjk&CAUAOqYUDCW2 zDlUI#Q}J=cjF5pdLe9rQF}+!$c=NVg*R?{qSb^h0gEx7xM3y0+z*1c%*yb&~zz;OP zg!aBjRe0k=rshMY_9OHm-8Lo{-q&T4I9XVnX)=~SPAKDa&%(gQbMp19W?t90*_KxrWBJ2aig^EjvKCbJH=ZP4Asha0WXUGom- z@%KGHy~@tH#uaVe`Ep}2nAZ@jpdoYf&W9Tfs;0>j4|oCfPT1fs2HUKzC5nf1cwf8Y z1y?CMzNvp-*Y;vC5$(lDIdD`D?Bmd0j3YvgE8yY@(=}(WqhA_M7F}wbr(d0m`rzUK zffaS9*l#n}F)7h+J=e9QzfS?T@2UR2R8YTyvwoWXeUrF-3z}rc60WvhlDn6q{SVfk zs(UYJTvm9T;C1>pZ*OtlUe3|I&>s$ycJhGmSoqO2*N+i`Koq<_5ukci(hxpuQ)VVG zL_d#u{PNz{xrBwncJ&bc>LCNyL$GtH3dOaRLssG_!0sieY1mR}Lw)BuZL$K}Oj(M& zws*n3j^FoiLt~DTy+h9L9m3xSnNV(5l>P}_I23_n3?;-a@CZyfDhSkgXMt_r_WF&K zejmJlVE`g7|Lv2N?~_&KlZB`ao2)K>^UlIi%;wPw2|6Av9EEMOwl{p2qT$=(&?zWk z>)C~)iWZLQu?W`mkM`KImAh~h+gA|2&{yzOK6Tcjty<^xo;BT0~v8@mG|rC=*@KG|LfZZ51% zm`|ox|7>QOp`1))Bwc}&{-r->fo)z+%5l=?<1fAKgo-Xd zo|>hdnng{6JdNFY>GJ)bvzQrnnGTuANDZNhmt7tOwmDJq!-{z;{u$Q;aZ-%S?{5~K?0 z0yAf2fo;x-Hk}HIit+{isQ;CVWmkTmos}{>OEVXk@o4K%?2|Rizz<1Fie1nja^AZp z?1MocB-~!9+%6TlzG(wVLi-lEqB`ODZep;_L}I&15b^EFqn`5eOAZrD1^AgAAe;1Kbi=z5W5$@67rpRoL(^ywkd#D8RV&ye7;#O^66{3x=0N7}yE z*eX+O-@#y5Zu^+D1vMTn8cY?+56oYb1-5ymU%?Oldh!51kIJ1S zoij;_BoN!$FG?tZK>*fqAB>Alyw|dVedRL;{)LOuX0Kf8DU?|VmpTgjrL2yM5-x~Y zy%;4%N3C9}UcJCVxFAa34ndX<7SfGD*M{-wMsr!3I`@N(V)NZGgvBh|JHz;QhMm6$ zEQvj>m^JcR6HCr8EI9?AZ*?myN?SKyPr&D9A0fN6txjZHP1#N*tYDvU zH9I0}mWwqJ5Z#+?Q9{!A?N%s(XC{7s{rJSW@>%I2CrN49)j#)TrS8kpWkT6++@5^( zk;|m*$v76YZ<7vB=8E{1o4mzfo0Ts2>xh-z9;WPv1wegIc#FZ5K`?s7=%T)dy~PlP z#KMAI<1f;2(B?BWf@j?e^%eQw?jWk5Gb>2+$CVd2x1UQ(9@p;U&=LYTXsZ35dR!y; zH26USVcmECLf??aeZh_UGB)hzpjRcI%Hr!~;uCkD;g+v7Z!RbPx;$hOT^p!~fVb zkgrgcf9bm{u+8gRmsn|sxMM$Yc>W$|_P0H=zqlCa1y6rr;r^da!aZm_zQ)d1Aw>Oy zSB3IXe~ww_oBwpQWl{dQ(S$|phTlS0{uX+E0|a|hqlg`e!~fXx9FLInEhzMcu2+E3Krr+ul>Y|8v#+3J%}5xe(#?=4?Wyy*7a;xc)&7j!4qEIp zm;=<>eqpQX5nJkB;#Hvco;kgL?|b$`Zp;97RPG;+qL{rcjD z(|lYfdsQGCOU?%VVz`05{pr`Gf!_sDgGKpWQkCBY(EqA!DTV-CLZyT*MgEHdY;(C@ z?Gzp>-(Nc(J{21z26K9l7-?oJ!XPk6bX6V#iM|FTdj5%*&ZnXPnEkfRD0#6&@4J7# z?7>S`g58F;G!%=3;h+DT1jBQADYhSh-2kiE@XGnzUk2EY?S6ozhvYO3Pv#ZxP&t#@|) zB_t&$4;{Xx`1_XP_j^zamW~h~>g?NU1f#;=HVztPzNm|R;SMR-N(M?V;NW(Z^?s`% z$NV0`GPC_wR{N9T5tT$`*UZai^g^b8#j_KRBfi*-+PtD^=>l#Xh6}Ud0YOL8j}>5> z*V^%$S0tv~8!^U>qTfvI8xDr-7Y<+Ck3Rn<$_H*>EeO*XvCgo$Tdkn;6;@{;4;m&) znS^NI$Xiq}n2yN?+nn{?uM`GdKQ?c`>&ps%y4m&fAXRw;IDoQNM;i-|!Bi zu)^8o3s(9ak_@SNk`1t-QN|En;ej9H8Ix;(a*AP?|Ss@Nj9r8 zt4;V-PUwEmzZ?#>Iln3whCg^v_KQDCI(gQ&bfOr{w}~(fb3OdH@2SI=!woZGCKC#$ zx$5?+v>cAQy}2%s`6|22@BO8D$a?AiCCi0-ayWZ(GO}}^XE-6nKC9Dm47z~HTe(;v zOwUD(;s56(o#=jekI2HicaTMm?W8gMNn-|11+EQP9A0A^G3LJ%C@7Gdc$a_|o6HNe z=w!}M`?}4};mE3YRn)td=30Sy4;tFE-eN!V zNeAfUXuo6gqwc*mk?*)BVwr`9EeFdBgRUHF8n)oSpxQDvp7Rq0pk=n|Q&O;%jAv6T z9dz~Be9<3=X2VC*>)l@7|Cn9+Fn&TM^y=ZE4Pyp2j5*IA$43)W!iQe3J{KPz70*aVtx!)I4PvPVDTinzIbfT& zhA$=3ncqG}xuA0|(cZ@3?<$9*?;F$F_;rm#YjCYVx0foUPB@tLoCocOkYz!E#b5&>Tjk#t91mba&i!8R*L?z?e+b$L9#6`!I` zmu@w0Gea3d?dy8kD0jOdUC$}p6}XQ98x#={kQV>s>M0f;+%pN zkco%Ktlod#{l4C9>@h7-+DdoRse9s&IU?7;Lk0 zYIpsSH#zW7fCGij=p4>`7#%VuEM!d4=rIKHTO`&s3;f_5h$G_p_NGFbTT@u%SNK2k zrwKsw><_(`f^D8Z|HAq5_wBEDL_u-SX2iYtw=lQ3FgN32E(e`>E3F(8_k2klj);df zO=?Mb^@_x0EB?1yvI6PaljY%H(@d6|y4LlvD=M^8CrtLIIQ2I}>+f!?k1h`fBmW38 zq{9?G>xtun!j;mba2@$nD_B_nKNT*z7F7*d^D+l)bAhu2V)>^PuZS^HmdU|kl!rQG)A=2leOhRXR3 zRe24!Ys0}rH3G?Br*vRFaa_oO$ckhjX=s>rNH?UWAqQ-88e=RwPg|SU%@-xrKXPw) zmez14x#5h}5+*5Z!J9bs z>BrtR3v2$zGTn;R6%yO0hBtA4c5I4?_5FFh;u5`nGtAjcTi^62+$bR{1IRnq{u^KaA|4_NaU^TMOk>GWacFG& z*wztX)A&!+M4j~?tHita{(1*Csaz!n1CL1Z%h(Uo#xmW5E1NisGCyEctdFY#f*dh{pft^NF6)8?)cO=Y{Qzzj?42!A3w61$IkVz){VWe z<}t(POi;izR+>;fLk$067o=5GAd0hJVA~mNCG%HPx`P6*&DT~eDOp93NlHmVk%geW zqqg4xFl&?t5M^;;sD+@d<9a2TpxSxX3eT`X?`5LG(e9{BcyqlNY%{5NR`K(*-`?MB z#Z`J1(Y!R19dE_fGgq5*&7(zSH<-yDzKh= zk*I^#Cj#uI3WmeLTkO6Obv_X=d(x0%pKQ;&W_1KM?vA43tE>iDa%S*va`36rfv;BX z;i(QM#1XJ+h@P{`^+3@TylMzvkd`)(+NtUkiAcu7V9}mAulaEHB+=Ns7fp^1zJ}yn zw3g@r|2Koe#jZ8$+JO7xw~?a{#b4utFHnmE!4%BgWxc?I01q6RKpjtL<>0{q4-BV& zKVe9lb+MY!n!N{^$y{b8bfeown zClT36mx*q|+v}6`wA(_WI1hH<{`h^DBv1YlDB}TT_|Nmj&m7^A505wwu6%II&}&A^ z1Z(*g86|-=`_`2`MN!j}AejD&`uqLa{@chIeB1RYodo$q9Seq*{)E7ktv?4LFdg_! z0Ct38t301q6SK(5l4&A`JFJaF_Tp6b;#@PNyl zpV-eVAD^vheLm`}V|t6CFC^hG%yqMI<>>y_T=@hQx8vR�h)BDf?Hg5tzQcDkW8a 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�dJin6SN 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"@Kvo60iGEO==5^_W#erlHfk8H!HuH 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

y0uB*Ha61{}bNbfThuXn|Lo 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

^b;t+=@xi}OIaTe$1#hQ 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 sI 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 diff --git a/update-libs.sh b/update-libs.sh index 3849937b..0d3de70b 100755 --- a/update-libs.sh +++ b/update-libs.sh @@ -2,15 +2,8 @@ set -e -function update_grammar() { - OUT_DIR="core/src/main/resources/$2" - OUT="$OUT_DIR/libtree-sitter-smithyql.$3" - mkdir -p "$OUT_DIR" - cp "$(nix build ".#packages.$1.grammar" --no-link --print-out-paths)/parser" "$OUT" - chmod +w "$OUT" -} +mkdir -p core/src/main/resources/ -update_grammar x86_64-darwin darwin-x86_64 dylib -update_grammar aarch64-darwin darwin-aarch64 dylib -update_grammar x86_64-linux linux-x86_64 so -update_grammar aarch64-linux linux-aarch64 so +RESULT=$(nix build ".#grammar-all" --no-link --print-out-paths --print-build-logs) +# copy, flattening links +cp --no-preserve=mode,ownership -Lr "$RESULT"/* core/src/main/resources/ From cd67e5d4868a1618099a54ddcaf49a783c9b3016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Fri, 14 Oct 2022 01:13:08 +0200 Subject: [PATCH 013/105] remove even more generated stuff --- .../linux-aarch64/libtree-sitter-smithyql.so | Bin 16976 -> 16976 bytes .../linux-x86_64/libtree-sitter-smithyql.so | Bin 20096 -> 20096 bytes .../playground/smithyql/ParserAdapter.scala | 2 +- tree-sitter-smithyql/Cargo.toml | 26 ------------------ tree-sitter-smithyql/binding.gyp | 19 ------------- tree-sitter-smithyql/package-lock.json | 19 ------------- tree-sitter-smithyql/package.json | 17 ------------ 7 files changed, 1 insertion(+), 82 deletions(-) delete mode 100644 tree-sitter-smithyql/Cargo.toml delete mode 100644 tree-sitter-smithyql/binding.gyp delete mode 100644 tree-sitter-smithyql/package-lock.json delete mode 100644 tree-sitter-smithyql/package.json diff --git a/core/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so b/core/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so index 4f9a644016b8d9baabb82df85c54fe47dbaf1555..41bb1b3d3d3927e97fb3fdfd03ea7d882ba2a3b3 100644 GIT binary patch delta 47 zcmcc6!g!&Daf21JLY0NFX<4F$NmW*Qg=v97u90D4da;qEQL$lqVP#HA^5!V!Z*~BT CV-Udr delta 47 zcmcc6!g!&Daf21Jf<>8$X>qZISy_^~S(Twdfk}2wj-h2zj$u)ic~N#*(dH=TZ*~BP C8W6t# diff --git a/core/src/main/resources/linux-x86_64/libtree-sitter-smithyql.so b/core/src/main/resources/linux-x86_64/libtree-sitter-smithyql.so index 078bb5e1ab6ecdc4d9e8a8e86c71b720af73e135..bf6e424c6034f9d3987fb675afaa83cc2bcc0e95 100644 GIT binary patch delta 98 zcmZpe%h)iNal>O~1&ib?^K|oKgXHA2N|OQugTyM+9D}r+#H`%J%HpD`?8yNv@_J?_ YR{D9F75c>``9-PvgtTl9U@`Cl0IAj@RR910 delta 98 zcmZpe%h)iNal>O~1tVjFBC||m3$vu8^vuHCA|n&C;``9-PvgtTl9U@`Cl04x_DLjV8( diff --git a/core/src/main/scala/playground/smithyql/ParserAdapter.scala b/core/src/main/scala/playground/smithyql/ParserAdapter.scala index ff0afe4a..05ce1aed 100644 --- a/core/src/main/scala/playground/smithyql/ParserAdapter.scala +++ b/core/src/main/scala/playground/smithyql/ParserAdapter.scala @@ -244,7 +244,7 @@ object ParserAdapter { def parse(s: String) = { val p = TreeSitterInstance.make(SmithyQLLanguageBindings.SmithyQL) val tree = p.parse(s) - println(tree.rootNode.get.children.find(_.tpe == "top_level_statement").get.children.map(_.tpe)) + println(tree.rootNode.get.fields.keySet) // OpDecoders.op.decode(tree.rootNode.get, s) } diff --git a/tree-sitter-smithyql/Cargo.toml b/tree-sitter-smithyql/Cargo.toml deleted file mode 100644 index 5449ce0e..00000000 --- a/tree-sitter-smithyql/Cargo.toml +++ /dev/null @@ -1,26 +0,0 @@ -[package] -name = "tree-sitter-smithyql" -description = "smithyql grammar for the tree-sitter parsing library" -version = "0.0.1" -keywords = ["incremental", "parsing", "smithyql"] -categories = ["parsing", "text-editors"] -repository = "https://github.com/tree-sitter/tree-sitter-smithyql" -edition = "2018" -license = "MIT" - -build = "bindings/rust/build.rs" -include = [ - "bindings/rust/*", - "grammar.js", - "queries/*", - "src/*", -] - -[lib] -path = "bindings/rust/lib.rs" - -[dependencies] -tree-sitter = "~0.20" - -[build-dependencies] -cc = "1.0" diff --git a/tree-sitter-smithyql/binding.gyp b/tree-sitter-smithyql/binding.gyp deleted file mode 100644 index d7e1fb6e..00000000 --- a/tree-sitter-smithyql/binding.gyp +++ /dev/null @@ -1,19 +0,0 @@ -{ - "targets": [ - { - "target_name": "tree_sitter_smithyql_binding", - "include_dirs": [ - " Date: Fri, 14 Oct 2022 01:14:15 +0200 Subject: [PATCH 014/105] bump t4s --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 453ebe81..97b093a6 100644 --- a/build.sbt +++ b/build.sbt @@ -73,7 +73,7 @@ lazy val core = project "org.typelevel" %% "cats-parse" % "0.3.8", "org.typelevel" %% "paiges-cats" % "0.4.2", "com.softwaremill.diffx" %% "diffx-core" % "0.7.1" % Test, - "org.polyvariant.treesitter4s" %% "bindings" % "0.1.0-2-36a569a-SNAPSHOT", + "org.polyvariant.treesitter4s" %% "bindings" % "0.2-296386b-SNAPSHOT", ), commonSettings, Smithy4sCodegenPlugin.defaultSettings(Test), From 2dc5dc71bd5a0cdd6b6e04f85a310135afa9012d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Fri, 14 Oct 2022 01:14:43 +0200 Subject: [PATCH 015/105] Remove gitmodules --- .gitmodules | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 .gitmodules diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 35a6628a..00000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "tree-sitter-smithyql/tree-sitter"] - path = tree-sitter-smithyql/tree-sitter - url = git@github.com:tree-sitter/tree-sitter From 5a046293586a5cc9c240adf6550ced3ee6dab6e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Fri, 14 Oct 2022 01:15:39 +0200 Subject: [PATCH 016/105] Remove boilerplate --- .../playground/smithyql/ParserAdapter.scala | 260 ------------------ .../smithyql/ParserTreeSitterDemo.scala | 19 ++ 2 files changed, 19 insertions(+), 260 deletions(-) delete mode 100644 core/src/main/scala/playground/smithyql/ParserAdapter.scala create mode 100644 core/src/main/scala/playground/smithyql/ParserTreeSitterDemo.scala diff --git a/core/src/main/scala/playground/smithyql/ParserAdapter.scala b/core/src/main/scala/playground/smithyql/ParserAdapter.scala deleted file mode 100644 index 05ce1aed..00000000 --- a/core/src/main/scala/playground/smithyql/ParserAdapter.scala +++ /dev/null @@ -1,260 +0,0 @@ -package playground.smithyql - -import cats.Id -import cats.Monad -import cats.StackSafeMonad -import cats.data.NonEmptyList -import cats.implicits._ - -import java.io.Closeable -import scala.util.Using -import org.polyvariant.treesitter4s.Node -import org.polyvariant.treesitter4s.bindings.TreeSitterInstance - -object ParserAdapter { - - implicit object CloseableIsReleasable extends Using.Releasable[Closeable] { - def release(resource: Closeable): Unit = resource.close() - } - - object ast { - - case class QualifiedIdentifier[F[_]]( - path: F[NonEmptyList[Identifier[F]]], - selection: F[Identifier[F]], - ) { - - def sequenceK( - implicit F: Monad[F] - ): F[QualifiedIdentifier[Id]] = - ( - path.flatMap(_.nonEmptyTraverse(_.sequenceK)), - selection.flatMap(_.sequenceK), - ) - .mapN(QualifiedIdentifier.apply[Id]) - - } - - case class UseClause[F[_]]( - ident: F[QualifiedIdentifier[F]] - ) - - case class Op[F[_]]( - useClause: F[Option[UseClause[F]]], - name: F[Identifier[F]], - input: F[Struct[F]], - ) - - case class Identifier[F[_]](value: F[String]) { - def sequenceK(implicit F: Monad[F]): F[Identifier[Id]] = value.map(Identifier.apply[Id]) - } - - case class Field[F[_]](identifier: F[Identifier[F]], inputNode: F[InputNode[F]]) - case class Fields[F[_]](fields: F[List[Field[F]]]) - case class Struct[F[_]](fields: F[Option[Fields[F]]]) - case class ListItems[F[_]](items: F[List[InputNode[F]]]) - case class Listed[F[_]](items: F[Option[ListItems[F]]]) - sealed trait InputNode[F[_]] - - object InputNode { - case class StructCase[F[_]](s: Struct[F]) extends InputNode[F] - case class ListCase[F[_]](l: Listed[F]) extends InputNode[F] - case class NumberCase[F[_]](n: F[String]) extends InputNode[F] - case class StringCase[F[_]](n: F[String]) extends InputNode[F] - case class BoolCase[F[_]](v: F[Boolean]) extends InputNode[F] - case class NullCase[F[_]]() extends InputNode[F] - } - - } - - object ast1 { - - type QualifiedIdentifier = ast.QualifiedIdentifier[Id] - val QualifiedIdentifier = ast.QualifiedIdentifier[Id] - type UseClause = ast.UseClause[Id] - val UseClause = ast.UseClause[Id] - type Op = ast.Op[Id] - val Op = ast.Op[Id] - type Identifier = ast.Identifier[Id] - val Identifier = ast.Identifier[Id] - type Field = ast.Field[Id] - val Field = ast.Field[Id] - type Fields = ast.Fields[Id] - val Fields = ast.Fields[Id] - type Struct = ast.Struct[Id] - val Struct = ast.Struct[Id] - type ListItems = ast.ListItems[Id] - val ListItems = ast.ListItems[Id] - type Listed = ast.Listed[Id] - val Listed = ast.Listed[Id] - type InputNode = ast.InputNode[Id] - - object InputNode { - type StructCase = ast.InputNode.StructCase[Id] - val StructCase = ast.InputNode.StructCase[Id] - type ListCase = ast.InputNode.ListCase[Id] - val ListCase = ast.InputNode.ListCase[Id] - type NumberCase = ast.InputNode.NumberCase[Id] - val NumberCase = ast.InputNode.NumberCase[Id] - type StringCase = ast.InputNode.StringCase[Id] - val StringCase = ast.InputNode.StringCase[Id] - type BoolCase = ast.InputNode.BoolCase[Id] - val BoolCase = ast.InputNode.BoolCase[Id] - type NullCase = ast.InputNode.NullCase[Id] - val NullCase = ast.InputNode.NullCase[Id]() - } - - } - - import ast1._ - - trait NodeDecoder[+A] { - - def decode(node: Node, text: String): A - - def text: NodeDecoder[String] = (node, _) => node.source - - def firstMatch[B](implicit ev: A <:< List[B]): NodeDecoder[Option[B]] = this.map { - _.headOption - } - - def unNone[B]( - implicit ev: A <:< Option[B] - ): NodeDecoder[B] = this.map(_.getOrElse(sys.error("missing item"))) - - def atType( - tpe: String - ): NodeDecoder[A] = atTypeOpt(tpe).unNone - - def atTypeOpt( - tpe: String - ): NodeDecoder[Option[A]] = atTypeSeq(tpe).firstMatch - - def atTypeSeq(tpe: String): NodeDecoder[List[A]] = - (node, text) => - NodeDecoder - .children - .map(_.filter(_.tpe == tpe)) - .map(_.map(this.decode(_, text))) - .decode(node, text) - - } - - object NodeDecoder { - val id: NodeDecoder[Node] = (node, _) => node - - implicit val instances: Monad[NodeDecoder] = - new StackSafeMonad[NodeDecoder] { - - def flatMap[A, B]( - fa: NodeDecoder[A] - )( - f: A => NodeDecoder[B] - ): NodeDecoder[B] = { (node, text) => - f(fa.decode(node, text)).decode(node, text) - } - - def pure[A](x: A): NodeDecoder[A] = (_, _) => x - - } - - val children: NodeDecoder[List[Node]] = (node, _) => node.children - - val childTypes: NodeDecoder[String] = children - .map(_.map(_.tpe).mkString(", ")) - - def union[A](decoders: (String, NodeDecoder[A])*): NodeDecoder[A] = - (node, text) => - decoders - .collectFirstSome { case (key, v) => v.atTypeOpt(key).decode(node, text) } - .getOrElse(sys.error("missing case: " + childTypes.decode(node, text))) - - val text: NodeDecoder[String] = id.text - - implicit final class NodeDecoderOps[A](nd: => NodeDecoder[A]) { - def deferred: NodeDecoder[A] = nd.decode(_, _) - } - - } - - object OpDecoders { - import NodeDecoder._ - import NodeDecoder.NodeDecoderOps - - val identifier: NodeDecoder[Identifier] = text.map(Identifier(_)) - - val listItems: NodeDecoder[ListItems] = inputNode - .atTypeSeq("input_node") - .map(ListItems.apply) - - val listed: NodeDecoder[Listed] = listItems - .atTypeOpt("list_fields") - .map(Listed.apply) - - val bool: NodeDecoder[Boolean] = text - .map(_.toBoolean) - - lazy val inputNode: NodeDecoder[InputNode] = - union( - "number" -> text.map(InputNode.NumberCase(_)), - "string" -> text.map(InputNode.StringCase(_)), - "null" -> InputNode.NullCase.pure[NodeDecoder], - "struct" -> struct.map(InputNode.StructCase(_)), - "list" -> listed.map(InputNode.ListCase(_)), - "boolean" -> bool.map(InputNode.BoolCase(_)), - ).deferred - - val field: NodeDecoder[Field] = - ( - identifier.atType("identifier"), - inputNode.atType("input_node"), - ).mapN(Field.apply) - - val fields: NodeDecoder[Fields] = field - .atTypeSeq("field") - .map(Fields.apply) - - val struct: NodeDecoder[Struct] = fields - .atTypeOpt("fields") - .map(Struct.apply) - - val qualifiedIdentifier: NodeDecoder[QualifiedIdentifier] = identifier - .atTypeSeq("identifier") - .map { - case _ :: Nil | Nil => sys.error("no ident??") - case all => - val prefix = NonEmptyList.fromListUnsafe(all.init) - - QualifiedIdentifier(prefix, all.last) - } - - val useClause: NodeDecoder[UseClause] = qualifiedIdentifier - .atType("qualified_identifier") - .map(UseClause) - - val op: NodeDecoder[Op] = - ( - useClause.atTypeOpt("use_clause"), - identifier.atType("operation_name"), - struct.atType("struct"), - ).mapN(Op.apply) - - } - - def parse(s: String) = { - val p = TreeSitterInstance.make(SmithyQLLanguageBindings.SmithyQL) - val tree = p.parse(s) - println(tree.rootNode.get.fields.keySet) - // OpDecoders.op.decode(tree.rootNode.get, s) - } - -} - -object ParserAdapterDemo extends App { - println( - ParserAdapter - .parse( - "use service a.b#C\n helalsdfhl //a\n{ hello = 42, foo = 50, x = { y = \"hello\"} , z = null, aa = [10, true, false, null]}" - ) - ) -} diff --git a/core/src/main/scala/playground/smithyql/ParserTreeSitterDemo.scala b/core/src/main/scala/playground/smithyql/ParserTreeSitterDemo.scala new file mode 100644 index 00000000..0c1d9b25 --- /dev/null +++ b/core/src/main/scala/playground/smithyql/ParserTreeSitterDemo.scala @@ -0,0 +1,19 @@ +package playground.smithyql + +import org.polyvariant.treesitter4s.bindings.TreeSitterInstance + +object ParserTreeSitterDemo extends App { + + def parse(s: String) = { + val p = TreeSitterInstance.make(SmithyQLLanguageBindings.SmithyQL) + val tree = p.parse(s) + println(tree.rootNode.get.fields.keySet) + // OpDecoders.op.decode(tree.rootNode.get, s) + } + + println( + parse( + "use service a.b#C\n helalsdfhl //a\n{ hello = 42, foo = 50, x = { y = \"hello\"} , z = null, aa = [10, true, false, null]}" + ) + ) +} From 49979108541efa0969e0389ccdc9e16cfcb7881a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Fri, 14 Oct 2022 01:20:50 +0200 Subject: [PATCH 017/105] Add s01 resolver --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 97b093a6..d3242793 100644 --- a/build.sbt +++ b/build.sbt @@ -51,7 +51,7 @@ val commonSettings = Seq( scalacOptions ++= Seq("-Xsource:3.0"), javacOptions ++= Seq("-source", "8", "-target", "8"), mimaFailOnNoPrevious := false, - resolvers += Resolver.mavenLocal, + resolvers += "Sonatype S01 snapshots" at "https://s01.oss.sonatype.org/content/repositories/snapshots", ) lazy val pluginCore = project.settings( From bfbd5ef18b9cca350ce8ba4324e01d0bfc1afd1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Sun, 30 Oct 2022 14:43:55 +0100 Subject: [PATCH 018/105] Less boilerplate in grammar farm build --- flake.nix | 39 ++++++++---------- .../libtree-sitter-smithyql.dylib | Bin 51488 -> 51536 bytes .../libtree-sitter-smithyql.dylib | Bin 17056 -> 17096 bytes .../linux-aarch64/libtree-sitter-smithyql.so | Bin 16976 -> 70264 bytes .../linux-x86_64/libtree-sitter-smithyql.so | Bin 20096 -> 20136 bytes 5 files changed, 18 insertions(+), 21 deletions(-) diff --git a/flake.nix b/flake.nix index d312a1ed..7d4e53d2 100644 --- a/flake.nix +++ b/flake.nix @@ -13,6 +13,7 @@ inherit system; overlays = [ jvm ]; }; + suffix = system: (pkgs.lib.systems.elaborate system).extensions.sharedLibrary; grammar = pkgs.stdenv.mkDerivation { pname = "tree-sitter-smithyql"; version = "0.0.0"; @@ -20,10 +21,10 @@ buildInputs = [ pkgs.tree-sitter pkgs.nodejs ]; buildPhase = '' tree-sitter generate - cc src/parser.c -o parser.so -Isrc -shared + cc src/parser.c -o libtree-sitter-smithyql${suffix system} -Isrc -shared ''; installPhase = '' - cp parser.so $out + cp libtree-sitter-smithyql${suffix system} $out ''; }; in @@ -39,25 +40,21 @@ ]; }; packages.grammar = grammar; - packages.grammar-all = pkgs.linkFarm "grammar-all" [ - { - name = "darwin-x86_64/libtree-sitter-smithyql.dylib"; - path = self.packages.x86_64-darwin.grammar; - } - { - name = "darwin-aarch64/libtree-sitter-smithyql.dylib"; - path = self.packages.aarch64-darwin.grammar; - } - { - name = "linux-x86_64/libtree-sitter-smithyql.so"; - path = self.packages.x86_64-linux.grammar; - } - { - name = "linux-aarch64/libtree-sitter-smithyql.so"; - path = self.packages.aarch64-linux.grammar; - } - - ]; + packages.grammar-all = + let system-mappings = { + "darwin-x86_64" = "x86_64-darwin"; + "darwin-aarch64" = "aarch64-darwin"; + "linux-x86_64" = "x86_64-linux"; + "linux-aarch64" = "aarch64-linux"; + }; in + pkgs.linkFarm "grammar-all" (pkgs.lib.mapAttrsToList + (jna-system: nix-system: + let suffix = (pkgs.lib.systems.elaborate nix-system).extensions.sharedLibrary; in + { + name = "${jna-system}/libtree-sitter-smithyql${suffix}"; + path = self.packages.${nix-system}.grammar; + }) + system-mappings); } ); } diff --git a/modules/parser/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib b/modules/parser/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib index 2f81905238516214e9789aa4aef552863c1cfbde..443b691ec7e65a1d308b9a929cf41626091a39ce 100644 GIT binary patch delta 1006 zcmZ25iTT1L<_RK<2@^$&g?1z}fWZ|`2)!eD;w(GSo?HlTg#d&G@tGzoGD~mfV9a1- z447QVByDH`l#>8rMu-|PnUk4RQk0siTbx-^l3Ju&oSRvaQCXOymr@ConY@WLlV*lxS|4o1LDPo?=m+R+w&JoSd6! zVpfq@ls@@Cb0*t?LktWP*ftlkSj96rJld?6VkA0wOSzY(DuWt>I)es-CW97(HiHg> zE`uI}K7#>+A%hWvF@p(%DT5hbUl<;_i%UTl1zpfCa24#K^;lW*0lG4f4j zY|!WYln)dEf|ALW4f0kYWe{Eql)eC^9m*l%T~N9QO0!fz#E&FTE@bgzdQ-9aQG=2_ zvuA?ZWcC9p^*fFOeGDXcK&mu>m=DN50*w_z5TA*G0p$N+*wAO^|9+yrt8 zh!1mH50npc;{qrj=GOHL^$-m(N1uW!fI0piln?X78z}z`)Kg4A$ATTp$wm2_jnEf(_Nf8N delta 902 zcmcaGiFv^!<_RK<0TV@wg>+IFz~Blegw{!!ILl6yArHbc5rEJjKGS4FX6elwj2VoK z3X=<&q!l%QauPty2vq~33KENoQ;YP9^Ff@+dztK21%V8YgA5D-KxN!Ob^u5Q2>78G zq+4LJBJ(+gq(s9iqx7PxtXxB*q+Ii)vgE9aqQdkniwdK}l)|FK$^0ytYzq!CFf_1j zZe%f!pFDx3ooT_n&AXC~L?hLFu|c0RtpF$j z1TQ9AHpp9@D1-2RKxvn92!9Kd{s*NQDj?z&P}(A8awALF<`)ez_RL-hs*~9dsMN1H z0rUir-~lPs1Y$lQ-vS!2h9Eu@0|U%@cPRfwDUbmKi9igJhdBu39uObqupTHM=D-C| zKFp!(8R{V#U@krdRRDAOJt!aMgEvrqLM4y^1b=`SWZ@SmALMvGR-j-55CefOl>edu z%w@2H@&%e8d?rxJ;Rg!pq-=IN$j&%9{!n5NMC#W)o&&&yQw8KPLqr%qcfNX|EKpX*O^D;0TTA;whzynNuYQhabQ3!x1w8@c&9TlGMcbvKA z&7H0J+hk_8ho#LHl{`P?X|ZQqQ?dOTQ`OojlXo3nkl^CSGIE?3Nt{W9GWmP=np z7~LwfQQY%ONaWeclb2FzwVGb$`Okk4b+OE3Yyd_O+V;29C{O+@k3OqI7whD%8lw#a?f8TsavS#&M-vwhygg zw|~SB4~)^#X}QL$hW{(_>7GbvF-3puKh!Go!p-iiXJ8q!kb^v|z*Bez1z3e5a45lZ zSc5XG!waZD6>9X~35dOX+PCs=rs8rRWz0$cmJ~mWD=aP;FWwDT(hxPCtS>GH<1Ipu zFp&-NZwcFke+WHQG^4x9b>{M z5szM}B)I|*irFIG$Y6lhL6`MV-h1Mq%nRb7T#q=)KEn{;3nfDR--(C!_)R>#&p+bV zISkMg6e|U^q;fQk_zm$T$?sr+Ps*@K{D#MZ#A}gi&MU6!*PAgmYng+NHQu+Kj-&6J LT~XiY;o<)Qhbw8V delta 606 zcmX@n%DAAFae@e=#6;0zAps!;eNG1jpa>8gm~3evZ?!-T z!n**a71Sa82~heLlzsrE6F}Ys0tKPTfh=*GKNyJcvwJ6~I>iG0$L*k4uL6{tpdtWP zQzFg4aE672K@-U11A0sW8n}iaJ`)22%q8wn{sC36HikqfALh0)C?Dp=9w;B?)&)>L z(9QKgCIiEIr~u6Ir=Wb8C+xyX8-^I diff --git a/modules/parser/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so b/modules/parser/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so index 41bb1b3d3d3927e97fb3fdfd03ea7d882ba2a3b3..8ef2e702c0f123c14d30b3a663c66216096b0529 100644 GIT binary patch delta 6037 zcmeI0|4&=j6~NE6NrQnjHiY>Rwc|lcFqkj40o$}IvA0H8)233Xs?dG`ryaqhBnC1H zw33O|N=TbD)7wezHcdp^G{{fx=nvMUspL1>RT@&ei2YKLD4X0wo17_{%n0(%d+!`# zZu$>Q;z`fvozJ=F-gm#e<8$xUJEHj8inPa`s}{@NzQ9vnFfWz>!qko5C-BzyOckZY z^}XfyT3!1V%9zexY|Cr55A={f zKK9yd&^NZww{USbbUyAsKYMAucV;FLI6r=I>Z1IC-K#IeeW9_1OLMQi(fj74-yfX2 ziIzAzPXK&P}E=igT6|pLTTfd&Nj$|3ryDH8oZ_(b&>GxD zg=@r@6ka@I)st5ED)G!=o&ry+<*;(t02$(|3inV&S%v$E=M=t4BebFLm^soZ04Mc? zMR784Ny7d`{s>;)@DjB+hGwJGMkTt&~rD%>Dyp6hnp_RusNMd{yDA#Ip*| z63;0-M||U9%39t0rW<6~R2(*mZz+6>__o5giSHS@F9z*AfgyX$swljB=u}a zHC|%Bt?=MRZnQ{a2 z9Pt%}Zxdftc!4;8&6w(gjx>hA20Q z+pv=IdbUdPZdG%t4&eR$w{EO%*hg*_-uig0fGxOg5AHf`XP0$bDZ`8#J6$hbDkOH$O~$9<90hlhX04_nIC?rBT6cY*2nttv^+VHIFt&`Xd7Rc8s@p zFu1#jl^PXEXU#crd;Qg#>6!|(ZLNQ%-K>$dt+BQiI0LQtk+(rRc%cJ2p$odf2Yv`Z z5A;GG1R(@r=$BVp-d)$vjN9Aaxm79+0oIK2b(9ZK&Y}F)?NaGiC|^YR5y~(ACI8UY z+}43+AF9UX#JdCU7_taT@(@gO>6silOCgyq9jt=i0wp@!3C1C3(X; zBGWDDqx)zKj@H1@8aP@5|F>(P$;JCh-bX$u{od9D?;d%#$h$+{400l`QTEB3JKoIk z-i`Nayf@>$81KDe_+Ro;6K|~WZ^pbhf#MAm$mNbknd@*mVw5Tk%ljQ}>Fm@}86qnr z4>Eqzb0jxN9wh9fZJf4xr|8_QtJ$bq- zB}(!aU0otCKj~@|8}h5J%i=}MFfP~ns1laheHr!D$-=Ys!Y1v$zc=KosQNNt2M1_U z_}#*X=O*>`YDh{yYIkJZUvEDFMU-w)A+H7Nj@jWPM2x4D9n%q=Hs58HVG8O3KIS;g zYr*%mN;+RZ$KqJKOZ%gC1nof@obHprg5?-M*F;m4Kim;mgLOUv@KZXGvV4q5zJXR=yX^icJ_tC0De!%?ava$q^8>PGWmBKKfuqj*WYus? z4Bt)pa-TcJQQ`_&pCc>B7He;V898x|HAZS|To;IQjQXC1;cem^!#Gz?bN$vaPAyy} zhu@GPBX9L-d`?F;_|P;yTBvz4d`z4prw4W8`U`Q6q)7|YOq_(AGDBZt`3ksSqGBND zg3dP0%c>>wW~C=V<$%-ZPW=b1HmEs>5A18iaslSI!N`;j99e-)s^3_xIpR+OAE>fZ zi&?(j_^ue4(r?vsy0oo)l!IunnIR+|a@TX@Vc+kgRhNEIClc~n$bIa`tUvu8KGovV z-=;uE3le@$B~Go2aI0`8rxTO$>G_eFEAcBo97((`pXq;Bgx1&kn{De`&#wrKe^W1X zJ25UH9P+W`-oWhwjuHtcPc#Z#tA^E4M*P&HfmK*YZH01bOm8E?t{n5t%0Zz;+ A>Hq)$ delta 4588 zcmZvge{56N701tgFF-<^<~ctWC++H&tOPeE#Lh@@+CMOD5ouMe0d*4FKebgvO!;LK ztu=wo$+St4Hf;`%>e8*6%+yJ4g(goR5ml2G_E+fohpRHgAJr64yLoHX1&KeBHNiXY z-E)F-(0O6J0znk&4!(I`i z;&yoE{C0o8f~9^1OZ_t+_O_gRQqhOeF~qC>4GlP_#qR_-ej{K+gcCM?B<7t<#@qHp z?7Ks6BxAcKULVU2r6VT>qsg)H!QsL2=vd~=@x!k)VG+t>`{E)`&ClpU;yzscq@j2otjhBh1 zYqxo~~xE1o=AE2NK0ZJ%p+$LVqc!>C{ z#v{b%G#(>9zayt+H@`uggtC?}Lj1PIM~N?J{1EYq#(AzRGSAVvPf)@V3&c~zfjo{o znkHVa@hovmY4(`8}x+Tk8S{T$wK*ZFJTi*?U`RjoSL zzkbJ4Lv|E#G5&9-n>^^v;pv5ytel~;dTcg zrureQgS>dsyv6X=K`~E}7Y*-qysCLGD^tCN?M~OqOc?BF|SFDBiszA4|F)g^RM&2)u0GFT@P|%!1>LCoucgAcn}mt=id)biRYYX@2M7> z8sS*#e`~L3J-@9D54vxe;`7e(R%*T`n9u+qg%BOW#zS$t*$4?4b&EG;Qiyi52`cV~ zjvODXYm(7snqii0sYWnyBHMKEs=-*_4}8R3&s!k!jrCihq-^l{+WOc~8uAlp#7g6Et3JRI%QR?r{7GWqkh|h8Pf*DlJIAiKVREYhr4a zQuz_?FA@X4#G=fYA`s9z@EoZXc?s1KQUxW)y|{5)Qpm+OjMuM`yU&V9Q6~cY!@z3< z|NPd=+Bo`guR=3?qMP<2DUSn3VTineAqQ^!p?iWcMbN*_|$s9KexrvuEW2lyhu02FZI!X7h2K)x8c9XVZE~ zVHhLMrp8u#mN=W+DXRY~;+C?W9K1+E+>0A0>N{S-Ltdf!?-OTt4Pn{6J|Mp4whBYs zi_H+BAH@pePJTm9Z5F}K{5lTsiPugu4DB4BWS^CK2KIiGY`&R6ZK+`kl$|*lj5msw;Du`;l#zJYfFuy zAVg8V-6RGY*y_si<0i4Y0ozfR^gn_{?t?84xWxpi2|42y*?e!xkFnTNp$>4oV9Bm# zv2!aA&ABJ#!DjK4pM8+yr}7TIvHWARc+?_m<9}z=E9t8mDHK*6Bx$E59&MnkNLU`U zuwQf>EcMItShQ%MO9Lu#l-k5Zi@zM2>fEOPp;W&n9WZe29QTWDjQr9=ml3s5t%WV> i8SZxUvi#gH!VM5p=(6l=!Mwn6BF zV6vEPnF-|ZKt{F|V`4SN1b+|mGSkg0@?s2om}JZedmurDMNOt3czob1q z-_O0j-~F9?&bghu%u|>7R5?#gSNN=Jc9y%=rb7cZcah<^i>B{gDi?hi)vJEmgJCt>?Z)#3CQ>rZtU)`9^@Lz!81 zG}IXGqC{ulm|5jX2$_8q&Nm*P>2w=@tE69m1+&@)c*o-s{Q%>5QqpH}d{EM_K;cuW z;}fJ~5?zEwLBB$JPNLUfM9}Y%&Pwza%nSMx(v(E+!?K_oNS7qK3EZMOwvet!^d5Kw z{R8QSL?40QqFVn#`Vf}QD$H66CKyJ>()oCt71RqP-GutHl5R%bDd`mXa!I!s<0qI~ z0(p3&I!WJydV{2wpx!F!WvF*cx(oH=IlYoG%E>AOC#4DXs0X3UuKFVqeFy27r1zmd zDe1KH=OjIjl^gN8%RL2aCNlA1L=51=*1>D<3iJrh&X-TK-UXt`AaJ%YA z;j9&j-UN?b<+t@V`&HA|1$&)v!_!)^kGa@>R?aHei>#6zU@x&MR?XbZ!)io+X`E$(v7U6VD0{WLnM^iCTZD}Z`)TfU@r<`nUD;-%;$}jMcL7Gs$?@UdsV@*n0<&drZ79}#!NC8 zV=n`5QXOw1r930r2OdF31m$cutHZO6=q&gJ{WM1lnOmaYWuI&PAxHDsLs)3q?^w+} zXBQhQrF$559k!d)w%>DOpJ5wVr!?kIp^MyS^v{8Go045uF|%}&V%TCh)~q@X2&!Z| zqV&c!@L{vcyK>(rU_tzj=6+w)*PGpZPdwHWiH5@d=y*>o?vMBNgaUg0kuMcJ{d!XD zn(l9#;QRrsw^v(fJ)7X@@Y$T2@pPvK?{?JMcK#UYmpYCrd0S5yxI~zJ@LOl4wV=gN TK7+C@pY@xghPMU&&eDGX^)F{y delta 2356 zcma);U1(cn7{}lDn8tii*Q_6>so0)I?FWT6NsmpsvDviFri*sbi`9!co3{2d?XqNa zZ5T~fWlT|Q_S`AM6h!JSM)i16Z={OK1jP-!=*EhxAP9=AFu^P1o1Eua*~>0GaPsH* z|IYhy&ig#?o3+b4dzr7a@NBL%V87;MrR!R5YQnKzWd`e2xmy?ZXLU2$Q@FzGVTIcs zj+$KYPP4^*HFmh7Xu;9xz(gSB9UUEC)DvEBEd5N}J06cs&&C#0$@C0FEe-8m`hkwQ zsfCWznN!KvJN`$LHfk>_XPtcP{??^NWF+tNv?@II> zM(7!#KMUOw`q6fw@QzT+pHQbaDZ{s+S8u8d z3rZ^@APbB8gt#lVVOc-Q@4=6HgJSu^_)G7ziZQYkuHsXSZC03C4xxiXt;}aew6FAF zyoqYV{YHbY4!$P3X&IqCqY}Ri<|nJgxE|GmN;^S2##HBB%3@Gcb;sBKAl-HEUl(+Ogl$-Sa zl#NxG9h86cUCoSpk}>*#lw>W~fYR!?v2$o2=WDQg_!RFmV$c3mJS2Rfy+Z=`G4`cc zW6sLOArTXlmiDN*^6VF+HpqpF2gN6$wrUI8Eg-%xPXq5&-OZdag*jOk(}?f^@Ch0f zlrxptqNXpx(scr2g1&)m8Kxpa_8#PV)yAuWK5X2LQlIn;EjufyM`Ul6;d-u?8;6fvQ9x75jNkk7Vx5e)1~QyagFVt=r Date: Sun, 30 Oct 2022 14:56:54 +0100 Subject: [PATCH 019/105] Update ts4s --- build.sbt | 2 +- flake.nix | 7 ++++--- .../linux-aarch64/libtree-sitter-smithyql.so | Bin 70264 -> 70264 bytes .../linux-x86_64/libtree-sitter-smithyql.so | Bin 20136 -> 20136 bytes .../parser/ParserTreeSitterDemo.scala | 4 ++-- .../parser/SmithyQLLanguageBindings.java | 2 +- 6 files changed, 8 insertions(+), 7 deletions(-) diff --git a/build.sbt b/build.sbt index 23e095f8..1926b3c2 100644 --- a/build.sbt +++ b/build.sbt @@ -81,7 +81,7 @@ lazy val parser = module("parser") .settings( libraryDependencies ++= Seq( "org.typelevel" %% "cats-parse" % "0.3.8", - "org.polyvariant.treesitter4s" %% "bindings" % "0.2-296386b-SNAPSHOT", + "org.polyvariant.treesitter4s" %% "core" % "0.3-b944a3d-SNAPSHOT", "io.circe" %% "circe-generic" % "0.14.3" % Test, "io.circe" %% "circe-parser" % "0.14.3" % Test, "co.fs2" %% "fs2-io" % "3.3.0" % Test, diff --git a/flake.nix b/flake.nix index 7d4e53d2..66583566 100644 --- a/flake.nix +++ b/flake.nix @@ -19,12 +19,13 @@ version = "0.0.0"; src = ./tree-sitter-smithyql; buildInputs = [ pkgs.tree-sitter pkgs.nodejs ]; + FILENAME = "libtree-sitter-smithyql${suffix system}"; buildPhase = '' tree-sitter generate - cc src/parser.c -o libtree-sitter-smithyql${suffix system} -Isrc -shared + cc src/parser.c -o $FILENAME -Isrc -shared ''; installPhase = '' - cp libtree-sitter-smithyql${suffix system} $out + cp $FILENAME $out ''; }; in @@ -51,7 +52,7 @@ (jna-system: nix-system: let suffix = (pkgs.lib.systems.elaborate nix-system).extensions.sharedLibrary; in { - name = "${jna-system}/libtree-sitter-smithyql${suffix}"; + name = "${jna-system}/${self.packages.${nix-system}.grammar.FILENAME}"; path = self.packages.${nix-system}.grammar; }) system-mappings); diff --git a/modules/parser/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so b/modules/parser/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so index 8ef2e702c0f123c14d30b3a663c66216096b0529..254747201ac5db702a68c8c1d06883d5c425f117 100644 GIT binary patch delta 51 zcmeydgyqK)mJL?S3dIE#hNe}y8I>kwMU@qnIYnl9WqIaiCg$mu29*YuY0Xj0+oPBn G<@f;w4iS|A delta 51 zcmeydgyqK)mJL?S3g(81X~|_~25D8MRoP|cNr{F@WqFk*#l@LMNg3IN+09YR+oPBn G<@f>miV^+* diff --git a/modules/parser/src/main/resources/linux-x86_64/libtree-sitter-smithyql.so b/modules/parser/src/main/resources/linux-x86_64/libtree-sitter-smithyql.so index a6ef028adbfe438bb894c3b5b381bc629163955b..9670e659d9e132dfdc46f5db9f7a878f383874e2 100644 GIT binary patch delta 98 zcmZ26mvO~h#tn~|6)chqE3zxHbF$3MEzEPXOw-H@axF5-^U4fOObx1XDkcZ8$m^Mz YSn20wR_GU( Date: Sun, 30 Oct 2022 15:33:37 +0100 Subject: [PATCH 020/105] reusable library packaging --- flake.nix | 88 ++++++++++++------ .../linux-aarch64/libtree-sitter-smithyql.so | Bin 70264 -> 70264 bytes .../linux-x86_64/libtree-sitter-smithyql.so | Bin 20136 -> 20136 bytes 3 files changed, 58 insertions(+), 30 deletions(-) diff --git a/flake.nix b/flake.nix index 66583566..215d1c4f 100644 --- a/flake.nix +++ b/flake.nix @@ -13,21 +13,61 @@ inherit system; overlays = [ jvm ]; }; - suffix = system: (pkgs.lib.systems.elaborate system).extensions.sharedLibrary; - grammar = pkgs.stdenv.mkDerivation { - pname = "tree-sitter-smithyql"; - version = "0.0.0"; - src = ./tree-sitter-smithyql; - buildInputs = [ pkgs.tree-sitter pkgs.nodejs ]; - FILENAME = "libtree-sitter-smithyql${suffix system}"; - buildPhase = '' - tree-sitter generate - cc src/parser.c -o $FILENAME -Isrc -shared - ''; - installPhase = '' - cp $FILENAME $out - ''; - }; + grammar = + let + rename-grammar = grammar: + let inherit (grammar) pname; in + pkgs.stdenv.mkDerivation { + inherit pname; + inherit (grammar) version; + buildCommand = + if pkgs.stdenv.isDarwin then '' + mkdir -p $out/lib + cp ${grammar}/parser $out/lib/lib${pname}.dylib + chmod +w $out/lib/lib${pname}.dylib + install_name_tool -id lib${pname}.dylib $out/lib/lib${pname}.dylib + '' else '' + mkdir -p $out/lib + cp ${grammar}/parser $out/lib/lib${pname}.so + ''; + }; + + tree-sitter-smithyql = pkgs.stdenv.mkDerivation { + pname = "tree-sitter-smithyql"; + version = "0.0.0"; + src = ./tree-sitter-smithyql; + buildInputs = [ pkgs.tree-sitter pkgs.nodejs ]; + buildPhase = '' + tree-sitter generate + cc src/parser.c -o parser -Isrc -shared + ''; + installPhase = '' + mkdir -p $out + cp parser $out/parser + ''; + }; + in + rename-grammar tree-sitter-smithyql; + + make-grammar-resources = + { package + , system-mappings ? { + "darwin-x86_64" = "x86_64-darwin"; + "darwin-aarch64" = "aarch64-darwin"; + "linux-x86_64" = "x86_64-linux"; + "linux-aarch64" = "aarch64-linux"; + } + }: pkgs.linkFarm "${(package system).name}-all" (pkgs.lib.mapAttrsToList + (jna-system: nix-system: + let + suffix = (pkgs.lib.systems.elaborate nix-system).extensions.sharedLibrary; + pkg = package nix-system; + in + { + name = "${jna-system}"; + path = "${pkg}/lib"; + }) + system-mappings); in { devShells.default = pkgs.mkShell { @@ -41,21 +81,9 @@ ]; }; packages.grammar = grammar; - packages.grammar-all = - let system-mappings = { - "darwin-x86_64" = "x86_64-darwin"; - "darwin-aarch64" = "aarch64-darwin"; - "linux-x86_64" = "x86_64-linux"; - "linux-aarch64" = "aarch64-linux"; - }; in - pkgs.linkFarm "grammar-all" (pkgs.lib.mapAttrsToList - (jna-system: nix-system: - let suffix = (pkgs.lib.systems.elaborate nix-system).extensions.sharedLibrary; in - { - name = "${jna-system}/${self.packages.${nix-system}.grammar.FILENAME}"; - path = self.packages.${nix-system}.grammar; - }) - system-mappings); + packages.grammar-all = make-grammar-resources { + package = system: self.packages.${system}.grammar; + }; } ); } diff --git a/modules/parser/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so b/modules/parser/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so index 254747201ac5db702a68c8c1d06883d5c425f117..79ee31fb8e87983bb174d452cfc5ad00103068f5 100644 GIT binary patch delta 161 mcmeydgyqK)mJL?SlUtdM>lq>j6mTJIZ~n%-{Tnl56CVH$UpRsQ delta 150 zcmWm6Jr05}7=YoJGJBJcR#S>)AYKJYEhR0|pEQ(FkKh$JfSWfXjAGvTdAB9omh4lZ zs~@LRF`F*Y=+eZsV?!KDMoY;_BK!`)2?1V(ARKt3LYJ%tlJ8-yZq*y3x~}k`ChWt* t32deDJ*O%*^LZ?!GR(%t8FkTpGBh!eZ3{dvass>mKVB>PuITVQ{s8^1H6H)~ diff --git a/modules/parser/src/main/resources/linux-x86_64/libtree-sitter-smithyql.so b/modules/parser/src/main/resources/linux-x86_64/libtree-sitter-smithyql.so index 9670e659d9e132dfdc46f5db9f7a878f383874e2..6c9cbc11a0597ecd6ab3ff93e27b60253c1751d4 100644 GIT binary patch delta 235 fcmZ26mvO~h#tn~|Cs(r=*E2*6Pq6td%Wh8q^CePu delta 225 zcmZ26mvO~h#tn~|>n)NCE3zxHbF$3MEzEPXOw-H@axF5-^U4fOObx1XDs)SVQd4z{ zGfPTRi*$=~GfOfm3v+Z0^ng%5Co{>+#7aLevqHbPB)=$CpLE0cP)xI$e1qA}9@)f< zsK_s%*o=+>}a#w2T7X^yFk+Lqk1dJp)~!b3jho{FY_6 FCjh2DP!9kA From af7d5cc1f67e00090fc226cdfe291f0db331cf2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Sun, 30 Oct 2022 15:34:53 +0100 Subject: [PATCH 021/105] cleanup --- flake.nix | 65 ++++++++++++++++++++++++++----------------------------- 1 file changed, 31 insertions(+), 34 deletions(-) diff --git a/flake.nix b/flake.nix index 215d1c4f..75c7fb2c 100644 --- a/flake.nix +++ b/flake.nix @@ -13,41 +13,24 @@ inherit system; overlays = [ jvm ]; }; - grammar = - let - rename-grammar = grammar: - let inherit (grammar) pname; in - pkgs.stdenv.mkDerivation { - inherit pname; - inherit (grammar) version; - buildCommand = - if pkgs.stdenv.isDarwin then '' - mkdir -p $out/lib - cp ${grammar}/parser $out/lib/lib${pname}.dylib - chmod +w $out/lib/lib${pname}.dylib - install_name_tool -id lib${pname}.dylib $out/lib/lib${pname}.dylib - '' else '' - mkdir -p $out/lib - cp ${grammar}/parser $out/lib/lib${pname}.so - ''; - }; - tree-sitter-smithyql = pkgs.stdenv.mkDerivation { - pname = "tree-sitter-smithyql"; - version = "0.0.0"; - src = ./tree-sitter-smithyql; - buildInputs = [ pkgs.tree-sitter pkgs.nodejs ]; - buildPhase = '' - tree-sitter generate - cc src/parser.c -o parser -Isrc -shared + # begin library code + rename-grammar = grammar: + let inherit (grammar) pname; in + pkgs.stdenv.mkDerivation { + inherit pname; + inherit (grammar) version; + buildCommand = + if pkgs.stdenv.isDarwin then '' + mkdir -p $out/lib + cp ${grammar}/parser $out/lib/lib${pname}.dylib + chmod +w $out/lib/lib${pname}.dylib + install_name_tool -id lib${pname}.dylib $out/lib/lib${pname}.dylib + '' else '' + mkdir -p $out/lib + cp ${grammar}/parser $out/lib/lib${pname}.so ''; - installPhase = '' - mkdir -p $out - cp parser $out/parser - ''; - }; - in - rename-grammar tree-sitter-smithyql; + }; make-grammar-resources = { package @@ -68,6 +51,7 @@ path = "${pkg}/lib"; }) system-mappings); + # end library code in { devShells.default = pkgs.mkShell { @@ -80,7 +64,20 @@ pkgs.tree-sitter ]; }; - packages.grammar = grammar; + packages.grammar = rename-grammar (pkgs.stdenv.mkDerivation { + pname = "tree-sitter-smithyql"; + version = "0.0.0"; + src = ./tree-sitter-smithyql; + buildInputs = [ pkgs.tree-sitter pkgs.nodejs ]; + buildPhase = '' + tree-sitter generate + cc src/parser.c -o parser -Isrc -shared + ''; + installPhase = '' + mkdir -p $out + cp parser $out/parser + ''; + }); packages.grammar-all = make-grammar-resources { package = system: self.packages.${system}.grammar; }; From 438c12b8c27fac44e20057c1c180d8045bf17d35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 31 Oct 2022 02:20:59 +0100 Subject: [PATCH 022/105] Full blown grammar build --- .gitignore | 2 + flake.nix | 51 +++++++++++------- .../libtree-sitter-smithyql.dylib | Bin 51536 -> 51536 bytes .../libtree-sitter-smithyql.dylib | Bin 17096 -> 17096 bytes .../linux-aarch64/libtree-sitter-smithyql.so | Bin 70264 -> 70080 bytes .../linux-x86_64/libtree-sitter-smithyql.so | Bin 20136 -> 20008 bytes 6 files changed, 33 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index 8b3cf0eb..84636c55 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,5 @@ tree-sitter-smithyql/*.wasm tree-sitter-smithyql/src tree-sitter-smithyql/bindings smithyql-log.txt + +result diff --git a/flake.nix b/flake.nix index 75c7fb2c..31ae5c43 100644 --- a/flake.nix +++ b/flake.nix @@ -15,20 +15,21 @@ }; # begin library code - rename-grammar = grammar: - let inherit (grammar) pname; in - pkgs.stdenv.mkDerivation { - inherit pname; - inherit (grammar) version; - buildCommand = - if pkgs.stdenv.isDarwin then '' + rename-grammar = { system, lib, stdenv, libcxxabi, libcxx, grammar, library-name }: + stdenv.mkDerivation { + inherit (grammar) pname version; + src = grammar; + buildPhase = + if stdenv.isDarwin then '' + install_name_tool -id lib${library-name}.dylib parser + install_name_tool -change ${libcxxabi}/lib/libc++abi.1.dylib @loader_path/libc++abi.1.dylib parser + install_name_tool -change ${libcxx}/lib/libc++.1.0.dylib @loader_path/libc++.1.0.dylib parser + '' else "true"; + installPhase = + let suffix = (lib.systems.elaborate system).extensions.sharedLibrary; in + '' mkdir -p $out/lib - cp ${grammar}/parser $out/lib/lib${pname}.dylib - chmod +w $out/lib/lib${pname}.dylib - install_name_tool -id lib${pname}.dylib $out/lib/lib${pname}.dylib - '' else '' - mkdir -p $out/lib - cp ${grammar}/parser $out/lib/lib${pname}.so + cp parser $out/lib/lib${library-name}${suffix} ''; }; @@ -64,22 +65,32 @@ pkgs.tree-sitter ]; }; - packages.grammar = rename-grammar (pkgs.stdenv.mkDerivation { - pname = "tree-sitter-smithyql"; + packages.grammar-generated = pkgs.stdenv.mkDerivation { + pname = "tree-sitter-smithyql-generated"; version = "0.0.0"; src = ./tree-sitter-smithyql; buildInputs = [ pkgs.tree-sitter pkgs.nodejs ]; buildPhase = '' tree-sitter generate - cc src/parser.c -o parser -Isrc -shared ''; installPhase = '' - mkdir -p $out - cp parser $out/parser + cp -r . $out ''; - }); + }; + packages.grammar = + let base = self.packages.${system}.grammar-generated; in + pkgs.callPackage "${nixpkgs}/pkgs/development/tools/parsing/tree-sitter/grammar.nix" { } { + language = "smithyql"; + inherit (base) version; + source = base; + }; packages.grammar-all = make-grammar-resources { - package = system: self.packages.${system}.grammar; + package = system: + let pkgs = import nixpkgs { inherit system; }; in + pkgs.callPackage rename-grammar { + grammar = self.packages.${system}.grammar; + library-name = "tree-sitter-smithyql"; + }; }; } ); diff --git a/modules/parser/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib b/modules/parser/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib index 443b691ec7e65a1d308b9a929cf41626091a39ce..26ca1db37192ea8fa005f600173f397974746caa 100644 GIT binary patch delta 521 zcmcaGiTT1LX3_J%-u~lZU|?hb0yZEP1mX)DMc*?qW=v*fUL6aOVq|d0$xlp4Es8Hl zEXmN%$xKSt)=o^y)HBpesRZ&E7=UIlSOBpE5HkTW9(_Pf1`utV=Q6L3-@GHaA*Nm% zsDlsaiX+Kj%?!pMKG2{~`4GM*lwVQ`;e(WcL&;TtHQ1?X51KcNyV%^(8he}VGVKzvr9TmwYj z70Q1B<%dD}0!<)!RR#tYAjJ<9+yM;%DIg!nWd=z@!RE+=sf?2k9J;0OVdATub#se- zHPtT58Wp^6UEQB^9!=l0mT{skz10hI4h z4rBnqdLRa=?}G5_8BRe3dY}sKLHR5dKn4)J0b-DbH&8wk(6JzXLM2$5K?utK0_CfK z_^d#=28g^fl>Y+C4}tOpnn3c(3=BZC82EvLJD?#T0ptU@Km-8_o1+h=GEUxi=#GNO z0-H%oWSIQ66dIisjo7+ZU8{H75$)LhAM@(Q|-B|Y!vloVmiUJIf+S)F%~EZ6k}v?$jMJk zNiB*mNG!?F&&f_=nCIg7J&85t%c{fiG z+@M#l4b;I0v}%DMSTln$hz~UAfINin3FSMeLiov0zJeNrUjgL@K>2-8{sJg}5tJ{W z4pF}m%8!EZ>lw~K1rneN9zgjIp!|1G{sj#n0|;1vjs-a|Koi0jf$~2<`D!3OD^Sh= rBJT?2e}MACpnL@*kUY>=EI^7MC^!Kc0#ZOekPC_$7}%WXn92wMRq#0+ delta 354 zcmX@n%6OucQS|(;xBu7~7#Nuu7#P@qm=}mOHi~*PF);{iPGVAH-28)i2JhqxECrh< z2yW1;*96M*F)}bL5Ck%Szz~S}m>3ui$b-2I?ohsiDuka1VYOck%tOsI{`B4ylJ;N!eKmt_3Jt+SHl>Y|Gzn}qR009%wu^QPybVVo?r?PmN;-y$pJp=0v zK34j{$EqHc5yt>7ELSsA$t-@azc~w@D>o{TDFx^DEC1Jx05(shYK$=tIB`5XYOknY zTPR}O^kswOw86v#uj4ThG}eo_Q7qy-OYAU;WWs=l4x`dAL*kNg=H($r-4IZ{-FJa6vYUeVQ-tmy0SK5?|7x23bMeOqPQsm9Zrd$zQ+byoGB zYCO@|R^8D)&{;W9wF&BO+E%`$JhBN~R=~|fuV-({=@wiDjKBIR*?As;$AA)<9Qh2U z#b95cO!MJ!-;1%HT%}0kd=U>L4?j{vL_D!Z*{33!VtSQQRBN0ek7;~7r0i=o-Y};c zjB9)b_-A`au9K*i7^1!HL(qG63E zaY&~%KD}0TbXMcVVa3xL4?A3iWxdx5nK)oH9x<#I5NEwsv{=)|QCq6<1oE)B=Cy(m zO`8-PS{g!|n5MlTqFzhHvrQfsz1fy%^#*)nXqylhfm{GGiKIu|0x}6?3dx}0rX|we zfQXr9a9Hy`D_+XB>eFaDs%hB9%)FMx7ya74GbV-xnirm!rAo9Q>4q0zlTr@4;D2{HaxaPCO zlo<%MB8e=jz}T4JJ}Wed?qZturil719|dk)?D9i2_yQq{x`bvwEk=CS<{9+XqiIb{ z?MaQ7ZWQhQkGMxX@K+SAVC>xEGZR!+j_&J`OUmA6q&qZCFdi&7M&BuYV)aVW!3MxhKs8G{l8C4{7ycvN?o zmOFKpM$28+03$f^w2o_0&Ws_-G($<0hs4O7C9cj@i`ltIio8%nQv`=`tSLe%A}IiC zQBMKZiZTVzFv=7$qbO5v#+005lc>0fCB5bp%Je$ZD9>O?lU|CGPhaSE950dwH2H%? zat(98f)0BD6_>HZEX-m#3gjU#!VeM_u!9i~AFndf4@JrRJG@;C%-012SjX8II9FWU znXls!v0>pwqa;i0TX-*+Kocql<$cZzKV7@>yuqv79Rqwia@Z)EDL*Qo8&B~fRH)bW zWqM2Yisv%w^+w}ryA`a z+&18Er@RL0l=@@_8ErR6eGncvTgp!Ycihp6C41#3klAJuKkNEg%9VY7ihYP-MHQ4{ zC2an1qlpR{7W!zD{U|&*9U}fQhLiG>$HEjoSb?|-f7-Qy@*B80%VU&eV(u3m5-f5` zLen5S*DbgmdrDG+xRd=8IVG`kjxk&h;CAdO`OG-bY2ScXa~OSUoZVlTS^$HmE^fMlpC#ZZv*P@# z{0J{Oe~Yj1cv-|PvsoNUiw7LN2Rb4-2hlb6K+=*?5Tkm|ah!T!V)fWp9L7bCaA+i- z^*9e!l+GY-XYkMSjK#0&!$ivor+y)Gb7}XoQh2@9BFYOx+u^AIR-=ilj&ggQyqFFB zKCX(>lAF9Ze@&7#HFk8^?;dSDZXfHCyG=fP<5!bE$9LQI-b1?%?6LP8tg&ro+piyd z%idFqu(sw9pys}AyS1^ax#K9akF|BRF&qB+nO$@E;I0F2ye4<}`5O7YpNHhPeqJJe zf@9+MM&XSg{k)RHVRD&F=kRIXF7M>>3V#VM_L3}FkjJZh5tJjcK96tp#ZipQ5fJ_K z)d}Rt+m3Y%Q*TTLmxFZz#e}SP#8DJSDwpo1$mioC|kwsIT{zJRa)5Aq224gdfE delta 4269 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 From eae7d8b874744efc2f2d5ef07ee5065d482c92b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 31 Oct 2022 03:08:44 +0100 Subject: [PATCH 023/105] Move library code to ts4s --- flake.lock | 27 +++++- flake.nix | 80 +++++------------- .../linux-aarch64/libtree-sitter-smithyql.so | Bin 70080 -> 70080 bytes .../linux-x86_64/libtree-sitter-smithyql.so | Bin 20008 -> 20008 bytes 4 files changed, 48 insertions(+), 59 deletions(-) diff --git a/flake.lock b/flake.lock index a8c3a9a2..89ab7c95 100644 --- a/flake.lock +++ b/flake.lock @@ -33,7 +33,32 @@ "root": { "inputs": { "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs", + "treesitter4s": "treesitter4s" + } + }, + "treesitter4s": { + "inputs": { + "flake-utils": [ + "flake-utils" + ], + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1667181684, + "narHash": "sha256-ud9adK2h26/O7jzpMdd7jCCyg4qevk99zSjWuJ40w9g=", + "owner": "polyvariant", + "repo": "treesitter4s", + "rev": "cb1b99780cee5ede88194a4795e0e22cd49355df", + "type": "github" + }, + "original": { + "owner": "polyvariant", + "ref": "native", + "repo": "treesitter4s", + "type": "github" } } }, diff --git a/flake.nix b/flake.nix index 31ae5c43..5de0c7b1 100644 --- a/flake.nix +++ b/flake.nix @@ -2,9 +2,12 @@ inputs = { nixpkgs.url = "github:nixos/nixpkgs"; flake-utils.url = "github:numtide/flake-utils"; + treesitter4s.url = "github:polyvariant/treesitter4s/native"; + treesitter4s.inputs.nixpkgs.follows = "nixpkgs"; + treesitter4s.inputs.flake-utils.follows = "flake-utils"; }; - outputs = { self, nixpkgs, flake-utils, ... }@inputs: + outputs = { self, nixpkgs, flake-utils, treesitter4s, ... }@inputs: flake-utils.lib.eachDefaultSystem ( system: let @@ -13,46 +16,7 @@ inherit system; overlays = [ jvm ]; }; - - # begin library code - rename-grammar = { system, lib, stdenv, libcxxabi, libcxx, grammar, library-name }: - stdenv.mkDerivation { - inherit (grammar) pname version; - src = grammar; - buildPhase = - if stdenv.isDarwin then '' - install_name_tool -id lib${library-name}.dylib parser - install_name_tool -change ${libcxxabi}/lib/libc++abi.1.dylib @loader_path/libc++abi.1.dylib parser - install_name_tool -change ${libcxx}/lib/libc++.1.0.dylib @loader_path/libc++.1.0.dylib parser - '' else "true"; - installPhase = - let suffix = (lib.systems.elaborate system).extensions.sharedLibrary; in - '' - mkdir -p $out/lib - cp parser $out/lib/lib${library-name}${suffix} - ''; - }; - - make-grammar-resources = - { package - , system-mappings ? { - "darwin-x86_64" = "x86_64-darwin"; - "darwin-aarch64" = "aarch64-darwin"; - "linux-x86_64" = "x86_64-linux"; - "linux-aarch64" = "aarch64-linux"; - } - }: pkgs.linkFarm "${(package system).name}-all" (pkgs.lib.mapAttrsToList - (jna-system: nix-system: - let - suffix = (pkgs.lib.systems.elaborate nix-system).extensions.sharedLibrary; - pkg = package nix-system; - in - { - name = "${jna-system}"; - path = "${pkg}/lib"; - }) - system-mappings); - # end library code + ts-lib = treesitter4s.lib; in { devShells.default = pkgs.mkShell { @@ -65,31 +29,31 @@ pkgs.tree-sitter ]; }; - packages.grammar-generated = pkgs.stdenv.mkDerivation { - pname = "tree-sitter-smithyql-generated"; - version = "0.0.0"; - src = ./tree-sitter-smithyql; - buildInputs = [ pkgs.tree-sitter pkgs.nodejs ]; - buildPhase = '' - tree-sitter generate - ''; - installPhase = '' - cp -r . $out - ''; - }; packages.grammar = - let base = self.packages.${system}.grammar-generated; in + let base = pkgs.stdenv.mkDerivation { + pname = "tree-sitter-smithyql-generated"; + version = "0.0.0"; + src = ./tree-sitter-smithyql; + buildInputs = [ pkgs.tree-sitter pkgs.nodejs ]; + buildPhase = '' + tree-sitter generate + ''; + installPhase = '' + cp -r . $out + ''; + }; in pkgs.callPackage "${nixpkgs}/pkgs/development/tools/parsing/tree-sitter/grammar.nix" { } { - language = "smithyql"; + language = "tree-sitter-smithyql"; inherit (base) version; source = base; }; - packages.grammar-all = make-grammar-resources { + packages.grammar-all = pkgs.callPackage ts-lib.make-grammar-resources { package = system: let pkgs = import nixpkgs { inherit system; }; in - pkgs.callPackage rename-grammar { + pkgs.callPackage ts-lib.rename-grammar { + pname = "tree-sitter-smithyql"; grammar = self.packages.${system}.grammar; - library-name = "tree-sitter-smithyql"; + rename-dependencies = true; }; }; } diff --git a/modules/parser/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so b/modules/parser/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so index 37892c65994b6371978ed91aaa6dd3f00e410042..b84838877d1df60a98f893f5e4e2a4f21aa14ade 100644 GIT binary patch delta 236 zcmXxeKM%n`00r=Sy`vhHXhgJ$L@X5(n|_2diS0~mMzJ)+_LKctNc^A_DB^YEUcW@a!*6`)@ z*|F>_`9}X05i)vq;K}-{0yk*CY5-r3(SSH^aHZgC%5a6Nx+#?4#Z{y_5o#XWmX=ne x2H~ee3Zpc9RW;EtT=rXcRnJ7r@Dh4z6;mV>DvJ4kWGg54Ax{qSQ!j@hdjkc-HSYib delta 242 zcmX@GnB~A?mJI?-j1HRxnK+mxtFj0)GHfM>BE=3>5it4YKYvDp$(sM=8KpLR{#R#YbeLMmsLvR%bs^(* zW=4nUl`M?c8KtHNvNDP@8h|KKW_E^v>5U-1z+^!tQD#mChwU3#8S~i~v!*NZFzRzk xu|Q0hnjXo+XwGQ>h} t Date: Mon, 31 Oct 2022 03:41:52 +0100 Subject: [PATCH 024/105] More work in nix, update things --- flake.lock | 18 ++++++------- flake.nix | 24 +++++++++++------- .../libtree-sitter-smithyql.dylib | Bin 51536 -> 35024 bytes .../libtree-sitter-smithyql.dylib | Bin 17096 -> 17096 bytes .../linux-aarch64/libtree-sitter-smithyql.so | Bin 70080 -> 70080 bytes .../libtree-sitter-smithyql.so | Bin 20008 -> 20008 bytes update-libs.sh | 4 +-- 7 files changed, 25 insertions(+), 21 deletions(-) rename modules/parser/src/main/resources/{darwin-x86_64 => darwin-x86-64}/libtree-sitter-smithyql.dylib (99%) rename modules/parser/src/main/resources/{linux-x86_64 => linux-x86-64}/libtree-sitter-smithyql.so (99%) diff --git a/flake.lock b/flake.lock index 89ab7c95..112a5b0d 100644 --- a/flake.lock +++ b/flake.lock @@ -2,11 +2,11 @@ "nodes": { "flake-utils": { "locked": { - "lastModified": 1659877975, - "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "lastModified": 1667077288, + "narHash": "sha256-bdC8sFNDpT0HK74u9fUkpbf1MEzVYJ+ka7NXCdgBoaA=", "owner": "numtide", "repo": "flake-utils", - "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "rev": "6ee9ebb6b1ee695d2cacc4faa053a7b9baa76817", "type": "github" }, "original": { @@ -17,11 +17,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1665856037, - "narHash": "sha256-/RvIWnGKdTSoIq5Xc2HwPIL0TzRslzU6Rqk4Img6UNg=", + "lastModified": 1667177142, + "narHash": "sha256-I6vgFE8FxcOOQC3aaEJJRQ7LYeZiB0KyR1pEc9DNJfU=", "owner": "nixos", "repo": "nixpkgs", - "rev": "c95ebc5125ffffcd431df0ad8620f0926b8125b8", + "rev": "b99b28431cf447396d601f4d45de221d1b52578e", "type": "github" }, "original": { @@ -47,11 +47,11 @@ ] }, "locked": { - "lastModified": 1667181684, - "narHash": "sha256-ud9adK2h26/O7jzpMdd7jCCyg4qevk99zSjWuJ40w9g=", + "lastModified": 1667183672, + "narHash": "sha256-QShhK+bKXC9lImwAQYXuXIWcgCKEC9ZFnHyZ+hxH6Qc=", "owner": "polyvariant", "repo": "treesitter4s", - "rev": "cb1b99780cee5ede88194a4795e0e22cd49355df", + "rev": "d1d5df4d5eca3847b90f245779dcc76ee1eed605", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 5de0c7b1..d4721f7f 100644 --- a/flake.nix +++ b/flake.nix @@ -47,15 +47,21 @@ inherit (base) version; source = base; }; - packages.grammar-all = pkgs.callPackage ts-lib.make-grammar-resources { - package = system: - let pkgs = import nixpkgs { inherit system; }; in - pkgs.callPackage ts-lib.rename-grammar { - pname = "tree-sitter-smithyql"; - grammar = self.packages.${system}.grammar; - rename-dependencies = true; - }; - }; + packages.grammar-all = + pkgs.linkFarm "grammar-all" [ + { + name = "modules/parser/src/main/resources"; + path = pkgs.callPackage ts-lib.make-grammar-resources { + package = system: + let pkgs = import nixpkgs { inherit system; }; in + pkgs.callPackage ts-lib.rename-grammar { + pname = "tree-sitter-smithyql"; + grammar = self.packages.${system}.grammar; + rename-dependencies = true; + }; + }; + } + ]; } ); } diff --git a/modules/parser/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib b/modules/parser/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib index 26ca1db37192ea8fa005f600173f397974746caa..0f4d0d482bf912751b3534eb3b15aacf12225d6c 100644 GIT binary patch delta 1424 zcmYk6ZAep59LCSRyXhjUO7~7&8&@J< zbz8H1zN~z&-Qn==weQ*M+g6j4>u74K(fms3JnA=6%Yt|tUyr727Id_omP-haC?95r zBej;96X}Iz({FkmU97$Km)Gahl*W%t&Rsd2zu*t6T$_qGD|0#bgM*;z;QnE-6IAlJ z-*3}Kl-2$(klFYj^1$U_0ayf|KEIQ?upjNM=h7yu7}C&2UI zEieiWfUm*t;21a_kurgnIQ@*xhLH|tfljartONP$V~j7rSPOjdgaPP-pjh_^w79Y3 zy4G{ijUO(7;z_O+QcgNnbVV2V4J=YZS4K+cB+^(!HHi*PKaQJS*A!uqnN`ptJGIav zD?VtEnPbo*I~SovhWs~Sh%h~c7NL3vEyDE;TBJ*%o7Hcy8X-=B7NJhp^*Cx$sb~~K zBkZYcEew%*g)W**Uc?qIx_>|_oXVsDak{gTOgTl}owCb}`F zZ&iELDzhZ|BBV>I7Lw;{>-$velLqgjl8x7nELl0H@?&hDoObU0vY#bCaw|Sv+Hz=Q z=%(iESJkp-$vx{PY<|%j_`Tt5S7T!5MsMcbw`Fd%xMy_bnLFLBr!R*}3nq@8G(5CT z`J7l$-@tnZ54y^)dG2^Z N7dp(Lu=C**|2N&6wJ5|TGB1M!+g;uhsbQr;T(Af>lU9s)bGR|y z6d6({lC`4+7<1Mc$)?mWkH}^Uuq&j+6irc$%O>l;>KaDq#&epc3#BVE%b0nzlBP_b z?nhDsp)-Sw3ME%1W#L0-Sg2=bRF7gBMUtPfP-5OaLorv{LzP$(*b4O+i=*HJna0DY zGe5R3t|(eiURYGPD86)qd%b&I($@9m?)izX(h}#w>cR@Q;Z|47@iR7_W;iJLa=Z?2 z5foheI~hAT*4L-Lw)uwCNB=G^#n(Q|I&%`eY9|fjv9HwVNnKU4jk?snmI+o?2@WIw zK^NMxLoj=bU?Ug+wXGuG1U7?ewa9n5j6OBP^BK~KFPH=_0aL)G;0kahm;q*jSztDp z1LlD)uvpN;HX>04)`Iom9`G=D2D}RT!EUez90W(eAehktT1QD28xm1q0+Fqk4Z}Y?*U~uqp{0RZprw&KZAeH*J%yIedJ8QbHUKRx zrqaXmf(3AL7_@YD6xU;Dl1@P_4H}LQXE{hn>#H#^!LALOTGc C&=C;; diff --git a/modules/parser/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so b/modules/parser/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so index b84838877d1df60a98f893f5e4e2a4f21aa14ade..94f56d595fbae405d3ecfe9b7bd48139775c7b73 100644 GIT binary patch delta 87 zcmX@GnB~A?mJNx_3Kcn~MoDQFS;-luhE-J=7A8f-RTXSjodi77cbCX*YP diff --git a/modules/parser/src/main/resources/linux-x86_64/libtree-sitter-smithyql.so b/modules/parser/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so similarity index 99% rename from modules/parser/src/main/resources/linux-x86_64/libtree-sitter-smithyql.so rename to modules/parser/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so index 9fdf405b5c59735a2cc68f08fdccf1ea99c1169d..6ab600af3c4637da8d926976798d5f94bac9ea8c 100644 GIT binary patch delta 84 zcmZ26hjGOm#tmF73h5Rprb&4jmbn>*#%3lJhUU3hmC5GDhH1r_mWgJDxs$b6F3QUd6GSkvi3=%hIvh4Q+0H9$Up#T5? delta 84 zcmZ26hjGOm#tmF73dv?^rbfACNo58p7DXw>MLESe#buS|WhUvy1-ZHA1(UT{ Date: Mon, 31 Oct 2022 03:59:28 +0100 Subject: [PATCH 025/105] cleanup --- flake.nix | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index d4721f7f..f1e97d5d 100644 --- a/flake.nix +++ b/flake.nix @@ -8,6 +8,8 @@ }; outputs = { self, nixpkgs, flake-utils, treesitter4s, ... }@inputs: + let + ts-lib = treesitter4s.lib; in flake-utils.lib.eachDefaultSystem ( system: let @@ -16,7 +18,6 @@ inherit system; overlays = [ jvm ]; }; - ts-lib = treesitter4s.lib; in { devShells.default = pkgs.mkShell { From 7cc37133739053ff9663fb328c4acce9211d617f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 29 Oct 2024 20:36:46 +0100 Subject: [PATCH 026/105] use an existing snapshot instead --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 5c31d8f8..b35accec 100644 --- a/build.sbt +++ b/build.sbt @@ -117,7 +117,7 @@ lazy val parser = module("parser") "io.circe" %% "circe-generic" % "0.14.10" % Test, "io.circe" %% "circe-parser" % "0.14.10" % Test, "co.fs2" %% "fs2-io" % "3.11.0" % Test, - "org.polyvariant.treesitter4s" %% "core" % "0.3-b944a3d-SNAPSHOT", + "org.polyvariant.treesitter4s" %% "core" % "0.3-8c8ea67-SNAPSHOT", ) ) .dependsOn( From 3b5af71606fee43c1f56050fe79398282119a1f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Wed, 30 Oct 2024 01:19:27 +0100 Subject: [PATCH 027/105] new age of treesitter4s --- .github/workflows/ci.yml | 13 +++++ build.sbt | 2 +- flake.lock | 39 +++------------ flake.nix | 45 +++++------------- .../libtree-sitter-smithyql.dylib | Bin 35024 -> 33264 bytes .../libtree-sitter-smithyql.dylib | Bin 17096 -> 16456 bytes .../linux-aarch64/libtree-sitter-smithyql.so | Bin 70080 -> 67368 bytes .../linux-x86-64/libtree-sitter-smithyql.so | Bin 20008 -> 18304 bytes .../parser/ParserTreeSitterDemo.scala | 4 +- update-libs.sh | 24 ++++++++-- 10 files changed, 55 insertions(+), 72 deletions(-) mode change 100644 => 100755 modules/parser/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib mode change 100644 => 100755 modules/parser/src/main/resources/darwin-x86-64/libtree-sitter-smithyql.dylib mode change 100644 => 100755 modules/parser/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so mode change 100644 => 100755 modules/parser/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2267fc96..c818c670 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -57,3 +57,16 @@ jobs: - name: Show extension test logs if: job.status == 'failure' run: cat vscode-extension/fixture/smithyql-log.txt | tail --lines 1000 + + build-parser: + name: "Build parser" + strategy: + matrix: + os: [ubuntu-latest, macos-latest, macos-13] + runs-on: ${{matrix.os}} + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4.1.1 + - name: Parser tests + # intentionally not setting up nix + run: sbt parser/run diff --git a/build.sbt b/build.sbt index b35accec..2cb7e6f6 100644 --- a/build.sbt +++ b/build.sbt @@ -117,7 +117,7 @@ lazy val parser = module("parser") "io.circe" %% "circe-generic" % "0.14.10" % Test, "io.circe" %% "circe-parser" % "0.14.10" % Test, "co.fs2" %% "fs2-io" % "3.11.0" % Test, - "org.polyvariant.treesitter4s" %% "core" % "0.3-8c8ea67-SNAPSHOT", + "org.polyvariant.treesitter4s" %% "core" % "0.3-1ab76c4-SNAPSHOT", ) ) .dependsOn( diff --git a/flake.lock b/flake.lock index 02f68d4c..acc6cf74 100644 --- a/flake.lock +++ b/flake.lock @@ -5,11 +5,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1710146030, - "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "lastModified": 1726560853, + "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a", "type": "github" }, "original": { @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1713905099, - "narHash": "sha256-6+M6qG/7PmDxYeXdutxS6gcS2MQR50ilEaIcNwnAmto=", + "lastModified": 1730247135, + "narHash": "sha256-YaZZlvZj9isN2i8l24A4/7TT89fvpX11nVn2dusl2MM=", "owner": "nixos", "repo": "nixpkgs", - "rev": "0e7e9561350c68125627534b7c0f2d3cd5d32151", + "rev": "ccd7e10e004a6e93486c1dd536f89e85d482d685", "type": "github" }, "original": { @@ -36,32 +36,7 @@ "root": { "inputs": { "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs", - "treesitter4s": "treesitter4s" - } - }, - "treesitter4s": { - "inputs": { - "flake-utils": [ - "flake-utils" - ], - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1667183672, - "narHash": "sha256-QShhK+bKXC9lImwAQYXuXIWcgCKEC9ZFnHyZ+hxH6Qc=", - "owner": "polyvariant", - "repo": "treesitter4s", - "rev": "d1d5df4d5eca3847b90f245779dcc76ee1eed605", - "type": "github" - }, - "original": { - "owner": "polyvariant", - "ref": "native", - "repo": "treesitter4s", - "type": "github" + "nixpkgs": "nixpkgs" } }, "systems": { diff --git a/flake.nix b/flake.nix index dac38046..da251984 100644 --- a/flake.nix +++ b/flake.nix @@ -2,14 +2,9 @@ inputs = { nixpkgs.url = "github:nixos/nixpkgs"; flake-utils.url = "github:numtide/flake-utils"; - treesitter4s.url = "github:polyvariant/treesitter4s/native"; - treesitter4s.inputs.nixpkgs.follows = "nixpkgs"; - treesitter4s.inputs.flake-utils.follows = "flake-utils"; }; - outputs = { self, nixpkgs, flake-utils, treesitter4s, ... }: - let - ts-lib = treesitter4s.lib; in + outputs = { nixpkgs, flake-utils, ... }: flake-utils.lib.eachDefaultSystem ( system: let @@ -28,39 +23,23 @@ pkgs.coursier ] ++ pkgs.lib.optionals pkgs.stdenv.isLinux [ pkgs.xvfb-run ]; }; - packages.grammar = - let base = pkgs.stdenv.mkDerivation { - pname = "tree-sitter-smithyql-generated"; - version = "0.0.0"; + packages.tree-sitter-smithyql = + pkgs.stdenv.mkDerivation { + name = "tree-sitter-smithyql"; src = ./tree-sitter-smithyql; - buildInputs = [ pkgs.tree-sitter pkgs.nodejs ]; + buildInputs = [pkgs.tree-sitter pkgs.nodejs]; buildPhase = '' + ls -ll tree-sitter generate + make + ls -ll ''; - installPhase = '' - cp -r . $out + installPhase = if system == "x86_64-darwin" || system == "aarch64-darwin" then '' + cp libtree-sitter-smithyql.dylib $out + '' else '' + cp libtree-sitter-smithyql.so $out ''; - }; in - pkgs.callPackage "${nixpkgs}/pkgs/development/tools/parsing/tree-sitter/grammar.nix" { } { - language = "tree-sitter-smithyql"; - inherit (base) version; - source = base; }; - packages.grammar-all = - pkgs.linkFarm "grammar-all" [ - { - name = "modules/parser/src/main/resources"; - path = pkgs.callPackage ts-lib.make-grammar-resources { - package = system: - let pkgs = import nixpkgs { inherit system; }; in - pkgs.callPackage ts-lib.rename-grammar { - pname = "tree-sitter-smithyql"; - grammar = self.packages.${system}.grammar; - rename-dependencies = true; - }; - }; - } - ]; } ); } diff --git a/modules/parser/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib b/modules/parser/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib old mode 100644 new mode 100755 index 0f4d0d482bf912751b3534eb3b15aacf12225d6c..6ee131efecd19b6e39c21d1dfa22bcea5c2057d8 GIT binary patch literal 33264 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 UUmSgLepf^N>09-p_shEe4I0LP^8f$< literal 35024 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 literal 17096 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 literal 70080 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 diff --git a/modules/parser/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so b/modules/parser/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so old mode 100644 new mode 100755 index 6ab600af3c4637da8d926976798d5f94bac9ea8c..824d401bd77413c9bdcaeed1631bff08b4461747 GIT binary patch literal 18304 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 literal 20008 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 nc>JN~Q!cx*P@j7$RlLJ+&iS$~Ez3u Date: Wed, 30 Oct 2024 01:22:19 +0100 Subject: [PATCH 028/105] setup sbt --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c818c670..d5bb2a5f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -67,6 +67,9 @@ jobs: timeout-minutes: 10 steps: - uses: actions/checkout@v4.1.1 + - uses: coursier/setup-action@v1 + with: + apps: sbt - name: Parser tests # intentionally not setting up nix run: sbt parser/run From 0949bf1ea3d957ac8150a57fe2e75cd25574b6a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Wed, 30 Oct 2024 01:23:01 +0100 Subject: [PATCH 029/105] use adoptium 21 --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d5bb2a5f..628dbbe7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -70,6 +70,7 @@ jobs: - uses: coursier/setup-action@v1 with: apps: sbt + jvm: adoptium:1.21 - name: Parser tests # intentionally not setting up nix run: sbt parser/run From 7ea8ce3a97ec274ebf43a3382c857e12e83c07b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Wed, 30 Oct 2024 17:01:35 +0100 Subject: [PATCH 030/105] updates --- build.sbt | 2 +- flake.nix | 2 -- .../smithyql/parser/ParserTreeSitterDemo.scala | 2 +- .../parser/SmithyQLLanguageBindings.java | 18 ------------------ 4 files changed, 2 insertions(+), 22 deletions(-) delete mode 100644 modules/parser/src/main/scala/playground/smithyql/parser/SmithyQLLanguageBindings.java diff --git a/build.sbt b/build.sbt index 2cb7e6f6..f270e95b 100644 --- a/build.sbt +++ b/build.sbt @@ -117,7 +117,7 @@ lazy val parser = module("parser") "io.circe" %% "circe-generic" % "0.14.10" % Test, "io.circe" %% "circe-parser" % "0.14.10" % Test, "co.fs2" %% "fs2-io" % "3.11.0" % Test, - "org.polyvariant.treesitter4s" %% "core" % "0.3-1ab76c4-SNAPSHOT", + "org.polyvariant.treesitter4s" %% "core" % "0.3-4028f07-SNAPSHOT", ) ) .dependsOn( diff --git a/flake.nix b/flake.nix index da251984..a37386c1 100644 --- a/flake.nix +++ b/flake.nix @@ -29,10 +29,8 @@ src = ./tree-sitter-smithyql; buildInputs = [pkgs.tree-sitter pkgs.nodejs]; buildPhase = '' - ls -ll tree-sitter generate make - ls -ll ''; installPhase = if system == "x86_64-darwin" || system == "aarch64-darwin" then '' cp libtree-sitter-smithyql.dylib $out diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala index 8a950a9d..b9263527 100644 --- a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala +++ b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala @@ -5,7 +5,7 @@ import org.polyvariant.treesitter4s.TreeSitterAPI object ParserTreeSitterDemo extends App { def parse(s: String) = { - val p = TreeSitterAPI.make(_.Language(SmithyQLLanguageBindings.SmithyQL)) + val p = TreeSitterAPI.make("smithyql") val tree = p.parse(s) println(tree.rootNode.get.fields.keySet) } diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/SmithyQLLanguageBindings.java b/modules/parser/src/main/scala/playground/smithyql/parser/SmithyQLLanguageBindings.java deleted file mode 100644 index 6a0d7ebc..00000000 --- a/modules/parser/src/main/scala/playground/smithyql/parser/SmithyQLLanguageBindings.java +++ /dev/null @@ -1,18 +0,0 @@ -package playground.smithyql; - -import com.sun.jna.Library; -import com.sun.jna.NativeLibrary; -import com.sun.jna.Native; -import org.polyvariant.treesitter4s.Language; - -public class SmithyQLLanguageBindings { - - private static interface Bindings extends Library { - Language tree_sitter_smithyql(); - } - - private static final Bindings LIBRARY = Language.loadLanguageLibrary("smithyql", Bindings.class); - - public static final Language SmithyQL = LIBRARY.tree_sitter_smithyql(); - -} From bf9f6d412c04068ee7b54f8b31e5c8cba1f5ad68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Fri, 1 Nov 2024 01:23:40 +0100 Subject: [PATCH 031/105] update build settings --- .gitignore | 4 -- .../parser/ParserTreeSitterDemo.scala | 14 +++-- tree-sitter-smithyql/.gitattributes | 11 ++++ tree-sitter-smithyql/.gitignore | 52 +++++++++++++++++++ 4 files changed, 73 insertions(+), 8 deletions(-) create mode 100644 tree-sitter-smithyql/.gitattributes create mode 100644 tree-sitter-smithyql/.gitignore diff --git a/.gitignore b/.gitignore index 288a0053..afc0453f 100644 --- a/.gitignore +++ b/.gitignore @@ -6,10 +6,6 @@ .smithy.lsp.log .sbt **/node_modules -tree-sitter-smithyql/build -tree-sitter-smithyql/*.wasm -tree-sitter-smithyql/src -tree-sitter-smithyql/bindings smithyql-log.txt result diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala index b9263527..f76564c8 100644 --- a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala +++ b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala @@ -10,9 +10,15 @@ object ParserTreeSitterDemo extends App { println(tree.rootNode.get.fields.keySet) } - println( - parse( - "use service a.b#C\n helalsdfhl //a\n{ hello = 42, foo = 50, x = { y = \"hello\"} , z = null, aa = [10, true, false, null]}" - ) + parse( + """use service a.b#C + |helalsdfhl //a + |{ + | hello = 42, + | foo = 50, + | x = { y = "hello"}, + | z = null, + | aa = [10, true, false, null] + |}""".stripMargin ) } diff --git a/tree-sitter-smithyql/.gitattributes b/tree-sitter-smithyql/.gitattributes new file mode 100644 index 00000000..4cb10583 --- /dev/null +++ b/tree-sitter-smithyql/.gitattributes @@ -0,0 +1,11 @@ +* text=auto eol=lf + +src/*.json linguist-generated +src/parser.c linguist-generated +src/tree_sitter/* linguist-generated + +bindings/** linguist-generated +binding.gyp linguist-generated +setup.py linguist-generated +Makefile linguist-generated +Package.swift linguist-generated diff --git a/tree-sitter-smithyql/.gitignore b/tree-sitter-smithyql/.gitignore new file mode 100644 index 00000000..7078afa6 --- /dev/null +++ b/tree-sitter-smithyql/.gitignore @@ -0,0 +1,52 @@ +# Rust artifacts +Cargo.lock +target/ + +# Node artifacts +build/ +prebuilds/ +node_modules/ +*.tgz + +# Swift artifacts +.build/ +Package.resolved + +# Go artifacts +go.sum +_obj/ + +# Python artifacts +.venv/ +dist/ +*.egg-info +*.whl + +# C artifacts +*.a +*.so +*.so.* +*.dylib +*.dll +*.pc + +# Example dirs +/examples/*/ + +# Grammar volatiles +*.wasm +*.obj +*.o + +src/ + +.editorconfig +Cargo.toml +Makefile +Package.swift +binding.gyp +bindings/ +go.mod +package.json +pyproject.toml +setup.py From 1cd0977fc6b950540bf0b2a34352fafd6fcbcbff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Fri, 1 Nov 2024 01:24:14 +0100 Subject: [PATCH 032/105] rebuild linux binaries --- .../linux-aarch64/libtree-sitter-smithyql.so | Bin 67368 -> 67368 bytes .../linux-x86-64/libtree-sitter-smithyql.so | Bin 18304 -> 18304 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/modules/parser/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so b/modules/parser/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so index 54b2582e4f44f5a4f45f20ad9071151be0772386..829d269769ab2e7fd3eb8f2f6afcb1f04dbe4664 100755 GIT binary patch delta 51 zcmZ3{$Fic2WkVFRLUwYBSxSy+VsV;rdX8nDQF)Siu}NlfS#hq3xmi(iN^=$S_9|w^ Gb<6 Date: Fri, 1 Nov 2024 01:24:49 +0100 Subject: [PATCH 033/105] move corpus to new location --- tree-sitter-smithyql/{ => test}/corpus/bindings-comma.txt | 0 tree-sitter-smithyql/{ => test}/corpus/bindings-multiple.txt | 0 tree-sitter-smithyql/{ => test}/corpus/bindings.txt | 0 tree-sitter-smithyql/{ => test}/corpus/comment.txt | 0 tree-sitter-smithyql/{ => test}/corpus/empty.txt | 0 tree-sitter-smithyql/{ => test}/corpus/full-of-comments.txt | 0 tree-sitter-smithyql/{ => test}/corpus/just-query.txt | 0 tree-sitter-smithyql/{ => test}/corpus/just-use.txt | 0 tree-sitter-smithyql/{ => test}/corpus/service-reference.txt | 0 tree-sitter-smithyql/{ => test}/corpus/statements.txt | 0 tree-sitter-smithyql/{ => test}/corpus/string.txt | 0 tree-sitter-smithyql/{ => test}/corpus/struct-1.txt | 0 tree-sitter-smithyql/{ => test}/corpus/struct-2.txt | 0 tree-sitter-smithyql/{ => test}/corpus/struct-3.txt | 0 14 files changed, 0 insertions(+), 0 deletions(-) rename tree-sitter-smithyql/{ => test}/corpus/bindings-comma.txt (100%) rename tree-sitter-smithyql/{ => test}/corpus/bindings-multiple.txt (100%) rename tree-sitter-smithyql/{ => test}/corpus/bindings.txt (100%) rename tree-sitter-smithyql/{ => test}/corpus/comment.txt (100%) rename tree-sitter-smithyql/{ => test}/corpus/empty.txt (100%) rename tree-sitter-smithyql/{ => test}/corpus/full-of-comments.txt (100%) rename tree-sitter-smithyql/{ => test}/corpus/just-query.txt (100%) rename tree-sitter-smithyql/{ => test}/corpus/just-use.txt (100%) rename tree-sitter-smithyql/{ => test}/corpus/service-reference.txt (100%) rename tree-sitter-smithyql/{ => test}/corpus/statements.txt (100%) rename tree-sitter-smithyql/{ => test}/corpus/string.txt (100%) rename tree-sitter-smithyql/{ => test}/corpus/struct-1.txt (100%) rename tree-sitter-smithyql/{ => test}/corpus/struct-2.txt (100%) rename tree-sitter-smithyql/{ => test}/corpus/struct-3.txt (100%) diff --git a/tree-sitter-smithyql/corpus/bindings-comma.txt b/tree-sitter-smithyql/test/corpus/bindings-comma.txt similarity index 100% rename from tree-sitter-smithyql/corpus/bindings-comma.txt rename to tree-sitter-smithyql/test/corpus/bindings-comma.txt diff --git a/tree-sitter-smithyql/corpus/bindings-multiple.txt b/tree-sitter-smithyql/test/corpus/bindings-multiple.txt similarity index 100% rename from tree-sitter-smithyql/corpus/bindings-multiple.txt rename to tree-sitter-smithyql/test/corpus/bindings-multiple.txt diff --git a/tree-sitter-smithyql/corpus/bindings.txt b/tree-sitter-smithyql/test/corpus/bindings.txt similarity index 100% rename from tree-sitter-smithyql/corpus/bindings.txt rename to tree-sitter-smithyql/test/corpus/bindings.txt diff --git a/tree-sitter-smithyql/corpus/comment.txt b/tree-sitter-smithyql/test/corpus/comment.txt similarity index 100% rename from tree-sitter-smithyql/corpus/comment.txt rename to tree-sitter-smithyql/test/corpus/comment.txt diff --git a/tree-sitter-smithyql/corpus/empty.txt b/tree-sitter-smithyql/test/corpus/empty.txt similarity index 100% rename from tree-sitter-smithyql/corpus/empty.txt rename to tree-sitter-smithyql/test/corpus/empty.txt diff --git a/tree-sitter-smithyql/corpus/full-of-comments.txt b/tree-sitter-smithyql/test/corpus/full-of-comments.txt similarity index 100% rename from tree-sitter-smithyql/corpus/full-of-comments.txt rename to tree-sitter-smithyql/test/corpus/full-of-comments.txt diff --git a/tree-sitter-smithyql/corpus/just-query.txt b/tree-sitter-smithyql/test/corpus/just-query.txt similarity index 100% rename from tree-sitter-smithyql/corpus/just-query.txt rename to tree-sitter-smithyql/test/corpus/just-query.txt diff --git a/tree-sitter-smithyql/corpus/just-use.txt b/tree-sitter-smithyql/test/corpus/just-use.txt similarity index 100% rename from tree-sitter-smithyql/corpus/just-use.txt rename to tree-sitter-smithyql/test/corpus/just-use.txt diff --git a/tree-sitter-smithyql/corpus/service-reference.txt b/tree-sitter-smithyql/test/corpus/service-reference.txt similarity index 100% rename from tree-sitter-smithyql/corpus/service-reference.txt rename to tree-sitter-smithyql/test/corpus/service-reference.txt diff --git a/tree-sitter-smithyql/corpus/statements.txt b/tree-sitter-smithyql/test/corpus/statements.txt similarity index 100% rename from tree-sitter-smithyql/corpus/statements.txt rename to tree-sitter-smithyql/test/corpus/statements.txt diff --git a/tree-sitter-smithyql/corpus/string.txt b/tree-sitter-smithyql/test/corpus/string.txt similarity index 100% rename from tree-sitter-smithyql/corpus/string.txt rename to tree-sitter-smithyql/test/corpus/string.txt diff --git a/tree-sitter-smithyql/corpus/struct-1.txt b/tree-sitter-smithyql/test/corpus/struct-1.txt similarity index 100% rename from tree-sitter-smithyql/corpus/struct-1.txt rename to tree-sitter-smithyql/test/corpus/struct-1.txt diff --git a/tree-sitter-smithyql/corpus/struct-2.txt b/tree-sitter-smithyql/test/corpus/struct-2.txt similarity index 100% rename from tree-sitter-smithyql/corpus/struct-2.txt rename to tree-sitter-smithyql/test/corpus/struct-2.txt diff --git a/tree-sitter-smithyql/corpus/struct-3.txt b/tree-sitter-smithyql/test/corpus/struct-3.txt similarity index 100% rename from tree-sitter-smithyql/corpus/struct-3.txt rename to tree-sitter-smithyql/test/corpus/struct-3.txt From a0fb6e19e8a954580c89c32e2c2e7d96039a4a16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Fri, 1 Nov 2024 03:06:04 +0100 Subject: [PATCH 034/105] downgrade ts so that we have ui support --- build.sbt | 2 +- flake.lock | 7 +- flake.nix | 4 +- .../libtree-sitter-smithyql.dylib | Bin 33264 -> 34384 bytes .../libtree-sitter-smithyql.dylib | Bin 16456 -> 16456 bytes .../linux-aarch64/libtree-sitter-smithyql.so | Bin 67368 -> 67368 bytes .../linux-x86-64/libtree-sitter-smithyql.so | Bin 18304 -> 18304 bytes .../parser/ParserTreeSitterDemo.scala | 28 ++-- .../test/corpus/bindings-comma.txt | 19 --- .../test/corpus/bindings-multiple.txt | 40 ------ tree-sitter-smithyql/test/corpus/bindings.txt | 21 --- tree-sitter-smithyql/test/corpus/comment.txt | 16 --- tree-sitter-smithyql/test/corpus/empty.txt | 7 - .../test/corpus/full-of-comments.txt | 113 ---------------- .../test/corpus/just-query.txt | 13 -- tree-sitter-smithyql/test/corpus/just-use.txt | 14 -- .../test/corpus/service-reference.txt | 16 --- .../test/corpus/simple-complete.txt | 44 ++++++ .../test/corpus/statements.txt | 126 ------------------ tree-sitter-smithyql/test/corpus/string.txt | 8 -- tree-sitter-smithyql/test/corpus/struct-1.txt | 21 --- tree-sitter-smithyql/test/corpus/struct-2.txt | 28 ---- tree-sitter-smithyql/test/corpus/struct-3.txt | 35 ----- 23 files changed, 69 insertions(+), 493 deletions(-) delete mode 100644 tree-sitter-smithyql/test/corpus/bindings-comma.txt delete mode 100644 tree-sitter-smithyql/test/corpus/bindings-multiple.txt delete mode 100644 tree-sitter-smithyql/test/corpus/bindings.txt delete mode 100644 tree-sitter-smithyql/test/corpus/comment.txt delete mode 100644 tree-sitter-smithyql/test/corpus/empty.txt delete mode 100644 tree-sitter-smithyql/test/corpus/full-of-comments.txt delete mode 100644 tree-sitter-smithyql/test/corpus/just-query.txt delete mode 100644 tree-sitter-smithyql/test/corpus/just-use.txt delete mode 100644 tree-sitter-smithyql/test/corpus/service-reference.txt create mode 100644 tree-sitter-smithyql/test/corpus/simple-complete.txt delete mode 100644 tree-sitter-smithyql/test/corpus/statements.txt delete mode 100644 tree-sitter-smithyql/test/corpus/string.txt delete mode 100644 tree-sitter-smithyql/test/corpus/struct-1.txt delete mode 100644 tree-sitter-smithyql/test/corpus/struct-2.txt delete mode 100644 tree-sitter-smithyql/test/corpus/struct-3.txt diff --git a/build.sbt b/build.sbt index f270e95b..edb0f31b 100644 --- a/build.sbt +++ b/build.sbt @@ -117,7 +117,7 @@ lazy val parser = module("parser") "io.circe" %% "circe-generic" % "0.14.10" % Test, "io.circe" %% "circe-parser" % "0.14.10" % Test, "co.fs2" %% "fs2-io" % "3.11.0" % Test, - "org.polyvariant.treesitter4s" %% "core" % "0.3-4028f07-SNAPSHOT", + "org.polyvariant.treesitter4s" %% "core" % "0.3-e777c6d-SNAPSHOT", ) ) .dependsOn( diff --git a/flake.lock b/flake.lock index acc6cf74..14c1daa6 100644 --- a/flake.lock +++ b/flake.lock @@ -20,15 +20,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1730247135, - "narHash": "sha256-YaZZlvZj9isN2i8l24A4/7TT89fvpX11nVn2dusl2MM=", + "lastModified": 1730137625, + "narHash": "sha256-9z8oOgFZiaguj+bbi3k4QhAD6JabWrnv7fscC/mt0KE=", "owner": "nixos", "repo": "nixpkgs", - "rev": "ccd7e10e004a6e93486c1dd536f89e85d482d685", + "rev": "64b80bfb316b57cdb8919a9110ef63393d74382a", "type": "github" }, "original": { "owner": "nixos", + "ref": "nixos-24.05", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index a37386c1..9100e492 100644 --- a/flake.nix +++ b/flake.nix @@ -1,6 +1,6 @@ { inputs = { - nixpkgs.url = "github:nixos/nixpkgs"; + nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05"; flake-utils.url = "github:numtide/flake-utils"; }; @@ -18,7 +18,7 @@ pkgs.sbt pkgs.jless pkgs.gnupg - pkgs.tree-sitter + (pkgs.tree-sitter.override { webUISupport = true; }) # temporary, while we don't download coursier ourselves pkgs.coursier ] ++ pkgs.lib.optionals pkgs.stdenv.isLinux [ pkgs.xvfb-run ]; diff --git a/modules/parser/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib b/modules/parser/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib index 6ee131efecd19b6e39c21d1dfa22bcea5c2057d8..fd69ecf89012885df0c3206413b5c41348d83ab1 100755 GIT binary patch delta 2301 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 T=?}zTa=y#Q?eBDuw8_uEdJI8t delta 3277 zcmcJSYitx%6vxk?XqA`IG5opW!zq7CI&{~Xmli#^> zp7-24x0CI$9pcyyQSigHKdxsJ36+Slz+~X*EZFRA^56;MytH669q7I!L=*2(=H;1kMw{^5bh*|T{w*LUqY@Kx2Bo;{UtSq0oK(s++r*zeXJa&xcN#H&5o z;sb8;=%Sf-d$x!zJmQ%lp5f`7cX;zuh)ou7c*lUy{pw}Y ztozF}TR{i-1e^v}fcpx3U=dgeHi8$yo1hOI20wvwUV#G90zyBN=7|#*6@B0(GLK9BRc9x;&f5t!&Sy&c2h2y!|f_oD=-N@mMbW z{WLxs|G48XCfM0GWB8B4c6=V^7CJLCyzb&!w&YNgp_l+^l)=pnbINrE1zq`#73-qbkr6j0?X7EZ~7rDG$pAUJ^lC^Gt4Dxf>53erteA$1Bvmhr{F6fO=vV5k&>?nq_SqPC3HsLrxCKxUB_GF?@r zxt1^4+3ZwKyq|evTjAhE>6lBT+VQ z+>40#L1-Drka+;f%8g@IE`ZfV_gR%?>y@Kcz2CAffpo@K9p!tFL_3;U2B!<}FEg>( zN?dOFGK;FT0#>3`Rz&jj)Wqh?U`=mZr55OJw1m4MHyn~T!hv_8(j?fjX&Pi{s;Oj^ zDxP0aV=O_eyd&w`v)r<{AlD#|Qh5rsLU)hSpRlSYyHlvm7XKu4=cxF0TmA+TJX8_% zP8t=n1u-s;R_fmLO;czatQtR7X&7IlqXBRloClY{b&!Krr-A^O4(5VJ@Gxivo4|A6 z74R1L5PS}ffI;vJI14UKvAKjeiX}`AfuH2vu@XwP$a&CIko7DqdQBA@_C);cvD9?`0;H!&<{zYo-O~SXHoa zV$8DXE*^^bE95nnL!<)ZzbDhWn|mT<3za}dm{4uHQfl){-8rgkgzt#zYl~sUCn&X; zGb4+rHbWO8XwyqFb;X~lt5ToD?}mdRC9#H3%B>iph+I0gcEZkw!@+R6pIAmc!bee# zq+f_K-X7NZcw{oqj(E5&obQvLL>yvjHJqq5DtK|&AC{M0j&y~9rKjWNFL61txFn+U ziipP>we(~LQ4v2C@pD_$gHkozhv)N=d~c2|D##rX{jT^w1?gOeEh^8Z=iBsZ4oCf5 z6!q{{u-sa+jys~d(EIzMJ|$QF+fk1s$s9gedswXQ@0{^=o_{a^%U~ehz@U$)&7qOB G$?-QMCo6OS diff --git a/modules/parser/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so b/modules/parser/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so index 829d269769ab2e7fd3eb8f2f6afcb1f04dbe4664..45c2640ef63ea843a64e8002bd558ada542073c0 100755 GIT binary patch delta 3986 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 C=B%Rt delta 3959 zcmZu!YfxLq72drPa3ust!XQgR=!K0i0R)JbCvHSqC)90fOla$Lnv_=z*w{tb6JsY+ z#7tY`j>k4Wo{FTM#{6-aVP*b@u|g zlbtzd^_}mWvuF3N_U@fKZJax8JlkVBRmC#x)b#KP+o_NMTED<~5$COBlg{uUOq4j+uPG>`QU&{4ydiP-RP^Zwp} zeU0N|LxYiH;eAa9!)*uZ>qmx~jvYLD=!KfWk>S4nnugj)xTdkW4q$uTq2ckm!$-b7 z_IzF2f#LeTmWHFphuZp@2HQqQ+71uI2AkXJ`$xvchGQ)?gZ=$A^^LWSwc#3sD&cDR zjBzGG@;DS4d5ms;p4yC0@(VO+bU1w;)v@D#hGzz&ilg*1qeEhw>22c^JWjS8hcmoI zrN(ux^VAO3w^e1QbnG0(z|L2w?2L|$(riv057YG=$GKeDW_^%dMVxr9gTlEo_t75w zYR$DeFNlG{I^Q|!&2>003pT1_lQfO^B*y5}F^iN!++7jZqhnWSIoDy5E7kHxsXfm@ zp**W;v#`V|2FqSpLc(&EW?`9vrBzri&~;cY!_pxv^TcHbE#+CAdxa&b8@GpS@EDb4 zevSO7yhFB{MuqPpO@kYktDXIT4|YkgVI8|dyyzvPSCT3Zqr%#_nMJ|{Ds96CxOxui+$qSbv$`D-QA6>uLzF` zGdre?)C8LkBYj8ly~$&f|4w&Dq-gQdBZ-f6=y89mZDS-ayMmZeC3V*3WYn?Xk8@SQLlv^H}?b2tf971)t`z)FKiByA=FG@WAin z#k)!cPJNK>-h=_{8n0kuysJ>-@1R;t$E@IshzE`!U#@~tVCsG3m*SLX`=Y($y);(z zjdP0=i~nI2@4k|}O?|e2>Gu!SXW*llt(d<_vo<&XHT@F$GCgJAys&J0+Q8qZoh6n0 zPjs;4r#wU@rTx5sj+J^jUwFCnB=@&vjt2D~ru=NtVKcqx_5>M@VWsgk$3h*pklS7U zxa7++bAt{`WjbEL@`kjJ&=t4$c^9lW^4A8Fv!WQQ%fg)db=aMaCG{<#<>Lkg=abjv zuav|XTnc1j7<)t+dTnfBr^j6WYAv3z`mFqnm1JSg%jv$;OS{~KblGL4C8yn~zL(ZV z!-{5FkghsC)r=W*8GISM?k`?IESG-d^3rXW)mD=g!SJs8yURmMZYxq%QMKDcLvFjx zr1SDqzT4Yw)md|NxJZZXIvk?ck$=W*r4`7n%$SXoU*_drsxI?ST!H_akarnA@FLW+)<0gYh zj;vZt4hsUyYzwr7ZG!f)YUpxGl^4_B%D*yUz;07=Xc2YDt@s*QW5(VLoy%;{>sbwK zdxq0uTGwLKdLI3Z7$f@}tP+bt%a|EQWr&YtCTkQ0KAs_!V!dkx8JTMR0<0329Dz#l z6HmZHT?k{=GGs4+mbv3IGnc?>X1g+(mC`FVjQZt_bvLxEj=F){!}th_c^ae{&o4Xh ztC_&P87@1ifqes3#=e>H&{oeNCSMNg`m_z~IbaJ)!ro9OT&e7c96SpH%ZDwGZG$db zD@x0z4iG#?}i*+i?MAdiy2%8}EG z6cO4{734b?daKS{KX<>i_d)VaeE;kCAXvWds2>$~^0?@yL_Z^X?Mq-z;LFthz-!iS@+(_u?7?&P9&sZb68+Rx z`shLJ#EgI!L_aTj?ecp|VC}lQBF4}zxJiMn;)>}Ly>^k+Y7Yy$R-?GE+F4W(+8uSA zrdR9yud1tv-Kw_Me6=qSI7uI_p5eU|d$`*s3ocJ^9d!NSZro7(X)m`^d-?`%{Dp%r zbKaXUNxaTvSB_OQd!k+9EvArwp~R#DI|S@Vq!g$nmlNCosMXP$XgBZ^Je>Hg0U48} iYQ|)O8{xDl;9{a(foq@8iAe>%B_{mV8!00nl>QIJUAXQ5 diff --git a/modules/parser/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so b/modules/parser/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so index 8676310a7fb78eea3f7004130253470b43e15474..744547263e582b4304a5512d104431b16cea5961 100755 GIT binary patch delta 3824 zcmZu!dr*|u6~Fh}MV|WY@>*cQU0_#8VA*8>0UyW$>RO$Qsbi`pt>PjNLBqobK4zA7 z-62eCp*c3=Oq)?Bnc8XW3@vd=DvhL3Cx0Xpnzm`$w2e;M#%*dfrcsO~+uyzWgl2bs z=R429lZR&})29XaCct?ul$b@X)Y_Sl>iRrR(Srya(MxGn|`dwLv4_V4d% zt?|^* zmCTsJzBh40dpM1E(suot{AUvxbNi+hw{JH4;6G2Uz3-dV9!mGknN@!iy{zAw_5m$ICDlmb3Lm6pmb&m=bzyeYc2V&OMboJ zuf+3fB`-E#;6jw|SN%508<-c4Q}K>0>BtfZ$D{m!>Ysz*no1RXTa-Vj`u{F@vCx4{ z@%&qo*9*Qn${$kw7bU+$@cB@^p%Ls+{m)BBgK%i03E=&bZxsB$?nOonexKycg8yAS zzg6<-f}e`=U8;YzBn{m zd_d(!OZjn`@M{o}gdcxNLXAimrQ=3pd5ugs7MIZaB?Q+Xoj9D-a^ z;z|lUC)FmQep{+VLLHLoI-wpEs_4Osqf;%IHZZ^I*{YFc|Cw z#=+mgQ}^FsuoTz^UoY?sa2A*ZhLCd_7zf?}t^>1x4!%;L5!j5jcY%8f&l%t*pt}nn zFmpHP4c>vW4HyK*fN?;FVLE`#KqoK+%m55SaR9r3F<=_F1DLUhn}H!<9JmhXuq_*b zUf?V+12CK}2e1nm0#4trKqFAD0}Las19kzYfpLtwQH&gz#!S2cj`T_vp3PW^ zu<3Gfu9tJM&GF_BSH(5r-Jcq>x!7*8wz)>U6Ov+nMc8qEMdZh9#xx6TL%dBN73wLqk}Nv>77=#?Ba_vre^h2i zW)ibVm#iWuhhCD;3VI(|vlbn_XVrl(qK9b9NycS`-q(=(Ch!;FCh#fn1(1w-Gl3$& z0W<)cfE_?5a0oa7i~&CcegaGa*MJ$|kHFu6+rZ~Qf`Z)w7=R+645(5VU0Sw1F&&d* zWOg!^n0OkkELjbCM9SMGwa{;u7v)t*|EPT$mUdUkiMTFo*F2(}rg&l(!VVSeqK= zhMf@YV;$NTGpk{n@btzUUkN+3>@k_}IOP9#6gSBWW>?F$AVXnKK&C91$=J+qL&xGj zLK1+v+$Pt46%0XX!sA#tf*oiwO)hC{zi8M~U>W;{>@>10kroOmqwEpy<7hPjgV2ck z3fsX3nJ>DPy~c`qLiV2mxf>B;ZXywFu*D4(vD;ybIwN)`?8G>GZ+yNOV-JW_`e~V6 zpAr{#04$?hWhT8gjy(!CfeOlhzj!%zS2ezgI3!j&mue+PvzAJ2Ids6Lqw!QTP21Aw zf-Q+!)@S04tc9(mv$iCjK(6%}uyW`+BCdns$giI$s<@}&S18xn%}SI0LZyM%&kZv@C N4Bh4+b6Ywz{{zRwmN5VT delta 3838 zcmZu!3v83u6~5PYz)2i_=jptRox~=T#Lql=6yiLJX}bXfI%wHwNXXM-At{hRB}aAK zKqr<|2dzk}ROr?fX`2KJtth0e+fIy5Q$cjB(U>%tvSB6%Wxm^&2bgu4=aS>2-}wJKT1+y@okF30|kuAZ9Kp5A=})d$+!ch~goYxnIR=rwRitADT>hybS)o*WKp!J{_X77d`?3NvW+nIoI+MA@;JV`a z)OFVtX>o;GT%WeMuC%zWebO;b`mAM!-zlbM#?GoRfcNmQ-)# zL?Vi*fqBj^m~}TFeopwqjqr5X71M~Em**U2Ak&)bNC+aQ)SuAa~ikwCG%{l%L)8Otnd{BdViaCr>Yqo*=XeirRxDt`xvzSy96t!3RUssT^@MkoZzeHCfh{<&#?sfVozrx&iKN1Pwfly2+ zPz=XNNC`d*!WHr!$!H~AK?S!`eZgY?0ued}F&>z924+%~(U)L&CUL|p9KMI+h@Dwr z#-{{#NoS65{s~TT){_68au_bI`*B)>@TI;j5W3U(>MBhs;2IKI6b zTN(Jhl5Y_F-;((sN!~2@-zW1elFt(SZ{vKo60}KPG;H{2oVU~Gg~rNBVgD=(PgG#q z6PQ`9jNSwj?M`&)YaPu}HuwIm!eJ~yu1>gNvwkX>5 zL(yePPrDe(Gg&BtUPX{+Qd~*lm!;Y$)Pqtj6>6VUpAhOUp^6dwcyy`-vl&caIyEq( zQAYm)JxnsXLip;1Z)Ul_S!~eQCEO)}nGFAPVvELnBK9qa**)}3T185V%q|k@gF9kg zbwd3bYV0ugAi{gLMqEyb<6i_dycHgCO^;+k2|o$Zk+@XHy+=}pCe9dFsr*{p2*bA{ zkq!91{vZ-@K7papLR>VXXcsNDyC zJH9UiHv#iE;DPJkMEntk<#fR~1RMuKfEio^@H{XGj04vJJ(ke`h(kCITm~2p&j~ya zi~}Ly7GOr(ZUBaXQ^0jVk0+}E=mW-qllSZ>0_7H<$BMmxxDrnSA*_0XSUGSRJ2C~1 zGF3U$P;#YYIZi^nPh%f(GRbxt^;(T(;&m$dc%ZmW5Er*~lx|(zs4~x?xq6N z8J#aP;;~XoD^`(nv$PZO7HKoKfPQK*(H|}POq*n48I0xAHH(p^ta_AsjEbyA+G@?p z6qj#eW{j24LyO51{iT%1O_>)Z?z7}9akVGgOX(M=f5@t*o4`dmW)(fOnz)IImX!F< zBl-gH1#lC%1AGUhVh3{oGhhc+0AAo3pdIK3UIbnNjsd?0&H&=tzYJUhz65Rq4}cVO zr5-2%N`VTXO2z2>l5Go%ag0UGNk!!*ouIJj4=gtdui_4A|}pSg|1FRB_ncD zmEIT!Wst@3NyVyIX=d4D{`H6zJ(B32t&&ND+=)DKBSia5#oA%(lI#vyJ>l<~7vBS0 zn-uSxm%p2FI$u$enVuB$0%Fo=y26y1=rk2O09HfB%BvYQtQ;L*i&eQX~cO}0*al`FM=f^2?wTWLO*Xl98lRjGg20urwYu@2i6NZLV6{wO% hN9wug&C1SAY-=3l{1Dw}a-?32Uij?dL_u?>`u~XfqMiT% diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala index f76564c8..57061ba6 100644 --- a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala +++ b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala @@ -1,5 +1,6 @@ package playground.smithyql +import org.polyvariant.treesitter4s.Node import org.polyvariant.treesitter4s.TreeSitterAPI object ParserTreeSitterDemo extends App { @@ -7,18 +8,25 @@ object ParserTreeSitterDemo extends App { def parse(s: String) = { val p = TreeSitterAPI.make("smithyql") val tree = p.parse(s) - println(tree.rootNode.get.fields.keySet) + println( + tree + .rootNode + .get + .fold[LazyList[Node]](_ #:: _.to(LazyList).flatten) + .filter(_.fields.nonEmpty) + .find(_.source == "Bax") + .get + .parents + .map(p => p.text) + .mkString("\n\n") + ) } parse( - """use service a.b#C - |helalsdfhl //a - |{ - | hello = 42, - | foo = 50, - | x = { y = "hello"}, - | z = null, - | aa = [10, true, false, null] - |}""".stripMargin + """ + use service foo.bar#Baz + + Bax { x = 42 } + """.stripMargin ) } diff --git a/tree-sitter-smithyql/test/corpus/bindings-comma.txt b/tree-sitter-smithyql/test/corpus/bindings-comma.txt deleted file mode 100644 index b397ae46..00000000 --- a/tree-sitter-smithyql/test/corpus/bindings-comma.txt +++ /dev/null @@ -1,19 +0,0 @@ -================================================================================ -Simple let binding with trailing comma -================================================================================ -let label = 42, -Op {} --------------------------------------------------------------------------------- - -(ERROR - (whitespace) - (ERROR - (binding - (identifier) - (whitespace) - (whitespace) - (input_node - (number)))) - (whitespace) - (identifier) - (whitespace)) diff --git a/tree-sitter-smithyql/test/corpus/bindings-multiple.txt b/tree-sitter-smithyql/test/corpus/bindings-multiple.txt deleted file mode 100644 index 054a8123..00000000 --- a/tree-sitter-smithyql/test/corpus/bindings-multiple.txt +++ /dev/null @@ -1,40 +0,0 @@ -================================================================================ -Multiple let bindings in one go -================================================================================ -let label = 42, -let y = { a = "test", } -Op {} --------------------------------------------------------------------------------- - -(source_file - (ERROR - (whitespace) - (binding - (identifier) - (whitespace) - (whitespace) - (input_node - (number)))) - (whitespace) - (top_level_statement - (let_binding - (whitespace) - (binding - (identifier) - (whitespace) - (whitespace) - (input_node - (struct - (whitespace) - (bindings - (binding - (identifier) - (whitespace) - (whitespace) - (input_node - (string)))) - (whitespace)))))) - (whitespace) - (ERROR - (identifier) - (whitespace))) diff --git a/tree-sitter-smithyql/test/corpus/bindings.txt b/tree-sitter-smithyql/test/corpus/bindings.txt deleted file mode 100644 index fffb78b5..00000000 --- a/tree-sitter-smithyql/test/corpus/bindings.txt +++ /dev/null @@ -1,21 +0,0 @@ -================================================================================ -Simple let binding -================================================================================ -let label = 42 -Op {} --------------------------------------------------------------------------------- - -(source_file - (top_level_statement - (let_binding - (whitespace) - (binding - (identifier) - (whitespace) - (whitespace) - (input_node - (number))))) - (whitespace) - (ERROR - (identifier) - (whitespace))) diff --git a/tree-sitter-smithyql/test/corpus/comment.txt b/tree-sitter-smithyql/test/corpus/comment.txt deleted file mode 100644 index 22ca0f24..00000000 --- a/tree-sitter-smithyql/test/corpus/comment.txt +++ /dev/null @@ -1,16 +0,0 @@ -================================================================================ -File with comments -================================================================================ -//comm -hello {} --------------------------------------------------------------------------------- - -(source_file - (comment) - (whitespace) - (top_level_statement - (operation_call - (operation_name - (identifier)) - (whitespace) - (struct)))) diff --git a/tree-sitter-smithyql/test/corpus/empty.txt b/tree-sitter-smithyql/test/corpus/empty.txt deleted file mode 100644 index a7aeecd9..00000000 --- a/tree-sitter-smithyql/test/corpus/empty.txt +++ /dev/null @@ -1,7 +0,0 @@ -================================================================================ -Empty file -================================================================================ - --------------------------------------------------------------------------------- - -(ERROR) diff --git a/tree-sitter-smithyql/test/corpus/full-of-comments.txt b/tree-sitter-smithyql/test/corpus/full-of-comments.txt deleted file mode 100644 index c305d50a..00000000 --- a/tree-sitter-smithyql/test/corpus/full-of-comments.txt +++ /dev/null @@ -1,113 +0,0 @@ -================================================================================ -Full of comments -================================================================================ - -// before use clause -use//after use -service //after service -some //after ident -.//after dot -api//after api ident -#//after hash -Service//after service -// before op -op -// after op - { - - //before key - firstKey - // after key - = - // before value - "firstValue" - // after value - , - // before another key - secondKey - // after second key - = - // before value - "secondValue" - // after value -, - //after trailing comma, technically this is part of the struct - } -// after whole thing - --------------------------------------------------------------------------------- - -(source_file - (whitespace) - (comment) - (whitespace) - (use_clause - (comment) - (whitespace) - (whitespace) - (comment) - (whitespace) - (qualified_identifier - (identifier) - (whitespace) - (comment) - (whitespace) - (comment) - (whitespace) - (identifier) - (comment) - (whitespace) - (comment) - (whitespace) - (identifier))) - (comment) - (whitespace) - (comment) - (whitespace) - (top_level_statement - (operation_call - (operation_name - (identifier)) - (whitespace) - (comment) - (whitespace) - (struct - (whitespace) - (comment) - (whitespace) - (bindings - (binding - (identifier) - (whitespace) - (comment) - (whitespace) - (whitespace) - (comment) - (whitespace) - (input_node - (string))) - (whitespace) - (comment) - (whitespace) - (whitespace) - (comment) - (whitespace) - (binding - (identifier) - (whitespace) - (comment) - (whitespace) - (whitespace) - (comment) - (whitespace) - (input_node - (string))) - (whitespace) - (comment) - (whitespace)) - (whitespace) - (comment) - (whitespace)))) - (whitespace) - (comment) - (whitespace)) diff --git a/tree-sitter-smithyql/test/corpus/just-query.txt b/tree-sitter-smithyql/test/corpus/just-query.txt deleted file mode 100644 index 37091b3d..00000000 --- a/tree-sitter-smithyql/test/corpus/just-query.txt +++ /dev/null @@ -1,13 +0,0 @@ -================================================================================ -Just query, no use clause -================================================================================ -hello {} --------------------------------------------------------------------------------- - -(source_file - (top_level_statement - (operation_call - (operation_name - (identifier)) - (whitespace) - (struct)))) diff --git a/tree-sitter-smithyql/test/corpus/just-use.txt b/tree-sitter-smithyql/test/corpus/just-use.txt deleted file mode 100644 index 8f57a4d8..00000000 --- a/tree-sitter-smithyql/test/corpus/just-use.txt +++ /dev/null @@ -1,14 +0,0 @@ -================================================================================ -Just use clause -================================================================================ -use service playground.std#Clock --------------------------------------------------------------------------------- - -(ERROR - (use_clause - (whitespace) - (whitespace) - (qualified_identifier - (identifier) - (identifier) - (identifier)))) diff --git a/tree-sitter-smithyql/test/corpus/service-reference.txt b/tree-sitter-smithyql/test/corpus/service-reference.txt deleted file mode 100644 index a5e5be3d..00000000 --- a/tree-sitter-smithyql/test/corpus/service-reference.txt +++ /dev/null @@ -1,16 +0,0 @@ -================================================================================ -Service reference -================================================================================ -namespace#Service.OpName {} --------------------------------------------------------------------------------- - -(source_file - (top_level_statement - (operation_call - (operation_name - (qualified_identifier - (identifier) - (identifier)) - (identifier)) - (whitespace) - (struct)))) diff --git a/tree-sitter-smithyql/test/corpus/simple-complete.txt b/tree-sitter-smithyql/test/corpus/simple-complete.txt new file mode 100644 index 00000000..24a05445 --- /dev/null +++ b/tree-sitter-smithyql/test/corpus/simple-complete.txt @@ -0,0 +1,44 @@ +================================================================================ +Simple complete valid example +================================================================================ +use service foo.bar#baz +Hello { a = 42, b = "false", c = true } +-------------------------------------------------------------------------------- +(source_file + (use_clause + (whitespace) + (whitespace) + (qualified_identifier + (identifier) + (identifier) + (identifier))) + (whitespace) + (top_level_statement + (operation_call + (operation_name + (identifier)) + (whitespace) + (struct + (whitespace) + (bindings + (binding + (identifier) + (whitespace) + (whitespace) + (input_node + (number))) + (whitespace) + (binding + (identifier) + (whitespace) + (whitespace) + (input_node + (string))) + (whitespace) + (binding + (identifier) + (whitespace) + (whitespace) + (input_node + (boolean)))) + (whitespace))))) diff --git a/tree-sitter-smithyql/test/corpus/statements.txt b/tree-sitter-smithyql/test/corpus/statements.txt deleted file mode 100644 index 7d54dcbd..00000000 --- a/tree-sitter-smithyql/test/corpus/statements.txt +++ /dev/null @@ -1,126 +0,0 @@ -================================================================================ -Return statements -================================================================================ - -use service a.b#C - -hello { - a = 42, - b = 50, - c = { - d = "foo", - e=false, - f=true, - list = [ 50, 100, 100, - [null, false, true, null, "a", 40, ] - ], - }, - nul = null, -} --------------------------------------------------------------------------------- - -(source_file - (whitespace) - (use_clause - (whitespace) - (whitespace) - (qualified_identifier - (identifier) - (identifier) - (identifier))) - (whitespace) - (top_level_statement - (operation_call - (operation_name - (identifier)) - (whitespace) - (struct - (whitespace) - (bindings - (binding - (identifier) - (whitespace) - (whitespace) - (input_node - (number))) - (whitespace) - (binding - (identifier) - (whitespace) - (whitespace) - (input_node - (number))) - (whitespace) - (binding - (identifier) - (whitespace) - (whitespace) - (input_node - (struct - (whitespace) - (bindings - (binding - (identifier) - (whitespace) - (whitespace) - (input_node - (string))) - (whitespace) - (binding - (identifier) - (input_node - (boolean))) - (whitespace) - (binding - (identifier) - (input_node - (boolean))) - (whitespace) - (binding - (identifier) - (whitespace) - (whitespace) - (input_node - (list - (whitespace) - (list_fields - (input_node - (number)) - (whitespace) - (input_node - (number)) - (whitespace) - (input_node - (number)) - (whitespace) - (input_node - (list - (list_fields - (input_node - (null)) - (whitespace) - (input_node - (boolean)) - (whitespace) - (input_node - (boolean)) - (whitespace) - (input_node - (null)) - (whitespace) - (input_node - (string)) - (whitespace) - (input_node - (number))) - (whitespace)))) - (whitespace))))) - (whitespace)))) - (whitespace) - (binding - (identifier) - (whitespace) - (whitespace) - (input_node - (null)))) - (whitespace))))) diff --git a/tree-sitter-smithyql/test/corpus/string.txt b/tree-sitter-smithyql/test/corpus/string.txt deleted file mode 100644 index c2d766e3..00000000 --- a/tree-sitter-smithyql/test/corpus/string.txt +++ /dev/null @@ -1,8 +0,0 @@ -================================================================================ -Just a string -================================================================================ -"hello" --------------------------------------------------------------------------------- - -(ERROR - (string)) diff --git a/tree-sitter-smithyql/test/corpus/struct-1.txt b/tree-sitter-smithyql/test/corpus/struct-1.txt deleted file mode 100644 index 8defe483..00000000 --- a/tree-sitter-smithyql/test/corpus/struct-1.txt +++ /dev/null @@ -1,21 +0,0 @@ -================================================================================ -Struct with 1 field -================================================================================ -{ a = 42 } --------------------------------------------------------------------------------- - -(source_file - (top_level_statement - (operation_call - (operation_name - (MISSING identifier)) - (struct - (whitespace) - (bindings - (binding - (identifier) - (whitespace) - (whitespace) - (input_node - (number)))) - (whitespace))))) diff --git a/tree-sitter-smithyql/test/corpus/struct-2.txt b/tree-sitter-smithyql/test/corpus/struct-2.txt deleted file mode 100644 index 7425bcbe..00000000 --- a/tree-sitter-smithyql/test/corpus/struct-2.txt +++ /dev/null @@ -1,28 +0,0 @@ -================================================================================ -Struct with 2 fields -================================================================================ -{ a = 42, b = "false" } --------------------------------------------------------------------------------- - -(source_file - (top_level_statement - (operation_call - (operation_name - (MISSING identifier)) - (struct - (whitespace) - (bindings - (binding - (identifier) - (whitespace) - (whitespace) - (input_node - (number))) - (whitespace) - (binding - (identifier) - (whitespace) - (whitespace) - (input_node - (string)))) - (whitespace))))) diff --git a/tree-sitter-smithyql/test/corpus/struct-3.txt b/tree-sitter-smithyql/test/corpus/struct-3.txt deleted file mode 100644 index 48f334fd..00000000 --- a/tree-sitter-smithyql/test/corpus/struct-3.txt +++ /dev/null @@ -1,35 +0,0 @@ -================================================================================ -Struct with 3 fields -================================================================================ -{ a = 42, b = "false", c = true, } --------------------------------------------------------------------------------- - -(source_file - (top_level_statement - (operation_call - (operation_name - (MISSING identifier)) - (struct - (whitespace) - (bindings - (binding - (identifier) - (whitespace) - (whitespace) - (input_node - (number))) - (whitespace) - (binding - (identifier) - (whitespace) - (whitespace) - (input_node - (string))) - (whitespace) - (binding - (identifier) - (whitespace) - (whitespace) - (input_node - (boolean)))) - (whitespace))))) From 3390152d7011db1a8dbd30cc49fc5dacec232bb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Sat, 2 Nov 2024 03:17:17 +0100 Subject: [PATCH 035/105] Generating some tree-sitter code --- build.sbt | 17 +- .../playground/parsergen/ParserGen.scala | 208 ++++++++++++++++++ .../src/main/smithy/treesitter.smithy | 58 +++++ .../libtree-sitter-smithyql.dylib | Bin 34384 -> 34384 bytes .../libtree-sitter-smithyql.dylib | Bin 16456 -> 16456 bytes .../linux-aarch64/libtree-sitter-smithyql.so | Bin 67368 -> 67368 bytes .../linux-x86-64/libtree-sitter-smithyql.so | Bin 18304 -> 18304 bytes .../playground/generated/nodes/Binding.scala | 20 ++ .../playground/generated/nodes/Bindings.scala | 19 ++ .../playground/generated/nodes/Boolean_.scala | 19 ++ .../playground/generated/nodes/Comment.scala | 19 ++ .../generated/nodes/Identifier.scala | 19 ++ .../generated/nodes/Let_binding.scala | 19 ++ .../playground/generated/nodes/List_.scala | 19 ++ .../generated/nodes/List_fields.scala | 19 ++ .../playground/generated/nodes/Null_.scala | 19 ++ .../playground/generated/nodes/Number.scala | 19 ++ .../generated/nodes/Operation_call.scala | 20 ++ .../generated/nodes/Operation_name.scala | 22 ++ .../nodes/Qualified_identifier.scala | 23 ++ .../generated/nodes/Source_file.scala | 20 ++ .../playground/generated/nodes/String_.scala | 19 ++ .../playground/generated/nodes/Struct.scala | 19 ++ .../generated/nodes/Top_level_statement.scala | 19 ++ .../generated/nodes/Use_clause.scala | 19 ++ .../generated/nodes/Whitespace.scala | 19 ++ .../generated/nodes/_Input_node.scala | 37 ++++ .../parser/ParserTreeSitterDemo.scala | 34 ++- .../smithyql/parser/demo.worksheet.sc | 35 +++ tree-sitter-smithyql/grammar.js | 7 +- 30 files changed, 742 insertions(+), 25 deletions(-) create mode 100644 modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala create mode 100644 modules/parser-gen/src/main/smithy/treesitter.smithy create mode 100644 modules/parser/src/main/scala/playground/generated/nodes/Binding.scala create mode 100644 modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala create mode 100644 modules/parser/src/main/scala/playground/generated/nodes/Boolean_.scala create mode 100644 modules/parser/src/main/scala/playground/generated/nodes/Comment.scala create mode 100644 modules/parser/src/main/scala/playground/generated/nodes/Identifier.scala create mode 100644 modules/parser/src/main/scala/playground/generated/nodes/Let_binding.scala create mode 100644 modules/parser/src/main/scala/playground/generated/nodes/List_.scala create mode 100644 modules/parser/src/main/scala/playground/generated/nodes/List_fields.scala create mode 100644 modules/parser/src/main/scala/playground/generated/nodes/Null_.scala create mode 100644 modules/parser/src/main/scala/playground/generated/nodes/Number.scala create mode 100644 modules/parser/src/main/scala/playground/generated/nodes/Operation_call.scala create mode 100644 modules/parser/src/main/scala/playground/generated/nodes/Operation_name.scala create mode 100644 modules/parser/src/main/scala/playground/generated/nodes/Qualified_identifier.scala create mode 100644 modules/parser/src/main/scala/playground/generated/nodes/Source_file.scala create mode 100644 modules/parser/src/main/scala/playground/generated/nodes/String_.scala create mode 100644 modules/parser/src/main/scala/playground/generated/nodes/Struct.scala create mode 100644 modules/parser/src/main/scala/playground/generated/nodes/Top_level_statement.scala create mode 100644 modules/parser/src/main/scala/playground/generated/nodes/Use_clause.scala create mode 100644 modules/parser/src/main/scala/playground/generated/nodes/Whitespace.scala create mode 100644 modules/parser/src/main/scala/playground/generated/nodes/_Input_node.scala create mode 100644 modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc diff --git a/build.sbt b/build.sbt index cd758399..bc5d558a 100644 --- a/build.sbt +++ b/build.sbt @@ -73,7 +73,7 @@ val commonSettings = Seq( Nil }, Test / scalacOptions += "-Wconf:cat=deprecation:silent,msg=Specify both message and version:silent", - scalacOptions ++= Seq("-release", "11"), + scalacOptions += "-release:11", mimaFailOnNoPrevious := false, resolvers += "Sonatype S01 snapshots" at "https://s01.oss.sonatype.org/content/repositories/snapshots", ) @@ -117,7 +117,7 @@ lazy val parser = module("parser") "io.circe" %% "circe-generic" % "0.14.10" % Test, "io.circe" %% "circe-parser" % "0.14.10" % Test, "co.fs2" %% "fs2-io" % "3.11.0" % Test, - "org.polyvariant.treesitter4s" %% "core" % "0.3-e777c6d-SNAPSHOT", + "org.polyvariant.treesitter4s" %% "core" % "0.3-9edd0ef-SNAPSHOT", ) ) .dependsOn( @@ -125,6 +125,18 @@ lazy val parser = module("parser") source % "test->test;compile->compile", ) +lazy val parsergen = module("parser-gen") + .settings( + libraryDependencies ++= Seq( + "dev.optics" %% "monocle-core" % "3.3.0", + "com.disneystreaming.smithy4s" %% "smithy4s-json" % smithy4sVersion.value, + ("org.scalameta" %% "scalameta" % "4.11.0").cross(CrossVersion.for3Use2_13), + "org.polyvariant.treesitter4s" %% "core" % "0.3-9edd0ef-SNAPSHOT", + ), + scalacOptions -= "-release:11", + ) + .enablePlugins(Smithy4sCodegenPlugin) + // Formatter for the SmithyQL language constructs lazy val formatter = module("formatter") .settings( @@ -250,6 +262,7 @@ lazy val root = project core, examples, parser, + parsergen, formatter, languageSupport, lsp, diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala new file mode 100644 index 00000000..27440cc8 --- /dev/null +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -0,0 +1,208 @@ +package playground.parsergen + +import cats.syntax.all.* +import monocle.syntax.all.* +import org.polyvariant.treesitter4s.Node +import smithy4s.Blob +import smithy4s.Document +import smithy4s.json.Json +import treesittersmithy.NodeType +import treesittersmithy.NodeTypes +import treesittersmithy.TypeName +import util.chaining.* + +import java.nio.file.Files +import java.nio.file.Paths +import scala.jdk.CollectionConverters.* +import scala.meta.Dialect + +val debug = false + +def debugDump(s: String): String = + if debug then s + else + "" + +extension (tn: TypeName) { + def render: String = tn.value.smartCapitalize.ident + def asEnumCase: TypeName = TypeName(tn.value + "Case") +} + +extension (tpe: NodeType) { + + def render: String = + if tpe.subtypes.nonEmpty then renderAdt(tpe) + else + renderClass(tpe) + +} + +def renderAdt(tpe: NodeType) = { + val name = tpe.tpe.render + + val enumCases = tpe.subtypes.map { nodeType => + show"""case ${nodeType.tpe.asEnumCase.render}(value: ${nodeType.tpe.render})""" + } + + show"""// Generated code! Do not modify by hand. + |package playground.generated.nodes + | + |import ${classOf[Node].getName()} + | + |enum $name { + |${enumCases.mkString_("\n").indentTrim(2)} + | + | def asNode: Node = this match { + |${tpe + .subtypes + .map { nodeType => + show"""case ${nodeType.tpe.asEnumCase.render}(value) => value.node""" + } + .mkString_("\n") + .indentTrim(4)} + | } + |} + | + |object $name { + | def apply(node: Node): $name = node match { + |${tpe + .subtypes + .map { nodeType => + show"""case node @ ${nodeType + .tpe + .render}() => ${nodeType.tpe.asEnumCase.render}(${nodeType.tpe.render}(node))""" + } + .mkString_("\n") + .indentTrim(4)} + | } + |} + | + |/* + |${debugDump(Json.writeDocumentAsPrettyString(Document.encode(tpe)).trimLines)} + |*/ + |""".stripMargin +} + +def renderClass(tpe: NodeType) = { + val name = tpe.tpe.render + + val fieldGetters = tpe + .fields + .toList + .map { (k, fieldType) => + val singleFieldType = fieldType + .types + .map(tpe => show"${tpe.tpe.render}") + .reduceLeft(_ + " | " + _) + + val fieldTypeAnnotation = singleFieldType.pipe { + case s if fieldType.multiple => show"List[$s]" + case s => s + } + + val allFields = show"""node.fields(${k.value.literal})""" + + val cases = fieldType.types.map { typeInfo => + show"""case node @ ${typeInfo.tpe.render}() => ${typeInfo.tpe.render}(node)""" + } + val fieldValue = + if fieldType.multiple then show"""$allFields.toList.collect { + |${cases.mkString("\n").indentTrim(2)} + |}""".stripMargin + else + show"""${singleFieldType}($allFields.head)""" + + show"""def ${k.value}: ${fieldTypeAnnotation} = $fieldValue""" + } + + show"""// Generated code! Do not modify by hand. + |package playground.generated.nodes + | + |import ${classOf[Node].getName()} + | + |case class $name /* private */(node: Node) extends Node { + + |${fieldGetters + .mkString_("\n") + .indentTrim(2)} + | + | export node.* + |} + | + |object $name { + | def unapply(node: Node): scala.Boolean = node.tpe == ${tpe.tpe.value.literal} + |} + | + |/* + |${debugDump(Json.writeDocumentAsPrettyString(Document.encode(tpe)).trimLines)} + |*/ + |""".stripMargin + +} + +@main def parserGen = { + val types = + Json + .read[NodeTypes]( + Blob(Files.readString(Paths.get("tree-sitter-smithyql/src/node-types.json"))) + ) + .toTry + .get + .value + + val base = Paths.get(s"modules/parser/src/main/scala/playground/generated/nodes") + + Files.walk(base).iterator().asScala.filter(Files.isRegularFile(_)).foreach(Files.delete) + + types + .filter(_.named) + .map(_.focus(_.fields.each.types).modify(_.filter(_.named))) + .fproduct( + _.render + ) + .foreach { (tpe, code) => + Files.writeString( + base.resolve(s"${tpe.tpe.render}.scala"), + code, + ) + } +} + +extension (s: String) { + + def indentTrim(n: Int): String = s + .linesIterator + .map { + case line if line.nonEmpty => " " * n + line + case line => line + } + .mkString("\n") + + def trimLines: String = s.linesIterator.map(_.stripTrailing()).mkString("\n") + + def literal: String = scala.meta.Lit.String(s).printSyntaxFor(scala.meta.dialects.Scala3) + + def ident: String = { + // etc. + val reserved = Set("List", "String", "Boolean", "Null") + if reserved(s) then s + "_" + else + scala.meta.Name(s).printSyntaxFor(scala.meta.dialects.Scala3) + } + + def smartCapitalize: String = { + val (before, after) = s.span(!_.isLetter) + before + after.capitalize + } + +} + +extension [A](l: List[A]) { + + def requireOnly: A = + l match { + case a :: Nil => a + case _ => throw new IllegalArgumentException(s"Expected exactly one element, got $l") + } + +} diff --git a/modules/parser-gen/src/main/smithy/treesitter.smithy b/modules/parser-gen/src/main/smithy/treesitter.smithy new file mode 100644 index 00000000..3c7c687e --- /dev/null +++ b/modules/parser-gen/src/main/smithy/treesitter.smithy @@ -0,0 +1,58 @@ +$version: "2" + +namespace treesittersmithy + +list NodeTypes { + member: NodeType +} + +structure NodeType { + @required + @jsonName("type") + tpe: TypeName + + @required + named: Boolean + + @required + fields: NodeFields = {} + + children: FieldInfo + + @required + subtypes: NodeTypes = [] +} + +string TypeName + +map NodeFields { + key: FieldName + value: FieldInfo +} + +string FieldName + +structure FieldInfo { + @required + multiple: Boolean + + @required + required: Boolean + + @required + types: TypeList +} + +list TypeList { + member: TypeInfo +} + +// https://github.com/disneystreaming/smithy4s/issues/1618 +structure TypeInfo { + @required + @jsonName("type") + tpe: TypeName + + @required + named: Boolean +} diff --git a/modules/parser/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib b/modules/parser/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib index fd69ecf89012885df0c3206413b5c41348d83ab1..8681f5e8cbcf10c600e245d6781d9e4986cd0b0c 100755 GIT binary patch delta 811 zcmcc6!*rpCX+nqK9wi1a;NgPMdnV4b7d@c^;baIxXb_)ivLdteWDZ6JK?6I8Xe}dz zHrQ;*XwD>X&S2Wb$H&d{_9jGDT&|2@*xbNuBhRR?`JmDpVP*zK#?2ed{5TlnC;zkC z#KgcbdA+?XFUWEepdlc9a`H`kf5{gX5HoA^A@m=R6cE%*c61Q8ykiRC@t8sA2q=95 zN(-4o#6_TV50pMJd7^{AWeL=5nEOqj{;+`3R#4gwO1nX6kI9^l=JoMVUJ8`Xg3^Uh zx&lhqLg`j0JpoG3fzlhG^d2aE8cJV-(yyWPFDT7s5B5_%122TZAOxkQp|moT)`!yO zP&x!kr$T8+&@jODSHjdmEvkd^Tc9+|+zv1wm;zuf>xC+q4y6}CX_!xz+i%{;A|SW< z01G3CC}o_~pv|_&6=?sS$%YLt6|O248~V%N_4>Hv%{}h`#~+pRpEcc_dTv37-1FGq zd<_#OTQw>q+)rkC!u4Rv%zcg?2hL^Na{ delta 811 zcmcc6!*rpCX+nqK0VM`7;NgPM2PV$67d@i`;baIxXb_)ivLdteWDZ6JK@&TOXbmHT zHrZ^+XwD?yVl6Z6rm3y`gtsAocbyjbxw(PaMt%|_>*l>mZ-gf=FyjQ_&AZL)IVS(M z+cbHDy$mnNauc8-AbfW6O?!XIHx>{x8}uPGgDI3h+0jAV@&S}5UG$c60vCC1pQ`6MVsUeCt!yImO8J|6BP2C{uDp3XE2^ZKpKqGj zVUri^AD1!Zq<(8SZsxYLu6pOKKZj;svE8%JMDU2~>~A5tt?Trb%H9Y)_0XvB@x*=e zugba{oxH0tLE)qJiYW!xnj0gyOjJI~w7>q>FTv<-=y_H$uYHP?#00U;R!w3o0LkXG A+yDRo diff --git a/modules/parser/src/main/resources/darwin-x86-64/libtree-sitter-smithyql.dylib b/modules/parser/src/main/resources/darwin-x86-64/libtree-sitter-smithyql.dylib index 04116657e3ac2ad8fd6094eb8eba1ed76cb90dff..395c5791f38cbe389bba8f2db895ff45cc3942cc 100755 GIT binary patch delta 275 zcmX@nz<8p8af1OPW9?)^Mt9LQ`V3$Y0HGK_e5T2Y%+iw`m{>NiVLZYp@bK8F^4Io; zkJrzgyzj%&RQ}Bk%paAQ85kKim#8&yFvd^*rniZSfnoA;{m@MY7Z@Fxphj{+X+9_| z4yEOxv^JDBhSC90I&rd~k$56ZS1C+Z58}cqD8B(p!%S;|@}EQ1bwc@*q4Yc`eH<#k M7-Y-l1x71)0V7v0fB*mh delta 271 zcmX@nz<8p8af1OPW6fkkMt9K_`V3$Y0HGK_e5T2Y%+iw`m{>NiVLZYpkS(jsvhbIk zc8AOA>`gC@s%>sy{-`uLUQK9ovsy97JHbDuIdy=s{dp3FX&AX_#rvQ2ukMx(+CR5|o|`rH@197lCZq JyufG$F94Y2E?NKp diff --git a/modules/parser/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so b/modules/parser/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so index 45c2640ef63ea843a64e8002bd558ada542073c0..5b4f52e15e081f7f112756496022e9958956e976 100755 GIT binary patch delta 73 zcmZ3{$Fic2WkWc#f<W?_1=L3(z1a$Zt;Mv5bbb8E=n2LPzx81Mi9 delta 73 zcmZ3{$Fic2WkWc#f>DM=c0o~Lc3x7Zc~WwwaaodyfpL*ZZen(Fc15nG$>wtADy7Ny dRfRS)tNmr<&de()Es4*|Pf2Ci%&j4N9{|pr8b<&C diff --git a/modules/parser/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so b/modules/parser/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so index 744547263e582b4304a5512d104431b16cea5961..22c312457734d87bc7591a72b4d3d6573b097742 100755 GIT binary patch delta 191 zcmZqZXKd(aT)?7`Qk89PRGgVuY*CeKS(cWUSXE|GWty3jXknC>Rhe11S%JlaO>(Ls z0~oCEh0q)jieb*=My`0qg_9q0iA%18s=0xt=GbIGZgIxzn>D##s4z1yGHw3P-bXRWMGkISdmz4mRppYT$r7_S%JlaO>&AM z0~oCEh0q)jiedKTMy`0q1(P3giA%14s=0xt=ICTWZgIwIn>D##s7(H^FSJ?NAdPWy rmtoT8*M?iUIblZ6p1jglUUC7 Qualified_identifier(node) + } + def name: Identifier = Identifier(node.fields("name").head) + + export node.* +} + +object Operation_name { + def unapply(node: Node): scala.Boolean = node.tpe == "operation_name" +} + +/* + +*/ diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Qualified_identifier.scala b/modules/parser/src/main/scala/playground/generated/nodes/Qualified_identifier.scala new file mode 100644 index 00000000..057b5360 --- /dev/null +++ b/modules/parser/src/main/scala/playground/generated/nodes/Qualified_identifier.scala @@ -0,0 +1,23 @@ +// Generated code! Do not modify by hand. +package playground.generated.nodes + +import org.polyvariant.treesitter4s.Node + +case class Qualified_identifier /* private */(node: Node) extends Node { + + def head: Identifier = Identifier(node.fields("head").head) + def selection: Identifier = Identifier(node.fields("selection").head) + def tail: List[Identifier] = node.fields("tail").toList.collect { + case node @ Identifier() => Identifier(node) + } + + export node.* +} + +object Qualified_identifier { + def unapply(node: Node): scala.Boolean = node.tpe == "qualified_identifier" +} + +/* + +*/ diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Source_file.scala b/modules/parser/src/main/scala/playground/generated/nodes/Source_file.scala new file mode 100644 index 00000000..19e95f7c --- /dev/null +++ b/modules/parser/src/main/scala/playground/generated/nodes/Source_file.scala @@ -0,0 +1,20 @@ +// Generated code! Do not modify by hand. +package playground.generated.nodes + +import org.polyvariant.treesitter4s.Node + +case class Source_file /* private */(node: Node) extends Node { + + def statements: Top_level_statement = Top_level_statement(node.fields("statements").head) + def use_clause: Use_clause = Use_clause(node.fields("use_clause").head) + + export node.* +} + +object Source_file { + def unapply(node: Node): scala.Boolean = node.tpe == "source_file" +} + +/* + +*/ diff --git a/modules/parser/src/main/scala/playground/generated/nodes/String_.scala b/modules/parser/src/main/scala/playground/generated/nodes/String_.scala new file mode 100644 index 00000000..69198bcf --- /dev/null +++ b/modules/parser/src/main/scala/playground/generated/nodes/String_.scala @@ -0,0 +1,19 @@ +// Generated code! Do not modify by hand. +package playground.generated.nodes + +import org.polyvariant.treesitter4s.Node + +case class String_ /* private */(node: Node) extends Node { + + + + export node.* +} + +object String_ { + def unapply(node: Node): scala.Boolean = node.tpe == "string" +} + +/* + +*/ diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala b/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala new file mode 100644 index 00000000..f2d92645 --- /dev/null +++ b/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala @@ -0,0 +1,19 @@ +// Generated code! Do not modify by hand. +package playground.generated.nodes + +import org.polyvariant.treesitter4s.Node + +case class Struct /* private */(node: Node) extends Node { + + def bindings: Bindings = Bindings(node.fields("bindings").head) + + export node.* +} + +object Struct { + def unapply(node: Node): scala.Boolean = node.tpe == "struct" +} + +/* + +*/ diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Top_level_statement.scala b/modules/parser/src/main/scala/playground/generated/nodes/Top_level_statement.scala new file mode 100644 index 00000000..5ed000f8 --- /dev/null +++ b/modules/parser/src/main/scala/playground/generated/nodes/Top_level_statement.scala @@ -0,0 +1,19 @@ +// Generated code! Do not modify by hand. +package playground.generated.nodes + +import org.polyvariant.treesitter4s.Node + +case class Top_level_statement /* private */(node: Node) extends Node { + + + + export node.* +} + +object Top_level_statement { + def unapply(node: Node): scala.Boolean = node.tpe == "top_level_statement" +} + +/* + +*/ diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Use_clause.scala b/modules/parser/src/main/scala/playground/generated/nodes/Use_clause.scala new file mode 100644 index 00000000..b6db1017 --- /dev/null +++ b/modules/parser/src/main/scala/playground/generated/nodes/Use_clause.scala @@ -0,0 +1,19 @@ +// Generated code! Do not modify by hand. +package playground.generated.nodes + +import org.polyvariant.treesitter4s.Node + +case class Use_clause /* private */(node: Node) extends Node { + + def identifier: Qualified_identifier = Qualified_identifier(node.fields("identifier").head) + + export node.* +} + +object Use_clause { + def unapply(node: Node): scala.Boolean = node.tpe == "use_clause" +} + +/* + +*/ diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Whitespace.scala b/modules/parser/src/main/scala/playground/generated/nodes/Whitespace.scala new file mode 100644 index 00000000..6c758fe9 --- /dev/null +++ b/modules/parser/src/main/scala/playground/generated/nodes/Whitespace.scala @@ -0,0 +1,19 @@ +// Generated code! Do not modify by hand. +package playground.generated.nodes + +import org.polyvariant.treesitter4s.Node + +case class Whitespace /* private */(node: Node) extends Node { + + + + export node.* +} + +object Whitespace { + def unapply(node: Node): scala.Boolean = node.tpe == "whitespace" +} + +/* + +*/ diff --git a/modules/parser/src/main/scala/playground/generated/nodes/_Input_node.scala b/modules/parser/src/main/scala/playground/generated/nodes/_Input_node.scala new file mode 100644 index 00000000..96350ad4 --- /dev/null +++ b/modules/parser/src/main/scala/playground/generated/nodes/_Input_node.scala @@ -0,0 +1,37 @@ +// Generated code! Do not modify by hand. +package playground.generated.nodes + +import org.polyvariant.treesitter4s.Node + +enum _Input_node { + case BooleanCase(value: Boolean_) + case ListCase(value: List_) + case NullCase(value: Null_) + case NumberCase(value: Number) + case StringCase(value: String_) + case StructCase(value: Struct) + + def asNode: Node = this match { + case BooleanCase(value) => value.node + case ListCase(value) => value.node + case NullCase(value) => value.node + case NumberCase(value) => value.node + case StringCase(value) => value.node + case StructCase(value) => value.node + } +} + +object _Input_node { + def apply(node: Node): _Input_node = node match { + case node @ Boolean_() => BooleanCase(Boolean_(node)) + case node @ List_() => ListCase(List_(node)) + case node @ Null_() => NullCase(Null_(node)) + case node @ Number() => NumberCase(Number(node)) + case node @ String_() => StringCase(String_(node)) + case node @ Struct() => StructCase(Struct(node)) + } +} + +/* + +*/ diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala index 57061ba6..52deb153 100644 --- a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala +++ b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala @@ -2,31 +2,25 @@ package playground.smithyql import org.polyvariant.treesitter4s.Node import org.polyvariant.treesitter4s.TreeSitterAPI +import playground.generated.nodes.* object ParserTreeSitterDemo extends App { - def parse(s: String) = { - val p = TreeSitterAPI.make("smithyql") - val tree = p.parse(s) - println( - tree - .rootNode - .get - .fold[LazyList[Node]](_ #:: _.to(LazyList).flatten) - .filter(_.fields.nonEmpty) - .find(_.source == "Bax") - .get - .parents - .map(p => p.text) - .mkString("\n\n") - ) - } - - parse( + val tree = TreeSitterAPI.make("smithyql").parse { """ - use service foo.bar#Baz + use service foo.bar.bax.qux#Baz Bax { x = 42 } """.stripMargin - ) + } + + val bind = + Operation_call(Source_file(tree.rootNode.get).statements.children.head) + .input + .bindings + .children + .collect { case b @ Binding() => Binding(b) } + .head + + println(bind.key.source + ": " + bind.value.asNode.source) } diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc b/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc new file mode 100644 index 00000000..b3e8859d --- /dev/null +++ b/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc @@ -0,0 +1,35 @@ +import org.polyvariant.treesitter4s.Node +import org.polyvariant.treesitter4s.TreeSitterAPI +import playground.generated.nodes.* + +val s = + """ + use service foo.bar.baz.bax#Baz + + Bax { x = 42 , y = 50} + """.stripMargin + +val p = TreeSitterAPI.make("smithyql") + +val tree = p.parse(s) + +Source_file(tree.rootNode.get).use_clause.identifier.head.node.source +// +Source_file(tree.rootNode.get).use_clause.identifier.selection.node.source + +Source_file(tree.rootNode.get) + .use_clause + .identifier + .tail + +val bind = + Operation_call(Source_file(tree.rootNode.get).statements.children.head) + .input + .bindings + .children + .collect { case b @ Binding() => Binding(b) } + .head + +bind.key.source + +bind.value diff --git a/tree-sitter-smithyql/grammar.js b/tree-sitter-smithyql/grammar.js index 2e395bb5..393a439c 100644 --- a/tree-sitter-smithyql/grammar.js +++ b/tree-sitter-smithyql/grammar.js @@ -50,7 +50,7 @@ module.exports = grammar({ ) ), - input_node: ($) => + _input_node: ($) => choice($.struct, $.list, $.number, $.string, $.boolean, $.null), struct: ($) => seq("{", field("bindings", optional($.bindings)), "}"), @@ -59,9 +59,9 @@ module.exports = grammar({ bindings: ($) => comma_separated_trailing($.binding), binding: ($) => - seq(field("key", $.identifier), "=", field("value", $.input_node)), + seq(field("key", $.identifier), "=", field("value", $._input_node)), - list_fields: ($) => comma_separated_trailing($.input_node), + list_fields: ($) => comma_separated_trailing($._input_node), identifier: ($) => /[a-zA-Z_][a-zA-Z0-9_]*/, @@ -74,5 +74,6 @@ module.exports = grammar({ comment: ($) => token(seq("//", /.*/)), whitespace: ($) => /\s+/, }, + supertypes: ($) => [$._input_node], }); // From 6f16fd56840f96e938bd3fa55b9c6d68b5cc1077 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Sat, 2 Nov 2024 03:40:51 +0100 Subject: [PATCH 036/105] Improvements for more coverage --- .../playground/parsergen/ParserGen.scala | 47 +++++++++++++++---- .../playground/generated/nodes/Binding.scala | 10 ++-- .../playground/generated/nodes/Bindings.scala | 2 +- .../playground/generated/nodes/Boolean_.scala | 2 +- .../playground/generated/nodes/Comment.scala | 2 +- .../generated/nodes/Identifier.scala | 2 +- .../generated/nodes/Let_binding.scala | 2 +- .../playground/generated/nodes/List_.scala | 6 ++- .../generated/nodes/List_fields.scala | 2 +- .../playground/generated/nodes/Null_.scala | 2 +- .../playground/generated/nodes/Number.scala | 2 +- .../generated/nodes/Operation_call.scala | 10 ++-- .../generated/nodes/Operation_name.scala | 6 ++- .../nodes/Qualified_identifier.scala | 10 ++-- .../generated/nodes/Source_file.scala | 10 ++-- .../playground/generated/nodes/String_.scala | 2 +- .../playground/generated/nodes/Struct.scala | 6 ++- .../generated/nodes/Top_level_statement.scala | 2 +- .../generated/nodes/Use_clause.scala | 6 ++- .../generated/nodes/Whitespace.scala | 2 +- .../generated/nodes/_Input_node.scala | 11 ++++- .../parser/ParserTreeSitterDemo.scala | 2 +- .../smithyql/parser/demo.worksheet.sc | 4 +- 23 files changed, 108 insertions(+), 42 deletions(-) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index 27440cc8..bf5a01fd 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -6,6 +6,7 @@ import org.polyvariant.treesitter4s.Node import smithy4s.Blob import smithy4s.Document import smithy4s.json.Json +import treesittersmithy.FieldName import treesittersmithy.NodeType import treesittersmithy.NodeTypes import treesittersmithy.TypeName @@ -13,6 +14,7 @@ import util.chaining.* import java.nio.file.Files import java.nio.file.Paths +import scala.annotation.targetName import scala.jdk.CollectionConverters.* import scala.meta.Dialect @@ -24,10 +26,16 @@ def debugDump(s: String): String = "" extension (tn: TypeName) { + @targetName("renderTypeName") def render: String = tn.value.smartCapitalize.ident def asEnumCase: TypeName = TypeName(tn.value + "Case") } +extension (fn: FieldName) { + @targetName("renderFieldName") + def render: String = fn.value.ident +} + extension (tpe: NodeType) { def render: String = @@ -52,7 +60,7 @@ def renderAdt(tpe: NodeType) = { |enum $name { |${enumCases.mkString_("\n").indentTrim(2)} | - | def asNode: Node = this match { + | def node: Node = this match { |${tpe .subtypes .map { nodeType => @@ -75,6 +83,18 @@ def renderAdt(tpe: NodeType) = { .mkString_("\n") .indentTrim(4)} | } + | + | def unapply(node: Node): Boolean = node match { + |${tpe + .subtypes + .map { nodeType => + show"""case node @ ${nodeType + .tpe + .render}() => true""" + } + .mkString_("\n") + .indentTrim(4)} + | } |} | |/* @@ -90,12 +110,13 @@ def renderClass(tpe: NodeType) = { .fields .toList .map { (k, fieldType) => - val singleFieldType = fieldType + val typeUnion = fieldType .types .map(tpe => show"${tpe.tpe.render}") - .reduceLeft(_ + " | " + _) + .reduceLeftOption(_ + " | " + _) + .getOrElse(sys.error(s"unexpected empty list of types: $k (in ${tpe.tpe})")) - val fieldTypeAnnotation = singleFieldType.pipe { + val fieldTypeAnnotation = typeUnion.pipe { case s if fieldType.multiple => show"List[$s]" case s => s } @@ -110,9 +131,12 @@ def renderClass(tpe: NodeType) = { |${cases.mkString("\n").indentTrim(2)} |}""".stripMargin else - show"""${singleFieldType}($allFields.head)""" + // todo replace head with a stricter "only" check? + show"""$allFields.head match { + |${cases.mkString("\n").indentTrim(2)} + |}""".stripMargin - show"""def ${k.value}: ${fieldTypeAnnotation} = $fieldValue""" + show"""def ${k.render}: ${fieldTypeAnnotation} = $fieldValue""" } show"""// Generated code! Do not modify by hand. @@ -130,7 +154,7 @@ def renderClass(tpe: NodeType) = { |} | |object $name { - | def unapply(node: Node): scala.Boolean = node.tpe == ${tpe.tpe.value.literal} + | def unapply(node: Node): Boolean = node.tpe == ${tpe.tpe.value.literal} |} | |/* @@ -156,7 +180,14 @@ def renderClass(tpe: NodeType) = { types .filter(_.named) - .map(_.focus(_.fields.each.types).modify(_.filter(_.named))) + .map( + // only render field types that are named + _.focus(_.fields.each.types) + .modify(_.filter(_.named)) + // don't render the field if it has no types + .focus(_.fields) + .modify(_.filter((_, v) => v.types.nonEmpty)) + ) .fproduct( _.render ) diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala b/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala index cb267b13..df5f26ae 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala @@ -5,14 +5,18 @@ import org.polyvariant.treesitter4s.Node case class Binding /* private */(node: Node) extends Node { - def key: Identifier = Identifier(node.fields("key").head) - def value: _Input_node = _Input_node(node.fields("value").head) + def key: Identifier = node.fields("key").head match { + case node @ Identifier() => Identifier(node) + } + def value: _Input_node = node.fields("value").head match { + case node @ _Input_node() => _Input_node(node) + } export node.* } object Binding { - def unapply(node: Node): scala.Boolean = node.tpe == "binding" + def unapply(node: Node): Boolean = node.tpe == "binding" } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala b/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala index 77ca1e46..61156542 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala @@ -11,7 +11,7 @@ case class Bindings /* private */(node: Node) extends Node { } object Bindings { - def unapply(node: Node): scala.Boolean = node.tpe == "bindings" + def unapply(node: Node): Boolean = node.tpe == "bindings" } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Boolean_.scala b/modules/parser/src/main/scala/playground/generated/nodes/Boolean_.scala index 8fc52ea7..20e66a50 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Boolean_.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Boolean_.scala @@ -11,7 +11,7 @@ case class Boolean_ /* private */(node: Node) extends Node { } object Boolean_ { - def unapply(node: Node): scala.Boolean = node.tpe == "boolean" + def unapply(node: Node): Boolean = node.tpe == "boolean" } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Comment.scala b/modules/parser/src/main/scala/playground/generated/nodes/Comment.scala index 062e860a..64d8aae0 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Comment.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Comment.scala @@ -11,7 +11,7 @@ case class Comment /* private */(node: Node) extends Node { } object Comment { - def unapply(node: Node): scala.Boolean = node.tpe == "comment" + def unapply(node: Node): Boolean = node.tpe == "comment" } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Identifier.scala b/modules/parser/src/main/scala/playground/generated/nodes/Identifier.scala index 06e1cf9e..e3fa5e70 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Identifier.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Identifier.scala @@ -11,7 +11,7 @@ case class Identifier /* private */(node: Node) extends Node { } object Identifier { - def unapply(node: Node): scala.Boolean = node.tpe == "identifier" + def unapply(node: Node): Boolean = node.tpe == "identifier" } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Let_binding.scala b/modules/parser/src/main/scala/playground/generated/nodes/Let_binding.scala index e18a249f..f92f48bd 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Let_binding.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Let_binding.scala @@ -11,7 +11,7 @@ case class Let_binding /* private */(node: Node) extends Node { } object Let_binding { - def unapply(node: Node): scala.Boolean = node.tpe == "let_binding" + def unapply(node: Node): Boolean = node.tpe == "let_binding" } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/List_.scala b/modules/parser/src/main/scala/playground/generated/nodes/List_.scala index 2a31ea3f..755748c5 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/List_.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/List_.scala @@ -5,13 +5,15 @@ import org.polyvariant.treesitter4s.Node case class List_ /* private */(node: Node) extends Node { - def list_fields: List_fields = List_fields(node.fields("list_fields").head) + def list_fields: List_fields = node.fields("list_fields").head match { + case node @ List_fields() => List_fields(node) + } export node.* } object List_ { - def unapply(node: Node): scala.Boolean = node.tpe == "list" + def unapply(node: Node): Boolean = node.tpe == "list" } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/List_fields.scala b/modules/parser/src/main/scala/playground/generated/nodes/List_fields.scala index 7923e68a..799bf038 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/List_fields.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/List_fields.scala @@ -11,7 +11,7 @@ case class List_fields /* private */(node: Node) extends Node { } object List_fields { - def unapply(node: Node): scala.Boolean = node.tpe == "list_fields" + def unapply(node: Node): Boolean = node.tpe == "list_fields" } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Null_.scala b/modules/parser/src/main/scala/playground/generated/nodes/Null_.scala index 1ab7527c..1d6b39c0 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Null_.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Null_.scala @@ -11,7 +11,7 @@ case class Null_ /* private */(node: Node) extends Node { } object Null_ { - def unapply(node: Node): scala.Boolean = node.tpe == "null" + def unapply(node: Node): Boolean = node.tpe == "null" } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Number.scala b/modules/parser/src/main/scala/playground/generated/nodes/Number.scala index 4713a0a8..8cc857ca 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Number.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Number.scala @@ -11,7 +11,7 @@ case class Number /* private */(node: Node) extends Node { } object Number { - def unapply(node: Node): scala.Boolean = node.tpe == "number" + def unapply(node: Node): Boolean = node.tpe == "number" } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Operation_call.scala b/modules/parser/src/main/scala/playground/generated/nodes/Operation_call.scala index 57b4f82a..b34f252a 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Operation_call.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Operation_call.scala @@ -5,14 +5,18 @@ import org.polyvariant.treesitter4s.Node case class Operation_call /* private */(node: Node) extends Node { - def input: Struct = Struct(node.fields("input").head) - def operation_name: Operation_name = Operation_name(node.fields("operation_name").head) + def input: Struct = node.fields("input").head match { + case node @ Struct() => Struct(node) + } + def operation_name: Operation_name = node.fields("operation_name").head match { + case node @ Operation_name() => Operation_name(node) + } export node.* } object Operation_call { - def unapply(node: Node): scala.Boolean = node.tpe == "operation_call" + def unapply(node: Node): Boolean = node.tpe == "operation_call" } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Operation_name.scala b/modules/parser/src/main/scala/playground/generated/nodes/Operation_name.scala index 9a58e09d..f3a9adfb 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Operation_name.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Operation_name.scala @@ -8,13 +8,15 @@ case class Operation_name /* private */(node: Node) extends Node { def identifier: List[Qualified_identifier] = node.fields("identifier").toList.collect { case node @ Qualified_identifier() => Qualified_identifier(node) } - def name: Identifier = Identifier(node.fields("name").head) + def name: Identifier = node.fields("name").head match { + case node @ Identifier() => Identifier(node) + } export node.* } object Operation_name { - def unapply(node: Node): scala.Boolean = node.tpe == "operation_name" + def unapply(node: Node): Boolean = node.tpe == "operation_name" } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Qualified_identifier.scala b/modules/parser/src/main/scala/playground/generated/nodes/Qualified_identifier.scala index 057b5360..5e684301 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Qualified_identifier.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Qualified_identifier.scala @@ -5,8 +5,12 @@ import org.polyvariant.treesitter4s.Node case class Qualified_identifier /* private */(node: Node) extends Node { - def head: Identifier = Identifier(node.fields("head").head) - def selection: Identifier = Identifier(node.fields("selection").head) + def head: Identifier = node.fields("head").head match { + case node @ Identifier() => Identifier(node) + } + def selection: Identifier = node.fields("selection").head match { + case node @ Identifier() => Identifier(node) + } def tail: List[Identifier] = node.fields("tail").toList.collect { case node @ Identifier() => Identifier(node) } @@ -15,7 +19,7 @@ case class Qualified_identifier /* private */(node: Node) extends Node { } object Qualified_identifier { - def unapply(node: Node): scala.Boolean = node.tpe == "qualified_identifier" + def unapply(node: Node): Boolean = node.tpe == "qualified_identifier" } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Source_file.scala b/modules/parser/src/main/scala/playground/generated/nodes/Source_file.scala index 19e95f7c..c560a434 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Source_file.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Source_file.scala @@ -5,14 +5,18 @@ import org.polyvariant.treesitter4s.Node case class Source_file /* private */(node: Node) extends Node { - def statements: Top_level_statement = Top_level_statement(node.fields("statements").head) - def use_clause: Use_clause = Use_clause(node.fields("use_clause").head) + def statements: Top_level_statement = node.fields("statements").head match { + case node @ Top_level_statement() => Top_level_statement(node) + } + def use_clause: Use_clause = node.fields("use_clause").head match { + case node @ Use_clause() => Use_clause(node) + } export node.* } object Source_file { - def unapply(node: Node): scala.Boolean = node.tpe == "source_file" + def unapply(node: Node): Boolean = node.tpe == "source_file" } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/String_.scala b/modules/parser/src/main/scala/playground/generated/nodes/String_.scala index 69198bcf..b46b7230 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/String_.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/String_.scala @@ -11,7 +11,7 @@ case class String_ /* private */(node: Node) extends Node { } object String_ { - def unapply(node: Node): scala.Boolean = node.tpe == "string" + def unapply(node: Node): Boolean = node.tpe == "string" } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala b/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala index f2d92645..640f290b 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala @@ -5,13 +5,15 @@ import org.polyvariant.treesitter4s.Node case class Struct /* private */(node: Node) extends Node { - def bindings: Bindings = Bindings(node.fields("bindings").head) + def bindings: Bindings = node.fields("bindings").head match { + case node @ Bindings() => Bindings(node) + } export node.* } object Struct { - def unapply(node: Node): scala.Boolean = node.tpe == "struct" + def unapply(node: Node): Boolean = node.tpe == "struct" } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Top_level_statement.scala b/modules/parser/src/main/scala/playground/generated/nodes/Top_level_statement.scala index 5ed000f8..e93d1399 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Top_level_statement.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Top_level_statement.scala @@ -11,7 +11,7 @@ case class Top_level_statement /* private */(node: Node) extends Node { } object Top_level_statement { - def unapply(node: Node): scala.Boolean = node.tpe == "top_level_statement" + def unapply(node: Node): Boolean = node.tpe == "top_level_statement" } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Use_clause.scala b/modules/parser/src/main/scala/playground/generated/nodes/Use_clause.scala index b6db1017..955624a8 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Use_clause.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Use_clause.scala @@ -5,13 +5,15 @@ import org.polyvariant.treesitter4s.Node case class Use_clause /* private */(node: Node) extends Node { - def identifier: Qualified_identifier = Qualified_identifier(node.fields("identifier").head) + def identifier: Qualified_identifier = node.fields("identifier").head match { + case node @ Qualified_identifier() => Qualified_identifier(node) + } export node.* } object Use_clause { - def unapply(node: Node): scala.Boolean = node.tpe == "use_clause" + def unapply(node: Node): Boolean = node.tpe == "use_clause" } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Whitespace.scala b/modules/parser/src/main/scala/playground/generated/nodes/Whitespace.scala index 6c758fe9..5a4ac3c6 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Whitespace.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Whitespace.scala @@ -11,7 +11,7 @@ case class Whitespace /* private */(node: Node) extends Node { } object Whitespace { - def unapply(node: Node): scala.Boolean = node.tpe == "whitespace" + def unapply(node: Node): Boolean = node.tpe == "whitespace" } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/_Input_node.scala b/modules/parser/src/main/scala/playground/generated/nodes/_Input_node.scala index 96350ad4..9fe55b5a 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/_Input_node.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/_Input_node.scala @@ -11,7 +11,7 @@ enum _Input_node { case StringCase(value: String_) case StructCase(value: Struct) - def asNode: Node = this match { + def node: Node = this match { case BooleanCase(value) => value.node case ListCase(value) => value.node case NullCase(value) => value.node @@ -30,6 +30,15 @@ object _Input_node { case node @ String_() => StringCase(String_(node)) case node @ Struct() => StructCase(Struct(node)) } + + def unapply(node: Node): Boolean = node match { + case node @ Boolean_() => true + case node @ List_() => true + case node @ Null_() => true + case node @ Number() => true + case node @ String_() => true + case node @ Struct() => true + } } /* diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala index 52deb153..0f7873c5 100644 --- a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala +++ b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala @@ -22,5 +22,5 @@ object ParserTreeSitterDemo extends App { .collect { case b @ Binding() => Binding(b) } .head - println(bind.key.source + ": " + bind.value.asNode.source) + println(bind.key.source + ": " + bind.value.node.source) } diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc b/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc index b3e8859d..fb5dd854 100644 --- a/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc +++ b/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc @@ -32,4 +32,6 @@ val bind = bind.key.source -bind.value +bind.value match { + case _Input_node.NumberCase(value) => value.source +} From 5473186532d17535eda94e6d3be7ceb960c4314d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Sun, 3 Nov 2024 02:11:05 +0100 Subject: [PATCH 037/105] Render typedChildren --- .../playground/parsergen/ParserGen.scala | 32 ++++++++++++++++++- .../playground/generated/nodes/Bindings.scala | 4 ++- .../generated/nodes/Let_binding.scala | 5 ++- .../generated/nodes/List_fields.scala | 4 ++- .../generated/nodes/Top_level_statement.scala | 5 ++- .../generated/nodes/Use_clause.scala | 4 ++- .../smithyql/parser/demo.worksheet.sc | 5 +-- 7 files changed, 51 insertions(+), 8 deletions(-) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index bf5a01fd..f581bcbc 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -139,6 +139,36 @@ def renderClass(tpe: NodeType) = { show"""def ${k.render}: ${fieldTypeAnnotation} = $fieldValue""" } + val typedChildren = tpe.children.map { fieldType => + val typeUnion = fieldType + .types + .map(tpe => show"${tpe.tpe.render}") + .reduceLeftOption(_ + " | " + _) + .getOrElse(sys.error(s"unexpected empty list of types in children: (in ${tpe.tpe})")) + + val fieldTypeAnnotation = typeUnion.pipe { + case s if fieldType.multiple => show"List[$s]" + case s => s + } + + val allChildren = show"""node.children""" + + val cases = fieldType.types.map { typeInfo => + show"""case node @ ${typeInfo.tpe.render}() => ${typeInfo.tpe.render}(node)""" + } + + val fieldValue = + if fieldType.multiple then show"""$allChildren.toList.collect { + |${cases.mkString("\n").indentTrim(2)} + |}""".stripMargin + else + show"""$allChildren.head match { + |${cases.mkString("\n").indentTrim(2)} + |}""".stripMargin + + show"""def typedChildren: ${fieldTypeAnnotation} = $fieldValue""" + } + show"""// Generated code! Do not modify by hand. |package playground.generated.nodes | @@ -149,7 +179,7 @@ def renderClass(tpe: NodeType) = { |${fieldGetters .mkString_("\n") .indentTrim(2)} - | + |${typedChildren.foldMap(s => (s + "\n").indentTrim(2)): String} | export node.* |} | diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala b/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala index 61156542..0c74411b 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala @@ -6,7 +6,9 @@ import org.polyvariant.treesitter4s.Node case class Bindings /* private */(node: Node) extends Node { - + def typedChildren: List[Binding] = node.children.toList.collect { + case node @ Binding() => Binding(node) + } export node.* } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Let_binding.scala b/modules/parser/src/main/scala/playground/generated/nodes/Let_binding.scala index f92f48bd..f92684e0 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Let_binding.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Let_binding.scala @@ -6,7 +6,10 @@ import org.polyvariant.treesitter4s.Node case class Let_binding /* private */(node: Node) extends Node { - + def typedChildren: List[Binding | Whitespace] = node.children.toList.collect { + case node @ Binding() => Binding(node) + case node @ Whitespace() => Whitespace(node) + } export node.* } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/List_fields.scala b/modules/parser/src/main/scala/playground/generated/nodes/List_fields.scala index 799bf038..3fbe14b9 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/List_fields.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/List_fields.scala @@ -6,7 +6,9 @@ import org.polyvariant.treesitter4s.Node case class List_fields /* private */(node: Node) extends Node { - + def typedChildren: List[_Input_node] = node.children.toList.collect { + case node @ _Input_node() => _Input_node(node) + } export node.* } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Top_level_statement.scala b/modules/parser/src/main/scala/playground/generated/nodes/Top_level_statement.scala index e93d1399..7c0c1658 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Top_level_statement.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Top_level_statement.scala @@ -6,7 +6,10 @@ import org.polyvariant.treesitter4s.Node case class Top_level_statement /* private */(node: Node) extends Node { - + def typedChildren: Let_binding | Operation_call = node.children.head match { + case node @ Let_binding() => Let_binding(node) + case node @ Operation_call() => Operation_call(node) + } export node.* } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Use_clause.scala b/modules/parser/src/main/scala/playground/generated/nodes/Use_clause.scala index 955624a8..a6de1ea1 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Use_clause.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Use_clause.scala @@ -8,7 +8,9 @@ case class Use_clause /* private */(node: Node) extends Node { def identifier: Qualified_identifier = node.fields("identifier").head match { case node @ Qualified_identifier() => Qualified_identifier(node) } - + def typedChildren: List[Whitespace] = node.children.toList.collect { + case node @ Whitespace() => Whitespace(node) + } export node.* } diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc b/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc index fb5dd854..978e73a8 100644 --- a/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc +++ b/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc @@ -6,7 +6,7 @@ val s = """ use service foo.bar.baz.bax#Baz - Bax { x = 42 , y = 50} + Bax { a = , x = 44 , y = 50} """.stripMargin val p = TreeSitterAPI.make("smithyql") @@ -28,7 +28,8 @@ val bind = .bindings .children .collect { case b @ Binding() => Binding(b) } - .head + .find(_.key.source == "x") + .get bind.key.source From 2c619eeb8bbd6ac7665a677dd1945f5abeab49f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Sun, 3 Nov 2024 02:13:11 +0100 Subject: [PATCH 038/105] Simpler whitespace --- .../src/main/scala/playground/parsergen/ParserGen.scala | 8 +++----- .../main/scala/playground/generated/nodes/Binding.scala | 3 ++- .../main/scala/playground/generated/nodes/Bindings.scala | 2 +- .../scala/playground/generated/nodes/Let_binding.scala | 2 +- .../src/main/scala/playground/generated/nodes/List_.scala | 2 +- .../scala/playground/generated/nodes/List_fields.scala | 2 +- .../scala/playground/generated/nodes/Operation_call.scala | 3 ++- .../scala/playground/generated/nodes/Operation_name.scala | 3 ++- .../playground/generated/nodes/Qualified_identifier.scala | 4 +++- .../scala/playground/generated/nodes/Source_file.scala | 3 ++- .../main/scala/playground/generated/nodes/Struct.scala | 2 +- .../playground/generated/nodes/Top_level_statement.scala | 2 +- .../scala/playground/generated/nodes/Use_clause.scala | 2 +- 13 files changed, 21 insertions(+), 17 deletions(-) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index f581bcbc..acab4bed 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -175,11 +175,9 @@ def renderClass(tpe: NodeType) = { |import ${classOf[Node].getName()} | |case class $name /* private */(node: Node) extends Node { - - |${fieldGetters - .mkString_("\n") - .indentTrim(2)} - |${typedChildren.foldMap(s => (s + "\n").indentTrim(2)): String} + |${fieldGetters.mkString_("\n\n").indentTrim(2)} + |${typedChildren.foldMap(_.indentTrim(2)): String} + | | export node.* |} | diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala b/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala index df5f26ae..10fa697b 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala @@ -4,14 +4,15 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class Binding /* private */(node: Node) extends Node { - def key: Identifier = node.fields("key").head match { case node @ Identifier() => Identifier(node) } + def value: _Input_node = node.fields("value").head match { case node @ _Input_node() => _Input_node(node) } + export node.* } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala b/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala index 0c74411b..63f9dcde 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala @@ -5,10 +5,10 @@ import org.polyvariant.treesitter4s.Node case class Bindings /* private */(node: Node) extends Node { - def typedChildren: List[Binding] = node.children.toList.collect { case node @ Binding() => Binding(node) } + export node.* } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Let_binding.scala b/modules/parser/src/main/scala/playground/generated/nodes/Let_binding.scala index f92684e0..28e85df5 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Let_binding.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Let_binding.scala @@ -5,11 +5,11 @@ import org.polyvariant.treesitter4s.Node case class Let_binding /* private */(node: Node) extends Node { - def typedChildren: List[Binding | Whitespace] = node.children.toList.collect { case node @ Binding() => Binding(node) case node @ Whitespace() => Whitespace(node) } + export node.* } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/List_.scala b/modules/parser/src/main/scala/playground/generated/nodes/List_.scala index 755748c5..7ab569a7 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/List_.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/List_.scala @@ -4,11 +4,11 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class List_ /* private */(node: Node) extends Node { - def list_fields: List_fields = node.fields("list_fields").head match { case node @ List_fields() => List_fields(node) } + export node.* } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/List_fields.scala b/modules/parser/src/main/scala/playground/generated/nodes/List_fields.scala index 3fbe14b9..8ecb3f46 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/List_fields.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/List_fields.scala @@ -5,10 +5,10 @@ import org.polyvariant.treesitter4s.Node case class List_fields /* private */(node: Node) extends Node { - def typedChildren: List[_Input_node] = node.children.toList.collect { case node @ _Input_node() => _Input_node(node) } + export node.* } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Operation_call.scala b/modules/parser/src/main/scala/playground/generated/nodes/Operation_call.scala index b34f252a..6f7ea6d3 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Operation_call.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Operation_call.scala @@ -4,14 +4,15 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class Operation_call /* private */(node: Node) extends Node { - def input: Struct = node.fields("input").head match { case node @ Struct() => Struct(node) } + def operation_name: Operation_name = node.fields("operation_name").head match { case node @ Operation_name() => Operation_name(node) } + export node.* } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Operation_name.scala b/modules/parser/src/main/scala/playground/generated/nodes/Operation_name.scala index f3a9adfb..dcea8719 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Operation_name.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Operation_name.scala @@ -4,14 +4,15 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class Operation_name /* private */(node: Node) extends Node { - def identifier: List[Qualified_identifier] = node.fields("identifier").toList.collect { case node @ Qualified_identifier() => Qualified_identifier(node) } + def name: Identifier = node.fields("name").head match { case node @ Identifier() => Identifier(node) } + export node.* } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Qualified_identifier.scala b/modules/parser/src/main/scala/playground/generated/nodes/Qualified_identifier.scala index 5e684301..30bd62e4 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Qualified_identifier.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Qualified_identifier.scala @@ -4,17 +4,19 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class Qualified_identifier /* private */(node: Node) extends Node { - def head: Identifier = node.fields("head").head match { case node @ Identifier() => Identifier(node) } + def selection: Identifier = node.fields("selection").head match { case node @ Identifier() => Identifier(node) } + def tail: List[Identifier] = node.fields("tail").toList.collect { case node @ Identifier() => Identifier(node) } + export node.* } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Source_file.scala b/modules/parser/src/main/scala/playground/generated/nodes/Source_file.scala index c560a434..e1411dda 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Source_file.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Source_file.scala @@ -4,14 +4,15 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class Source_file /* private */(node: Node) extends Node { - def statements: Top_level_statement = node.fields("statements").head match { case node @ Top_level_statement() => Top_level_statement(node) } + def use_clause: Use_clause = node.fields("use_clause").head match { case node @ Use_clause() => Use_clause(node) } + export node.* } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala b/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala index 640f290b..96a9a1c0 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala @@ -4,11 +4,11 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class Struct /* private */(node: Node) extends Node { - def bindings: Bindings = node.fields("bindings").head match { case node @ Bindings() => Bindings(node) } + export node.* } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Top_level_statement.scala b/modules/parser/src/main/scala/playground/generated/nodes/Top_level_statement.scala index 7c0c1658..1aa891cc 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Top_level_statement.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Top_level_statement.scala @@ -5,11 +5,11 @@ import org.polyvariant.treesitter4s.Node case class Top_level_statement /* private */(node: Node) extends Node { - def typedChildren: Let_binding | Operation_call = node.children.head match { case node @ Let_binding() => Let_binding(node) case node @ Operation_call() => Operation_call(node) } + export node.* } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Use_clause.scala b/modules/parser/src/main/scala/playground/generated/nodes/Use_clause.scala index a6de1ea1..76d7af08 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Use_clause.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Use_clause.scala @@ -4,13 +4,13 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class Use_clause /* private */(node: Node) extends Node { - def identifier: Qualified_identifier = node.fields("identifier").head match { case node @ Qualified_identifier() => Qualified_identifier(node) } def typedChildren: List[Whitespace] = node.children.toList.collect { case node @ Whitespace() => Whitespace(node) } + export node.* } From 53f77dfff946f8035ae04d96d13e4431aefa2c0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Sun, 3 Nov 2024 02:46:09 +0100 Subject: [PATCH 039/105] get rid of underscores --- .../playground/parsergen/ParserGen.scala | 7 ++---- .../playground/generated/nodes/Binding.scala | 4 +-- .../{_Input_node.scala => InputNode.scala} | 6 ++--- .../{Let_binding.scala => LetBinding.scala} | 4 +-- .../{List_fields.scala => ListFields.scala} | 8 +++--- .../playground/generated/nodes/List_.scala | 4 +-- ...eration_call.scala => OperationCall.scala} | 8 +++--- ...eration_name.scala => OperationName.scala} | 8 +++--- ...tifier.scala => QualifiedIdentifier.scala} | 4 +-- .../generated/nodes/SourceFile.scala | 25 +++++++++++++++++++ .../generated/nodes/Source_file.scala | 25 ------------------- .../generated/nodes/TopLevelStatement.scala | 22 ++++++++++++++++ .../generated/nodes/Top_level_statement.scala | 22 ---------------- .../{Use_clause.scala => UseClause.scala} | 8 +++--- .../parser/ParserTreeSitterDemo.scala | 2 +- .../smithyql/parser/demo.worksheet.sc | 12 ++++----- 16 files changed, 83 insertions(+), 86 deletions(-) rename modules/parser/src/main/scala/playground/generated/nodes/{_Input_node.scala => InputNode.scala} (92%) rename modules/parser/src/main/scala/playground/generated/nodes/{Let_binding.scala => LetBinding.scala} (82%) rename modules/parser/src/main/scala/playground/generated/nodes/{List_fields.scala => ListFields.scala} (51%) rename modules/parser/src/main/scala/playground/generated/nodes/{Operation_call.scala => OperationCall.scala} (58%) rename modules/parser/src/main/scala/playground/generated/nodes/{Operation_name.scala => OperationName.scala} (57%) rename modules/parser/src/main/scala/playground/generated/nodes/{Qualified_identifier.scala => QualifiedIdentifier.scala} (84%) create mode 100644 modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala delete mode 100644 modules/parser/src/main/scala/playground/generated/nodes/Source_file.scala create mode 100644 modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala delete mode 100644 modules/parser/src/main/scala/playground/generated/nodes/Top_level_statement.scala rename modules/parser/src/main/scala/playground/generated/nodes/{Use_clause.scala => UseClause.scala} (59%) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index acab4bed..d8f3dfec 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -27,7 +27,7 @@ def debugDump(s: String): String = extension (tn: TypeName) { @targetName("renderTypeName") - def render: String = tn.value.smartCapitalize.ident + def render: String = tn.value.dropWhile(_ == '_').fromSnakeCase.ident def asEnumCase: TypeName = TypeName(tn.value + "Case") } @@ -249,10 +249,7 @@ extension (s: String) { scala.meta.Name(s).printSyntaxFor(scala.meta.dialects.Scala3) } - def smartCapitalize: String = { - val (before, after) = s.span(!_.isLetter) - before + after.capitalize - } + def fromSnakeCase: String = s.split('_').map(_.capitalize).mkString } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala b/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala index 10fa697b..a8c0ee81 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala @@ -8,8 +8,8 @@ case class Binding /* private */(node: Node) extends Node { case node @ Identifier() => Identifier(node) } - def value: _Input_node = node.fields("value").head match { - case node @ _Input_node() => _Input_node(node) + def value: InputNode = node.fields("value").head match { + case node @ InputNode() => InputNode(node) } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/_Input_node.scala b/modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala similarity index 92% rename from modules/parser/src/main/scala/playground/generated/nodes/_Input_node.scala rename to modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala index 9fe55b5a..5af4b6a8 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/_Input_node.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala @@ -3,7 +3,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -enum _Input_node { +enum InputNode { case BooleanCase(value: Boolean_) case ListCase(value: List_) case NullCase(value: Null_) @@ -21,8 +21,8 @@ enum _Input_node { } } -object _Input_node { - def apply(node: Node): _Input_node = node match { +object InputNode { + def apply(node: Node): InputNode = node match { case node @ Boolean_() => BooleanCase(Boolean_(node)) case node @ List_() => ListCase(List_(node)) case node @ Null_() => NullCase(Null_(node)) diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Let_binding.scala b/modules/parser/src/main/scala/playground/generated/nodes/LetBinding.scala similarity index 82% rename from modules/parser/src/main/scala/playground/generated/nodes/Let_binding.scala rename to modules/parser/src/main/scala/playground/generated/nodes/LetBinding.scala index 28e85df5..e2af6ae5 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Let_binding.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/LetBinding.scala @@ -3,7 +3,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class Let_binding /* private */(node: Node) extends Node { +case class LetBinding /* private */(node: Node) extends Node { def typedChildren: List[Binding | Whitespace] = node.children.toList.collect { case node @ Binding() => Binding(node) @@ -13,7 +13,7 @@ case class Let_binding /* private */(node: Node) extends Node { export node.* } -object Let_binding { +object LetBinding { def unapply(node: Node): Boolean = node.tpe == "let_binding" } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/List_fields.scala b/modules/parser/src/main/scala/playground/generated/nodes/ListFields.scala similarity index 51% rename from modules/parser/src/main/scala/playground/generated/nodes/List_fields.scala rename to modules/parser/src/main/scala/playground/generated/nodes/ListFields.scala index 8ecb3f46..23e8fbb5 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/List_fields.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/ListFields.scala @@ -3,16 +3,16 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class List_fields /* private */(node: Node) extends Node { +case class ListFields /* private */(node: Node) extends Node { - def typedChildren: List[_Input_node] = node.children.toList.collect { - case node @ _Input_node() => _Input_node(node) + def typedChildren: List[InputNode] = node.children.toList.collect { + case node @ InputNode() => InputNode(node) } export node.* } -object List_fields { +object ListFields { def unapply(node: Node): Boolean = node.tpe == "list_fields" } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/List_.scala b/modules/parser/src/main/scala/playground/generated/nodes/List_.scala index 7ab569a7..1db96733 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/List_.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/List_.scala @@ -4,8 +4,8 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class List_ /* private */(node: Node) extends Node { - def list_fields: List_fields = node.fields("list_fields").head match { - case node @ List_fields() => List_fields(node) + def list_fields: ListFields = node.fields("list_fields").head match { + case node @ ListFields() => ListFields(node) } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Operation_call.scala b/modules/parser/src/main/scala/playground/generated/nodes/OperationCall.scala similarity index 58% rename from modules/parser/src/main/scala/playground/generated/nodes/Operation_call.scala rename to modules/parser/src/main/scala/playground/generated/nodes/OperationCall.scala index 6f7ea6d3..fa305d05 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Operation_call.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/OperationCall.scala @@ -3,20 +3,20 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class Operation_call /* private */(node: Node) extends Node { +case class OperationCall /* private */(node: Node) extends Node { def input: Struct = node.fields("input").head match { case node @ Struct() => Struct(node) } - def operation_name: Operation_name = node.fields("operation_name").head match { - case node @ Operation_name() => Operation_name(node) + def operation_name: OperationName = node.fields("operation_name").head match { + case node @ OperationName() => OperationName(node) } export node.* } -object Operation_call { +object OperationCall { def unapply(node: Node): Boolean = node.tpe == "operation_call" } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Operation_name.scala b/modules/parser/src/main/scala/playground/generated/nodes/OperationName.scala similarity index 57% rename from modules/parser/src/main/scala/playground/generated/nodes/Operation_name.scala rename to modules/parser/src/main/scala/playground/generated/nodes/OperationName.scala index dcea8719..1aae3541 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Operation_name.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/OperationName.scala @@ -3,9 +3,9 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class Operation_name /* private */(node: Node) extends Node { - def identifier: List[Qualified_identifier] = node.fields("identifier").toList.collect { - case node @ Qualified_identifier() => Qualified_identifier(node) +case class OperationName /* private */(node: Node) extends Node { + def identifier: List[QualifiedIdentifier] = node.fields("identifier").toList.collect { + case node @ QualifiedIdentifier() => QualifiedIdentifier(node) } def name: Identifier = node.fields("name").head match { @@ -16,7 +16,7 @@ case class Operation_name /* private */(node: Node) extends Node { export node.* } -object Operation_name { +object OperationName { def unapply(node: Node): Boolean = node.tpe == "operation_name" } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Qualified_identifier.scala b/modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala similarity index 84% rename from modules/parser/src/main/scala/playground/generated/nodes/Qualified_identifier.scala rename to modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala index 30bd62e4..bd914f53 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Qualified_identifier.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala @@ -3,7 +3,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class Qualified_identifier /* private */(node: Node) extends Node { +case class QualifiedIdentifier /* private */(node: Node) extends Node { def head: Identifier = node.fields("head").head match { case node @ Identifier() => Identifier(node) } @@ -20,7 +20,7 @@ case class Qualified_identifier /* private */(node: Node) extends Node { export node.* } -object Qualified_identifier { +object QualifiedIdentifier { def unapply(node: Node): Boolean = node.tpe == "qualified_identifier" } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala b/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala new file mode 100644 index 00000000..d11c901a --- /dev/null +++ b/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala @@ -0,0 +1,25 @@ +// Generated code! Do not modify by hand. +package playground.generated.nodes + +import org.polyvariant.treesitter4s.Node + +case class SourceFile /* private */(node: Node) extends Node { + def statements: TopLevelStatement = node.fields("statements").head match { + case node @ TopLevelStatement() => TopLevelStatement(node) + } + + def use_clause: UseClause = node.fields("use_clause").head match { + case node @ UseClause() => UseClause(node) + } + + + export node.* +} + +object SourceFile { + def unapply(node: Node): Boolean = node.tpe == "source_file" +} + +/* + +*/ diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Source_file.scala b/modules/parser/src/main/scala/playground/generated/nodes/Source_file.scala deleted file mode 100644 index e1411dda..00000000 --- a/modules/parser/src/main/scala/playground/generated/nodes/Source_file.scala +++ /dev/null @@ -1,25 +0,0 @@ -// Generated code! Do not modify by hand. -package playground.generated.nodes - -import org.polyvariant.treesitter4s.Node - -case class Source_file /* private */(node: Node) extends Node { - def statements: Top_level_statement = node.fields("statements").head match { - case node @ Top_level_statement() => Top_level_statement(node) - } - - def use_clause: Use_clause = node.fields("use_clause").head match { - case node @ Use_clause() => Use_clause(node) - } - - - export node.* -} - -object Source_file { - def unapply(node: Node): Boolean = node.tpe == "source_file" -} - -/* - -*/ diff --git a/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala b/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala new file mode 100644 index 00000000..031e7d81 --- /dev/null +++ b/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala @@ -0,0 +1,22 @@ +// Generated code! Do not modify by hand. +package playground.generated.nodes + +import org.polyvariant.treesitter4s.Node + +case class TopLevelStatement /* private */(node: Node) extends Node { + + def typedChildren: LetBinding | OperationCall = node.children.head match { + case node @ LetBinding() => LetBinding(node) + case node @ OperationCall() => OperationCall(node) + } + + export node.* +} + +object TopLevelStatement { + def unapply(node: Node): Boolean = node.tpe == "top_level_statement" +} + +/* + +*/ diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Top_level_statement.scala b/modules/parser/src/main/scala/playground/generated/nodes/Top_level_statement.scala deleted file mode 100644 index 1aa891cc..00000000 --- a/modules/parser/src/main/scala/playground/generated/nodes/Top_level_statement.scala +++ /dev/null @@ -1,22 +0,0 @@ -// Generated code! Do not modify by hand. -package playground.generated.nodes - -import org.polyvariant.treesitter4s.Node - -case class Top_level_statement /* private */(node: Node) extends Node { - - def typedChildren: Let_binding | Operation_call = node.children.head match { - case node @ Let_binding() => Let_binding(node) - case node @ Operation_call() => Operation_call(node) - } - - export node.* -} - -object Top_level_statement { - def unapply(node: Node): Boolean = node.tpe == "top_level_statement" -} - -/* - -*/ diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Use_clause.scala b/modules/parser/src/main/scala/playground/generated/nodes/UseClause.scala similarity index 59% rename from modules/parser/src/main/scala/playground/generated/nodes/Use_clause.scala rename to modules/parser/src/main/scala/playground/generated/nodes/UseClause.scala index 76d7af08..b5e08af1 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Use_clause.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/UseClause.scala @@ -3,9 +3,9 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class Use_clause /* private */(node: Node) extends Node { - def identifier: Qualified_identifier = node.fields("identifier").head match { - case node @ Qualified_identifier() => Qualified_identifier(node) +case class UseClause /* private */(node: Node) extends Node { + def identifier: QualifiedIdentifier = node.fields("identifier").head match { + case node @ QualifiedIdentifier() => QualifiedIdentifier(node) } def typedChildren: List[Whitespace] = node.children.toList.collect { case node @ Whitespace() => Whitespace(node) @@ -14,7 +14,7 @@ case class Use_clause /* private */(node: Node) extends Node { export node.* } -object Use_clause { +object UseClause { def unapply(node: Node): Boolean = node.tpe == "use_clause" } diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala index 0f7873c5..2d59a579 100644 --- a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala +++ b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala @@ -15,7 +15,7 @@ object ParserTreeSitterDemo extends App { } val bind = - Operation_call(Source_file(tree.rootNode.get).statements.children.head) + OperationCall(SourceFile(tree.rootNode.get).statements.children.head) .input .bindings .children diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc b/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc index 978e73a8..ad4cae2d 100644 --- a/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc +++ b/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc @@ -13,17 +13,17 @@ val p = TreeSitterAPI.make("smithyql") val tree = p.parse(s) -Source_file(tree.rootNode.get).use_clause.identifier.head.node.source -// -Source_file(tree.rootNode.get).use_clause.identifier.selection.node.source +SourceFile(tree.rootNode.get).use_clause.identifier.head.node.source -Source_file(tree.rootNode.get) +SourceFile(tree.rootNode.get).use_clause.identifier.selection.node.source + +SourceFile(tree.rootNode.get) .use_clause .identifier .tail val bind = - Operation_call(Source_file(tree.rootNode.get).statements.children.head) + OperationCall(SourceFile(tree.rootNode.get).statements.children.head) .input .bindings .children @@ -34,5 +34,5 @@ val bind = bind.key.source bind.value match { - case _Input_node.NumberCase(value) => value.source + case InputNode.NumberCase(value) => value.source } From 30fe370856da38587f4547343b796dfcccb73a83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Sun, 3 Nov 2024 03:01:41 +0100 Subject: [PATCH 040/105] Add precise typed children --- .../playground/parsergen/ParserGen.scala | 34 +++++++++++++++++++ .../playground/generated/nodes/Binding.scala | 4 +++ .../playground/generated/nodes/Bindings.scala | 6 ++++ .../playground/generated/nodes/Boolean_.scala | 4 +++ .../playground/generated/nodes/Comment.scala | 4 +++ .../generated/nodes/Identifier.scala | 4 +++ .../generated/nodes/LetBinding.scala | 10 ++++++ .../generated/nodes/ListFields.scala | 6 ++++ .../playground/generated/nodes/List_.scala | 4 +++ .../playground/generated/nodes/Null_.scala | 4 +++ .../playground/generated/nodes/Number.scala | 4 +++ .../generated/nodes/OperationCall.scala | 4 +++ .../generated/nodes/OperationName.scala | 4 +++ .../generated/nodes/QualifiedIdentifier.scala | 4 +++ .../generated/nodes/SourceFile.scala | 4 +++ .../playground/generated/nodes/String_.scala | 4 +++ .../playground/generated/nodes/Struct.scala | 4 +++ .../generated/nodes/TopLevelStatement.scala | 10 ++++++ .../generated/nodes/UseClause.scala | 6 ++++ .../generated/nodes/Whitespace.scala | 4 +++ .../parser/ParserTreeSitterDemo.scala | 14 +++++--- .../smithyql/parser/demo.worksheet.sc | 7 ++-- 22 files changed, 141 insertions(+), 8 deletions(-) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index d8f3dfec..2db31a4d 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -29,6 +29,7 @@ extension (tn: TypeName) { @targetName("renderTypeName") def render: String = tn.value.dropWhile(_ == '_').fromSnakeCase.ident def asEnumCase: TypeName = TypeName(tn.value + "Case") + def asChildName: FieldName = FieldName(tn.value) } extension (fn: FieldName) { @@ -169,14 +170,47 @@ def renderClass(tpe: NodeType) = { show"""def typedChildren: ${fieldTypeAnnotation} = $fieldValue""" } + val typedChildrenPrecise = tpe + .children + .toList + .flatMap { fieldInfo => + fieldInfo.types.tupleLeft(fieldInfo.multiple) + } + .map { (multiple, fieldType) => + val fieldTypeAnnotation = fieldType.tpe.render.pipe { + case s if multiple => show"List[$s]" + case s => s + } + + val childValue = + if multiple then show"""node.children.toList.collect { + | case node @ ${fieldType + .tpe + .render}() => ${fieldType.tpe.render}(node) + |}""".stripMargin + else + show"""node.children.collectFirst { + | case node @ ${fieldType.tpe.render}() => ${fieldType.tpe.render}(node) + |}.get""".stripMargin + + show"""def ${fieldType + .tpe + .asChildName + .render}: $fieldTypeAnnotation = $childValue""".stripMargin + } + show"""// Generated code! Do not modify by hand. |package playground.generated.nodes | |import ${classOf[Node].getName()} | |case class $name /* private */(node: Node) extends Node { + | // fields |${fieldGetters.mkString_("\n\n").indentTrim(2)} + | // typed children |${typedChildren.foldMap(_.indentTrim(2)): String} + | // precise typed children + |${typedChildrenPrecise.mkString_("\n\n").indentTrim(2)} | | export node.* |} diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala b/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala index a8c0ee81..4189479f 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala @@ -4,6 +4,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class Binding /* private */(node: Node) extends Node { + // fields def key: Identifier = node.fields("key").head match { case node @ Identifier() => Identifier(node) } @@ -11,6 +12,9 @@ case class Binding /* private */(node: Node) extends Node { def value: InputNode = node.fields("value").head match { case node @ InputNode() => InputNode(node) } + // typed children + + // precise typed children export node.* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala b/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala index 63f9dcde..f34c02d7 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala @@ -4,10 +4,16 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class Bindings /* private */(node: Node) extends Node { + // fields + // typed children def typedChildren: List[Binding] = node.children.toList.collect { case node @ Binding() => Binding(node) } + // precise typed children + def binding: List[Binding] = node.children.toList.collect { + case node @ Binding() => Binding(node) + } export node.* } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Boolean_.scala b/modules/parser/src/main/scala/playground/generated/nodes/Boolean_.scala index 20e66a50..6a0374ec 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Boolean_.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Boolean_.scala @@ -4,7 +4,11 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class Boolean_ /* private */(node: Node) extends Node { + // fields + // typed children + + // precise typed children export node.* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Comment.scala b/modules/parser/src/main/scala/playground/generated/nodes/Comment.scala index 64d8aae0..e35550e0 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Comment.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Comment.scala @@ -4,7 +4,11 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class Comment /* private */(node: Node) extends Node { + // fields + // typed children + + // precise typed children export node.* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Identifier.scala b/modules/parser/src/main/scala/playground/generated/nodes/Identifier.scala index e3fa5e70..cb4593e4 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Identifier.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Identifier.scala @@ -4,7 +4,11 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class Identifier /* private */(node: Node) extends Node { + // fields + // typed children + + // precise typed children export node.* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/LetBinding.scala b/modules/parser/src/main/scala/playground/generated/nodes/LetBinding.scala index e2af6ae5..d95e4a09 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/LetBinding.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/LetBinding.scala @@ -4,11 +4,21 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class LetBinding /* private */(node: Node) extends Node { + // fields + // typed children def typedChildren: List[Binding | Whitespace] = node.children.toList.collect { case node @ Binding() => Binding(node) case node @ Whitespace() => Whitespace(node) } + // precise typed children + def binding: List[Binding] = node.children.toList.collect { + case node @ Binding() => Binding(node) + } + + def whitespace: List[Whitespace] = node.children.toList.collect { + case node @ Whitespace() => Whitespace(node) + } export node.* } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/ListFields.scala b/modules/parser/src/main/scala/playground/generated/nodes/ListFields.scala index 23e8fbb5..72106e0f 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/ListFields.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/ListFields.scala @@ -4,10 +4,16 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class ListFields /* private */(node: Node) extends Node { + // fields + // typed children def typedChildren: List[InputNode] = node.children.toList.collect { case node @ InputNode() => InputNode(node) } + // precise typed children + def _input_node: List[InputNode] = node.children.toList.collect { + case node @ InputNode() => InputNode(node) + } export node.* } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/List_.scala b/modules/parser/src/main/scala/playground/generated/nodes/List_.scala index 1db96733..182a94ea 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/List_.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/List_.scala @@ -4,9 +4,13 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class List_ /* private */(node: Node) extends Node { + // fields def list_fields: ListFields = node.fields("list_fields").head match { case node @ ListFields() => ListFields(node) } + // typed children + + // precise typed children export node.* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Null_.scala b/modules/parser/src/main/scala/playground/generated/nodes/Null_.scala index 1d6b39c0..2cb0035c 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Null_.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Null_.scala @@ -4,7 +4,11 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class Null_ /* private */(node: Node) extends Node { + // fields + // typed children + + // precise typed children export node.* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Number.scala b/modules/parser/src/main/scala/playground/generated/nodes/Number.scala index 8cc857ca..ad705261 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Number.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Number.scala @@ -4,7 +4,11 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class Number /* private */(node: Node) extends Node { + // fields + // typed children + + // precise typed children export node.* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/OperationCall.scala b/modules/parser/src/main/scala/playground/generated/nodes/OperationCall.scala index fa305d05..9558a936 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/OperationCall.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/OperationCall.scala @@ -4,6 +4,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class OperationCall /* private */(node: Node) extends Node { + // fields def input: Struct = node.fields("input").head match { case node @ Struct() => Struct(node) } @@ -11,6 +12,9 @@ case class OperationCall /* private */(node: Node) extends Node { def operation_name: OperationName = node.fields("operation_name").head match { case node @ OperationName() => OperationName(node) } + // typed children + + // precise typed children export node.* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/OperationName.scala b/modules/parser/src/main/scala/playground/generated/nodes/OperationName.scala index 1aae3541..899fc4a6 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/OperationName.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/OperationName.scala @@ -4,6 +4,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class OperationName /* private */(node: Node) extends Node { + // fields def identifier: List[QualifiedIdentifier] = node.fields("identifier").toList.collect { case node @ QualifiedIdentifier() => QualifiedIdentifier(node) } @@ -11,6 +12,9 @@ case class OperationName /* private */(node: Node) extends Node { def name: Identifier = node.fields("name").head match { case node @ Identifier() => Identifier(node) } + // typed children + + // precise typed children export node.* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala b/modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala index bd914f53..660f6050 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala @@ -4,6 +4,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class QualifiedIdentifier /* private */(node: Node) extends Node { + // fields def head: Identifier = node.fields("head").head match { case node @ Identifier() => Identifier(node) } @@ -15,6 +16,9 @@ case class QualifiedIdentifier /* private */(node: Node) extends Node { def tail: List[Identifier] = node.fields("tail").toList.collect { case node @ Identifier() => Identifier(node) } + // typed children + + // precise typed children export node.* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala b/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala index d11c901a..6223a55a 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala @@ -4,6 +4,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class SourceFile /* private */(node: Node) extends Node { + // fields def statements: TopLevelStatement = node.fields("statements").head match { case node @ TopLevelStatement() => TopLevelStatement(node) } @@ -11,6 +12,9 @@ case class SourceFile /* private */(node: Node) extends Node { def use_clause: UseClause = node.fields("use_clause").head match { case node @ UseClause() => UseClause(node) } + // typed children + + // precise typed children export node.* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/String_.scala b/modules/parser/src/main/scala/playground/generated/nodes/String_.scala index b46b7230..90b32197 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/String_.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/String_.scala @@ -4,7 +4,11 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class String_ /* private */(node: Node) extends Node { + // fields + // typed children + + // precise typed children export node.* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala b/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala index 96a9a1c0..c6f2a7f2 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala @@ -4,9 +4,13 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class Struct /* private */(node: Node) extends Node { + // fields def bindings: Bindings = node.fields("bindings").head match { case node @ Bindings() => Bindings(node) } + // typed children + + // precise typed children export node.* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala b/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala index 031e7d81..f3deb7f2 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala @@ -4,11 +4,21 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class TopLevelStatement /* private */(node: Node) extends Node { + // fields + // typed children def typedChildren: LetBinding | OperationCall = node.children.head match { case node @ LetBinding() => LetBinding(node) case node @ OperationCall() => OperationCall(node) } + // precise typed children + def let_binding: LetBinding = node.children.collectFirst { + case node @ LetBinding() => LetBinding(node) + }.get + + def operation_call: OperationCall = node.children.collectFirst { + case node @ OperationCall() => OperationCall(node) + }.get export node.* } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/UseClause.scala b/modules/parser/src/main/scala/playground/generated/nodes/UseClause.scala index b5e08af1..9ace4d3e 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/UseClause.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/UseClause.scala @@ -4,12 +4,18 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class UseClause /* private */(node: Node) extends Node { + // fields def identifier: QualifiedIdentifier = node.fields("identifier").head match { case node @ QualifiedIdentifier() => QualifiedIdentifier(node) } + // typed children def typedChildren: List[Whitespace] = node.children.toList.collect { case node @ Whitespace() => Whitespace(node) } + // precise typed children + def whitespace: List[Whitespace] = node.children.toList.collect { + case node @ Whitespace() => Whitespace(node) + } export node.* } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Whitespace.scala b/modules/parser/src/main/scala/playground/generated/nodes/Whitespace.scala index 5a4ac3c6..d2359946 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Whitespace.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Whitespace.scala @@ -4,7 +4,11 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node case class Whitespace /* private */(node: Node) extends Node { + // fields + // typed children + + // precise typed children export node.* diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala index 2d59a579..3b32eeff 100644 --- a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala +++ b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala @@ -15,12 +15,16 @@ object ParserTreeSitterDemo extends App { } val bind = - OperationCall(SourceFile(tree.rootNode.get).statements.children.head) + SourceFile(tree.rootNode.get) + .statements + .operation_call .input .bindings - .children - .collect { case b @ Binding() => Binding(b) } - .head + .binding + .find(_.key.source == "x") + .get - println(bind.key.source + ": " + bind.value.node.source) + bind.value match { + case InputNode.NumberCase(value) => println(value.source) + } } diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc b/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc index ad4cae2d..0ee16197 100644 --- a/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc +++ b/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc @@ -23,11 +23,12 @@ SourceFile(tree.rootNode.get) .tail val bind = - OperationCall(SourceFile(tree.rootNode.get).statements.children.head) + SourceFile(tree.rootNode.get) + .statements + .operation_call .input .bindings - .children - .collect { case b @ Binding() => Binding(b) } + .binding .find(_.key.source == "x") .get From 6a9083c7f8d9297bf1a46552bc0e94471ae8a692 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Sun, 3 Nov 2024 03:09:15 +0100 Subject: [PATCH 041/105] Generate projections for ADTs --- .../main/scala/playground/parsergen/ParserGen.scala | 11 +++++++++++ .../scala/playground/generated/nodes/InputNode.scala | 7 +++++++ .../smithyql/parser/ParserTreeSitterDemo.scala | 5 +---- .../playground/smithyql/parser/demo.worksheet.sc | 4 +--- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index 2db31a4d..c58b4eeb 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -28,6 +28,7 @@ def debugDump(s: String): String = extension (tn: TypeName) { @targetName("renderTypeName") def render: String = tn.value.dropWhile(_ == '_').fromSnakeCase.ident + def renderProjection: String = show"as${tn.value.dropWhile(_ == '_').fromSnakeCase}".ident def asEnumCase: TypeName = TypeName(tn.value + "Case") def asChildName: FieldName = FieldName(tn.value) } @@ -53,6 +54,14 @@ def renderAdt(tpe: NodeType) = { show"""case ${nodeType.tpe.asEnumCase.render}(value: ${nodeType.tpe.render})""" } + val projections = tpe.subtypes.map { nodeType => + // format: off + show"""def ${nodeType.tpe.renderProjection}: ${nodeType + .tpe + .render} = this match { case ${nodeType.tpe.asEnumCase.render}(v) => v; case _ => sys.error("no match") }""" + // format: on + } + show"""// Generated code! Do not modify by hand. |package playground.generated.nodes | @@ -61,6 +70,8 @@ def renderAdt(tpe: NodeType) = { |enum $name { |${enumCases.mkString_("\n").indentTrim(2)} | + |${projections.mkString_("\n").indentTrim(2)} + | | def node: Node = this match { |${tpe .subtypes diff --git a/modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala b/modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala index 5af4b6a8..57425150 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala @@ -11,6 +11,13 @@ enum InputNode { case StringCase(value: String_) case StructCase(value: Struct) + def asBoolean: Boolean_ = this match { case BooleanCase(v) => v; case _ => sys.error("no match") } + def asList: List_ = this match { case ListCase(v) => v; case _ => sys.error("no match") } + def asNull: Null_ = this match { case NullCase(v) => v; case _ => sys.error("no match") } + def asNumber: Number = this match { case NumberCase(v) => v; case _ => sys.error("no match") } + def asString: String_ = this match { case StringCase(v) => v; case _ => sys.error("no match") } + def asStruct: Struct = this match { case StructCase(v) => v; case _ => sys.error("no match") } + def node: Node = this match { case BooleanCase(value) => value.node case ListCase(value) => value.node diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala index 3b32eeff..548db8d1 100644 --- a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala +++ b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala @@ -1,6 +1,5 @@ package playground.smithyql -import org.polyvariant.treesitter4s.Node import org.polyvariant.treesitter4s.TreeSitterAPI import playground.generated.nodes.* @@ -24,7 +23,5 @@ object ParserTreeSitterDemo extends App { .find(_.key.source == "x") .get - bind.value match { - case InputNode.NumberCase(value) => println(value.source) - } + println(bind.value.asNumber.source) } diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc b/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc index 0ee16197..8abfbd1e 100644 --- a/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc +++ b/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc @@ -34,6 +34,4 @@ val bind = bind.key.source -bind.value match { - case InputNode.NumberCase(value) => value.source -} +bind.value.asNumber.source From 0652614a35e4bf93c5a99fe9b0c0e683ac916d22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Sun, 3 Nov 2024 04:16:16 +0100 Subject: [PATCH 042/105] Mark unsafe pieces --- .../main/scala/playground/parsergen/ParserGen.scala | 7 +++++-- .../scala/playground/generated/nodes/InputNode.scala | 12 ++++++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index c58b4eeb..85f53b7b 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -55,10 +55,11 @@ def renderAdt(tpe: NodeType) = { } val projections = tpe.subtypes.map { nodeType => + // UNSAFE: inexhaustive match // format: off show"""def ${nodeType.tpe.renderProjection}: ${nodeType .tpe - .render} = this match { case ${nodeType.tpe.asEnumCase.render}(v) => v; case _ => sys.error("no match") }""" + .render} = this match { case ${nodeType.tpe.asEnumCase.render}(v) => v }""" // format: on } @@ -143,7 +144,7 @@ def renderClass(tpe: NodeType) = { |${cases.mkString("\n").indentTrim(2)} |}""".stripMargin else - // todo replace head with a stricter "only" check? + // UNSAFE: head show"""$allFields.head match { |${cases.mkString("\n").indentTrim(2)} |}""".stripMargin @@ -174,6 +175,7 @@ def renderClass(tpe: NodeType) = { |${cases.mkString("\n").indentTrim(2)} |}""".stripMargin else + // UNSAFE: head show"""$allChildren.head match { |${cases.mkString("\n").indentTrim(2)} |}""".stripMargin @@ -200,6 +202,7 @@ def renderClass(tpe: NodeType) = { .render}() => ${fieldType.tpe.render}(node) |}""".stripMargin else + // UNSAFE: get show"""node.children.collectFirst { | case node @ ${fieldType.tpe.render}() => ${fieldType.tpe.render}(node) |}.get""".stripMargin diff --git a/modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala b/modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala index 57425150..a39391be 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala @@ -11,12 +11,12 @@ enum InputNode { case StringCase(value: String_) case StructCase(value: Struct) - def asBoolean: Boolean_ = this match { case BooleanCase(v) => v; case _ => sys.error("no match") } - def asList: List_ = this match { case ListCase(v) => v; case _ => sys.error("no match") } - def asNull: Null_ = this match { case NullCase(v) => v; case _ => sys.error("no match") } - def asNumber: Number = this match { case NumberCase(v) => v; case _ => sys.error("no match") } - def asString: String_ = this match { case StringCase(v) => v; case _ => sys.error("no match") } - def asStruct: Struct = this match { case StructCase(v) => v; case _ => sys.error("no match") } + def asBoolean: Boolean_ = this match { case BooleanCase(v) => v } + def asList: List_ = this match { case ListCase(v) => v } + def asNull: Null_ = this match { case NullCase(v) => v } + def asNumber: Number = this match { case NumberCase(v) => v } + def asString: String_ = this match { case StringCase(v) => v } + def asStruct: Struct = this match { case StructCase(v) => v } def node: Node = this match { case BooleanCase(value) => value.node From 17d7538d75209cbbb682aa26d795be24f9694453 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Sun, 3 Nov 2024 23:07:23 +0100 Subject: [PATCH 043/105] Private nodes + safe projections --- .../playground/parsergen/ParserGen.scala | 7 ++--- .../generated/nodes/InputNode.scala | 26 +++++++++---------- .../parser/ParserTreeSitterDemo.scala | 2 +- .../smithyql/parser/demo.worksheet.sc | 2 +- 4 files changed, 17 insertions(+), 20 deletions(-) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index 85f53b7b..716920e8 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -51,15 +51,12 @@ def renderAdt(tpe: NodeType) = { val name = tpe.tpe.render val enumCases = tpe.subtypes.map { nodeType => - show"""case ${nodeType.tpe.asEnumCase.render}(value: ${nodeType.tpe.render})""" + show"""private case ${nodeType.tpe.asEnumCase.render}(value: ${nodeType.tpe.render})""" } val projections = tpe.subtypes.map { nodeType => - // UNSAFE: inexhaustive match // format: off - show"""def ${nodeType.tpe.renderProjection}: ${nodeType - .tpe - .render} = this match { case ${nodeType.tpe.asEnumCase.render}(v) => v }""" + show"""def ${nodeType.tpe.renderProjection}: Option[${nodeType.tpe.render}] = this match { case ${nodeType.tpe.asEnumCase.render}(v) => Some(v); case _ => None }""" // format: on } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala b/modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala index a39391be..a7b49118 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala @@ -4,19 +4,19 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node enum InputNode { - case BooleanCase(value: Boolean_) - case ListCase(value: List_) - case NullCase(value: Null_) - case NumberCase(value: Number) - case StringCase(value: String_) - case StructCase(value: Struct) - - def asBoolean: Boolean_ = this match { case BooleanCase(v) => v } - def asList: List_ = this match { case ListCase(v) => v } - def asNull: Null_ = this match { case NullCase(v) => v } - def asNumber: Number = this match { case NumberCase(v) => v } - def asString: String_ = this match { case StringCase(v) => v } - def asStruct: Struct = this match { case StructCase(v) => v } + private case BooleanCase(value: Boolean_) + private case ListCase(value: List_) + private case NullCase(value: Null_) + private case NumberCase(value: Number) + private case StringCase(value: String_) + private case StructCase(value: Struct) + + def asBoolean: Option[Boolean_] = this match { case BooleanCase(v) => Some(v); case _ => None } + def asList: Option[List_] = this match { case ListCase(v) => Some(v); case _ => None } + def asNull: Option[Null_] = this match { case NullCase(v) => Some(v); case _ => None } + def asNumber: Option[Number] = this match { case NumberCase(v) => Some(v); case _ => None } + def asString: Option[String_] = this match { case StringCase(v) => Some(v); case _ => None } + def asStruct: Option[Struct] = this match { case StructCase(v) => Some(v); case _ => None } def node: Node = this match { case BooleanCase(value) => value.node diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala index 548db8d1..5c0b7b11 100644 --- a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala +++ b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala @@ -23,5 +23,5 @@ object ParserTreeSitterDemo extends App { .find(_.key.source == "x") .get - println(bind.value.asNumber.source) + println(bind.value.asNumber.get.source) } diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc b/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc index 8abfbd1e..6af30fc6 100644 --- a/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc +++ b/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc @@ -34,4 +34,4 @@ val bind = bind.key.source -bind.value.asNumber.source +bind.value.asNumber.get.source From 6393892b1db1b3a054125c8bbcc268a562a0b9ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Sun, 3 Nov 2024 23:18:51 +0100 Subject: [PATCH 044/105] Account for field/child optionality --- .../playground/parsergen/ParserGen.scala | 25 ++++++++++++++----- .../playground/generated/nodes/List_.scala | 2 +- .../generated/nodes/SourceFile.scala | 2 +- .../playground/generated/nodes/Struct.scala | 2 +- .../parser/ParserTreeSitterDemo.scala | 20 +++++++-------- 5 files changed, 32 insertions(+), 19 deletions(-) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index 716920e8..e17bbf5d 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -127,8 +127,9 @@ def renderClass(tpe: NodeType) = { .getOrElse(sys.error(s"unexpected empty list of types: $k (in ${tpe.tpe})")) val fieldTypeAnnotation = typeUnion.pipe { - case s if fieldType.multiple => show"List[$s]" - case s => s + case s if fieldType.multiple => show"List[$s]" + case s if !fieldType.required => show"Option[$s]" + case s => s } val allFields = show"""node.fields(${k.value.literal})""" @@ -140,6 +141,9 @@ def renderClass(tpe: NodeType) = { if fieldType.multiple then show"""$allFields.toList.collect { |${cases.mkString("\n").indentTrim(2)} |}""".stripMargin + else if !fieldType.required then show"""$allFields.headOption.map { + |${cases.mkString("\n").indentTrim(2)} + |}""".stripMargin else // UNSAFE: head show"""$allFields.head match { @@ -157,8 +161,9 @@ def renderClass(tpe: NodeType) = { .getOrElse(sys.error(s"unexpected empty list of types in children: (in ${tpe.tpe})")) val fieldTypeAnnotation = typeUnion.pipe { - case s if fieldType.multiple => show"List[$s]" - case s => s + case s if fieldType.multiple => show"List[$s]" + case s if !fieldType.required => show"Option[$s]" + case s => s } val allChildren = show"""node.children""" @@ -171,6 +176,9 @@ def renderClass(tpe: NodeType) = { if fieldType.multiple then show"""$allChildren.toList.collect { |${cases.mkString("\n").indentTrim(2)} |}""".stripMargin + else if !fieldType.required then show"""$allChildren.collectFirst { + |${cases.mkString("\n").indentTrim(2)} + |}""".stripMargin else // UNSAFE: head show"""$allChildren.head match { @@ -184,9 +192,9 @@ def renderClass(tpe: NodeType) = { .children .toList .flatMap { fieldInfo => - fieldInfo.types.tupleLeft(fieldInfo.multiple) + fieldInfo.types.map((fieldInfo.multiple, fieldInfo.required, _)) } - .map { (multiple, fieldType) => + .map { (multiple, required, fieldType) => val fieldTypeAnnotation = fieldType.tpe.render.pipe { case s if multiple => show"List[$s]" case s => s @@ -198,6 +206,11 @@ def renderClass(tpe: NodeType) = { .tpe .render}() => ${fieldType.tpe.render}(node) |}""".stripMargin + else if !required then show"""node.children.collectFirst { + | case node @ ${fieldType + .tpe + .render}() => ${fieldType.tpe.render}(node) + |}""".stripMargin else // UNSAFE: get show"""node.children.collectFirst { diff --git a/modules/parser/src/main/scala/playground/generated/nodes/List_.scala b/modules/parser/src/main/scala/playground/generated/nodes/List_.scala index 182a94ea..8268251b 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/List_.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/List_.scala @@ -5,7 +5,7 @@ import org.polyvariant.treesitter4s.Node case class List_ /* private */(node: Node) extends Node { // fields - def list_fields: ListFields = node.fields("list_fields").head match { + def list_fields: Option[ListFields] = node.fields("list_fields").headOption.map { case node @ ListFields() => ListFields(node) } // typed children diff --git a/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala b/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala index 6223a55a..0bda81c8 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala @@ -9,7 +9,7 @@ case class SourceFile /* private */(node: Node) extends Node { case node @ TopLevelStatement() => TopLevelStatement(node) } - def use_clause: UseClause = node.fields("use_clause").head match { + def use_clause: Option[UseClause] = node.fields("use_clause").headOption.map { case node @ UseClause() => UseClause(node) } // typed children diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala b/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala index c6f2a7f2..312954b8 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala @@ -5,7 +5,7 @@ import org.polyvariant.treesitter4s.Node case class Struct /* private */(node: Node) extends Node { // fields - def bindings: Bindings = node.fields("bindings").head match { + def bindings: Option[Bindings] = node.fields("bindings").headOption.map { case node @ Bindings() => Bindings(node) } // typed children diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala index 5c0b7b11..eb874391 100644 --- a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala +++ b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala @@ -13,15 +13,15 @@ object ParserTreeSitterDemo extends App { """.stripMargin } - val bind = - SourceFile(tree.rootNode.get) - .statements - .operation_call - .input - .bindings - .binding - .find(_.key.source == "x") - .get + val bind = SourceFile(tree.rootNode.get) + .statements + .operation_call + .input + .bindings + .getOrElse(sys.error("no bindings in bindings section of struct")) + .binding + .find(_.key.source == "x") + .getOrElse(sys.error("no binding with key 'x'")) - println(bind.value.asNumber.get.source) + println(bind.value.asNumber.getOrElse(sys.error("binding wasn't a number literal")).source) } From e46969860408f0dc29e42ed577c146ac27942ecc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 4 Nov 2024 00:52:56 +0100 Subject: [PATCH 045/105] update dep, demo --- build.sbt | 4 +- .../smithyql/parser/demo.worksheet.sc | 85 +++++++++++++++++-- 2 files changed, 79 insertions(+), 10 deletions(-) diff --git a/build.sbt b/build.sbt index bc5d558a..423ecf6c 100644 --- a/build.sbt +++ b/build.sbt @@ -117,7 +117,7 @@ lazy val parser = module("parser") "io.circe" %% "circe-generic" % "0.14.10" % Test, "io.circe" %% "circe-parser" % "0.14.10" % Test, "co.fs2" %% "fs2-io" % "3.11.0" % Test, - "org.polyvariant.treesitter4s" %% "core" % "0.3-9edd0ef-SNAPSHOT", + "org.polyvariant.treesitter4s" %% "core" % "0.3-f46864f-SNAPSHOT", ) ) .dependsOn( @@ -131,7 +131,7 @@ lazy val parsergen = module("parser-gen") "dev.optics" %% "monocle-core" % "3.3.0", "com.disneystreaming.smithy4s" %% "smithy4s-json" % smithy4sVersion.value, ("org.scalameta" %% "scalameta" % "4.11.0").cross(CrossVersion.for3Use2_13), - "org.polyvariant.treesitter4s" %% "core" % "0.3-9edd0ef-SNAPSHOT", + "org.polyvariant.treesitter4s" %% "core" % "0.3-f46864f-SNAPSHOT", ), scalacOptions -= "-release:11", ) diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc b/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc index 6af30fc6..d254c733 100644 --- a/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc +++ b/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc @@ -4,34 +4,103 @@ import playground.generated.nodes.* val s = """ - use service foo.bar.baz.bax#Baz +use service foo.bar.baz.bax#Baz - Bax { a = , x = 44 , y = 50} +Bax { a = , x = 44 y = 50, b = ,,42, xyz = { a = }} """.stripMargin val p = TreeSitterAPI.make("smithyql") val tree = p.parse(s) -SourceFile(tree.rootNode.get).use_clause.identifier.head.node.source +tree.rootNode.get.text -SourceFile(tree.rootNode.get).use_clause.identifier.selection.node.source +SourceFile(tree.rootNode.get).use_clause.get.identifier.head.node.source + +SourceFile(tree.rootNode.get).use_clause.get.identifier.selection.node.source SourceFile(tree.rootNode.get) .use_clause + .get .identifier .tail +SourceFile(tree.rootNode.get) + .statements + .operation_call + .input + .children + .filter(_.tpe == "ERROR") + .head + .source + +tree + .rootNode + .get + .fold[List[Node]]((n, ch) => n :: ch.toList.flatten) + .filter(_.tpe == "ERROR") + .map(_.source) + +tree + .rootNode + .get + .fold[List[Node]]((n, ch) => n :: ch.toList.flatten) + .filter(_.isMissing) + +tree + .rootNode + .get + .fold[List[Node]]((n, ch) => n :: ch.toList.flatten) + .filter(_.isExtra) + .size + +tree + .rootNode + .get + .fold[List[Node]]((n, ch) => n :: ch.toList.flatten) + .filter(_.isError) + .map(_.text) + .mkString("\n") + +tree + .rootNode + .get + .fold[List[Node]]((n, ch) => n :: ch.toList.flatten) + .size + +tree + .rootNode + .get + .fold[List[Node]]((n, ch) => n :: ch.toList.flatten) + .filter(_.hasError) + .size + +tree + .rootNode + .get + .fold[List[Node]]((n, ch) => n :: ch.toList.flatten) + // .filter(_.tpe == "MISSING") + // .map(_.source) + .map(_.tpe) + .toSet + val bind = SourceFile(tree.rootNode.get) .statements .operation_call .input .bindings - .binding - .find(_.key.source == "x") .get + .binding + +// .find(_.key.source == "x") +// .get + +bind.size +bind.head.fields +bind.map(_.key.source) -bind.key.source +bind.last.value.asStruct.get.bindings.get.binding.head.value.asBoolean.get.tpe +// bind.key.source -bind.value.asNumber.get.source +// bind.value.asNumber.get.source From 908f08c940259cb3bbec3cd2e0c7dcd72378b98a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 4 Nov 2024 01:54:45 +0100 Subject: [PATCH 046/105] something something everything is optional now, old man --- .../playground/parsergen/ParserGen.scala | 40 ++++++------------- .../playground/generated/nodes/Binding.scala | 4 +- .../playground/generated/nodes/List_.scala | 2 +- .../generated/nodes/OperationCall.scala | 4 +- .../generated/nodes/OperationName.scala | 4 +- .../generated/nodes/QualifiedIdentifier.scala | 6 +-- .../generated/nodes/SourceFile.scala | 4 +- .../playground/generated/nodes/Struct.scala | 2 +- .../generated/nodes/TopLevelStatement.scala | 10 ++--- .../generated/nodes/UseClause.scala | 2 +- .../parser/ParserTreeSitterDemo.scala | 14 ++++++- .../smithyql/parser/demo.worksheet.sc | 20 ++++++++-- 12 files changed, 60 insertions(+), 52 deletions(-) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index e17bbf5d..2a272eca 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -127,12 +127,11 @@ def renderClass(tpe: NodeType) = { .getOrElse(sys.error(s"unexpected empty list of types: $k (in ${tpe.tpe})")) val fieldTypeAnnotation = typeUnion.pipe { - case s if fieldType.multiple => show"List[$s]" - case s if !fieldType.required => show"Option[$s]" - case s => s + case s if fieldType.multiple => show"List[$s]" + case s => show"Option[$s]" } - val allFields = show"""node.fields(${k.value.literal})""" + val allFields = show"""node.fields.getOrElse(${k.value.literal}, Nil)""" val cases = fieldType.types.map { typeInfo => show"""case node @ ${typeInfo.tpe.render}() => ${typeInfo.tpe.render}(node)""" @@ -141,12 +140,8 @@ def renderClass(tpe: NodeType) = { if fieldType.multiple then show"""$allFields.toList.collect { |${cases.mkString("\n").indentTrim(2)} |}""".stripMargin - else if !fieldType.required then show"""$allFields.headOption.map { - |${cases.mkString("\n").indentTrim(2)} - |}""".stripMargin else - // UNSAFE: head - show"""$allFields.head match { + show"""$allFields.headOption.map { |${cases.mkString("\n").indentTrim(2)} |}""".stripMargin @@ -161,9 +156,8 @@ def renderClass(tpe: NodeType) = { .getOrElse(sys.error(s"unexpected empty list of types in children: (in ${tpe.tpe})")) val fieldTypeAnnotation = typeUnion.pipe { - case s if fieldType.multiple => show"List[$s]" - case s if !fieldType.required => show"Option[$s]" - case s => s + case s if fieldType.multiple => show"List[$s]" + case s => show"Option[$s]" } val allChildren = show"""node.children""" @@ -176,12 +170,8 @@ def renderClass(tpe: NodeType) = { if fieldType.multiple then show"""$allChildren.toList.collect { |${cases.mkString("\n").indentTrim(2)} |}""".stripMargin - else if !fieldType.required then show"""$allChildren.collectFirst { - |${cases.mkString("\n").indentTrim(2)} - |}""".stripMargin else - // UNSAFE: head - show"""$allChildren.head match { + show"""$allChildren.collectFirst { |${cases.mkString("\n").indentTrim(2)} |}""".stripMargin @@ -192,12 +182,12 @@ def renderClass(tpe: NodeType) = { .children .toList .flatMap { fieldInfo => - fieldInfo.types.map((fieldInfo.multiple, fieldInfo.required, _)) + fieldInfo.types.map((fieldInfo.multiple, _)) } - .map { (multiple, required, fieldType) => + .map { (multiple, fieldType) => val fieldTypeAnnotation = fieldType.tpe.render.pipe { case s if multiple => show"List[$s]" - case s => s + case s => show"Option[$s]" } val childValue = @@ -206,16 +196,10 @@ def renderClass(tpe: NodeType) = { .tpe .render}() => ${fieldType.tpe.render}(node) |}""".stripMargin - else if !required then show"""node.children.collectFirst { - | case node @ ${fieldType - .tpe - .render}() => ${fieldType.tpe.render}(node) - |}""".stripMargin else - // UNSAFE: get show"""node.children.collectFirst { | case node @ ${fieldType.tpe.render}() => ${fieldType.tpe.render}(node) - |}.get""".stripMargin + |}""".stripMargin show"""def ${fieldType .tpe @@ -223,6 +207,8 @@ def renderClass(tpe: NodeType) = { .render}: $fieldTypeAnnotation = $childValue""".stripMargin } + // todo: make unapply return option, and then + // todo: turn these into opaque types, these types have no identity beyond type anyway show"""// Generated code! Do not modify by hand. |package playground.generated.nodes | diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala b/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala index 4189479f..2b2b93a9 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala @@ -5,11 +5,11 @@ import org.polyvariant.treesitter4s.Node case class Binding /* private */(node: Node) extends Node { // fields - def key: Identifier = node.fields("key").head match { + def key: Option[Identifier] = node.fields.getOrElse("key", Nil).headOption.map { case node @ Identifier() => Identifier(node) } - def value: InputNode = node.fields("value").head match { + def value: Option[InputNode] = node.fields.getOrElse("value", Nil).headOption.map { case node @ InputNode() => InputNode(node) } // typed children diff --git a/modules/parser/src/main/scala/playground/generated/nodes/List_.scala b/modules/parser/src/main/scala/playground/generated/nodes/List_.scala index 8268251b..559befa7 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/List_.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/List_.scala @@ -5,7 +5,7 @@ import org.polyvariant.treesitter4s.Node case class List_ /* private */(node: Node) extends Node { // fields - def list_fields: Option[ListFields] = node.fields("list_fields").headOption.map { + def list_fields: Option[ListFields] = node.fields.getOrElse("list_fields", Nil).headOption.map { case node @ ListFields() => ListFields(node) } // typed children diff --git a/modules/parser/src/main/scala/playground/generated/nodes/OperationCall.scala b/modules/parser/src/main/scala/playground/generated/nodes/OperationCall.scala index 9558a936..9c2e3182 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/OperationCall.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/OperationCall.scala @@ -5,11 +5,11 @@ import org.polyvariant.treesitter4s.Node case class OperationCall /* private */(node: Node) extends Node { // fields - def input: Struct = node.fields("input").head match { + def input: Option[Struct] = node.fields.getOrElse("input", Nil).headOption.map { case node @ Struct() => Struct(node) } - def operation_name: OperationName = node.fields("operation_name").head match { + def operation_name: Option[OperationName] = node.fields.getOrElse("operation_name", Nil).headOption.map { case node @ OperationName() => OperationName(node) } // typed children diff --git a/modules/parser/src/main/scala/playground/generated/nodes/OperationName.scala b/modules/parser/src/main/scala/playground/generated/nodes/OperationName.scala index 899fc4a6..255a590d 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/OperationName.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/OperationName.scala @@ -5,11 +5,11 @@ import org.polyvariant.treesitter4s.Node case class OperationName /* private */(node: Node) extends Node { // fields - def identifier: List[QualifiedIdentifier] = node.fields("identifier").toList.collect { + def identifier: List[QualifiedIdentifier] = node.fields.getOrElse("identifier", Nil).toList.collect { case node @ QualifiedIdentifier() => QualifiedIdentifier(node) } - def name: Identifier = node.fields("name").head match { + def name: Option[Identifier] = node.fields.getOrElse("name", Nil).headOption.map { case node @ Identifier() => Identifier(node) } // typed children diff --git a/modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala b/modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala index 660f6050..b3938ba6 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala @@ -5,15 +5,15 @@ import org.polyvariant.treesitter4s.Node case class QualifiedIdentifier /* private */(node: Node) extends Node { // fields - def head: Identifier = node.fields("head").head match { + def head: Option[Identifier] = node.fields.getOrElse("head", Nil).headOption.map { case node @ Identifier() => Identifier(node) } - def selection: Identifier = node.fields("selection").head match { + def selection: Option[Identifier] = node.fields.getOrElse("selection", Nil).headOption.map { case node @ Identifier() => Identifier(node) } - def tail: List[Identifier] = node.fields("tail").toList.collect { + def tail: List[Identifier] = node.fields.getOrElse("tail", Nil).toList.collect { case node @ Identifier() => Identifier(node) } // typed children diff --git a/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala b/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala index 0bda81c8..a760c154 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala @@ -5,11 +5,11 @@ import org.polyvariant.treesitter4s.Node case class SourceFile /* private */(node: Node) extends Node { // fields - def statements: TopLevelStatement = node.fields("statements").head match { + def statements: Option[TopLevelStatement] = node.fields.getOrElse("statements", Nil).headOption.map { case node @ TopLevelStatement() => TopLevelStatement(node) } - def use_clause: Option[UseClause] = node.fields("use_clause").headOption.map { + def use_clause: Option[UseClause] = node.fields.getOrElse("use_clause", Nil).headOption.map { case node @ UseClause() => UseClause(node) } // typed children diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala b/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala index 312954b8..7fbad82c 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala @@ -5,7 +5,7 @@ import org.polyvariant.treesitter4s.Node case class Struct /* private */(node: Node) extends Node { // fields - def bindings: Option[Bindings] = node.fields("bindings").headOption.map { + def bindings: Option[Bindings] = node.fields.getOrElse("bindings", Nil).headOption.map { case node @ Bindings() => Bindings(node) } // typed children diff --git a/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala b/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala index f3deb7f2..f8078803 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala @@ -7,18 +7,18 @@ case class TopLevelStatement /* private */(node: Node) extends Node { // fields // typed children - def typedChildren: LetBinding | OperationCall = node.children.head match { + def typedChildren: Option[LetBinding | OperationCall] = node.children.collectFirst { case node @ LetBinding() => LetBinding(node) case node @ OperationCall() => OperationCall(node) } // precise typed children - def let_binding: LetBinding = node.children.collectFirst { + def let_binding: Option[LetBinding] = node.children.collectFirst { case node @ LetBinding() => LetBinding(node) - }.get + } - def operation_call: OperationCall = node.children.collectFirst { + def operation_call: Option[OperationCall] = node.children.collectFirst { case node @ OperationCall() => OperationCall(node) - }.get + } export node.* } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/UseClause.scala b/modules/parser/src/main/scala/playground/generated/nodes/UseClause.scala index 9ace4d3e..bcd8261c 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/UseClause.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/UseClause.scala @@ -5,7 +5,7 @@ import org.polyvariant.treesitter4s.Node case class UseClause /* private */(node: Node) extends Node { // fields - def identifier: QualifiedIdentifier = node.fields("identifier").head match { + def identifier: Option[QualifiedIdentifier] = node.fields.getOrElse("identifier", Nil).headOption.map { case node @ QualifiedIdentifier() => QualifiedIdentifier(node) } // typed children diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala index eb874391..b2400809 100644 --- a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala +++ b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala @@ -15,13 +15,23 @@ object ParserTreeSitterDemo extends App { val bind = SourceFile(tree.rootNode.get) .statements + .getOrElse(sys.error("no statements section in source file")) .operation_call + .getOrElse(sys.error("no operation call in statements section")) .input + .getOrElse(sys.error("no input in operation call")) .bindings .getOrElse(sys.error("no bindings in bindings section of struct")) .binding - .find(_.key.source == "x") + .find(_.key.exists(_.source == "x")) .getOrElse(sys.error("no binding with key 'x'")) - println(bind.value.asNumber.getOrElse(sys.error("binding wasn't a number literal")).source) + println( + bind + .value + .getOrElse(sys.error("binding doesn't have a value")) + .asNumber + .getOrElse(sys.error("binding wasn't a number literal")) + .source + ) } diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc b/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc index d254c733..31abe37f 100644 --- a/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc +++ b/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc @@ -11,13 +11,19 @@ Bax { a = , x = 44 y = 50, b = ,,42, xyz = { a = }} val p = TreeSitterAPI.make("smithyql") +SourceFile(p.parse("use service foo.bar.baz.bax#Baz").rootNode.get).tpe +SourceFile(p.parse("use service foo.bar.baz.bax#Baz").rootNode.get).statements +SourceFile(p.parse("use service foo.bar.baz.bax#Baz").rootNode.get).isError +SourceFile(p.parse("use service foo.bar.baz.bax#Baz").rootNode.get).hasError +SourceFile(p.parse("use service foo.bar.baz.bax#Baz").rootNode.get).children.map(_.tpe) + val tree = p.parse(s) tree.rootNode.get.text -SourceFile(tree.rootNode.get).use_clause.get.identifier.head.node.source +SourceFile(tree.rootNode.get).use_clause.get.identifier.head.source -SourceFile(tree.rootNode.get).use_clause.get.identifier.selection.node.source +SourceFile(tree.rootNode.get).use_clause.get.identifier.get.selection.get.source SourceFile(tree.rootNode.get) .use_clause @@ -27,8 +33,11 @@ SourceFile(tree.rootNode.get) SourceFile(tree.rootNode.get) .statements + .get .operation_call + .get .input + .get .children .filter(_.tpe == "ERROR") .head @@ -87,8 +96,11 @@ tree val bind = SourceFile(tree.rootNode.get) .statements + .get .operation_call + .get .input + .get .bindings .get .binding @@ -98,9 +110,9 @@ val bind = bind.size bind.head.fields -bind.map(_.key.source) +bind.map(_.key.get.source) -bind.last.value.asStruct.get.bindings.get.binding.head.value.asBoolean.get.tpe +bind.last.value.get.asStruct.get.bindings.get.binding.head.value.get.asBoolean.get.tpe // bind.key.source // bind.value.asNumber.get.source From 2945a42360d23fb02e10369920d8e1835a9e567c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 4 Nov 2024 02:27:59 +0100 Subject: [PATCH 047/105] More progress on error safety --- .../playground/parsergen/ParserGen.scala | 39 +++++++-------- .../playground/generated/nodes/Binding.scala | 13 +++-- .../playground/generated/nodes/Bindings.scala | 13 +++-- .../playground/generated/nodes/Boolean_.scala | 9 +++- .../playground/generated/nodes/Comment.scala | 9 +++- .../generated/nodes/Identifier.scala | 9 +++- .../generated/nodes/InputNode.scala | 25 ++++------ .../generated/nodes/LetBinding.scala | 17 ++++--- .../generated/nodes/ListFields.scala | 13 +++-- .../playground/generated/nodes/List_.scala | 11 ++-- .../playground/generated/nodes/Null_.scala | 9 +++- .../playground/generated/nodes/Number.scala | 9 +++- .../generated/nodes/OperationCall.scala | 13 +++-- .../generated/nodes/OperationName.scala | 13 +++-- .../generated/nodes/QualifiedIdentifier.scala | 15 ++++-- .../generated/nodes/SourceFile.scala | 13 +++-- .../playground/generated/nodes/String_.scala | 9 +++- .../playground/generated/nodes/Struct.scala | 11 ++-- .../generated/nodes/TopLevelStatement.scala | 17 ++++--- .../generated/nodes/UseClause.scala | 15 ++++-- .../generated/nodes/Whitespace.scala | 9 +++- .../parser/ParserTreeSitterDemo.scala | 3 +- .../smithyql/parser/demo.worksheet.sc | 50 +++++++++++++++---- 23 files changed, 229 insertions(+), 115 deletions(-) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index 2a272eca..79cd3491 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -82,31 +82,21 @@ def renderAdt(tpe: NodeType) = { |} | |object $name { - | def apply(node: Node): $name = node match { + | def apply(node: Node): Either[String, $name] = node match { |${tpe .subtypes .map { nodeType => - show"""case node @ ${nodeType + show"""case ${nodeType .tpe - .render}() => ${nodeType.tpe.asEnumCase.render}(${nodeType.tpe.render}(node))""" + .render}(node) => Right(${nodeType.tpe.asEnumCase.render}(node))""" } .mkString_("\n") .indentTrim(4)} + | case _ => Left(s"Expected $name, got $${node.tpe}") | } | - | def unapply(node: Node): Boolean = node match { - |${tpe - .subtypes - .map { nodeType => - show"""case node @ ${nodeType - .tpe - .render}() => true""" - } - .mkString_("\n") - .indentTrim(4)} - | } + | def unapply(node: Node): Option[$name] = apply(node).toOption |} - | |/* |${debugDump(Json.writeDocumentAsPrettyString(Document.encode(tpe)).trimLines)} |*/ @@ -134,7 +124,7 @@ def renderClass(tpe: NodeType) = { val allFields = show"""node.fields.getOrElse(${k.value.literal}, Nil)""" val cases = fieldType.types.map { typeInfo => - show"""case node @ ${typeInfo.tpe.render}() => ${typeInfo.tpe.render}(node)""" + show"""case ${typeInfo.tpe.render}(node) => node""" } val fieldValue = if fieldType.multiple then show"""$allFields.toList.collect { @@ -163,7 +153,7 @@ def renderClass(tpe: NodeType) = { val allChildren = show"""node.children""" val cases = fieldType.types.map { typeInfo => - show"""case node @ ${typeInfo.tpe.render}() => ${typeInfo.tpe.render}(node)""" + show"""case ${typeInfo.tpe.render}(node) => node""" } val fieldValue = @@ -192,13 +182,13 @@ def renderClass(tpe: NodeType) = { val childValue = if multiple then show"""node.children.toList.collect { - | case node @ ${fieldType + | case ${fieldType .tpe - .render}() => ${fieldType.tpe.render}(node) + .render}(node) => node |}""".stripMargin else show"""node.children.collectFirst { - | case node @ ${fieldType.tpe.render}() => ${fieldType.tpe.render}(node) + | case ${fieldType.tpe.render}(node) => node |}""".stripMargin show"""def ${fieldType @@ -214,7 +204,7 @@ def renderClass(tpe: NodeType) = { | |import ${classOf[Node].getName()} | - |case class $name /* private */(node: Node) extends Node { + |final case class $name /* private */(node: Node) extends Node { | // fields |${fieldGetters.mkString_("\n\n").indentTrim(2)} | // typed children @@ -226,7 +216,12 @@ def renderClass(tpe: NodeType) = { |} | |object $name { - | def unapply(node: Node): Boolean = node.tpe == ${tpe.tpe.value.literal} + | def apply(node: Node): Either[String, $name] = + | if node.tpe == ${tpe.tpe.value.literal} + | then Right(new $name(node)) + | else Left(s"Expected ${tpe.tpe.render}, got $${node.tpe}") + | def unsafeApply(node: Node): $name = apply(node).fold(sys.error, identity) + | def unapply(node: Node): Option[$name] = apply(node).toOption |} | |/* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala b/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala index 2b2b93a9..4cd8374f 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala @@ -3,14 +3,14 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class Binding /* private */(node: Node) extends Node { +final case class Binding /* private */(node: Node) extends Node { // fields def key: Option[Identifier] = node.fields.getOrElse("key", Nil).headOption.map { - case node @ Identifier() => Identifier(node) + case Identifier(node) => node } def value: Option[InputNode] = node.fields.getOrElse("value", Nil).headOption.map { - case node @ InputNode() => InputNode(node) + case InputNode(node) => node } // typed children @@ -21,7 +21,12 @@ case class Binding /* private */(node: Node) extends Node { } object Binding { - def unapply(node: Node): Boolean = node.tpe == "binding" + def apply(node: Node): Either[String, Binding] = + if node.tpe == "binding" + then Right(new Binding(node)) + else Left(s"Expected Binding, got ${node.tpe}") + def unsafeApply(node: Node): Binding = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[Binding] = apply(node).toOption } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala b/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala index f34c02d7..bcc4a914 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala @@ -3,23 +3,28 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class Bindings /* private */(node: Node) extends Node { +final case class Bindings /* private */(node: Node) extends Node { // fields // typed children def typedChildren: List[Binding] = node.children.toList.collect { - case node @ Binding() => Binding(node) + case Binding(node) => node } // precise typed children def binding: List[Binding] = node.children.toList.collect { - case node @ Binding() => Binding(node) + case Binding(node) => node } export node.* } object Bindings { - def unapply(node: Node): Boolean = node.tpe == "bindings" + def apply(node: Node): Either[String, Bindings] = + if node.tpe == "bindings" + then Right(new Bindings(node)) + else Left(s"Expected Bindings, got ${node.tpe}") + def unsafeApply(node: Node): Bindings = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[Bindings] = apply(node).toOption } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Boolean_.scala b/modules/parser/src/main/scala/playground/generated/nodes/Boolean_.scala index 6a0374ec..b1a1186f 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Boolean_.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Boolean_.scala @@ -3,7 +3,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class Boolean_ /* private */(node: Node) extends Node { +final case class Boolean_ /* private */(node: Node) extends Node { // fields // typed children @@ -15,7 +15,12 @@ case class Boolean_ /* private */(node: Node) extends Node { } object Boolean_ { - def unapply(node: Node): Boolean = node.tpe == "boolean" + def apply(node: Node): Either[String, Boolean_] = + if node.tpe == "boolean" + then Right(new Boolean_(node)) + else Left(s"Expected Boolean_, got ${node.tpe}") + def unsafeApply(node: Node): Boolean_ = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[Boolean_] = apply(node).toOption } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Comment.scala b/modules/parser/src/main/scala/playground/generated/nodes/Comment.scala index e35550e0..3642672b 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Comment.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Comment.scala @@ -3,7 +3,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class Comment /* private */(node: Node) extends Node { +final case class Comment /* private */(node: Node) extends Node { // fields // typed children @@ -15,7 +15,12 @@ case class Comment /* private */(node: Node) extends Node { } object Comment { - def unapply(node: Node): Boolean = node.tpe == "comment" + def apply(node: Node): Either[String, Comment] = + if node.tpe == "comment" + then Right(new Comment(node)) + else Left(s"Expected Comment, got ${node.tpe}") + def unsafeApply(node: Node): Comment = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[Comment] = apply(node).toOption } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Identifier.scala b/modules/parser/src/main/scala/playground/generated/nodes/Identifier.scala index cb4593e4..7932ef6a 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Identifier.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Identifier.scala @@ -3,7 +3,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class Identifier /* private */(node: Node) extends Node { +final case class Identifier /* private */(node: Node) extends Node { // fields // typed children @@ -15,7 +15,12 @@ case class Identifier /* private */(node: Node) extends Node { } object Identifier { - def unapply(node: Node): Boolean = node.tpe == "identifier" + def apply(node: Node): Either[String, Identifier] = + if node.tpe == "identifier" + then Right(new Identifier(node)) + else Left(s"Expected Identifier, got ${node.tpe}") + def unsafeApply(node: Node): Identifier = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[Identifier] = apply(node).toOption } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala b/modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala index a7b49118..f0c54349 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala @@ -29,25 +29,18 @@ enum InputNode { } object InputNode { - def apply(node: Node): InputNode = node match { - case node @ Boolean_() => BooleanCase(Boolean_(node)) - case node @ List_() => ListCase(List_(node)) - case node @ Null_() => NullCase(Null_(node)) - case node @ Number() => NumberCase(Number(node)) - case node @ String_() => StringCase(String_(node)) - case node @ Struct() => StructCase(Struct(node)) + def apply(node: Node): Either[String, InputNode] = node match { + case Boolean_(node) => Right(BooleanCase(node)) + case List_(node) => Right(ListCase(node)) + case Null_(node) => Right(NullCase(node)) + case Number(node) => Right(NumberCase(node)) + case String_(node) => Right(StringCase(node)) + case Struct(node) => Right(StructCase(node)) + case _ => Left(s"Expected InputNode, got ${node.tpe}") } - def unapply(node: Node): Boolean = node match { - case node @ Boolean_() => true - case node @ List_() => true - case node @ Null_() => true - case node @ Number() => true - case node @ String_() => true - case node @ Struct() => true - } + def unapply(node: Node): Option[InputNode] = apply(node).toOption } - /* */ diff --git a/modules/parser/src/main/scala/playground/generated/nodes/LetBinding.scala b/modules/parser/src/main/scala/playground/generated/nodes/LetBinding.scala index d95e4a09..6b369434 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/LetBinding.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/LetBinding.scala @@ -3,28 +3,33 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class LetBinding /* private */(node: Node) extends Node { +final case class LetBinding /* private */(node: Node) extends Node { // fields // typed children def typedChildren: List[Binding | Whitespace] = node.children.toList.collect { - case node @ Binding() => Binding(node) - case node @ Whitespace() => Whitespace(node) + case Binding(node) => node + case Whitespace(node) => node } // precise typed children def binding: List[Binding] = node.children.toList.collect { - case node @ Binding() => Binding(node) + case Binding(node) => node } def whitespace: List[Whitespace] = node.children.toList.collect { - case node @ Whitespace() => Whitespace(node) + case Whitespace(node) => node } export node.* } object LetBinding { - def unapply(node: Node): Boolean = node.tpe == "let_binding" + def apply(node: Node): Either[String, LetBinding] = + if node.tpe == "let_binding" + then Right(new LetBinding(node)) + else Left(s"Expected LetBinding, got ${node.tpe}") + def unsafeApply(node: Node): LetBinding = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[LetBinding] = apply(node).toOption } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/ListFields.scala b/modules/parser/src/main/scala/playground/generated/nodes/ListFields.scala index 72106e0f..953c6cc3 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/ListFields.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/ListFields.scala @@ -3,23 +3,28 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class ListFields /* private */(node: Node) extends Node { +final case class ListFields /* private */(node: Node) extends Node { // fields // typed children def typedChildren: List[InputNode] = node.children.toList.collect { - case node @ InputNode() => InputNode(node) + case InputNode(node) => node } // precise typed children def _input_node: List[InputNode] = node.children.toList.collect { - case node @ InputNode() => InputNode(node) + case InputNode(node) => node } export node.* } object ListFields { - def unapply(node: Node): Boolean = node.tpe == "list_fields" + def apply(node: Node): Either[String, ListFields] = + if node.tpe == "list_fields" + then Right(new ListFields(node)) + else Left(s"Expected ListFields, got ${node.tpe}") + def unsafeApply(node: Node): ListFields = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[ListFields] = apply(node).toOption } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/List_.scala b/modules/parser/src/main/scala/playground/generated/nodes/List_.scala index 559befa7..47a2ecf3 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/List_.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/List_.scala @@ -3,10 +3,10 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class List_ /* private */(node: Node) extends Node { +final case class List_ /* private */(node: Node) extends Node { // fields def list_fields: Option[ListFields] = node.fields.getOrElse("list_fields", Nil).headOption.map { - case node @ ListFields() => ListFields(node) + case ListFields(node) => node } // typed children @@ -17,7 +17,12 @@ case class List_ /* private */(node: Node) extends Node { } object List_ { - def unapply(node: Node): Boolean = node.tpe == "list" + def apply(node: Node): Either[String, List_] = + if node.tpe == "list" + then Right(new List_(node)) + else Left(s"Expected List_, got ${node.tpe}") + def unsafeApply(node: Node): List_ = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[List_] = apply(node).toOption } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Null_.scala b/modules/parser/src/main/scala/playground/generated/nodes/Null_.scala index 2cb0035c..95ab8c31 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Null_.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Null_.scala @@ -3,7 +3,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class Null_ /* private */(node: Node) extends Node { +final case class Null_ /* private */(node: Node) extends Node { // fields // typed children @@ -15,7 +15,12 @@ case class Null_ /* private */(node: Node) extends Node { } object Null_ { - def unapply(node: Node): Boolean = node.tpe == "null" + def apply(node: Node): Either[String, Null_] = + if node.tpe == "null" + then Right(new Null_(node)) + else Left(s"Expected Null_, got ${node.tpe}") + def unsafeApply(node: Node): Null_ = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[Null_] = apply(node).toOption } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Number.scala b/modules/parser/src/main/scala/playground/generated/nodes/Number.scala index ad705261..4d89e7d1 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Number.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Number.scala @@ -3,7 +3,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class Number /* private */(node: Node) extends Node { +final case class Number /* private */(node: Node) extends Node { // fields // typed children @@ -15,7 +15,12 @@ case class Number /* private */(node: Node) extends Node { } object Number { - def unapply(node: Node): Boolean = node.tpe == "number" + def apply(node: Node): Either[String, Number] = + if node.tpe == "number" + then Right(new Number(node)) + else Left(s"Expected Number, got ${node.tpe}") + def unsafeApply(node: Node): Number = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[Number] = apply(node).toOption } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/OperationCall.scala b/modules/parser/src/main/scala/playground/generated/nodes/OperationCall.scala index 9c2e3182..66df9eda 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/OperationCall.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/OperationCall.scala @@ -3,14 +3,14 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class OperationCall /* private */(node: Node) extends Node { +final case class OperationCall /* private */(node: Node) extends Node { // fields def input: Option[Struct] = node.fields.getOrElse("input", Nil).headOption.map { - case node @ Struct() => Struct(node) + case Struct(node) => node } def operation_name: Option[OperationName] = node.fields.getOrElse("operation_name", Nil).headOption.map { - case node @ OperationName() => OperationName(node) + case OperationName(node) => node } // typed children @@ -21,7 +21,12 @@ case class OperationCall /* private */(node: Node) extends Node { } object OperationCall { - def unapply(node: Node): Boolean = node.tpe == "operation_call" + def apply(node: Node): Either[String, OperationCall] = + if node.tpe == "operation_call" + then Right(new OperationCall(node)) + else Left(s"Expected OperationCall, got ${node.tpe}") + def unsafeApply(node: Node): OperationCall = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[OperationCall] = apply(node).toOption } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/OperationName.scala b/modules/parser/src/main/scala/playground/generated/nodes/OperationName.scala index 255a590d..0605f90e 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/OperationName.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/OperationName.scala @@ -3,14 +3,14 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class OperationName /* private */(node: Node) extends Node { +final case class OperationName /* private */(node: Node) extends Node { // fields def identifier: List[QualifiedIdentifier] = node.fields.getOrElse("identifier", Nil).toList.collect { - case node @ QualifiedIdentifier() => QualifiedIdentifier(node) + case QualifiedIdentifier(node) => node } def name: Option[Identifier] = node.fields.getOrElse("name", Nil).headOption.map { - case node @ Identifier() => Identifier(node) + case Identifier(node) => node } // typed children @@ -21,7 +21,12 @@ case class OperationName /* private */(node: Node) extends Node { } object OperationName { - def unapply(node: Node): Boolean = node.tpe == "operation_name" + def apply(node: Node): Either[String, OperationName] = + if node.tpe == "operation_name" + then Right(new OperationName(node)) + else Left(s"Expected OperationName, got ${node.tpe}") + def unsafeApply(node: Node): OperationName = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[OperationName] = apply(node).toOption } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala b/modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala index b3938ba6..35e88e13 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala @@ -3,18 +3,18 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class QualifiedIdentifier /* private */(node: Node) extends Node { +final case class QualifiedIdentifier /* private */(node: Node) extends Node { // fields def head: Option[Identifier] = node.fields.getOrElse("head", Nil).headOption.map { - case node @ Identifier() => Identifier(node) + case Identifier(node) => node } def selection: Option[Identifier] = node.fields.getOrElse("selection", Nil).headOption.map { - case node @ Identifier() => Identifier(node) + case Identifier(node) => node } def tail: List[Identifier] = node.fields.getOrElse("tail", Nil).toList.collect { - case node @ Identifier() => Identifier(node) + case Identifier(node) => node } // typed children @@ -25,7 +25,12 @@ case class QualifiedIdentifier /* private */(node: Node) extends Node { } object QualifiedIdentifier { - def unapply(node: Node): Boolean = node.tpe == "qualified_identifier" + def apply(node: Node): Either[String, QualifiedIdentifier] = + if node.tpe == "qualified_identifier" + then Right(new QualifiedIdentifier(node)) + else Left(s"Expected QualifiedIdentifier, got ${node.tpe}") + def unsafeApply(node: Node): QualifiedIdentifier = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[QualifiedIdentifier] = apply(node).toOption } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala b/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala index a760c154..1e65e649 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala @@ -3,14 +3,14 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class SourceFile /* private */(node: Node) extends Node { +final case class SourceFile /* private */(node: Node) extends Node { // fields def statements: Option[TopLevelStatement] = node.fields.getOrElse("statements", Nil).headOption.map { - case node @ TopLevelStatement() => TopLevelStatement(node) + case TopLevelStatement(node) => node } def use_clause: Option[UseClause] = node.fields.getOrElse("use_clause", Nil).headOption.map { - case node @ UseClause() => UseClause(node) + case UseClause(node) => node } // typed children @@ -21,7 +21,12 @@ case class SourceFile /* private */(node: Node) extends Node { } object SourceFile { - def unapply(node: Node): Boolean = node.tpe == "source_file" + def apply(node: Node): Either[String, SourceFile] = + if node.tpe == "source_file" + then Right(new SourceFile(node)) + else Left(s"Expected SourceFile, got ${node.tpe}") + def unsafeApply(node: Node): SourceFile = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[SourceFile] = apply(node).toOption } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/String_.scala b/modules/parser/src/main/scala/playground/generated/nodes/String_.scala index 90b32197..43473377 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/String_.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/String_.scala @@ -3,7 +3,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class String_ /* private */(node: Node) extends Node { +final case class String_ /* private */(node: Node) extends Node { // fields // typed children @@ -15,7 +15,12 @@ case class String_ /* private */(node: Node) extends Node { } object String_ { - def unapply(node: Node): Boolean = node.tpe == "string" + def apply(node: Node): Either[String, String_] = + if node.tpe == "string" + then Right(new String_(node)) + else Left(s"Expected String_, got ${node.tpe}") + def unsafeApply(node: Node): String_ = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[String_] = apply(node).toOption } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala b/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala index 7fbad82c..87ce0e44 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala @@ -3,10 +3,10 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class Struct /* private */(node: Node) extends Node { +final case class Struct /* private */(node: Node) extends Node { // fields def bindings: Option[Bindings] = node.fields.getOrElse("bindings", Nil).headOption.map { - case node @ Bindings() => Bindings(node) + case Bindings(node) => node } // typed children @@ -17,7 +17,12 @@ case class Struct /* private */(node: Node) extends Node { } object Struct { - def unapply(node: Node): Boolean = node.tpe == "struct" + def apply(node: Node): Either[String, Struct] = + if node.tpe == "struct" + then Right(new Struct(node)) + else Left(s"Expected Struct, got ${node.tpe}") + def unsafeApply(node: Node): Struct = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[Struct] = apply(node).toOption } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala b/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala index f8078803..d8a39319 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala @@ -3,28 +3,33 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class TopLevelStatement /* private */(node: Node) extends Node { +final case class TopLevelStatement /* private */(node: Node) extends Node { // fields // typed children def typedChildren: Option[LetBinding | OperationCall] = node.children.collectFirst { - case node @ LetBinding() => LetBinding(node) - case node @ OperationCall() => OperationCall(node) + case LetBinding(node) => node + case OperationCall(node) => node } // precise typed children def let_binding: Option[LetBinding] = node.children.collectFirst { - case node @ LetBinding() => LetBinding(node) + case LetBinding(node) => node } def operation_call: Option[OperationCall] = node.children.collectFirst { - case node @ OperationCall() => OperationCall(node) + case OperationCall(node) => node } export node.* } object TopLevelStatement { - def unapply(node: Node): Boolean = node.tpe == "top_level_statement" + def apply(node: Node): Either[String, TopLevelStatement] = + if node.tpe == "top_level_statement" + then Right(new TopLevelStatement(node)) + else Left(s"Expected TopLevelStatement, got ${node.tpe}") + def unsafeApply(node: Node): TopLevelStatement = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[TopLevelStatement] = apply(node).toOption } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/UseClause.scala b/modules/parser/src/main/scala/playground/generated/nodes/UseClause.scala index bcd8261c..38b5fd67 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/UseClause.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/UseClause.scala @@ -3,25 +3,30 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class UseClause /* private */(node: Node) extends Node { +final case class UseClause /* private */(node: Node) extends Node { // fields def identifier: Option[QualifiedIdentifier] = node.fields.getOrElse("identifier", Nil).headOption.map { - case node @ QualifiedIdentifier() => QualifiedIdentifier(node) + case QualifiedIdentifier(node) => node } // typed children def typedChildren: List[Whitespace] = node.children.toList.collect { - case node @ Whitespace() => Whitespace(node) + case Whitespace(node) => node } // precise typed children def whitespace: List[Whitespace] = node.children.toList.collect { - case node @ Whitespace() => Whitespace(node) + case Whitespace(node) => node } export node.* } object UseClause { - def unapply(node: Node): Boolean = node.tpe == "use_clause" + def apply(node: Node): Either[String, UseClause] = + if node.tpe == "use_clause" + then Right(new UseClause(node)) + else Left(s"Expected UseClause, got ${node.tpe}") + def unsafeApply(node: Node): UseClause = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[UseClause] = apply(node).toOption } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Whitespace.scala b/modules/parser/src/main/scala/playground/generated/nodes/Whitespace.scala index d2359946..725e6057 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Whitespace.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Whitespace.scala @@ -3,7 +3,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -case class Whitespace /* private */(node: Node) extends Node { +final case class Whitespace /* private */(node: Node) extends Node { // fields // typed children @@ -15,7 +15,12 @@ case class Whitespace /* private */(node: Node) extends Node { } object Whitespace { - def unapply(node: Node): Boolean = node.tpe == "whitespace" + def apply(node: Node): Either[String, Whitespace] = + if node.tpe == "whitespace" + then Right(new Whitespace(node)) + else Left(s"Expected Whitespace, got ${node.tpe}") + def unsafeApply(node: Node): Whitespace = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[Whitespace] = apply(node).toOption } /* diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala index b2400809..adc91c44 100644 --- a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala +++ b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala @@ -13,7 +13,8 @@ object ParserTreeSitterDemo extends App { """.stripMargin } - val bind = SourceFile(tree.rootNode.get) + val bind = SourceFile + .unsafeApply(tree.rootNode.get) .statements .getOrElse(sys.error("no statements section in source file")) .operation_call diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc b/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc index 31abe37f..441bc313 100644 --- a/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc +++ b/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc @@ -11,27 +11,56 @@ Bax { a = , x = 44 y = 50, b = ,,42, xyz = { a = }} val p = TreeSitterAPI.make("smithyql") -SourceFile(p.parse("use service foo.bar.baz.bax#Baz").rootNode.get).tpe -SourceFile(p.parse("use service foo.bar.baz.bax#Baz").rootNode.get).statements -SourceFile(p.parse("use service foo.bar.baz.bax#Baz").rootNode.get).isError -SourceFile(p.parse("use service foo.bar.baz.bax#Baz").rootNode.get).hasError -SourceFile(p.parse("use service foo.bar.baz.bax#Baz").rootNode.get).children.map(_.tpe) +// hmm +// https://github.com/Jakobeha/type-sitter/blob/5d2cff2f2641d2af9a9a7ebdcd49b0311f19ad66/type-sitter-lib/src/node/incorrect_kind.rs#L10 +/// Underlying cause of why the node is the wrong kind +// pub enum IncorrectKindCause { +// /// Node is an error node +// Error, +// /// Node is a missing node +// Missing, +// /// Node is valid but simply of a different kind (bad node-types.json? Different language? +// /// Broken user invariant?) +// OtherKind(&'static str), +// } +case class ErrorNode(node: Node) extends Node { + export node.* +} + +val base = p.parse("Foo { true }").rootNode.get +SourceFile + .unsafeApply(base) + .statements + .get + .operation_call + .get + .input + .get + .children + .find(_.isError) + +// SourceFile(p.parse("use service foo.bar.baz.bax#Baz").rootNode.get).statements +// SourceFile(p.parse("use service foo.bar.baz.bax#Baz").rootNode.get).isError +// SourceFile(p.parse("use service foo.bar.baz.bax#Baz").rootNode.get).hasError +// SourceFile(p.parse("use service foo.bar.baz.bax#Baz").rootNode.get).children.map(_.tpe) val tree = p.parse(s) tree.rootNode.get.text -SourceFile(tree.rootNode.get).use_clause.get.identifier.head.source +SourceFile.unsafeApply(tree.rootNode.get).use_clause.get.identifier.head.source -SourceFile(tree.rootNode.get).use_clause.get.identifier.get.selection.get.source +SourceFile.unsafeApply(tree.rootNode.get).use_clause.get.identifier.get.selection.get.source -SourceFile(tree.rootNode.get) +SourceFile + .unsafeApply(tree.rootNode.get) .use_clause .get .identifier .tail -SourceFile(tree.rootNode.get) +SourceFile + .unsafeApply(tree.rootNode.get) .statements .get .operation_call @@ -94,7 +123,8 @@ tree .toSet val bind = - SourceFile(tree.rootNode.get) + SourceFile + .unsafeApply(tree.rootNode.get) .statements .get .operation_call From c2757f395703a736f10f40a7d3c628249a903060 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 4 Nov 2024 02:34:54 +0100 Subject: [PATCH 048/105] Generate opaque types --- build.sbt | 4 +- .../playground/parsergen/ParserGen.scala | 56 ++++++++----------- .../playground/generated/nodes/Binding.scala | 28 +++++----- .../playground/generated/nodes/Bindings.scala | 28 +++++----- .../playground/generated/nodes/Boolean_.scala | 13 +---- .../playground/generated/nodes/Comment.scala | 13 +---- .../generated/nodes/Identifier.scala | 13 +---- .../generated/nodes/InputNode.scala | 43 +++++--------- .../generated/nodes/LetBinding.scala | 38 ++++++------- .../generated/nodes/ListFields.scala | 28 +++++----- .../playground/generated/nodes/List_.scala | 22 ++++---- .../playground/generated/nodes/Null_.scala | 13 +---- .../playground/generated/nodes/Number.scala | 13 +---- .../generated/nodes/OperationCall.scala | 28 +++++----- .../generated/nodes/OperationName.scala | 28 +++++----- .../generated/nodes/QualifiedIdentifier.scala | 34 +++++------ .../generated/nodes/SourceFile.scala | 28 +++++----- .../playground/generated/nodes/String_.scala | 13 +---- .../playground/generated/nodes/Struct.scala | 22 ++++---- .../generated/nodes/TopLevelStatement.scala | 38 ++++++------- .../generated/nodes/UseClause.scala | 34 +++++------ .../generated/nodes/Whitespace.scala | 13 +---- 22 files changed, 239 insertions(+), 311 deletions(-) diff --git a/build.sbt b/build.sbt index 423ecf6c..68efce92 100644 --- a/build.sbt +++ b/build.sbt @@ -117,7 +117,7 @@ lazy val parser = module("parser") "io.circe" %% "circe-generic" % "0.14.10" % Test, "io.circe" %% "circe-parser" % "0.14.10" % Test, "co.fs2" %% "fs2-io" % "3.11.0" % Test, - "org.polyvariant.treesitter4s" %% "core" % "0.3-f46864f-SNAPSHOT", + "org.polyvariant.treesitter4s" %% "core" % "0.3-460753c-SNAPSHOT", ) ) .dependsOn( @@ -131,7 +131,7 @@ lazy val parsergen = module("parser-gen") "dev.optics" %% "monocle-core" % "3.3.0", "com.disneystreaming.smithy4s" %% "smithy4s-json" % smithy4sVersion.value, ("org.scalameta" %% "scalameta" % "4.11.0").cross(CrossVersion.for3Use2_13), - "org.polyvariant.treesitter4s" %% "core" % "0.3-f46864f-SNAPSHOT", + "org.polyvariant.treesitter4s" %% "core" % "0.3-460753c-SNAPSHOT", ), scalacOptions -= "-release:11", ) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index 79cd3491..e38e49c0 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -29,7 +29,6 @@ extension (tn: TypeName) { @targetName("renderTypeName") def render: String = tn.value.dropWhile(_ == '_').fromSnakeCase.ident def renderProjection: String = show"as${tn.value.dropWhile(_ == '_').fromSnakeCase}".ident - def asEnumCase: TypeName = TypeName(tn.value + "Case") def asChildName: FieldName = FieldName(tn.value) } @@ -50,13 +49,9 @@ extension (tpe: NodeType) { def renderAdt(tpe: NodeType) = { val name = tpe.tpe.render - val enumCases = tpe.subtypes.map { nodeType => - show"""private case ${nodeType.tpe.asEnumCase.render}(value: ${nodeType.tpe.render})""" - } - val projections = tpe.subtypes.map { nodeType => // format: off - show"""def ${nodeType.tpe.renderProjection}: Option[${nodeType.tpe.render}] = this match { case ${nodeType.tpe.asEnumCase.render}(v) => Some(v); case _ => None }""" + show"""def ${nodeType.tpe.renderProjection}: Option[${nodeType.tpe.render}] = ${nodeType.tpe.render}.unapply(node)""" // format: on } @@ -65,30 +60,21 @@ def renderAdt(tpe: NodeType) = { | |import ${classOf[Node].getName()} | - |enum $name { - |${enumCases.mkString_("\n").indentTrim(2)} + |opaque type $name <: Node = ${tpe.subtypes.map(_.tpe.render).mkString(" | ")} | - |${projections.mkString_("\n").indentTrim(2)} + |object $name { | - | def node: Node = this match { - |${tpe - .subtypes - .map { nodeType => - show"""case ${nodeType.tpe.asEnumCase.render}(value) => value.node""" - } - .mkString_("\n") - .indentTrim(4)} + | extension (node: $name) { + |${projections.mkString_("\n").indentTrim(4)} | } - |} | - |object $name { | def apply(node: Node): Either[String, $name] = node match { |${tpe .subtypes .map { nodeType => show"""case ${nodeType .tpe - .render}(node) => Right(${nodeType.tpe.asEnumCase.render}(node))""" + .render}(node) => Right(node)""" } .mkString_("\n") .indentTrim(4)} @@ -197,28 +183,32 @@ def renderClass(tpe: NodeType) = { .render}: $fieldTypeAnnotation = $childValue""".stripMargin } - // todo: make unapply return option, and then - // todo: turn these into opaque types, these types have no identity beyond type anyway + val methods = + if (fieldGetters.nonEmpty || typedChildren.nonEmpty || typedChildrenPrecise.nonEmpty) { + show"""extension (node: $name) { + | // fields + |${fieldGetters.mkString_("\n\n").indentTrim(2)} + | // typed children + |${typedChildren.foldMap(_.indentTrim(2)): String} + | // precise typed children + |${typedChildrenPrecise.mkString_("\n\n").indentTrim(2)} + |}""".stripMargin + } else + "" + show"""// Generated code! Do not modify by hand. |package playground.generated.nodes | |import ${classOf[Node].getName()} | - |final case class $name /* private */(node: Node) extends Node { - | // fields - |${fieldGetters.mkString_("\n\n").indentTrim(2)} - | // typed children - |${typedChildren.foldMap(_.indentTrim(2)): String} - | // precise typed children - |${typedChildrenPrecise.mkString_("\n\n").indentTrim(2)} - | - | export node.* - |} + |opaque type $name <: Node = Node | |object $name { + |${methods.indentTrim(2)} + | | def apply(node: Node): Either[String, $name] = | if node.tpe == ${tpe.tpe.value.literal} - | then Right(new $name(node)) + | then Right(node) | else Left(s"Expected ${tpe.tpe.render}, got $${node.tpe}") | def unsafeApply(node: Node): $name = apply(node).fold(sys.error, identity) | def unapply(node: Node): Option[$name] = apply(node).toOption diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala b/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala index 4cd8374f..1fe5932a 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala @@ -3,27 +3,27 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -final case class Binding /* private */(node: Node) extends Node { - // fields - def key: Option[Identifier] = node.fields.getOrElse("key", Nil).headOption.map { - case Identifier(node) => node - } +opaque type Binding <: Node = Node - def value: Option[InputNode] = node.fields.getOrElse("value", Nil).headOption.map { - case InputNode(node) => node - } - // typed children +object Binding { + extension (node: Binding) { + // fields + def key: Option[Identifier] = node.fields.getOrElse("key", Nil).headOption.map { + case Identifier(node) => node + } - // precise typed children + def value: Option[InputNode] = node.fields.getOrElse("value", Nil).headOption.map { + case InputNode(node) => node + } + // typed children + // precise typed children - export node.* -} + } -object Binding { def apply(node: Node): Either[String, Binding] = if node.tpe == "binding" - then Right(new Binding(node)) + then Right(node) else Left(s"Expected Binding, got ${node.tpe}") def unsafeApply(node: Node): Binding = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Binding] = apply(node).toOption diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala b/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala index bcc4a914..18b60623 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala @@ -3,25 +3,25 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -final case class Bindings /* private */(node: Node) extends Node { - // fields +opaque type Bindings <: Node = Node - // typed children - def typedChildren: List[Binding] = node.children.toList.collect { - case Binding(node) => node - } - // precise typed children - def binding: List[Binding] = node.children.toList.collect { - case Binding(node) => node - } +object Bindings { + extension (node: Bindings) { + // fields - export node.* -} + // typed children + def typedChildren: List[Binding] = node.children.toList.collect { + case Binding(node) => node + } + // precise typed children + def binding: List[Binding] = node.children.toList.collect { + case Binding(node) => node + } + } -object Bindings { def apply(node: Node): Either[String, Bindings] = if node.tpe == "bindings" - then Right(new Bindings(node)) + then Right(node) else Left(s"Expected Bindings, got ${node.tpe}") def unsafeApply(node: Node): Bindings = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Bindings] = apply(node).toOption diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Boolean_.scala b/modules/parser/src/main/scala/playground/generated/nodes/Boolean_.scala index b1a1186f..e711843a 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Boolean_.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Boolean_.scala @@ -3,21 +3,14 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -final case class Boolean_ /* private */(node: Node) extends Node { - // fields +opaque type Boolean_ <: Node = Node - // typed children - - // precise typed children +object Boolean_ { - export node.* -} - -object Boolean_ { def apply(node: Node): Either[String, Boolean_] = if node.tpe == "boolean" - then Right(new Boolean_(node)) + then Right(node) else Left(s"Expected Boolean_, got ${node.tpe}") def unsafeApply(node: Node): Boolean_ = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Boolean_] = apply(node).toOption diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Comment.scala b/modules/parser/src/main/scala/playground/generated/nodes/Comment.scala index 3642672b..968b14dd 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Comment.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Comment.scala @@ -3,21 +3,14 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -final case class Comment /* private */(node: Node) extends Node { - // fields +opaque type Comment <: Node = Node - // typed children - - // precise typed children +object Comment { - export node.* -} - -object Comment { def apply(node: Node): Either[String, Comment] = if node.tpe == "comment" - then Right(new Comment(node)) + then Right(node) else Left(s"Expected Comment, got ${node.tpe}") def unsafeApply(node: Node): Comment = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Comment] = apply(node).toOption diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Identifier.scala b/modules/parser/src/main/scala/playground/generated/nodes/Identifier.scala index 7932ef6a..22ea7525 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Identifier.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Identifier.scala @@ -3,21 +3,14 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -final case class Identifier /* private */(node: Node) extends Node { - // fields +opaque type Identifier <: Node = Node - // typed children - - // precise typed children +object Identifier { - export node.* -} - -object Identifier { def apply(node: Node): Either[String, Identifier] = if node.tpe == "identifier" - then Right(new Identifier(node)) + then Right(node) else Left(s"Expected Identifier, got ${node.tpe}") def unsafeApply(node: Node): Identifier = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Identifier] = apply(node).toOption diff --git a/modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala b/modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala index f0c54349..3740e08c 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala @@ -3,39 +3,26 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -enum InputNode { - private case BooleanCase(value: Boolean_) - private case ListCase(value: List_) - private case NullCase(value: Null_) - private case NumberCase(value: Number) - private case StringCase(value: String_) - private case StructCase(value: Struct) +opaque type InputNode <: Node = Boolean_ | List_ | Null_ | Number | String_ | Struct - def asBoolean: Option[Boolean_] = this match { case BooleanCase(v) => Some(v); case _ => None } - def asList: Option[List_] = this match { case ListCase(v) => Some(v); case _ => None } - def asNull: Option[Null_] = this match { case NullCase(v) => Some(v); case _ => None } - def asNumber: Option[Number] = this match { case NumberCase(v) => Some(v); case _ => None } - def asString: Option[String_] = this match { case StringCase(v) => Some(v); case _ => None } - def asStruct: Option[Struct] = this match { case StructCase(v) => Some(v); case _ => None } +object InputNode { - def node: Node = this match { - case BooleanCase(value) => value.node - case ListCase(value) => value.node - case NullCase(value) => value.node - case NumberCase(value) => value.node - case StringCase(value) => value.node - case StructCase(value) => value.node + extension (node: InputNode) { + def asBoolean: Option[Boolean_] = Boolean_.unapply(node) + def asList: Option[List_] = List_.unapply(node) + def asNull: Option[Null_] = Null_.unapply(node) + def asNumber: Option[Number] = Number.unapply(node) + def asString: Option[String_] = String_.unapply(node) + def asStruct: Option[Struct] = Struct.unapply(node) } -} -object InputNode { def apply(node: Node): Either[String, InputNode] = node match { - case Boolean_(node) => Right(BooleanCase(node)) - case List_(node) => Right(ListCase(node)) - case Null_(node) => Right(NullCase(node)) - case Number(node) => Right(NumberCase(node)) - case String_(node) => Right(StringCase(node)) - case Struct(node) => Right(StructCase(node)) + case Boolean_(node) => Right(node) + case List_(node) => Right(node) + case Null_(node) => Right(node) + case Number(node) => Right(node) + case String_(node) => Right(node) + case Struct(node) => Right(node) case _ => Left(s"Expected InputNode, got ${node.tpe}") } diff --git a/modules/parser/src/main/scala/playground/generated/nodes/LetBinding.scala b/modules/parser/src/main/scala/playground/generated/nodes/LetBinding.scala index 6b369434..dbc0fdec 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/LetBinding.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/LetBinding.scala @@ -3,30 +3,30 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -final case class LetBinding /* private */(node: Node) extends Node { - // fields +opaque type LetBinding <: Node = Node - // typed children - def typedChildren: List[Binding | Whitespace] = node.children.toList.collect { - case Binding(node) => node - case Whitespace(node) => node - } - // precise typed children - def binding: List[Binding] = node.children.toList.collect { - case Binding(node) => node - } - - def whitespace: List[Whitespace] = node.children.toList.collect { - case Whitespace(node) => node +object LetBinding { + extension (node: LetBinding) { + // fields + + // typed children + def typedChildren: List[Binding | Whitespace] = node.children.toList.collect { + case Binding(node) => node + case Whitespace(node) => node + } + // precise typed children + def binding: List[Binding] = node.children.toList.collect { + case Binding(node) => node + } + + def whitespace: List[Whitespace] = node.children.toList.collect { + case Whitespace(node) => node + } } - export node.* -} - -object LetBinding { def apply(node: Node): Either[String, LetBinding] = if node.tpe == "let_binding" - then Right(new LetBinding(node)) + then Right(node) else Left(s"Expected LetBinding, got ${node.tpe}") def unsafeApply(node: Node): LetBinding = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[LetBinding] = apply(node).toOption diff --git a/modules/parser/src/main/scala/playground/generated/nodes/ListFields.scala b/modules/parser/src/main/scala/playground/generated/nodes/ListFields.scala index 953c6cc3..7f4ed3bc 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/ListFields.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/ListFields.scala @@ -3,25 +3,25 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -final case class ListFields /* private */(node: Node) extends Node { - // fields +opaque type ListFields <: Node = Node - // typed children - def typedChildren: List[InputNode] = node.children.toList.collect { - case InputNode(node) => node - } - // precise typed children - def _input_node: List[InputNode] = node.children.toList.collect { - case InputNode(node) => node - } +object ListFields { + extension (node: ListFields) { + // fields - export node.* -} + // typed children + def typedChildren: List[InputNode] = node.children.toList.collect { + case InputNode(node) => node + } + // precise typed children + def _input_node: List[InputNode] = node.children.toList.collect { + case InputNode(node) => node + } + } -object ListFields { def apply(node: Node): Either[String, ListFields] = if node.tpe == "list_fields" - then Right(new ListFields(node)) + then Right(node) else Left(s"Expected ListFields, got ${node.tpe}") def unsafeApply(node: Node): ListFields = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[ListFields] = apply(node).toOption diff --git a/modules/parser/src/main/scala/playground/generated/nodes/List_.scala b/modules/parser/src/main/scala/playground/generated/nodes/List_.scala index 47a2ecf3..d1cc813c 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/List_.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/List_.scala @@ -3,23 +3,23 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -final case class List_ /* private */(node: Node) extends Node { - // fields - def list_fields: Option[ListFields] = node.fields.getOrElse("list_fields", Nil).headOption.map { - case ListFields(node) => node - } - // typed children +opaque type List_ <: Node = Node - // precise typed children +object List_ { + extension (node: List_) { + // fields + def list_fields: Option[ListFields] = node.fields.getOrElse("list_fields", Nil).headOption.map { + case ListFields(node) => node + } + // typed children + // precise typed children - export node.* -} + } -object List_ { def apply(node: Node): Either[String, List_] = if node.tpe == "list" - then Right(new List_(node)) + then Right(node) else Left(s"Expected List_, got ${node.tpe}") def unsafeApply(node: Node): List_ = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[List_] = apply(node).toOption diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Null_.scala b/modules/parser/src/main/scala/playground/generated/nodes/Null_.scala index 95ab8c31..f823437f 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Null_.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Null_.scala @@ -3,21 +3,14 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -final case class Null_ /* private */(node: Node) extends Node { - // fields +opaque type Null_ <: Node = Node - // typed children - - // precise typed children +object Null_ { - export node.* -} - -object Null_ { def apply(node: Node): Either[String, Null_] = if node.tpe == "null" - then Right(new Null_(node)) + then Right(node) else Left(s"Expected Null_, got ${node.tpe}") def unsafeApply(node: Node): Null_ = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Null_] = apply(node).toOption diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Number.scala b/modules/parser/src/main/scala/playground/generated/nodes/Number.scala index 4d89e7d1..917094b5 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Number.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Number.scala @@ -3,21 +3,14 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -final case class Number /* private */(node: Node) extends Node { - // fields +opaque type Number <: Node = Node - // typed children - - // precise typed children +object Number { - export node.* -} - -object Number { def apply(node: Node): Either[String, Number] = if node.tpe == "number" - then Right(new Number(node)) + then Right(node) else Left(s"Expected Number, got ${node.tpe}") def unsafeApply(node: Node): Number = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Number] = apply(node).toOption diff --git a/modules/parser/src/main/scala/playground/generated/nodes/OperationCall.scala b/modules/parser/src/main/scala/playground/generated/nodes/OperationCall.scala index 66df9eda..7ef2d6e2 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/OperationCall.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/OperationCall.scala @@ -3,27 +3,27 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -final case class OperationCall /* private */(node: Node) extends Node { - // fields - def input: Option[Struct] = node.fields.getOrElse("input", Nil).headOption.map { - case Struct(node) => node - } +opaque type OperationCall <: Node = Node - def operation_name: Option[OperationName] = node.fields.getOrElse("operation_name", Nil).headOption.map { - case OperationName(node) => node - } - // typed children +object OperationCall { + extension (node: OperationCall) { + // fields + def input: Option[Struct] = node.fields.getOrElse("input", Nil).headOption.map { + case Struct(node) => node + } - // precise typed children + def operation_name: Option[OperationName] = node.fields.getOrElse("operation_name", Nil).headOption.map { + case OperationName(node) => node + } + // typed children + // precise typed children - export node.* -} + } -object OperationCall { def apply(node: Node): Either[String, OperationCall] = if node.tpe == "operation_call" - then Right(new OperationCall(node)) + then Right(node) else Left(s"Expected OperationCall, got ${node.tpe}") def unsafeApply(node: Node): OperationCall = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[OperationCall] = apply(node).toOption diff --git a/modules/parser/src/main/scala/playground/generated/nodes/OperationName.scala b/modules/parser/src/main/scala/playground/generated/nodes/OperationName.scala index 0605f90e..76f998b0 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/OperationName.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/OperationName.scala @@ -3,27 +3,27 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -final case class OperationName /* private */(node: Node) extends Node { - // fields - def identifier: List[QualifiedIdentifier] = node.fields.getOrElse("identifier", Nil).toList.collect { - case QualifiedIdentifier(node) => node - } +opaque type OperationName <: Node = Node - def name: Option[Identifier] = node.fields.getOrElse("name", Nil).headOption.map { - case Identifier(node) => node - } - // typed children +object OperationName { + extension (node: OperationName) { + // fields + def identifier: List[QualifiedIdentifier] = node.fields.getOrElse("identifier", Nil).toList.collect { + case QualifiedIdentifier(node) => node + } - // precise typed children + def name: Option[Identifier] = node.fields.getOrElse("name", Nil).headOption.map { + case Identifier(node) => node + } + // typed children + // precise typed children - export node.* -} + } -object OperationName { def apply(node: Node): Either[String, OperationName] = if node.tpe == "operation_name" - then Right(new OperationName(node)) + then Right(node) else Left(s"Expected OperationName, got ${node.tpe}") def unsafeApply(node: Node): OperationName = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[OperationName] = apply(node).toOption diff --git a/modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala b/modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala index 35e88e13..97b81116 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala @@ -3,31 +3,31 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -final case class QualifiedIdentifier /* private */(node: Node) extends Node { - // fields - def head: Option[Identifier] = node.fields.getOrElse("head", Nil).headOption.map { - case Identifier(node) => node - } +opaque type QualifiedIdentifier <: Node = Node - def selection: Option[Identifier] = node.fields.getOrElse("selection", Nil).headOption.map { - case Identifier(node) => node - } +object QualifiedIdentifier { + extension (node: QualifiedIdentifier) { + // fields + def head: Option[Identifier] = node.fields.getOrElse("head", Nil).headOption.map { + case Identifier(node) => node + } - def tail: List[Identifier] = node.fields.getOrElse("tail", Nil).toList.collect { - case Identifier(node) => node - } - // typed children + def selection: Option[Identifier] = node.fields.getOrElse("selection", Nil).headOption.map { + case Identifier(node) => node + } - // precise typed children + def tail: List[Identifier] = node.fields.getOrElse("tail", Nil).toList.collect { + case Identifier(node) => node + } + // typed children + // precise typed children - export node.* -} + } -object QualifiedIdentifier { def apply(node: Node): Either[String, QualifiedIdentifier] = if node.tpe == "qualified_identifier" - then Right(new QualifiedIdentifier(node)) + then Right(node) else Left(s"Expected QualifiedIdentifier, got ${node.tpe}") def unsafeApply(node: Node): QualifiedIdentifier = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[QualifiedIdentifier] = apply(node).toOption diff --git a/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala b/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala index 1e65e649..f3ace410 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala @@ -3,27 +3,27 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -final case class SourceFile /* private */(node: Node) extends Node { - // fields - def statements: Option[TopLevelStatement] = node.fields.getOrElse("statements", Nil).headOption.map { - case TopLevelStatement(node) => node - } +opaque type SourceFile <: Node = Node - def use_clause: Option[UseClause] = node.fields.getOrElse("use_clause", Nil).headOption.map { - case UseClause(node) => node - } - // typed children +object SourceFile { + extension (node: SourceFile) { + // fields + def statements: Option[TopLevelStatement] = node.fields.getOrElse("statements", Nil).headOption.map { + case TopLevelStatement(node) => node + } - // precise typed children + def use_clause: Option[UseClause] = node.fields.getOrElse("use_clause", Nil).headOption.map { + case UseClause(node) => node + } + // typed children + // precise typed children - export node.* -} + } -object SourceFile { def apply(node: Node): Either[String, SourceFile] = if node.tpe == "source_file" - then Right(new SourceFile(node)) + then Right(node) else Left(s"Expected SourceFile, got ${node.tpe}") def unsafeApply(node: Node): SourceFile = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[SourceFile] = apply(node).toOption diff --git a/modules/parser/src/main/scala/playground/generated/nodes/String_.scala b/modules/parser/src/main/scala/playground/generated/nodes/String_.scala index 43473377..147591a1 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/String_.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/String_.scala @@ -3,21 +3,14 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -final case class String_ /* private */(node: Node) extends Node { - // fields +opaque type String_ <: Node = Node - // typed children - - // precise typed children +object String_ { - export node.* -} - -object String_ { def apply(node: Node): Either[String, String_] = if node.tpe == "string" - then Right(new String_(node)) + then Right(node) else Left(s"Expected String_, got ${node.tpe}") def unsafeApply(node: Node): String_ = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[String_] = apply(node).toOption diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala b/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala index 87ce0e44..e7cf6fde 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala @@ -3,23 +3,23 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -final case class Struct /* private */(node: Node) extends Node { - // fields - def bindings: Option[Bindings] = node.fields.getOrElse("bindings", Nil).headOption.map { - case Bindings(node) => node - } - // typed children +opaque type Struct <: Node = Node - // precise typed children +object Struct { + extension (node: Struct) { + // fields + def bindings: Option[Bindings] = node.fields.getOrElse("bindings", Nil).headOption.map { + case Bindings(node) => node + } + // typed children + // precise typed children - export node.* -} + } -object Struct { def apply(node: Node): Either[String, Struct] = if node.tpe == "struct" - then Right(new Struct(node)) + then Right(node) else Left(s"Expected Struct, got ${node.tpe}") def unsafeApply(node: Node): Struct = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Struct] = apply(node).toOption diff --git a/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala b/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala index d8a39319..ac51d2fd 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala @@ -3,30 +3,30 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -final case class TopLevelStatement /* private */(node: Node) extends Node { - // fields +opaque type TopLevelStatement <: Node = Node - // typed children - def typedChildren: Option[LetBinding | OperationCall] = node.children.collectFirst { - case LetBinding(node) => node - case OperationCall(node) => node - } - // precise typed children - def let_binding: Option[LetBinding] = node.children.collectFirst { - case LetBinding(node) => node - } - - def operation_call: Option[OperationCall] = node.children.collectFirst { - case OperationCall(node) => node +object TopLevelStatement { + extension (node: TopLevelStatement) { + // fields + + // typed children + def typedChildren: Option[LetBinding | OperationCall] = node.children.collectFirst { + case LetBinding(node) => node + case OperationCall(node) => node + } + // precise typed children + def let_binding: Option[LetBinding] = node.children.collectFirst { + case LetBinding(node) => node + } + + def operation_call: Option[OperationCall] = node.children.collectFirst { + case OperationCall(node) => node + } } - export node.* -} - -object TopLevelStatement { def apply(node: Node): Either[String, TopLevelStatement] = if node.tpe == "top_level_statement" - then Right(new TopLevelStatement(node)) + then Right(node) else Left(s"Expected TopLevelStatement, got ${node.tpe}") def unsafeApply(node: Node): TopLevelStatement = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[TopLevelStatement] = apply(node).toOption diff --git a/modules/parser/src/main/scala/playground/generated/nodes/UseClause.scala b/modules/parser/src/main/scala/playground/generated/nodes/UseClause.scala index 38b5fd67..0d26e41d 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/UseClause.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/UseClause.scala @@ -3,27 +3,27 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -final case class UseClause /* private */(node: Node) extends Node { - // fields - def identifier: Option[QualifiedIdentifier] = node.fields.getOrElse("identifier", Nil).headOption.map { - case QualifiedIdentifier(node) => node - } - // typed children - def typedChildren: List[Whitespace] = node.children.toList.collect { - case Whitespace(node) => node - } - // precise typed children - def whitespace: List[Whitespace] = node.children.toList.collect { - case Whitespace(node) => node - } - - export node.* -} +opaque type UseClause <: Node = Node object UseClause { + extension (node: UseClause) { + // fields + def identifier: Option[QualifiedIdentifier] = node.fields.getOrElse("identifier", Nil).headOption.map { + case QualifiedIdentifier(node) => node + } + // typed children + def typedChildren: List[Whitespace] = node.children.toList.collect { + case Whitespace(node) => node + } + // precise typed children + def whitespace: List[Whitespace] = node.children.toList.collect { + case Whitespace(node) => node + } + } + def apply(node: Node): Either[String, UseClause] = if node.tpe == "use_clause" - then Right(new UseClause(node)) + then Right(node) else Left(s"Expected UseClause, got ${node.tpe}") def unsafeApply(node: Node): UseClause = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[UseClause] = apply(node).toOption diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Whitespace.scala b/modules/parser/src/main/scala/playground/generated/nodes/Whitespace.scala index 725e6057..73539422 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Whitespace.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Whitespace.scala @@ -3,21 +3,14 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -final case class Whitespace /* private */(node: Node) extends Node { - // fields +opaque type Whitespace <: Node = Node - // typed children - - // precise typed children +object Whitespace { - export node.* -} - -object Whitespace { def apply(node: Node): Either[String, Whitespace] = if node.tpe == "whitespace" - then Right(new Whitespace(node)) + then Right(node) else Left(s"Expected Whitespace, got ${node.tpe}") def unsafeApply(node: Node): Whitespace = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Whitespace] = apply(node).toOption From b9ca07e7407ea379cab2bc367d0924dbbcd02ac8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 5 Nov 2024 01:22:18 +0100 Subject: [PATCH 049/105] Add a couple tests --- .../parser/v3/TreeSitterParserTests.scala | 124 ++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 modules/parser/src/test/scala/playground/smithyql/parser/v3/TreeSitterParserTests.scala diff --git a/modules/parser/src/test/scala/playground/smithyql/parser/v3/TreeSitterParserTests.scala b/modules/parser/src/test/scala/playground/smithyql/parser/v3/TreeSitterParserTests.scala new file mode 100644 index 00000000..19617e5c --- /dev/null +++ b/modules/parser/src/test/scala/playground/smithyql/parser/v3/TreeSitterParserTests.scala @@ -0,0 +1,124 @@ +package playground.smithyql.parser.v3 + +import org.polyvariant.treesitter4s.Node +import org.polyvariant.treesitter4s.TreeSitterAPI +import playground.generated.nodes.SourceFile +import weaver.* + +object TreeSitterParserTests extends FunSuite { + + private def parse(s: String): SourceFile = { + val p = TreeSitterAPI.make("smithyql") + SourceFile.unsafeApply(p.parse(s).rootNode.get) + } + + test("SourceFile fields") { + val in = parse("""use service foo.bar.baz.bax#Baz + |GetBaz{}""".stripMargin) + + assert(in.use_clause.nonEmpty) && + assert(in.statements.nonEmpty) + } + + test("All parents of deep child") { + val allNodes = parse("""use service foo.bar.baz.bax#Baz + |GetBaz { a = { x = 42 }}""".stripMargin) + .fold[List[Node]](_ :: _.flatten.toList) + + val parentTypesAndSources = allNodes + .find(_.source == "x") + .get + .selfAndParents + .map(n => n.tpe -> n.source) + .mkString("\n") + + val expected = List( + "identifier" -> "x", + "binding" -> "x = 42", + "bindings" -> "x = 42", + "struct" -> "{ x = 42 }", + "binding" -> "a = { x = 42 }", + "bindings" -> "a = { x = 42 }", + "struct" -> "{ a = { x = 42 }}", + "operation_call" -> "GetBaz { a = { x = 42 }}", + "top_level_statement" -> "GetBaz { a = { x = 42 }}", + "source_file" -> "use service foo.bar.baz.bax#Baz\nGetBaz { a = { x = 42 }}", + ).mkString("\n") + + assert.same(expected, parentTypesAndSources) + } + + test("Deep insight into field") { + val in = parse("""use service foo.bar.baz.bax#Baz + |GetBaz { a = { x = 42 } }""".stripMargin) + + // this ain't pretty huh + // watch out for the upcoming lookup DSL + val valueOfX = + in.statements + .get + .operation_call + .get + .input + .get + .bindings + .get + .binding + .find(_.key.get.source == "a") + .get + .value + .get + .asStruct + .get + .bindings + .get + .binding + .find(_.key.get.source == "x") + .get + .value + .get + .asNumber + .get + .source + .toInt + + assert.eql(42, valueOfX) + } + + test("Deep insight into field, but the file isn't valid") { + val in = parse("""use service fo o.b ar.b/az.bax/#//B//,,{}az + |GetBa z { a = { x = 42, 50 }, z, 42 }""".stripMargin) + + // this ain't pretty huh + // watch out for the upcoming lookup DSL + val valueOfX = + in.statements + .get + .operation_call + .get + .input + .get + .bindings + .get + .binding + .find(_.key.get.source == "a") + .get + .value + .get + .asStruct + .get + .bindings + .get + .binding + .find(_.key.get.source == "x") + .get + .value + .get + .asNumber + .get + .source + .toInt + + assert.eql(42, valueOfX) + } +} From 567bb2ad39770f7ea118452a56931347dd910da4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 5 Nov 2024 01:23:45 +0100 Subject: [PATCH 050/105] Backport things from tree-sitter branch --- .gitignore | 3 +++ build.sbt | 2 +- flake.nix | 16 +++------------- 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index 9f5210f6..afc0453f 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,8 @@ **/.DS_Store .smithy.lsp.log .sbt +**/node_modules smithyql-log.txt + +result .version diff --git a/build.sbt b/build.sbt index c2e02021..43c62c91 100644 --- a/build.sbt +++ b/build.sbt @@ -73,7 +73,7 @@ val commonSettings = Seq( Nil }, Test / scalacOptions += "-Wconf:cat=deprecation:silent,msg=Specify both message and version:silent", - scalacOptions ++= Seq("-release", "11"), + scalacOptions += "-release:11", mimaFailOnNoPrevious := false, ) diff --git a/flake.nix b/flake.nix index 9afa5030..e4e49875 100644 --- a/flake.nix +++ b/flake.nix @@ -4,24 +4,14 @@ flake-utils.url = "github:numtide/flake-utils"; }; - outputs = { self, nixpkgs, flake-utils, ... }@inputs: + outputs = { nixpkgs, flake-utils, ... }: flake-utils.lib.eachDefaultSystem ( system: let - pkgs = import nixpkgs { - inherit system; - overlays = [ - (final: prev: - let - jre = final.openjdk11; - jdk = jre; - in - { inherit jdk jre; }) - ]; - }; + pkgs = import nixpkgs { inherit system; }; in { - devShell = pkgs.mkShell { + devShells.default = pkgs.mkShell { buildInputs = [ pkgs.yarn pkgs.nodejs From 9871fc1b466942055cf4a7113893b26ed4041d23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 5 Nov 2024 01:27:11 +0100 Subject: [PATCH 051/105] ignore deprecations in examples --- build.sbt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.sbt b/build.sbt index 43c62c91..76a0d945 100644 --- a/build.sbt +++ b/build.sbt @@ -143,6 +143,8 @@ lazy val examples = module("examples") "com.disneystreaming.smithy4s" %% "smithy4s-aws-kernel" % smithy4sVersion.value, ), publish := false, + // generated code + scalacOptions += "-Wconf:cat=deprecation:silent", ) .enablePlugins(Smithy4sCodegenPlugin) From 1c2446ff592bf13423d812e4b13ce159c3d28d45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 5 Nov 2024 01:29:54 +0100 Subject: [PATCH 052/105] Use nixpkgs 24.05 --- flake.lock | 7 ++++--- flake.nix | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/flake.lock b/flake.lock index 1c25de58..5faa5a7f 100644 --- a/flake.lock +++ b/flake.lock @@ -20,15 +20,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1713905099, - "narHash": "sha256-6+M6qG/7PmDxYeXdutxS6gcS2MQR50ilEaIcNwnAmto=", + "lastModified": 1730765555, + "narHash": "sha256-yqWnDR56NbsXV3ojJRqR3u0Tzhz7PqE9/eX1nS+bQIE=", "owner": "nixos", "repo": "nixpkgs", - "rev": "0e7e9561350c68125627534b7c0f2d3cd5d32151", + "rev": "20638fc713eba0765ede79a2dcedb414187c9343", "type": "github" }, "original": { "owner": "nixos", + "ref": "release-24.05", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index e4e49875..e19136ad 100644 --- a/flake.nix +++ b/flake.nix @@ -1,6 +1,6 @@ { inputs = { - nixpkgs.url = "github:nixos/nixpkgs"; + nixpkgs.url = "github:nixos/nixpkgs/release-24.05"; flake-utils.url = "github:numtide/flake-utils"; }; From 58e7f8f8d52be7454e9fde246eaa3930cf127c4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 5 Nov 2024 01:33:01 +0100 Subject: [PATCH 053/105] oops --- flake.lock | 8 ++++---- flake.nix | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/flake.lock b/flake.lock index 5faa5a7f..049dd42b 100644 --- a/flake.lock +++ b/flake.lock @@ -20,16 +20,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1730765555, - "narHash": "sha256-yqWnDR56NbsXV3ojJRqR3u0Tzhz7PqE9/eX1nS+bQIE=", + "lastModified": 1730602179, + "narHash": "sha256-efgLzQAWSzJuCLiCaQUCDu4NudNlHdg2NzGLX5GYaEY=", "owner": "nixos", "repo": "nixpkgs", - "rev": "20638fc713eba0765ede79a2dcedb414187c9343", + "rev": "3c2f1c4ca372622cb2f9de8016c9a0b1cbd0f37c", "type": "github" }, "original": { "owner": "nixos", - "ref": "release-24.05", + "ref": "nixos-24.05", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index e19136ad..9a9b7eba 100644 --- a/flake.nix +++ b/flake.nix @@ -1,6 +1,6 @@ { inputs = { - nixpkgs.url = "github:nixos/nixpkgs/release-24.05"; + nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05"; flake-utils.url = "github:numtide/flake-utils"; }; From 53dae2d611c49498fac2741d4abd81bb17453537 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 5 Nov 2024 01:33:40 +0100 Subject: [PATCH 054/105] update gitignore --- tree-sitter-smithyql/.gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tree-sitter-smithyql/.gitignore b/tree-sitter-smithyql/.gitignore index 7078afa6..5d11846d 100644 --- a/tree-sitter-smithyql/.gitignore +++ b/tree-sitter-smithyql/.gitignore @@ -50,3 +50,5 @@ go.mod package.json pyproject.toml setup.py + +a.out.js From f65eba4c6de225adc431ab0e594fd9a02f69fe46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 5 Nov 2024 01:41:47 +0100 Subject: [PATCH 055/105] Use nixpkgs-unstable --- flake.lock | 8 ++++---- flake.nix | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/flake.lock b/flake.lock index 14c1daa6..94820cff 100644 --- a/flake.lock +++ b/flake.lock @@ -20,16 +20,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1730137625, - "narHash": "sha256-9z8oOgFZiaguj+bbi3k4QhAD6JabWrnv7fscC/mt0KE=", + "lastModified": 1730272153, + "narHash": "sha256-B5WRZYsRlJgwVHIV6DvidFN7VX7Fg9uuwkRW9Ha8z+w=", "owner": "nixos", "repo": "nixpkgs", - "rev": "64b80bfb316b57cdb8919a9110ef63393d74382a", + "rev": "2d2a9ddbe3f2c00747398f3dc9b05f7f2ebb0f53", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixos-24.05", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index 9100e492..de54f1ed 100644 --- a/flake.nix +++ b/flake.nix @@ -1,6 +1,6 @@ { inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05"; + nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; flake-utils.url = "github:numtide/flake-utils"; }; From 385df93a161e05c0bfbde055f4238bc75ab566bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 5 Nov 2024 01:42:10 +0100 Subject: [PATCH 056/105] Use nixpkgs-unstable --- flake.lock | 8 ++++---- flake.nix | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/flake.lock b/flake.lock index 049dd42b..42bd7c08 100644 --- a/flake.lock +++ b/flake.lock @@ -20,16 +20,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1730602179, - "narHash": "sha256-efgLzQAWSzJuCLiCaQUCDu4NudNlHdg2NzGLX5GYaEY=", + "lastModified": 1730272153, + "narHash": "sha256-B5WRZYsRlJgwVHIV6DvidFN7VX7Fg9uuwkRW9Ha8z+w=", "owner": "nixos", "repo": "nixpkgs", - "rev": "3c2f1c4ca372622cb2f9de8016c9a0b1cbd0f37c", + "rev": "2d2a9ddbe3f2c00747398f3dc9b05f7f2ebb0f53", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixos-24.05", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index 9a9b7eba..35a33a30 100644 --- a/flake.nix +++ b/flake.nix @@ -1,6 +1,6 @@ { inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05"; + nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; flake-utils.url = "github:numtide/flake-utils"; }; From 68e3f62a4e95f531aec098bbb9e95cba780b4105 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 5 Nov 2024 01:42:47 +0100 Subject: [PATCH 057/105] never mind --- flake.lock | 8 ++++---- flake.nix | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/flake.lock b/flake.lock index 94820cff..0ef3c0b0 100644 --- a/flake.lock +++ b/flake.lock @@ -20,16 +20,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1730272153, - "narHash": "sha256-B5WRZYsRlJgwVHIV6DvidFN7VX7Fg9uuwkRW9Ha8z+w=", + "lastModified": 1730602179, + "narHash": "sha256-efgLzQAWSzJuCLiCaQUCDu4NudNlHdg2NzGLX5GYaEY=", "owner": "nixos", "repo": "nixpkgs", - "rev": "2d2a9ddbe3f2c00747398f3dc9b05f7f2ebb0f53", + "rev": "3c2f1c4ca372622cb2f9de8016c9a0b1cbd0f37c", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixpkgs-unstable", + "ref": "nixos-24.05", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index de54f1ed..9100e492 100644 --- a/flake.nix +++ b/flake.nix @@ -1,6 +1,6 @@ { inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; + nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05"; flake-utils.url = "github:numtide/flake-utils"; }; From d250c74764115e6afdc2f91e7c5e958f35ad9989 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 5 Nov 2024 01:54:06 +0100 Subject: [PATCH 058/105] Involve tree-sitter in parser suites --- .../smithyql/parser/ParserSuite.scala | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/modules/parser/src/test/scala/playground/smithyql/parser/ParserSuite.scala b/modules/parser/src/test/scala/playground/smithyql/parser/ParserSuite.scala index 95ea1188..a81d3611 100644 --- a/modules/parser/src/test/scala/playground/smithyql/parser/ParserSuite.scala +++ b/modules/parser/src/test/scala/playground/smithyql/parser/ParserSuite.scala @@ -8,6 +8,8 @@ import fs2.io.file.Path import io.circe.Codec import io.circe.Decoder import io.circe.syntax.* +import org.polyvariant.treesitter4s.Node +import org.polyvariant.treesitter4s.TreeSitterAPI import playground.Assertions.* import playground.smithyql.* import playground.smithyql.parser.v2.scanner.Scanner @@ -56,6 +58,7 @@ trait ParserSuite extends SimpleIOSuite { } validTokensTest(testCase, trimWhitespace) + treeSitterTest(testCase, trimWhitespace) } private def validTokensTest( @@ -73,6 +76,20 @@ trait ParserSuite extends SimpleIOSuite { } } + private def treeSitterTest( + testCase: TestCase, + trimWhitespace: Boolean, + ) = + test(testCase.name + " (tree-sitter no errors)") { + testCase.readInput(trimWhitespace).map { input => + val scanned = TreeSitterAPI.make("smithyql").parse(input).rootNode.get + + val errors = scanned.fold[List[Node]](_ :: _.flatten.toList).find(_.isError) + + assert(errors.isEmpty) + } + } + // invalidTokens: a flag that tells the suite whether the file should contain invalid tokens. def loadNegativeParserTests[Alg[_[_]]: SourceParser]( prefix: String, @@ -91,8 +108,23 @@ trait ParserSuite extends SimpleIOSuite { if (!invalidTokens) validTokensTest(testCase, trimWhitespace) + treeSitterNegativeTest(testCase, trimWhitespace) } + private def treeSitterNegativeTest( + testCase: TestCase, + trimWhitespace: Boolean, + ) = + test(testCase.name + " (tree-sitter require errors)") { + testCase.readInput(trimWhitespace).map { input => + val scanned = TreeSitterAPI.make("smithyql").parse(input).rootNode.get + + val errors = scanned.fold[List[Node]](_ :: _.flatten.toList).find(_.isError) + + assert(errors.nonEmpty) + } + } + private def readText( path: Path ) = From 4713b31e05e2a65642be1d53fff10401d2881267 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 5 Nov 2024 01:56:09 +0100 Subject: [PATCH 059/105] eh --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 628dbbe7..bc0e1687 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -55,7 +55,7 @@ jobs: run: nix develop --command bash -c 'cd vscode-extension && yarn && SERVER_VERSION=$(cat ../.version) xvfb-run --auto-servernum yarn test' - name: Show extension test logs - if: job.status == 'failure' + if: always() && job.status == 'failure' run: cat vscode-extension/fixture/smithyql-log.txt | tail --lines 1000 build-parser: From e0793b481fbde3e85a82013cdd0bc76c4ea3e404 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Fri, 8 Nov 2024 00:22:27 +0100 Subject: [PATCH 060/105] Revamp grammar a bit for more coverage --- .../libtree-sitter-smithyql.dylib | Bin 34384 -> 34384 bytes .../libtree-sitter-smithyql.dylib | Bin 16456 -> 16456 bytes .../linux-aarch64/libtree-sitter-smithyql.so | Bin 67368 -> 67368 bytes .../linux-x86-64/libtree-sitter-smithyql.so | Bin 18304 -> 18304 bytes .../playground/generated/nodes/Bindings.scala | 32 --------------- .../generated/nodes/LetBinding.scala | 37 ------------------ .../generated/nodes/ListFields.scala | 32 --------------- .../playground/generated/nodes/List_.scala | 4 +- .../playground/generated/nodes/Prelude.scala | 32 +++++++++++++++ .../generated/nodes/QualifiedIdentifier.scala | 6 +-- .../{OperationCall.scala => RunQuery.scala} | 16 ++++---- .../generated/nodes/SourceFile.scala | 8 ++-- .../playground/generated/nodes/Struct.scala | 4 +- .../generated/nodes/TopLevelStatement.scala | 13 ++---- .../parser/ParserTreeSitterDemo.scala | 7 ++-- .../parser/v3/TreeSitterParserTests.scala | 22 +++-------- tree-sitter-smithyql/grammar.js | 29 +++++++------- 17 files changed, 77 insertions(+), 165 deletions(-) delete mode 100644 modules/parser/src/main/scala/playground/generated/nodes/Bindings.scala delete mode 100644 modules/parser/src/main/scala/playground/generated/nodes/LetBinding.scala delete mode 100644 modules/parser/src/main/scala/playground/generated/nodes/ListFields.scala create mode 100644 modules/parser/src/main/scala/playground/generated/nodes/Prelude.scala rename modules/parser/src/main/scala/playground/generated/nodes/{OperationCall.scala => RunQuery.scala} (55%) diff --git a/modules/parser/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib b/modules/parser/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib index 8681f5e8cbcf10c600e245d6781d9e4986cd0b0c..d99bb7e3d3f9056a12bc00714d3f30d47e407a3e 100755 GIT binary patch literal 34384 zcmeHQe{|HDIHv+7`6-xU{faTUYC^g6FhdcaPEaoLca-huCv$*9s{jboO(QXY4oPlg6m@<>c6Y=#$lmM1$udhs&?aP*&Wy4lyL(xRh<7w&Y4BG}% z?Kx*l?F;#mvz%lv(HQPwFB}Q^JO5GTr`n?>vfw!rDcmbrsb6B-gJwpsU3j zs1EqIGDSi@Usc#2iTFZQ;SPVKy+0V3TQj${A7w=4M9~`9;Ar9grb~HIA{Pp|o80E2 zC@x6Mv%trKtg*rEUz{ex0=LsRe%G^&RX4gGyS-%Xn?Gw^aUJqpAlYYbb*y>MV@BjP zX5pIH56o3+2eB=4h+@A5qWh`(*8XtB*HOL7zcu6y^;h2<@^<*PcZIfvtCw|!d^dOX zbhdgU{;tlsZB|M3dS57voN#r0iVkdZJBt$95jW*xIt!BHAxA-03)c@m2crCk}e1kfP1=KPUBu9pafWLm9+4~8MJQcTOv4ANAAI_XmcfO<=i3L8+$R9x2oUYw=Fw&?-uB{bD2Q}W}Oov z*mS*JXI3+<<-TnD?9w{#3Mz;_M8T7_J_peZJpawS4 zw-d40#MlEOcy9x__ls!r>nuMaf&y|a~AY&lzp@*U2&b?eAiF zv-{ioZpj|Iw+>^tA7vrb;TY=4q5k$9J6^agjw^1j;v@KQ5B$p~cN_GZp#K13uN}U& zr_|$d@aB=5ZSDuwo1mXguk0$RcMR>U9YycdIH@-XdpD1wH;^m!)@MeWZ%U_!arTat zdPN!0=IhewVf@Q-lz*^SnNAPmekx1ZLqAH=>0!JF#wb15D;P!3n<@3y!@rz#dWe^@ z45>E=JyLoujLU9}O9}WPa6EreaD1e3dI58A0=b8F6z7)~Vjd!xdQnCHOc`>_RaJ`!$Nhs1b^do9NCsdRc+pUTe3KJUl)JdsWh^X1gA)awN{ zkEGK>JPw>y_Rz=sN73`1k$S^ucSkxs#BJFpN)P?$PN#=;>lD@=#EYXaNkHK84Kc}-wj#o#>O@a&jrqljhrT);9o9+fN@0%xBp;UoKG;s461 znEN2GsZ8;SePEx4ET2&S!vnTYgYc;kzLY^H3!Hsu0yljCXCHQhvk!;B*@xrciMV8; zO~!@WW?Y(-54*t`mqXyD58#YT7JNxvmw4O`8kB!==Q6y{YQX!g`orfuuN~s|Uqs_+ zGL_LZs-!toL-X)`*8`qxc#P(6e-uT11Cktr4!3yrHqxu_B+;;&ia@~;!4=n$Qb+Zs*JZY7--5$l{Dr7hdW|L^YMgm>mI zh|9l-UJ!;clHN>|d@Me>0vjXM9zE|Ytp4#5%b%v?d={54idg)fEenLFm5Pnazle$v zSyOOLeq|b2Mv0MQogRZ80kb$R7$I%4jjE7zx72$3&o+Ndl20smJ*(fw^ zTx;6+^J`E1Gi#4YYWvDtO|DmQ#oms=v-bQH@MK)a;<;Es6R{o%r;8ldx zYK+pHic)@#Hl2P>ihk)8>zA3D+=J2lvFvAF-z8IW)WtS{f zCH1N#gO))flNwDu#<+y4aGe^r<)js+#!6hX5xoNYht*%Fs<+D2U@S@!%2q?p!oI@w zIHsq^%WQmZMV>^*Ns0YS?wPHBTY~=Wu<4*pxH`?4vXQWCZ62Y_w)OeAEeCCZCL<>2 z>Q;r06FVWJ(}rs{#x=R`?U1wRF0+iI&F-HQG0kNGvn*ZTJLBzJICeun(~PM^9A$3E zw3Up%-IoYF&V-M4PA~5HDSHR?q2^euGl{dy*4v@vuPVoCJPqr>-%7%#5XSHl;?qot#Cj}S9Jl6uqRi!^CDu(%iFFd& zv-DESIp4}-&c0hRmtC6vdSf<&uEm}{lV)N4or67aE_Ue}?9tcJ^>}BpfNHVxF5>vP z%!}8TD@*)t;L^mi$4YFg7Fy#FjWggyrB$GK7D|$n71ovy9PL&zBSFamk<7_1UX&tV zCFQt+JYZlS!Y6-F-S3A3&wfdRI=pVWpjpwbqH~FU5N6!00c*rV6SBxT-T~+*U3Pg38<5UI(eqPud|hU!afT7LcRVLAKI%x{uj{B zo$z5X`CEOR5r3QC7ote0$47160JJ-MI<_K5otWLsiv_vT2$Dwe~R-C-XS?(~Y8}e{IJn;ou zk=fN1@Oe8E{qux;-9B$*p5DpKK>8cOp_WUpCgx1+M@XLikH{Q z@=nFO75{_c_oEMg%`_;das0f#Q=Qw-Qan%be8meCFH(Gx;>C(jQM^QPm*TS(uTi{K z@x_WSSA3=7>lELtc)Q}=itkkXpA#@e7LQ;r9kO zxfEZl_!`A!DLy+{da7QBlEaE`SNuN3cPnoBY4z(dmH!RJzoWR-j^-Kxjetf#BcKt` z2xtT}0vZ90fJQ(gpb^jrXaqC@8Uc-fMnEH=5zq)|1T+E~0gZr0KqH_L&+lbx;O7IxdHG`_MkaJv9wdW*a=`p)fn(qs)IEOKCtBy?AA!80R2SDu_s8JnpMrm) z-}UI~XMN*)`u1hqa`5@))ptc-`f2eutIqw`!f#Jp_UQw0Gih#qz9Mr^eeA-KH@-jE zdj7nlXyTX$kN)bl!g-5+)As4ZKRPz>+^+8)+0gaIhixxA-+Ak;ZN{1n8L_*6aQBWc zz4zkYrag1M^Y1w~ZyacOFzBgURr<|_Q0&QbAHH*6Md0aE&;H_ z^uhY+;nhd;&O8|V_@&$4ZM?4OwpY$pzT`Z6{?`XyTd?O3%f7N9GPS(&c*Eo~N8axJ zY{fqhFL`F>4Yei9-@RP>e`$GccKL!kLvQ}RvHbU&c20bMm31T+GFw+Q?n-sgw* literal 34384 zcmeHQ3viXywO;!_c@shiNs#c!1Htf0g2wO=!U+KhuK?lPfUh17$&cs2A>lj{5(IjR zXc26O_O|iW+Y7a$ptlZVJKWYwTeOY^?Rcdf)6siXXq`5SZO7_GOU2x8{d@oCl?Qd& zna;F(hxM<2?X~vWYk&K7a`^Y3|GxaYPqT>xA*F$GL5EX_?y>HO#z8&+t=sKdy3qw8 zIXROul$?reCb+Va+Z{H$!b$*3_IIjG>aw#WXW59Ev!h77=ytcXw}oO3ll`5UDXqPu zC1*LoU%WHi!(S*I^tIio@{|2l)k?)43n?O7w%sKAcDp;;cKX^{-M+Rh?Uw&U{7x*A zCD$qkEGPT0eKY5Nco5`vFR63Yx$D<7u9v;xL?$PvbsfMR$Y$cOxo-#JHn_it9gI_! zN6|qO$JGFGyH_o5T)A|~a(j$Kl(|!JC9mZ{hQ#qGC@py;uI%TUr2NW`P_WY9-s16B z`hA<3!a>uV74n6{W^h($yD#kR4)`moDq6dtBPt_`RI$g1Y%kvqmU1IRB~WlPxz4!} zT#%S&fR6y#eS_P-I*o@1uIJ^do^!wc>72G7Zn~xG7u_4_dgPUWBoZ-IX^7J=@Kl?ZIuK%KG-8d2@S5 zTdODRYj3OAVrwd!&0q*Qp~|`>8~EmW=El_{7Gz^O3zGdIdqP%OvDn5Q<}^X!&*hzF zm)X)0_H6c>?j4@6x3Z!lE-tnvnhN6fRYfH3)0AxY$3!JNq0d!g2U$941T+E~0gZr0 zKqH_L&X?^14Y ziR0DN4tMXz?o-DvZ4k#lTw@%+a+l-ym7ma8K5)68B4Ro%X>ZJF7JHldss zI$=tzeyxgBVqublHB6Gwc zC;as9rNC-|@=uAt{qw>1QJ{q7A5nnjk*iCf4%o~@OqS0A3T&>B@jZ)}ExRgm&EQy` zqrewtLzfY0dWLoPionq&N-ROV<=BjA0{pP=NvFkkgq8WYcg&!Vk9a+@v&5DgH zF301~@^umZ_lkgk&)Z?oW5a;21K@bvBL4v5@g|k$zNwo^F81A%7HMikxk2sFXP!yY z?ow)`X~|G_=*!ZH(yj(^%^$|@!g%Em_*4yJceF^^!Qa$j>^$RCz3Ar&!`PKxqwFxA z@`kayP$=zA0+)=T?0D=INV{g>^695T;D<5k$(MG8nA0B)V^=yx`9r<$4r6y=wDJdB z&JShBV>?&c^}w!o7(34>Y1aw6pABV)xlo#;{Gq+i4P$p9TiW%)?)yX8{T%U)kaj0A z4xSpy4s*_vrQ!oF-yX)UG*kIQy$=s%hdFv7UE0;a-(h7}gEjpa=1Dd98E`yPmESkm zym^KKr?Ecv?JCOSxl>#q0$;$mFGL&mz}HY^JPMN<*oB6$W1sAA6L8`AZTZJqu@Cd0 z2V>hDs$86H8Ro)C*xm};a;!_q^FF%Xyx4EeeO^O&?KpiFYZL0vNEPdfeH5sNd=eNm z4B~_1`lx`a`=?_~!yKr=xUNNg-a%}6A7gua@3{K~tX0@!oZ#PNj9vi?|GY;(0&IXCdn$=d&I@ z@>mbfv9M2$r4O8ADMwp57B4u*atxef=>z9j%7G2X;srncrC2P_AQroCfAwC!>%V|| z0b(kJZ3Z~U)Bw&g9RTN;j)8MbXTUk8K5&jH1F^>A)1dI-Hd!%&b4+KzIi?K6&M}pP zCy##~i$@H~yK+}OKIbjQ=e@e)AG@DF#-IQADb-vm#IuyssETf&Idl^(qIz0JD`^d_ zrww!)xv7Qjq;1qrA=*h1+D-dup>ZEAGQLiA#sgGuEH#!H%Z-)BYGaM@5IsuYq5q_3 z=_PuV-lBKt1G+-#Vzd}9rie;0Pt=RmVuSFAbw-O=ZL6#AzEhC8*hnZyK9Z9M!7NFm^q|}iXk=0z6Q!wD0}^Y z^3`!UHMpM}mFF7^jM}KQ%y8mzhs^@j)+>M&X)8dAN?JN?c1YqA}QM42=dK zNjbQ4z$zDVHtr_SL@LFz%KW^r?W4f*G1c<%*-MZ8jHS~P>i)}XO)NL@FOD`HCkh09 zGC|oi1=k|XbwLG~?*dQA+bymJUWGIk*5i<$0X*4$G_J*19Ry8^S{l*2i8x@uPgG~1 z4^m+#a4p3(jV9xo4u1mAmfJPN%1wzY7t6hF(A;T*=FS*2cUD|(3fjVBgGYsdeiw9Y zG?EmWZRIio89+iHUOUPZy3x|j!8HrxCb8T+OSb^m42-PAauTsxOE(GE;y9m9$ObL8 zbjjr;ZcCs`L*K+BmZEw=mP_>Mz?1)sw;lJ*@XtNwpj8R^D^z|8HCp-Wa2;4reBUMZ zS_<|7j=dSztRx&`eYX+y%8?MuTYyqLHXN!I$?@L`kJ;8piH$-B-Hu$M&slZaZL>Y_ z*ovVVt7(&JV=QMKa#GPwhnj7(P;vq!xi-Y?nvr9mT?TE21*2zMv_j_n(U!MB=C;_f z7jk->yfvx3AM%JeeH-L>e>;-wgOIc0?88a+ok{jxkW=F9cR`Mg1_S$aVtsp)Oh-7yFm|vPJo^T{S5R5s1Ni3=u=Q8Ldge}fvP~Y zpjDt-L0(WNXg}yM=o=t>xkTRwy#RUz^cv`G&>ujTL8;j9azJB2WgvVPLpOkK0@Z_7 zg4Tm>1GRv*fkL3WKzD-66l7i* zdEdczW9T;~9zT5KipL4h1+*Jio)?T}I__nj9Fy#y&w7otY*J7M8pfGd`xmvr&DH+F zVxSEwjV5lR12OYlNk`n7XvYY&gLh83Yw}*2k2R9_hHJ1l6k#^=E;`Aq8D{Xc zQGb7*8{UNg+yG+i8RO5A;_dlf_TS(hSZ~|gw(*v>&d!UMlkYkH;nUx$ucqMq&~;Rf zU41&upqVs_DzHmdVNbjsp9!k5|JC3(fw}lHl!w~YejFA;!$;0qZZFT3#FQB)vZor< zUX7o0L^35#H}KZRi~ENY#(6Z^V?k!ju~sRj!Np9aI{U0W7>sxHpI z1HUz6=127g%W-;x%g1CnBjV+;33?&$+jxRK&(4^=5G5=UzOS{CFeb|ztS1ONE)JO= zjmwej7r!|pMfFCqeumUrSJ*lD)FnO(+x6PAtxsWndQ7k6Se#|b68I;?Df44?_G*X` zpI|5RWA&rG{Ha{ULs(Zi*|Kop8-h5QFk>y*y236M-z4y^6D^ zAM0Zq&Br$%RTReB)PZ&JF6?%Dur{$DE^n8OmCHbxLX;VaGGi=zv#pik;ze(Zt9d5tbY5Luvum^`**%WoVH{)D2pVV&OVFs-;t!^9- z_H#h)7Qct%3Uqk<8~~1A$6|?@x8ZCo;biuXjll7GULAnlf05cN4Nk#ZMH{=YX$o?RpPM#ax4o+r05%2)h; z#m}G(f6EkBaogwht81nAxr)zMyjJm>6>m^{h2pCeZ&ZA(;!TRX6n87$s`ysL1B!Pk zzDMzU6hEx^Hxxgi_$kF-QoL93i;7=XJWah%V5H)CijP-(vf`DB&r#f^xT&~}y+Z0D z5N`eh>u&i6*4_3WSf_CgI<*uwrua?!(vp+aG`R;iqXN zgmXTba(Tkl>i=u?k8FE<*-O6awHJR`_uUEOPTaEe?(_$8_ZMZpcjS{lU%GvFBYKrz cMqv$y%Wsb0d-=MdA@J1M8Uc;KKRN>c598RTJpcdz diff --git a/modules/parser/src/main/resources/darwin-x86-64/libtree-sitter-smithyql.dylib b/modules/parser/src/main/resources/darwin-x86-64/libtree-sitter-smithyql.dylib index 395c5791f38cbe389bba8f2db895ff45cc3942cc..579313e5fc619d5c2f17fa15e234a83d22c93618 100755 GIT binary patch literal 16456 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 U_bB;ZY&KrcJ(lgkn=4uV599VjE&u=k literal 16456 zcmeHO3vg7`8UF9?hCB$lyk7zdK@bSZ20>6>?m~hAk)j|{5jIP5W43H|<319?tH>_W zXi++}R&AkLYR6hyUn8!LwK^(T>j>(M<6|mNpWF4pR15fk^!x8Qckk|IE8x(Xc4klb z?tlKr`Okm;d+s^AcMk`?`s7qTkzysH9)Jq8+K9GLZ`6o}06$WQT&^Xx%a-V(^ht zq&@SQKBP(~d>`%rT&^1D5@(7==3Cw_GV*Wmd|w$dY#wJu-m?4KZUh7W-Pl?0q8ZNt)-VUNNNO_ptr^A5@3ey76p1>mD zT$S_Si2FIR@5T1Sr4!$MVCRmfjy|uc=R>BasJMs-7;o^PT#A8afZKAcR8Wh@>UOd( z?g)mo7W)Fvs(?GtVV@gtw`lGD!0MoVjz6Hy^@n|p?vTgtt7u5 z?&o5_=*KeSb=-D^ME*tQMVD2xja9N#nwb) z03L6(L*#j!N>x!op@})wwYHH5;;4+NQ`wxo+e6p6Dk&{JgN*ciJl3_ipyrkeRJ#_BZE{AwnXhi$07Iwx*h}*oif>z>eA#sbPKHtR z>F~?WZC4zRd>K-=-i`Mhkj|$Vf5EKVHo%K7Ep-jWH`ghzbRCKDx8!&!yU`m2)U9tr zlGebF?`RnfrokyfEmxzD;`Iq?*NIx~mQU2^-$joWir02^bvd`y9*>+Dqi($ymhfAS z7wJp80V_0`Cma2R8(kwpna#3lga{c@eE?>2SX8KP{xzFb3p15vZZ&!<%Z3SA zG0Pg%=vtN)2-z%_X==2IWnYK@98z`_%MJ@!nUu|9*-Jv!SIWk-EGA@yEc2+*fh_xt zko9MoSB+X&wq3|Bld?}wLbhJWdP~_`ENd3BK`aZX(S0miB4h)k>|vHUgsdmaf@*XZ z%O(g}5zE4A^k$X~7P3B4*2XfMkd?5kO^vQ%*-?BsM^1;btU`@0gbcMxHCn^kQk~T& zcnw<=shcOT{0X$u+316!y@h!GY*AUclSTXI*c6Jdz#QeOmEu>)s*U28$!am_PegC$ zUIigcW{<$yLgWbK$YeTmz&B)qtIyb~Dba2D_vo@TNwP6)E#I(#u z!$hcicf(m9QllS!1^trl`bk;6R&py$?1#A3i0-W>vK|xqC(vVcIT-&u8FE}-5;5#v z6hA1XB@};NR#jsLMow0#TjnFfegDecl+@=4en|wexEe! zV}y@E3m@`{*$M*@h70Q-Gm-ZX!P%b?*idzIGbHgf><$C$YdG1f=zBmt}T2{lKIKCeDgrPkCSC;w3vMl(|w>zJrx*bPvHtf{P;vhmX7i~cRpD|@mF*e zJ9%HYvxjCOk`3yX`}lr2pBzo`KfngHxfI_mYUfe>PSGwL8VYM~cq8-`6psjf4~ln) z+Ej}BQHx=DqQsOKHUvu8W7y6pF*e4pPZJ|!{8l$HG{!$FB>KhrFe#4pW0Dse0D=v0 z9cYdE*!j-*NbYxAt=N+yC$J@{qNkahKxCfSAT9Hs9>)~^p$Or65kkEP;rk+lt3(Kw zix6r=2s1?pQ}hrJ^B@jrY>Z!JBW8Y6iza|O$t*Ev@>S2|rQp53k>u<3vo*a18W90E9p z{ekJg_kaeV9k>Pf74QhKA9x%146tJA3<4^EOM%6}^}ssdP9S!ytLq`qHhjQ&8FVA) zo1iy=z6W|M=0G7TAzzH-0Yk{4> zBfx9G=RhI$q;bF^U?2Q02Ynf|3G@cwr@#@Q5ZmeNkiP>|qaFtC0bV@T9XlaE7hvDt z#m}C9VN8gjH)tl7!{@mG`(;1xAU9{~?=IQq9<;gdEZUu^|NoZV12WdVXAtwBPGj?2 z7CnE=dNqsO7|)x~)qLI^qcDHZ1=u(H*$3>D^>6dL40bM{31|UAz_;0F)2;gsZL;|} zTiIsWZ|52Gzx_Yh{9MX+WzpXY*&cw`m~62Wk}n zWXH7(zr9+(_oF_by{H5=E3A5hFGg(`4X2U#y)o6t0NuwJ-N)It9(0zi^V9l1^Ip^2 z4L{>(^KmLb!CxUzOrvofil3|%8bFh99g@t~WaMig4TAL$$P189w(o;$DUHK*MAFid ztPR(HskXqn2<=K?m51yqIM*-=*L?U>@cXclQ?uRZly;`{f~?YUS)~W_g$g$labhHqAukO6d)4{;x(eQ(M7s$Dy~JCH|gyz(RDL$Ex^o5ZznP~OV^FS zwKT=21H6T1>$=Q#B5yU&^}xMJ&6rKz1<@|urxm~6bH0tZ=fXeVF)J-dlh2oO8!go3 zSK`{epVWJoe%EZY7%eQc6xX7RJev1z8T#el%L@P_q8X^O#41OT8UMBLSgg+!a~4|Z zI!K9D>U|oX3=cfF%&eL{)uSKwWlF9@JrCow%BQUo`eDh)OuMD9vtV2nTBUn1dbCg@ zcs|J?Ruc;~f#?xoSL+=li1J%GRU;%I~&R$@S80Z0G|6;XyFchV7f z8q2Wam*Xksb2a}f1z!pEY;s0Z!S{l5el{i5p6lX%X7|8)!``q>wKQ~wES1l!bKGZE z&ei=Jjk7`*&{*vDE{(@rp8(wMo5V zMhKt=q=pd_$U`+g z&Cf)Rmt)mjfoH4<>!ug$rjMpk5ZVydsW8^db=Vm03C zo#tyKuNFez;h;uAEzss^&=A2WXg8qe6^OvosQE&kCXW`NP#~;PliLehU$|uzB=Ur{ zFYNVFgTJK(rqtf-32DJrH#`OX;Xs4tYVvqB3i(@IUad{@x`H7$4!W`_`gX0tnQA_z z?Qhir`uSEDjs|-XuGo_P;j#dj=CZ;LfEu9{ev}}yf zZm_ZHv_;a8q#cspDCv(Sy+hJHlEx(6FX^k2ekkcNNiFjK6%y-QsNq0$VjAysxjs9{pmw{Xcav8{F zAeVt$267q5WgwSKxbUE)7jyNv%}O+&17 WxC|DD%fuJ-H}JZxInPEc=jXsx_}Ep(>3VvK88we8Czd63YTua_4H zQ0t?gOlv!#qP1OPO;ZK|}ACHUsI@7d?Q zn?n-qnprb{%)W5$zWcX7&OX0;&bc=?x#Ml`e0#|A$R1&Om>7*X?gKfGe*PKP%ankDC$a*J;$(JeP?_lk_*$_{fe+q>P@zi07J1(YRk*2QDu- z*w?1vVRH=U@#_uQN(?^Zq2GN8rfH8b&7hiD7rKP$5`aRim^ph?u7l$3P%49fTytH~ zN${(uz;6Y9G0mcu1tw^=jg7~*cXoHh`!b1iCLX8wJDP8dw(0I%yVkYU*Vk^Z>Fr1j ztlZw(x^mU(>e}j>mB_>4!m)>Y?fL(BK6$hQxSdU(IdBiASBMVS`yuN!EEBayZdAm< zqk`AF_!TBm%*8J^_+|%>U1sn`2OnH$@GTDBbB<>oQHz6<;O!1xw%p|Daqy8V4L;!D zo5ert;3I^wc%y@71>fS}gMzm>_>kasURZt(2|nQX z4-1}k@FRlnckmIx2Oa#F;P*QCalwZi{FLB_9DG#pVFy1g_z?#m6MV$M&kBCb!J~p7 zcW|mQ^XHU5V-?7K(04|Rn-!vA$ z?Yj{h&IWKi!1Bj2!9z$A%yT?|2lFhAhMzva_mKzAhv@*`iVmLNd-TvqIDXP59D{9) zXl(BDo5ssR>kmXjOHXo)ZNBZ-uvHqHum1=14MrbDES=pn9wRzDp35!d+%}da9>;@t zkvf1^_Q49s^+f+ULe%^m;wr{AjVBN{7WN(_^y}B<_*W49pz_=uPc_Wm_lb&g4R;-d z|MQ65aBkB$p8tpqJ;Tep{UYq>iH2H7w9(XBC57u3W*FK`*Kin32U;!-x z$JwTr7t?rRL2P_9Jnz9>q1e}=wEiSrMi<||$m^ZqQ8W9zbW6hnqv1yfh|W#dTYd%w&Z90v7xsOwC6t-O2>m|hRI+t5>9QaU-uFZX&dWUX+ z?c2!1J}152=ZdNMU`e*=C-6zkjE&zhlXf!~%)=Vgc~o$p_kb<;YwG>vTTw%acQaof z!Z<1W@TW)b7=4kJ{rGdyS4-D&d>!g~RC2_iw;%`OwvPv3%Y~@-my7;v&&ZivGmRJ=;H)Yo3pLc94CZ@OnMg;WH>X_Wcfgqs}{7|32){4~DW$ z`$gaPTZ{wxhgtt9?9dM)KFj*2yxx7k!JL5pe%9}S9eOir91wlq3-E`YVIB9%gMJwG z^sxRY^){fM6R@YC^F13uF6Py8%J(@|3r_Ydx;VGM>phAwGUta;Q+%43p&Du)MapY2zIdQyxmX;yrV~EB4d2ZqTi!LE=#hPE_)^L5rh|7etO+(L@ zUW>Ikh_(78uTSjX^DD3x*YBs_`-L1uqI=NK zfCFOvZ()BH_YZxYdlmXuaQ~s#q0Y0S?|TMw68HOzwL?FQ_%Y~wzj+;9j$C}*f@_z* z6XKVh#P&n64NYSEuGmH601 z__6WJV10gg8b9x(@jDE^J=6FdJz@M#px>Tp{PsO%{FwbFbk^<2N7UefLy; zJSTr-{0?FsHcjJq^k0qN8RXkMjo-c}jNf6@cl}g;*h?FJDD{Dtx@r8p$E9E7TQQX% z_U@zKH-2@fFFK9izV8{o4Ez>M<#!VG9h3Ud@9b&(yniu%&Bzy;$`8+0=eHo|qyKL}o`L)tQlhWsj|zfXVF#Qy_y zen;XqN_3oJS0CVaQP%Cdvwd%VkuIVNx|=>rAECdbPvX0h=M{T1yom=8+{Lc0=S88p{uBd*3u@r)Vs{P!dv03^6I_y-rKz!y=HGamc?H0Bi>(mpY^`z zec5~1JL>(wd)oWC_wU|I-g&PyG&eLqv^caRbY6hrE65qD2 zpeS8USJFxlS4~Ul8uVL3*V9{RIo$^9duSPLLls@9q7PmfT8%2}XfH-`yYuyv^Kl-V zqYz(=_<4w*iTE-<7TxC$Pp<6GJb_R2c-_W#IdSligAeOZ_%=ULe}mEU4*Ysuh_^py z*?dHc9ecT>n-8+q-wQ9DVE00f?s0wio|x}{Vm+R359jS(i2aKKdWD}qB=KIz=tRf^ z%;xn%mB!CM0~g)rgZ&&l9~b8F&M4&Z=KG#`f2#}Ngj zN%-kE80RgT*q;}5`jZcqSTPggLI$_}5!Fu26EYumt=%iePuEx*cG!7c0MDCPKT*ZR zeBQ))Xn(r5`R&&Pt9xPYe|CYNkegrTh3!AQ1pc!E{`_NNab724J;1j&aorI1jG&$S zo~X}t^r)koU#!{siTG8x(4YNcZ|z=~=V57}zN;O7^Hs$9hkR==pP3KVPP9rq%

| zptYdAAMIYWVYFjtqiAQ*W`ef`XjN!+Xm3MnLW`sIpnU-CPPEUVeF^O=Xx~KpKH4d? z=h1$P#-9ggqPTLjO0*iZ>(Mr$HKN^y)`r%JHh}gav^&x6M!OH~Z_vJs_7K{)&>lnk zA==Yu&!YVb?Kfy=(D<0a_Zau}BAiRH=XhAVOK@I<9o@sTA&k9kE+abyr)8-wNXvVdNfqUXJrZ zs>1nFJRd#$zSxd<2KZV)72wo(UJffw<3H2!U;4WJD|}BL!F2W5{Kb9^n5Xdf=uLi< zt$7w|xWs=$u*gc@9kE+S{CQH$>kI#QX7Kvp9E;ogzG^3geqNvV#Au0sp`7{ojRi zkw2#jOxRrSp2Swj_1=80Fm@)sBeuS+!cGyj0WZP39FL(A=iu1ep-1q$Pqy)FD~zuQ zbDC`_-!|3QyYl@P3I9FtFY)J8kVk{2{ah3IFN`IFic3&O0ojRbe*T1M0Fkq>&jeRj z!EcZF6_A^N@O%v;if7p}oEPW02}`XL?{*>jU49Kk{@Lt&n{aJvd%s_aWjRD2fL@Z% z9HOja{~+{8!2V&!{!!?Ko|x*jG|m_M z{jhe>*We}xujlFiagVR>;QiskV@3etTx;QV5qMdS9aDb!lJ|(fa^b;mWIQsr@e@DT z*pGE9ap_+Nb+%7;u&;XrV}kuzKiAH<#aMFPR%hGvhnW*axbr1oif8gn%w&G{n&&P* zjpxyP>`4o-PRo&bk^daN9J|+2isG45iCuLW*7I^ag{$yhyaH?TYV3>E*tu)4Z`b18 ztPcCtTI|O4(--r9ZsoT&ob;0vGgx$3W z*lb+k?G;yim>JJ8yqb&sxRAeR%m%`5L1k$C&ci!aK7_BQ{LeZ4|G0Rq|L`zA2*8D$ zO-Jtee{Mc-=B*uFZ5>_P`)n^AZON`o$F`1S+8`ZWJ^dM6zAw4k2U7U6Bm5yzGSy~6 zx)Pm9Hn8mLNwoS3^zNQyI+5wXUoIJso^&$R-^|YVXJd2iDi!pKeWp0sOrcAE+Z7zf^37 z9Dr1WSA<$q9^5140I3w(G#um|Vm+O_~c z#T!h+oY;Ml&zEkvtK?wu4R;sa6W;il(2X;H_UwT)4vp2&5OA+(Fo*sT~XdIe4_FE=uFnURAFjqEw+nG2C+l62%s18=sv$ST2W zM2<-Qtkh+q{`=?QWs~P9yUO5Eku@UgMaD!nirgZyUF3kstjIx;Ln3XjheRJ1c|_!h z$YUapi##QAROD%qVqRz-lvzYOgg~C3d}NFunSS)wqTA_GGs^%xXZc7i zF!E9(h+Z+77mFSdxyb5bmuXGbUL^KGDeMog=DHa=COWSTK8AV0;3zSI#>75T^!JJ` zWm37|VUfc*;~;6MM)3I}OGV0ZBa%cGk4d4n?hz?uhQ!(amWXcsUdfs9NO|5-|1Hrdg`?q)$NJCcB*dM-PO0d)5uKPSav4UeI4Ch6O=e?>0~Ow0dm!o%20JjR|n3S z7L@XGbea=tg3b zaBE*5RkwC`b|$;*YI!X#rnbKUCZ5}NKHB+jWu1iD`D^EsObdT{{tYgOycbL zt)G>(u=857x?N9sDe+uC_igJJm>O`wHX9#f1&5V(ecS$RydD3a!$} zi9aOqR(>bwjB9)UEc`KC@Uzp-5BvP1SB!`2Z*?p0f*bDvHa;TH$H?o9zaOzYej8sV z@nsS}Xo-OjA1;4?2aM;Qjko*z(0TTTzr@@7X6v?j9)eG>fBSqL&iUc~{4`hQY~!u` zx)WcxlbrQJzHOXu#A!r)Z2b|L2@$`l3*${z8%^{WE*YySK>n4Dcc!0YH8JcM9D6Xu NBJq482#S9Y`Y--|e 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 diff --git a/modules/parser/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so b/modules/parser/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so index 22c312457734d87bc7591a72b4d3d6573b097742..a20cb951ccd5bc4dbe67a162ff81a8573ca0aa4c 100755 GIT binary patch literal 18304 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 node - } - // precise typed children - def binding: List[Binding] = node.children.toList.collect { - case Binding(node) => node - } - } - - def apply(node: Node): Either[String, Bindings] = - if node.tpe == "bindings" - then Right(node) - else Left(s"Expected Bindings, got ${node.tpe}") - def unsafeApply(node: Node): Bindings = apply(node).fold(sys.error, identity) - def unapply(node: Node): Option[Bindings] = apply(node).toOption -} - -/* - -*/ diff --git a/modules/parser/src/main/scala/playground/generated/nodes/LetBinding.scala b/modules/parser/src/main/scala/playground/generated/nodes/LetBinding.scala deleted file mode 100644 index dbc0fdec..00000000 --- a/modules/parser/src/main/scala/playground/generated/nodes/LetBinding.scala +++ /dev/null @@ -1,37 +0,0 @@ -// Generated code! Do not modify by hand. -package playground.generated.nodes - -import org.polyvariant.treesitter4s.Node - -opaque type LetBinding <: Node = Node - -object LetBinding { - extension (node: LetBinding) { - // fields - - // typed children - def typedChildren: List[Binding | Whitespace] = node.children.toList.collect { - case Binding(node) => node - case Whitespace(node) => node - } - // precise typed children - def binding: List[Binding] = node.children.toList.collect { - case Binding(node) => node - } - - def whitespace: List[Whitespace] = node.children.toList.collect { - case Whitespace(node) => node - } - } - - def apply(node: Node): Either[String, LetBinding] = - if node.tpe == "let_binding" - then Right(node) - else Left(s"Expected LetBinding, got ${node.tpe}") - def unsafeApply(node: Node): LetBinding = apply(node).fold(sys.error, identity) - def unapply(node: Node): Option[LetBinding] = apply(node).toOption -} - -/* - -*/ diff --git a/modules/parser/src/main/scala/playground/generated/nodes/ListFields.scala b/modules/parser/src/main/scala/playground/generated/nodes/ListFields.scala deleted file mode 100644 index 7f4ed3bc..00000000 --- a/modules/parser/src/main/scala/playground/generated/nodes/ListFields.scala +++ /dev/null @@ -1,32 +0,0 @@ -// Generated code! Do not modify by hand. -package playground.generated.nodes - -import org.polyvariant.treesitter4s.Node - -opaque type ListFields <: Node = Node - -object ListFields { - extension (node: ListFields) { - // fields - - // typed children - def typedChildren: List[InputNode] = node.children.toList.collect { - case InputNode(node) => node - } - // precise typed children - def _input_node: List[InputNode] = node.children.toList.collect { - case InputNode(node) => node - } - } - - def apply(node: Node): Either[String, ListFields] = - if node.tpe == "list_fields" - then Right(node) - else Left(s"Expected ListFields, got ${node.tpe}") - def unsafeApply(node: Node): ListFields = apply(node).fold(sys.error, identity) - def unapply(node: Node): Option[ListFields] = apply(node).toOption -} - -/* - -*/ diff --git a/modules/parser/src/main/scala/playground/generated/nodes/List_.scala b/modules/parser/src/main/scala/playground/generated/nodes/List_.scala index d1cc813c..ea102e6f 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/List_.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/List_.scala @@ -8,8 +8,8 @@ opaque type List_ <: Node = Node object List_ { extension (node: List_) { // fields - def list_fields: Option[ListFields] = node.fields.getOrElse("list_fields", Nil).headOption.map { - case ListFields(node) => node + def list_fields: List[InputNode] = node.fields.getOrElse("list_fields", Nil).toList.collect { + case InputNode(node) => node } // typed children diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Prelude.scala b/modules/parser/src/main/scala/playground/generated/nodes/Prelude.scala new file mode 100644 index 00000000..77bc758e --- /dev/null +++ b/modules/parser/src/main/scala/playground/generated/nodes/Prelude.scala @@ -0,0 +1,32 @@ +// Generated code! Do not modify by hand. +package playground.generated.nodes + +import org.polyvariant.treesitter4s.Node + +opaque type Prelude <: Node = Node + +object Prelude { + extension (node: Prelude) { + // fields + + // typed children + def typedChildren: List[UseClause] = node.children.toList.collect { + case UseClause(node) => node + } + // precise typed children + def use_clause: List[UseClause] = node.children.toList.collect { + case UseClause(node) => node + } + } + + def apply(node: Node): Either[String, Prelude] = + if node.tpe == "prelude" + then Right(node) + else Left(s"Expected Prelude, got ${node.tpe}") + def unsafeApply(node: Node): Prelude = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[Prelude] = apply(node).toOption +} + +/* + +*/ diff --git a/modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala b/modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala index 97b81116..23774ac5 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala @@ -8,17 +8,13 @@ opaque type QualifiedIdentifier <: Node = Node object QualifiedIdentifier { extension (node: QualifiedIdentifier) { // fields - def head: Option[Identifier] = node.fields.getOrElse("head", Nil).headOption.map { + def namespace: List[Identifier] = node.fields.getOrElse("namespace", Nil).toList.collect { case Identifier(node) => node } def selection: Option[Identifier] = node.fields.getOrElse("selection", Nil).headOption.map { case Identifier(node) => node } - - def tail: List[Identifier] = node.fields.getOrElse("tail", Nil).toList.collect { - case Identifier(node) => node - } // typed children // precise typed children diff --git a/modules/parser/src/main/scala/playground/generated/nodes/OperationCall.scala b/modules/parser/src/main/scala/playground/generated/nodes/RunQuery.scala similarity index 55% rename from modules/parser/src/main/scala/playground/generated/nodes/OperationCall.scala rename to modules/parser/src/main/scala/playground/generated/nodes/RunQuery.scala index 7ef2d6e2..237b7dbd 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/OperationCall.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/RunQuery.scala @@ -3,10 +3,10 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node -opaque type OperationCall <: Node = Node +opaque type RunQuery <: Node = Node -object OperationCall { - extension (node: OperationCall) { +object RunQuery { + extension (node: RunQuery) { // fields def input: Option[Struct] = node.fields.getOrElse("input", Nil).headOption.map { case Struct(node) => node @@ -21,12 +21,12 @@ object OperationCall { } - def apply(node: Node): Either[String, OperationCall] = - if node.tpe == "operation_call" + def apply(node: Node): Either[String, RunQuery] = + if node.tpe == "run_query" then Right(node) - else Left(s"Expected OperationCall, got ${node.tpe}") - def unsafeApply(node: Node): OperationCall = apply(node).fold(sys.error, identity) - def unapply(node: Node): Option[OperationCall] = apply(node).toOption + else Left(s"Expected RunQuery, got ${node.tpe}") + def unsafeApply(node: Node): RunQuery = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[RunQuery] = apply(node).toOption } /* diff --git a/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala b/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala index f3ace410..45bfd1ca 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala @@ -8,12 +8,12 @@ opaque type SourceFile <: Node = Node object SourceFile { extension (node: SourceFile) { // fields - def statements: Option[TopLevelStatement] = node.fields.getOrElse("statements", Nil).headOption.map { - case TopLevelStatement(node) => node + def prelude: Option[Prelude] = node.fields.getOrElse("prelude", Nil).headOption.map { + case Prelude(node) => node } - def use_clause: Option[UseClause] = node.fields.getOrElse("use_clause", Nil).headOption.map { - case UseClause(node) => node + def statements: List[TopLevelStatement] = node.fields.getOrElse("statements", Nil).toList.collect { + case TopLevelStatement(node) => node } // typed children diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala b/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala index e7cf6fde..d0a3a204 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala @@ -8,8 +8,8 @@ opaque type Struct <: Node = Node object Struct { extension (node: Struct) { // fields - def bindings: Option[Bindings] = node.fields.getOrElse("bindings", Nil).headOption.map { - case Bindings(node) => node + def bindings: List[Binding] = node.fields.getOrElse("bindings", Nil).toList.collect { + case Binding(node) => node } // typed children diff --git a/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala b/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala index ac51d2fd..739f4268 100644 --- a/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala +++ b/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala @@ -10,17 +10,12 @@ object TopLevelStatement { // fields // typed children - def typedChildren: Option[LetBinding | OperationCall] = node.children.collectFirst { - case LetBinding(node) => node - case OperationCall(node) => node + def typedChildren: Option[RunQuery] = node.children.collectFirst { + case RunQuery(node) => node } // precise typed children - def let_binding: Option[LetBinding] = node.children.collectFirst { - case LetBinding(node) => node - } - - def operation_call: Option[OperationCall] = node.children.collectFirst { - case OperationCall(node) => node + def run_query: Option[RunQuery] = node.children.collectFirst { + case RunQuery(node) => node } } diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala index adc91c44..b2704979 100644 --- a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala +++ b/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala @@ -16,14 +16,13 @@ object ParserTreeSitterDemo extends App { val bind = SourceFile .unsafeApply(tree.rootNode.get) .statements + .headOption .getOrElse(sys.error("no statements section in source file")) - .operation_call - .getOrElse(sys.error("no operation call in statements section")) + .run_query + .getOrElse(sys.error("no run_query in statements section")) .input .getOrElse(sys.error("no input in operation call")) .bindings - .getOrElse(sys.error("no bindings in bindings section of struct")) - .binding .find(_.key.exists(_.source == "x")) .getOrElse(sys.error("no binding with key 'x'")) diff --git a/modules/parser/src/test/scala/playground/smithyql/parser/v3/TreeSitterParserTests.scala b/modules/parser/src/test/scala/playground/smithyql/parser/v3/TreeSitterParserTests.scala index 19617e5c..cbea6aaf 100644 --- a/modules/parser/src/test/scala/playground/smithyql/parser/v3/TreeSitterParserTests.scala +++ b/modules/parser/src/test/scala/playground/smithyql/parser/v3/TreeSitterParserTests.scala @@ -16,7 +16,7 @@ object TreeSitterParserTests extends FunSuite { val in = parse("""use service foo.bar.baz.bax#Baz |GetBaz{}""".stripMargin) - assert(in.use_clause.nonEmpty) && + assert.eql(in.prelude.map(_.use_clause.size), Some(1)) && assert(in.statements.nonEmpty) } @@ -35,12 +35,10 @@ object TreeSitterParserTests extends FunSuite { val expected = List( "identifier" -> "x", "binding" -> "x = 42", - "bindings" -> "x = 42", "struct" -> "{ x = 42 }", "binding" -> "a = { x = 42 }", - "bindings" -> "a = { x = 42 }", "struct" -> "{ a = { x = 42 }}", - "operation_call" -> "GetBaz { a = { x = 42 }}", + "run_query" -> "GetBaz { a = { x = 42 }}", "top_level_statement" -> "GetBaz { a = { x = 42 }}", "source_file" -> "use service foo.bar.baz.bax#Baz\nGetBaz { a = { x = 42 }}", ).mkString("\n") @@ -56,14 +54,12 @@ object TreeSitterParserTests extends FunSuite { // watch out for the upcoming lookup DSL val valueOfX = in.statements - .get - .operation_call + .head + .run_query .get .input .get .bindings - .get - .binding .find(_.key.get.source == "a") .get .value @@ -71,8 +67,6 @@ object TreeSitterParserTests extends FunSuite { .asStruct .get .bindings - .get - .binding .find(_.key.get.source == "x") .get .value @@ -93,14 +87,12 @@ object TreeSitterParserTests extends FunSuite { // watch out for the upcoming lookup DSL val valueOfX = in.statements - .get - .operation_call + .head + .run_query .get .input .get .bindings - .get - .binding .find(_.key.get.source == "a") .get .value @@ -108,8 +100,6 @@ object TreeSitterParserTests extends FunSuite { .asStruct .get .bindings - .get - .binding .find(_.key.get.source == "x") .get .value diff --git a/tree-sitter-smithyql/grammar.js b/tree-sitter-smithyql/grammar.js index 393a439c..f8162fc6 100644 --- a/tree-sitter-smithyql/grammar.js +++ b/tree-sitter-smithyql/grammar.js @@ -13,17 +13,14 @@ module.exports = grammar({ rules: { source_file: ($) => seq( - field("use_clause", optional($.use_clause)), - field("statements", seq($.top_level_statement)) + field("prelude", optional($.prelude)), + field("statements", repeat($.top_level_statement)) ), - top_level_statement: ($) => choice($.let_binding, $.operation_call), - - let_binding: ($) => seq("let", $.whitespace, $.binding, optional(",")), - - operation_call: ($) => - seq(field("operation_name", $.operation_name), field("input", $.struct)), + prelude: ($) => repeat1($.use_clause), + // todo: use token.immediate to prevent comments? + // or just allow comments everywhere? use_clause: ($) => seq( "use", @@ -33,10 +30,14 @@ module.exports = grammar({ field("identifier", $.qualified_identifier) ), + top_level_statement: ($) => choice($.run_query), + + run_query: ($) => + seq(field("operation_name", $.operation_name), field("input", $.struct)), + qualified_identifier: ($) => seq( - field("head", $.identifier), - field("tail", repeat(seq(".", $.identifier))), + field("namespace", seq($.identifier, repeat(seq(".", $.identifier)))), "#", field("selection", $.identifier) ), @@ -53,15 +54,15 @@ module.exports = grammar({ _input_node: ($) => choice($.struct, $.list, $.number, $.string, $.boolean, $.null), - struct: ($) => seq("{", field("bindings", optional($.bindings)), "}"), - list: ($) => seq("[", field("list_fields", optional($.list_fields)), "]"), + struct: ($) => seq("{", field("bindings", optional($._bindings)), "}"), + list: ($) => seq("[", field("list_fields", optional($._list_fields)), "]"), - bindings: ($) => comma_separated_trailing($.binding), + _bindings: ($) => comma_separated_trailing($.binding), binding: ($) => seq(field("key", $.identifier), "=", field("value", $._input_node)), - list_fields: ($) => comma_separated_trailing($._input_node), + _list_fields: ($) => comma_separated_trailing($._input_node), identifier: ($) => /[a-zA-Z_][a-zA-Z0-9_]*/, From b83f791ace26562b7122fd8c5e1081601c3370ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Fri, 8 Nov 2024 00:36:40 +0100 Subject: [PATCH 061/105] And just like that, we have parity? --- .../libtree-sitter-smithyql.dylib | Bin 34384 -> 34384 bytes .../libtree-sitter-smithyql.dylib | Bin 16456 -> 16456 bytes .../linux-aarch64/libtree-sitter-smithyql.so | Bin 67368 -> 67368 bytes .../linux-x86-64/libtree-sitter-smithyql.so | Bin 18304 -> 18304 bytes .../smithyql/parser/ParserSuite.scala | 22 +++++++++++++----- .../parser/generative/ListParserTests.scala | 6 +++++ .../parser/generative/StructParserTests.scala | 2 ++ smithy-build.json | 2 +- tree-sitter-smithyql/grammar.js | 6 ++++- 9 files changed, 30 insertions(+), 8 deletions(-) diff --git a/modules/parser/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib b/modules/parser/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib index d99bb7e3d3f9056a12bc00714d3f30d47e407a3e..98da03f4986e206f46f759233bc6f083be7b786a 100755 GIT binary patch literal 34384 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 diff --git a/modules/parser/src/main/resources/darwin-x86-64/libtree-sitter-smithyql.dylib b/modules/parser/src/main/resources/darwin-x86-64/libtree-sitter-smithyql.dylib index 579313e5fc619d5c2f17fa15e234a83d22c93618..9795d5d136bee64ebe1410531c8c21b69c7393fc 100755 GIT binary patch literal 16456 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 literal 16456 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 U_bB;ZY&KrcJ(lgkn=4uV599VjE&u=k diff --git a/modules/parser/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so b/modules/parser/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so index fbbceec683e1bc02b9ae568c2ec503621aab091c..f10c8cc62700205b4f632c2ea2c3df891126cf27 100755 GIT binary patch literal 67368 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

N zmoN4zn>~Q=?t~E5UyI#u%EOZ%DXWPx*9IX{-h9S<#hry&oN&w4jQCzI9!FV~6XK%E zR^~z^`C2~VYlV$>c_>^B4;Mxwcz_2BQQlUl$H{>7eVrYp0{(3>ae-55A~@L>G;{qsxVo=3UXtftidip@DHO?t JfKQht(LXDO31a{N diff --git a/modules/treesitter/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so b/modules/treesitter/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so index 616d0dab5339c9fc17d8482a638aed27bc06e74d..87a4d8ace6619498275c67d380076e60d72dc325 100755 GIT binary patch delta 4392 zcmb7IZEPGz8J^kQyW8`fo4eTY`o4U3{yfKxKbod-nvytFkQ%6Bt7#gj)HqJk+94Fz zM2-U$cd1a7rd4$A`@^nUAs4BVB~azcKrA7M!=D)OBd$~+e}GFs5Q$1$5CXS$FwgGJ z?w+SeC?`Gd%=^3_^Ulofc*k>>wYke$aVU7WgIT}BQ=^BXGxuy|<{q~?GgH56iw<#$%Op(&jsA$Js8_NUMZP|XpB4NQ5 zeoW#^f}f;YL4y}4T4nHybfC(h#i|Gus&u+jRnKn{4;j^^4g1C5I2$yo4jJ@VC>$$S zuzq`~ExAO;Lk3@_^PxWf9}a#JxxJ6BhU&7n(N*?OWt8-9%Z!zye}Ud;>m}&ypY*TL zZvHWKhWGMSIvw80%M0HR|2Xt?ua(uV!0bkC-6bNDu1LClka5@FFzwWpjJ0vKag#4s zB%Rm7uF|n&jCy0yyrpvHq~c1m6|RWXj&79*&h=9p;HP`KV(Jxk#Xi;S!odrjF-+ae zV|k+x80gtpXPp`c<9B&(>vSd7k=<$ex+C+Lq$lZz@l=4ZZ6;6oc$`M#+o~&S;VF7O zo@(HVeVBQ36Netd-wRH^h&T89tjatGal|u}P&s+U=G~IiG)4}2i@_V|?Rc8L7TZF5 z5*dYO=9f%kv~;OD?~;5WdZfV+VCmnevRuL07)4qz|P4?F`5178OwfV{#EvP_QX{54Ibv>FHy8(E8b4 zOUpoJStn%1j>uynee81}RJI>dV+SC8tQNA>O{%fSq5IhvAcNQxj%9XA(69;SBXiKQ zncJAFu-TdW!D`sR%{k4I@?rL6G=A0rnRNrr<*|49N%Z_kAB663hg?o$gI4rYke@B= z2w0sRwQO=>&w^Fib9pp!W!^wT6$1@h$xd3yY9PH?dj8M5{wf=RkGT={G){}{&^E1g zElY1+k~0YMvlp#FwnDbiV55=W{M>6|FYPVayl$$nZDzd!kDv^5Emby->|yJPOS(mR zerMrVh4)%D-|ak}2lD}K_#ckX!BNEudZ82OGo<#IN%Z}jHgNDW%(vaBmobtTtFZ5~ zytyXMLMp5P2VaH$3Us|fw;y27|9h}|Z;ZlTmGp~JzDv-(_eo)I>;s`y3~(8`x3gxg z90yVnvc{_1)ZVl-xZwcLHaF4do4e_3bFOJO*5LuX(Cs+PcHu30*mChifIUDx+@Oz| zdr5Bz)0q~X`nX23EgJQqKZbUwxwhK;CUAZ+db*{_wEE1y{~Yl(@YiVwzJ-cW8*Nw%4kQ>cHiFEco}U0?JU|N z+C{Ua-*0bgKMAjHXy(uSu6qzDfP2g&@XG*wz>jE0M-#qI2RjVDLZcl!wRiruu|XHs z4lT@gbl;$X))bE2IW?UHDn zJBD+oC<%U5w7U35L`Jl|^wzx%KDY4JfA(_~|FWP1tzAD+_!l+)JPG=81WO~2-Y69TQxo0-1mgVUV2cFbMje%{9a3urj_jsO4v delta 4560 zcmb7IYit}>6~1@&;n|1LZr09tz3c2c>&Mz#oOPVUc0*(vXwuNCb*hjCp(^W=M0Rjp z#|nuXD%Pn~NDH#;9wb|;RO}z1Ad2e9MWi56M+gywglttn1b^%zA&dOL0fb!aV7@zZ zXJ+>jsW8%a&z$c(?qlxUowGM4y*DPkQ-#3WIc8pOPY*pEoqJ#@a}T(AGdKOK=ID)9 zi*)27=clxEzWwawk>Qa;hX&6Mja)pqzhk8RrTs&fFXzu+?!I#M%fpLTJOSRGZm@#W zTUJJo*U}g2ESXjKCA#T7Q)JDSwO_S1S^Q~*&rAP;!Y@dEP~p2|o>7JGwfJ3ZTrn)u zyl)?0q7|P})U(zgHWZ&4$!{urR`P7Sd1?@)3o9+~PG>Lu-B`npVsOn)Vxk zQ5l@4z6yix_#-q?q4QpvuP~zhO2i!1!)LWZj}{cm0-b;*qU+I7#j-@#DvZD#*~<^Hzl*6oRRx zvCh&o;?hCAFRxgZWki?47vysGD*QU#4;b~EGOAy(GWj;2rum?8yr5WXq;*i?(~=)m z_`KxDX(ebxClqTx-3%J-1?e-TSjQzltMF5_7EJL~;vu7QeaCudIF1c39SIrqsZh9b zvxN223t)#sVZKZ+g?jxT9{VVw_0apF-SvOQ?cSd0w3hna24fr1zd--ArLRI~oAl36 zC*Pp9@L|497s4Iv$%~=E}1H77VFS)Mc<|9$ugaLGUd9a=)4Mc z&bX65Qttnh>ELl3xYlSoXfnXoF$Zx!7$CzIIWqUNVNGiGn`V% zcqixOsTdP|A_`&F6*GmcbFButpWaWz=~f~_HxiKy_v{51bYeIc`$ltg#tzU{V$V@c z(7qCSH}ul34wmU$OO)x1MTJg(O(b}ZzM4$Y>xl?IL_bK@72kv555N|X#L%}WZfP2wo-R@8g9^oFgA8m%- zsY_&%*eofQW(`bd*g{y*O0*TM8m*4c4tNW{fa6EeJ=H#kuXA|Bl*WI&$0K&`qMIYg z;$SfWv|)^ivm|RoTZ2=YgZ(7hI@X4^mUWxS-OhtYc35wt$>{KZ$Ny}Taht_NL<6Q&PRB-9+s zXK?4orU@WPX+p7;+)Q5f7<8Q-LmOaKXj_~NcHHN{dRb9CLpRXv=*g0f4EX5mDYXBc ztlzXfW7>qD+mV~=WJ#`5@bR~*7AMPbjhOK>)706&y^%Q10N529<3K! zwsayMb{4u=Lu>1vmn-RIgW&z_0@?sJc#1z{0G5k609vazd}6C+=|R0wEPo%|L5(3j zGxvq{er6DnayobYE=fO^xeO+Vx7uYM!@YRGE^`X^elVV*++gKv<6-0IE^Kblx`%Z7 zyqU^dlJKfbsIiw3=_`r(8gzFbYHR|!-?7Iu_KFg4g!(eE=XA$KV_%1dw?w}V-F;&; z_PU~f3%Wa3jZG@{DVonz*S`TaX8LiQMc+0xEV+BpN+v^p%j7BD(AwCAld=-4*oYIX z4R3b?PPOt&XO(oZ;Rzn6`wcPLZcJ8N9~73C_;?UkocbDLRMl8TPc}A%pbHM*w9*i# zvBoj}D4ocClSZ5LD9m_9_<=CzBYtwPHN`5$>7rphL9}-f#w_{pP_e~UtK(r zZRW`rN6(E7TpD_DGg)^!-d+U;V;i|+%*($?1$vn%W+YS~J)<6tqbC0Y5} z6|-F-+ZC~_fEhlfx1JRR@0QW6%Rx3)n8HKQ3jzlm$AmZS1-(wOJ{#kgsg- zqxZHui*`c0(9`9Io?Y76rJP;5*`=CYn)OP5yB6!0dO^x@DeanTR_Y6uyug+vVV6?t zQs0yk+ts{uDedwoEp@y6>5_WClm#j65(icBgB`xGIQ{P)&gW=lr{zZ)KkDV*ojLC1 w`vT5CD>K);yfd&aqt|C{d-*TR7W4^9iR23q(r_w#1{A2glh#sB~S diff --git a/modules/treesitter/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so b/modules/treesitter/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so index a29d01954905dadfd37ca31d3b8b6b209587414b..1e26ac39e4de77b5fd81ee9dfd6bc6130a042be7 100755 GIT binary patch delta 5182 zcmb7IYiv}<6+UzK;a%I{bqroFu-;vJ?KL6nuEBu80v06>5EI2#S|Ftg=3#7O>KeyE zPKdZxACW_&#?AQ=8bt&tiG-pyqH;^~qiqb06eo&Q6!novfk0nzsw#y_RUJjD``vqI z?%ka2&!)Rk?$OUS-dO%X>IsDhA4hoeWjO6z&QqZ3z) zX!YD?N1MA}*1S<kh4`}0Q!9@}{I@zMUn{p;Gk(LQvPlm1y#O(o=vL{#lG>f{s^ zJ|mZ6hlWqAcKo|FypVD5y&B%z?BKl)&i#SvZ3CLmxm}LWh=wO6KCa;t91G?L@=nl{ zW-PQi_!$lVY0kmVY50u9&ue%g>-b;bo?z4@nTlGTf{bd>@R!#(QF#p?l6bp@KP$5> zX!se4?{M&PQUhP)p0a58N!i_AJ`jrXWLd;~LLviNM=!{ZMl}3oiH~deYZ9N(@JkY( z)bMv5+@y1w;XN5}Uc=jDq8Bv$_tO7$4ZkMw84bTK@mU);$z7p8O2ZW`;Lj3&U&H?@ z@#`8sC-FHA|C_{b7UR~<{ZFE#-GRN^F`4{9rixHTNzc~e>=n)P22uha0)C7#r9 zgMSc?#=>%S^O|)rUxKw(S__&r#kXKpN2Ob{uI5yEG}bO-do}AW?kSI&yQOtRvmTK6 zxQ3sQ_=JY5V?3$h-;@4R8vdMvn{-AqoRtCRH2furpV#moOZCemapMQ)rTAoX+`I_%w~&8ABADe0NDE{WWEbQi$Wh2i z$WxH#Ag@5CA-{yY1^FH1Pmo)X&mm##dkrK3Sq+x;eN9Q(|vp{vJO#rc+dvamS=!A zq7G7rttC;WD2p=bM3`8}0Br`~qpc|Yv<+o|mY{5QJN47u(1X;8GK@_TSZ0-iADdtu zneDdC+Qyb5o73}7pnhy%X`fa~W+io@3eqZ+DL2qs9%q;DM=OZ#!_XD>fQ$L5$Bupw z((%F*Ib@NGEDe5J-8);Z;>7!BfUTL4W z6>gHA-x&PLabNqad)vf$unuVb|8RU5jy|lQ7kUD1Lf0NLj&`tQ1AD%JJnlw4fswpe zgHDlYt%+JlgC^h*DAK>K6Wnv49O zHNQ&Df4H#Fjm|<>7Z%1**P*_GdJgpz>UqApc9l5C;kJyJPTXQfx9Q zxzt47!3(mUQMzP9irs_FTc5{71%9eyk0|hsj?6(t$`uJ$q+5~fi}Dj(vFbfiS7byH zBgL5&M^>Ep-BxUDt*IEVVz`RYDh8_Licc#3sM1%AQ87fx2u(6% z-iib+mb#*SDXFXZtd_c>cDtmm$lL*`E3&56Ly<8_zR2NP_}WwCN|7l=o)lS9+(>aD z#eIb2IyL>A7xsRU{qUX* z;a=H6FMj~d`{fqv+)%Fmcttw+Yn|)M)sL>a4t~CKeRWd)_DRZLeY1R{GZ*%L<;CvZ P5T2FPYIgdedo$v{#xC{J delta 5302 zcmb7ITWnOv8UE+&#k;nlyR6B2jqUYqy#`}@eZyeKWNBj{Bm_)L;)GJi4gr!sSjN>eMmxDVO6M>@=&b4P$AX*=A3`d z*_{%lJ<>mO{_nrc^<2Kmza;W6iJ8Kd#VWEdT~ox-1*#zA`k$3F*6CU##tdB6|%i@i>aTgwG8-t>9Bh;T0=f!RsxRnc&G zy6@Xh^iB6>9_~4Gju8d!B^1*!!Rlr%HoY*<*-YJbuZ&{GK$X68`cNdS}^c^jDKX{ z`x(D#;Ch7@4SbyauRD0oU9kgfxM2i5#yIh-La*>~#zO`^&3MGXzsGoW365odmJJOh z2BI0p+YG#3PK4u$pR#qMVSPiM4ae_#hppQU>j#YQHt+)DV+MXrE`{T{f3x+lVbz;< z%D`j1nWqgr$#~wtTNyuX;O!2cqZz}{&jGI(_%P$I8~6^!FBte9#xEN9LB=oH_z=09 zecFWj>g-ZQjlb>k9Youo zojYkQ7q&n1e&{{hW4Zqv;N{fID8H1<;_g?nH_|Ji+7FI-fmaO@ zozUVAX`R$p9+(?wslD$f$EVAx75{DxC0_`c7oTRW_hJ0 z>2E+5d9KM!Z3^DthBt@(iybuaQVknVnB$}R79#xuPLHf zi7u>a=s|fbm5_&15jmEMGz(u7uyU_^LhT#N)rtD#uT%9~Ed>XP;M<@VH`QOF3u{e@ z&Obu(wbUBXF56p^axfJU8)Vc<$OElaxwql{3FIcE7Nc&1^g*^l#vqSEo`gIPISY9W z@+RaR$On)QAq$YtApe4tVLwG7Nk}_n6J#4?FXUm!5y&Y>9&*N_yXhQm&O?3yc?Zu21vm8&aX|Baa zNm2u~;1z}KgV|hxvW!-v3{e_oz48mYe)4j9b-=~zTpTgQ@n7t*UgyqvIm#&k6dgxd zi9QLcr4-6)T8DBCb)c-n@2H>}>P4AA?=4z|Eme*>4&QQ)t%H^Rw+uN>5q47~?chd~ z|6eD(4Bh~~xD&DBac~MbzP2}~UJt?^Igy&JN_Vs?(be0i6|1G@f+%Bqsu{VJPe1S= zo?K;BgKDBKl#On-0BwTqqal=j8b%pV>z~8&>*@8mcXyy^^>*2US|zkx%U5t0#HI-& zNpV88mAp)T8i5|7Z79Q3g>tQ%LC5U?>ZhDqLod*4=$@j6;_wO4y(s@X*>2mm$F?ay zuOTnj*NSr82cIB~+5Rf?b3#_$+daO_7^1^hmVgYQTnlEiwEMP1JKnR zI$QT3&!nFY0}s+;D8ty`NpXt~I4*Vvyg6{1@i}KKeu03Ya(?-CsTv{L7A97tRdJZ1`BKo38va)uy^9$j4sow>4C8X$z$v<~i$;z&_u<}qMX{H}UY=ons7HOMbDDT- zqOFOwCelotX_Uh>Q`XG*e#SKy*4$TfUEOWXWi@qWs+uFsO*I$Q+*4CcO)d2}G?{#Z z8`ktu(?v}Wud!VdLOmav@Hqqzhc%kfF@qyb*fc@YgiI4KO}I3_(tPT?To}e_8Xt5y zzkePZ(+|~+9ddH>Q{tjr*!*{^uoI8Zu33>C_XC-@vn%W!&Heb!f$$48I&bie7#Z{0CBVFMFQ@(;sY#j(+WHNVg_JOTw F@gIb=;rjpp diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/OperationNameQualifier.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/OperationNameQualifier.scala deleted file mode 100644 index a193f952..00000000 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/OperationNameQualifier.scala +++ /dev/null @@ -1,39 +0,0 @@ -// Generated code! Do not modify by hand. -package playground.generated.nodes - -import org.polyvariant.treesitter4s.Node -import playground.treesitter4s.std.Selection - -opaque type OperationNameQualifier <: Node = Node - -object OperationNameQualifier { - extension (node: OperationNameQualifier) { - def select[A](f: OperationNameQualifier.Selector => Selection[A]): List[A] = f(OperationNameQualifier.Selector(List(node))).path - // fields - - // typed children - def typedChildren: Option[QualifiedIdentifier] = node.children.collectFirst { - case QualifiedIdentifier(node) => node - } - // precise typed children - def qualified_identifier: Option[QualifiedIdentifier] = node.children.collectFirst { - case QualifiedIdentifier(node) => node - } - } - - def apply(node: Node): Either[String, OperationNameQualifier] = - if node.tpe == "operation_name_qualifier" - then Right(node) - else Left(s"Expected OperationNameQualifier, got ${node.tpe}") - - def unsafeApply(node: Node): OperationNameQualifier = apply(node).fold(sys.error, identity) - - def unapply(node: Node): Option[OperationNameQualifier] = apply(node).toOption - - final case class Selector(path: List[OperationNameQualifier]) extends Selection[OperationNameQualifier] { - def qualified_identifier: QualifiedIdentifier.Selector = QualifiedIdentifier.Selector(path.flatMap(_.qualified_identifier)) - - type Self = Selector - protected val remake = Selector.apply - } -} diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/QueryOperationName.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/QueryOperationName.scala index cae47bc5..9480e227 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/QueryOperationName.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/QueryOperationName.scala @@ -10,13 +10,13 @@ object QueryOperationName { extension (node: QueryOperationName) { def select[A](f: QueryOperationName.Selector => Selection[A]): List[A] = f(QueryOperationName.Selector(List(node))).path // fields - def identifier: Option[OperationNameQualifier] = node.fields.getOrElse("identifier", Nil).headOption.map { - case OperationNameQualifier(node) => node - } - def name: Option[OperationName] = node.fields.getOrElse("name", Nil).headOption.map { case OperationName(node) => node } + + def service_identifier: Option[QualifiedIdentifier] = node.fields.getOrElse("service_identifier", Nil).headOption.map { + case QualifiedIdentifier(node) => node + } // typed children // precise typed children @@ -33,8 +33,8 @@ object QueryOperationName { def unapply(node: Node): Option[QueryOperationName] = apply(node).toOption final case class Selector(path: List[QueryOperationName]) extends Selection[QueryOperationName] { - def identifier: OperationNameQualifier.Selector = OperationNameQualifier.Selector(path.flatMap(_.identifier)) def name: OperationName.Selector = OperationName.Selector(path.flatMap(_.name)) + def service_identifier: QualifiedIdentifier.Selector = QualifiedIdentifier.Selector(path.flatMap(_.service_identifier)) type Self = Selector protected val remake = Selector.apply diff --git a/tree-sitter-smithyql/grammar.js b/tree-sitter-smithyql/grammar.js index c7d8e716..01ee9c70 100644 --- a/tree-sitter-smithyql/grammar.js +++ b/tree-sitter-smithyql/grammar.js @@ -47,12 +47,13 @@ module.exports = grammar({ field("selection", $.identifier) ), - operation_name_qualifier: ($) => seq($.qualified_identifier, "."), - - // todo: model as union? query_operation_name: ($) => - seq( - field("identifier", optional($.operation_name_qualifier)), + choice( + seq( + field("service_identifier", $.qualified_identifier), + ".", + field("name", $.operation_name) + ), field("name", $.operation_name) ), From 74e20421d4dad45bc00d236f522977f96eaf3c48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 24 Dec 2024 19:24:27 +0100 Subject: [PATCH 099/105] update smithy4s --- .../test/resources/test-workspaces/default/smithy-build.json | 2 +- project/plugins.sbt | 2 +- smithy-build.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/lsp/src/test/resources/test-workspaces/default/smithy-build.json b/modules/lsp/src/test/resources/test-workspaces/default/smithy-build.json index b0aca2b2..ce803e54 100644 --- a/modules/lsp/src/test/resources/test-workspaces/default/smithy-build.json +++ b/modules/lsp/src/test/resources/test-workspaces/default/smithy-build.json @@ -2,6 +2,6 @@ "sources": ["./weather.smithy", "./no-runner.smithy"], "mavenDependencies": [ "com.disneystreaming.alloy:alloy-core:0.3.14", - "com.disneystreaming.smithy4s:smithy4s-protocol:0.18.26" + "com.disneystreaming.smithy4s:smithy4s-protocol:0.18.27" ] } diff --git a/project/plugins.sbt b/project/plugins.sbt index b4014537..2e68aa92 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -4,7 +4,7 @@ addSbtPlugin("com.github.sbt" % "sbt-ci-release" % "1.5.11") addSbtPlugin("org.typelevel" % "sbt-tpolecat" % "0.5.2") // try to keep in sync with smithy-build.json -addSbtPlugin("com.disneystreaming.smithy4s" % "smithy4s-sbt-codegen" % "0.18.25") +addSbtPlugin("com.disneystreaming.smithy4s" % "smithy4s-sbt-codegen" % "0.18.27") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.11.0") addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "1.1.1") diff --git a/smithy-build.json b/smithy-build.json index 4364f960..962a7c14 100644 --- a/smithy-build.json +++ b/smithy-build.json @@ -2,7 +2,7 @@ "sources": ["modules/examples/src/main/smithy"], "mavenDependencies": [ "com.disneystreaming.alloy:alloy-core:0.3.14", - "com.disneystreaming.smithy4s:smithy4s-protocol:0.18.26", + "com.disneystreaming.smithy4s:smithy4s-protocol:0.18.27", "software.amazon.smithy:smithy-aws-traits:1.53.0" ] } From 48042839261444e5c933fcfaa7fd0f8c69605802 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 24 Dec 2024 19:29:40 +0100 Subject: [PATCH 100/105] Regenerate smithy-build.json --- smithy-build.json | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/smithy-build.json b/smithy-build.json index 962a7c14..687371e2 100644 --- a/smithy-build.json +++ b/smithy-build.json @@ -1,5 +1,21 @@ { - "sources": ["modules/examples/src/main/smithy"], + "version": "1.0", + "sources": [ + "modules/examples/src/main/smithy", + "modules/parser-gen/src/main/smithy", + "modules/parser-gen/target/scala-3.5.2/src_managed/main/smithy", + "modules/examples/target/scala-3.5.2/src_managed/main/smithy", + "modules/protocol4s/src/main/smithy", + "modules/protocol4s/target/scala-3.5.2/src_managed/main/smithy" + ], + "maven": { + "dependencies": [ + "com.disneystreaming.alloy:alloy-core:0.3.13", + "com.disneystreaming.smithy4s:smithy4s-protocol:0.18.27" + ], + + "repositories": [] + }, "mavenDependencies": [ "com.disneystreaming.alloy:alloy-core:0.3.14", "com.disneystreaming.smithy4s:smithy4s-protocol:0.18.27", From 1eb2eb967bf3f0c4ddb6cc110c883f3e9f1d5017 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 24 Dec 2024 19:30:57 +0100 Subject: [PATCH 101/105] Update smithy-build to actually pass validation --- .gitignore | 1 + smithy-build.json | 12 ++++-------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index afc0453f..8c95b2bd 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ smithyql-log.txt result .version +build/smithy diff --git a/smithy-build.json b/smithy-build.json index 687371e2..69763f2e 100644 --- a/smithy-build.json +++ b/smithy-build.json @@ -10,15 +10,11 @@ ], "maven": { "dependencies": [ - "com.disneystreaming.alloy:alloy-core:0.3.13", - "com.disneystreaming.smithy4s:smithy4s-protocol:0.18.27" + "com.disneystreaming.alloy:alloy-core:0.3.14", + "com.disneystreaming.smithy4s:smithy4s-protocol:0.18.27", + "software.amazon.smithy:smithy-aws-traits:1.53.0" ], "repositories": [] - }, - "mavenDependencies": [ - "com.disneystreaming.alloy:alloy-core:0.3.14", - "com.disneystreaming.smithy4s:smithy4s-protocol:0.18.27", - "software.amazon.smithy:smithy-aws-traits:1.53.0" - ] + } } From d5e542faea1a65bc71f0df6e3d3320159379ec66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 24 Dec 2024 19:40:16 +0100 Subject: [PATCH 102/105] Move to good old oslib --- build.sbt | 1 + .../scala/playground/parsergen/ParserGen.scala | 17 +++++++---------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/build.sbt b/build.sbt index 10a7a231..c9783e18 100644 --- a/build.sbt +++ b/build.sbt @@ -151,6 +151,7 @@ lazy val parsergen = module("parser-gen") "com.disneystreaming.smithy4s" %% "smithy4s-json" % smithy4sVersion.value, ("org.scalameta" %% "scalameta" % "4.11.0").cross(CrossVersion.for3Use2_13), "org.polyvariant.treesitter4s" %% "core" % "0.4.0", + "com.lihaoyi" %% "os-lib" % "0.11.3", ), scalacOptions -= "-release:11", ) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index 43811d57..24061aa0 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -12,10 +12,7 @@ import treesittersmithy.NodeTypes import treesittersmithy.TypeName import util.chaining.* -import java.nio.file.Files -import java.nio.file.Paths import scala.annotation.targetName -import scala.jdk.CollectionConverters.* import scala.meta.Dialect extension (tn: TypeName) { @@ -304,13 +301,14 @@ private def renderProduct(p: Type.Product): String = { val types = Json .read[NodeTypes]( - Blob(Files.readString(Paths.get("tree-sitter-smithyql/src/node-types.json"))) + Blob(os.read(os.pwd / "tree-sitter-smithyql" / "src" / "node-types.json")) ) .toTry .get .value - val base = Paths.get(s"modules/treesitter/src/main/scala/playground/generated/nodes") + val base = + os.pwd / "modules" / "treesitter" / "src" / "main" / "scala" / "playground" / "generated" / "nodes" val rendered = types .filter(_.named) @@ -326,15 +324,14 @@ private def renderProduct(p: Type.Product): String = { _.render ) - Files.createDirectories(base) - - Files.walk(base).iterator().asScala.filter(Files.isRegularFile(_)).foreach(Files.delete) + os.remove.all(base) rendered .foreach { (tpe, code) => - Files.writeString( - base.resolve(s"${tpe.tpe.render}.scala"), + os.write( + base / s"${tpe.tpe.render}.scala", code, + createFolders = true, ) } } From 4f1e82ff819eeec1173ebc5d8c624dafda27ad0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 24 Dec 2024 19:40:50 +0100 Subject: [PATCH 103/105] Reformat nix --- flake.nix | 61 +++++++++++++++++++++++++------------------------------ 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/flake.nix b/flake.nix index 0ee4b41b..bd8896df 100644 --- a/flake.nix +++ b/flake.nix @@ -5,12 +5,9 @@ }; outputs = { self, nixpkgs, flake-utils, ... }: - flake-utils.lib.eachDefaultSystem ( - system: - let - pkgs = import nixpkgs { inherit system; }; - in - { + flake-utils.lib.eachDefaultSystem (system: + let pkgs = import nixpkgs { inherit system; }; + in { devShells.default = pkgs.mkShell { buildInputs = [ pkgs.yarn @@ -23,35 +20,33 @@ pkgs.coursier ] ++ pkgs.lib.optionals pkgs.stdenv.isLinux [ pkgs.xvfb-run ]; }; - packages.tree-sitter-smithyql = - pkgs.stdenv.mkDerivation { - name = "tree-sitter-smithyql"; - src = ./tree-sitter-smithyql; - buildInputs = [pkgs.tree-sitter pkgs.nodejs]; - buildPhase = '' - tree-sitter generate - make - ''; - installPhase = if system == "x86_64-darwin" || system == "aarch64-darwin" then '' + packages.tree-sitter-smithyql = pkgs.stdenv.mkDerivation { + name = "tree-sitter-smithyql"; + src = ./tree-sitter-smithyql; + buildInputs = [ pkgs.tree-sitter pkgs.nodejs ]; + buildPhase = '' + tree-sitter generate + make + ''; + installPhase = + if system == "x86_64-darwin" || system == "aarch64-darwin" then '' cp libtree-sitter-smithyql.dylib $out '' else '' cp libtree-sitter-smithyql.so $out ''; - }; - packages.tree-sitter-smithyql-all = - pkgs.stdenv.mkDerivation { - name = "tree-sitter-smithyql-all"; - src = ./tree-sitter-smithyql; - dontBuild=true; - installPhase = '' - mkdir $out - cd $out - mkdir darwin-aarch64 && cp ${self.packages.aarch64-darwin.tree-sitter-smithyql} darwin-aarch64/libtree-sitter-smithyql.dylib - mkdir darwin-x86-64 && cp ${self.packages.x86_64-darwin.tree-sitter-smithyql} darwin-x86-64/libtree-sitter-smithyql.dylib - mkdir linux-aarch64 && cp ${self.packages.aarch64-linux.tree-sitter-smithyql} linux-aarch64/libtree-sitter-smithyql.so - mkdir linux-x86-64 && cp ${self.packages.x86_64-linux.tree-sitter-smithyql} linux-x86-64/libtree-sitter-smithyql.so - ''; - }; - } - ); + }; + packages.tree-sitter-smithyql-all = pkgs.stdenv.mkDerivation { + name = "tree-sitter-smithyql-all"; + src = ./tree-sitter-smithyql; + dontBuild = true; + installPhase = '' + mkdir $out + cd $out + mkdir darwin-aarch64 && cp ${self.packages.aarch64-darwin.tree-sitter-smithyql} darwin-aarch64/libtree-sitter-smithyql.dylib + mkdir darwin-x86-64 && cp ${self.packages.x86_64-darwin.tree-sitter-smithyql} darwin-x86-64/libtree-sitter-smithyql.dylib + mkdir linux-aarch64 && cp ${self.packages.aarch64-linux.tree-sitter-smithyql} linux-aarch64/libtree-sitter-smithyql.so + mkdir linux-x86-64 && cp ${self.packages.x86_64-linux.tree-sitter-smithyql} linux-x86-64/libtree-sitter-smithyql.so + ''; + }; + }); } From af93f95796e91554f3bd5478ece663afead29e21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 24 Dec 2024 20:53:22 +0100 Subject: [PATCH 104/105] Update nixpkgs to 24.11 --- flake.lock | 8 ++++---- flake.nix | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/flake.lock b/flake.lock index 0ef3c0b0..f448bae3 100644 --- a/flake.lock +++ b/flake.lock @@ -20,16 +20,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1730602179, - "narHash": "sha256-efgLzQAWSzJuCLiCaQUCDu4NudNlHdg2NzGLX5GYaEY=", + "lastModified": 1734875076, + "narHash": "sha256-Pzyb+YNG5u3zP79zoi8HXYMs15Q5dfjDgwCdUI5B0nY=", "owner": "nixos", "repo": "nixpkgs", - "rev": "3c2f1c4ca372622cb2f9de8016c9a0b1cbd0f37c", + "rev": "1807c2b91223227ad5599d7067a61665c52d1295", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixos-24.05", + "ref": "nixos-24.11", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index bd8896df..682d7d95 100644 --- a/flake.nix +++ b/flake.nix @@ -1,6 +1,6 @@ { inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05"; + nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11"; flake-utils.url = "github:numtide/flake-utils"; }; From c6be48530b1990150de7971cdc3d9fad9b9c07b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 24 Dec 2024 21:38:12 +0100 Subject: [PATCH 105/105] Fix nix after nixpkgs bump broke TS grammars --- flake.nix | 9 ++------- .../libtree-sitter-smithyql.dylib | Bin 34384 -> 33992 bytes .../libtree-sitter-smithyql.dylib | Bin 16456 -> 17152 bytes .../linux-aarch64/libtree-sitter-smithyql.so | Bin 67368 -> 70320 bytes .../linux-x86-64/libtree-sitter-smithyql.so | Bin 18304 -> 20200 bytes 5 files changed, 2 insertions(+), 7 deletions(-) diff --git a/flake.nix b/flake.nix index 682d7d95..06149495 100644 --- a/flake.nix +++ b/flake.nix @@ -26,14 +26,9 @@ buildInputs = [ pkgs.tree-sitter pkgs.nodejs ]; buildPhase = '' tree-sitter generate - make + cc src/parser.c -shared -o $out ''; - installPhase = - if system == "x86_64-darwin" || system == "aarch64-darwin" then '' - cp libtree-sitter-smithyql.dylib $out - '' else '' - cp libtree-sitter-smithyql.so $out - ''; + dontInstall = true; }; packages.tree-sitter-smithyql-all = pkgs.stdenv.mkDerivation { name = "tree-sitter-smithyql-all"; diff --git a/modules/treesitter/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib b/modules/treesitter/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib index e9e2482ff961ac63dc630f3dde591c0baf86d40f..0c4dce8f3eed2033a57c62ce67d958a64f1da618 100755 GIT binary patch delta 3089 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 N_;7cw2T!_0`8Q7bu5bVV diff --git a/modules/treesitter/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so b/modules/treesitter/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so index 87a4d8ace6619498275c67d380076e60d72dc325..9c44704bf3af4b6e6fd3c4eef9b71afc164d5aaa 100755 GIT binary patch literal 70320 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 delta 5375 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 Lj(4NucJBTk647>p diff --git a/modules/treesitter/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so b/modules/treesitter/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so index 1e26ac39e4de77b5fd81ee9dfd6bc6130a042be7..7a4b238996e830d34055e07950fd6ccb278c79b7 100755 GIT binary patch delta 6171 zcmai23vg4{nLbyNjg3vN-?nUw>%BG)+ngt@iux zy|QeF&K}Ko?m6H8IOqK5anIGMbJG0t()s%0`5j_0IYpaTEu3PlD7(;Jv3fpBlgwvb zIA+T{xJIiTym0A-%sEM`%uVl<5|ZSkoyLhRJNkBZbSfKd8*Q6}J>(y=N1{VvpFP;@ z-P}BOqIF|<;E65aPSe{%BClj-V z-ibR!BXQT+uIk@U+%b)=c1_%~%2O}UY;NnOKIov{C{O;YRQxJoz)N^m%#m zo>sC(pO?QhNey`wk94gP;^ye&tUPrKqlXWhJb8T4M~+q+ktauVOL?+0kx0m2TCdh` zxnQyN#OB_sAX#ASlfQ98e(F8Cl-GRJ@rL6y$A^wYw_~>3@mjazjc&((zA|8wEt6^> zuJV%VJ@fX!nNCw;e-3++&$$tA*>Z{%K-lGTVGuVjbD*vomg(O-N9O!>rNu1&fou^o zJP)e78oiTWY`zQ~9>B|pnbt$i_cN4RP%K5Mp`ccN9y+cGEuQkz z?ey7#5~-F>6xgJ1(~AXmDMtT>d=I4;+9eBZE_4`v^AY(A8>Ju8Ullr}v-BziN9Ydn zCaN#88~%8g4iz;@uhSQb?9vPLkI0AUe~`CRQL$Z;sR#MnG>RN86jv8leuR;pzsj3F zH7PuT;wsDhT^@lpZLVt%EXKg2#^?#EDyftHns$}c=5Bzd>z{aLX9|(Ue@;)8G)R9# ze^;_T`zL=$%Hk3FRf$bP0L*Ft%;haFvT!i~y{N5NR1>X><}=&a^)G4M+z|WD?-Pmm z2Y0xCUFw?gVJV|J^9k1ZOGr8NSWDo4!Tcwg|J*YE8uR7MdzbN-nU|UGOYwer>KW#F zrNmofDM3JLCfiyaNiQ;p0QF#n5Xd;#-$%wN;_ z7)BP6r|!Y+3@^U;<&?pQJoPT~yk_IiEaU%$d7j63G{uj~Q{QEt-vaT^Eb_OS(MG2H z^s_8;vCOH;)a8(;ZPO_Z=u8g_tI1JTR{JTgJGuU+53sJ1ljD}B9%M;2OWyr}!evdX zz6XW)oe$~7vZ~6z;4+U{vzRG^9v@B-@Q&HuvupOz%`)quov5BiuRNFwD9_;N!d!q< z4dUy$RLq=}OE_pnya*+IVQ%DlI!ijabnka4@!=8w?eECDw(`?vh~mZYizaSmq8XF? zbOx$%!8RqV`7O4waOo14YPj?jE>&~sESENMX#%Cxs(yuTtSxE$TlP}P(tWBF$M__n z6u$t$K9nt@*6C@=<` z2d)6Kz?;AVkOAAh@Mp#Iv+NgG0QUYik$4GM0IcsP5^cbv?$5^X5#1ug>5QhCLH=Way|`K6vrGUZp=3)iVtX_4k*NYLvw<~qs1QHO;tlZ-3s z5^p&py%tSw}tTN$5kf^6>1DUJL1?U7+lC4PwUJCSH<$5eA8%&j(J&KlB$;14J+gZ>oU0zYw4qEdoG`8 zDX)^zN}bhprVXIzz3NhIE|aQYSR7=nTIa5Rt9l)cS6gVd+Du=qk!h^Pir%)+;hJ)4 ztI3n<=%X47-K}|m+G_KpT>3$cMOs5;wdLq(o9ZPQIw3f8scs0dg$~y?#VXNiE8qnB zfFnQ%I0>8qz5;v`_%<*D{0w*t_%-l8@JApEcLFm|1vr3qU^nmxa1`(ZVc;Y%37i9- z1-@Yrw5o3RsyxhGxoD!pbrz|NPS%x64J6ld`Q;^LdwuaD&*d7{*-$2oVx6#vDv>G7 z>Ix`Bo-L}8mx%Sq%Y+^ITG31w>KpR!&*w{-^iF-@pOKbZD&PU*L;mMHmsO>SRgg=f zR@JRnb&a^n=81e*8AOq&p>qx8F}(~XDRl_G5T%O@jDe*|zGWGoCN{yRQEWkO5?hg{ z!6&zu)K3$iKs{Z25_vXSl|+SVV_noR3gd%%m)h~fJ`*lHS=}T$@yrn2$TJa8Nz^Zz znZyp%)5T6|UthRt7s}b96yeOL7uOfWOnS%mfHw&%@>G{hdS@P1?Kw0ROT23Aez2KX z0FtO%B3nAx<-;_JgV5!^tHF(lNAw}2B6kQvEuP5^9EM4{IyXx@a71Mlv-1vX7x((6#u#$eQEYxz8-T6qF` zt6^ynpM!PAqMboJ$!*Y&8!ZkjG2NR%OoCmUC$L{&ttE1G5mRB4MM|el$PIL`>6=v! zc+SFRsur6?Gq$iDK9;6cB8#N#I_k33n@b^J@JXzl#@e%#-m;bPg+xuIbkKNXxSiHrz=|jJu_1~ z!i6|Rx!WyLFFCfKlRD`7c1!M6{Tr08cbs0O+uQd@SIE_Fk)9)W`$e)Ea!7I(8u1lO zxdscJH<++xZYMPTRLwkcZrxv%&R$$e^szXoNCgD%R1kw^UgYr*v6M_q(=d@Vf{UIgGr>v z0p@4*4qepVYvL)D&leZ_SPLIElGeWXGAe41biuGH7UGi1qeIOap+Cg;bl#~GPE9QS zS?6bU{-nm_i%&vMX_7tyogdR^QKIusn?@ufSCiy*{iv?L z4gCG4xCcB>O>A$DuBktIb-}3>{9&D+UBN#NUcw5<*sD1}RZX8)`8-jwODFWlW!;au zn1nw6EPF{c$Q3y&3|-sBEaZ4m$8sE&$+&_|H; zbywvJ#Qg3gqdkr496ccFTbA=h;3d2VlaWYDD^Ag>Gr6-dbX?%^TgjGRo*d31e!ZweHMwEbWOa$G-wq`YV=#W=ypzc(U0;b^~a&>z}w8xme$7{v&D zE773h2@Hi`r6}GZWiT+*kH)1cT%7x}>H+GrCL_z4C>;+$Tlp+2`8bt#m)sr6@vm%3X>KDUZ2BUd)`* zb;$XUYxmAh&^sPFsC4)07QJ2jKpoiKnY7)}x2MC^r|jwJ+24IYIpFH(>xM^en+A>R z>XpGD0*lCmqi87__W6{EKgz*~1pU#+#vcy|W#@t23Jn>H=mq1Na_7>2e}xV6hP8xe zG>qqTsk27HA5|__JMPk_UG3!TFwu`(58~e`sl$RdSVf1$%%8~k|7{2>SxwLB$M$n{ zsH4u@0S^C)ElRKG(kt}UjyiI7nhKdn+PZHRYb+$`xav>j})5wSDdZ)#e z!GE?aNh=OFF#;Km0bFsklsr6=&oxxhX^~EntE*j_pwq}N&~@ZrBdNPx`g?LA|2~~Y z{u8>6{O2U~Sfn|s=&@8B(|zMJN=?c0;cB~9Z=*}_{YyIC(=Pprt|R|7Njo}mHNnx) zV0CI*R(+g&_29Q-@?hYZ~ZohNyvX5AI=R5bD z@0|a2{`23*{G)R8m^|*t6m=r>s}*a+GEpnCgylp{{<8Qa-4ma5qRW-wU9MZ+6Hh#r zFei0mZmLNJq_k0!VeG~p-`;_~efymKzJY;#ea`;)mj>hN@R4zKOHqpzc_!@Fw#n(i(#80{mi z6`ngfyZ834?%F@x=^1MEcDGejR(0%IGdx_`yQ;I>*@2;3ot3VtwN7uP8^*ebA^LA` z?ePpBIN;mkZS_|BRv&6_YwbI;-vOhAaj?@ zE+{58@H?F4OAta4C#KFBUx~HMU9Z!zxCC>f5%cs!Vy0yw!fVh2HMuzT*F@F$pefPu zj~XEwC(aHif!W5f^YJff?tu3x&;k2tNYz>k?T=Jts*;1$VXBqa(JxJyM93&K*|AZwj_l z$Lj-ufcn5P&AwEJ7He-`-8c=B9fmFHlXL3#UZ*EgJTWh|tJVhkFeS767GzMhj`I4^ zz^xwZ0`b8My!>eeWaH$!?UVJ!zzwDkenAzfc~YgVspgR$9ttsazc&Vh8YXvgl>giC zv>&hgT}+6-LF3mk?^3Pf;4#+oymQ=n!(_AO&x-a>WA#D5HoE_-|3Rv2F5ji+(ktXMG!Mt!WX^EQ7HZ6JE4i0xIHO#C zL_Y`hBK;lm7{z9~85tb0R0dWBV-n3mR;r)P4fW{r4g=c zB(!Qt`Z3j;OXO43Z7xo3Mr7R|xcFz%A^e}v&&;Lr&-9wPEa~50F8TaKip3?70E?CY zOK#P#*cnPdC#<)^p6S;ngZ) z>zX2-Xp_`8_L z^n|}Cif?0{Gwx3c^L^^X7Ut8K|Mc_F0>H0gK85*t`L98gE11+d#Bk~$G+P%pH>bj`T?EbgwAYa zX9I1^&MqEgyO!-d1oOexHfN7I@g4T?L&b0WoF2?}#=Z3!cF_CB(!iD^77}eE z@8EPE{WuUfgR2c#1Kb9fu7E?iUjXKSMZknJ=m2Vg9Y8N|6nGq%24;bIU@Q6)=wlbI zv%mtd^*`tjcn6681Y-fUp9Dq%JD~Ie$AL4zEHDoUOx+B4fKlKKFb9~h8qR(%@Hj9F z2qe)1aQz$y&H@X74JEM^7zNG%v%oxHLiKupt&3Ky0LmF)9uQci8Snt3z!2r;|0{V7 zk{bEoO{UZW_f34R!G@m4To;jcMwBfLyftCJRIaimA4>y$WY5Y_ST%;amYPe_D+Pr{ z+yf+SEG#2)VOAREh0&KLAQi3_`mkUnoh!6rHu?)zc!I@n3mUOoXtdBaA{86kp;3h3 z`)Z`kr5m=TVu`j5wrE>MCq&A^XundT*@`}2da)?chzLm;_Ojw2DWsxJ5`k54MGnq9 zZLnvj%jmpuqTqSGD2sZF3Z#vGVz(yq0SY%3qJr+T=TfKLMmy}LR3X-0L{rK$g)FQf%W>^JyQOXKlMn<TB^HxA|k@5If#~5^G1Ot1~45w05@E3 ztk*0XWWI1g+CrVgh-+XQL=B`7pFa|9(jbdN5k^rDJ62o=nSi89q-*q{aOzz*!D+;2RCK5Ml$ycDij{P%Jk!^LmU_;@8M{8j8O1g&_6EqWPh&gSc(FtC zaWzEFVkc~a*aaD!1sy3%&Alz6=e_X7i#EsvBoVDSqP0B~VGx~QIkEcwb_LUGj7r|s zY3o6oSaCq>H3c#?+L)ou)KkDlh0@Z^U^G6a2EhLX2qT&^jD=+oM}X8elo~l zgb^MSUM-5Ju63svl|?^ouR0)O=ucH{xrsijS}Da;{;IbVEc}+pzXAQCe+WZ=l;j4h zbWr|=WB8_cc7rwfLhu8Z-#7U;Pw#EGUS6Pz8mpY9Z8eXRtW7uK3tLPXHrb^jR4Q$( zk%{DkOs7+jx#VxOD!V1EaOYY0If?JDgS-j+o90IdU#YICB%a^m@X>UT&NNwQvdLE;@_oqUkH>C|ScGM_}RZqBppLqjh0Sb%>H{V9nf zA)8BNH

| zptYdAAMIYWVYFjtqiAQ*W`ef`XjN!+Xm3MnLW`sIpnU-CPPEUVeF^O=Xx~KpKH4d? z=h1$P#-9ggqPTLjO0*iZ>(Mr$HKN^y)`r%JHh}gav^&x6M!OH~Z_vJs_7K{)&>lnk zA==Yu&!YVb?Kfy=(D<0a_Zau}BAiRH=XhAVOK@I<9o@sTA&k9kE+abyr)8-wNXvVdNfqUXJrZ zs>1nFJRd#$zSxd<2KZV)72wo(UJffw<3H2!U;4WJD|}BL!F2W5{Kb9^n5Xdf=uLi< zt$7w|xWs=$u*gc@9kE+S{CQH$>kI#QX7Kvp9E;ogzG^3geqNvV#Au0sp`7{ojRi zkw2#jOxRrSp2Swj_1=80Fm@)sBeuS+!cGyj0WZP39FL(A=iu1ep-1q$Pqy)FD~zuQ zbDC`_-!|3QyYl@P3I9FtFY)J8kVk{2{ah3IFN`IFic3&O0ojRbe*T1M0Fkq>&jeRj z!EcZF6_A^N@O%v;if7p}oEPW02}`XL?{*>jU49Kk{@Lt&n{aJvd%s_aWjRD2fL@Z% z9HOja{~+{8!2V&!{!!?Ko|x*jG|m_M z{jhe>*We}xujlFiagVR>;QiskV@3etTx;QV5qMdS9aDb!lJ|(fa^b;mWIQsr@e@DT z*pGE9ap_+Nb+%7;u&;XrV}kuzKiAH<#aMFPR%hGvhnW*axbr1oif8gn%w&G{n&&P* zjpxyP>`4o-PRo&bk^daN9J|+2isG45iCuLW*7I^ag{$yhyaH?TYV3>E*tu)4Z`b18 ztPcCtTI|O4(--r9ZsoT&ob;0vGgx$3W z*lb+k?G;yim>JJ8yqb&sxRAeR%m%`5L1k$C&ci!aK7_BQ{LeZ4|G0Rq|L`zA2*8D$ zO-Jtee{Mc-=B*uFZ5>_P`)n^AZON`o$F`1S+8`ZWJ^dM6zAw4k2U7U6Bm5yzGSy~6 zx)Pm9Hn8mLNwoS3^zNQyI+5wXUoIJso^&$R-^|YVXJd2iDi!pKeWp0sOrcAE+Z7zf^37 z9Dr1WSA<$q9^5140I3w(G#um|Vm+O_~c z#T!h+oY;Ml&zEkvtK?wu4R;sa6W;il(2X;H_UwT)4vp2&5OA+(Fo*sT~XdIe4_FE=uFnURAFjqEw+nG2C+l62%s18=sv$ST2W zM2<-Qtkh+q{`=?QWs~P9yUO5Eku@UgMaD!nirgZyUF3kstjIx;Ln3XjheRJ1c|_!h z$YUapi##QAROD%qVqRz-lvzYOgg~C3d}NFunSS)wqTA_GGs^%xXZc7i zF!E9(h+Z+77mFSdxyb5bmuXGbUL^KGDeMog=DHa=COWSTK8AV0;3zSI#>75T^!JJ` zWm37|VUfc*;~;6MM)3I}OGV0ZBa%cGk4d4n?hz?uhQ!(amWXcsUdfs9NO|5-|1Hrdg`?q)$NJCcB*dM-PO0d)5uKPSav4UeI4Ch6O=e?>0~Ow0dm!o%20JjR|n3S z7L@XGbea=tg3b zaBE*5RkwC`b|$;*YI!X#rnbKUCZ5}NKHB+jWu1iD`D^EsObdT{{tYgOycbL zt)G>(u=857x?N9sDe+uC_igJJm>O`wHX9#f1&5V(ecS$RydD3a!$} zi9aOqR(>bwjB9)UEc`KC@Uzp-5BvP1SB!`2Z*?p0f*bDvHa;TH$H?o9zaOzYej8sV z@nsS}Xo-OjA1;4?2aM;Qjko*z(0TTTzr@@7X6v?j9)eG>fBSqL&iUc~{4`hQY~!u` zx)WcxlbrQJzHOXu#A!r)Z2b|L2@$`l3*${z8%^{WE*YySK>n4Dcc!0YH8JcM9D6Xu NBJq482#S9Y`Y--9JOdchaF$&pxNJd&iU@W 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 bub&(t+q+}V+tI>zkxIo4xk04aj^Y0WP*zZs literal 18304 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 - val scanned = TreeSitterAPI.make("smithyql").parse(input).rootNode.get - - val errors = scanned.fold[List[Node]](_ :: _.flatten.toList).find(_.isError) - - assert(errors.isEmpty) + val src = treeSitterWrap(input) + val scanned = TreeSitterAPI.make("smithyql").parse(src).rootNode.get + + val errors = scanned + .fold[List[Node]](_ :: _.flatten.toList) + .filter(_.isError) + .map { node => + s"${node.source} (${node.startByte} to ${node.endByte}, ${node.selfAndParents.map(_.tpe).mkString(" -> ")})" + } + .mkString("\n") + + assert(errors.isEmpty) || failure("error in file: " + testCase.base) || failure(src) } } @@ -176,11 +185,12 @@ trait ParserSuite extends SimpleIOSuite { outputExtension: String, ) { + private val inputPath = base / "input.smithyql-test" private val outputPath = base / s"output$outputExtension" def readInput( trimWhitespace: Boolean - ): IO[String] = readText(base / "input.smithyql-test").map( + ): IO[String] = readText(inputPath).map( if (trimWhitespace) _.strip else diff --git a/modules/parser/src/test/scala/playground/smithyql/parser/generative/ListParserTests.scala b/modules/parser/src/test/scala/playground/smithyql/parser/generative/ListParserTests.scala index 8458527b..f70cf43f 100644 --- a/modules/parser/src/test/scala/playground/smithyql/parser/generative/ListParserTests.scala +++ b/modules/parser/src/test/scala/playground/smithyql/parser/generative/ListParserTests.scala @@ -7,5 +7,11 @@ import playground.smithyql.parser.ParserSuite import playground.smithyql.parser.SourceParser object ListParserTests extends ParserSuite { + + override def treeSitterWrap(fileSource: String): String = + s"""FakeCall { + | fakeField = $fileSource + |}""".stripMargin + loadParserTests[Listed]("listed", trimWhitespace = true) } diff --git a/modules/parser/src/test/scala/playground/smithyql/parser/generative/StructParserTests.scala b/modules/parser/src/test/scala/playground/smithyql/parser/generative/StructParserTests.scala index 1eebed2f..9aba2774 100644 --- a/modules/parser/src/test/scala/playground/smithyql/parser/generative/StructParserTests.scala +++ b/modules/parser/src/test/scala/playground/smithyql/parser/generative/StructParserTests.scala @@ -6,5 +6,7 @@ import playground.smithyql.parser.Codecs.given import playground.smithyql.parser.ParserSuite object StructParserTests extends ParserSuite { + + override def treeSitterWrap(fileSource: String): String = s"FakeCall $fileSource" loadParserTests[Struct]("struct", trimWhitespace = true) } diff --git a/smithy-build.json b/smithy-build.json index 2de3872b..f39d0dee 100644 --- a/smithy-build.json +++ b/smithy-build.json @@ -1,5 +1,5 @@ { - "sources": ["modules/core/src/test/smithy"], + "sources": ["modules/examples/src/main/smithy"], "mavenDependencies": [ "com.disneystreaming.alloy:alloy-core:0.3.14", "com.disneystreaming.smithy4s:smithy4s-protocol:0.18.25", diff --git a/tree-sitter-smithyql/grammar.js b/tree-sitter-smithyql/grammar.js index f8162fc6..18889a00 100644 --- a/tree-sitter-smithyql/grammar.js +++ b/tree-sitter-smithyql/grammar.js @@ -60,7 +60,11 @@ module.exports = grammar({ _bindings: ($) => comma_separated_trailing($.binding), binding: ($) => - seq(field("key", $.identifier), "=", field("value", $._input_node)), + seq( + field("key", $.identifier), + choice("=", ":"), + field("value", $._input_node) + ), _list_fields: ($) => comma_separated_trailing($._input_node), From c249e1a117e55c6362c55ed7f9defb27e96f9c2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Sat, 9 Nov 2024 20:18:14 +0100 Subject: [PATCH 062/105] Make e2e tests detect snapshot issues --- build.sbt | 13 +++++-------- .../src/test/scala/playground/e2e/E2ETests.scala | 7 +++---- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/build.sbt b/build.sbt index d04977fb..e3aebfb3 100644 --- a/build.sbt +++ b/build.sbt @@ -232,15 +232,12 @@ lazy val e2e = module("e2e") buildInfoKeys ++= Seq[BuildInfoKey.Entry[_]]( // do you know how to simplify this? let me know please! Def - .task((lsp / Compile / fullClasspath).value.map(_.data).map(_.toString)) + .task { + s"""${(lsp / organization).value}::${(lsp / moduleName).value}:${(lsp / version).value}""" + } + .dependsOn(lsp / publishLocal) .taskValue - .named("lspClassPath"), - Def - .task( - (lsp / Compile / mainClass).value.getOrElse(sys.error("didn't find main class in lsp")) - ) - .taskValue - .named("lspMainClass"), + .named("lspArtifact") ), publish / skip := true, ) diff --git a/modules/e2e/src/test/scala/playground/e2e/E2ETests.scala b/modules/e2e/src/test/scala/playground/e2e/E2ETests.scala index e4440b0a..9592492d 100644 --- a/modules/e2e/src/test/scala/playground/e2e/E2ETests.scala +++ b/modules/e2e/src/test/scala/playground/e2e/E2ETests.scala @@ -74,10 +74,9 @@ object E2ETests extends SimpleIOSuite { val builder = new ProcessBuilder( - "java", - "-cp", - BuildInfo.lspClassPath.mkString(":"), - BuildInfo.lspMainClass, + "cs", + "launch", + BuildInfo.lspArtifact, ) // Watch process stderr in test runner .redirectError(Redirect.INHERIT) From 12101f6034cc8d442134f98423cc6fed49989bb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Sun, 10 Nov 2024 00:27:26 +0100 Subject: [PATCH 063/105] Move treesitter sources to another module --- build.sbt | 11 +++++++- .../playground/smithyql/RangeIndex.scala | 2 ++ .../playground/parsergen/ParserGen.scala | 4 ++- .../playground/smithyql/WithSource.scala | 4 +-- .../libtree-sitter-smithyql.dylib | Bin .../libtree-sitter-smithyql.dylib | Bin .../linux-aarch64/libtree-sitter-smithyql.so | Bin .../linux-x86-64/libtree-sitter-smithyql.so | Bin .../playground/generated/nodes/Binding.scala | 0 .../playground/generated/nodes/Boolean_.scala | 0 .../playground/generated/nodes/Comment.scala | 0 .../generated/nodes/Identifier.scala | 0 .../generated/nodes/InputNode.scala | 0 .../playground/generated/nodes/List_.scala | 0 .../playground/generated/nodes/Null_.scala | 0 .../playground/generated/nodes/Number.scala | 0 .../generated/nodes/OperationName.scala | 0 .../playground/generated/nodes/Prelude.scala | 0 .../generated/nodes/QualifiedIdentifier.scala | 0 .../playground/generated/nodes/RunQuery.scala | 0 .../generated/nodes/SourceFile.scala | 0 .../playground/generated/nodes/String_.scala | 0 .../playground/generated/nodes/Struct.scala | 0 .../generated/nodes/TopLevelStatement.scala | 0 .../generated/nodes/UseClause.scala | 0 .../generated/nodes/Whitespace.scala | 0 .../parser/ParserTreeSitterDemo.scala | 0 .../smithyql/parser/demo.worksheet.sc | 0 update-libs.sh | 24 +++++++++--------- 29 files changed, 29 insertions(+), 16 deletions(-) rename modules/{parser => treesitter}/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib (100%) rename modules/{parser => treesitter}/src/main/resources/darwin-x86-64/libtree-sitter-smithyql.dylib (100%) rename modules/{parser => treesitter}/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so (100%) rename modules/{parser => treesitter}/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so (100%) rename modules/{parser => treesitter}/src/main/scala/playground/generated/nodes/Binding.scala (100%) rename modules/{parser => treesitter}/src/main/scala/playground/generated/nodes/Boolean_.scala (100%) rename modules/{parser => treesitter}/src/main/scala/playground/generated/nodes/Comment.scala (100%) rename modules/{parser => treesitter}/src/main/scala/playground/generated/nodes/Identifier.scala (100%) rename modules/{parser => treesitter}/src/main/scala/playground/generated/nodes/InputNode.scala (100%) rename modules/{parser => treesitter}/src/main/scala/playground/generated/nodes/List_.scala (100%) rename modules/{parser => treesitter}/src/main/scala/playground/generated/nodes/Null_.scala (100%) rename modules/{parser => treesitter}/src/main/scala/playground/generated/nodes/Number.scala (100%) rename modules/{parser => treesitter}/src/main/scala/playground/generated/nodes/OperationName.scala (100%) rename modules/{parser => treesitter}/src/main/scala/playground/generated/nodes/Prelude.scala (100%) rename modules/{parser => treesitter}/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala (100%) rename modules/{parser => treesitter}/src/main/scala/playground/generated/nodes/RunQuery.scala (100%) rename modules/{parser => treesitter}/src/main/scala/playground/generated/nodes/SourceFile.scala (100%) rename modules/{parser => treesitter}/src/main/scala/playground/generated/nodes/String_.scala (100%) rename modules/{parser => treesitter}/src/main/scala/playground/generated/nodes/Struct.scala (100%) rename modules/{parser => treesitter}/src/main/scala/playground/generated/nodes/TopLevelStatement.scala (100%) rename modules/{parser => treesitter}/src/main/scala/playground/generated/nodes/UseClause.scala (100%) rename modules/{parser => treesitter}/src/main/scala/playground/generated/nodes/Whitespace.scala (100%) rename modules/{parser => treesitter}/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala (100%) rename modules/{parser => treesitter}/src/main/scala/playground/smithyql/parser/demo.worksheet.sc (100%) diff --git a/build.sbt b/build.sbt index 6181e0b6..2843e62f 100644 --- a/build.sbt +++ b/build.sbt @@ -117,12 +117,19 @@ lazy val parser = module("parser") "io.circe" %% "circe-generic" % "0.14.10" % Test, "io.circe" %% "circe-parser" % "0.14.10" % Test, "co.fs2" %% "fs2-io" % "3.11.0" % Test, - "org.polyvariant.treesitter4s" %% "core" % "0.3-460753c-SNAPSHOT", ) ) .dependsOn( ast % "test->test;compile->compile", source % "test->test;compile->compile", + treesitter % "test->compile", + ) + +lazy val treesitter = module("treesitter") + .settings( + libraryDependencies ++= Seq( + "org.polyvariant.treesitter4s" %% "core" % "0.3-460753c-SNAPSHOT" + ) ) lazy val parsergen = module("parser-gen") @@ -191,6 +198,7 @@ lazy val core = module("core") examples % "test->compile", pluginCore, ast, + treesitter, source % "test->test;compile->compile", parser % "test->compile;test->test", formatter, @@ -269,4 +277,5 @@ lazy val root = project pluginCore, pluginSample, e2e, + treesitter, ) diff --git a/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala b/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala index e651290c..e35d9c2e 100644 --- a/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala +++ b/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala @@ -12,6 +12,8 @@ trait RangeIndex { object RangeIndex { + // def build(parsed: playground.generated.nodes.SourceFile) = ??? + def build( sf: SourceFile[WithSource] ): RangeIndex = diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index e38e49c0..d01aef41 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -231,7 +231,9 @@ def renderClass(tpe: NodeType) = { .get .value - val base = Paths.get(s"modules/parser/src/main/scala/playground/generated/nodes") + val base = Paths.get(s"modules/treesitter/src/main/scala/playground/generated/nodes") + + Files.createDirectories(base) Files.walk(base).iterator().asScala.filter(Files.isRegularFile(_)).foreach(Files.delete) diff --git a/modules/source/src/main/scala/playground/smithyql/WithSource.scala b/modules/source/src/main/scala/playground/smithyql/WithSource.scala index 8004d272..a95e9768 100644 --- a/modules/source/src/main/scala/playground/smithyql/WithSource.scala +++ b/modules/source/src/main/scala/playground/smithyql/WithSource.scala @@ -64,8 +64,8 @@ final case class SourceRange( // Assuming this range corresponds to a bracket/brace/quote etc., // shrink it by one character on each side. def shrink1: SourceRange = copy( - start = start.copy(index = start.index + 1), - end = end.copy(index = end.index - 1), + start = start.moveRight(1), + end = end.moveLeft(1), ) def render: String = s"${start.index}-${end.index}" diff --git a/modules/parser/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib b/modules/treesitter/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib similarity index 100% rename from modules/parser/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib rename to modules/treesitter/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib diff --git a/modules/parser/src/main/resources/darwin-x86-64/libtree-sitter-smithyql.dylib b/modules/treesitter/src/main/resources/darwin-x86-64/libtree-sitter-smithyql.dylib similarity index 100% rename from modules/parser/src/main/resources/darwin-x86-64/libtree-sitter-smithyql.dylib rename to modules/treesitter/src/main/resources/darwin-x86-64/libtree-sitter-smithyql.dylib diff --git a/modules/parser/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so b/modules/treesitter/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so similarity index 100% rename from modules/parser/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so rename to modules/treesitter/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so diff --git a/modules/parser/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so b/modules/treesitter/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so similarity index 100% rename from modules/parser/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so rename to modules/treesitter/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Binding.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Binding.scala similarity index 100% rename from modules/parser/src/main/scala/playground/generated/nodes/Binding.scala rename to modules/treesitter/src/main/scala/playground/generated/nodes/Binding.scala diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Boolean_.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Boolean_.scala similarity index 100% rename from modules/parser/src/main/scala/playground/generated/nodes/Boolean_.scala rename to modules/treesitter/src/main/scala/playground/generated/nodes/Boolean_.scala diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Comment.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Comment.scala similarity index 100% rename from modules/parser/src/main/scala/playground/generated/nodes/Comment.scala rename to modules/treesitter/src/main/scala/playground/generated/nodes/Comment.scala diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Identifier.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Identifier.scala similarity index 100% rename from modules/parser/src/main/scala/playground/generated/nodes/Identifier.scala rename to modules/treesitter/src/main/scala/playground/generated/nodes/Identifier.scala diff --git a/modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala similarity index 100% rename from modules/parser/src/main/scala/playground/generated/nodes/InputNode.scala rename to modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala diff --git a/modules/parser/src/main/scala/playground/generated/nodes/List_.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/List_.scala similarity index 100% rename from modules/parser/src/main/scala/playground/generated/nodes/List_.scala rename to modules/treesitter/src/main/scala/playground/generated/nodes/List_.scala diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Null_.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Null_.scala similarity index 100% rename from modules/parser/src/main/scala/playground/generated/nodes/Null_.scala rename to modules/treesitter/src/main/scala/playground/generated/nodes/Null_.scala diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Number.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Number.scala similarity index 100% rename from modules/parser/src/main/scala/playground/generated/nodes/Number.scala rename to modules/treesitter/src/main/scala/playground/generated/nodes/Number.scala diff --git a/modules/parser/src/main/scala/playground/generated/nodes/OperationName.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/OperationName.scala similarity index 100% rename from modules/parser/src/main/scala/playground/generated/nodes/OperationName.scala rename to modules/treesitter/src/main/scala/playground/generated/nodes/OperationName.scala diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Prelude.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Prelude.scala similarity index 100% rename from modules/parser/src/main/scala/playground/generated/nodes/Prelude.scala rename to modules/treesitter/src/main/scala/playground/generated/nodes/Prelude.scala diff --git a/modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala similarity index 100% rename from modules/parser/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala rename to modules/treesitter/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala diff --git a/modules/parser/src/main/scala/playground/generated/nodes/RunQuery.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/RunQuery.scala similarity index 100% rename from modules/parser/src/main/scala/playground/generated/nodes/RunQuery.scala rename to modules/treesitter/src/main/scala/playground/generated/nodes/RunQuery.scala diff --git a/modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/SourceFile.scala similarity index 100% rename from modules/parser/src/main/scala/playground/generated/nodes/SourceFile.scala rename to modules/treesitter/src/main/scala/playground/generated/nodes/SourceFile.scala diff --git a/modules/parser/src/main/scala/playground/generated/nodes/String_.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/String_.scala similarity index 100% rename from modules/parser/src/main/scala/playground/generated/nodes/String_.scala rename to modules/treesitter/src/main/scala/playground/generated/nodes/String_.scala diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Struct.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Struct.scala similarity index 100% rename from modules/parser/src/main/scala/playground/generated/nodes/Struct.scala rename to modules/treesitter/src/main/scala/playground/generated/nodes/Struct.scala diff --git a/modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/TopLevelStatement.scala similarity index 100% rename from modules/parser/src/main/scala/playground/generated/nodes/TopLevelStatement.scala rename to modules/treesitter/src/main/scala/playground/generated/nodes/TopLevelStatement.scala diff --git a/modules/parser/src/main/scala/playground/generated/nodes/UseClause.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/UseClause.scala similarity index 100% rename from modules/parser/src/main/scala/playground/generated/nodes/UseClause.scala rename to modules/treesitter/src/main/scala/playground/generated/nodes/UseClause.scala diff --git a/modules/parser/src/main/scala/playground/generated/nodes/Whitespace.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Whitespace.scala similarity index 100% rename from modules/parser/src/main/scala/playground/generated/nodes/Whitespace.scala rename to modules/treesitter/src/main/scala/playground/generated/nodes/Whitespace.scala diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala b/modules/treesitter/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala similarity index 100% rename from modules/parser/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala rename to modules/treesitter/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala diff --git a/modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc b/modules/treesitter/src/main/scala/playground/smithyql/parser/demo.worksheet.sc similarity index 100% rename from modules/parser/src/main/scala/playground/smithyql/parser/demo.worksheet.sc rename to modules/treesitter/src/main/scala/playground/smithyql/parser/demo.worksheet.sc diff --git a/update-libs.sh b/update-libs.sh index f9c0fe75..8c9c3566 100755 --- a/update-libs.sh +++ b/update-libs.sh @@ -2,22 +2,22 @@ set -e -mkdir -p modules/parser/src/main/resources/darwin-aarch64 +mkdir -p modules/treesitter/src/main/resources/darwin-aarch64 BINARY_PATH=$(nix build .#packages.aarch64-darwin.tree-sitter-smithyql --no-link --print-out-paths --print-build-logs) -cp $BINARY_PATH modules/parser/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib -chmod 755 modules/parser/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib +cp $BINARY_PATH modules/treesitter/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib +chmod 755 modules/treesitter/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib -mkdir -p modules/parser/src/main/resources/darwin-x86-64 +mkdir -p modules/treesitter/src/main/resources/darwin-x86-64 BINARY_PATH=$(nix build .#packages.x86_64-darwin.tree-sitter-smithyql --no-link --print-out-paths --print-build-logs) -cp $BINARY_PATH modules/parser/src/main/resources/darwin-x86-64/libtree-sitter-smithyql.dylib -chmod 755 modules/parser/src/main/resources/darwin-x86-64/libtree-sitter-smithyql.dylib +cp $BINARY_PATH modules/treesitter/src/main/resources/darwin-x86-64/libtree-sitter-smithyql.dylib +chmod 755 modules/treesitter/src/main/resources/darwin-x86-64/libtree-sitter-smithyql.dylib -mkdir -p modules/parser/src/main/resources/linux-aarch64 +mkdir -p modules/treesitter/src/main/resources/linux-aarch64 BINARY_PATH=$(nix build .#packages.aarch64-linux.tree-sitter-smithyql --no-link --print-out-paths --print-build-logs) -cp $BINARY_PATH modules/parser/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so -chmod 755 modules/parser/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so +cp $BINARY_PATH modules/treesitter/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so +chmod 755 modules/treesitter/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so -mkdir -p modules/parser/src/main/resources/linux-x86-64 +mkdir -p modules/treesitter/src/main/resources/linux-x86-64 BINARY_PATH=$(nix build .#packages.x86_64-linux.tree-sitter-smithyql --no-link --print-out-paths --print-build-logs) -cp $BINARY_PATH modules/parser/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so -chmod 755 modules/parser/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so +cp $BINARY_PATH modules/treesitter/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so +chmod 755 modules/treesitter/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so From 75e5b2afb0245f47f5ed378c4da706fce004129e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Sun, 10 Nov 2024 01:31:20 +0100 Subject: [PATCH 064/105] Implement RangeIndex --- .../test/scala/playground/Assertions.scala | 2 +- .../playground/smithyql/RangeIndex.scala | 174 +++++++++++++----- .../playground/smithyql/AtPositionTests.scala | 11 +- .../language/CompletionProvider.scala | 14 +- .../parser/v3/TreeSitterParserTests.scala | 0 5 files changed, 148 insertions(+), 53 deletions(-) rename modules/{parser => treesitter}/src/test/scala/playground/smithyql/parser/v3/TreeSitterParserTests.scala (100%) diff --git a/modules/ast/src/test/scala/playground/Assertions.scala b/modules/ast/src/test/scala/playground/Assertions.scala index ea0f7ddd..ac2bd7b4 100644 --- a/modules/ast/src/test/scala/playground/Assertions.scala +++ b/modules/ast/src/test/scala/playground/Assertions.scala @@ -23,7 +23,7 @@ object Assertions extends Expectations.Helpers { val stringWithResets = d.show()(conf).linesWithSeparators.map(Console.RESET + _).mkString failure( - s"Diff failed:\n${Console.RESET}(${conf.left("expected")}, ${conf.right("actual")})\n\n" + stringWithResets + s"Diff failed:\n${Console.RESET}(${conf.left("actual")}, ${conf.right("expected")})\n\n" + stringWithResets ) } diff --git a/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala b/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala index e35d9c2e..72cd45d0 100644 --- a/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala +++ b/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala @@ -1,73 +1,151 @@ package playground.smithyql +import cats.kernel.Monoid import cats.syntax.all.* +import org.polyvariant.treesitter4s.Node +import util.chaining.* trait RangeIndex { def findAtPosition( pos: Position - ): NodeContext + ): Option[NodeContext] } object RangeIndex { - // def build(parsed: playground.generated.nodes.SourceFile) = ??? + given Monoid[RangeIndex] = Monoid.instance( + _ => None, + (a, b) => pos => a.findAtPosition(pos).orElse(b.findAtPosition(pos)), + ) - def build( - sf: SourceFile[WithSource] - ): RangeIndex = - new RangeIndex { - - private val allRanges: List[ContextRange] = { - val path = NodeContext.EmptyPath - - val preludeRanges: List[ContextRange] = sf - .prelude - .useClauses - .toNel - .foldMap { useClauses => - val newBase = path.inPrelude - - ContextRange(useClauses.map(_.range).reduceLeft(_.fakeUnion(_)), newBase) :: - sf.prelude - .useClauses - .mapWithIndex { - ( - uc, - i, - ) => - findInUseClause(uc, newBase.inUseClause(i)) - } - .combineAll + def build(parsed: playground.generated.nodes.SourceFile): RangeIndex = fromRanges { + + extension (node: Node) { + def range: SourceRange = SourceRange(Position(node.startByte), Position(node.endByte)) + } + + val root = NodeContext.EmptyPath + + val preludeRanges = parsed + .prelude + .toList + .flatMap { prelude => + val newBase = root.inPrelude + ContextRange(prelude.range, newBase) :: + prelude.use_clause.zipWithIndex.map { (useClause, i) => + ContextRange(useClause.range, newBase.inUseClause(i)) } + } - val queryRanges = sf.queries(WithSource.unwrap).zipWithIndex.flatMap { case (rq, index) => - findInQuery(rq.query, path.inQuery(index)) - } + def inputNodeRanges(node: playground.generated.nodes.InputNode, base: NodeContext) + : List[ContextRange] = + node match { + case playground.generated.nodes.String_(string) => + ContextRange(string.range.shrink1, base.inQuotes) :: Nil + + case playground.generated.nodes.List_(list) => + ContextRange(list.range.shrink1, base.inCollectionEntry(None)) :: + list.list_fields.zipWithIndex.flatMap { (inputNode, i) => + ContextRange(inputNode.range, base.inCollectionEntry(Some(i))) :: + inputNodeRanges(inputNode, base.inCollectionEntry(Some(i))) + } + + case playground.generated.nodes.Struct(struct) => + ContextRange(struct.range, base) :: + ContextRange(struct.range.shrink1, base.inStructBody) :: + struct.bindings.toList.flatMap { binding => + (binding.key, binding.value).tupled.toList.flatMap { (key, value) => + ContextRange( + value.range, + base + .inStructBody + .inStructValue(key.source), + ) :: inputNodeRanges(value, base.inStructBody.inStructValue(key.source)) + } + } + + case _ => Nil + } - preludeRanges ++ queryRanges + val queryRanges = parsed.statements.zipWithIndex.flatMap { (stat, statementIndex) => + stat.run_query.toList.flatMap { runQuery => + ContextRange(runQuery.range, root.inQuery(statementIndex)) :: runQuery + .operation_name + .toList + .flatMap { operationName => + ContextRange(operationName.range, root.inQuery(statementIndex).inOperationName) :: Nil + } ++ + runQuery.input.toList.flatMap { input => + inputNodeRanges( + playground.generated.nodes.InputNode(input).toOption.get /* todo */, + root.inQuery(statementIndex).inOperationInput, + ) + + } } - // Console - // .err - // .println( - // s"""Found ${allRanges.size} ranges for query ${q.operationName.value.text}: - // |${allRanges - // .map(_.render) - // .mkString("\n")}""".stripMargin - // ) - - def findAtPosition( - pos: Position - ): NodeContext = allRanges + } + + preludeRanges ++ queryRanges + } + + def build( + sf: SourceFile[WithSource] + ): RangeIndex = fromRanges { + val path = NodeContext.EmptyPath + + val preludeRanges: List[ContextRange] = sf + .prelude + .useClauses + .toNel + .foldMap { useClauses => + val newBase = path.inPrelude + + ContextRange(useClauses.map(_.range).reduceLeft(_.fakeUnion(_)), newBase) :: + sf.prelude + .useClauses + .mapWithIndex { + ( + uc, + i, + ) => + findInUseClause(uc, newBase.inUseClause(i)) + } + .combineAll + } + + val queryRanges = sf.queries(WithSource.unwrap).zipWithIndex.flatMap { case (rq, index) => + findInQuery(rq.query, path.inQuery(index)) + } + + preludeRanges ++ queryRanges + + // Console + // .err + // .println( + // s"""Found ${allRanges.size} ranges for query ${q.operationName.value.text}: + // |${allRanges + // .map(_.render) + // .mkString("\n")}""".stripMargin + // ) + } + + def fromRanges(allRanges: List[ContextRange]): RangeIndex = + pos => + allRanges .filter(_.range.contains(pos)) + .tap { ranges => + println() + println("=======") + println(s"all ranges: ${allRanges.map(_.render).mkString(", ")}") + println(s"ranges for position ${pos.index}: ${ranges.map(_.render).mkString(", ")}") + println("=======") + println() + } .maxByOption(_.ctx.length) .map(_.ctx) - // By default, we're on root level - .getOrElse(NodeContext.EmptyPath) - - } private def findInQuery( q: WithSource[Query[WithSource]], diff --git a/modules/core/src/test/scala/playground/smithyql/AtPositionTests.scala b/modules/core/src/test/scala/playground/smithyql/AtPositionTests.scala index 1c335c7d..9e06eeea 100644 --- a/modules/core/src/test/scala/playground/smithyql/AtPositionTests.scala +++ b/modules/core/src/test/scala/playground/smithyql/AtPositionTests.scala @@ -1,5 +1,7 @@ package playground.smithyql +import cats.syntax.all.* +import org.polyvariant.treesitter4s.TreeSitterAPI import playground.Assertions.* import playground.Diffs.given import playground.smithyql.parser.SourceParser @@ -24,6 +26,12 @@ object AtPositionTests extends FunSuite { text: String ): NodeContext = { val (extracted, position) = extractCursor(text) + val parsedTs = playground + .generated + .nodes + .SourceFile + .unsafeApply(TreeSitterAPI.make("smithyql").parse(extracted).rootNode.get) + val parsed = SourceParser[SourceFile] .parse(extracted) @@ -31,8 +39,9 @@ object AtPositionTests extends FunSuite { .get RangeIndex - .build(parsed) + .build(parsedTs) .findAtPosition(position) + .getOrElse(NodeContext.EmptyPath) } // tests for before/after/between queries diff --git a/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala b/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala index 58c99f4e..0a4b934e 100644 --- a/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala +++ b/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala @@ -3,6 +3,7 @@ package playground.language import cats.Id import cats.kernel.Order.catsKernelOrderingForOrder import cats.syntax.all.* +import org.polyvariant.treesitter4s.TreeSitterAPI import playground.MultiServiceResolver import playground.ServiceIndex import playground.smithyql.NodeContext @@ -169,16 +170,22 @@ object CompletionProvider { ( doc, pos, - ) => + ) => { + val parsedTs = playground + .generated + .nodes + .SourceFile + .unsafeApply(TreeSitterAPI.make("smithyql").parse(doc).rootNode.get) + SourceParser[SourceFile].parse(doc) match { case Left(_) => // we can try to deal with this later Nil case Right(sf) => - val matchingNode = RangeIndex - .build(sf) + val matchingNode = RangeIndex.build(parsedTs) .findAtPosition(pos) + .getOrElse(NodeContext.EmptyPath) // System.err.println("matchingNode: " + matchingNode.render) @@ -208,6 +215,7 @@ object CompletionProvider { } } + } } } diff --git a/modules/parser/src/test/scala/playground/smithyql/parser/v3/TreeSitterParserTests.scala b/modules/treesitter/src/test/scala/playground/smithyql/parser/v3/TreeSitterParserTests.scala similarity index 100% rename from modules/parser/src/test/scala/playground/smithyql/parser/v3/TreeSitterParserTests.scala rename to modules/treesitter/src/test/scala/playground/smithyql/parser/v3/TreeSitterParserTests.scala From 4177ade357ec3156f833fca6409eeea81ba1b7fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Sun, 10 Nov 2024 03:08:28 +0100 Subject: [PATCH 065/105] Use tree-sitter in completions --- .../main/scala/playground/smithyql/AST.scala | 11 +- .../main/scala/playground/ASTAdapter.scala | 12 ++ .../playground/MultiServiceResolver.scala | 95 +++++++++++++ .../playground/smithyql/RangeIndex.scala | 18 +-- .../scala/playground/smithyql/tsutils.scala | 11 ++ .../language/CompletionProvider.scala | 129 +++++++++--------- 6 files changed, 198 insertions(+), 78 deletions(-) create mode 100644 modules/core/src/main/scala/playground/ASTAdapter.scala create mode 100644 modules/core/src/main/scala/playground/smithyql/tsutils.scala diff --git a/modules/ast/src/main/scala/playground/smithyql/AST.scala b/modules/ast/src/main/scala/playground/smithyql/AST.scala index a542a1c7..1895de91 100644 --- a/modules/ast/src/main/scala/playground/smithyql/AST.scala +++ b/modules/ast/src/main/scala/playground/smithyql/AST.scala @@ -4,6 +4,7 @@ import cats.Applicative import cats.Functor import cats.Id import cats.Show +import cats.arrow.FunctionK import cats.data.NonEmptyList import cats.kernel.Eq import cats.kernel.Order @@ -87,7 +88,7 @@ final case class SourceFile[F[_]]( def mapK[G[_]: Functor]( fk: F ~> G - ): AST[G] = SourceFile( + ): SourceFile[G] = SourceFile( prelude = prelude.mapK(fk), statements = fk(statements).map(_.map(_.mapK(fk))), ) @@ -132,9 +133,9 @@ final case class OperationName[F[_]]( text: String ) extends AST[F] { - def mapK[G[_]: Functor]( - fk: F ~> G - ): OperationName[G] = copy() + def mapK[G[_]: Functor](fk: FunctionK[F, G]): OperationName[G] = retag[G] + + def retag[G[_]]: OperationName[G] = copy() } @@ -189,7 +190,7 @@ final case class QueryOperationName[F[_]]( fk: F ~> G ): QueryOperationName[G] = QueryOperationName( identifier.map(fk(_)), - fk(operationName).map(_.mapK(fk)), + fk(operationName).map(_.retag[G]), ) } diff --git a/modules/core/src/main/scala/playground/ASTAdapter.scala b/modules/core/src/main/scala/playground/ASTAdapter.scala new file mode 100644 index 00000000..c7d6816f --- /dev/null +++ b/modules/core/src/main/scala/playground/ASTAdapter.scala @@ -0,0 +1,12 @@ +package playground + +import cats.syntax.all.* +import playground.smithyql.QualifiedIdentifier + +object ASTAdapter { + + def decodeQI(qi: playground.generated.nodes.QualifiedIdentifier): Option[QualifiedIdentifier] = + (qi.namespace.map(_.source).toNel, qi.selection.map(_.source)) + .mapN(QualifiedIdentifier.apply) + +} diff --git a/modules/core/src/main/scala/playground/MultiServiceResolver.scala b/modules/core/src/main/scala/playground/MultiServiceResolver.scala index 15c5fc7c..5c088bcb 100644 --- a/modules/core/src/main/scala/playground/MultiServiceResolver.scala +++ b/modules/core/src/main/scala/playground/MultiServiceResolver.scala @@ -9,6 +9,7 @@ import playground.smithyql.UseClause import playground.smithyql.WithSource object MultiServiceResolver { + import playground.smithyql.tsutils.* /** Determines which service should be used for a query. The rules are: * - If the operation name has a service identifier, there MUST be a service with that name @@ -37,6 +38,40 @@ object MultiServiceResolver { case None => resolveImplicit(queryOperationName.operationName, serviceIndex, useClauses) } + /** Determines which service should be used for a query. The rules are: + * - If the operation name has a service identifier, there MUST be a service with that name + * that contains the given operation. + * - If there's no service identifier, find all matching services that are included in the use + * clauses. MUST find exactly one entry. + * + * In other cases, such as when we can't find a unique entry, or the explicitly referenced + * service doesn't have an operation with a matching name, we fail. The latter might eventually + * be refactored to a separate piece of code. + * + * **Important**! + * + * This method assumes that all of the use clauses match the available service set. It does NOT + * perform a check on that. For the actual check, see PreludeCompiler. + */ + def resolveServiceTs( + queryOperationName: playground.generated.nodes.OperationName, + serviceIndex: ServiceIndex, + useClauses: List[playground.generated.nodes.UseClause], + ): EitherNel[CompilationError, QualifiedIdentifier] = + queryOperationName.name match { + case Some(opName) => + // todo: this should be an option in codegen. might be a bad grammar + queryOperationName.identifier.headOption match { + case Some(explicitRef) => resolveExplicitTs(serviceIndex, explicitRef, opName) + + case None => resolveImplicitTs(opName, serviceIndex, useClauses) + } + case None => + // TODO: operation name is invalid or something like that + ??? + + } + private def resolveExplicit( index: ServiceIndex, explicitRef: WithSource[QualifiedIdentifier], @@ -66,6 +101,41 @@ object MultiServiceResolver { case Some(_) => explicitRef.value.asRight } + private def resolveExplicitTs( + index: ServiceIndex, + explicitRef: playground.generated.nodes.QualifiedIdentifier, + operationName: playground.generated.nodes.Identifier, + ): EitherNel[CompilationError, QualifiedIdentifier] = + ASTAdapter.decodeQI(explicitRef) match { + case None => ??? /* todo - I don't really know xD */ + // explicit reference exists, but doesn't parse + case Some(ref) => + index.getService(ref) match { + // explicit reference exists, but the service doesn't + case None => + CompilationError + .error( + CompilationErrorDetails.UnknownService(index.serviceIds.toList), + explicitRef.range, + ) + .leftNel + + // the service exists, but doesn't have the requested operation + case Some(service) + if !service.operationNames.contains_(OperationName(operationName.source)) => + CompilationError + .error( + CompilationErrorDetails.OperationMissing(service.operationNames.toList), + operationName.range, + ) + .leftNel + + // all good + case Some(_) => ref.asRight + } + + } + private def resolveImplicit( operationName: WithSource[OperationName[WithSource]], index: ServiceIndex, @@ -90,4 +160,29 @@ object MultiServiceResolver { } } + private def resolveImplicitTs( + // todo: introduce type wrapper for OperationName, rename current to QueryOperationName + operationName: playground.generated.nodes.Identifier, + index: ServiceIndex, + useClauses: List[playground.generated.nodes.UseClause], + ): EitherNel[CompilationError, QualifiedIdentifier] = { + val matchingServices = index + .getServices(useClauses.flatMap(_.identifier).flatMap(ASTAdapter.decodeQI).toSet) + .filter(_.hasOperation(OperationName(operationName.source))) + + matchingServices match { + case one :: Nil => one.id.asRight + case _ => + CompilationError + .error( + CompilationErrorDetails + .AmbiguousService( + workspaceServices = index.serviceIds.toList + ), + operationName.range, + ) + .leftNel + } + } + } diff --git a/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala b/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala index 72cd45d0..87675dca 100644 --- a/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala +++ b/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala @@ -2,7 +2,7 @@ package playground.smithyql import cats.kernel.Monoid import cats.syntax.all.* -import org.polyvariant.treesitter4s.Node +import tsutils.* import util.chaining.* trait RangeIndex { @@ -22,10 +22,6 @@ object RangeIndex { def build(parsed: playground.generated.nodes.SourceFile): RangeIndex = fromRanges { - extension (node: Node) { - def range: SourceRange = SourceRange(Position(node.startByte), Position(node.endByte)) - } - val root = NodeContext.EmptyPath val preludeRanges = parsed @@ -137,12 +133,12 @@ object RangeIndex { allRanges .filter(_.range.contains(pos)) .tap { ranges => - println() - println("=======") - println(s"all ranges: ${allRanges.map(_.render).mkString(", ")}") - println(s"ranges for position ${pos.index}: ${ranges.map(_.render).mkString(", ")}") - println("=======") - println() + // println() + // println("=======") + // println(s"all ranges: ${allRanges.map(_.render).mkString(", ")}") + // println(s"ranges for position ${pos.index}: ${ranges.map(_.render).mkString(", ")}") + // println("=======") + // println() } .maxByOption(_.ctx.length) .map(_.ctx) diff --git a/modules/core/src/main/scala/playground/smithyql/tsutils.scala b/modules/core/src/main/scala/playground/smithyql/tsutils.scala new file mode 100644 index 00000000..5cb55005 --- /dev/null +++ b/modules/core/src/main/scala/playground/smithyql/tsutils.scala @@ -0,0 +1,11 @@ +package playground.smithyql + +import org.polyvariant.treesitter4s.Node + +object tsutils { + + extension (node: Node) { + def range: SourceRange = SourceRange(Position(node.startByte), Position(node.endByte)) + } + +} diff --git a/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala b/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala index 0a4b934e..8ee26804 100644 --- a/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala +++ b/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala @@ -4,6 +4,7 @@ import cats.Id import cats.kernel.Order.catsKernelOrderingForOrder import cats.syntax.all.* import org.polyvariant.treesitter4s.TreeSitterAPI +import playground.ASTAdapter import playground.MultiServiceResolver import playground.ServiceIndex import playground.smithyql.NodeContext @@ -12,11 +13,7 @@ import playground.smithyql.NodeContext.^^: import playground.smithyql.OperationName import playground.smithyql.Position import playground.smithyql.QualifiedIdentifier -import playground.smithyql.Query import playground.smithyql.RangeIndex -import playground.smithyql.SourceFile -import playground.smithyql.WithSource -import playground.smithyql.parser.SourceParser import playground.smithyql.syntax.* import smithy4s.dynamic.DynamicSchemaIndex @@ -75,15 +72,19 @@ object CompletionProvider { .toList } - def completeRootOperationName( - file: SourceFile[WithSource], + def completeRootOperationNameTs( + file: playground.generated.nodes.SourceFile, insertBodyStruct: CompletionItem.InsertBodyStruct, ) = { // double-check test coverage. // there's definitely a test missing for N>1 clauses. // https://github.com/kubukoz/smithy-playground/issues/161 - val presentServiceIds - : List[QualifiedIdentifier] = file.prelude.useClauses.map(_.value.identifier.value) + val presentServiceIds: List[QualifiedIdentifier] = file + .prelude + .toList + .flatMap(_.use_clause) + .flatMap(_.identifier) + .flatMap(ASTAdapter.decodeQI) // for operations on root level we show: // - completions for ops from the service being used, which don't insert a use clause and don't show the service ID @@ -112,9 +113,9 @@ object CompletionProvider { } // we're definitely in an existing query, so we don't insert a brace in either case. - def completeOperationNameFor( - q: Query[WithSource], - sf: SourceFile[WithSource], + def completeOperationNameForTs( + q: playground.generated.nodes.RunQuery, + sf: playground.generated.nodes.SourceFile, serviceId: Option[QualifiedIdentifier], ): List[CompletionItem] = serviceId match { @@ -122,8 +123,12 @@ object CompletionProvider { // includes the current query's service reference // as it wouldn't result in ading a use clause val presentServiceIdentifiers = - q.operationName.value.mapK(WithSource.unwrap).identifier.toList ++ - sf.prelude.useClauses.map(_.value.identifier.value) + q.operation_name.toList.flatMap(_.identifier).flatMap(ASTAdapter.decodeQI) ++ + sf.prelude + .toList + .flatMap(_.use_clause) + .flatMap(_.identifier) + .flatMap(ASTAdapter.decodeQI) completeOperationName( serviceId, @@ -131,34 +136,38 @@ object CompletionProvider { CompletionItem.InsertBodyStruct.No, ) - case None => completeRootOperationName(sf, CompletionItem.InsertBodyStruct.No) + case None => completeRootOperationNameTs(sf, CompletionItem.InsertBodyStruct.No) } - def completeInQuery( - q: Query[WithSource], - sf: SourceFile[WithSource], + def completeInQueryTs( + q: playground.generated.nodes.RunQuery, + sf: playground.generated.nodes.SourceFile, ctx: NodeContext, - ): List[CompletionItem] = { + ): List[CompletionItem] = q.operation_name.toList.flatMap { operationName => val resolvedServiceId = MultiServiceResolver - .resolveService( - q.operationName.value, + .resolveServiceTs( + operationName, serviceIndex, - sf.prelude.useClauses.map(_.value), + sf.prelude.toList.flatMap(_.use_clause), ) .toOption ctx match { case NodeContext.PathEntry.AtOperationName ^^: EmptyPath => - completeOperationNameFor(q, sf, resolvedServiceId) + completeOperationNameForTs(q, sf, resolvedServiceId) case NodeContext.PathEntry.AtOperationInput ^^: ctx => resolvedServiceId match { case Some(serviceId) => - inputCompletions(serviceId)( - q.operationName.value.operationName.value.mapK(WithSource.unwrap) - ) - .getCompletions(ctx) + q.operation_name + .toList + .flatMap(_.name) + .map(id => OperationName[Id](id.source)) + .flatMap { + inputCompletions(serviceId)(_) + .getCompletions(ctx) + } case None => Nil } @@ -177,44 +186,40 @@ object CompletionProvider { .SourceFile .unsafeApply(TreeSitterAPI.make("smithyql").parse(doc).rootNode.get) - SourceParser[SourceFile].parse(doc) match { - case Left(_) => - // we can try to deal with this later - Nil - - case Right(sf) => - val matchingNode = RangeIndex.build(parsedTs) - .findAtPosition(pos) - .getOrElse(NodeContext.EmptyPath) - - // System.err.println("matchingNode: " + matchingNode.render) - - matchingNode match { - case NodeContext.PathEntry.InQuery(n) ^^: rest => - val q = - sf - .queries(WithSource.unwrap) - .get(n.toLong) - .getOrElse(sys.error(s"Fatal error: no query at index $n")) - .query - .value - - completeInQuery(q, sf, rest) - - case NodeContext.PathEntry.AtPrelude ^^: - NodeContext.PathEntry.AtUseClause(_) ^^: - EmptyPath => - servicesById - .toList - .sortBy(_._1) - .map(CompletionItem.useServiceClause.tupled) - - case EmptyPath => completeRootOperationName(sf, CompletionItem.InsertBodyStruct.Yes) - - case _ => Nil - } + val matchingNode = RangeIndex + .build(parsedTs) + .findAtPosition(pos) + .getOrElse(NodeContext.EmptyPath) + + // System.err.println("matchingNode: " + matchingNode.render) + + matchingNode match { + case NodeContext.PathEntry.InQuery(n) ^^: rest => + val q = parsedTs + .statements + .flatMap(_.run_query) + .get(n.toLong) + .getOrElse(sys.error(s"Fatal error: no query at index $n")) + + completeInQueryTs(q, parsedTs, rest) + + case NodeContext.PathEntry.AtPrelude ^^: + NodeContext.PathEntry.AtUseClause(_) ^^: + EmptyPath => + servicesById + .toList + .sortBy(_._1) + .map(CompletionItem.useServiceClause.tupled) + + case EmptyPath => + completeRootOperationNameTs( + parsedTs, + CompletionItem.InsertBodyStruct.Yes, + ) + case _ => Nil } + } } From ef1fe2a24de4ed29c08d9391634c3bf4f15e8314 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 11 Nov 2024 00:48:05 +0100 Subject: [PATCH 066/105] Add POC of selector DSL --- .../scala/playground/parsergen/demo.scala | 52 +++++++++++++++++++ .../treesitter4s/std/Selection.scala | 5 ++ 2 files changed, 57 insertions(+) create mode 100644 modules/parser-gen/src/main/scala/playground/parsergen/demo.scala create mode 100644 modules/treesitter/src/main/scala/playground/treesitter4s/std/Selection.scala diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/demo.scala b/modules/parser-gen/src/main/scala/playground/parsergen/demo.scala new file mode 100644 index 00000000..6a6764cb --- /dev/null +++ b/modules/parser-gen/src/main/scala/playground/parsergen/demo.scala @@ -0,0 +1,52 @@ +case class Foo(bars: List[Bar]) { + def select[A](f: Foo.Selector => Selection[A]): List[A] = f(Foo.Selector(List(this))).path +} + +object Foo { + + case class Selector(path: List[Foo]) extends Selection[Foo] { + def bars: Bar.Selector = Bar.Selector(path.flatMap(_.bars)) + } + +} + +case class Bar(baz: Option[Baz]) + +object Bar { + + case class Selector(path: List[Bar]) extends Selection[Bar] { + def baz: Baz.Selector = Baz.Selector(path.flatMap(_.baz)) + + } + +} + +case class Baz(names: List[Identifier]) + +object Baz { + + case class Selector(path: List[Baz]) extends Selection[Baz] { + def names: Identifier.Selector = Identifier.Selector(path.flatMap(_.names)) + } + +} + +case class Identifier(value: String) + +object Identifier { + + case class Selector(path: List[Identifier]) extends Selection[Identifier] +} + +trait Selection[A] { + def path: List[A] +} + +@main def demo = { + import util.chaining.* + + Foo(List(Bar(Some(Baz(List("a", "b").map(Identifier.apply)))))).select(_.bars.baz).pipe(println) + Foo(List(Bar(Some(Baz(List("a", "b").map(Identifier.apply)))))) + .select(_.bars.baz.names) + .pipe(println) +} diff --git a/modules/treesitter/src/main/scala/playground/treesitter4s/std/Selection.scala b/modules/treesitter/src/main/scala/playground/treesitter4s/std/Selection.scala new file mode 100644 index 00000000..34adddc0 --- /dev/null +++ b/modules/treesitter/src/main/scala/playground/treesitter4s/std/Selection.scala @@ -0,0 +1,5 @@ +package playground.treesitter4s.std + +trait Selection[A] { + def path: List[A] +} From 737e8cd116c67d3b91fead12f71ec1ec4d1767a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 11 Nov 2024 00:58:45 +0100 Subject: [PATCH 067/105] Remove debugDump comment --- .../scala/playground/parsergen/ParserGen.scala | 15 --------------- .../playground/generated/nodes/Binding.scala | 4 ---- .../playground/generated/nodes/Boolean_.scala | 4 ---- .../playground/generated/nodes/Comment.scala | 4 ---- .../playground/generated/nodes/Identifier.scala | 4 ---- .../playground/generated/nodes/InputNode.scala | 3 --- .../scala/playground/generated/nodes/List_.scala | 4 ---- .../scala/playground/generated/nodes/Null_.scala | 4 ---- .../scala/playground/generated/nodes/Number.scala | 4 ---- .../generated/nodes/OperationName.scala | 4 ---- .../playground/generated/nodes/Prelude.scala | 4 ---- .../generated/nodes/QualifiedIdentifier.scala | 4 ---- .../playground/generated/nodes/RunQuery.scala | 4 ---- .../playground/generated/nodes/SourceFile.scala | 4 ---- .../playground/generated/nodes/String_.scala | 4 ---- .../scala/playground/generated/nodes/Struct.scala | 4 ---- .../generated/nodes/TopLevelStatement.scala | 4 ---- .../playground/generated/nodes/UseClause.scala | 4 ---- .../playground/generated/nodes/Whitespace.scala | 4 ---- 19 files changed, 86 deletions(-) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index d01aef41..929865b5 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -4,7 +4,6 @@ import cats.syntax.all.* import monocle.syntax.all.* import org.polyvariant.treesitter4s.Node import smithy4s.Blob -import smithy4s.Document import smithy4s.json.Json import treesittersmithy.FieldName import treesittersmithy.NodeType @@ -18,13 +17,6 @@ import scala.annotation.targetName import scala.jdk.CollectionConverters.* import scala.meta.Dialect -val debug = false - -def debugDump(s: String): String = - if debug then s - else - "" - extension (tn: TypeName) { @targetName("renderTypeName") def render: String = tn.value.dropWhile(_ == '_').fromSnakeCase.ident @@ -83,9 +75,6 @@ def renderAdt(tpe: NodeType) = { | | def unapply(node: Node): Option[$name] = apply(node).toOption |} - |/* - |${debugDump(Json.writeDocumentAsPrettyString(Document.encode(tpe)).trimLines)} - |*/ |""".stripMargin } @@ -213,10 +202,6 @@ def renderClass(tpe: NodeType) = { | def unsafeApply(node: Node): $name = apply(node).fold(sys.error, identity) | def unapply(node: Node): Option[$name] = apply(node).toOption |} - | - |/* - |${debugDump(Json.writeDocumentAsPrettyString(Document.encode(tpe)).trimLines)} - |*/ |""".stripMargin } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Binding.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Binding.scala index 1fe5932a..feb5b0f9 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Binding.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Binding.scala @@ -28,7 +28,3 @@ object Binding { def unsafeApply(node: Node): Binding = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Binding] = apply(node).toOption } - -/* - -*/ diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Boolean_.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Boolean_.scala index e711843a..7533bdb6 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Boolean_.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Boolean_.scala @@ -15,7 +15,3 @@ object Boolean_ { def unsafeApply(node: Node): Boolean_ = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Boolean_] = apply(node).toOption } - -/* - -*/ diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Comment.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Comment.scala index 968b14dd..cfe3f4a2 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Comment.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Comment.scala @@ -15,7 +15,3 @@ object Comment { def unsafeApply(node: Node): Comment = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Comment] = apply(node).toOption } - -/* - -*/ diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Identifier.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Identifier.scala index 22ea7525..357f300e 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Identifier.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Identifier.scala @@ -15,7 +15,3 @@ object Identifier { def unsafeApply(node: Node): Identifier = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Identifier] = apply(node).toOption } - -/* - -*/ diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala index 3740e08c..7e7905ce 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala @@ -28,6 +28,3 @@ object InputNode { def unapply(node: Node): Option[InputNode] = apply(node).toOption } -/* - -*/ diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/List_.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/List_.scala index ea102e6f..fb09aa48 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/List_.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/List_.scala @@ -24,7 +24,3 @@ object List_ { def unsafeApply(node: Node): List_ = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[List_] = apply(node).toOption } - -/* - -*/ diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Null_.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Null_.scala index f823437f..126d1449 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Null_.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Null_.scala @@ -15,7 +15,3 @@ object Null_ { def unsafeApply(node: Node): Null_ = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Null_] = apply(node).toOption } - -/* - -*/ diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Number.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Number.scala index 917094b5..02a9868a 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Number.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Number.scala @@ -15,7 +15,3 @@ object Number { def unsafeApply(node: Node): Number = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Number] = apply(node).toOption } - -/* - -*/ diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/OperationName.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/OperationName.scala index 76f998b0..119f5c3b 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/OperationName.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/OperationName.scala @@ -28,7 +28,3 @@ object OperationName { def unsafeApply(node: Node): OperationName = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[OperationName] = apply(node).toOption } - -/* - -*/ diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Prelude.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Prelude.scala index 77bc758e..fca41947 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Prelude.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Prelude.scala @@ -26,7 +26,3 @@ object Prelude { def unsafeApply(node: Node): Prelude = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Prelude] = apply(node).toOption } - -/* - -*/ diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala index 23774ac5..3e168818 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala @@ -28,7 +28,3 @@ object QualifiedIdentifier { def unsafeApply(node: Node): QualifiedIdentifier = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[QualifiedIdentifier] = apply(node).toOption } - -/* - -*/ diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/RunQuery.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/RunQuery.scala index 237b7dbd..306f89ea 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/RunQuery.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/RunQuery.scala @@ -28,7 +28,3 @@ object RunQuery { def unsafeApply(node: Node): RunQuery = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[RunQuery] = apply(node).toOption } - -/* - -*/ diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/SourceFile.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/SourceFile.scala index 45bfd1ca..f424c0c9 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/SourceFile.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/SourceFile.scala @@ -28,7 +28,3 @@ object SourceFile { def unsafeApply(node: Node): SourceFile = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[SourceFile] = apply(node).toOption } - -/* - -*/ diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/String_.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/String_.scala index 147591a1..e4ee7771 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/String_.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/String_.scala @@ -15,7 +15,3 @@ object String_ { def unsafeApply(node: Node): String_ = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[String_] = apply(node).toOption } - -/* - -*/ diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Struct.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Struct.scala index d0a3a204..6a447a4e 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Struct.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Struct.scala @@ -24,7 +24,3 @@ object Struct { def unsafeApply(node: Node): Struct = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Struct] = apply(node).toOption } - -/* - -*/ diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/TopLevelStatement.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/TopLevelStatement.scala index 739f4268..a2f6cf16 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/TopLevelStatement.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/TopLevelStatement.scala @@ -26,7 +26,3 @@ object TopLevelStatement { def unsafeApply(node: Node): TopLevelStatement = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[TopLevelStatement] = apply(node).toOption } - -/* - -*/ diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/UseClause.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/UseClause.scala index 0d26e41d..7f95e541 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/UseClause.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/UseClause.scala @@ -28,7 +28,3 @@ object UseClause { def unsafeApply(node: Node): UseClause = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[UseClause] = apply(node).toOption } - -/* - -*/ diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Whitespace.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Whitespace.scala index 73539422..d85cc6a3 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Whitespace.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Whitespace.scala @@ -15,7 +15,3 @@ object Whitespace { def unsafeApply(node: Node): Whitespace = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Whitespace] = apply(node).toOption } - -/* - -*/ From dedb2bebbd0f8031cb9f52e4f079bed91b95e9db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 11 Nov 2024 01:02:13 +0100 Subject: [PATCH 068/105] Introduce IR for ADTs --- .../main/scala/playground/parsergen/IR.scala | 26 ++++++++++++++ .../playground/parsergen/ParserGen.scala | 36 +++++++++---------- 2 files changed, 44 insertions(+), 18 deletions(-) create mode 100644 modules/parser-gen/src/main/scala/playground/parsergen/IR.scala diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/IR.scala b/modules/parser-gen/src/main/scala/playground/parsergen/IR.scala new file mode 100644 index 00000000..c3c1876e --- /dev/null +++ b/modules/parser-gen/src/main/scala/playground/parsergen/IR.scala @@ -0,0 +1,26 @@ +package playground.parsergen + +import cats.data.NonEmptyList +import treesittersmithy.NodeType +import treesittersmithy.TypeName + +enum Type { + + case ADT(name: TypeName, subtypes: NonEmptyList[Subtype]) +} + +case class Subtype(name: TypeName) + +object IR { + + def from(nt: NodeType): Type = + if nt.subtypes.nonEmpty then fromADT(nt) + else + sys.error("todo") + + private def fromADT(nt: NodeType): Type.ADT = Type.ADT( + name = nt.tpe, + subtypes = NonEmptyList.fromListUnsafe(nt.subtypes.map(subtype => Subtype(name = subtype.tpe))), + ) + +} diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index 929865b5..66188843 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -32,27 +32,38 @@ extension (fn: FieldName) { extension (tpe: NodeType) { def render: String = - if tpe.subtypes.nonEmpty then renderAdt(tpe) + if tpe.subtypes.nonEmpty then renderAdt(IR.from(tpe).asInstanceOf[Type.ADT]) else renderClass(tpe) } -def renderAdt(tpe: NodeType) = { - val name = tpe.tpe.render +def renderAdt(adt: Type.ADT) = { + val name = adt.name.render - val projections = tpe.subtypes.map { nodeType => + val projections = adt.subtypes.map { sub => // format: off - show"""def ${nodeType.tpe.renderProjection}: Option[${nodeType.tpe.render}] = ${nodeType.tpe.render}.unapply(node)""" + show"""def ${sub.name.renderProjection}: Option[${sub.name.render}] = ${sub.name.render}.unapply(node)""" // format: on } + val applyMethod = { + val cases = adt + .subtypes + .map(nodeType => show"""case ${nodeType.name.render}(node) => Right(node)""") + + show"""def apply(node: Node): Either[String, $name] = node match { + |${cases.mkString_("\n").indentTrim(2)} + | case _ => Left(s"Expected $name, got $${node.tpe}") + |}""".stripMargin + } + show"""// Generated code! Do not modify by hand. |package playground.generated.nodes | |import ${classOf[Node].getName()} | - |opaque type $name <: Node = ${tpe.subtypes.map(_.tpe.render).mkString(" | ")} + |opaque type $name <: Node = ${adt.subtypes.map(_.name.render).mkString_(" | ")} | |object $name { | @@ -60,18 +71,7 @@ def renderAdt(tpe: NodeType) = { |${projections.mkString_("\n").indentTrim(4)} | } | - | def apply(node: Node): Either[String, $name] = node match { - |${tpe - .subtypes - .map { nodeType => - show"""case ${nodeType - .tpe - .render}(node) => Right(node)""" - } - .mkString_("\n") - .indentTrim(4)} - | case _ => Left(s"Expected $name, got $${node.tpe}") - | } + |${applyMethod.indentTrim(2)} | | def unapply(node: Node): Option[$name] = apply(node).toOption |} From fd95b3de7a3845e71763c519c620bd59e2865228 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 11 Nov 2024 01:02:40 +0100 Subject: [PATCH 069/105] some privacy --- .../src/main/scala/playground/parsergen/ParserGen.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index 66188843..ebc85e86 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -38,7 +38,7 @@ extension (tpe: NodeType) { } -def renderAdt(adt: Type.ADT) = { +private def renderAdt(adt: Type.ADT): String = { val name = adt.name.render val projections = adt.subtypes.map { sub => @@ -78,7 +78,7 @@ def renderAdt(adt: Type.ADT) = { |""".stripMargin } -def renderClass(tpe: NodeType) = { +private def renderClass(tpe: NodeType): String = { val name = tpe.tpe.render val fieldGetters = tpe From 4ec6124a76d7400103b9f97bb7704ef6575910d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 11 Nov 2024 01:04:31 +0100 Subject: [PATCH 070/105] first generate, then delete --- .../main/scala/playground/parsergen/ParserGen.scala | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index ebc85e86..962cbfd1 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -218,11 +218,7 @@ private def renderClass(tpe: NodeType): String = { val base = Paths.get(s"modules/treesitter/src/main/scala/playground/generated/nodes") - Files.createDirectories(base) - - Files.walk(base).iterator().asScala.filter(Files.isRegularFile(_)).foreach(Files.delete) - - types + val rendered = types .filter(_.named) .map( // only render field types that are named @@ -235,6 +231,12 @@ private def renderClass(tpe: NodeType): String = { .fproduct( _.render ) + + Files.createDirectories(base) + + Files.walk(base).iterator().asScala.filter(Files.isRegularFile(_)).foreach(Files.delete) + + rendered .foreach { (tpe, code) => Files.writeString( base.resolve(s"${tpe.tpe.render}.scala"), From 7629f98eff374ef45edc544a1b0f226d8fcb7f7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 11 Nov 2024 01:44:58 +0100 Subject: [PATCH 071/105] Add IR (which doesn't help much but hey) --- .../main/scala/playground/parsergen/IR.scala | 28 ++++- .../playground/parsergen/ParserGen.scala | 118 ++++++++---------- 2 files changed, 81 insertions(+), 65 deletions(-) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/IR.scala b/modules/parser-gen/src/main/scala/playground/parsergen/IR.scala index c3c1876e..b2105c18 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/IR.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/IR.scala @@ -1,14 +1,18 @@ package playground.parsergen import cats.data.NonEmptyList +import treesittersmithy.FieldName import treesittersmithy.NodeType import treesittersmithy.TypeName enum Type { - case ADT(name: TypeName, subtypes: NonEmptyList[Subtype]) + case Product(name: TypeName, fields: List[Field], children: Option[Children]) } +case class Field(name: FieldName, targetTypes: NonEmptyList[TypeName], repeated: Boolean) +case class Children(targetTypes: NonEmptyList[TypeName], repeated: Boolean) + case class Subtype(name: TypeName) object IR { @@ -16,11 +20,31 @@ object IR { def from(nt: NodeType): Type = if nt.subtypes.nonEmpty then fromADT(nt) else - sys.error("todo") + fromProduct(nt) private def fromADT(nt: NodeType): Type.ADT = Type.ADT( name = nt.tpe, subtypes = NonEmptyList.fromListUnsafe(nt.subtypes.map(subtype => Subtype(name = subtype.tpe))), ) + private def fromProduct(nt: NodeType): Type.Product = Type.Product( + name = nt.tpe, + fields = + nt.fields + .map { (fieldName, fieldInfo) => + Field( + name = fieldName, + targetTypes = NonEmptyList.fromListUnsafe(fieldInfo.types.map(_.tpe)), + repeated = fieldInfo.multiple, + ) + } + .toList, + children = nt.children.map { children => + Children( + targetTypes = NonEmptyList.fromListUnsafe(children.types.map(_.tpe)), + repeated = children.multiple, + ) + }, + ) + } diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index 962cbfd1..bf9140e4 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -1,5 +1,6 @@ package playground.parsergen +import cats.data.NonEmptyList import cats.syntax.all.* import monocle.syntax.all.* import org.polyvariant.treesitter4s.Node @@ -32,9 +33,10 @@ extension (fn: FieldName) { extension (tpe: NodeType) { def render: String = - if tpe.subtypes.nonEmpty then renderAdt(IR.from(tpe).asInstanceOf[Type.ADT]) - else - renderClass(tpe) + IR.from(tpe) match { + case adt: Type.ADT => renderAdt(adt) + case product: Type.Product => renderProduct(product) + } } @@ -78,98 +80,88 @@ private def renderAdt(adt: Type.ADT): String = { |""".stripMargin } -private def renderClass(tpe: NodeType): String = { - val name = tpe.tpe.render +private def renderProduct(p: Type.Product): String = { + val name = p.name.render - val fieldGetters = tpe - .fields - .toList - .map { (k, fieldType) => - val typeUnion = fieldType - .types - .map(tpe => show"${tpe.tpe.render}") - .reduceLeftOption(_ + " | " + _) - .getOrElse(sys.error(s"unexpected empty list of types: $k (in ${tpe.tpe})")) - - val fieldTypeAnnotation = typeUnion.pipe { - case s if fieldType.multiple => show"List[$s]" - case s => show"Option[$s]" - } + def renderTypeUnion(types: NonEmptyList[TypeName]) = types + .map(_.render) + .reduceLeft(_ + " | " + _) - val allFields = show"""node.fields.getOrElse(${k.value.literal}, Nil)""" + def renderFieldType(field: Field): String = renderTypeUnion(field.targetTypes).pipe { + case s if field.repeated => show"List[$s]" + case s => show"Option[$s]" + } + + def renderChildrenType(children: Children): String = renderTypeUnion(children.targetTypes).pipe { + case s if children.repeated => show"List[$s]" + case s => show"Option[$s]" + } - val cases = fieldType.types.map { typeInfo => - show"""case ${typeInfo.tpe.render}(node) => node""" + def renderChildType(tpe: TypeName, repeated: Boolean): String = tpe.render.pipe { + case s if repeated => show"List[$s]" + case s => show"Option[$s]" + } + + val fieldGetters = p + .fields + .map { field => + val allFields = show"""node.fields.getOrElse(${field.name.value.literal}, Nil)""" + + val cases = field.targetTypes.map { tpe => + show"""case ${tpe.render}(node) => node""" } + val fieldValue = - if fieldType.multiple then show"""$allFields.toList.collect { - |${cases.mkString("\n").indentTrim(2)} - |}""".stripMargin + if field.repeated then show"""$allFields.toList.collect { + |${cases.mkString_("\n").indentTrim(2)} + |}""".stripMargin else show"""$allFields.headOption.map { - |${cases.mkString("\n").indentTrim(2)} + |${cases.mkString_("\n").indentTrim(2)} |}""".stripMargin - show"""def ${k.render}: ${fieldTypeAnnotation} = $fieldValue""" + show"""def ${field.name.render}: ${renderFieldType(field)} = $fieldValue""" } - val typedChildren = tpe.children.map { fieldType => - val typeUnion = fieldType - .types - .map(tpe => show"${tpe.tpe.render}") - .reduceLeftOption(_ + " | " + _) - .getOrElse(sys.error(s"unexpected empty list of types in children: (in ${tpe.tpe})")) - - val fieldTypeAnnotation = typeUnion.pipe { - case s if fieldType.multiple => show"List[$s]" - case s => show"Option[$s]" - } + val typedChildren = p.children.map { children => + val fieldTypeAnnotation = renderChildrenType(children) val allChildren = show"""node.children""" - val cases = fieldType.types.map { typeInfo => - show"""case ${typeInfo.tpe.render}(node) => node""" + val cases = children.targetTypes.map { tpe => + show"""case ${tpe.render}(node) => node""" } val fieldValue = - if fieldType.multiple then show"""$allChildren.toList.collect { - |${cases.mkString("\n").indentTrim(2)} - |}""".stripMargin + if children.repeated then show"""$allChildren.toList.collect { + |${cases.mkString_("\n").indentTrim(2)} + |}""".stripMargin else show"""$allChildren.collectFirst { - |${cases.mkString("\n").indentTrim(2)} + |${cases.mkString_("\n").indentTrim(2)} |}""".stripMargin show"""def typedChildren: ${fieldTypeAnnotation} = $fieldValue""" } - val typedChildrenPrecise = tpe + val typedChildrenPrecise = p .children .toList .flatMap { fieldInfo => - fieldInfo.types.map((fieldInfo.multiple, _)) + fieldInfo.targetTypes.map((fieldInfo.repeated, _)).toList } - .map { (multiple, fieldType) => - val fieldTypeAnnotation = fieldType.tpe.render.pipe { - case s if multiple => show"List[$s]" - case s => show"Option[$s]" - } - + .map { (repeated, fieldType) => + val fieldTypeAnnotation = renderChildType(fieldType, repeated) val childValue = - if multiple then show"""node.children.toList.collect { - | case ${fieldType - .tpe - .render}(node) => node + if repeated then show"""node.children.toList.collect { + | case ${fieldType.render}(node) => node |}""".stripMargin else show"""node.children.collectFirst { - | case ${fieldType.tpe.render}(node) => node + | case ${fieldType.render}(node) => node |}""".stripMargin - show"""def ${fieldType - .tpe - .asChildName - .render}: $fieldTypeAnnotation = $childValue""".stripMargin + show"""def ${fieldType.asChildName.render}: $fieldTypeAnnotation = $childValue""".stripMargin } val methods = @@ -196,9 +188,9 @@ private def renderClass(tpe: NodeType): String = { |${methods.indentTrim(2)} | | def apply(node: Node): Either[String, $name] = - | if node.tpe == ${tpe.tpe.value.literal} + | if node.tpe == ${p.name.value.literal} | then Right(node) - | else Left(s"Expected ${tpe.tpe.render}, got $${node.tpe}") + | else Left(s"Expected ${p.name.render}, got $${node.tpe}") | def unsafeApply(node: Node): $name = apply(node).fold(sys.error, identity) | def unapply(node: Node): Option[$name] = apply(node).toOption |} From c4bce3af4ad633c1eb380b73cd9f2e35ba0ea108 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 11 Nov 2024 01:50:37 +0100 Subject: [PATCH 072/105] expand selector demo to account for unions --- .../scala/playground/parsergen/demo.scala | 58 +++++++++++++++++-- 1 file changed, 54 insertions(+), 4 deletions(-) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/demo.scala b/modules/parser-gen/src/main/scala/playground/parsergen/demo.scala index 6a6764cb..a2117145 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/demo.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/demo.scala @@ -1,4 +1,4 @@ -case class Foo(bars: List[Bar]) { +case class Foo(bars: List[Bar], nodes: List[Node]) { def select[A](f: Foo.Selector => Selection[A]): List[A] = f(Foo.Selector(List(this))).path } @@ -6,6 +6,7 @@ object Foo { case class Selector(path: List[Foo]) extends Selection[Foo] { def bars: Bar.Selector = Bar.Selector(path.flatMap(_.bars)) + def nodes: Node.Selector = Node.Selector(path.flatMap(_.nodes)) } } @@ -38,6 +39,33 @@ object Identifier { case class Selector(path: List[Identifier]) extends Selection[Identifier] } +enum Node { + case Ident(i: Identifier) + case B(b: Baz) + + def asIdent: Option[Identifier] = + this match { + case Ident(i) => Some(i) + case _ => None + } + + def asB: Option[Baz] = + this match { + case B(b) => Some(b) + case _ => None + } + +} + +object Node { + + case class Selector(val path: List[Node]) extends Selection[Node] { + def ident: Identifier.Selector = Identifier.Selector(path.flatMap(_.asIdent)) + def b: Baz.Selector = Baz.Selector(path.flatMap(_.asB)) + } + +} + trait Selection[A] { def path: List[A] } @@ -45,8 +73,30 @@ trait Selection[A] { @main def demo = { import util.chaining.* - Foo(List(Bar(Some(Baz(List("a", "b").map(Identifier.apply)))))).select(_.bars.baz).pipe(println) - Foo(List(Bar(Some(Baz(List("a", "b").map(Identifier.apply)))))) - .select(_.bars.baz.names) + Foo( + List(Bar(Some(Baz(List("a", "b").map(Identifier.apply))))), + List(Node.Ident(Identifier("aa"))), + ).select(_.bars.baz).pipe(println) + + println( + Foo( + List(Bar(Some(Baz(List("a", "b").map(Identifier.apply))))), + List(Node.Ident(Identifier("aa"))), + ) + .select(_.bars.baz.names) == + Foo( + List(Bar(Some(Baz(List("a", "b").map(Identifier.apply))))), + List(Node.Ident(Identifier("aa"))), + ) + .select(_.bars.baz) + .flatMap(_.names) + ) + + Foo( + List(Bar(Some(Baz(List("a", "b").map(Identifier.apply))))), + List(Node.Ident(Identifier("aa"))), + ) + .select(_.nodes.ident) + // .select(_.nodes.b.names) .pipe(println) } From d156026ec45f6c462b12fe7784abdbe7b98a4f61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 11 Nov 2024 01:51:18 +0100 Subject: [PATCH 073/105] ADT -> Union --- .../src/main/scala/playground/parsergen/IR.scala | 6 +++--- .../main/scala/playground/parsergen/ParserGen.scala | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/IR.scala b/modules/parser-gen/src/main/scala/playground/parsergen/IR.scala index b2105c18..e2c959d7 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/IR.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/IR.scala @@ -6,7 +6,7 @@ import treesittersmithy.NodeType import treesittersmithy.TypeName enum Type { - case ADT(name: TypeName, subtypes: NonEmptyList[Subtype]) + case Union(name: TypeName, subtypes: NonEmptyList[Subtype]) case Product(name: TypeName, fields: List[Field], children: Option[Children]) } @@ -18,11 +18,11 @@ case class Subtype(name: TypeName) object IR { def from(nt: NodeType): Type = - if nt.subtypes.nonEmpty then fromADT(nt) + if nt.subtypes.nonEmpty then fromUnion(nt) else fromProduct(nt) - private def fromADT(nt: NodeType): Type.ADT = Type.ADT( + private def fromUnion(nt: NodeType): Type.Union = Type.Union( name = nt.tpe, subtypes = NonEmptyList.fromListUnsafe(nt.subtypes.map(subtype => Subtype(name = subtype.tpe))), ) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index bf9140e4..a2a022b4 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -34,23 +34,23 @@ extension (tpe: NodeType) { def render: String = IR.from(tpe) match { - case adt: Type.ADT => renderAdt(adt) + case union: Type.Union => renderUnion(union) case product: Type.Product => renderProduct(product) } } -private def renderAdt(adt: Type.ADT): String = { - val name = adt.name.render +private def renderUnion(u: Type.Union): String = { + val name = u.name.render - val projections = adt.subtypes.map { sub => + val projections = u.subtypes.map { sub => // format: off show"""def ${sub.name.renderProjection}: Option[${sub.name.render}] = ${sub.name.render}.unapply(node)""" // format: on } val applyMethod = { - val cases = adt + val cases = u .subtypes .map(nodeType => show"""case ${nodeType.name.render}(node) => Right(node)""") @@ -65,7 +65,7 @@ private def renderAdt(adt: Type.ADT): String = { | |import ${classOf[Node].getName()} | - |opaque type $name <: Node = ${adt.subtypes.map(_.name.render).mkString_(" | ")} + |opaque type $name <: Node = ${u.subtypes.map(_.name.render).mkString_(" | ")} | |object $name { | From abe7c7e255646184475832f09dbf3c2b6fbb1ecb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 11 Nov 2024 02:03:55 +0100 Subject: [PATCH 074/105] refactor for consistency --- .../main/scala/playground/parsergen/ParserGen.scala | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index a2a022b4..d5850a44 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -49,6 +49,11 @@ private def renderUnion(u: Type.Union): String = { // format: on } + val instanceMethods = + show"""extension (node: $name) { + |${projections.mkString_("\n").indentTrim(2)} + |}""".stripMargin + val applyMethod = { val cases = u .subtypes @@ -69,9 +74,7 @@ private def renderUnion(u: Type.Union): String = { | |object $name { | - | extension (node: $name) { - |${projections.mkString_("\n").indentTrim(4)} - | } + |${instanceMethods.indentTrim(2)} | |${applyMethod.indentTrim(2)} | @@ -164,7 +167,7 @@ private def renderProduct(p: Type.Product): String = { show"""def ${fieldType.asChildName.render}: $fieldTypeAnnotation = $childValue""".stripMargin } - val methods = + val instanceMethods = if (fieldGetters.nonEmpty || typedChildren.nonEmpty || typedChildrenPrecise.nonEmpty) { show"""extension (node: $name) { | // fields @@ -185,7 +188,7 @@ private def renderProduct(p: Type.Product): String = { |opaque type $name <: Node = Node | |object $name { - |${methods.indentTrim(2)} + |${instanceMethods.indentTrim(2)} | | def apply(node: Node): Either[String, $name] = | if node.tpe == ${p.name.value.literal} From 9eca761b33e9ab78f240cd81c8bf6f2ff88d4152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 11 Nov 2024 02:19:28 +0100 Subject: [PATCH 075/105] Add typed selectors for real --- .../playground/parsergen/ParserGen.scala | 46 +++++++++++++++++++ .../playground/generated/nodes/Binding.scala | 8 ++++ .../playground/generated/nodes/Boolean_.scala | 6 +++ .../playground/generated/nodes/Comment.scala | 6 +++ .../generated/nodes/Identifier.scala | 6 +++ .../generated/nodes/InputNode.scala | 10 ++++ .../playground/generated/nodes/List_.scala | 7 +++ .../playground/generated/nodes/Null_.scala | 6 +++ .../playground/generated/nodes/Number.scala | 6 +++ .../generated/nodes/OperationName.scala | 8 ++++ .../playground/generated/nodes/Prelude.scala | 7 +++ .../generated/nodes/QualifiedIdentifier.scala | 8 ++++ .../playground/generated/nodes/RunQuery.scala | 8 ++++ .../generated/nodes/SourceFile.scala | 8 ++++ .../playground/generated/nodes/String_.scala | 6 +++ .../playground/generated/nodes/Struct.scala | 7 +++ .../generated/nodes/TopLevelStatement.scala | 7 +++ .../generated/nodes/UseClause.scala | 8 ++++ .../generated/nodes/Whitespace.scala | 6 +++ 19 files changed, 174 insertions(+) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index d5850a44..2a59d887 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -65,10 +65,20 @@ private def renderUnion(u: Type.Union): String = { |}""".stripMargin } + val selectorMethods = u + .subtypes + .map { subtype => + // format: off + show"""def ${subtype.name.asChildName.render} : ${subtype.name.render}.Selector = ${subtype.name.render}.Selector(path.flatMap(_.${subtype.name.renderProjection}))""" + // format: on + } + .mkString_("\n") + show"""// Generated code! Do not modify by hand. |package playground.generated.nodes | |import ${classOf[Node].getName()} + |import playground.treesitter4s.std.Selection | |opaque type $name <: Node = ${u.subtypes.map(_.name.render).mkString_(" | ")} | @@ -79,6 +89,10 @@ private def renderUnion(u: Type.Union): String = { |${applyMethod.indentTrim(2)} | | def unapply(node: Node): Option[$name] = apply(node).toOption + | + | final case class Selector(path: List[$name]) extends Selection[$name] { + |${selectorMethods.indentTrim(4)} + | } |} |""".stripMargin } @@ -170,6 +184,7 @@ private def renderProduct(p: Type.Product): String = { val instanceMethods = if (fieldGetters.nonEmpty || typedChildren.nonEmpty || typedChildrenPrecise.nonEmpty) { show"""extension (node: $name) { + | def select[A](f: $name.Selector => Selection[A]): List[A] = f($name.Selector(List(node))).path | // fields |${fieldGetters.mkString_("\n\n").indentTrim(2)} | // typed children @@ -180,10 +195,36 @@ private def renderProduct(p: Type.Product): String = { } else "" + val selectorMethods = p + .fields + .flatMap { + case field if field.targetTypes.size == 1 => + // format: off + show"""def ${field.name.render}: ${field.targetTypes.head.render}.Selector = ${field.targetTypes.head.render}.Selector(path.flatMap(_.${field.name.render}))""".stripMargin.some + // format: on + + case f => + System + .err + .println( + s"Skipping selector for field ${f.name} in product $name as it has multiple target types" + ) + none + } + .concat( + p.children.toList.flatMap(_.targetTypes.toList).map { tpe => + // format: off + show"""def ${tpe.asChildName.render}: ${tpe.render}.Selector = ${tpe.render}.Selector(path.flatMap(_.${tpe.asChildName.render}))""".stripMargin + // format: on + } + ) + .mkString_("\n") + show"""// Generated code! Do not modify by hand. |package playground.generated.nodes | |import ${classOf[Node].getName()} + |import playground.treesitter4s.std.Selection | |opaque type $name <: Node = Node | @@ -194,8 +235,13 @@ private def renderProduct(p: Type.Product): String = { | if node.tpe == ${p.name.value.literal} | then Right(node) | else Left(s"Expected ${p.name.render}, got $${node.tpe}") + | | def unsafeApply(node: Node): $name = apply(node).fold(sys.error, identity) | def unapply(node: Node): Option[$name] = apply(node).toOption + | + | final case class Selector(path: List[$name]) extends Selection[$name] { + |${selectorMethods.indentTrim(4)} + | } |} |""".stripMargin diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Binding.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Binding.scala index feb5b0f9..6dd4fe60 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Binding.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Binding.scala @@ -2,11 +2,13 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node +import playground.treesitter4s.std.Selection opaque type Binding <: Node = Node object Binding { extension (node: Binding) { + def select[A](f: Binding.Selector => Selection[A]): List[A] = f(Binding.Selector(List(node))).path // fields def key: Option[Identifier] = node.fields.getOrElse("key", Nil).headOption.map { case Identifier(node) => node @@ -25,6 +27,12 @@ object Binding { if node.tpe == "binding" then Right(node) else Left(s"Expected Binding, got ${node.tpe}") + def unsafeApply(node: Node): Binding = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Binding] = apply(node).toOption + + final case class Selector(path: List[Binding]) extends Selection[Binding] { + def key: Identifier.Selector = Identifier.Selector(path.flatMap(_.key)) + def value: InputNode.Selector = InputNode.Selector(path.flatMap(_.value)) + } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Boolean_.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Boolean_.scala index 7533bdb6..7e40ed27 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Boolean_.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Boolean_.scala @@ -2,6 +2,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node +import playground.treesitter4s.std.Selection opaque type Boolean_ <: Node = Node @@ -12,6 +13,11 @@ object Boolean_ { if node.tpe == "boolean" then Right(node) else Left(s"Expected Boolean_, got ${node.tpe}") + def unsafeApply(node: Node): Boolean_ = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Boolean_] = apply(node).toOption + + final case class Selector(path: List[Boolean_]) extends Selection[Boolean_] { + + } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Comment.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Comment.scala index cfe3f4a2..be66020f 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Comment.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Comment.scala @@ -2,6 +2,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node +import playground.treesitter4s.std.Selection opaque type Comment <: Node = Node @@ -12,6 +13,11 @@ object Comment { if node.tpe == "comment" then Right(node) else Left(s"Expected Comment, got ${node.tpe}") + def unsafeApply(node: Node): Comment = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Comment] = apply(node).toOption + + final case class Selector(path: List[Comment]) extends Selection[Comment] { + + } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Identifier.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Identifier.scala index 357f300e..dc1df63a 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Identifier.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Identifier.scala @@ -2,6 +2,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node +import playground.treesitter4s.std.Selection opaque type Identifier <: Node = Node @@ -12,6 +13,11 @@ object Identifier { if node.tpe == "identifier" then Right(node) else Left(s"Expected Identifier, got ${node.tpe}") + def unsafeApply(node: Node): Identifier = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Identifier] = apply(node).toOption + + final case class Selector(path: List[Identifier]) extends Selection[Identifier] { + + } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala index 7e7905ce..6ef7a285 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala @@ -2,6 +2,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node +import playground.treesitter4s.std.Selection opaque type InputNode <: Node = Boolean_ | List_ | Null_ | Number | String_ | Struct @@ -27,4 +28,13 @@ object InputNode { } def unapply(node: Node): Option[InputNode] = apply(node).toOption + + final case class Selector(path: List[InputNode]) extends Selection[InputNode] { + def boolean : Boolean_.Selector = Boolean_.Selector(path.flatMap(_.asBoolean)) + def list : List_.Selector = List_.Selector(path.flatMap(_.asList)) + def `null` : Null_.Selector = Null_.Selector(path.flatMap(_.asNull)) + def number : Number.Selector = Number.Selector(path.flatMap(_.asNumber)) + def string : String_.Selector = String_.Selector(path.flatMap(_.asString)) + def struct : Struct.Selector = Struct.Selector(path.flatMap(_.asStruct)) + } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/List_.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/List_.scala index fb09aa48..e8e82360 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/List_.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/List_.scala @@ -2,11 +2,13 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node +import playground.treesitter4s.std.Selection opaque type List_ <: Node = Node object List_ { extension (node: List_) { + def select[A](f: List_.Selector => Selection[A]): List[A] = f(List_.Selector(List(node))).path // fields def list_fields: List[InputNode] = node.fields.getOrElse("list_fields", Nil).toList.collect { case InputNode(node) => node @@ -21,6 +23,11 @@ object List_ { if node.tpe == "list" then Right(node) else Left(s"Expected List_, got ${node.tpe}") + def unsafeApply(node: Node): List_ = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[List_] = apply(node).toOption + + final case class Selector(path: List[List_]) extends Selection[List_] { + def list_fields: InputNode.Selector = InputNode.Selector(path.flatMap(_.list_fields)) + } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Null_.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Null_.scala index 126d1449..7a7167af 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Null_.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Null_.scala @@ -2,6 +2,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node +import playground.treesitter4s.std.Selection opaque type Null_ <: Node = Node @@ -12,6 +13,11 @@ object Null_ { if node.tpe == "null" then Right(node) else Left(s"Expected Null_, got ${node.tpe}") + def unsafeApply(node: Node): Null_ = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Null_] = apply(node).toOption + + final case class Selector(path: List[Null_]) extends Selection[Null_] { + + } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Number.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Number.scala index 02a9868a..14ab160e 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Number.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Number.scala @@ -2,6 +2,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node +import playground.treesitter4s.std.Selection opaque type Number <: Node = Node @@ -12,6 +13,11 @@ object Number { if node.tpe == "number" then Right(node) else Left(s"Expected Number, got ${node.tpe}") + def unsafeApply(node: Node): Number = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Number] = apply(node).toOption + + final case class Selector(path: List[Number]) extends Selection[Number] { + + } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/OperationName.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/OperationName.scala index 119f5c3b..92238d9c 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/OperationName.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/OperationName.scala @@ -2,11 +2,13 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node +import playground.treesitter4s.std.Selection opaque type OperationName <: Node = Node object OperationName { extension (node: OperationName) { + def select[A](f: OperationName.Selector => Selection[A]): List[A] = f(OperationName.Selector(List(node))).path // fields def identifier: List[QualifiedIdentifier] = node.fields.getOrElse("identifier", Nil).toList.collect { case QualifiedIdentifier(node) => node @@ -25,6 +27,12 @@ object OperationName { if node.tpe == "operation_name" then Right(node) else Left(s"Expected OperationName, got ${node.tpe}") + def unsafeApply(node: Node): OperationName = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[OperationName] = apply(node).toOption + + final case class Selector(path: List[OperationName]) extends Selection[OperationName] { + def identifier: QualifiedIdentifier.Selector = QualifiedIdentifier.Selector(path.flatMap(_.identifier)) + def name: Identifier.Selector = Identifier.Selector(path.flatMap(_.name)) + } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Prelude.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Prelude.scala index fca41947..8e91729a 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Prelude.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Prelude.scala @@ -2,11 +2,13 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node +import playground.treesitter4s.std.Selection opaque type Prelude <: Node = Node object Prelude { extension (node: Prelude) { + def select[A](f: Prelude.Selector => Selection[A]): List[A] = f(Prelude.Selector(List(node))).path // fields // typed children @@ -23,6 +25,11 @@ object Prelude { if node.tpe == "prelude" then Right(node) else Left(s"Expected Prelude, got ${node.tpe}") + def unsafeApply(node: Node): Prelude = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Prelude] = apply(node).toOption + + final case class Selector(path: List[Prelude]) extends Selection[Prelude] { + def use_clause: UseClause.Selector = UseClause.Selector(path.flatMap(_.use_clause)) + } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala index 3e168818..681a8ba8 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala @@ -2,11 +2,13 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node +import playground.treesitter4s.std.Selection opaque type QualifiedIdentifier <: Node = Node object QualifiedIdentifier { extension (node: QualifiedIdentifier) { + def select[A](f: QualifiedIdentifier.Selector => Selection[A]): List[A] = f(QualifiedIdentifier.Selector(List(node))).path // fields def namespace: List[Identifier] = node.fields.getOrElse("namespace", Nil).toList.collect { case Identifier(node) => node @@ -25,6 +27,12 @@ object QualifiedIdentifier { if node.tpe == "qualified_identifier" then Right(node) else Left(s"Expected QualifiedIdentifier, got ${node.tpe}") + def unsafeApply(node: Node): QualifiedIdentifier = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[QualifiedIdentifier] = apply(node).toOption + + final case class Selector(path: List[QualifiedIdentifier]) extends Selection[QualifiedIdentifier] { + def namespace: Identifier.Selector = Identifier.Selector(path.flatMap(_.namespace)) + def selection: Identifier.Selector = Identifier.Selector(path.flatMap(_.selection)) + } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/RunQuery.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/RunQuery.scala index 306f89ea..7d523230 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/RunQuery.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/RunQuery.scala @@ -2,11 +2,13 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node +import playground.treesitter4s.std.Selection opaque type RunQuery <: Node = Node object RunQuery { extension (node: RunQuery) { + def select[A](f: RunQuery.Selector => Selection[A]): List[A] = f(RunQuery.Selector(List(node))).path // fields def input: Option[Struct] = node.fields.getOrElse("input", Nil).headOption.map { case Struct(node) => node @@ -25,6 +27,12 @@ object RunQuery { if node.tpe == "run_query" then Right(node) else Left(s"Expected RunQuery, got ${node.tpe}") + def unsafeApply(node: Node): RunQuery = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[RunQuery] = apply(node).toOption + + final case class Selector(path: List[RunQuery]) extends Selection[RunQuery] { + def input: Struct.Selector = Struct.Selector(path.flatMap(_.input)) + def operation_name: OperationName.Selector = OperationName.Selector(path.flatMap(_.operation_name)) + } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/SourceFile.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/SourceFile.scala index f424c0c9..a2dc071a 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/SourceFile.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/SourceFile.scala @@ -2,11 +2,13 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node +import playground.treesitter4s.std.Selection opaque type SourceFile <: Node = Node object SourceFile { extension (node: SourceFile) { + def select[A](f: SourceFile.Selector => Selection[A]): List[A] = f(SourceFile.Selector(List(node))).path // fields def prelude: Option[Prelude] = node.fields.getOrElse("prelude", Nil).headOption.map { case Prelude(node) => node @@ -25,6 +27,12 @@ object SourceFile { if node.tpe == "source_file" then Right(node) else Left(s"Expected SourceFile, got ${node.tpe}") + def unsafeApply(node: Node): SourceFile = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[SourceFile] = apply(node).toOption + + final case class Selector(path: List[SourceFile]) extends Selection[SourceFile] { + def prelude: Prelude.Selector = Prelude.Selector(path.flatMap(_.prelude)) + def statements: TopLevelStatement.Selector = TopLevelStatement.Selector(path.flatMap(_.statements)) + } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/String_.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/String_.scala index e4ee7771..7eb8e4fb 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/String_.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/String_.scala @@ -2,6 +2,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node +import playground.treesitter4s.std.Selection opaque type String_ <: Node = Node @@ -12,6 +13,11 @@ object String_ { if node.tpe == "string" then Right(node) else Left(s"Expected String_, got ${node.tpe}") + def unsafeApply(node: Node): String_ = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[String_] = apply(node).toOption + + final case class Selector(path: List[String_]) extends Selection[String_] { + + } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Struct.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Struct.scala index 6a447a4e..7789b9a6 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Struct.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Struct.scala @@ -2,11 +2,13 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node +import playground.treesitter4s.std.Selection opaque type Struct <: Node = Node object Struct { extension (node: Struct) { + def select[A](f: Struct.Selector => Selection[A]): List[A] = f(Struct.Selector(List(node))).path // fields def bindings: List[Binding] = node.fields.getOrElse("bindings", Nil).toList.collect { case Binding(node) => node @@ -21,6 +23,11 @@ object Struct { if node.tpe == "struct" then Right(node) else Left(s"Expected Struct, got ${node.tpe}") + def unsafeApply(node: Node): Struct = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Struct] = apply(node).toOption + + final case class Selector(path: List[Struct]) extends Selection[Struct] { + def bindings: Binding.Selector = Binding.Selector(path.flatMap(_.bindings)) + } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/TopLevelStatement.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/TopLevelStatement.scala index a2f6cf16..c7413a88 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/TopLevelStatement.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/TopLevelStatement.scala @@ -2,11 +2,13 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node +import playground.treesitter4s.std.Selection opaque type TopLevelStatement <: Node = Node object TopLevelStatement { extension (node: TopLevelStatement) { + def select[A](f: TopLevelStatement.Selector => Selection[A]): List[A] = f(TopLevelStatement.Selector(List(node))).path // fields // typed children @@ -23,6 +25,11 @@ object TopLevelStatement { if node.tpe == "top_level_statement" then Right(node) else Left(s"Expected TopLevelStatement, got ${node.tpe}") + def unsafeApply(node: Node): TopLevelStatement = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[TopLevelStatement] = apply(node).toOption + + final case class Selector(path: List[TopLevelStatement]) extends Selection[TopLevelStatement] { + def run_query: RunQuery.Selector = RunQuery.Selector(path.flatMap(_.run_query)) + } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/UseClause.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/UseClause.scala index 7f95e541..a2ac751d 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/UseClause.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/UseClause.scala @@ -2,11 +2,13 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node +import playground.treesitter4s.std.Selection opaque type UseClause <: Node = Node object UseClause { extension (node: UseClause) { + def select[A](f: UseClause.Selector => Selection[A]): List[A] = f(UseClause.Selector(List(node))).path // fields def identifier: Option[QualifiedIdentifier] = node.fields.getOrElse("identifier", Nil).headOption.map { case QualifiedIdentifier(node) => node @@ -25,6 +27,12 @@ object UseClause { if node.tpe == "use_clause" then Right(node) else Left(s"Expected UseClause, got ${node.tpe}") + def unsafeApply(node: Node): UseClause = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[UseClause] = apply(node).toOption + + final case class Selector(path: List[UseClause]) extends Selection[UseClause] { + def identifier: QualifiedIdentifier.Selector = QualifiedIdentifier.Selector(path.flatMap(_.identifier)) + def whitespace: Whitespace.Selector = Whitespace.Selector(path.flatMap(_.whitespace)) + } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Whitespace.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Whitespace.scala index d85cc6a3..32528148 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Whitespace.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Whitespace.scala @@ -2,6 +2,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node +import playground.treesitter4s.std.Selection opaque type Whitespace <: Node = Node @@ -12,6 +13,11 @@ object Whitespace { if node.tpe == "whitespace" then Right(node) else Left(s"Expected Whitespace, got ${node.tpe}") + def unsafeApply(node: Node): Whitespace = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[Whitespace] = apply(node).toOption + + final case class Selector(path: List[Whitespace]) extends Selection[Whitespace] { + + } } From 170bebbeb754be1eab0b05217206666e10d38a5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 11 Nov 2024 02:19:43 +0100 Subject: [PATCH 076/105] Remove selector demo --- .../scala/playground/parsergen/demo.scala | 102 ------------------ 1 file changed, 102 deletions(-) delete mode 100644 modules/parser-gen/src/main/scala/playground/parsergen/demo.scala diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/demo.scala b/modules/parser-gen/src/main/scala/playground/parsergen/demo.scala deleted file mode 100644 index a2117145..00000000 --- a/modules/parser-gen/src/main/scala/playground/parsergen/demo.scala +++ /dev/null @@ -1,102 +0,0 @@ -case class Foo(bars: List[Bar], nodes: List[Node]) { - def select[A](f: Foo.Selector => Selection[A]): List[A] = f(Foo.Selector(List(this))).path -} - -object Foo { - - case class Selector(path: List[Foo]) extends Selection[Foo] { - def bars: Bar.Selector = Bar.Selector(path.flatMap(_.bars)) - def nodes: Node.Selector = Node.Selector(path.flatMap(_.nodes)) - } - -} - -case class Bar(baz: Option[Baz]) - -object Bar { - - case class Selector(path: List[Bar]) extends Selection[Bar] { - def baz: Baz.Selector = Baz.Selector(path.flatMap(_.baz)) - - } - -} - -case class Baz(names: List[Identifier]) - -object Baz { - - case class Selector(path: List[Baz]) extends Selection[Baz] { - def names: Identifier.Selector = Identifier.Selector(path.flatMap(_.names)) - } - -} - -case class Identifier(value: String) - -object Identifier { - - case class Selector(path: List[Identifier]) extends Selection[Identifier] -} - -enum Node { - case Ident(i: Identifier) - case B(b: Baz) - - def asIdent: Option[Identifier] = - this match { - case Ident(i) => Some(i) - case _ => None - } - - def asB: Option[Baz] = - this match { - case B(b) => Some(b) - case _ => None - } - -} - -object Node { - - case class Selector(val path: List[Node]) extends Selection[Node] { - def ident: Identifier.Selector = Identifier.Selector(path.flatMap(_.asIdent)) - def b: Baz.Selector = Baz.Selector(path.flatMap(_.asB)) - } - -} - -trait Selection[A] { - def path: List[A] -} - -@main def demo = { - import util.chaining.* - - Foo( - List(Bar(Some(Baz(List("a", "b").map(Identifier.apply))))), - List(Node.Ident(Identifier("aa"))), - ).select(_.bars.baz).pipe(println) - - println( - Foo( - List(Bar(Some(Baz(List("a", "b").map(Identifier.apply))))), - List(Node.Ident(Identifier("aa"))), - ) - .select(_.bars.baz.names) == - Foo( - List(Bar(Some(Baz(List("a", "b").map(Identifier.apply))))), - List(Node.Ident(Identifier("aa"))), - ) - .select(_.bars.baz) - .flatMap(_.names) - ) - - Foo( - List(Bar(Some(Baz(List("a", "b").map(Identifier.apply))))), - List(Node.Ident(Identifier("aa"))), - ) - .select(_.nodes.ident) - // .select(_.nodes.b.names) - .pipe(println) -} From 163325b34699369d54c1b27029674f29a7fa5551 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 11 Nov 2024 02:20:55 +0100 Subject: [PATCH 077/105] Add union unsafeApply and some space --- .../core/src/main/scala/playground/smithyql/RangeIndex.scala | 2 +- .../src/main/scala/playground/parsergen/ParserGen.scala | 3 +++ .../src/main/scala/playground/generated/nodes/Binding.scala | 1 + .../src/main/scala/playground/generated/nodes/Boolean_.scala | 1 + .../src/main/scala/playground/generated/nodes/Comment.scala | 1 + .../src/main/scala/playground/generated/nodes/Identifier.scala | 1 + .../src/main/scala/playground/generated/nodes/InputNode.scala | 2 ++ .../src/main/scala/playground/generated/nodes/List_.scala | 1 + .../src/main/scala/playground/generated/nodes/Null_.scala | 1 + .../src/main/scala/playground/generated/nodes/Number.scala | 1 + .../main/scala/playground/generated/nodes/OperationName.scala | 1 + .../src/main/scala/playground/generated/nodes/Prelude.scala | 1 + .../scala/playground/generated/nodes/QualifiedIdentifier.scala | 1 + .../src/main/scala/playground/generated/nodes/RunQuery.scala | 1 + .../src/main/scala/playground/generated/nodes/SourceFile.scala | 1 + .../src/main/scala/playground/generated/nodes/String_.scala | 1 + .../src/main/scala/playground/generated/nodes/Struct.scala | 1 + .../scala/playground/generated/nodes/TopLevelStatement.scala | 1 + .../src/main/scala/playground/generated/nodes/UseClause.scala | 1 + .../src/main/scala/playground/generated/nodes/Whitespace.scala | 1 + 20 files changed, 23 insertions(+), 1 deletion(-) diff --git a/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala b/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala index 87675dca..e7cf10b9 100644 --- a/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala +++ b/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala @@ -75,7 +75,7 @@ object RangeIndex { } ++ runQuery.input.toList.flatMap { input => inputNodeRanges( - playground.generated.nodes.InputNode(input).toOption.get /* todo */, + playground.generated.nodes.InputNode.unsafeApply(input), root.inQuery(statementIndex).inOperationInput, ) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index 2a59d887..acd60d9c 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -88,6 +88,8 @@ private def renderUnion(u: Type.Union): String = { | |${applyMethod.indentTrim(2)} | + | def unsafeApply(node: Node): $name = apply(node).fold(sys.error, identity) + | | def unapply(node: Node): Option[$name] = apply(node).toOption | | final case class Selector(path: List[$name]) extends Selection[$name] { @@ -237,6 +239,7 @@ private def renderProduct(p: Type.Product): String = { | else Left(s"Expected ${p.name.render}, got $${node.tpe}") | | def unsafeApply(node: Node): $name = apply(node).fold(sys.error, identity) + | | def unapply(node: Node): Option[$name] = apply(node).toOption | | final case class Selector(path: List[$name]) extends Selection[$name] { diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Binding.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Binding.scala index 6dd4fe60..d1c2cad8 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Binding.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Binding.scala @@ -29,6 +29,7 @@ object Binding { else Left(s"Expected Binding, got ${node.tpe}") def unsafeApply(node: Node): Binding = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[Binding] = apply(node).toOption final case class Selector(path: List[Binding]) extends Selection[Binding] { diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Boolean_.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Boolean_.scala index 7e40ed27..cc0353c3 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Boolean_.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Boolean_.scala @@ -15,6 +15,7 @@ object Boolean_ { else Left(s"Expected Boolean_, got ${node.tpe}") def unsafeApply(node: Node): Boolean_ = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[Boolean_] = apply(node).toOption final case class Selector(path: List[Boolean_]) extends Selection[Boolean_] { diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Comment.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Comment.scala index be66020f..98735cdf 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Comment.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Comment.scala @@ -15,6 +15,7 @@ object Comment { else Left(s"Expected Comment, got ${node.tpe}") def unsafeApply(node: Node): Comment = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[Comment] = apply(node).toOption final case class Selector(path: List[Comment]) extends Selection[Comment] { diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Identifier.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Identifier.scala index dc1df63a..05656a1c 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Identifier.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Identifier.scala @@ -15,6 +15,7 @@ object Identifier { else Left(s"Expected Identifier, got ${node.tpe}") def unsafeApply(node: Node): Identifier = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[Identifier] = apply(node).toOption final case class Selector(path: List[Identifier]) extends Selection[Identifier] { diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala index 6ef7a285..834e2424 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala @@ -27,6 +27,8 @@ object InputNode { case _ => Left(s"Expected InputNode, got ${node.tpe}") } + def unsafeApply(node: Node): InputNode = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[InputNode] = apply(node).toOption final case class Selector(path: List[InputNode]) extends Selection[InputNode] { diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/List_.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/List_.scala index e8e82360..838ea215 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/List_.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/List_.scala @@ -25,6 +25,7 @@ object List_ { else Left(s"Expected List_, got ${node.tpe}") def unsafeApply(node: Node): List_ = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[List_] = apply(node).toOption final case class Selector(path: List[List_]) extends Selection[List_] { diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Null_.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Null_.scala index 7a7167af..fe5673e5 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Null_.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Null_.scala @@ -15,6 +15,7 @@ object Null_ { else Left(s"Expected Null_, got ${node.tpe}") def unsafeApply(node: Node): Null_ = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[Null_] = apply(node).toOption final case class Selector(path: List[Null_]) extends Selection[Null_] { diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Number.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Number.scala index 14ab160e..d343a053 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Number.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Number.scala @@ -15,6 +15,7 @@ object Number { else Left(s"Expected Number, got ${node.tpe}") def unsafeApply(node: Node): Number = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[Number] = apply(node).toOption final case class Selector(path: List[Number]) extends Selection[Number] { diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/OperationName.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/OperationName.scala index 92238d9c..1e0d34f1 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/OperationName.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/OperationName.scala @@ -29,6 +29,7 @@ object OperationName { else Left(s"Expected OperationName, got ${node.tpe}") def unsafeApply(node: Node): OperationName = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[OperationName] = apply(node).toOption final case class Selector(path: List[OperationName]) extends Selection[OperationName] { diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Prelude.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Prelude.scala index 8e91729a..56a9ba02 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Prelude.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Prelude.scala @@ -27,6 +27,7 @@ object Prelude { else Left(s"Expected Prelude, got ${node.tpe}") def unsafeApply(node: Node): Prelude = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[Prelude] = apply(node).toOption final case class Selector(path: List[Prelude]) extends Selection[Prelude] { diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala index 681a8ba8..c5baaa49 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala @@ -29,6 +29,7 @@ object QualifiedIdentifier { else Left(s"Expected QualifiedIdentifier, got ${node.tpe}") def unsafeApply(node: Node): QualifiedIdentifier = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[QualifiedIdentifier] = apply(node).toOption final case class Selector(path: List[QualifiedIdentifier]) extends Selection[QualifiedIdentifier] { diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/RunQuery.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/RunQuery.scala index 7d523230..134bff0b 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/RunQuery.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/RunQuery.scala @@ -29,6 +29,7 @@ object RunQuery { else Left(s"Expected RunQuery, got ${node.tpe}") def unsafeApply(node: Node): RunQuery = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[RunQuery] = apply(node).toOption final case class Selector(path: List[RunQuery]) extends Selection[RunQuery] { diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/SourceFile.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/SourceFile.scala index a2dc071a..db4bfc09 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/SourceFile.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/SourceFile.scala @@ -29,6 +29,7 @@ object SourceFile { else Left(s"Expected SourceFile, got ${node.tpe}") def unsafeApply(node: Node): SourceFile = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[SourceFile] = apply(node).toOption final case class Selector(path: List[SourceFile]) extends Selection[SourceFile] { diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/String_.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/String_.scala index 7eb8e4fb..670ca93c 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/String_.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/String_.scala @@ -15,6 +15,7 @@ object String_ { else Left(s"Expected String_, got ${node.tpe}") def unsafeApply(node: Node): String_ = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[String_] = apply(node).toOption final case class Selector(path: List[String_]) extends Selection[String_] { diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Struct.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Struct.scala index 7789b9a6..718c97d8 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Struct.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Struct.scala @@ -25,6 +25,7 @@ object Struct { else Left(s"Expected Struct, got ${node.tpe}") def unsafeApply(node: Node): Struct = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[Struct] = apply(node).toOption final case class Selector(path: List[Struct]) extends Selection[Struct] { diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/TopLevelStatement.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/TopLevelStatement.scala index c7413a88..b45ede13 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/TopLevelStatement.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/TopLevelStatement.scala @@ -27,6 +27,7 @@ object TopLevelStatement { else Left(s"Expected TopLevelStatement, got ${node.tpe}") def unsafeApply(node: Node): TopLevelStatement = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[TopLevelStatement] = apply(node).toOption final case class Selector(path: List[TopLevelStatement]) extends Selection[TopLevelStatement] { diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/UseClause.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/UseClause.scala index a2ac751d..d8671aa4 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/UseClause.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/UseClause.scala @@ -29,6 +29,7 @@ object UseClause { else Left(s"Expected UseClause, got ${node.tpe}") def unsafeApply(node: Node): UseClause = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[UseClause] = apply(node).toOption final case class Selector(path: List[UseClause]) extends Selection[UseClause] { diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Whitespace.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Whitespace.scala index 32528148..3461458b 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Whitespace.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Whitespace.scala @@ -15,6 +15,7 @@ object Whitespace { else Left(s"Expected Whitespace, got ${node.tpe}") def unsafeApply(node: Node): Whitespace = apply(node).fold(sys.error, identity) + def unapply(node: Node): Option[Whitespace] = apply(node).toOption final case class Selector(path: List[Whitespace]) extends Selection[Whitespace] { From c833e17a9f3a89a54cd339f630dc09021cda1063 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 11 Nov 2024 02:25:43 +0100 Subject: [PATCH 078/105] Add typed apply on unions --- .../src/main/scala/playground/smithyql/RangeIndex.scala | 2 +- .../src/main/scala/playground/parsergen/ParserGen.scala | 7 ++++++- .../main/scala/playground/generated/nodes/InputNode.scala | 2 ++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala b/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala index e7cf10b9..67589e2d 100644 --- a/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala +++ b/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala @@ -75,7 +75,7 @@ object RangeIndex { } ++ runQuery.input.toList.flatMap { input => inputNodeRanges( - playground.generated.nodes.InputNode.unsafeApply(input), + playground.generated.nodes.InputNode(input), root.inQuery(statementIndex).inOperationInput, ) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index acd60d9c..19b5bdb5 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -42,6 +42,7 @@ extension (tpe: NodeType) { private def renderUnion(u: Type.Union): String = { val name = u.name.render + val underlyingType = u.subtypes.map(_.name.render).mkString_(" | ") val projections = u.subtypes.map { sub => // format: off @@ -65,6 +66,8 @@ private def renderUnion(u: Type.Union): String = { |}""".stripMargin } + val typedApplyMethod = show"""def apply(node: $underlyingType): $name = node""".stripMargin + val selectorMethods = u .subtypes .map { subtype => @@ -80,7 +83,7 @@ private def renderUnion(u: Type.Union): String = { |import ${classOf[Node].getName()} |import playground.treesitter4s.std.Selection | - |opaque type $name <: Node = ${u.subtypes.map(_.name.render).mkString_(" | ")} + |opaque type $name <: Node = $underlyingType | |object $name { | @@ -88,6 +91,8 @@ private def renderUnion(u: Type.Union): String = { | |${applyMethod.indentTrim(2)} | + |${typedApplyMethod.indentTrim(2)} + | | def unsafeApply(node: Node): $name = apply(node).fold(sys.error, identity) | | def unapply(node: Node): Option[$name] = apply(node).toOption diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala index 834e2424..8229d832 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala @@ -27,6 +27,8 @@ object InputNode { case _ => Left(s"Expected InputNode, got ${node.tpe}") } + def apply(node: Boolean_ | List_ | Null_ | Number | String_ | Struct): InputNode = node + def unsafeApply(node: Node): InputNode = apply(node).fold(sys.error, identity) def unapply(node: Node): Option[InputNode] = apply(node).toOption From e5946c36b00e544423d671949b079aa84257bef9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 11 Nov 2024 02:26:59 +0100 Subject: [PATCH 079/105] format --- .../core/src/main/scala/playground/smithyql/RangeIndex.scala | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala b/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala index 67589e2d..102faaf2 100644 --- a/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala +++ b/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala @@ -55,9 +55,7 @@ object RangeIndex { (binding.key, binding.value).tupled.toList.flatMap { (key, value) => ContextRange( value.range, - base - .inStructBody - .inStructValue(key.source), + base.inStructBody.inStructValue(key.source), ) :: inputNodeRanges(value, base.inStructBody.inStructValue(key.source)) } } From d790595eee6906e16c62fc1d4b57cb7d0ee83742 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 11 Nov 2024 02:35:14 +0100 Subject: [PATCH 080/105] Remove some replaced code, start using selectors --- .../playground/smithyql/RangeIndex.scala | 136 ------------------ .../language/CompletionProvider.scala | 22 +-- 2 files changed, 7 insertions(+), 151 deletions(-) diff --git a/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala b/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala index 102faaf2..5ecdb580 100644 --- a/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala +++ b/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala @@ -85,47 +85,6 @@ object RangeIndex { preludeRanges ++ queryRanges } - def build( - sf: SourceFile[WithSource] - ): RangeIndex = fromRanges { - val path = NodeContext.EmptyPath - - val preludeRanges: List[ContextRange] = sf - .prelude - .useClauses - .toNel - .foldMap { useClauses => - val newBase = path.inPrelude - - ContextRange(useClauses.map(_.range).reduceLeft(_.fakeUnion(_)), newBase) :: - sf.prelude - .useClauses - .mapWithIndex { - ( - uc, - i, - ) => - findInUseClause(uc, newBase.inUseClause(i)) - } - .combineAll - } - - val queryRanges = sf.queries(WithSource.unwrap).zipWithIndex.flatMap { case (rq, index) => - findInQuery(rq.query, path.inQuery(index)) - } - - preludeRanges ++ queryRanges - - // Console - // .err - // .println( - // s"""Found ${allRanges.size} ranges for query ${q.operationName.value.text}: - // |${allRanges - // .map(_.render) - // .mkString("\n")}""".stripMargin - // ) - } - def fromRanges(allRanges: List[ContextRange]): RangeIndex = pos => allRanges @@ -141,101 +100,6 @@ object RangeIndex { .maxByOption(_.ctx.length) .map(_.ctx) - private def findInQuery( - q: WithSource[Query[WithSource]], - path: NodeContext, - ) = { - val qv = q.value - - List(ContextRange(q.range, path)) ++ - findInOperationName(qv.operationName, path.inOperationName) ++ - findInNode(qv.input, path.inOperationInput) - } - - private def findInUseClause( - useClause: WithSource[UseClause[WithSource]], - path: NodeContext, - ): List[ContextRange] = ContextRange(useClause.value.identifier.range, path) :: Nil - - private def findInOperationName( - operationName: WithSource[QueryOperationName[WithSource]], - path: NodeContext, - ): List[ContextRange] = - ContextRange( - operationName.value.operationName.range, - path, - ) :: Nil - - private def findInNode( - node: WithSource[InputNode[WithSource]], - ctx: NodeContext, - ): List[ContextRange] = { - def entireNode( - ctx: NodeContext - ) = ContextRange(node.range, ctx) - - val default = Function.const( - // Default case: can be triggered e.g. inside a string literal - // which would affect completions of enum values and timestamps. - entireNode(ctx) :: Nil - ) - - node - .value - .fold( - listed = l => entireNode(ctx) :: findInList(l, ctx), - struct = s => entireNode(ctx) :: findInStruct(s, ctx.inStructBody), - string = { _ => - val inQuotes = ContextRange( - node.range.shrink1, - ctx.inQuotes, - ) - - inQuotes :: entireNode(ctx) :: Nil - }, - int = default, - bool = default, - nul = default, - ) - - } - - private def findInList( - list: Listed[WithSource], - ctx: NodeContext, - ): List[ContextRange] = { - val inItems = list - .values - .value - .zipWithIndex - .flatMap { case (entry, index) => findInNode(entry, ctx.inCollectionEntry(index.some)) } - - val inBody = ContextRange( - list - .values - .range, - ctx.inCollectionEntry(None), - ) - - inBody :: inItems - } - - private def findInStruct( - struct: Struct[WithSource], - ctx: NodeContext, - ): List[ContextRange] = { - // Struct fields that allow nesting in them - val inFields = struct - .fields - .value - .value - .flatMap { binding => - findInNode(binding.value, ctx.inStructValue(binding.identifier.value.text)) - } - - ContextRange(struct.fields.range, ctx) :: inFields - } - } case class ContextRange( diff --git a/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala b/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala index 8ee26804..d4e31d2e 100644 --- a/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala +++ b/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala @@ -80,10 +80,7 @@ object CompletionProvider { // there's definitely a test missing for N>1 clauses. // https://github.com/kubukoz/smithy-playground/issues/161 val presentServiceIds: List[QualifiedIdentifier] = file - .prelude - .toList - .flatMap(_.use_clause) - .flatMap(_.identifier) + .select(_.prelude.use_clause.identifier) .flatMap(ASTAdapter.decodeQI) // for operations on root level we show: @@ -122,13 +119,10 @@ object CompletionProvider { case Some(serviceId) => // includes the current query's service reference // as it wouldn't result in ading a use clause - val presentServiceIdentifiers = - q.operation_name.toList.flatMap(_.identifier).flatMap(ASTAdapter.decodeQI) ++ - sf.prelude - .toList - .flatMap(_.use_clause) - .flatMap(_.identifier) - .flatMap(ASTAdapter.decodeQI) + val presentServiceIdentifiers = { + q.select(_.operation_name.identifier) ++ + sf.select(_.prelude.use_clause.identifier) + }.flatMap(ASTAdapter.decodeQI) completeOperationName( serviceId, @@ -149,7 +143,7 @@ object CompletionProvider { .resolveServiceTs( operationName, serviceIndex, - sf.prelude.toList.flatMap(_.use_clause), + sf.select(_.prelude.use_clause), ) .toOption @@ -160,9 +154,7 @@ object CompletionProvider { case NodeContext.PathEntry.AtOperationInput ^^: ctx => resolvedServiceId match { case Some(serviceId) => - q.operation_name - .toList - .flatMap(_.name) + q.select(_.operation_name.name) .map(id => OperationName[Id](id.source)) .flatMap { inputCompletions(serviceId)(_) From e2809c8382db9349150c719ac106c789d522416a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 11 Nov 2024 02:37:01 +0100 Subject: [PATCH 081/105] renames --- .../playground/language/CompletionProvider.scala | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala b/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala index d4e31d2e..65338216 100644 --- a/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala +++ b/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala @@ -72,7 +72,7 @@ object CompletionProvider { .toList } - def completeRootOperationNameTs( + def completeRootOperationName( file: playground.generated.nodes.SourceFile, insertBodyStruct: CompletionItem.InsertBodyStruct, ) = { @@ -110,7 +110,7 @@ object CompletionProvider { } // we're definitely in an existing query, so we don't insert a brace in either case. - def completeOperationNameForTs( + def completeOperationNameFor( q: playground.generated.nodes.RunQuery, sf: playground.generated.nodes.SourceFile, serviceId: Option[QualifiedIdentifier], @@ -130,10 +130,10 @@ object CompletionProvider { CompletionItem.InsertBodyStruct.No, ) - case None => completeRootOperationNameTs(sf, CompletionItem.InsertBodyStruct.No) + case None => completeRootOperationName(sf, CompletionItem.InsertBodyStruct.No) } - def completeInQueryTs( + def completeInQuery( q: playground.generated.nodes.RunQuery, sf: playground.generated.nodes.SourceFile, ctx: NodeContext, @@ -149,7 +149,7 @@ object CompletionProvider { ctx match { case NodeContext.PathEntry.AtOperationName ^^: EmptyPath => - completeOperationNameForTs(q, sf, resolvedServiceId) + completeOperationNameFor(q, sf, resolvedServiceId) case NodeContext.PathEntry.AtOperationInput ^^: ctx => resolvedServiceId match { @@ -193,7 +193,7 @@ object CompletionProvider { .get(n.toLong) .getOrElse(sys.error(s"Fatal error: no query at index $n")) - completeInQueryTs(q, parsedTs, rest) + completeInQuery(q, parsedTs, rest) case NodeContext.PathEntry.AtPrelude ^^: NodeContext.PathEntry.AtUseClause(_) ^^: @@ -204,7 +204,7 @@ object CompletionProvider { .map(CompletionItem.useServiceClause.tupled) case EmptyPath => - completeRootOperationNameTs( + completeRootOperationName( parsedTs, CompletionItem.InsertBodyStruct.Yes, ) From bcc6a66e8c60a5a34f5aea8852d0edca68746169 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 11 Nov 2024 02:37:23 +0100 Subject: [PATCH 082/105] remove monoid --- .../src/main/scala/playground/smithyql/RangeIndex.scala | 6 ------ 1 file changed, 6 deletions(-) diff --git a/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala b/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala index 5ecdb580..e359ba3f 100644 --- a/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala +++ b/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala @@ -1,6 +1,5 @@ package playground.smithyql -import cats.kernel.Monoid import cats.syntax.all.* import tsutils.* import util.chaining.* @@ -15,11 +14,6 @@ trait RangeIndex { object RangeIndex { - given Monoid[RangeIndex] = Monoid.instance( - _ => None, - (a, b) => pos => a.findAtPosition(pos).orElse(b.findAtPosition(pos)), - ) - def build(parsed: playground.generated.nodes.SourceFile): RangeIndex = fromRanges { val root = NodeContext.EmptyPath From 40455a34c7b3d2d249bffb1e5bccf82b8e7fd3fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 11 Nov 2024 02:39:17 +0100 Subject: [PATCH 083/105] update ci --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bc0e1687..b12178df 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -73,4 +73,4 @@ jobs: jvm: adoptium:1.21 - name: Parser tests # intentionally not setting up nix - run: sbt parser/run + run: sbt treesitter/test From 5458c9b35bf6a247fbbe721cde5c67f798c45178 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 11 Nov 2024 02:40:32 +0100 Subject: [PATCH 084/105] use ts4s 0.4.0 --- build.sbt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index 2843e62f..10326736 100644 --- a/build.sbt +++ b/build.sbt @@ -128,7 +128,7 @@ lazy val parser = module("parser") lazy val treesitter = module("treesitter") .settings( libraryDependencies ++= Seq( - "org.polyvariant.treesitter4s" %% "core" % "0.3-460753c-SNAPSHOT" + "org.polyvariant.treesitter4s" %% "core" % "0.4.0" ) ) @@ -138,7 +138,7 @@ lazy val parsergen = module("parser-gen") "dev.optics" %% "monocle-core" % "3.3.0", "com.disneystreaming.smithy4s" %% "smithy4s-json" % smithy4sVersion.value, ("org.scalameta" %% "scalameta" % "4.11.0").cross(CrossVersion.for3Use2_13), - "org.polyvariant.treesitter4s" %% "core" % "0.3-460753c-SNAPSHOT", + "org.polyvariant.treesitter4s" %% "core" % "0.4.0", ), scalacOptions -= "-release:11", ) From 08fbbd6122154db0d8504c350841b006e779c306 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 11 Nov 2024 02:50:31 +0100 Subject: [PATCH 085/105] More powerful select --- .../playground/parsergen/ParserGen.scala | 6 ++ .../playground/generated/nodes/Binding.scala | 3 + .../playground/generated/nodes/Boolean_.scala | 3 + .../playground/generated/nodes/Comment.scala | 3 + .../generated/nodes/Identifier.scala | 3 + .../generated/nodes/InputNode.scala | 3 + .../playground/generated/nodes/List_.scala | 3 + .../playground/generated/nodes/Null_.scala | 3 + .../playground/generated/nodes/Number.scala | 3 + .../generated/nodes/OperationName.scala | 3 + .../playground/generated/nodes/Prelude.scala | 3 + .../generated/nodes/QualifiedIdentifier.scala | 3 + .../playground/generated/nodes/RunQuery.scala | 3 + .../generated/nodes/SourceFile.scala | 3 + .../playground/generated/nodes/String_.scala | 3 + .../playground/generated/nodes/Struct.scala | 3 + .../generated/nodes/TopLevelStatement.scala | 3 + .../generated/nodes/UseClause.scala | 3 + .../generated/nodes/Whitespace.scala | 3 + .../treesitter4s/std/Selection.scala | 5 ++ .../parser/v3/TreeSitterParserTests.scala | 68 +++++++------------ 21 files changed, 91 insertions(+), 42 deletions(-) diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index 19b5bdb5..c85a2f12 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -99,6 +99,9 @@ private def renderUnion(u: Type.Union): String = { | | final case class Selector(path: List[$name]) extends Selection[$name] { |${selectorMethods.indentTrim(4)} + | + | type Self = Selector + | protected val remake = Selector.apply | } |} |""".stripMargin @@ -249,6 +252,9 @@ private def renderProduct(p: Type.Product): String = { | | final case class Selector(path: List[$name]) extends Selection[$name] { |${selectorMethods.indentTrim(4)} + | + | type Self = Selector + | protected val remake = Selector.apply | } |} |""".stripMargin diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Binding.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Binding.scala index d1c2cad8..ecfb9bfd 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Binding.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Binding.scala @@ -35,5 +35,8 @@ object Binding { final case class Selector(path: List[Binding]) extends Selection[Binding] { def key: Identifier.Selector = Identifier.Selector(path.flatMap(_.key)) def value: InputNode.Selector = InputNode.Selector(path.flatMap(_.value)) + + type Self = Selector + protected val remake = Selector.apply } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Boolean_.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Boolean_.scala index cc0353c3..295034fc 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Boolean_.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Boolean_.scala @@ -20,5 +20,8 @@ object Boolean_ { final case class Selector(path: List[Boolean_]) extends Selection[Boolean_] { + + type Self = Selector + protected val remake = Selector.apply } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Comment.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Comment.scala index 98735cdf..936272cf 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Comment.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Comment.scala @@ -20,5 +20,8 @@ object Comment { final case class Selector(path: List[Comment]) extends Selection[Comment] { + + type Self = Selector + protected val remake = Selector.apply } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Identifier.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Identifier.scala index 05656a1c..e942fe9b 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Identifier.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Identifier.scala @@ -20,5 +20,8 @@ object Identifier { final case class Selector(path: List[Identifier]) extends Selection[Identifier] { + + type Self = Selector + protected val remake = Selector.apply } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala index 8229d832..85038b68 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala @@ -40,5 +40,8 @@ object InputNode { def number : Number.Selector = Number.Selector(path.flatMap(_.asNumber)) def string : String_.Selector = String_.Selector(path.flatMap(_.asString)) def struct : Struct.Selector = Struct.Selector(path.flatMap(_.asStruct)) + + type Self = Selector + protected val remake = Selector.apply } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/List_.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/List_.scala index 838ea215..679214ff 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/List_.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/List_.scala @@ -30,5 +30,8 @@ object List_ { final case class Selector(path: List[List_]) extends Selection[List_] { def list_fields: InputNode.Selector = InputNode.Selector(path.flatMap(_.list_fields)) + + type Self = Selector + protected val remake = Selector.apply } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Null_.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Null_.scala index fe5673e5..5e438bb4 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Null_.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Null_.scala @@ -20,5 +20,8 @@ object Null_ { final case class Selector(path: List[Null_]) extends Selection[Null_] { + + type Self = Selector + protected val remake = Selector.apply } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Number.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Number.scala index d343a053..66014bb1 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Number.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Number.scala @@ -20,5 +20,8 @@ object Number { final case class Selector(path: List[Number]) extends Selection[Number] { + + type Self = Selector + protected val remake = Selector.apply } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/OperationName.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/OperationName.scala index 1e0d34f1..59c9fad5 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/OperationName.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/OperationName.scala @@ -35,5 +35,8 @@ object OperationName { final case class Selector(path: List[OperationName]) extends Selection[OperationName] { def identifier: QualifiedIdentifier.Selector = QualifiedIdentifier.Selector(path.flatMap(_.identifier)) def name: Identifier.Selector = Identifier.Selector(path.flatMap(_.name)) + + type Self = Selector + protected val remake = Selector.apply } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Prelude.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Prelude.scala index 56a9ba02..f5fd7dbd 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Prelude.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Prelude.scala @@ -32,5 +32,8 @@ object Prelude { final case class Selector(path: List[Prelude]) extends Selection[Prelude] { def use_clause: UseClause.Selector = UseClause.Selector(path.flatMap(_.use_clause)) + + type Self = Selector + protected val remake = Selector.apply } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala index c5baaa49..0cde7e20 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/QualifiedIdentifier.scala @@ -35,5 +35,8 @@ object QualifiedIdentifier { final case class Selector(path: List[QualifiedIdentifier]) extends Selection[QualifiedIdentifier] { def namespace: Identifier.Selector = Identifier.Selector(path.flatMap(_.namespace)) def selection: Identifier.Selector = Identifier.Selector(path.flatMap(_.selection)) + + type Self = Selector + protected val remake = Selector.apply } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/RunQuery.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/RunQuery.scala index 134bff0b..aa507209 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/RunQuery.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/RunQuery.scala @@ -35,5 +35,8 @@ object RunQuery { final case class Selector(path: List[RunQuery]) extends Selection[RunQuery] { def input: Struct.Selector = Struct.Selector(path.flatMap(_.input)) def operation_name: OperationName.Selector = OperationName.Selector(path.flatMap(_.operation_name)) + + type Self = Selector + protected val remake = Selector.apply } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/SourceFile.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/SourceFile.scala index db4bfc09..dba19b71 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/SourceFile.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/SourceFile.scala @@ -35,5 +35,8 @@ object SourceFile { final case class Selector(path: List[SourceFile]) extends Selection[SourceFile] { def prelude: Prelude.Selector = Prelude.Selector(path.flatMap(_.prelude)) def statements: TopLevelStatement.Selector = TopLevelStatement.Selector(path.flatMap(_.statements)) + + type Self = Selector + protected val remake = Selector.apply } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/String_.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/String_.scala index 670ca93c..dc03603d 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/String_.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/String_.scala @@ -20,5 +20,8 @@ object String_ { final case class Selector(path: List[String_]) extends Selection[String_] { + + type Self = Selector + protected val remake = Selector.apply } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Struct.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Struct.scala index 718c97d8..5523d639 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Struct.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Struct.scala @@ -30,5 +30,8 @@ object Struct { final case class Selector(path: List[Struct]) extends Selection[Struct] { def bindings: Binding.Selector = Binding.Selector(path.flatMap(_.bindings)) + + type Self = Selector + protected val remake = Selector.apply } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/TopLevelStatement.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/TopLevelStatement.scala index b45ede13..26f9468f 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/TopLevelStatement.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/TopLevelStatement.scala @@ -32,5 +32,8 @@ object TopLevelStatement { final case class Selector(path: List[TopLevelStatement]) extends Selection[TopLevelStatement] { def run_query: RunQuery.Selector = RunQuery.Selector(path.flatMap(_.run_query)) + + type Self = Selector + protected val remake = Selector.apply } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/UseClause.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/UseClause.scala index d8671aa4..6d7c13b2 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/UseClause.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/UseClause.scala @@ -35,5 +35,8 @@ object UseClause { final case class Selector(path: List[UseClause]) extends Selection[UseClause] { def identifier: QualifiedIdentifier.Selector = QualifiedIdentifier.Selector(path.flatMap(_.identifier)) def whitespace: Whitespace.Selector = Whitespace.Selector(path.flatMap(_.whitespace)) + + type Self = Selector + protected val remake = Selector.apply } } diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/Whitespace.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/Whitespace.scala index 3461458b..ee663890 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/Whitespace.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/Whitespace.scala @@ -20,5 +20,8 @@ object Whitespace { final case class Selector(path: List[Whitespace]) extends Selection[Whitespace] { + + type Self = Selector + protected val remake = Selector.apply } } diff --git a/modules/treesitter/src/main/scala/playground/treesitter4s/std/Selection.scala b/modules/treesitter/src/main/scala/playground/treesitter4s/std/Selection.scala index 34adddc0..fbf2016a 100644 --- a/modules/treesitter/src/main/scala/playground/treesitter4s/std/Selection.scala +++ b/modules/treesitter/src/main/scala/playground/treesitter4s/std/Selection.scala @@ -1,5 +1,10 @@ package playground.treesitter4s.std trait Selection[A] { + type Self <: Selection[A] def path: List[A] + protected def remake: List[A] => Self + + def transform(f: List[A] => List[A]): Self = remake(f(path)) + def find(f: A => Boolean): Self = transform(_.find(f).toList) } diff --git a/modules/treesitter/src/test/scala/playground/smithyql/parser/v3/TreeSitterParserTests.scala b/modules/treesitter/src/test/scala/playground/smithyql/parser/v3/TreeSitterParserTests.scala index cbea6aaf..42ec3381 100644 --- a/modules/treesitter/src/test/scala/playground/smithyql/parser/v3/TreeSitterParserTests.scala +++ b/modules/treesitter/src/test/scala/playground/smithyql/parser/v3/TreeSitterParserTests.scala @@ -50,29 +50,20 @@ object TreeSitterParserTests extends FunSuite { val in = parse("""use service foo.bar.baz.bax#Baz |GetBaz { a = { x = 42 } }""".stripMargin) - // this ain't pretty huh - // watch out for the upcoming lookup DSL val valueOfX = - in.statements - .head - .run_query - .get - .input - .get - .bindings - .find(_.key.get.source == "a") - .get - .value - .get - .asStruct - .get - .bindings - .find(_.key.get.source == "x") - .get - .value - .get - .asNumber - .get + in.select( + _.statements + .run_query + .input + .bindings + .find(_.key.get.source == "a") + .value + .struct + .bindings + .find(_.key.get.source == "x") + .value + .number + ).head .source .toInt @@ -86,26 +77,19 @@ object TreeSitterParserTests extends FunSuite { // this ain't pretty huh // watch out for the upcoming lookup DSL val valueOfX = - in.statements - .head - .run_query - .get - .input - .get - .bindings - .find(_.key.get.source == "a") - .get - .value - .get - .asStruct - .get - .bindings - .find(_.key.get.source == "x") - .get - .value - .get - .asNumber - .get + in.select( + _.statements + .run_query + .input + .bindings + .find(_.key.get.source == "a") + .value + .struct + .bindings + .find(_.key.get.source == "x") + .value + .number + ).head .source .toInt From a8a2b9054fa299bfad74b6618e4c7f2048e82421 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 11 Nov 2024 03:00:55 +0100 Subject: [PATCH 086/105] Fix e2e --- build.sbt | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 10326736..825dccff 100644 --- a/build.sbt +++ b/build.sbt @@ -243,11 +243,24 @@ lazy val e2e = module("e2e") .task { s"""${(lsp / organization).value}::${(lsp / moduleName).value}:${(lsp / version).value}""" } - .dependsOn(lsp / publishLocal) + // todo: replace with a full publishLocal before e2e in particular gets run (but not before tests run normally) + .dependsOn( + lsp / publishLocal, + languageSupport / publishLocal, + core / publishLocal, + parser / publishLocal, + pluginCore / publishLocal, + source / publishLocal, + treesitter / publishLocal, + ast / publishLocal, + formatter / publishLocal, + protocol4s / publishLocal, + ) .taskValue .named("lspArtifact") ), publish / skip := true, + Test / fork := true, ) .dependsOn(lsp) From d3fc9884c74610cc8c840299579fba7ea715a355 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Mon, 11 Nov 2024 16:44:34 +0100 Subject: [PATCH 087/105] Small grammar refactor --- flake.nix | 16 ++++++- .../playground/MultiServiceResolver.scala | 7 ++- .../libtree-sitter-smithyql.dylib | Bin 34384 -> 34384 bytes .../libtree-sitter-smithyql.dylib | Bin 16456 -> 16456 bytes .../linux-aarch64/libtree-sitter-smithyql.so | Bin 67368 -> 67368 bytes .../linux-x86-64/libtree-sitter-smithyql.so | Bin 18304 -> 18304 bytes .../generated/nodes/OperationName.scala | 15 +++---- .../generated/nodes/QueryOperationName.scala | 42 ++++++++++++++++++ .../playground/generated/nodes/RunQuery.scala | 6 +-- tree-sitter-smithyql/grammar.js | 11 +++-- update-libs.sh | 23 ++-------- 11 files changed, 81 insertions(+), 39 deletions(-) create mode 100644 modules/treesitter/src/main/scala/playground/generated/nodes/QueryOperationName.scala diff --git a/flake.nix b/flake.nix index 9100e492..0ee4b41b 100644 --- a/flake.nix +++ b/flake.nix @@ -4,7 +4,7 @@ flake-utils.url = "github:numtide/flake-utils"; }; - outputs = { nixpkgs, flake-utils, ... }: + outputs = { self, nixpkgs, flake-utils, ... }: flake-utils.lib.eachDefaultSystem ( system: let @@ -38,6 +38,20 @@ cp libtree-sitter-smithyql.so $out ''; }; + packages.tree-sitter-smithyql-all = + pkgs.stdenv.mkDerivation { + name = "tree-sitter-smithyql-all"; + src = ./tree-sitter-smithyql; + dontBuild=true; + installPhase = '' + mkdir $out + cd $out + mkdir darwin-aarch64 && cp ${self.packages.aarch64-darwin.tree-sitter-smithyql} darwin-aarch64/libtree-sitter-smithyql.dylib + mkdir darwin-x86-64 && cp ${self.packages.x86_64-darwin.tree-sitter-smithyql} darwin-x86-64/libtree-sitter-smithyql.dylib + mkdir linux-aarch64 && cp ${self.packages.aarch64-linux.tree-sitter-smithyql} linux-aarch64/libtree-sitter-smithyql.so + mkdir linux-x86-64 && cp ${self.packages.x86_64-linux.tree-sitter-smithyql} linux-x86-64/libtree-sitter-smithyql.so + ''; + }; } ); } diff --git a/modules/core/src/main/scala/playground/MultiServiceResolver.scala b/modules/core/src/main/scala/playground/MultiServiceResolver.scala index 5c088bcb..3bf99981 100644 --- a/modules/core/src/main/scala/playground/MultiServiceResolver.scala +++ b/modules/core/src/main/scala/playground/MultiServiceResolver.scala @@ -54,7 +54,7 @@ object MultiServiceResolver { * perform a check on that. For the actual check, see PreludeCompiler. */ def resolveServiceTs( - queryOperationName: playground.generated.nodes.OperationName, + queryOperationName: playground.generated.nodes.QueryOperationName, serviceIndex: ServiceIndex, useClauses: List[playground.generated.nodes.UseClause], ): EitherNel[CompilationError, QualifiedIdentifier] = @@ -104,7 +104,7 @@ object MultiServiceResolver { private def resolveExplicitTs( index: ServiceIndex, explicitRef: playground.generated.nodes.QualifiedIdentifier, - operationName: playground.generated.nodes.Identifier, + operationName: playground.generated.nodes.OperationName, ): EitherNel[CompilationError, QualifiedIdentifier] = ASTAdapter.decodeQI(explicitRef) match { case None => ??? /* todo - I don't really know xD */ @@ -161,8 +161,7 @@ object MultiServiceResolver { } private def resolveImplicitTs( - // todo: introduce type wrapper for OperationName, rename current to QueryOperationName - operationName: playground.generated.nodes.Identifier, + operationName: playground.generated.nodes.OperationName, index: ServiceIndex, useClauses: List[playground.generated.nodes.UseClause], ): EitherNel[CompilationError, QualifiedIdentifier] = { diff --git a/modules/treesitter/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib b/modules/treesitter/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib index 98da03f4986e206f46f759233bc6f083be7b786a..e3aaaeb01fae26f1d6ed48b2d38998bb20c48540 100755 GIT binary patch delta 3241 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 PuRpJTArNmGDl-2AQYvTx diff --git a/modules/treesitter/src/main/resources/darwin-x86-64/libtree-sitter-smithyql.dylib b/modules/treesitter/src/main/resources/darwin-x86-64/libtree-sitter-smithyql.dylib index 9795d5d136bee64ebe1410531c8c21b69c7393fc..524f73ef7e029eabaf489380782cc69b6cdb5f81 100755 GIT binary patch delta 3197 zcmb7HeQXp(6o0e3cfD)x%F*`vb#1w?_Kx=2UJHT+wXMdK4+DxyNKk5H8mt7`5=5-v zHHIKjqm=Q37@{>0O^}$A(|?Q#e_(<}jfs*NBhio;kzj!Wn5uJaj)3Tlx z7GIKmqCcGPw$$wwk(O!6%exPSgU^Kb8ai|HV{V*Ivv{(Szd=_}6Aesly34+sIWSqgw1! zb4=~H2O=+a=7(d^o^jbd)MZYWMK5TPYf^ho4_ybl*F3oZsU1hD8~p-jEnPku_2>Gq z3cqNGgV{zA5F^R1uNsPnCOS#Ga z4A@~_kg6x^1#E|Rv$Lp9JD~&Si&cDeip%XnbU7k*zBKoBnSNRGa@N98)nhSqqxo!< zSf=ny6p&Zq&AD+rd*QFsV`c)XN+V8M8cmy4`)o9N9NJqlz8Bh4qW3}jO0-pZ#rXa1 z`EI5s-3EFZx|qC1&p?+hZ~$5_S>T{NnFxoUgSFa>6F7z!OhxjCL@ZapRzCxN1Pl~p zEf5E~fC1nRU=y$f*bO`h90Fbg^1!>m8Q@FcJa8HK1MuMtYk?%t3)}##0`3Gh0b{^+ zjaJhhJnRFW1r7nP0>^-NfcJq9flq<6z&YT1;3wcW;4i?V69s`9edbDy%%;8ao8)4T zAKUTDaO+|DW^0c;ky;}U8b{^nwyeC+7VvObda*vC+TWcv(I|mSC18NKT%MUu@L(Z7iYWm{+uy$u38r$vN z2oZCwp?>Glbq7#OU^s9b@C$hPRDu9X;|!mypN1n}X_-P~C*Wq&(Z58mz=q8c`JG@MU|z>;9Rks2)|DJL!Fs33 zxYa2(>|=h4+0NA7;qz>Nh51-vruX5XmL8Pl1Mw#H>dr>2|2~|;4_n@AP?U4{2X5OD AC;$Ke delta 2975 zcma)8Yitx%6h3!$cDsFSDZAa>w)@^~cUstOmr{Y!fPg_X#uiO6@`xZI#Gqm^D)@&j zgb-qU&>n-PG14DCA~qDQF(w+Li9x~-LSiKPL*<7U6A}ay6CWh{-8*+?cN-GCo9}#c zUU$wt_s-0o8yDxs#qndobTg@Oae>Y0=837*;p+)oYihAs>LzDAG4_k}!kb0gIxB3x z$%Ep~@JyerZM2D`Zty}YH8&%^5-kTx|ID6xdHLa)vs;Fz#L2(r#y#lqlKQyjJ=0cHub&W|96r&PknqNu8a$)jNoD!5FKQ+SYr2u3dg(3Z9 zLB?cUy&K0j5@D}vPq=pEROjD5Vv#d4C*BL6Pjw^3k7h%BHeD#o ztm?>774wjqr46#HYL?B=J+uwdM9&3PFX|EKaxwNs@6d&tWVd7IEpk-<`KhdT(=O!M z-8X4BB7O82WIYZ_?fv&a_tO)~7lN#=ySnZ2Fm}on4(_d**>2t#e7Xm2wI_!DTrW=DW-U;tPTJP2$D#(;ysi@*tB8aNGn z2Al^j0Y3xRfSW)ATG|F=ffBG9*Z^z1#)fIkeL>b%?QL+$l^rSlCw($&keT_Zecp5V9gCBB?D1MTq2(ILT0tmvd= zP6|JpR-D%uCYLOeH(E{nu+=&#Ol2B_X@%9~m8pVn{=(h5>?zhyPM~U z!&C3h!@u@qmKoAknOnY%Yju2kG2A(X+&RJf7u~nX{@yzt!u!5DQl9*3U3ikUx`@rw zGg4=(kQ>G8zGl66j4&#Fv2~(?imTW=Rh(KwO}@1A@Z#)(O0i32C@)yl;S;JZ{;ANu zREV@RyQ`JEQ>_b+{5R9&`h}6?t%X%M@+sJPxX@82Jo2)UM~X2%Uub53F(}gfejz1R z@YOp?u z+&cVmt?$$PtmZ?Sk7{l+ov?YJvY(6KVVqvxM58;E+66PxcvuvO_b=2&!n`y GE%YDA(hBAP diff --git a/modules/treesitter/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so b/modules/treesitter/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so index f10c8cc62700205b4f632c2ea2c3df891126cf27..5d9b2881d9be6182296108195ae35fb549acc4a1 100755 GIT binary patch delta 4715 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 W@_#9Xt8OHpmxqw~UvUp_=l=m>PaiA* diff --git a/modules/treesitter/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so b/modules/treesitter/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so index de6b4768995a4e7f625dc0fe82bc5e300e63dd73..949eb4f1be660d8aaeb824cabd39a19472e5cb8c 100755 GIT binary patch delta 4609 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 O#+Je}m)~|@oc|XPX5KXb diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/OperationName.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/OperationName.scala index 59c9fad5..f5ad7ad4 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/OperationName.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/OperationName.scala @@ -10,17 +10,15 @@ object OperationName { extension (node: OperationName) { def select[A](f: OperationName.Selector => Selection[A]): List[A] = f(OperationName.Selector(List(node))).path // fields - def identifier: List[QualifiedIdentifier] = node.fields.getOrElse("identifier", Nil).toList.collect { - case QualifiedIdentifier(node) => node - } - def name: Option[Identifier] = node.fields.getOrElse("name", Nil).headOption.map { + // typed children + def typedChildren: Option[Identifier] = node.children.collectFirst { case Identifier(node) => node } - // typed children - // precise typed children - + def identifier: Option[Identifier] = node.children.collectFirst { + case Identifier(node) => node + } } def apply(node: Node): Either[String, OperationName] = @@ -33,8 +31,7 @@ object OperationName { def unapply(node: Node): Option[OperationName] = apply(node).toOption final case class Selector(path: List[OperationName]) extends Selection[OperationName] { - def identifier: QualifiedIdentifier.Selector = QualifiedIdentifier.Selector(path.flatMap(_.identifier)) - def name: Identifier.Selector = Identifier.Selector(path.flatMap(_.name)) + def identifier: Identifier.Selector = Identifier.Selector(path.flatMap(_.identifier)) type Self = Selector protected val remake = Selector.apply diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/QueryOperationName.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/QueryOperationName.scala new file mode 100644 index 00000000..6e4ba9ad --- /dev/null +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/QueryOperationName.scala @@ -0,0 +1,42 @@ +// Generated code! Do not modify by hand. +package playground.generated.nodes + +import org.polyvariant.treesitter4s.Node +import playground.treesitter4s.std.Selection + +opaque type QueryOperationName <: Node = Node + +object QueryOperationName { + extension (node: QueryOperationName) { + def select[A](f: QueryOperationName.Selector => Selection[A]): List[A] = f(QueryOperationName.Selector(List(node))).path + // fields + def identifier: List[QualifiedIdentifier] = node.fields.getOrElse("identifier", Nil).toList.collect { + case QualifiedIdentifier(node) => node + } + + def name: Option[OperationName] = node.fields.getOrElse("name", Nil).headOption.map { + case OperationName(node) => node + } + // typed children + + // precise typed children + + } + + def apply(node: Node): Either[String, QueryOperationName] = + if node.tpe == "query_operation_name" + then Right(node) + else Left(s"Expected QueryOperationName, got ${node.tpe}") + + def unsafeApply(node: Node): QueryOperationName = apply(node).fold(sys.error, identity) + + def unapply(node: Node): Option[QueryOperationName] = apply(node).toOption + + final case class Selector(path: List[QueryOperationName]) extends Selection[QueryOperationName] { + def identifier: QualifiedIdentifier.Selector = QualifiedIdentifier.Selector(path.flatMap(_.identifier)) + def name: OperationName.Selector = OperationName.Selector(path.flatMap(_.name)) + + type Self = Selector + protected val remake = Selector.apply + } +} diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/RunQuery.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/RunQuery.scala index aa507209..fb741774 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/RunQuery.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/RunQuery.scala @@ -14,8 +14,8 @@ object RunQuery { case Struct(node) => node } - def operation_name: Option[OperationName] = node.fields.getOrElse("operation_name", Nil).headOption.map { - case OperationName(node) => node + def operation_name: Option[QueryOperationName] = node.fields.getOrElse("operation_name", Nil).headOption.map { + case QueryOperationName(node) => node } // typed children @@ -34,7 +34,7 @@ object RunQuery { final case class Selector(path: List[RunQuery]) extends Selection[RunQuery] { def input: Struct.Selector = Struct.Selector(path.flatMap(_.input)) - def operation_name: OperationName.Selector = OperationName.Selector(path.flatMap(_.operation_name)) + def operation_name: QueryOperationName.Selector = QueryOperationName.Selector(path.flatMap(_.operation_name)) type Self = Selector protected val remake = Selector.apply diff --git a/tree-sitter-smithyql/grammar.js b/tree-sitter-smithyql/grammar.js index 18889a00..3f905d30 100644 --- a/tree-sitter-smithyql/grammar.js +++ b/tree-sitter-smithyql/grammar.js @@ -33,7 +33,10 @@ module.exports = grammar({ top_level_statement: ($) => choice($.run_query), run_query: ($) => - seq(field("operation_name", $.operation_name), field("input", $.struct)), + seq( + field("operation_name", $.query_operation_name), + field("input", $.struct) + ), qualified_identifier: ($) => seq( @@ -42,15 +45,17 @@ module.exports = grammar({ field("selection", $.identifier) ), - operation_name: ($) => + query_operation_name: ($) => prec.left( 1, seq( field("identifier", optional(seq($.qualified_identifier, "."))), - field("name", $.identifier) + field("name", $.operation_name) ) ), + operation_name: ($) => $.identifier, + _input_node: ($) => choice($.struct, $.list, $.number, $.string, $.boolean, $.null), diff --git a/update-libs.sh b/update-libs.sh index 8c9c3566..1fe5c084 100755 --- a/update-libs.sh +++ b/update-libs.sh @@ -2,22 +2,7 @@ set -e -mkdir -p modules/treesitter/src/main/resources/darwin-aarch64 -BINARY_PATH=$(nix build .#packages.aarch64-darwin.tree-sitter-smithyql --no-link --print-out-paths --print-build-logs) -cp $BINARY_PATH modules/treesitter/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib -chmod 755 modules/treesitter/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib - -mkdir -p modules/treesitter/src/main/resources/darwin-x86-64 -BINARY_PATH=$(nix build .#packages.x86_64-darwin.tree-sitter-smithyql --no-link --print-out-paths --print-build-logs) -cp $BINARY_PATH modules/treesitter/src/main/resources/darwin-x86-64/libtree-sitter-smithyql.dylib -chmod 755 modules/treesitter/src/main/resources/darwin-x86-64/libtree-sitter-smithyql.dylib - -mkdir -p modules/treesitter/src/main/resources/linux-aarch64 -BINARY_PATH=$(nix build .#packages.aarch64-linux.tree-sitter-smithyql --no-link --print-out-paths --print-build-logs) -cp $BINARY_PATH modules/treesitter/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so -chmod 755 modules/treesitter/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so - -mkdir -p modules/treesitter/src/main/resources/linux-x86-64 -BINARY_PATH=$(nix build .#packages.x86_64-linux.tree-sitter-smithyql --no-link --print-out-paths --print-build-logs) -cp $BINARY_PATH modules/treesitter/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so -chmod 755 modules/treesitter/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so +LIBS_PATH=$(nix build .#tree-sitter-smithyql-all --no-link --print-out-paths --print-build-logs) +mkdir -p modules/treesitter/src/main/resources +cp -R "$LIBS_PATH"/* modules/treesitter/src/main/resources +chmod -R 755 modules/treesitter/src/main/resources From 88ce227a9792a08f57b8b584f7868a6e5ecb6016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Wed, 13 Nov 2024 00:39:49 +0100 Subject: [PATCH 088/105] tiny grammar cleanup --- .../playground/MultiServiceResolver.scala | 2 +- .../libtree-sitter-smithyql.dylib | Bin 34384 -> 34384 bytes .../libtree-sitter-smithyql.dylib | Bin 16456 -> 16456 bytes .../linux-aarch64/libtree-sitter-smithyql.so | Bin 67368 -> 67368 bytes .../linux-x86-64/libtree-sitter-smithyql.so | Bin 18304 -> 18304 bytes tree-sitter-smithyql/grammar.js | 16 +++++++++------- 6 files changed, 10 insertions(+), 8 deletions(-) diff --git a/modules/core/src/main/scala/playground/MultiServiceResolver.scala b/modules/core/src/main/scala/playground/MultiServiceResolver.scala index 3bf99981..ecd4f696 100644 --- a/modules/core/src/main/scala/playground/MultiServiceResolver.scala +++ b/modules/core/src/main/scala/playground/MultiServiceResolver.scala @@ -60,7 +60,7 @@ object MultiServiceResolver { ): EitherNel[CompilationError, QualifiedIdentifier] = queryOperationName.name match { case Some(opName) => - // todo: this should be an option in codegen. might be a bad grammar + // todo: this should be an Option in codegen. might be a bad grammar queryOperationName.identifier.headOption match { case Some(explicitRef) => resolveExplicitTs(serviceIndex, explicitRef, opName) diff --git a/modules/treesitter/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib b/modules/treesitter/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib index e3aaaeb01fae26f1d6ed48b2d38998bb20c48540..0f570b1118747e494383bf264749554e9ba085ce 100755 GIT binary patch delta 3312 zcmb7GX>3$g6h3d6>CCjiwA0c~+v&`-1=>PO7uxA`It-h|rYshbT{bDoY5~I{glXBV z2-x-}g4#qD(Lap@CaFLKiAK;UOF{+2C=#RANFrze2`YZ?z58Y<_=A^x=bN*>bI-l+ zy}7VMys$%TZAmh@NxeGE8k^j0Zw*g*w?Naz*fdsjk-4P|W)fV9J$}vlnV@kG^9t95 zJt4a|Rj^v!+isj~E*rIbt*3}R^-5}}Nt*0n#nLeG)ZNe}SB*(tbbzePmER(N(LvTw zXMV99pGg8as2DPvyPT4zcHz?F?Ov^TuhyCg-3b| z^!h<9*GzU;h%z7(Xb@xuRRhg`IDi`zl$}z+1J+`IDG179iY7%7h*czcHP!?qG6EE}K8tsCUk0yL$ zi95psOPPXJl;b4PO0}eNj53w>Q(l6{g2z?jkF0XcvebpmhDX96A|qan--L!DmbLh8 zMBRv`{vpfDuxMEuP&*PS(njdUaMvO=K{x1n5TTo3FzE*9+QHN3E7BJD6Qcavdg(3E z1(ClUdgM6}X$N#UDt{MregEt>wO0Wzm{yo0T06T}<_vZrup9UTup%oH$OEc?almw7 zF|ZzZ71#|N1VX?G;0*9J@FQ>wxDS{yC>!7e3IQKb3rq#(151F_Kv1L_+KwL#=l~7^ z9{?W$9|LEA^T1``8t@D7J8&0x0K`c|{eb@L`mh1nk6x^l}{jVW<*)#Zg~&sIoS(QZ-^o z{7PiEs+}y)YZV;K>n$pkvb6vnA&9+nAsK#&gm8sKw$AHd?|G97bJa{SoT=$ViKH9{ zJwuSP5NBd1eD-WX9H8Z>5;0sSLYqnsu~uIiyXkeYAF5@CQL(9)ASvU6t{W(UEvj;` zpM6P!otb@EqUd7gY6t7`C6y=xjlRDtRu>$-^c7Am>7+sJupyNBq+rmE#X7)Nuw0Y=O zK~SRbT?|KQI~~zW*+{=Lu`s4Kkvp`)pDbABET6ZmVO8V2=NgzRkiy;^-V$vp53Fa0 z0**e)UqI!YD>%r$2@DSAtK|saRPCw);W@?2O@s1>pjdkZ=x^=bRH>xn>gM*I5voeX zqclz{*Z4`!J2;yvH2VzBvnr^cYU$>NWH&o3PjG+a(c<(!pEvlQ(3_n9V)sT&45kd% zqS86LI1l1n#JP;Kk8=&@Nt|bJZs5F*^JdPwI3M7ARO29>;f9NxuX4V|`B%=jIRDGp z7~qX_F5v9vJdv{&MYMqH7M{OM)yEL6;*K?(H*;>`%sVB0rS06_!TJ3_=&+oV89F5= zE5c)FZ!!u6EUqaxu0`3(mQk#8)o|EYB4vt3#99DYmoZ^>W&xzpMB$>rAz_wI`8@$cJk%5uMO-`1TY?u@nBHg?ur z_08)!_0`Jt?0EBB*LO=_t9!n+PsQ;UFP{GPWcS>Y#-Yv6^sE2$Jaryh(sA{TP}QdX F@_z^cbb0^) delta 3329 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 delta 3521 zcmai1Ylu`;9RHtt?>u&PR(E!1XC3!3GtSKJ?9RT^)J%3a315WT!=fe4Lc~;j5K^Mu zMa0CybdRNi;6~O5>BH3EhoaCA6@JJPDlkF_A?TrGR0KiT@7(jh_s)!wXZfAq{Xfs^ zf9Br3G$}4kilc{O(+%XbD>F4uA3HVLvZF%_dmA+?*^(KvO@>7}cB5ZwKM|U5$c19G zr8KCe)tX4jh7&VpSn^%5Rh%p*jmJgfb8qcAabe@!vmYI}wjuWP?;FdLW;!CTG=#)s z<*Nczej z1+lU^IQsg&Dt&+koODCz1>JK;Qk646^PmqpI~OIj;xrASPkCdR>dAICbRmW!h>O5_ zhVE7`X3HpB0yGW}la`>j=t1-W6pf&~m)7DTmqHt)KJ@7dTV=G08@@Ae`F{lZJF!y6 zGR^iwNU3+pqE+w@(;D=3s2V}t-f$*83Rx{o*Ueg9ghfw4Z_)&M3pG|f{ih&@X+8Qn zQkCWB^JWpJ4HXm6SL9iFCf#D|^=(AhoryO=8>G!n;xzg$Z(V=2Y3dL1|mX znA_nKq@A_?Hg1O>@I0Q$DL8$jd*R;U4QkSE$Wh#@%Dd%9zkuin?zG7VT78th-zxa2 zdQ}=*Z}fyCSWd4sd+@BL;)m_UbCAQd&vw?B^pZ0%Ro-phbPbwxwC-UVv>$S?!hV2+ zjdJuI4#FW^A?tGW?T2a-9&dp*b5v6P6F=$CE!Eg67V%}9k>Pj4TQ11 z2_OfI0QUncfJcCJz-C~VK`Ut=9u5Mp0Vjbsfpfrl;A7xZ;4<(Ha1HnYxC#6T`~w6` zq6Q#t9{VjWKg+dum^2ehYy@K1t!8jVlfUMM>qAhepTP*3GL=ur@%##D=j-H&d{JJ= zuaQ&MS$VdrkeLm?B*T4Hte{#_-t20Xv$~_Q&uo`?^{F3AXcu?4%4N`Q?T#z0T-`lO z4w(@-)xE3!KINjDj1{tSq%a_#DHJjbP#N`@Q5Mym!&|1hq3-1eh2^n@j@n;Qll-nP z6~i{52~XWFm-GzSMy5(F%o^EM*$FY~#~XTg z{dsDc@FuESpJ-KSq}^Ai?xURO>y)SZW`=~BhPqy+`jePjkMi+yt8pr2VXC`@yXhT7 z?OOF$s&9`~#S`iK<=TZ%`S1~;^U0DK@VrDqo)HZx?d^z-b^Z3xhBAs0imc zYgk=2^&zb)LSd)8JlJi|z*7NGP2C&S76Hmz6{}jN`gLezC-PH00T zny2|je9t_@HBxeGMW00zHS(cMGneGCq4nP9`z`*A|3i)sx7u9YWaug~HVWf1GM4F>Zi8XEO;`6t{7{sF7NvPQ{{rpU3Pk__ diff --git a/modules/treesitter/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so b/modules/treesitter/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so index 5d9b2881d9be6182296108195ae35fb549acc4a1..e981ba4f894d547157d45dd50bef2deee93ff6ae 100755 GIT binary patch delta 4874 zcmb7IeQZXI@U=IP$(8HSqi9i zp_<7wO`)s!=$YhH+aDmUQz}huDz?Hu6=8qSFjZ@iww8ak1tx9mLu#ldEfkXMci+9& zj$gG(JnP)!^E)5++;cztt|v}86Q`UryZhIzCHFC$NVu|W{h-;;ToGL1hNpZA-*EPP zBs{*Lgz*JsG=BD4M>y4~zyfC>h7$iTUR=kE^Qbs2vK+Qfizz;Dy&K=#z2$J`*uIU~ zBL@!c`SQNuXNEWJJ=VK%QzoC~Sjo05(nHqeu zRoTZq_(-!Jga<#afp)&uV$lgP&_xanc?Q@VaL9z3n$e4TE46cak3IS+nG@+dSXpc(gQ#`qm*CZU<|XvXU1m+Ky>PMaSrP7a6HytK0@rI5Z&U87rLKW1)E>=@7bn>}&MO+`T za#$t)rNb6>3|UkZWQj7vZ`XiUr2jvnZH_lTF)ON zr)<+oKG;-+Sx)fJnwoR(!s8F1PeCCJz6q29Z3TT3^j*+F&~ea7P#*LK=mO|H(EFf2 zg8mA+1Cl=}K`izfPz>}X&^FKx(04$4LC=C-0Oc$ipjYsPK|cq*0eTB`5p)^!KIlWx z$DqG}{to&C^k2{ts0_oX2G!Yos=2PB3Den38_=%ix0_?J7EDqr_9oT|*4YZQWmxV4 z2-Yz*OBpsDG7D<2W@za_eRJA5_5jX-LdOZ$s}=2oCT;0q`e+Nd zpSHPD9BqQuqm36_eDqbwHf=}iP(NB9twP&guyE*M$bNbRZ4lEZFd-%d2h$}N(}1g! z6P}`;qEdz40ocJ@mj+cSJqpxMYtbfnbaf4X7B3$v*6T5Jq^ju9PS^5rw4YDn37`Sm zo|)TXD<>KtT0&AXRH-s^hrbG>WOrldvgnSzB)8K4ANt5D3y+X5UqIkf-C$eyS7^VT(QttyH`hxd={-*Xf{-|Teut(m^LwDfIw&4Xvadv7f* zy$n7Eehz#b{F3B+sIz0ubFkU~Nj@RaI?x!fha`X}4(bE_n&0be6|;P^GlKW-yPX@I zU;JxniO=49>_Xq#=ReGuEAwuB#jApkeuc+@q@Jx{YN^WQN?24x=IU&&%I0cpZo=l~ zYi_!Qo2`D$no)c;nY*jGtD3v1xrd(rK9DgN#K_MNjDHocfDnW)kpVvIZuPEZ<#- ziQ61q%!vtpeX&an^0md76)59>E)I(UzM1@f%^4lUaQv+Uyz4iXxN5;N|2s>p4-RUh z!Mw0VPtbIn&G$>uxSq+6N^wRT&*ZO2(PZ^OUO1vBJgbv5{E_?)M|1@Xe;nmUVHM2i z|C2KLD^fK7_{`>o52E>_=XSmyVt(EcAu*9Z=|h~tzf$=t(sDxID<>`rzvvME1ML(= AqW}N^ delta 4930 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 seq($.identifier, repeat(seq(".", $.identifier))), + qualified_identifier: ($) => seq( - field("namespace", seq($.identifier, repeat(seq(".", $.identifier)))), + field("namespace", $._namespace), "#", field("selection", $.identifier) ), query_operation_name: ($) => - prec.left( - 1, - seq( - field("identifier", optional(seq($.qualified_identifier, "."))), - field("name", $.operation_name) - ) + seq( + field( + "identifier", + optional(prec.left(seq($.qualified_identifier, "."))) + ), + field("name", $.operation_name) ), operation_name: ($) => $.identifier, From 9c24e99a882b3dc1d0d95dde543f5c85fc3090e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Wed, 13 Nov 2024 00:56:23 +0100 Subject: [PATCH 089/105] Generate typed visitors on unions --- .../playground/smithyql/RangeIndex.scala | 35 ++++++++-------- .../playground/parsergen/ParserGen.scala | 41 ++++++++++++++++++- .../generated/nodes/InputNode.scala | 34 +++++++++++++++ 3 files changed, 91 insertions(+), 19 deletions(-) diff --git a/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala b/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala index e359ba3f..c5a98561 100644 --- a/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala +++ b/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala @@ -30,32 +30,31 @@ object RangeIndex { } def inputNodeRanges(node: playground.generated.nodes.InputNode, base: NodeContext) - : List[ContextRange] = - node match { - case playground.generated.nodes.String_(string) => - ContextRange(string.range.shrink1, base.inQuotes) :: Nil - - case playground.generated.nodes.List_(list) => - ContextRange(list.range.shrink1, base.inCollectionEntry(None)) :: - list.list_fields.zipWithIndex.flatMap { (inputNode, i) => + : List[ContextRange] = node.visit( + new playground.generated.nodes.InputNode.Visitor.Default[List[ContextRange]] { + def default: List[ContextRange] = Nil + + override def onString(node: playground.generated.nodes.String_): List[ContextRange] = + ContextRange(node.range.shrink1, base.inQuotes) :: Nil + + override def onList(node: playground.generated.nodes.List_): List[ContextRange] = + ContextRange(node.range.shrink1, base.inCollectionEntry(None)) :: + node.list_fields.zipWithIndex.flatMap { (inputNode, i) => ContextRange(inputNode.range, base.inCollectionEntry(Some(i))) :: inputNodeRanges(inputNode, base.inCollectionEntry(Some(i))) } - case playground.generated.nodes.Struct(struct) => - ContextRange(struct.range, base) :: - ContextRange(struct.range.shrink1, base.inStructBody) :: - struct.bindings.toList.flatMap { binding => + override def onStruct(node: playground.generated.nodes.Struct): List[ContextRange] = + ContextRange(node.range, base) :: + ContextRange(node.range.shrink1, base.inStructBody) :: + node.bindings.toList.flatMap { binding => (binding.key, binding.value).tupled.toList.flatMap { (key, value) => - ContextRange( - value.range, - base.inStructBody.inStructValue(key.source), - ) :: inputNodeRanges(value, base.inStructBody.inStructValue(key.source)) + ContextRange(value.range, base.inStructBody.inStructValue(key.source)) :: + inputNodeRanges(value, base.inStructBody.inStructValue(key.source)) } } - - case _ => Nil } + ) val queryRanges = parsed.statements.zipWithIndex.flatMap { (stat, statementIndex) => stat.run_query.toList.flatMap { runQuery => diff --git a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala index c85a2f12..43811d57 100644 --- a/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala +++ b/modules/parser-gen/src/main/scala/playground/parsergen/ParserGen.scala @@ -21,7 +21,9 @@ import scala.meta.Dialect extension (tn: TypeName) { @targetName("renderTypeName") def render: String = tn.value.dropWhile(_ == '_').fromSnakeCase.ident - def renderProjection: String = show"as${tn.value.dropWhile(_ == '_').fromSnakeCase}".ident + def renderProjection: String = show"as${tn.prettyName}".ident + def renderVisitorMethod: String = show"on${tn.prettyName}".ident + private def prettyName = tn.value.dropWhile(_ == '_').fromSnakeCase def asChildName: FieldName = FieldName(tn.value) } @@ -53,6 +55,7 @@ private def renderUnion(u: Type.Union): String = { val instanceMethods = show"""extension (node: $name) { |${projections.mkString_("\n").indentTrim(2)} + | def visit[A](visitor: Visitor[A]): A = visitor.visit(node) |}""".stripMargin val applyMethod = { @@ -68,6 +71,39 @@ private def renderUnion(u: Type.Union): String = { val typedApplyMethod = show"""def apply(node: $underlyingType): $name = node""".stripMargin + val visitor = + show""" + |trait Visitor[A] { + |${u + .subtypes + .map(sub => show"def ${sub.name.renderVisitorMethod}(node: ${sub.name.render}): A") + .mkString_("\n") + .indentTrim(2)} + | + | def visit(node: $name): A = (node: @nowarn("msg=match may not be exhaustive")) match { + |${u + .subtypes + .map(sub => show"case ${sub.name.render}(node) => ${sub.name.renderVisitorMethod}(node)") + .mkString_("\n") + .indentTrim(4)} + | } + |} + | + |object Visitor { + | abstract class Default[A] extends Visitor[A] { + | def default: A + | + |${u + .subtypes + .map(sub => + show"def ${sub.name.renderVisitorMethod}(node: ${sub.name.render}): A = default" + ) + .mkString_("\n") + .indentTrim(4)} + | } + |} + |""".stripMargin + val selectorMethods = u .subtypes .map { subtype => @@ -82,6 +118,7 @@ private def renderUnion(u: Type.Union): String = { | |import ${classOf[Node].getName()} |import playground.treesitter4s.std.Selection + |import annotation.nowarn | |opaque type $name <: Node = $underlyingType | @@ -97,6 +134,8 @@ private def renderUnion(u: Type.Union): String = { | | def unapply(node: Node): Option[$name] = apply(node).toOption | + |${visitor.indentTrim(2)} + | | final case class Selector(path: List[$name]) extends Selection[$name] { |${selectorMethods.indentTrim(4)} | diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala index 85038b68..41c64fdc 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/InputNode.scala @@ -3,6 +3,7 @@ package playground.generated.nodes import org.polyvariant.treesitter4s.Node import playground.treesitter4s.std.Selection +import annotation.nowarn opaque type InputNode <: Node = Boolean_ | List_ | Null_ | Number | String_ | Struct @@ -15,6 +16,7 @@ object InputNode { def asNumber: Option[Number] = Number.unapply(node) def asString: Option[String_] = String_.unapply(node) def asStruct: Option[Struct] = Struct.unapply(node) + def visit[A](visitor: Visitor[A]): A = visitor.visit(node) } def apply(node: Node): Either[String, InputNode] = node match { @@ -33,6 +35,38 @@ object InputNode { def unapply(node: Node): Option[InputNode] = apply(node).toOption + + trait Visitor[A] { + def onBoolean(node: Boolean_): A + def onList(node: List_): A + def onNull(node: Null_): A + def onNumber(node: Number): A + def onString(node: String_): A + def onStruct(node: Struct): A + + def visit(node: InputNode): A = (node: @nowarn("msg=match may not be exhaustive")) match { + case Boolean_(node) => onBoolean(node) + case List_(node) => onList(node) + case Null_(node) => onNull(node) + case Number(node) => onNumber(node) + case String_(node) => onString(node) + case Struct(node) => onStruct(node) + } + } + + object Visitor { + abstract class Default[A] extends Visitor[A] { + def default: A + + def onBoolean(node: Boolean_): A = default + def onList(node: List_): A = default + def onNull(node: Null_): A = default + def onNumber(node: Number): A = default + def onString(node: String_): A = default + def onStruct(node: Struct): A = default + } + } + final case class Selector(path: List[InputNode]) extends Selection[InputNode] { def boolean : Boolean_.Selector = Boolean_.Selector(path.flatMap(_.asBoolean)) def list : List_.Selector = List_.Selector(path.flatMap(_.asList)) From 6a39e2c91f7b035f99a6d521413e6dbabed10aba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Wed, 13 Nov 2024 00:56:56 +0100 Subject: [PATCH 090/105] Mark generated files as such --- .gitattributes | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..27bb0f7a --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +modules/treesitter/src/main/scala/playground/generated/** linguist-generated From c86bc7a8263fa79675293aff695185796b949ffb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Wed, 13 Nov 2024 01:07:02 +0100 Subject: [PATCH 091/105] remove demos --- .../parser/ParserTreeSitterDemo.scala | 37 ----- .../smithyql/parser/demo.worksheet.sc | 148 ------------------ 2 files changed, 185 deletions(-) delete mode 100644 modules/treesitter/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala delete mode 100644 modules/treesitter/src/main/scala/playground/smithyql/parser/demo.worksheet.sc diff --git a/modules/treesitter/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala b/modules/treesitter/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala deleted file mode 100644 index b2704979..00000000 --- a/modules/treesitter/src/main/scala/playground/smithyql/parser/ParserTreeSitterDemo.scala +++ /dev/null @@ -1,37 +0,0 @@ -package playground.smithyql - -import org.polyvariant.treesitter4s.TreeSitterAPI -import playground.generated.nodes.* - -object ParserTreeSitterDemo extends App { - - val tree = TreeSitterAPI.make("smithyql").parse { - """ - use service foo.bar.bax.qux#Baz - - Bax { x = 42 } - """.stripMargin - } - - val bind = SourceFile - .unsafeApply(tree.rootNode.get) - .statements - .headOption - .getOrElse(sys.error("no statements section in source file")) - .run_query - .getOrElse(sys.error("no run_query in statements section")) - .input - .getOrElse(sys.error("no input in operation call")) - .bindings - .find(_.key.exists(_.source == "x")) - .getOrElse(sys.error("no binding with key 'x'")) - - println( - bind - .value - .getOrElse(sys.error("binding doesn't have a value")) - .asNumber - .getOrElse(sys.error("binding wasn't a number literal")) - .source - ) -} diff --git a/modules/treesitter/src/main/scala/playground/smithyql/parser/demo.worksheet.sc b/modules/treesitter/src/main/scala/playground/smithyql/parser/demo.worksheet.sc deleted file mode 100644 index 441bc313..00000000 --- a/modules/treesitter/src/main/scala/playground/smithyql/parser/demo.worksheet.sc +++ /dev/null @@ -1,148 +0,0 @@ -import org.polyvariant.treesitter4s.Node -import org.polyvariant.treesitter4s.TreeSitterAPI -import playground.generated.nodes.* - -val s = - """ -use service foo.bar.baz.bax#Baz - -Bax { a = , x = 44 y = 50, b = ,,42, xyz = { a = }} - """.stripMargin - -val p = TreeSitterAPI.make("smithyql") - -// hmm -// https://github.com/Jakobeha/type-sitter/blob/5d2cff2f2641d2af9a9a7ebdcd49b0311f19ad66/type-sitter-lib/src/node/incorrect_kind.rs#L10 -/// Underlying cause of why the node is the wrong kind -// pub enum IncorrectKindCause { -// /// Node is an error node -// Error, -// /// Node is a missing node -// Missing, -// /// Node is valid but simply of a different kind (bad node-types.json? Different language? -// /// Broken user invariant?) -// OtherKind(&'static str), -// } -case class ErrorNode(node: Node) extends Node { - export node.* -} - -val base = p.parse("Foo { true }").rootNode.get -SourceFile - .unsafeApply(base) - .statements - .get - .operation_call - .get - .input - .get - .children - .find(_.isError) - -// SourceFile(p.parse("use service foo.bar.baz.bax#Baz").rootNode.get).statements -// SourceFile(p.parse("use service foo.bar.baz.bax#Baz").rootNode.get).isError -// SourceFile(p.parse("use service foo.bar.baz.bax#Baz").rootNode.get).hasError -// SourceFile(p.parse("use service foo.bar.baz.bax#Baz").rootNode.get).children.map(_.tpe) - -val tree = p.parse(s) - -tree.rootNode.get.text - -SourceFile.unsafeApply(tree.rootNode.get).use_clause.get.identifier.head.source - -SourceFile.unsafeApply(tree.rootNode.get).use_clause.get.identifier.get.selection.get.source - -SourceFile - .unsafeApply(tree.rootNode.get) - .use_clause - .get - .identifier - .tail - -SourceFile - .unsafeApply(tree.rootNode.get) - .statements - .get - .operation_call - .get - .input - .get - .children - .filter(_.tpe == "ERROR") - .head - .source - -tree - .rootNode - .get - .fold[List[Node]]((n, ch) => n :: ch.toList.flatten) - .filter(_.tpe == "ERROR") - .map(_.source) - -tree - .rootNode - .get - .fold[List[Node]]((n, ch) => n :: ch.toList.flatten) - .filter(_.isMissing) - -tree - .rootNode - .get - .fold[List[Node]]((n, ch) => n :: ch.toList.flatten) - .filter(_.isExtra) - .size - -tree - .rootNode - .get - .fold[List[Node]]((n, ch) => n :: ch.toList.flatten) - .filter(_.isError) - .map(_.text) - .mkString("\n") - -tree - .rootNode - .get - .fold[List[Node]]((n, ch) => n :: ch.toList.flatten) - .size - -tree - .rootNode - .get - .fold[List[Node]]((n, ch) => n :: ch.toList.flatten) - .filter(_.hasError) - .size - -tree - .rootNode - .get - .fold[List[Node]]((n, ch) => n :: ch.toList.flatten) - // .filter(_.tpe == "MISSING") - // .map(_.source) - .map(_.tpe) - .toSet - -val bind = - SourceFile - .unsafeApply(tree.rootNode.get) - .statements - .get - .operation_call - .get - .input - .get - .bindings - .get - .binding - -// .find(_.key.source == "x") -// .get - -bind.size -bind.head.fields -bind.map(_.key.get.source) - -bind.last.value.get.asStruct.get.bindings.get.binding.head.value.get.asBoolean.get.tpe -// bind.key.source - -// bind.value.asNumber.get.source From 6a57268d9caa2605008958c8b5ddc787cf916563 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Wed, 13 Nov 2024 01:15:06 +0100 Subject: [PATCH 092/105] Remove a duplicate ContextRange --- .../core/src/main/scala/playground/smithyql/RangeIndex.scala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala b/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala index c5a98561..144fd96e 100644 --- a/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala +++ b/modules/core/src/main/scala/playground/smithyql/RangeIndex.scala @@ -45,8 +45,7 @@ object RangeIndex { } override def onStruct(node: playground.generated.nodes.Struct): List[ContextRange] = - ContextRange(node.range, base) :: - ContextRange(node.range.shrink1, base.inStructBody) :: + ContextRange(node.range.shrink1, base.inStructBody) :: node.bindings.toList.flatMap { binding => (binding.key, binding.value).tupled.toList.flatMap { (key, value) => ContextRange(value.range, base.inStructBody.inStructValue(key.source)) :: From 51184d63c743ec7ff36610b055b0c9a8d21fee4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Wed, 13 Nov 2024 01:24:02 +0100 Subject: [PATCH 093/105] well it is pretty now... --- .../playground/smithyql/parser/v3/TreeSitterParserTests.scala | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/treesitter/src/test/scala/playground/smithyql/parser/v3/TreeSitterParserTests.scala b/modules/treesitter/src/test/scala/playground/smithyql/parser/v3/TreeSitterParserTests.scala index 42ec3381..10900b12 100644 --- a/modules/treesitter/src/test/scala/playground/smithyql/parser/v3/TreeSitterParserTests.scala +++ b/modules/treesitter/src/test/scala/playground/smithyql/parser/v3/TreeSitterParserTests.scala @@ -74,8 +74,6 @@ object TreeSitterParserTests extends FunSuite { val in = parse("""use service fo o.b ar.b/az.bax/#//B//,,{}az |GetBa z { a = { x = 42, 50 }, z, 42 }""".stripMargin) - // this ain't pretty huh - // watch out for the upcoming lookup DSL val valueOfX = in.select( _.statements From e1d050c24fe7a960e463714f7552122d37ef87a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 24 Dec 2024 18:32:57 +0100 Subject: [PATCH 094/105] Update binaries for linux --- .../linux-aarch64/libtree-sitter-smithyql.so | Bin 67368 -> 67368 bytes .../linux-x86-64/libtree-sitter-smithyql.so | Bin 18304 -> 18304 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/modules/treesitter/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so b/modules/treesitter/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so index e981ba4f894d547157d45dd50bef2deee93ff6ae..8dbb9f2f04b6609ddcea118bdd7ac8124638c223 100755 GIT binary patch delta 51 zcmZ3{$Fic2WkWc#LY7&saam?rWxAnxQE^#rWkyQk8|VNk&FWdU|DXdUHAR_Ht&% Gjm!Y!auPKF diff --git a/modules/treesitter/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so b/modules/treesitter/src/main/resources/linux-x86-64/libtree-sitter-smithyql.so index 8dc3d5bd9c698627d6f614c45948cd0690adcb4b..0a40d7e6732ffd0692375ea976f495e2d130ad5f 100755 GIT binary patch delta 46 zcmZqZXKd(aT)?7`SZr*Zmy=vjmS&z|YLSs;Vw_oJWLlAtnUZH*l#^V(S%D?N831uB B54QjS delta 46 zcmZqZXKd(aT)?7WX<3+TXpxm^Se0f`RF!U)S)P$ynPQMwS&(aHTu_$0S%D?N831s{ B58MC% From fadba1d8fa32af12ee63aac1d300b09f1d54922e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 24 Dec 2024 18:36:38 +0100 Subject: [PATCH 095/105] remove now-unused code --- .../test/scala/playground/smithyql/AtPositionTests.scala | 7 ------- 1 file changed, 7 deletions(-) diff --git a/modules/core/src/test/scala/playground/smithyql/AtPositionTests.scala b/modules/core/src/test/scala/playground/smithyql/AtPositionTests.scala index 9e06eeea..e83f7611 100644 --- a/modules/core/src/test/scala/playground/smithyql/AtPositionTests.scala +++ b/modules/core/src/test/scala/playground/smithyql/AtPositionTests.scala @@ -4,7 +4,6 @@ import cats.syntax.all.* import org.polyvariant.treesitter4s.TreeSitterAPI import playground.Assertions.* import playground.Diffs.given -import playground.smithyql.parser.SourceParser import weaver.* object AtPositionTests extends FunSuite { @@ -32,12 +31,6 @@ object AtPositionTests extends FunSuite { .SourceFile .unsafeApply(TreeSitterAPI.make("smithyql").parse(extracted).rootNode.get) - val parsed = - SourceParser[SourceFile] - .parse(extracted) - .toTry - .get - RangeIndex .build(parsedTs) .findAtPosition(position) From a931edaebfc346bf498367a14d99cb3699574a28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 24 Dec 2024 18:46:01 +0100 Subject: [PATCH 096/105] Update grammar to be more precise wrt lists --- .../playground/MultiServiceResolver.scala | 3 +- .../language/CompletionProvider.scala | 2 +- .../libtree-sitter-smithyql.dylib | Bin 34384 -> 34384 bytes .../libtree-sitter-smithyql.dylib | Bin 16456 -> 16456 bytes .../linux-aarch64/libtree-sitter-smithyql.so | Bin 67368 -> 67368 bytes .../linux-x86-64/libtree-sitter-smithyql.so | Bin 18304 -> 18304 bytes .../nodes/OperationNameQualifier.scala | 39 ++++++++++++++++++ .../generated/nodes/QueryOperationName.scala | 6 +-- tree-sitter-smithyql/grammar.js | 7 ++-- 9 files changed, 47 insertions(+), 10 deletions(-) create mode 100644 modules/treesitter/src/main/scala/playground/generated/nodes/OperationNameQualifier.scala diff --git a/modules/core/src/main/scala/playground/MultiServiceResolver.scala b/modules/core/src/main/scala/playground/MultiServiceResolver.scala index ecd4f696..b65f8d97 100644 --- a/modules/core/src/main/scala/playground/MultiServiceResolver.scala +++ b/modules/core/src/main/scala/playground/MultiServiceResolver.scala @@ -60,8 +60,7 @@ object MultiServiceResolver { ): EitherNel[CompilationError, QualifiedIdentifier] = queryOperationName.name match { case Some(opName) => - // todo: this should be an Option in codegen. might be a bad grammar - queryOperationName.identifier.headOption match { + queryOperationName.identifier.flatMap(_.qualified_identifier) match { case Some(explicitRef) => resolveExplicitTs(serviceIndex, explicitRef, opName) case None => resolveImplicitTs(opName, serviceIndex, useClauses) diff --git a/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala b/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala index 65338216..53721322 100644 --- a/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala +++ b/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala @@ -120,7 +120,7 @@ object CompletionProvider { // includes the current query's service reference // as it wouldn't result in ading a use clause val presentServiceIdentifiers = { - q.select(_.operation_name.identifier) ++ + q.select(_.operation_name.identifier.qualified_identifier) ++ sf.select(_.prelude.use_clause.identifier) }.flatMap(ASTAdapter.decodeQI) diff --git a/modules/treesitter/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib b/modules/treesitter/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib index 0f570b1118747e494383bf264749554e9ba085ce..b6e1fde7d93dda2f3e295e6318e40314d889e1e5 100755 GIT binary patch delta 3425 zcmb7Gdr(wW82`?_mt}VWSs-9}EW5BEf=GbCvMh*NYBXs^YFbkwSZXR5JtS*fY#cJ9 zQcthR9{gcW56YC8rnK^pYV0wNCNsWz_^4?}&6>2vqN#r8-gEcvnlsj!`F+3pJ^1@-ofjvr5)!KfFjY z2alIjXbEm<)#Ne!j0f$B|1adC5nGys11ru2^`5-5;@&of2S;qa?_9%7nC2B+g^S z#mB^5KBCMVD{SR(QWmU4Igp7|2$@SokZvl4%%O3R9x8{-rty$js9vE|N+TyY6R}R& z*8?y8w+vyK!VyW~)jQ`y{=Xuu4AulLUqo8;JY))Sq^6wtk5QU!D+WPT)D90j4P6oS;K5i*X_iG{Jv=JKkMrzQ+d z&?bS!a7x5;6`pK391bLjPKZ=dnKYUL-A>aW9drd`NhE{W?^;+j3X46oO0WjHE@~j- zJkGdevYD{jsYUmRIBOs)*Q}^qa}Z;rxq5uInE#ll%8cc^MGqMRSrGAA$!?8GHXku6 zwLxk)ve6S!X(4p6hQ`soL$0Joi($9XosbS3a4)+=0Y->k0H0o!*({D~beSulC*p?x z`-WI$c40u$Pl|D~{fPGRV^x`9VYTA!!?P2&+OkZ+v)EwEG6&B#SX6nwVwXmxZoM9H zK0T2MTfN)#Oq!W5jElTVCRFG_bc&1Wv>Li~4i)NwZj16ibWyxo4bZJ^6_E_@rcID(dOx8($t$b9;dc>t6c_<= z(P<1&4NL{*0!x5Zz{9{s;3ePEQ)Fa(?cP6NLK@z~H5zzd88g1|IjHqZ_%16Be( zz#|G>OPlbp8Q2PJ2X+D<0-pmzz?Zdxrfycj3U!AyW{Iv_RT?_sN}|f_kdGzs zgito09ZKeZhEn-&^`m%SD7zV9q82l)njf2%@-H>NfggK5c z4Q63QYw#RZj$)R_^MdY_V2l$tlQ%Vb`HTh^s~zlYtY&GQD{k*vaL7ci}AOba+AcrVl^@dH1i`(W5e<{5g$#Xg+Ss`B}!mt$W{k|)-O-FCc2}& zDec1(b(QKS8$2xiZeu1iSMov0rL{&}SuO6hXj`P=9UtGW%?NM6zKLf3r5==jt4AfD zl>D9K?Meaq^d(XV2A@{Eb#!c}5=(uq6wB5zLevPj+W6z;uD++F0yscXqDt%(t z))R$mZ|L?@=krHgU(LI!_d|8xA1TuxJ>0bS)mIPR-(67H)V}THR|6-)1HFZ>9ooNg z)cW@LDer}sw%%~t;v+x3UU{zf={=9_T-lcL{)N2K(FeXg!*{M}_3a2(9_u*u%BOcf j+4{-c&F4NkTm0S?&0C%ssj^-3?EddO)r0j9WoZ8Z#^ifa delta 3278 zcmb7GX>3$g6h3d6rKP3QPD_{RbY|KLZK0)5rqk(kC?FP_B3O*}Va247muewP`FORbYy@dkLOv=ZCk=zuMwyTf%7b)LIiy#_r6uAxP?Kj%*u4om za#HjEKcXr=w~?G9jS68U@<3+LC`b=gLKe^j$YKgY7EwK9A?j8shuoA7&PSzbGRq4u zT}!T!lI**NWM^XGfSFYWd96jO*am+-w#E?MAQ}Uy&{%V#`2I4n%m}&;C*v@^;~Do=1C6v%6b6l&A$6JzX`@`ok%>ulx*ocn zZh%a~p(to`yi6U3Ag;_b((BhPZmY9<*H79dJCU=>P zUzUj1=x)S_gRr)-Tpou$sMopV8{CqWNV3yvbCDd#Q9OBkzA^aT>+&qEBN^N`P5K5~ zlLgL38KRdOt-(6q$^>A93mUU2EdEZQwqL3tI9Yfr}8Rp@YfPb$BLBowPiN zXZxT7Z2y<#;Y8MYtdz`EX#*LeC-FwA)PVq7ivB2cXNqoJ;AH$`@Mom>A0MK34ViB< z^yKeJrEc*G(o-hb3O#wUqE-bjq-~IHvvQ&J@Sk-);|SvVfu8^ul8S)}pb?l3%mbDK zj{r{sJAl1F40s(l348>64O{}Q0%>Tk8}I?uKm=$7<^W586~H>cP^pDB20%aO{sF>e~;n<`L&*F1t2ZjOSc^Hoi zxJPVklB4Lh)iA%S;*^{9Cw&4>sDe z?FqA@iN4zT*2d9F9d|bRlwxj;cpZeVIR<+pMeK;=@iUDc4n?vs%P8I*$=Ay;GcSyk zx7y4llDilw*Q>KuPwdXJCw8y-5Qi5;+^>{!IO5|g;VeEI@vDlT!%?5&<9nLCysXK^ zvzuJ`iWWdpdNN5ZfNtZ=sE3a>W!W_kR0sbVDdgedoN*PL(h{ zl~G@I^$=?yHZM9siM=#2T|tZaV6!(<{3{bTMqn?0+C18*G?NIQK5I0B#DQc;ph;9~ zT_*a&T7eowI!3>=4@@#us-0qSLD1qGC3j19)?4=Zk{8xfmTBpihTH%j(q|a2g{-*v z|G^9Lf8j;RS0w)~`47o|Nv4TbzA9OlY?thmoGv*}a*@Rb`K4i$a=vBp;Q0Qu2o;8${=%;k@MUC0~;Kmt=dhwbLTWRg$BUXG*rBh?Yt{ zzVlU5Un}_m!Q!+wN<)|Ac%|{3_DFlLD7>Mp(-;fMMI6VZ@}aS29^5Q0jGk%&zFLzWny_r0h0-cAzqO`h}I zbKY~#`*q%X+bel-B`-#gSLFkw+tgf(^JAy_Yd1zMsp@LGWxXjZ zzAAe~f9<(W_O*zVZs?d5hG+7exGXB~Hw>;_bg=*1b7vCmf1J74b0%+=$*DkzI6V1% z;9`jwk|$~>#n#Cu=8cq;*O8z`S^ycBm!gq)1DO<~CQ6W>%3<|V0J4N?A^ntuY*c=w zwx4Wnto7RVsBK4#JO0rg*+TA|lcS8nuo6WeD=;TP4b%!*M`_3iwL?a!1G1hLLWVJW zgQ_V=W#ABe%Q!ZQUixnta-5>nP7%|=&5-|Z5>5tZ0gs+U(7g^$Auq)i=1MRDp;u0% zcB{f(?Ho*X9<|}L)LsyEX-~By5A#_ByN`NwuUb?KbwW1V*}T*X-K3?E9$E(JRp+0> z@fWt&w4eGhG(j5xtKkg0=Se*IP&B1T;!dba$;srQmC*gP8nTpXAm`f|3UO;;^-xZo zp%dr~wB9vP2tIz=0Qv7^8+G3%-KYGVft*}VyK-%YkB_!!|9Z9llxt?z_HETJDaaPP z&q=n;m23z;CT)lGpk&<(G3j~eY7ec_eSvq{vGA*$0c6;{q$* z87cwFugQIct^Wa- z0UB`VDWDrz1#AI!14n>kz!-2E_z?I6_#C(f{0Q6y9sngc%PJrSWPn~^HSi4Z9IzL7 z8OQ@~8nlka@$fG2K5zl}82AkM61WCj2Yv?b0)GNCfN2ty13@4H#DTOqHeDmXNYu?W z^n1Pns|;YxbLDS|kQYJZlcF^!n_6q-KelbhtYXH=eTTOz`;DjAenvq9p! zRRwq5>Y2lG7`@%e8o4*wCYKvNZx}s7PPc`TWu&~1{XnuR6_*QAUGmvfIo6yeSj-LKHVY$+50Fc_r0XWhKETa;ucrv$33-I)<{%YGAisJxgyW(uEl>){R-Z zs8QKm`K@n%VLY)xJD9eEFj{p&gC|tbi4X{z9cZY;9!EE0(EalFOuZaTH+2|oRvIl4 z#ySypL8U3S%VX(Gu1DMK0Yvdm2x0wtvHMMRc8A&;l z>F^mkTz;Jm_Xts(il|A47KXybDAI*d2i+(4XTx$=wo-1%R>putfN}Uvz-kA^#ipVp$dcYtIo{896Y4~)l_Y%wiHkoq=JE? zqWip&g# zT7ScQgZU=&E#{w?Z!_Ov{)PEhDIN>u9&%6T7FPTY+fOl{oqTV>&VZ2~kYy{Hqj^=F`H1y~n?NO>_j&m45d8yjvKQ+B delta 3286 zcmb7GYitx%6h3!m_R+H2ZXesFY`44H$3EEYgO|`2Er^N@3ME7=Ard7<4ERW@0fWSC z2q8#_DLp@k(Zn`NVw4b*jfznNKQ!PUEm7hhh$L!EG?BJ3KG2BYoqKm?w~!cS^PO+b zx#!$D_nbRB_rjRCFeb*2)J+G;zNTw6AAfZ)JQ-8U>X2foTbwkb>=%i;%U#O)xlnwW z`@~@QtsbQfDF2(zW6|~|GO3l~)J}d{0IP?BkUk1S`l$mlCjF`$ zKfV|XdmMYru_LBD{{KA|m*y_Gb5v0?tVB`B0Hq_>S1F{);8&ppX zR1Jtffh#m_14*%- z)%&qFA0Ypd5e3MWNhy12;iqozfkH`l1U*m#arQj;_A^t{#!Y zd^X>l7G|5gcYK90PZy0CHThb;nJ;AP3bu-Z>Zyg%VTT*@bRwh(o8xD;!q4yOhSbZ( zjZRxviNmgSA}n3bV~-*c4Dc`6?j}=q!Ry$C(s}*jTymN1>pWS=&Xhe#wD3SKhJ6y2 zX0FXG;=dM$abR*IVjRuIT7{989^|e~>4eh?3Er6N81mSexeh5iKz<%87H=rK^8hmr zKm4VYiYD4Pmy7ey*;@W0moP+vb6s&9oVMpf>v<=5=^kaPKY%Z+e9;g!ILGQK~9F@A7i>r5x>w*QpbsYfTn6bgdS}$?kyQ zcY9(%dCHW#R$_`T_2h=+Eb^)Wvi2R}8?LT?kZf;21GS@&N{mWJ)2pbgyw363-bmj$ zwYO+S^BR>Vozq;e%bn0Xsrf1&@7ksRejL?f!8jH6lSzGr};O{zia+e z^L5StX#Q7oRkxbHMsuU)sOC1!Y0W*F`xO`HK5f{jd7I{^HSg1WQ1c1Rr!;@8`Ml;Y zHGi%7ism0R&uPAHGd4nvKH|4(UZQy&Pc4mX8_`;6y^m>qm*zd1_h~+$xs+aMd55)q lT=Q$isinJuM)q#5UXzSX%MCdlRexhMO+@c`ElTLd{RacN6hr_3 diff --git a/modules/treesitter/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so b/modules/treesitter/src/main/resources/linux-aarch64/libtree-sitter-smithyql.so index 8dbb9f2f04b6609ddcea118bdd7ac8124638c223..616d0dab5339c9fc17d8482a638aed27bc06e74d 100755 GIT binary patch delta 4972 zcmb7IZEO_B8J^ku@Sg7scNo|^pO3ra{BgD^91y^SrZ{cGSEIy6G)0LJ=M<2gP~)H! zT!?aZf3!|gfz2D~ELAE-Y9m)7s$JAV+aI-6wS`t~?M6bhX;nLwD!1^%QS-wQ826do z+1Bjbz0F*(u~jO(6iRy78Gq%@{0on&#c$gv;MpIO=X_q!Bh0oKl-w5yg8X=NP47+Y3#XqPamG(2PRUr)X}{05sFk3@VyCG*N-|lH(XrwDU9v?Sj;fDcVJf zV4RbFy>LU(uqJDTCly|o{7r=qOMY76qmsX)@F~g9TKqv~Z|1C2%qtE#$uB5;o8%W2 zzL$8wprL>s(d8Fu_mHQ}0VCEY{i2F?kUHU)s?>Rwo~$%zBoL%#e;e}93og~$hcKMrfV>2h#w`X6{)zk4{PC2yOme?k7NCC|c? zEz<4a4!%GuLc90_IuP2*Kcd$|M>SSUe+#{-wXM7Ma@7G%wAWXj*CUUceOZ$ck6{Yd zCJUOyI&@5tS1EFBnan+za#>Skz8ZSYxD!8IZvTvF;BgGNR&N?;(!rK7ToI?lP6YP4 zvL^{yr)0c_24bm=nsxkIvxA$I8N(`wFlHwXPuF8Dg&ihmkCgNBmEhd^wQ=;G8rWC3 zk!;x>IJbVa9DB|BaNLQ>4~b#>h!N4wnnWV#ObDAz8Bd0S@uW8emcCO{w;%4p&F;>V zR?OF#vfG{f{bHDAsh`$JE%A+h&2*>bcx(sf<)Ii8eY#ySR$V4@EehFBm*X)SiHB)0 z9?o#jdT^EQ@VMAFnj|Win$CA=4k?ao$2N)F$br zc$jaew`voGpFr_v;66}`8E1jVfIYxrpc^;`d=nT3E(7lZKLdUVya&tycY%+A3hbo_ zkOW$Qoxon;i@=wGlfYS^A9zD!Ut*W=@NM87U;_9l@C)F#z^z~6zpz`ud}fCn!< z2vh@cAOkc5ZlRvU+F%r~a2?x%Iztx|@k}i?OOmBn9n%@M5LUDbbp>04TE`6t*1|5} z*wKfHH9m(=I6Qnx{Xf}agB`oz#;9a5u$Tbq5XQt=EvrWz#V-X1`zh23wh?s=+lo4d z(Q9lKwpArs1GbgYHvujC-y#%bh=3C!X*#D-|9^vUBe)aztF#Ci@kesWNy&JBRYN24CO5ecuoe?*lY0gmH504+1-a4>xb-j^wk>s zy5jHzr8Ct>bjL(v-++a;L>`3felZ$*Q<1*~*`2G#E-3mT8py0kUjkcg+HsskZ<`X9 z+$}Vb$gMICit;4zx1tERuy*RHYd6PA^@ zJBSjabbU2_RJWQo)Hehn3l88kQ5U0w^{4sclx}&8+8b8;#0KzFXG1mhH`LHO4bhdF zd02-q)G7>oCH=19d8%t{f#1Pv-)+3gYftqaKi&Ci_o<$vJ)K`Ue)N^EcAo4$(S7_h zA~AZpX}+mzZh83-gb}n|Xz!qX4Q=*=<>gVdt!QtEmX0(xHie+gK@vsW<2C?UaGw?g zN(yKL4$-^K8QxDb%?9tIe>QLRe*W(AG7a2+_FAsx!`~OCW%AoE+ZFJUcW|5~R@sHd z+VW!Ci%SCHTURP(C;pS-_J9%=7Z8+onIp~0^cd%kStezUE_3_!%ueR*}1bQ?o#r7+R2+t)|i!>;R2bL26pl_M8iwFBSZKGM5(eGc8}(ke!$0R_~9m= zr>TcYo}#&jr}#dasXrANm)3SWN;At%KhpTGG@dHn()gx8URvaf+{1Si`#d~c+~?uB zfbB9~9DpLQAng{4Q$oCFT|?QuBKPtg5!^|vBHQm3_j?iC`PZvB0IR^foY8!7%FBPv b$BS?HVC4K?R-E#|Xk2E7G&9$I%NmCL+ zl{!tuIS3&)se;o%I#)%=MN~3E6jy=95`sAVK^&+QBb7G%0XP9cBPwx02!ayF{C4;4 z?)eo7<)oR}`OU|h_ulT?otr*oOrJ6)3Xu&xWdAmt-nTnGx#TF5OTxaGJbf`6&#iYr zPo5E?PKZ&CYu^-e{JQpb%l^Bc-Ew5#k)vPi>p%RJBhMZ!KK=Ql&lmf*9vXe7|G*2q zd4691otWVf!yGC^ootOaogs9?(P!En*`nZw(sFbKpWwF)Q>&Q#E8~-;sV>K9SaBMb z_#Opcka$7ChqF$eqJqzNI`|<4UvTg>G^!X1{CdDl%*nYfDAr;AO~5Qo%fTv&byngx z6ntLdbZh0xEl519;Fl#HQ}7QQd_6TPhKdYmQE=kZK{FA{Icw0XSR45~tT|~NP^@{r z9yB8Z(z=I7f+puevBa=Mii$rxLMBfH!|_qYQsm}skMZ@0$%RO`Z;xV`lo165pOQGX5p^6=th3TOs^AL}A5-u}iDRcDW_&`i#`wyr zjJV9A#;jdjcAgf2bH?D>8k6sXo^ARI^fpIdge(1%|5ej3KIBc&ZQ=&+ zk8Tka{!VnSHkRb&=m~8uedc8CgPJAZuR9igIByr=6l-0^9o++BimoZTb507+-?Z$! zIhDu?y={fB&=g&)gpsRZW}@sh0ya#IPd!w%PEYFD>Q1m^ka&F~BRx@PHBcFj30 zox*`jod{F6^4Q)e1O|RQv8h3C0uuCa;plue(bKxc_Vq><2}Muw51P^;qIDL|rKTp{ z*R-y-suq#vlTGPnp*d%sKR0;>5?)7wf8NwF6tFAv9ptNnP(tmr6C(L!d*chsSMyR4Ig9Vwi9W_BQ#=o!!v zP)VbmbOIL)`Znkd(3_yMpmU%Lpi7|lL4O4O74&z|zd_5OkdDOxHR$|ix}he8ZAw!w zcpG0zC)*oHr)J7vgTvPTP=IQ|L%3B0kPh&)WiQM_sVweWpuK}#EW$gnIo;PbS)kpV`t%$C(0m^$UCiWms#e z(_v(f+IL*aE7JFS4t}ffTR3TP^a!pAseNP=*TEGVIPwwX z1uyDFjO52^^i?WZYvL}XMq_XYROw%X9_{L?k~X)ceY#Bfc5?th_8o# zm<#Y7>ulyN^@RBxuqk>(d-($I- zm%?gz#CT)&F+P#a@wv{21f9`yKNP&s{paraE6dBDMUoqkMacZs<>eP4$04U6Cn0Ao z$-iHp?LGjnUTD_O`jXoK8V7ct1>n~L8UX#6H}Y_1>z2ev1juc%-IjVH<@i?YPer0(*^Dg8 z#?$Mn)DRX4{z5#-*H)a#G6KEI)W_`=g6eb*rdI z-CgfSx$ZeB^HL7G`yu_^{%Ta>V;o;H`=+EeBchJ0rq;?e;;jlLxyFmh-xZ>61$W%I2SF;+L8TmoI8!b7YrH zv#Tt0(I0WMj+O_Z+F|8!UGzp4q~AjMyyf>!gB-Oi4ACE7l&UKqC=VG(?)_I(J`S%) mQT~NgET1>T1ug;G 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 R;oiucBvx}XyB^Mp{{r9|_CNpt diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/OperationNameQualifier.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/OperationNameQualifier.scala new file mode 100644 index 00000000..a193f952 --- /dev/null +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/OperationNameQualifier.scala @@ -0,0 +1,39 @@ +// Generated code! Do not modify by hand. +package playground.generated.nodes + +import org.polyvariant.treesitter4s.Node +import playground.treesitter4s.std.Selection + +opaque type OperationNameQualifier <: Node = Node + +object OperationNameQualifier { + extension (node: OperationNameQualifier) { + def select[A](f: OperationNameQualifier.Selector => Selection[A]): List[A] = f(OperationNameQualifier.Selector(List(node))).path + // fields + + // typed children + def typedChildren: Option[QualifiedIdentifier] = node.children.collectFirst { + case QualifiedIdentifier(node) => node + } + // precise typed children + def qualified_identifier: Option[QualifiedIdentifier] = node.children.collectFirst { + case QualifiedIdentifier(node) => node + } + } + + def apply(node: Node): Either[String, OperationNameQualifier] = + if node.tpe == "operation_name_qualifier" + then Right(node) + else Left(s"Expected OperationNameQualifier, got ${node.tpe}") + + def unsafeApply(node: Node): OperationNameQualifier = apply(node).fold(sys.error, identity) + + def unapply(node: Node): Option[OperationNameQualifier] = apply(node).toOption + + final case class Selector(path: List[OperationNameQualifier]) extends Selection[OperationNameQualifier] { + def qualified_identifier: QualifiedIdentifier.Selector = QualifiedIdentifier.Selector(path.flatMap(_.qualified_identifier)) + + type Self = Selector + protected val remake = Selector.apply + } +} diff --git a/modules/treesitter/src/main/scala/playground/generated/nodes/QueryOperationName.scala b/modules/treesitter/src/main/scala/playground/generated/nodes/QueryOperationName.scala index 6e4ba9ad..cae47bc5 100644 --- a/modules/treesitter/src/main/scala/playground/generated/nodes/QueryOperationName.scala +++ b/modules/treesitter/src/main/scala/playground/generated/nodes/QueryOperationName.scala @@ -10,8 +10,8 @@ object QueryOperationName { extension (node: QueryOperationName) { def select[A](f: QueryOperationName.Selector => Selection[A]): List[A] = f(QueryOperationName.Selector(List(node))).path // fields - def identifier: List[QualifiedIdentifier] = node.fields.getOrElse("identifier", Nil).toList.collect { - case QualifiedIdentifier(node) => node + def identifier: Option[OperationNameQualifier] = node.fields.getOrElse("identifier", Nil).headOption.map { + case OperationNameQualifier(node) => node } def name: Option[OperationName] = node.fields.getOrElse("name", Nil).headOption.map { @@ -33,7 +33,7 @@ object QueryOperationName { def unapply(node: Node): Option[QueryOperationName] = apply(node).toOption final case class Selector(path: List[QueryOperationName]) extends Selection[QueryOperationName] { - def identifier: QualifiedIdentifier.Selector = QualifiedIdentifier.Selector(path.flatMap(_.identifier)) + def identifier: OperationNameQualifier.Selector = OperationNameQualifier.Selector(path.flatMap(_.identifier)) def name: OperationName.Selector = OperationName.Selector(path.flatMap(_.name)) type Self = Selector diff --git a/tree-sitter-smithyql/grammar.js b/tree-sitter-smithyql/grammar.js index 54b663f2..a1e1bfe0 100644 --- a/tree-sitter-smithyql/grammar.js +++ b/tree-sitter-smithyql/grammar.js @@ -47,12 +47,11 @@ module.exports = grammar({ field("selection", $.identifier) ), + operation_name_qualifier: ($) => seq($.qualified_identifier, "."), + query_operation_name: ($) => seq( - field( - "identifier", - optional(prec.left(seq($.qualified_identifier, "."))) - ), + field("identifier", optional($.operation_name_qualifier)), field("name", $.operation_name) ), From 44084630c8e44399c08221de5c36de92d134e42e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 24 Dec 2024 18:55:51 +0100 Subject: [PATCH 097/105] resolve todos --- .../playground/MultiServiceResolver.scala | 73 +++++++++---------- .../language/CompletionProvider.scala | 1 + tree-sitter-smithyql/grammar.js | 1 + 3 files changed, 35 insertions(+), 40 deletions(-) diff --git a/modules/core/src/main/scala/playground/MultiServiceResolver.scala b/modules/core/src/main/scala/playground/MultiServiceResolver.scala index b65f8d97..587958e2 100644 --- a/modules/core/src/main/scala/playground/MultiServiceResolver.scala +++ b/modules/core/src/main/scala/playground/MultiServiceResolver.scala @@ -57,18 +57,13 @@ object MultiServiceResolver { queryOperationName: playground.generated.nodes.QueryOperationName, serviceIndex: ServiceIndex, useClauses: List[playground.generated.nodes.UseClause], - ): EitherNel[CompilationError, QualifiedIdentifier] = - queryOperationName.name match { - case Some(opName) => - queryOperationName.identifier.flatMap(_.qualified_identifier) match { - case Some(explicitRef) => resolveExplicitTs(serviceIndex, explicitRef, opName) - - case None => resolveImplicitTs(opName, serviceIndex, useClauses) - } - case None => - // TODO: operation name is invalid or something like that - ??? - + ): EitherNel[CompilationError, Option[QualifiedIdentifier]] = queryOperationName + .name + .flatTraverse { opName => + queryOperationName.identifier.flatMap(_.qualified_identifier) match { + case Some(explicitRef) => resolveExplicitTs(serviceIndex, explicitRef, opName) + case None => resolveImplicitTs(opName, serviceIndex, useClauses).map(_.some) + } } private def resolveExplicit( @@ -104,34 +99,32 @@ object MultiServiceResolver { index: ServiceIndex, explicitRef: playground.generated.nodes.QualifiedIdentifier, operationName: playground.generated.nodes.OperationName, - ): EitherNel[CompilationError, QualifiedIdentifier] = - ASTAdapter.decodeQI(explicitRef) match { - case None => ??? /* todo - I don't really know xD */ - // explicit reference exists, but doesn't parse - case Some(ref) => - index.getService(ref) match { - // explicit reference exists, but the service doesn't - case None => - CompilationError - .error( - CompilationErrorDetails.UnknownService(index.serviceIds.toList), - explicitRef.range, - ) - .leftNel - - // the service exists, but doesn't have the requested operation - case Some(service) - if !service.operationNames.contains_(OperationName(operationName.source)) => - CompilationError - .error( - CompilationErrorDetails.OperationMissing(service.operationNames.toList), - operationName.range, - ) - .leftNel - - // all good - case Some(_) => ref.asRight - } + ): EitherNel[CompilationError, Option[QualifiedIdentifier]] = ASTAdapter + .decodeQI(explicitRef) + .traverse { ref => + index.getService(ref) match { + // explicit reference exists, but the service doesn't + case None => + CompilationError + .error( + CompilationErrorDetails.UnknownService(index.serviceIds.toList), + explicitRef.range, + ) + .leftNel + + // the service exists, but doesn't have the requested operation + case Some(service) + if !service.operationNames.contains_(OperationName(operationName.source)) => + CompilationError + .error( + CompilationErrorDetails.OperationMissing(service.operationNames.toList), + operationName.range, + ) + .leftNel + + // all good + case Some(_) => ref.asRight + } } diff --git a/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala b/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala index 53721322..c2f7186f 100644 --- a/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala +++ b/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala @@ -146,6 +146,7 @@ object CompletionProvider { sf.select(_.prelude.use_clause), ) .toOption + .flatten ctx match { case NodeContext.PathEntry.AtOperationName ^^: EmptyPath => diff --git a/tree-sitter-smithyql/grammar.js b/tree-sitter-smithyql/grammar.js index a1e1bfe0..c7d8e716 100644 --- a/tree-sitter-smithyql/grammar.js +++ b/tree-sitter-smithyql/grammar.js @@ -49,6 +49,7 @@ module.exports = grammar({ operation_name_qualifier: ($) => seq($.qualified_identifier, "."), + // todo: model as union? query_operation_name: ($) => seq( field("identifier", optional($.operation_name_qualifier)), From 703c92762d6bf61d36a67d7e283c051c6db67c26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Koz=C5=82owski?= Date: Tue, 24 Dec 2024 19:00:48 +0100 Subject: [PATCH 098/105] Even better --- .../playground/MultiServiceResolver.scala | 2 +- .../language/CompletionProvider.scala | 2 +- .../libtree-sitter-smithyql.dylib | Bin 34384 -> 34384 bytes .../libtree-sitter-smithyql.dylib | Bin 16456 -> 16456 bytes .../linux-aarch64/libtree-sitter-smithyql.so | Bin 67368 -> 67368 bytes .../linux-x86-64/libtree-sitter-smithyql.so | Bin 18304 -> 18304 bytes .../nodes/OperationNameQualifier.scala | 39 ------------------ .../generated/nodes/QueryOperationName.scala | 10 ++--- tree-sitter-smithyql/grammar.js | 11 ++--- 9 files changed, 13 insertions(+), 51 deletions(-) delete mode 100644 modules/treesitter/src/main/scala/playground/generated/nodes/OperationNameQualifier.scala diff --git a/modules/core/src/main/scala/playground/MultiServiceResolver.scala b/modules/core/src/main/scala/playground/MultiServiceResolver.scala index 587958e2..ff35f20f 100644 --- a/modules/core/src/main/scala/playground/MultiServiceResolver.scala +++ b/modules/core/src/main/scala/playground/MultiServiceResolver.scala @@ -60,7 +60,7 @@ object MultiServiceResolver { ): EitherNel[CompilationError, Option[QualifiedIdentifier]] = queryOperationName .name .flatTraverse { opName => - queryOperationName.identifier.flatMap(_.qualified_identifier) match { + queryOperationName.service_identifier match { case Some(explicitRef) => resolveExplicitTs(serviceIndex, explicitRef, opName) case None => resolveImplicitTs(opName, serviceIndex, useClauses).map(_.some) } diff --git a/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala b/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala index c2f7186f..ddf18c29 100644 --- a/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala +++ b/modules/language-support/src/main/scala/playground/language/CompletionProvider.scala @@ -120,7 +120,7 @@ object CompletionProvider { // includes the current query's service reference // as it wouldn't result in ading a use clause val presentServiceIdentifiers = { - q.select(_.operation_name.identifier.qualified_identifier) ++ + q.select(_.operation_name.service_identifier) ++ sf.select(_.prelude.use_clause.identifier) }.flatMap(ASTAdapter.decodeQI) diff --git a/modules/treesitter/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib b/modules/treesitter/src/main/resources/darwin-aarch64/libtree-sitter-smithyql.dylib index b6e1fde7d93dda2f3e295e6318e40314d889e1e5..e9e2482ff961ac63dc630f3dde591c0baf86d40f 100755 GIT binary patch delta 3191 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 delta 3182 zcmb7GTWnNS6y4|End$T~*fK5C>2x}6XQngEOiL+`@(^h?fC52E6iIkAMQenVS1n)& zaYo_;je)kCAHs)CYK$M4KpGMsACUM62{9odQKLpB8h=O-)E~l+>zsS$J}L=%lC}3; z`|Q2XYoB}X)snbc65}W9N+DA1`XiPuO`KibusLp#Olx|OHgkq7xKfjvOIs#h+mofbg0+1dQG9NeUpkUm-k>6hnU#POH6 z*R-EjV`u{FhnB+`cFz-d3ZQ5zk;I))mXednM{B@?v<|Y8>LKUb8Om|%Vf9f_o}m-y z47AZTPy{|f+64LUWSdpr7S$*HoPnHN&$x1Jg-?LCDgP$9{;X?e*7j{zE?LNSyU$6s z)0J!xJ|^vk^r2+k3o+>haJh$8>At9U(nl}B9-zIDl_>Cpc)$cK7c~LC+ZOT5Qq6Lx zJyP`E2WL{FNKdLRtoxZnM8Y22@f*{Aj^zj}Rk+oTWeuL?0Xvqhcn-i~7IlGn_r|1G zFkFo)(D(xe-K|pjTnUfqga#c)q~8_uD!5aJ29>}Ac7NEQ6SD$V@jx=XGibXQ^d>xf zE`Ac+xiJR4GmF0q?yS|IQ?vTV`C_smJPB)9`3by>&PXx-XY>%Rx?1I;+} zEU*|@3v2`S0LOs0fC=C|;3MEO;7i~Ja1*!%+yg3bmUTb^$OFrPb-=U0^S}sj6et02 z8?=EY@o*0K0JsQz3VaS+18x960KWpafWLtIfN2s{17RQrB!QecakrkoO7+xLV=0w@ ztR^^9fJHhSl5Z*ld+URxhUceu@$2b4pU7Ul?|gC8>j{wR6`-|UDY%V_lq?FYpoo8j1DV}k_gkB2)iKDc