From 592fd8678d502f197aa0f1c1e0afa37a80222d4e Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Mon, 1 Mar 2021 10:27:22 -0800 Subject: [PATCH] Organize TSLanguage fields Due to the breaking ABI change in #943, this is our chance to reorder the fields in a more logical way. --- cli/src/generate/render.rs | 86 ++++++++++++++++---------------- lib/include/tree_sitter/parser.h | 34 ++++++------- 2 files changed, 61 insertions(+), 59 deletions(-) diff --git a/cli/src/generate/render.rs b/cli/src/generate/render.rs index 94ab4d63..460dfc24 100644 --- a/cli/src/generate/render.rs +++ b/cli/src/generate/render.rs @@ -1321,27 +1321,62 @@ impl Generator { add_line!(self, "static TSLanguage language = {{"); indent!(self); add_line!(self, ".version = LANGUAGE_VERSION,"); + + // Quantities add_line!(self, ".symbol_count = SYMBOL_COUNT,"); add_line!(self, ".alias_count = ALIAS_COUNT,"); add_line!(self, ".token_count = TOKEN_COUNT,"); add_line!(self, ".external_token_count = EXTERNAL_TOKEN_COUNT,"); - add_line!(self, ".symbol_names = ts_symbol_names,"); - add_line!(self, ".symbol_metadata = ts_symbol_metadata,"); - add_line!(self, ".parse_table = (const uint16_t *)ts_parse_table,"); - add_line!(self, ".parse_actions = ts_parse_actions,"); - add_line!(self, ".lex_modes = ts_lex_modes,"); + add_line!(self, ".state_count = STATE_COUNT,"); + add_line!(self, ".large_state_count = LARGE_STATE_COUNT,"); + if self.next_abi { + add_line!(self, ".production_id_count = PRODUCTION_ID_COUNT,"); + } + add_line!(self, ".field_count = FIELD_COUNT,"); + add_line!( + self, + ".max_alias_sequence_length = MAX_ALIAS_SEQUENCE_LENGTH," + ); + // Parse table + add_line!(self, ".parse_table = (const uint16_t *)ts_parse_table,"); + if self.large_state_count < self.parse_table.states.len() { + add_line!( + self, + ".small_parse_table = (const uint16_t *)ts_small_parse_table," + ); + add_line!( + self, + ".small_parse_table_map = (const uint32_t *)ts_small_parse_table_map," + ); + } + add_line!(self, ".parse_actions = ts_parse_actions,"); + + // Metadata + add_line!(self, ".symbol_names = ts_symbol_names,"); + if !self.field_names.is_empty() { + add_line!(self, ".field_names = ts_field_names,"); + add_line!( + self, + ".field_map_slices = (const TSFieldMapSlice *)ts_field_map_slices," + ); + add_line!( + self, + ".field_map_entries = (const TSFieldMapEntry *)ts_field_map_entries," + ); + } + add_line!(self, ".symbol_metadata = ts_symbol_metadata,"); + add_line!(self, ".public_symbol_map = ts_symbol_map,"); + add_line!(self, ".alias_map = ts_non_terminal_alias_map,"); if !self.parse_table.production_infos.is_empty() { add_line!( self, ".alias_sequences = (const TSSymbol *)ts_alias_sequences," ); } - add_line!( - self, - ".max_alias_sequence_length = MAX_ALIAS_SEQUENCE_LENGTH," - ); + // Lexing + add_line!(self, ".lex_modes = ts_lex_modes,"); add_line!(self, ".lex_fn = ts_lex,"); if let Some(keyword_capture_token) = self.keyword_capture_token { add_line!(self, ".keyword_lex_fn = ts_lex_keywords,"); @@ -1366,39 +1401,6 @@ impl Generator { add_line!(self, "}},"); } - add_line!(self, ".field_count = FIELD_COUNT,"); - if !self.field_names.is_empty() { - add_line!( - self, - ".field_map_slices = (const TSFieldMapSlice *)ts_field_map_slices," - ); - add_line!( - self, - ".field_map_entries = (const TSFieldMapEntry *)ts_field_map_entries," - ); - add_line!(self, ".field_names = ts_field_names,"); - } - - add_line!(self, ".large_state_count = LARGE_STATE_COUNT,"); - if self.large_state_count < self.parse_table.states.len() { - add_line!( - self, - ".small_parse_table = (const uint16_t *)ts_small_parse_table," - ); - add_line!( - self, - ".small_parse_table_map = (const uint32_t *)ts_small_parse_table_map," - ); - } - - add_line!(self, ".public_symbol_map = ts_symbol_map,"); - add_line!(self, ".alias_map = ts_non_terminal_alias_map,"); - add_line!(self, ".state_count = STATE_COUNT,"); - - if self.next_abi { - add_line!(self, ".production_id_count = PRODUCTION_ID_COUNT,"); - } - dedent!(self); add_line!(self, "}};"); add_line!(self, "return &language;"); diff --git a/lib/include/tree_sitter/parser.h b/lib/include/tree_sitter/parser.h index 05e61371..a3a87bd1 100644 --- a/lib/include/tree_sitter/parser.h +++ b/lib/include/tree_sitter/parser.h @@ -93,13 +93,24 @@ struct TSLanguage { uint32_t alias_count; uint32_t token_count; uint32_t external_token_count; - const char **symbol_names; - const TSSymbolMetadata *symbol_metadata; - const uint16_t *parse_table; - const TSParseActionEntry *parse_actions; - const TSLexMode *lex_modes; - const TSSymbol *alias_sequences; + 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 **symbol_names; + const char **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; @@ -112,17 +123,6 @@ struct TSLanguage { unsigned (*serialize)(void *, char *); void (*deserialize)(void *, const char *, unsigned); } external_scanner; - uint32_t field_count; - const TSFieldMapSlice *field_map_slices; - const TSFieldMapEntry *field_map_entries; - const char **field_names; - uint32_t large_state_count; - const uint16_t *small_parse_table; - const uint32_t *small_parse_table_map; - const TSSymbol *public_symbol_map; - const uint16_t *alias_map; - uint32_t state_count; - uint32_t production_id_count; }; /*