diff --git a/include/tree_sitter/parser.h b/include/tree_sitter/parser.h index 722c5208..bdd9d0cc 100644 --- a/include/tree_sitter/parser.h +++ b/include/tree_sitter/parser.h @@ -16,20 +16,18 @@ typedef struct TSTree TSTree; typedef unsigned short TSStateId; -typedef enum { - TSNodeTypeHidden, - TSNodeTypeAnonymous, - TSNodeTypeNamed, -} TSNodeType; +typedef struct { + bool visible : 1; + bool named : 1; +} TSSymbolMetadata; typedef struct TSLexer { - // Public void (*start_fn)(struct TSLexer *, TSStateId); void (*start_token_fn)(struct TSLexer *); bool (*advance_fn)(struct TSLexer *, TSStateId); - TSTree *(*accept_fn)(struct TSLexer *, TSSymbol, TSNodeType, const char *); + TSTree *(*accept_fn)(struct TSLexer *, TSSymbol, TSSymbolMetadata, + const char *); - // Private const char *chunk; size_t chunk_start; size_t chunk_size; @@ -74,7 +72,7 @@ typedef struct { struct TSLanguage { size_t symbol_count; const char **symbol_names; - const TSNodeType *node_types; + const TSSymbolMetadata *symbol_metadata; const TSParseAction **parse_table; const TSStateId *lex_states; TSTree *(*lex_fn)(TSLexer *, TSStateId); @@ -105,8 +103,8 @@ struct TSLanguage { GO_TO_STATE(state_index); \ } -#define ACCEPT_TOKEN(symbol) \ - return lexer->accept_fn(lexer, symbol, ts_node_types[symbol], \ +#define ACCEPT_TOKEN(symbol) \ + return lexer->accept_fn(lexer, symbol, ts_symbol_metadata[symbol], \ ts_symbol_names[symbol]); #define LEX_ERROR() \ @@ -161,7 +159,7 @@ struct TSLanguage { #define EXPORT_LANGUAGE(language_name) \ static TSLanguage language = { \ .symbol_count = SYMBOL_COUNT, \ - .node_types = ts_node_types, \ + .symbol_metadata = ts_symbol_metadata, \ .parse_table = (const TSParseAction **)ts_parse_actions, \ .lex_states = ts_lex_states, \ .symbol_names = ts_symbol_names, \ diff --git a/spec/fixtures/parsers/anonymous_tokens.c b/spec/fixtures/parsers/anonymous_tokens.c index 3177464e..7e54703a 100644 --- a/spec/fixtures/parsers/anonymous_tokens.c +++ b/spec/fixtures/parsers/anonymous_tokens.c @@ -21,14 +21,14 @@ static const char *ts_symbol_names[] = { [anon_sym_DQUOTEhello_DQUOTE] = "\"hello\"", }; -static const TSNodeType ts_node_types[SYMBOL_COUNT] = { - [sym_program] = TSNodeTypeNamed, - [ts_builtin_sym_error] = TSNodeTypeNamed, - [ts_builtin_sym_end] = TSNodeTypeHidden, - [anon_sym_LF] = TSNodeTypeAnonymous, - [anon_sym_CR] = TSNodeTypeAnonymous, - [aux_sym_SLASH_BSLASHd_SLASH] = TSNodeTypeHidden, - [anon_sym_DQUOTEhello_DQUOTE] = TSNodeTypeAnonymous, +static const TSSymbolMetadata ts_symbol_metadata[SYMBOL_COUNT] = { + [sym_program] = {.visible = true, .named = true}, + [ts_builtin_sym_error] = {.visible = true, .named = true}, + [ts_builtin_sym_end] = {.visible = false, .named = false}, + [anon_sym_LF] = {.visible = true, .named = false}, + [anon_sym_CR] = {.visible = true, .named = false}, + [aux_sym_SLASH_BSLASHd_SLASH] = {.visible = false, .named = false}, + [anon_sym_DQUOTEhello_DQUOTE] = {.visible = true, .named = false}, }; static TSTree *ts_lex(TSLexer *lexer, TSStateId lex_state) { diff --git a/spec/fixtures/parsers/arithmetic.c b/spec/fixtures/parsers/arithmetic.c index 64295658..99229951 100644 --- a/spec/fixtures/parsers/arithmetic.c +++ b/spec/fixtures/parsers/arithmetic.c @@ -47,27 +47,27 @@ static const char *ts_symbol_names[] = { [sym_comment] = "comment", }; -static const TSNodeType ts_node_types[SYMBOL_COUNT] = { - [sym_program] = TSNodeTypeNamed, - [sym__expression] = TSNodeTypeHidden, - [sym_sum] = TSNodeTypeNamed, - [sym_difference] = TSNodeTypeNamed, - [sym_product] = TSNodeTypeNamed, - [sym_quotient] = TSNodeTypeNamed, - [sym_exponent] = TSNodeTypeNamed, - [sym_group] = TSNodeTypeNamed, - [ts_builtin_sym_error] = TSNodeTypeNamed, - [ts_builtin_sym_end] = TSNodeTypeHidden, - [anon_sym_PLUS] = TSNodeTypeAnonymous, - [anon_sym_DASH] = TSNodeTypeAnonymous, - [anon_sym_STAR] = TSNodeTypeAnonymous, - [anon_sym_SLASH] = TSNodeTypeAnonymous, - [anon_sym_CARET] = TSNodeTypeAnonymous, - [anon_sym_LPAREN] = TSNodeTypeAnonymous, - [anon_sym_RPAREN] = TSNodeTypeAnonymous, - [sym_number] = TSNodeTypeNamed, - [sym_variable] = TSNodeTypeNamed, - [sym_comment] = TSNodeTypeNamed, +static const TSSymbolMetadata ts_symbol_metadata[SYMBOL_COUNT] = { + [sym_program] = {.visible = true, .named = true}, + [sym__expression] = {.visible = false, .named = false}, + [sym_sum] = {.visible = true, .named = true}, + [sym_difference] = {.visible = true, .named = true}, + [sym_product] = {.visible = true, .named = true}, + [sym_quotient] = {.visible = true, .named = true}, + [sym_exponent] = {.visible = true, .named = true}, + [sym_group] = {.visible = true, .named = true}, + [ts_builtin_sym_error] = {.visible = true, .named = true}, + [ts_builtin_sym_end] = {.visible = false, .named = false}, + [anon_sym_PLUS] = {.visible = true, .named = false}, + [anon_sym_DASH] = {.visible = true, .named = false}, + [anon_sym_STAR] = {.visible = true, .named = false}, + [anon_sym_SLASH] = {.visible = true, .named = false}, + [anon_sym_CARET] = {.visible = true, .named = false}, + [anon_sym_LPAREN] = {.visible = true, .named = false}, + [anon_sym_RPAREN] = {.visible = true, .named = false}, + [sym_number] = {.visible = true, .named = true}, + [sym_variable] = {.visible = true, .named = true}, + [sym_comment] = {.visible = true, .named = true}, }; static TSTree *ts_lex(TSLexer *lexer, TSStateId lex_state) { diff --git a/spec/fixtures/parsers/c.c b/spec/fixtures/parsers/c.c index 459186d9..646ba5a4 100644 --- a/spec/fixtures/parsers/c.c +++ b/spec/fixtures/parsers/c.c @@ -165,86 +165,86 @@ static const char *ts_symbol_names[] = { [sym_comment] = "comment", }; -static const TSNodeType ts_node_types[SYMBOL_COUNT] = { - [sym_translation_unit] = TSNodeTypeNamed, - [sym_preproc_define] = TSNodeTypeNamed, - [sym_function_definition] = TSNodeTypeNamed, - [sym_declaration_specifiers] = TSNodeTypeNamed, - [sym_storage_class_specifier] = TSNodeTypeNamed, - [sym__type_specifier] = TSNodeTypeHidden, - [sym_numeric_type_specifier] = TSNodeTypeNamed, - [sym_struct_specifier] = TSNodeTypeNamed, - [sym_type_name] = TSNodeTypeNamed, - [sym_struct_declaration] = TSNodeTypeNamed, - [sym_parameter_declaration] = TSNodeTypeNamed, - [sym_declaration] = TSNodeTypeNamed, - [sym__init_declarator] = TSNodeTypeHidden, - [sym_initializer] = TSNodeTypeNamed, - [sym_initializer_list] = TSNodeTypeNamed, - [sym_designation] = TSNodeTypeNamed, - [sym__declarator] = TSNodeTypeHidden, - [sym__abstract_declarator] = TSNodeTypeHidden, - [sym_pointer_declarator] = TSNodeTypeNamed, - [sym_abstract_pointer_declarator] = TSNodeTypeNamed, - [sym_function_declarator] = TSNodeTypeNamed, - [sym_abstract_function_declarator] = TSNodeTypeNamed, - [sym_array_declarator] = TSNodeTypeNamed, - [sym_abstract_array_declarator] = TSNodeTypeNamed, - [sym_type_qualifier] = TSNodeTypeNamed, - [sym_compound_statement] = TSNodeTypeNamed, - [sym__expression] = TSNodeTypeHidden, - [sym_cast_expression] = TSNodeTypeNamed, - [sym_math_expression] = TSNodeTypeNamed, - [sym_call_expression] = TSNodeTypeNamed, - [sym_pointer_expression] = TSNodeTypeNamed, - [sym__statement] = TSNodeTypeHidden, - [sym_expression_statement] = TSNodeTypeNamed, - [sym_macro_type] = TSNodeTypeNamed, - [aux_sym_translation_unit_repeat1] = TSNodeTypeHidden, - [aux_sym_declaration_specifiers_repeat1] = TSNodeTypeHidden, - [aux_sym_numeric_type_specifier_repeat1] = TSNodeTypeHidden, - [aux_sym_struct_specifier_repeat1] = TSNodeTypeHidden, - [aux_sym_type_name_repeat1] = TSNodeTypeHidden, - [aux_sym_declaration_repeat1] = TSNodeTypeHidden, - [aux_sym_designation_repeat1] = TSNodeTypeHidden, - [aux_sym_function_declarator_repeat1] = TSNodeTypeHidden, - [aux_sym_compound_statement_repeat1] = TSNodeTypeHidden, - [aux_sym_call_expression_repeat1] = TSNodeTypeHidden, - [ts_builtin_sym_error] = TSNodeTypeNamed, - [ts_builtin_sym_end] = TSNodeTypeHidden, - [anon_sym_POUNDdefine] = TSNodeTypeAnonymous, - [anon_sym_LF] = TSNodeTypeAnonymous, - [sym_preproc_arg] = TSNodeTypeNamed, - [anon_sym_typedef] = TSNodeTypeAnonymous, - [anon_sym_extern] = TSNodeTypeAnonymous, - [anon_sym_static] = TSNodeTypeAnonymous, - [anon_sym_auto] = TSNodeTypeAnonymous, - [anon_sym_register] = TSNodeTypeAnonymous, - [anon_sym_signed] = TSNodeTypeAnonymous, - [anon_sym_unsigned] = TSNodeTypeAnonymous, - [anon_sym_long] = TSNodeTypeAnonymous, - [anon_sym_short] = TSNodeTypeAnonymous, - [anon_sym_struct] = TSNodeTypeAnonymous, - [anon_sym_LBRACE] = TSNodeTypeAnonymous, - [anon_sym_RBRACE] = TSNodeTypeAnonymous, - [anon_sym_COMMA] = TSNodeTypeAnonymous, - [anon_sym_SEMI] = TSNodeTypeAnonymous, - [anon_sym_EQ] = TSNodeTypeAnonymous, - [anon_sym_LBRACK] = TSNodeTypeAnonymous, - [anon_sym_RBRACK] = TSNodeTypeAnonymous, - [anon_sym_DOT] = TSNodeTypeAnonymous, - [anon_sym_LPAREN] = TSNodeTypeAnonymous, - [anon_sym_RPAREN] = TSNodeTypeAnonymous, - [anon_sym_STAR] = TSNodeTypeAnonymous, - [anon_sym_const] = TSNodeTypeAnonymous, - [anon_sym_restrict] = TSNodeTypeAnonymous, - [anon_sym_volatile] = TSNodeTypeAnonymous, - [anon_sym_PLUS] = TSNodeTypeAnonymous, - [anon_sym_AMP] = TSNodeTypeAnonymous, - [sym_string] = TSNodeTypeNamed, - [sym_identifier] = TSNodeTypeNamed, - [sym_number] = TSNodeTypeNamed, - [sym_comment] = TSNodeTypeNamed, +static const TSSymbolMetadata ts_symbol_metadata[SYMBOL_COUNT] = { + [sym_translation_unit] = {.visible = true, .named = true}, + [sym_preproc_define] = {.visible = true, .named = true}, + [sym_function_definition] = {.visible = true, .named = true}, + [sym_declaration_specifiers] = {.visible = true, .named = true}, + [sym_storage_class_specifier] = {.visible = true, .named = true}, + [sym__type_specifier] = {.visible = false, .named = false}, + [sym_numeric_type_specifier] = {.visible = true, .named = true}, + [sym_struct_specifier] = {.visible = true, .named = true}, + [sym_type_name] = {.visible = true, .named = true}, + [sym_struct_declaration] = {.visible = true, .named = true}, + [sym_parameter_declaration] = {.visible = true, .named = true}, + [sym_declaration] = {.visible = true, .named = true}, + [sym__init_declarator] = {.visible = false, .named = false}, + [sym_initializer] = {.visible = true, .named = true}, + [sym_initializer_list] = {.visible = true, .named = true}, + [sym_designation] = {.visible = true, .named = true}, + [sym__declarator] = {.visible = false, .named = false}, + [sym__abstract_declarator] = {.visible = false, .named = false}, + [sym_pointer_declarator] = {.visible = true, .named = true}, + [sym_abstract_pointer_declarator] = {.visible = true, .named = true}, + [sym_function_declarator] = {.visible = true, .named = true}, + [sym_abstract_function_declarator] = {.visible = true, .named = true}, + [sym_array_declarator] = {.visible = true, .named = true}, + [sym_abstract_array_declarator] = {.visible = true, .named = true}, + [sym_type_qualifier] = {.visible = true, .named = true}, + [sym_compound_statement] = {.visible = true, .named = true}, + [sym__expression] = {.visible = false, .named = false}, + [sym_cast_expression] = {.visible = true, .named = true}, + [sym_math_expression] = {.visible = true, .named = true}, + [sym_call_expression] = {.visible = true, .named = true}, + [sym_pointer_expression] = {.visible = true, .named = true}, + [sym__statement] = {.visible = false, .named = false}, + [sym_expression_statement] = {.visible = true, .named = true}, + [sym_macro_type] = {.visible = true, .named = true}, + [aux_sym_translation_unit_repeat1] = {.visible = false, .named = false}, + [aux_sym_declaration_specifiers_repeat1] = {.visible = false, .named = false}, + [aux_sym_numeric_type_specifier_repeat1] = {.visible = false, .named = false}, + [aux_sym_struct_specifier_repeat1] = {.visible = false, .named = false}, + [aux_sym_type_name_repeat1] = {.visible = false, .named = false}, + [aux_sym_declaration_repeat1] = {.visible = false, .named = false}, + [aux_sym_designation_repeat1] = {.visible = false, .named = false}, + [aux_sym_function_declarator_repeat1] = {.visible = false, .named = false}, + [aux_sym_compound_statement_repeat1] = {.visible = false, .named = false}, + [aux_sym_call_expression_repeat1] = {.visible = false, .named = false}, + [ts_builtin_sym_error] = {.visible = true, .named = true}, + [ts_builtin_sym_end] = {.visible = false, .named = false}, + [anon_sym_POUNDdefine] = {.visible = true, .named = false}, + [anon_sym_LF] = {.visible = true, .named = false}, + [sym_preproc_arg] = {.visible = true, .named = true}, + [anon_sym_typedef] = {.visible = true, .named = false}, + [anon_sym_extern] = {.visible = true, .named = false}, + [anon_sym_static] = {.visible = true, .named = false}, + [anon_sym_auto] = {.visible = true, .named = false}, + [anon_sym_register] = {.visible = true, .named = false}, + [anon_sym_signed] = {.visible = true, .named = false}, + [anon_sym_unsigned] = {.visible = true, .named = false}, + [anon_sym_long] = {.visible = true, .named = false}, + [anon_sym_short] = {.visible = true, .named = false}, + [anon_sym_struct] = {.visible = true, .named = false}, + [anon_sym_LBRACE] = {.visible = true, .named = false}, + [anon_sym_RBRACE] = {.visible = true, .named = false}, + [anon_sym_COMMA] = {.visible = true, .named = false}, + [anon_sym_SEMI] = {.visible = true, .named = false}, + [anon_sym_EQ] = {.visible = true, .named = false}, + [anon_sym_LBRACK] = {.visible = true, .named = false}, + [anon_sym_RBRACK] = {.visible = true, .named = false}, + [anon_sym_DOT] = {.visible = true, .named = false}, + [anon_sym_LPAREN] = {.visible = true, .named = false}, + [anon_sym_RPAREN] = {.visible = true, .named = false}, + [anon_sym_STAR] = {.visible = true, .named = false}, + [anon_sym_const] = {.visible = true, .named = false}, + [anon_sym_restrict] = {.visible = true, .named = false}, + [anon_sym_volatile] = {.visible = true, .named = false}, + [anon_sym_PLUS] = {.visible = true, .named = false}, + [anon_sym_AMP] = {.visible = true, .named = false}, + [sym_string] = {.visible = true, .named = true}, + [sym_identifier] = {.visible = true, .named = true}, + [sym_number] = {.visible = true, .named = true}, + [sym_comment] = {.visible = true, .named = true}, }; static TSTree *ts_lex(TSLexer *lexer, TSStateId lex_state) { diff --git a/spec/fixtures/parsers/cpp.c b/spec/fixtures/parsers/cpp.c index c1b4926c..38c9e9c1 100644 --- a/spec/fixtures/parsers/cpp.c +++ b/spec/fixtures/parsers/cpp.c @@ -173,90 +173,90 @@ static const char *ts_symbol_names[] = { [sym_comment] = "comment", }; -static const TSNodeType ts_node_types[SYMBOL_COUNT] = { - [sym_translation_unit] = TSNodeTypeNamed, - [sym__declaration] = TSNodeTypeHidden, - [sym__block_declaration] = TSNodeTypeHidden, - [sym_function_definition] = TSNodeTypeNamed, - [sym_simple_declaration] = TSNodeTypeNamed, - [sym_namespace_alias_definition] = TSNodeTypeNamed, - [sym_scoped_identifier] = TSNodeTypeNamed, - [sym_declarator] = TSNodeTypeNamed, - [sym_abstract_declarator] = TSNodeTypeNamed, - [sym_direct_declarator] = TSNodeTypeNamed, - [sym_parameter_declaration] = TSNodeTypeNamed, - [sym_direct_abstract_declarator] = TSNodeTypeNamed, - [sym_cv_qualifier] = TSNodeTypeNamed, - [sym_type_id] = TSNodeTypeNamed, - [sym_pointer_operator] = TSNodeTypeNamed, - [sym_function_body] = TSNodeTypeNamed, - [sym_constructor_initializer] = TSNodeTypeNamed, - [sym_member_initializer] = TSNodeTypeNamed, - [sym_init_declarator] = TSNodeTypeNamed, - [sym_decl_specifier] = TSNodeTypeNamed, - [sym_storage_class_specifier] = TSNodeTypeNamed, - [sym_type_specifier] = TSNodeTypeNamed, - [sym_compound_statement] = TSNodeTypeNamed, - [sym__statement] = TSNodeTypeHidden, - [sym_expression_statement] = TSNodeTypeNamed, - [sym_initializer] = TSNodeTypeNamed, - [sym_initializer_clause] = TSNodeTypeNamed, - [sym_function_specifier] = TSNodeTypeNamed, - [sym__expression] = TSNodeTypeHidden, - [sym_call_expression] = TSNodeTypeNamed, - [sym_relational_expression] = TSNodeTypeNamed, - [sym_template_call] = TSNodeTypeNamed, - [aux_sym_translation_unit_repeat1] = TSNodeTypeHidden, - [aux_sym_function_definition_repeat1] = TSNodeTypeHidden, - [aux_sym_simple_declaration_repeat1] = TSNodeTypeHidden, - [aux_sym_declarator_repeat1] = TSNodeTypeHidden, - [aux_sym_direct_declarator_repeat1] = TSNodeTypeHidden, - [aux_sym_pointer_operator_repeat1] = TSNodeTypeHidden, - [aux_sym_constructor_initializer_repeat1] = TSNodeTypeHidden, - [aux_sym_compound_statement_repeat1] = TSNodeTypeHidden, - [aux_sym_call_expression_repeat1] = TSNodeTypeHidden, - [ts_builtin_sym_error] = TSNodeTypeNamed, - [ts_builtin_sym_end] = TSNodeTypeHidden, - [anon_sym_EQ] = TSNodeTypeAnonymous, - [anon_sym_default] = TSNodeTypeAnonymous, - [anon_sym_delete] = TSNodeTypeAnonymous, - [anon_sym_SEMI] = TSNodeTypeAnonymous, - [anon_sym_COMMA] = TSNodeTypeAnonymous, - [anon_sym_namespace] = TSNodeTypeAnonymous, - [anon_sym_COLON_COLON] = TSNodeTypeAnonymous, - [anon_sym_LPAREN] = TSNodeTypeAnonymous, - [anon_sym_RPAREN] = TSNodeTypeAnonymous, - [anon_sym_const] = TSNodeTypeAnonymous, - [anon_sym_volatile] = TSNodeTypeAnonymous, - [anon_sym_STAR] = TSNodeTypeAnonymous, - [anon_sym_AMP] = TSNodeTypeAnonymous, - [anon_sym_AMP_AMP] = TSNodeTypeAnonymous, - [anon_sym_COLON] = TSNodeTypeAnonymous, - [anon_sym_DOT_DOT_DOT] = TSNodeTypeAnonymous, - [anon_sym_initializer_list] = TSNodeTypeAnonymous, - [anon_sym_friend] = TSNodeTypeAnonymous, - [anon_sym_typedef] = TSNodeTypeAnonymous, - [anon_sym_constexpr] = TSNodeTypeAnonymous, - [anon_sym_register] = TSNodeTypeAnonymous, - [anon_sym_static] = TSNodeTypeAnonymous, - [anon_sym_thread_local] = TSNodeTypeAnonymous, - [anon_sym_extern] = TSNodeTypeAnonymous, - [anon_sym_mutable] = TSNodeTypeAnonymous, - [anon_sym_LBRACE] = TSNodeTypeAnonymous, - [anon_sym_RBRACE] = TSNodeTypeAnonymous, - [anon_sym_inline] = TSNodeTypeAnonymous, - [anon_sym_virtual] = TSNodeTypeAnonymous, - [anon_sym_explicit] = TSNodeTypeAnonymous, - [anon_sym_GT] = TSNodeTypeAnonymous, - [anon_sym_GT_EQ] = TSNodeTypeAnonymous, - [anon_sym_EQ_EQ] = TSNodeTypeAnonymous, - [anon_sym_BANG_EQ] = TSNodeTypeAnonymous, - [anon_sym_LT_EQ] = TSNodeTypeAnonymous, - [anon_sym_LT] = TSNodeTypeAnonymous, - [sym_string] = TSNodeTypeNamed, - [sym_identifier] = TSNodeTypeNamed, - [sym_number] = TSNodeTypeNamed, - [sym_comment] = TSNodeTypeNamed, +static const TSSymbolMetadata ts_symbol_metadata[SYMBOL_COUNT] = { + [sym_translation_unit] = {.visible = true, .named = true}, + [sym__declaration] = {.visible = false, .named = false}, + [sym__block_declaration] = {.visible = false, .named = false}, + [sym_function_definition] = {.visible = true, .named = true}, + [sym_simple_declaration] = {.visible = true, .named = true}, + [sym_namespace_alias_definition] = {.visible = true, .named = true}, + [sym_scoped_identifier] = {.visible = true, .named = true}, + [sym_declarator] = {.visible = true, .named = true}, + [sym_abstract_declarator] = {.visible = true, .named = true}, + [sym_direct_declarator] = {.visible = true, .named = true}, + [sym_parameter_declaration] = {.visible = true, .named = true}, + [sym_direct_abstract_declarator] = {.visible = true, .named = true}, + [sym_cv_qualifier] = {.visible = true, .named = true}, + [sym_type_id] = {.visible = true, .named = true}, + [sym_pointer_operator] = {.visible = true, .named = true}, + [sym_function_body] = {.visible = true, .named = true}, + [sym_constructor_initializer] = {.visible = true, .named = true}, + [sym_member_initializer] = {.visible = true, .named = true}, + [sym_init_declarator] = {.visible = true, .named = true}, + [sym_decl_specifier] = {.visible = true, .named = true}, + [sym_storage_class_specifier] = {.visible = true, .named = true}, + [sym_type_specifier] = {.visible = true, .named = true}, + [sym_compound_statement] = {.visible = true, .named = true}, + [sym__statement] = {.visible = false, .named = false}, + [sym_expression_statement] = {.visible = true, .named = true}, + [sym_initializer] = {.visible = true, .named = true}, + [sym_initializer_clause] = {.visible = true, .named = true}, + [sym_function_specifier] = {.visible = true, .named = true}, + [sym__expression] = {.visible = false, .named = false}, + [sym_call_expression] = {.visible = true, .named = true}, + [sym_relational_expression] = {.visible = true, .named = true}, + [sym_template_call] = {.visible = true, .named = true}, + [aux_sym_translation_unit_repeat1] = {.visible = false, .named = false}, + [aux_sym_function_definition_repeat1] = {.visible = false, .named = false}, + [aux_sym_simple_declaration_repeat1] = {.visible = false, .named = false}, + [aux_sym_declarator_repeat1] = {.visible = false, .named = false}, + [aux_sym_direct_declarator_repeat1] = {.visible = false, .named = false}, + [aux_sym_pointer_operator_repeat1] = {.visible = false, .named = false}, + [aux_sym_constructor_initializer_repeat1] = {.visible = false, .named = false}, + [aux_sym_compound_statement_repeat1] = {.visible = false, .named = false}, + [aux_sym_call_expression_repeat1] = {.visible = false, .named = false}, + [ts_builtin_sym_error] = {.visible = true, .named = true}, + [ts_builtin_sym_end] = {.visible = false, .named = false}, + [anon_sym_EQ] = {.visible = true, .named = false}, + [anon_sym_default] = {.visible = true, .named = false}, + [anon_sym_delete] = {.visible = true, .named = false}, + [anon_sym_SEMI] = {.visible = true, .named = false}, + [anon_sym_COMMA] = {.visible = true, .named = false}, + [anon_sym_namespace] = {.visible = true, .named = false}, + [anon_sym_COLON_COLON] = {.visible = true, .named = false}, + [anon_sym_LPAREN] = {.visible = true, .named = false}, + [anon_sym_RPAREN] = {.visible = true, .named = false}, + [anon_sym_const] = {.visible = true, .named = false}, + [anon_sym_volatile] = {.visible = true, .named = false}, + [anon_sym_STAR] = {.visible = true, .named = false}, + [anon_sym_AMP] = {.visible = true, .named = false}, + [anon_sym_AMP_AMP] = {.visible = true, .named = false}, + [anon_sym_COLON] = {.visible = true, .named = false}, + [anon_sym_DOT_DOT_DOT] = {.visible = true, .named = false}, + [anon_sym_initializer_list] = {.visible = true, .named = false}, + [anon_sym_friend] = {.visible = true, .named = false}, + [anon_sym_typedef] = {.visible = true, .named = false}, + [anon_sym_constexpr] = {.visible = true, .named = false}, + [anon_sym_register] = {.visible = true, .named = false}, + [anon_sym_static] = {.visible = true, .named = false}, + [anon_sym_thread_local] = {.visible = true, .named = false}, + [anon_sym_extern] = {.visible = true, .named = false}, + [anon_sym_mutable] = {.visible = true, .named = false}, + [anon_sym_LBRACE] = {.visible = true, .named = false}, + [anon_sym_RBRACE] = {.visible = true, .named = false}, + [anon_sym_inline] = {.visible = true, .named = false}, + [anon_sym_virtual] = {.visible = true, .named = false}, + [anon_sym_explicit] = {.visible = true, .named = false}, + [anon_sym_GT] = {.visible = true, .named = false}, + [anon_sym_GT_EQ] = {.visible = true, .named = false}, + [anon_sym_EQ_EQ] = {.visible = true, .named = false}, + [anon_sym_BANG_EQ] = {.visible = true, .named = false}, + [anon_sym_LT_EQ] = {.visible = true, .named = false}, + [anon_sym_LT] = {.visible = true, .named = false}, + [sym_string] = {.visible = true, .named = true}, + [sym_identifier] = {.visible = true, .named = true}, + [sym_number] = {.visible = true, .named = true}, + [sym_comment] = {.visible = true, .named = true}, }; static TSTree *ts_lex(TSLexer *lexer, TSStateId lex_state) { diff --git a/spec/fixtures/parsers/golang.c b/spec/fixtures/parsers/golang.c index 73497a8c..6726c25b 100644 --- a/spec/fixtures/parsers/golang.c +++ b/spec/fixtures/parsers/golang.c @@ -175,91 +175,91 @@ static const char *ts_symbol_names[] = { [sym_comment] = "comment", }; -static const TSNodeType ts_node_types[SYMBOL_COUNT] = { - [sym_program] = TSNodeTypeNamed, - [sym_package_directive] = TSNodeTypeNamed, - [sym_imports_block] = TSNodeTypeNamed, - [sym_package_import] = TSNodeTypeNamed, - [sym__declaration] = TSNodeTypeHidden, - [sym_type_declaration] = TSNodeTypeNamed, - [sym_var_declaration] = TSNodeTypeNamed, - [sym_func_declaration] = TSNodeTypeNamed, - [sym_block_statement] = TSNodeTypeNamed, - [sym__type_expression] = TSNodeTypeHidden, - [sym_pointer_type] = TSNodeTypeNamed, - [sym_map_type] = TSNodeTypeNamed, - [sym_slice_type] = TSNodeTypeNamed, - [sym_struct_type] = TSNodeTypeNamed, - [sym_interface_type] = TSNodeTypeNamed, - [sym__statement] = TSNodeTypeHidden, - [sym_return_statement] = TSNodeTypeNamed, - [sym_short_var_declaration] = TSNodeTypeNamed, - [sym_range_statement] = TSNodeTypeNamed, - [sym_if_statement] = TSNodeTypeNamed, - [sym_expression_statement] = TSNodeTypeNamed, - [sym__expression] = TSNodeTypeHidden, - [sym_call_expression] = TSNodeTypeNamed, - [sym_selector_expression] = TSNodeTypeNamed, - [sym_math_op] = TSNodeTypeNamed, - [sym_bool_op] = TSNodeTypeNamed, - [sym__func_signature] = TSNodeTypeHidden, - [sym_package_name] = TSNodeTypeNamed, - [sym_var_name] = TSNodeTypeNamed, - [sym_type_name] = TSNodeTypeNamed, - [aux_sym_program_repeat1] = TSNodeTypeHidden, - [aux_sym_program_repeat2] = TSNodeTypeHidden, - [aux_sym_imports_block_repeat1] = TSNodeTypeHidden, - [aux_sym_block_statement_repeat1] = TSNodeTypeHidden, - [aux_sym_struct_type_repeat1] = TSNodeTypeHidden, - [aux_sym_interface_type_repeat1] = TSNodeTypeHidden, - [aux_sym_return_statement_repeat1] = TSNodeTypeHidden, - [aux_sym_short_var_declaration_repeat1] = TSNodeTypeHidden, - [aux_sym__func_signature_repeat1] = TSNodeTypeHidden, - [aux_sym__func_signature_repeat2] = TSNodeTypeHidden, - [aux_sym__func_signature_repeat3] = TSNodeTypeHidden, - [ts_builtin_sym_error] = TSNodeTypeNamed, - [ts_builtin_sym_end] = TSNodeTypeHidden, - [anon_sym_package] = TSNodeTypeAnonymous, - [anon_sym_import] = TSNodeTypeAnonymous, - [anon_sym_LPAREN] = TSNodeTypeAnonymous, - [anon_sym_RPAREN] = TSNodeTypeAnonymous, - [anon_sym_type] = TSNodeTypeAnonymous, - [anon_sym_SEMI] = TSNodeTypeAnonymous, - [anon_sym_var] = TSNodeTypeAnonymous, - [anon_sym_EQ] = TSNodeTypeAnonymous, - [anon_sym_func] = TSNodeTypeAnonymous, - [anon_sym_LBRACE] = TSNodeTypeAnonymous, - [anon_sym_RBRACE] = TSNodeTypeAnonymous, - [anon_sym_STAR] = TSNodeTypeAnonymous, - [anon_sym_map] = TSNodeTypeAnonymous, - [anon_sym_LBRACK] = TSNodeTypeAnonymous, - [anon_sym_RBRACK] = TSNodeTypeAnonymous, - [anon_sym_struct] = TSNodeTypeAnonymous, - [anon_sym_interface] = TSNodeTypeAnonymous, - [anon_sym_return] = TSNodeTypeAnonymous, - [anon_sym_COMMA] = TSNodeTypeAnonymous, - [anon_sym_COLON_EQ] = TSNodeTypeAnonymous, - [anon_sym_for] = TSNodeTypeAnonymous, - [anon_sym_range] = TSNodeTypeAnonymous, - [anon_sym_if] = TSNodeTypeAnonymous, - [anon_sym_else] = TSNodeTypeAnonymous, - [anon_sym_DOT] = TSNodeTypeAnonymous, - [anon_sym_SLASH] = TSNodeTypeAnonymous, - [anon_sym_PLUS] = TSNodeTypeAnonymous, - [anon_sym_DASH] = TSNodeTypeAnonymous, - [anon_sym_PIPE_PIPE] = TSNodeTypeAnonymous, - [anon_sym_AMP_AMP] = TSNodeTypeAnonymous, - [anon_sym_EQ_EQ] = TSNodeTypeAnonymous, - [anon_sym_LT_EQ] = TSNodeTypeAnonymous, - [anon_sym_LT] = TSNodeTypeAnonymous, - [anon_sym_GT_EQ] = TSNodeTypeAnonymous, - [anon_sym_GT] = TSNodeTypeAnonymous, - [anon_sym_BANG] = TSNodeTypeAnonymous, - [sym__line_break] = TSNodeTypeHidden, - [sym_string] = TSNodeTypeNamed, - [sym__identifier] = TSNodeTypeHidden, - [sym_number] = TSNodeTypeNamed, - [sym_comment] = TSNodeTypeNamed, +static const TSSymbolMetadata ts_symbol_metadata[SYMBOL_COUNT] = { + [sym_program] = {.visible = true, .named = true}, + [sym_package_directive] = {.visible = true, .named = true}, + [sym_imports_block] = {.visible = true, .named = true}, + [sym_package_import] = {.visible = true, .named = true}, + [sym__declaration] = {.visible = false, .named = false}, + [sym_type_declaration] = {.visible = true, .named = true}, + [sym_var_declaration] = {.visible = true, .named = true}, + [sym_func_declaration] = {.visible = true, .named = true}, + [sym_block_statement] = {.visible = true, .named = true}, + [sym__type_expression] = {.visible = false, .named = false}, + [sym_pointer_type] = {.visible = true, .named = true}, + [sym_map_type] = {.visible = true, .named = true}, + [sym_slice_type] = {.visible = true, .named = true}, + [sym_struct_type] = {.visible = true, .named = true}, + [sym_interface_type] = {.visible = true, .named = true}, + [sym__statement] = {.visible = false, .named = false}, + [sym_return_statement] = {.visible = true, .named = true}, + [sym_short_var_declaration] = {.visible = true, .named = true}, + [sym_range_statement] = {.visible = true, .named = true}, + [sym_if_statement] = {.visible = true, .named = true}, + [sym_expression_statement] = {.visible = true, .named = true}, + [sym__expression] = {.visible = false, .named = false}, + [sym_call_expression] = {.visible = true, .named = true}, + [sym_selector_expression] = {.visible = true, .named = true}, + [sym_math_op] = {.visible = true, .named = true}, + [sym_bool_op] = {.visible = true, .named = true}, + [sym__func_signature] = {.visible = false, .named = false}, + [sym_package_name] = {.visible = true, .named = true}, + [sym_var_name] = {.visible = true, .named = true}, + [sym_type_name] = {.visible = true, .named = true}, + [aux_sym_program_repeat1] = {.visible = false, .named = false}, + [aux_sym_program_repeat2] = {.visible = false, .named = false}, + [aux_sym_imports_block_repeat1] = {.visible = false, .named = false}, + [aux_sym_block_statement_repeat1] = {.visible = false, .named = false}, + [aux_sym_struct_type_repeat1] = {.visible = false, .named = false}, + [aux_sym_interface_type_repeat1] = {.visible = false, .named = false}, + [aux_sym_return_statement_repeat1] = {.visible = false, .named = false}, + [aux_sym_short_var_declaration_repeat1] = {.visible = false, .named = false}, + [aux_sym__func_signature_repeat1] = {.visible = false, .named = false}, + [aux_sym__func_signature_repeat2] = {.visible = false, .named = false}, + [aux_sym__func_signature_repeat3] = {.visible = false, .named = false}, + [ts_builtin_sym_error] = {.visible = true, .named = true}, + [ts_builtin_sym_end] = {.visible = false, .named = false}, + [anon_sym_package] = {.visible = true, .named = false}, + [anon_sym_import] = {.visible = true, .named = false}, + [anon_sym_LPAREN] = {.visible = true, .named = false}, + [anon_sym_RPAREN] = {.visible = true, .named = false}, + [anon_sym_type] = {.visible = true, .named = false}, + [anon_sym_SEMI] = {.visible = true, .named = false}, + [anon_sym_var] = {.visible = true, .named = false}, + [anon_sym_EQ] = {.visible = true, .named = false}, + [anon_sym_func] = {.visible = true, .named = false}, + [anon_sym_LBRACE] = {.visible = true, .named = false}, + [anon_sym_RBRACE] = {.visible = true, .named = false}, + [anon_sym_STAR] = {.visible = true, .named = false}, + [anon_sym_map] = {.visible = true, .named = false}, + [anon_sym_LBRACK] = {.visible = true, .named = false}, + [anon_sym_RBRACK] = {.visible = true, .named = false}, + [anon_sym_struct] = {.visible = true, .named = false}, + [anon_sym_interface] = {.visible = true, .named = false}, + [anon_sym_return] = {.visible = true, .named = false}, + [anon_sym_COMMA] = {.visible = true, .named = false}, + [anon_sym_COLON_EQ] = {.visible = true, .named = false}, + [anon_sym_for] = {.visible = true, .named = false}, + [anon_sym_range] = {.visible = true, .named = false}, + [anon_sym_if] = {.visible = true, .named = false}, + [anon_sym_else] = {.visible = true, .named = false}, + [anon_sym_DOT] = {.visible = true, .named = false}, + [anon_sym_SLASH] = {.visible = true, .named = false}, + [anon_sym_PLUS] = {.visible = true, .named = false}, + [anon_sym_DASH] = {.visible = true, .named = false}, + [anon_sym_PIPE_PIPE] = {.visible = true, .named = false}, + [anon_sym_AMP_AMP] = {.visible = true, .named = false}, + [anon_sym_EQ_EQ] = {.visible = true, .named = false}, + [anon_sym_LT_EQ] = {.visible = true, .named = false}, + [anon_sym_LT] = {.visible = true, .named = false}, + [anon_sym_GT_EQ] = {.visible = true, .named = false}, + [anon_sym_GT] = {.visible = true, .named = false}, + [anon_sym_BANG] = {.visible = true, .named = false}, + [sym__line_break] = {.visible = false, .named = false}, + [sym_string] = {.visible = true, .named = true}, + [sym__identifier] = {.visible = false, .named = false}, + [sym_number] = {.visible = true, .named = true}, + [sym_comment] = {.visible = true, .named = true}, }; static TSTree *ts_lex(TSLexer *lexer, TSStateId lex_state) { diff --git a/spec/fixtures/parsers/javascript.c b/spec/fixtures/parsers/javascript.c index 216af2d8..5108d6de 100644 --- a/spec/fixtures/parsers/javascript.c +++ b/spec/fixtures/parsers/javascript.c @@ -219,113 +219,113 @@ static const char *ts_symbol_names[] = { [sym__line_break] = "_line_break", }; -static const TSNodeType ts_node_types[SYMBOL_COUNT] = { - [sym_program] = TSNodeTypeNamed, - [sym__statement] = TSNodeTypeHidden, - [sym_expression_statement] = TSNodeTypeNamed, - [sym_var_declaration] = TSNodeTypeNamed, - [sym_statement_block] = TSNodeTypeNamed, - [sym_if_statement] = TSNodeTypeNamed, - [sym_switch_statement] = TSNodeTypeNamed, - [sym_for_statement] = TSNodeTypeNamed, - [sym_for_in_statement] = TSNodeTypeNamed, - [sym_while_statement] = TSNodeTypeNamed, - [sym_try_statement] = TSNodeTypeNamed, - [sym_return_statement] = TSNodeTypeNamed, - [sym_throw_statement] = TSNodeTypeNamed, - [sym_break_statement] = TSNodeTypeNamed, - [sym_delete_statement] = TSNodeTypeNamed, - [sym_case] = TSNodeTypeNamed, - [sym_default] = TSNodeTypeNamed, - [sym_catch] = TSNodeTypeNamed, - [sym_finally] = TSNodeTypeNamed, - [sym_var_assignment] = TSNodeTypeNamed, - [sym__paren_expression] = TSNodeTypeHidden, - [sym__expression] = TSNodeTypeHidden, - [sym_object] = TSNodeTypeNamed, - [sym_array] = TSNodeTypeNamed, - [sym_function_expression] = TSNodeTypeNamed, - [sym_function_call] = TSNodeTypeNamed, - [sym_constructor_call] = TSNodeTypeNamed, - [sym_member_access] = TSNodeTypeNamed, - [sym_subscript_access] = TSNodeTypeNamed, - [sym_assignment] = TSNodeTypeNamed, - [sym_math_assignment] = TSNodeTypeNamed, - [sym_ternary] = TSNodeTypeNamed, - [sym_bool_op] = TSNodeTypeNamed, - [sym_math_op] = TSNodeTypeNamed, - [sym_rel_op] = TSNodeTypeNamed, - [sym_type_op] = TSNodeTypeNamed, - [sym_formal_parameters] = TSNodeTypeNamed, - [sym_arguments] = TSNodeTypeNamed, - [sym_pair] = TSNodeTypeNamed, - [aux_sym_program_repeat1] = TSNodeTypeHidden, - [aux_sym_var_declaration_repeat1] = TSNodeTypeHidden, - [aux_sym_switch_statement_repeat1] = TSNodeTypeHidden, - [aux_sym_object_repeat1] = TSNodeTypeHidden, - [aux_sym_array_repeat1] = TSNodeTypeHidden, - [aux_sym_formal_parameters_repeat1] = TSNodeTypeHidden, - [ts_builtin_sym_error] = TSNodeTypeNamed, - [ts_builtin_sym_end] = TSNodeTypeHidden, - [anon_sym_SEMI] = TSNodeTypeAnonymous, - [anon_sym_var] = TSNodeTypeAnonymous, - [anon_sym_COMMA] = TSNodeTypeAnonymous, - [anon_sym_LBRACE] = TSNodeTypeAnonymous, - [anon_sym_RBRACE] = TSNodeTypeAnonymous, - [anon_sym_if] = TSNodeTypeAnonymous, - [anon_sym_else] = TSNodeTypeAnonymous, - [anon_sym_switch] = TSNodeTypeAnonymous, - [anon_sym_for] = TSNodeTypeAnonymous, - [anon_sym_LPAREN] = TSNodeTypeAnonymous, - [anon_sym_RPAREN] = TSNodeTypeAnonymous, - [anon_sym_in] = TSNodeTypeAnonymous, - [anon_sym_while] = TSNodeTypeAnonymous, - [anon_sym_try] = TSNodeTypeAnonymous, - [anon_sym_return] = TSNodeTypeAnonymous, - [anon_sym_throw] = TSNodeTypeAnonymous, - [anon_sym_break] = TSNodeTypeAnonymous, - [anon_sym_delete] = TSNodeTypeAnonymous, - [anon_sym_case] = TSNodeTypeAnonymous, - [anon_sym_COLON] = TSNodeTypeAnonymous, - [anon_sym_default] = TSNodeTypeAnonymous, - [anon_sym_catch] = TSNodeTypeAnonymous, - [anon_sym_finally] = TSNodeTypeAnonymous, - [anon_sym_EQ] = TSNodeTypeAnonymous, - [anon_sym_LBRACK] = TSNodeTypeAnonymous, - [anon_sym_RBRACK] = TSNodeTypeAnonymous, - [anon_sym_function] = TSNodeTypeAnonymous, - [anon_sym_new] = TSNodeTypeAnonymous, - [anon_sym_DOT] = TSNodeTypeAnonymous, - [anon_sym_PLUS_EQ] = TSNodeTypeAnonymous, - [anon_sym_DASH_EQ] = TSNodeTypeAnonymous, - [anon_sym_STAR_EQ] = TSNodeTypeAnonymous, - [anon_sym_SLASH_EQ] = TSNodeTypeAnonymous, - [anon_sym_QMARK] = TSNodeTypeAnonymous, - [anon_sym_PIPE_PIPE] = TSNodeTypeAnonymous, - [anon_sym_AMP_AMP] = TSNodeTypeAnonymous, - [anon_sym_BANG] = TSNodeTypeAnonymous, - [anon_sym_PLUS_PLUS] = TSNodeTypeAnonymous, - [anon_sym_DASH_DASH] = TSNodeTypeAnonymous, - [anon_sym_STAR] = TSNodeTypeAnonymous, - [anon_sym_SLASH] = TSNodeTypeAnonymous, - [anon_sym_PLUS] = TSNodeTypeAnonymous, - [anon_sym_DASH] = TSNodeTypeAnonymous, - [anon_sym_EQ_EQ_EQ] = TSNodeTypeAnonymous, - [anon_sym_BANG_EQ_EQ] = TSNodeTypeAnonymous, - [anon_sym_LT] = TSNodeTypeAnonymous, - [anon_sym_GT] = TSNodeTypeAnonymous, - [anon_sym_instanceof] = TSNodeTypeAnonymous, - [anon_sym_typeof] = TSNodeTypeAnonymous, - [sym_comment] = TSNodeTypeNamed, - [sym_string] = TSNodeTypeNamed, - [sym_regex] = TSNodeTypeNamed, - [sym_number] = TSNodeTypeNamed, - [sym_identifier] = TSNodeTypeNamed, - [sym_null] = TSNodeTypeNamed, - [sym_undefined] = TSNodeTypeNamed, - [sym_true] = TSNodeTypeNamed, - [sym_false] = TSNodeTypeNamed, - [sym__line_break] = TSNodeTypeHidden, +static const TSSymbolMetadata ts_symbol_metadata[SYMBOL_COUNT] = { + [sym_program] = {.visible = true, .named = true}, + [sym__statement] = {.visible = false, .named = false}, + [sym_expression_statement] = {.visible = true, .named = true}, + [sym_var_declaration] = {.visible = true, .named = true}, + [sym_statement_block] = {.visible = true, .named = true}, + [sym_if_statement] = {.visible = true, .named = true}, + [sym_switch_statement] = {.visible = true, .named = true}, + [sym_for_statement] = {.visible = true, .named = true}, + [sym_for_in_statement] = {.visible = true, .named = true}, + [sym_while_statement] = {.visible = true, .named = true}, + [sym_try_statement] = {.visible = true, .named = true}, + [sym_return_statement] = {.visible = true, .named = true}, + [sym_throw_statement] = {.visible = true, .named = true}, + [sym_break_statement] = {.visible = true, .named = true}, + [sym_delete_statement] = {.visible = true, .named = true}, + [sym_case] = {.visible = true, .named = true}, + [sym_default] = {.visible = true, .named = true}, + [sym_catch] = {.visible = true, .named = true}, + [sym_finally] = {.visible = true, .named = true}, + [sym_var_assignment] = {.visible = true, .named = true}, + [sym__paren_expression] = {.visible = false, .named = false}, + [sym__expression] = {.visible = false, .named = false}, + [sym_object] = {.visible = true, .named = true}, + [sym_array] = {.visible = true, .named = true}, + [sym_function_expression] = {.visible = true, .named = true}, + [sym_function_call] = {.visible = true, .named = true}, + [sym_constructor_call] = {.visible = true, .named = true}, + [sym_member_access] = {.visible = true, .named = true}, + [sym_subscript_access] = {.visible = true, .named = true}, + [sym_assignment] = {.visible = true, .named = true}, + [sym_math_assignment] = {.visible = true, .named = true}, + [sym_ternary] = {.visible = true, .named = true}, + [sym_bool_op] = {.visible = true, .named = true}, + [sym_math_op] = {.visible = true, .named = true}, + [sym_rel_op] = {.visible = true, .named = true}, + [sym_type_op] = {.visible = true, .named = true}, + [sym_formal_parameters] = {.visible = true, .named = true}, + [sym_arguments] = {.visible = true, .named = true}, + [sym_pair] = {.visible = true, .named = true}, + [aux_sym_program_repeat1] = {.visible = false, .named = false}, + [aux_sym_var_declaration_repeat1] = {.visible = false, .named = false}, + [aux_sym_switch_statement_repeat1] = {.visible = false, .named = false}, + [aux_sym_object_repeat1] = {.visible = false, .named = false}, + [aux_sym_array_repeat1] = {.visible = false, .named = false}, + [aux_sym_formal_parameters_repeat1] = {.visible = false, .named = false}, + [ts_builtin_sym_error] = {.visible = true, .named = true}, + [ts_builtin_sym_end] = {.visible = false, .named = false}, + [anon_sym_SEMI] = {.visible = true, .named = false}, + [anon_sym_var] = {.visible = true, .named = false}, + [anon_sym_COMMA] = {.visible = true, .named = false}, + [anon_sym_LBRACE] = {.visible = true, .named = false}, + [anon_sym_RBRACE] = {.visible = true, .named = false}, + [anon_sym_if] = {.visible = true, .named = false}, + [anon_sym_else] = {.visible = true, .named = false}, + [anon_sym_switch] = {.visible = true, .named = false}, + [anon_sym_for] = {.visible = true, .named = false}, + [anon_sym_LPAREN] = {.visible = true, .named = false}, + [anon_sym_RPAREN] = {.visible = true, .named = false}, + [anon_sym_in] = {.visible = true, .named = false}, + [anon_sym_while] = {.visible = true, .named = false}, + [anon_sym_try] = {.visible = true, .named = false}, + [anon_sym_return] = {.visible = true, .named = false}, + [anon_sym_throw] = {.visible = true, .named = false}, + [anon_sym_break] = {.visible = true, .named = false}, + [anon_sym_delete] = {.visible = true, .named = false}, + [anon_sym_case] = {.visible = true, .named = false}, + [anon_sym_COLON] = {.visible = true, .named = false}, + [anon_sym_default] = {.visible = true, .named = false}, + [anon_sym_catch] = {.visible = true, .named = false}, + [anon_sym_finally] = {.visible = true, .named = false}, + [anon_sym_EQ] = {.visible = true, .named = false}, + [anon_sym_LBRACK] = {.visible = true, .named = false}, + [anon_sym_RBRACK] = {.visible = true, .named = false}, + [anon_sym_function] = {.visible = true, .named = false}, + [anon_sym_new] = {.visible = true, .named = false}, + [anon_sym_DOT] = {.visible = true, .named = false}, + [anon_sym_PLUS_EQ] = {.visible = true, .named = false}, + [anon_sym_DASH_EQ] = {.visible = true, .named = false}, + [anon_sym_STAR_EQ] = {.visible = true, .named = false}, + [anon_sym_SLASH_EQ] = {.visible = true, .named = false}, + [anon_sym_QMARK] = {.visible = true, .named = false}, + [anon_sym_PIPE_PIPE] = {.visible = true, .named = false}, + [anon_sym_AMP_AMP] = {.visible = true, .named = false}, + [anon_sym_BANG] = {.visible = true, .named = false}, + [anon_sym_PLUS_PLUS] = {.visible = true, .named = false}, + [anon_sym_DASH_DASH] = {.visible = true, .named = false}, + [anon_sym_STAR] = {.visible = true, .named = false}, + [anon_sym_SLASH] = {.visible = true, .named = false}, + [anon_sym_PLUS] = {.visible = true, .named = false}, + [anon_sym_DASH] = {.visible = true, .named = false}, + [anon_sym_EQ_EQ_EQ] = {.visible = true, .named = false}, + [anon_sym_BANG_EQ_EQ] = {.visible = true, .named = false}, + [anon_sym_LT] = {.visible = true, .named = false}, + [anon_sym_GT] = {.visible = true, .named = false}, + [anon_sym_instanceof] = {.visible = true, .named = false}, + [anon_sym_typeof] = {.visible = true, .named = false}, + [sym_comment] = {.visible = true, .named = true}, + [sym_string] = {.visible = true, .named = true}, + [sym_regex] = {.visible = true, .named = true}, + [sym_number] = {.visible = true, .named = true}, + [sym_identifier] = {.visible = true, .named = true}, + [sym_null] = {.visible = true, .named = true}, + [sym_undefined] = {.visible = true, .named = true}, + [sym_true] = {.visible = true, .named = true}, + [sym_false] = {.visible = true, .named = true}, + [sym__line_break] = {.visible = false, .named = false}, }; static TSTree *ts_lex(TSLexer *lexer, TSStateId lex_state) { diff --git a/spec/fixtures/parsers/json.c b/spec/fixtures/parsers/json.c index 842f4cbc..18eaf998 100644 --- a/spec/fixtures/parsers/json.c +++ b/spec/fixtures/parsers/json.c @@ -43,25 +43,25 @@ static const char *ts_symbol_names[] = { [sym_false] = "false", }; -static const TSNodeType ts_node_types[SYMBOL_COUNT] = { - [sym__value] = TSNodeTypeHidden, - [sym_object] = TSNodeTypeNamed, - [sym_array] = TSNodeTypeNamed, - [aux_sym_object_repeat1] = TSNodeTypeHidden, - [aux_sym_array_repeat1] = TSNodeTypeHidden, - [ts_builtin_sym_error] = TSNodeTypeNamed, - [ts_builtin_sym_end] = TSNodeTypeHidden, - [anon_sym_LBRACE] = TSNodeTypeAnonymous, - [anon_sym_COLON] = TSNodeTypeAnonymous, - [anon_sym_COMMA] = TSNodeTypeAnonymous, - [anon_sym_RBRACE] = TSNodeTypeAnonymous, - [anon_sym_LBRACK] = TSNodeTypeAnonymous, - [anon_sym_RBRACK] = TSNodeTypeAnonymous, - [sym_string] = TSNodeTypeNamed, - [sym_number] = TSNodeTypeNamed, - [sym_null] = TSNodeTypeNamed, - [sym_true] = TSNodeTypeNamed, - [sym_false] = TSNodeTypeNamed, +static const TSSymbolMetadata ts_symbol_metadata[SYMBOL_COUNT] = { + [sym__value] = {.visible = false, .named = false}, + [sym_object] = {.visible = true, .named = true}, + [sym_array] = {.visible = true, .named = true}, + [aux_sym_object_repeat1] = {.visible = false, .named = false}, + [aux_sym_array_repeat1] = {.visible = false, .named = false}, + [ts_builtin_sym_error] = {.visible = true, .named = true}, + [ts_builtin_sym_end] = {.visible = false, .named = false}, + [anon_sym_LBRACE] = {.visible = true, .named = false}, + [anon_sym_COLON] = {.visible = true, .named = false}, + [anon_sym_COMMA] = {.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}, + [sym_string] = {.visible = true, .named = true}, + [sym_number] = {.visible = true, .named = true}, + [sym_null] = {.visible = true, .named = true}, + [sym_true] = {.visible = true, .named = true}, + [sym_false] = {.visible = true, .named = true}, }; static TSTree *ts_lex(TSLexer *lexer, TSStateId lex_state) { diff --git a/spec/runtime/node_spec.cc b/spec/runtime/node_spec.cc index ce5eb772..1e38ee19 100644 --- a/spec/runtime/node_spec.cc +++ b/spec/runtime/node_spec.cc @@ -225,7 +225,7 @@ describe("Node", []() { }); }); - describe("next_named_sibling(), prev_concrete_sibling()", [&]() { + describe("next_named_sibling(), prev_named_sibling()", [&]() { it("returns the node's next and previous siblings", [&]() { TSNode number_node = ts_node_named_child(array_node, 0); TSNode false_node = ts_node_named_child(array_node, 1); @@ -249,7 +249,7 @@ describe("Node", []() { }); }); - describe("find_for_range(start, end)", [&]() { + describe("named_descendant_for_range(start, end)", [&]() { describe("when there is a leaf node that spans the given range exactly", [&]() { it("returns that leaf node", [&]() { TSNode leaf = ts_node_named_descendent_for_range(array_node, 28, 30); diff --git a/spec/runtime/stack_spec.cc b/spec/runtime/stack_spec.cc index 7c825642..355ae563 100644 --- a/spec/runtime/stack_spec.cc +++ b/spec/runtime/stack_spec.cc @@ -43,8 +43,9 @@ describe("Stack", [&]() { }); TSLength len = ts_length_make(2, 2); + TSPoint point = ts_point_make(1, 1); for (size_t i = 0; i < tree_count; i++) - trees[i] = ts_tree_make_leaf(i, len, len, {1, 1}, {1, 2}, TSNodeTypeNamed); + trees[i] = ts_tree_make_leaf(i, len, len, point, point, {}); }); after_each([&]() { diff --git a/spec/runtime/tree_spec.cc b/spec/runtime/tree_spec.cc index 99125dbe..3b0922f7 100644 --- a/spec/runtime/tree_spec.cc +++ b/spec/runtime/tree_spec.cc @@ -27,14 +27,16 @@ static const char *names[] = { describe("Tree", []() { TSTree *tree1, *tree2, *parent1; + TSSymbolMetadata visible = {true, true}; + TSSymbolMetadata invisible = {false, false}; before_each([&]() { - tree1 = ts_tree_make_leaf(cat, {2, 1}, {5, 4}, ts_point_zero(), ts_point_zero(), TSNodeTypeNamed); - tree2 = ts_tree_make_leaf(cat, {1, 1}, {3, 3}, ts_point_zero(), ts_point_zero(), TSNodeTypeNamed); + tree1 = ts_tree_make_leaf(cat, {2, 1}, {5, 4}, ts_point_zero(), ts_point_zero(), visible); + tree2 = ts_tree_make_leaf(cat, {1, 1}, {3, 3}, ts_point_zero(), ts_point_zero(), visible); parent1 = ts_tree_make_node(dog, 2, tree_array({ tree1, tree2, - }), TSNodeTypeNamed); + }), visible); }); after_each([&]() { @@ -86,7 +88,7 @@ describe("Tree", []() { parent = ts_tree_make_node(eel, 2, tree_array({ tree1, tree2, - }), TSNodeTypeNamed); + }), visible); }); after_each([&]() { @@ -107,7 +109,7 @@ describe("Tree", []() { parent = ts_tree_make_node(eel, 2, tree_array({ tree1, tree2, - }), TSNodeTypeNamed); + }), visible); }); after_each([&]() { @@ -128,7 +130,7 @@ describe("Tree", []() { parent = ts_tree_make_node(eel, 2, tree_array({ tree1, tree2, - }), TSNodeTypeNamed); + }), visible); }); after_each([&]() { @@ -147,10 +149,10 @@ describe("Tree", []() { before_each([&]() { tree = ts_tree_make_node(cat, 3, tree_array({ - ts_tree_make_leaf(dog, {2, 2}, {3, 3}, {1, 2}, {1, 3}, TSNodeTypeNamed), - ts_tree_make_leaf(eel, {2, 2}, {3, 3}, {1, 2}, {1, 3}, TSNodeTypeNamed), - ts_tree_make_leaf(fox, {2, 2}, {3, 3}, {1, 2}, {1, 3}, TSNodeTypeNamed), - }), TSNodeTypeNamed); + ts_tree_make_leaf(dog, {2, 2}, {3, 3}, {1, 2}, {1, 3}, visible), + ts_tree_make_leaf(eel, {2, 2}, {3, 3}, {1, 2}, {1, 3}, visible), + ts_tree_make_leaf(fox, {2, 2}, {3, 3}, {1, 2}, {1, 3}, visible), + }), visible); AssertThat(tree->padding, Equals({2, 2})); AssertThat(tree->size, Equals({13, 13})); @@ -268,16 +270,16 @@ describe("Tree", []() { describe("equality", [&]() { it("returns true for identical trees", [&]() { - TSTree *tree1_copy = ts_tree_make_leaf(cat, {2, 1}, {5, 4}, {1, 1}, {1, 4}, TSNodeTypeNamed); + TSTree *tree1_copy = ts_tree_make_leaf(cat, {2, 1}, {5, 4}, {1, 1}, {1, 4}, visible); AssertThat(ts_tree_eq(tree1, tree1_copy), IsTrue()); - TSTree *tree2_copy = ts_tree_make_leaf(cat, {1, 1}, {3, 3}, {1, 1}, {1, 3}, TSNodeTypeNamed); + TSTree *tree2_copy = ts_tree_make_leaf(cat, {1, 1}, {3, 3}, {1, 1}, {1, 3}, visible); AssertThat(ts_tree_eq(tree2, tree2_copy), IsTrue()); TSTree *parent2 = ts_tree_make_node(dog, 2, tree_array({ tree1_copy, tree2_copy, - }), TSNodeTypeNamed); + }), visible); AssertThat(ts_tree_eq(parent1, parent2), IsTrue()); @@ -293,12 +295,28 @@ describe("Tree", []() { tree1->size, tree1->padding_point, tree1->size_point, - TSNodeTypeNamed); + visible); AssertThat(ts_tree_eq(tree1, different_tree), IsFalse()); ts_tree_release(different_tree); }); + it("returns false for trees with different options", [&]() { + TSTree *tree1_copy = ts_tree_make_leaf(cat, tree1->padding, tree1->size, tree1->padding_point, tree1->size_point, invisible); + AssertThat(ts_tree_eq(tree1, tree1_copy), IsFalse()); + ts_tree_release(tree1_copy); + }); + + it("returns false for trees with different 2D dimensions", [&]() { + TSTree *tree1_copy = ts_tree_make_leaf(cat, tree1->padding, tree1->size, {5, 10}, tree1->size_point, invisible); + AssertThat(ts_tree_eq(tree1, tree1_copy), IsFalse()); + ts_tree_release(tree1_copy); + + tree1_copy = ts_tree_make_leaf(cat, tree1->padding, tree1->size, tree1->padding_point, {5, 10}, invisible); + AssertThat(ts_tree_eq(tree1, tree1_copy), IsFalse()); + ts_tree_release(tree1_copy); + }); + it("returns false for trees with different children", [&]() { TSTree *different_tree = ts_tree_make_leaf( tree1->symbol + 1, @@ -306,11 +324,11 @@ describe("Tree", []() { tree1->size, tree1->padding_point, tree1->size_point, - TSNodeTypeNamed); + visible); TSTree *different_parent = ts_tree_make_node(dog, 2, tree_array({ different_tree, different_tree, - }), TSNodeTypeNamed); + }), visible); AssertThat(ts_tree_eq(different_parent, parent1), IsFalse()); AssertThat(ts_tree_eq(parent1, different_parent), IsFalse()); @@ -332,7 +350,7 @@ describe("Tree", []() { }); it("hides invisible nodes", [&]() { - tree2->options.type = TSNodeTypeHidden; + tree2->options.visible = false; char *string1 = ts_tree_string(parent1, names, true); AssertThat(string(string1), Equals("(dog (cat))")); @@ -341,13 +359,13 @@ describe("Tree", []() { describe("when the root node is not visible", [&]() { it("still serializes it", [&]() { - parent1->options.type = TSNodeTypeHidden; + parent1->options.visible = false; char *string1 = ts_tree_string(parent1, names, true); AssertThat(string(string1), Equals("(dog (cat) (cat))")); free(string1); - tree1->options.type = TSNodeTypeHidden; + tree1->options.visible = false; char *string2 = ts_tree_string(tree1, names, true); AssertThat(string(string2), Equals("(cat)")); diff --git a/src/compiler/generate_code/c_code.cc b/src/compiler/generate_code/c_code.cc index c7768ef0..96aae2eb 100644 --- a/src/compiler/generate_code/c_code.cc +++ b/src/compiler/generate_code/c_code.cc @@ -142,23 +142,25 @@ class CCodeGenerator { } void add_symbol_node_types_list() { - line("static const TSNodeType ts_node_types[SYMBOL_COUNT] = {"); + line("static const TSSymbolMetadata ts_symbol_metadata[SYMBOL_COUNT] = {"); indent([&]() { for (const auto &symbol : parse_table.symbols) { - line("[" + symbol_id(symbol) + "] = "); + line("[" + symbol_id(symbol) + "] = {"); switch (symbol_type(symbol)) { case VariableTypeNamed: - add("TSNodeTypeNamed,"); + add(".visible = true, .named = true"); break; case VariableTypeAnonymous: - add("TSNodeTypeAnonymous,"); + add(".visible = true, .named = false"); break; case VariableTypeHidden: case VariableTypeAuxiliary: - add("TSNodeTypeHidden,"); + add(".visible = false, .named = false"); break; } + + add("},"); } }); line("};"); diff --git a/src/runtime/lexer.c b/src/runtime/lexer.c index 91af5222..36157b25 100644 --- a/src/runtime/lexer.c +++ b/src/runtime/lexer.c @@ -83,7 +83,8 @@ static bool ts_lexer__advance(TSLexer *self, TSStateId state) { } static TSTree *ts_lexer__accept(TSLexer *self, TSSymbol symbol, - TSNodeType node_type, const char *symbol_name) { + TSSymbolMetadata metadata, + const char *symbol_name) { TSLength size = ts_length_sub(self->current_position, self->token_start_position); TSLength padding = @@ -99,7 +100,7 @@ static TSTree *ts_lexer__accept(TSLexer *self, TSSymbol symbol, return ts_tree_make_error(size, padding, size_point, padding_point, self->lookahead); } else { LOG("accept_token sym:%s", symbol_name); - return ts_tree_make_leaf(symbol, padding, size, padding_point, size_point, node_type); + return ts_tree_make_leaf(symbol, padding, size, padding_point, size_point, metadata); } } diff --git a/src/runtime/node.c b/src/runtime/node.c index cbc720ce..07f57b60 100644 --- a/src/runtime/node.c +++ b/src/runtime/node.c @@ -24,9 +24,17 @@ static inline TSLength ts_node__offset(TSNode self) { return self.offset; } +static inline bool ts_tree__is_relevant(const TSTree *tree, bool include_anonymous) { + return include_anonymous ? tree->options.visible : tree->options.named; +} + +static inline size_t ts_tree__relevant_child_count(const TSTree *tree, + bool include_anonymous) { + return include_anonymous ? tree->visible_child_count : tree->named_child_count; +} static inline TSNode ts_node__child(TSNode self, size_t child_index, - TSNodeType type) { + bool include_anonymous) { const TSTree *tree = ts_node__tree(self); TSLength position = ts_node__offset(self); size_t offset_row = self.row; @@ -38,15 +46,14 @@ static inline TSNode ts_node__child(TSNode self, size_t child_index, size_t index = 0; for (size_t i = 0; i < tree->child_count; i++) { TSTree *child = tree->children[i]; - if (child->options.type >= type) { + if (ts_tree__is_relevant(child, include_anonymous)) { if (index == child_index) return ts_node_make(child, position, offset_row); index++; } else { size_t grandchild_index = child_index - index; - size_t grandchild_count = (type == TSNodeTypeNamed) - ? child->named_child_count - : child->visible_child_count; + size_t grandchild_count = + ts_tree__relevant_child_count(child, include_anonymous); if (grandchild_index < grandchild_count) { did_descend = true; tree = child; @@ -63,7 +70,7 @@ static inline TSNode ts_node__child(TSNode self, size_t child_index, return ts_node__null(); } -static inline TSNode ts_node__prev_sibling(TSNode self, TSNodeType type) { +static inline TSNode ts_node__prev_sibling(TSNode self, bool include_anonymous) { const TSTree *tree = ts_node__tree(self); TSLength offset = ts_node__offset(self); size_t offset_row = self.row; @@ -80,21 +87,19 @@ static inline TSNode ts_node__prev_sibling(TSNode self, TSNodeType type) { const TSTree *child = tree->children[i]; TSLength child_offset = ts_length_add(offset, child->context.offset); size_t child_offset_row = offset_row + child->context.offset_point.row; - if (child->options.type >= type) + if (ts_tree__is_relevant(child, include_anonymous)) return ts_node_make(child, child_offset, child_offset_row); - size_t grandchild_count = (type == TSNodeTypeNamed) - ? child->named_child_count - : child->visible_child_count; + size_t grandchild_count = ts_tree__relevant_child_count(child, include_anonymous); if (grandchild_count > 0) return ts_node__child(ts_node_make(child, child_offset, child_offset_row), - grandchild_count - 1, type); + grandchild_count - 1, include_anonymous); } } while (!ts_tree_is_visible(tree)); return ts_node__null(); } -static inline TSNode ts_node__next_sibling(TSNode self, TSNodeType type) { +static inline TSNode ts_node__next_sibling(TSNode self, bool include_anonymous) { const TSTree *tree = ts_node__tree(self); TSLength offset = ts_node__offset(self); size_t offset_row = self.row; @@ -111,13 +116,12 @@ static inline TSNode ts_node__next_sibling(TSNode self, TSNodeType type) { const TSTree *child = tree->children[i]; TSLength child_offset = ts_length_add(offset, child->context.offset); size_t child_offset_row = offset_row + child->context.offset_point.row; - if (child->options.type >= type) + if (ts_tree__is_relevant(child, include_anonymous)) return ts_node_make(child, child_offset, child_offset_row); - size_t grandchild_count = (type == TSNodeTypeNamed) - ? child->named_child_count - : child->visible_child_count; + size_t grandchild_count = ts_tree__relevant_child_count(child, include_anonymous); if (grandchild_count > 0) - return ts_node__child(ts_node_make(child, child_offset, child_offset_row), 0, type); + return ts_node__child(ts_node_make(child, child_offset, child_offset_row), 0, + include_anonymous); } } while (!ts_tree_is_visible(tree)); @@ -125,9 +129,10 @@ static inline TSNode ts_node__next_sibling(TSNode self, TSNodeType type) { } static inline TSNode ts_node__descendent_for_range(TSNode self, size_t min, - size_t max, TSNodeType type) { + size_t max, + bool include_anonymous) { const TSTree *tree = ts_node__tree(self), *last_visible_tree = tree; - TSLength position = ts_node__offset(self), last_visible_position = position; + TSLength offset = ts_node__offset(self), last_visible_position = offset; size_t offset_row = self.row, last_visible_row = offset_row; bool did_descend = true; @@ -136,19 +141,19 @@ static inline TSNode ts_node__descendent_for_range(TSNode self, size_t min, for (size_t i = 0; i < tree->child_count; i++) { const TSTree *child = tree->children[i]; - if (position.chars + child->padding.chars > min) + if (offset.chars + child->padding.chars > min) break; - if (position.chars + child->padding.chars + child->size.chars > max) { + if (offset.chars + child->padding.chars + child->size.chars > max) { tree = child; - if (child->options.type >= type) { + if (ts_tree__is_relevant(child, include_anonymous)) { last_visible_tree = tree; - last_visible_position = position; + last_visible_position = offset; last_visible_row = offset_row; } did_descend = true; break; } - position = ts_length_add(position, ts_tree_total_size(child)); + offset = ts_length_add(offset, ts_tree_total_size(child)); offset_row += child->padding_point.row + child->size_point.row; } } @@ -201,7 +206,7 @@ bool ts_node_eq(TSNode self, TSNode other) { } bool ts_node_is_named(TSNode self) { - return ts_node__tree(self)->options.type == TSNodeTypeNamed; + return ts_node__tree(self)->options.named; } bool ts_node_has_changes(TSNode self) { @@ -210,11 +215,11 @@ bool ts_node_has_changes(TSNode self) { TSNode ts_node_parent(TSNode self) { const TSTree *tree = ts_node__tree(self); - TSLength position = ts_node__offset(self); + TSLength offset = ts_node__offset(self); size_t offset_row = self.row; do { - position = ts_length_sub(position, tree->context.offset); + offset = ts_length_sub(offset, tree->context.offset); offset_row -= tree->context.offset_point.row; tree = tree->context.parent; @@ -222,15 +227,15 @@ TSNode ts_node_parent(TSNode self) { return ts_node__null(); } while (!ts_tree_is_visible(tree)); - return ts_node_make(tree, position, offset_row); + return ts_node_make(tree, offset, offset_row); } TSNode ts_node_child(TSNode self, size_t child_index) { - return ts_node__child(self, child_index, TSNodeTypeAnonymous); + return ts_node__child(self, child_index, true); } TSNode ts_node_named_child(TSNode self, size_t child_index) { - return ts_node__child(self, child_index, TSNodeTypeNamed); + return ts_node__child(self, child_index, false); } size_t ts_node_child_count(TSNode self) { @@ -242,25 +247,25 @@ size_t ts_node_named_child_count(TSNode self) { } TSNode ts_node_next_sibling(TSNode self) { - return ts_node__next_sibling(self, TSNodeTypeAnonymous); + return ts_node__next_sibling(self, true); } TSNode ts_node_next_named_sibling(TSNode self) { - return ts_node__next_sibling(self, TSNodeTypeNamed); + return ts_node__next_sibling(self, false); } TSNode ts_node_prev_sibling(TSNode self) { - return ts_node__prev_sibling(self, TSNodeTypeAnonymous); + return ts_node__prev_sibling(self, true); } TSNode ts_node_prev_named_sibling(TSNode self) { - return ts_node__prev_sibling(self, TSNodeTypeNamed); + return ts_node__prev_sibling(self, false); } TSNode ts_node_descendent_for_range(TSNode self, size_t min, size_t max) { - return ts_node__descendent_for_range(self, min, max, TSNodeTypeAnonymous); + return ts_node__descendent_for_range(self, min, max, true); } TSNode ts_node_named_descendent_for_range(TSNode self, size_t min, size_t max) { - return ts_node__descendent_for_range(self, min, max, TSNodeTypeNamed); + return ts_node__descendent_for_range(self, min, max, false); } diff --git a/src/runtime/parser.c b/src/runtime/parser.c index 71d254c1..485fd2f3 100644 --- a/src/runtime/parser.c +++ b/src/runtime/parser.c @@ -170,7 +170,7 @@ static bool ts_parser__shift_extra(TSParser *self, int head, TSStateId state, static TSTree *ts_parser__reduce(TSParser *self, int head, TSSymbol symbol, int child_count, bool extra, bool count_extra) { vector_clear(&self->reduce_parents); - TSNodeType node_type = self->language->node_types[symbol]; + TSSymbolMetadata metadata = self->language->symbol_metadata[symbol]; Vector pop_results = ts_stack_pop(self->stack, head, child_count, count_extra); int last_head_index = -1; @@ -198,7 +198,7 @@ static TSTree *ts_parser__reduce(TSParser *self, int head, TSSymbol symbol, */ if (!parent) parent = ts_tree_make_node(symbol, pop_result->tree_count, - pop_result->trees, node_type); + pop_result->trees, metadata); vector_push(&self->reduce_parents, &parent); /* diff --git a/src/runtime/tree.c b/src/runtime/tree.c index c78f8f84..b04fde46 100644 --- a/src/runtime/tree.c +++ b/src/runtime/tree.c @@ -9,7 +9,7 @@ TSTree *ts_tree_make_leaf(TSSymbol sym, TSLength padding, TSLength size, TSPoint padding_point, TSPoint size_point, - TSNodeType node_type) { + TSSymbolMetadata metadata) { TSTree *result = malloc(sizeof(TSTree)); *result = (TSTree){ .ref_count = 1, @@ -22,7 +22,10 @@ TSTree *ts_tree_make_leaf(TSSymbol sym, TSLength padding, TSLength size, .padding = padding, .padding_point = padding_point, .size_point = size_point, - .options = {.type = node_type }, + .options = + { + .visible = metadata.visible, .named = metadata.named, + }, }; if (sym == ts_builtin_sym_error) { @@ -39,7 +42,9 @@ TSTree *ts_tree_make_error(TSLength size, TSLength padding, char lookahead_char) { TSTree *result = ts_tree_make_leaf(ts_builtin_sym_error, padding, size, padding_point, - size_point, TSNodeTypeNamed); + size_point, (TSSymbolMetadata){ + .visible = true, .named = true, + }); result->lookahead_char = lookahead_char; return result; } @@ -81,18 +86,13 @@ static void ts_tree__set_children(TSTree *self, TSTree **children, self->size_point = ts_point_add(ts_point_add(self->size_point, child->padding_point), child->size_point); } - switch (child->options.type) { - case TSNodeTypeNamed: - self->visible_child_count++; + if (child->options.visible) { + self->visible_child_count++; + if (child->options.named) self->named_child_count++; - break; - case TSNodeTypeAnonymous: - self->visible_child_count++; - break; - case TSNodeTypeHidden: - self->visible_child_count += child->visible_child_count; - self->named_child_count += child->named_child_count; - break; + } else { + self->visible_child_count += child->visible_child_count; + self->named_child_count += child->named_child_count; } } @@ -105,9 +105,9 @@ static void ts_tree__set_children(TSTree *self, TSTree **children, } TSTree *ts_tree_make_node(TSSymbol symbol, size_t child_count, - TSTree **children, TSNodeType node_type) { + TSTree **children, TSSymbolMetadata metadata) { TSTree *result = - ts_tree_make_leaf(symbol, ts_length_zero(), ts_length_zero(), ts_point_zero(), ts_point_zero(), node_type); + ts_tree_make_leaf(symbol, ts_length_zero(), ts_length_zero(), ts_point_zero(), ts_point_zero(), metadata); ts_tree__set_children(result, children, child_count); return result; } @@ -167,6 +167,10 @@ bool ts_tree_eq(const TSTree *self, const TSTree *other) { if (self->symbol != other->symbol) return false; + if (self->options.visible != other->options.visible) + return false; + if (self->options.named != other->options.named) + return false; if (self->symbol == ts_builtin_sym_error) return self->lookahead_char == other->lookahead_char; if (self->child_count != other->child_count) @@ -217,16 +221,15 @@ static size_t write_lookahead_to_string(char *string, size_t limit, static size_t ts_tree__write_to_string(const TSTree *self, const char **symbol_names, char *string, - size_t limit, int is_root, + size_t limit, bool is_root, bool include_anonymous) { if (!self) return snprintf(string, limit, "(NULL)"); char *cursor = string; char **writer = (limit > 0) ? &cursor : &string; - TSNodeType min_node_type = - include_anonymous ? TSNodeTypeAnonymous : TSNodeTypeNamed; - int visible = self->options.type >= min_node_type || is_root; + bool visible = is_root || (self->options.visible && + (include_anonymous || self->options.named)); if (visible && !is_root) cursor += snprintf(*writer, limit, " "); @@ -242,8 +245,8 @@ static size_t ts_tree__write_to_string(const TSTree *self, for (size_t i = 0; i < self->child_count; i++) { TSTree *child = self->children[i]; - cursor += ts_tree__write_to_string(child, symbol_names, *writer, limit, 0, - include_anonymous); + cursor += ts_tree__write_to_string(child, symbol_names, *writer, limit, + false, include_anonymous); } if (visible) @@ -255,10 +258,10 @@ static size_t ts_tree__write_to_string(const TSTree *self, char *ts_tree_string(const TSTree *self, const char **symbol_names, bool include_anonymous) { static char SCRATCH[1]; - size_t size = 1 + ts_tree__write_to_string(self, symbol_names, SCRATCH, 0, 1, - include_anonymous); + size_t size = 1 + ts_tree__write_to_string(self, symbol_names, SCRATCH, 0, + true, include_anonymous); char *result = malloc(size * sizeof(char)); - ts_tree__write_to_string(self, symbol_names, result, size, 1, + ts_tree__write_to_string(self, symbol_names, result, size, true, include_anonymous); return result; } diff --git a/src/runtime/tree.h b/src/runtime/tree.h index 817ee64a..b55aa445 100644 --- a/src/runtime/tree.h +++ b/src/runtime/tree.h @@ -31,7 +31,8 @@ struct TSTree { TSSymbol symbol; struct { - TSNodeType type : 2; + bool visible : 1; + bool named : 1; bool extra : 1; bool fragile_left : 1; bool fragile_right : 1; @@ -41,8 +42,8 @@ struct TSTree { }; TSTree *ts_tree_make_leaf(TSSymbol, TSLength, TSLength, TSPoint, - TSPoint, TSNodeType); -TSTree *ts_tree_make_node(TSSymbol, size_t, TSTree **, TSNodeType); + TSPoint, TSSymbolMetadata); +TSTree *ts_tree_make_node(TSSymbol, size_t, TSTree **, TSSymbolMetadata); TSTree *ts_tree_make_error(TSLength size, TSLength padding, TSPoint padding_point, TSPoint size_point, char lookahead_char); @@ -65,7 +66,7 @@ static inline bool ts_tree_is_extra(const TSTree *tree) { } static inline bool ts_tree_is_visible(const TSTree *tree) { - return tree->options.type != TSNodeTypeHidden; + return tree->options.visible; } static inline void ts_tree_set_extra(TSTree *tree) {