Replace NodeType enum with SymbolMetadata bitfield

This will allow storing other metadata about symbols, like if they
only appear as ubiquitous tokens
This commit is contained in:
Max Brunsfeld 2015-11-22 13:32:20 -08:00
parent 53424699e4
commit f08554e958
17 changed files with 541 additions and 512 deletions

View file

@ -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, \

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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);

View file

@ -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([&]() {

View file

@ -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<TSLength>({2, 2}));
AssertThat(tree->size, Equals<TSLength>({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)"));

View file

@ -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("};");

View file

@ -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);
}
}

View file

@ -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);
}

View file

@ -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);
/*

View file

@ -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;
}

View file

@ -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) {