Set a per-language flag for enabling virtual indentation

This commit is contained in:
Peter Slattery 2025-07-13 14:02:32 -07:00
parent 5ed8767819
commit a5f13529c3
6 changed files with 46 additions and 16 deletions

View File

@ -1199,6 +1199,11 @@ layout_virt_indent_index(Application_Links *app, Arena *arena, Buffer_ID buffer,
Layout_Item_List result = {};
b32 enable_virtual_whitespace = def_get_config_b32(vars_save_string_lit("enable_virtual_whitespace"));
Tree_Sitter_Language_Definition* language = tree_sitter_language_for_buffer(app, buffer);
enable_virtual_whitespace &= (
language != 0 && HasFlag(language->flags, Tree_Sitter_Language_Can_Receive_Virtual_Indent)
);
if (enable_virtual_whitespace){
code_index_lock();
Code_Index_File *file = code_index_get_file(buffer);

View File

@ -32,7 +32,7 @@ tree_sitter_query_new(Application_Links* app, TSLanguage* language, String_Const
}
function void
tree_sitter_register_language(String_Const_u8 ext, TSLanguage* language, Tree_Sitter_Language_Queries queries)
tree_sitter_register_language(String_Const_u8 ext, TSLanguage* language, Tree_Sitter_Language_Queries queries, Tree_Sitter_Language_Flags flags)
{
Tree_Sitter_Language_Definition* lang = 0;
u64 hash = table_hash_u8(ext.str, ext.size);
@ -55,6 +55,7 @@ tree_sitter_register_language(String_Const_u8 ext, TSLanguage* language, Tree_Si
lang->extension = push_string_copy(&tree_sitter_languages.arena, ext);
lang->language = language;
lang->queries = queries;
lang->flags = flags;
}
}

View File

@ -17,6 +17,12 @@ struct Tree_Sitter_Language_Queries
TSQuery* ptr[Tree_Sitter_Language_Query_Count];
};
typedef u32 Tree_Sitter_Language_Flags;
enum
{
Tree_Sitter_Language_Can_Receive_Virtual_Indent = 0x1
};
struct Tree_Sitter_Language_Definition
{
String_Const_u8 extension;
@ -24,6 +30,7 @@ struct Tree_Sitter_Language_Definition
TSLanguage* language;
Tree_Sitter_Language_Queries queries;
Tree_Sitter_Language_Flags flags;
Tree_Sitter_Language_Definition* next;
};
@ -34,12 +41,6 @@ struct Tree_Sitter_Languages
Tree_Sitter_Language_Definition* languages[4096];
};
global Tree_Sitter_Languages tree_sitter_languages;
CUSTOM_ID(attachment, buffer_tree_sitter_data_id);
CUSTOM_ID(attachment, buffer_tree_sitter_parse_task_id);
struct Buffer_Tree_Sitter_Data
{
TSTree* tree;
@ -84,11 +85,24 @@ struct Tree_Sitter_Code_Index_Parse_State
b8 ok;
};
function TSQuery* tree_sitter_query_new(Application_Links* app, TSLanguage* language, String_Const_u8 query_string);
function void tree_sitter_register_language(String_Const_u8 ext, TSLanguage* language, Tree_Sitter_Language_Queries queries);
///////////////////////////////////////////////////////
// Globals
global Tree_Sitter_Languages tree_sitter_languages;
CUSTOM_ID(attachment, buffer_tree_sitter_data_id);
CUSTOM_ID(attachment, buffer_tree_sitter_parse_task_id);
b8 use_tree_sitter_code_indexing = true;
b8 use_tree_sitter_token_coloring = true;
///////////////////////////////////////////////////////
// API
function TSQuery* tree_sitter_query_new(Application_Links* app, TSLanguage* language, String_Const_u8 query_string);
function void tree_sitter_register_language(String_Const_u8 ext, TSLanguage* language, Tree_Sitter_Language_Queries queries, Tree_Sitter_Language_Flags flags);
function Tree_Sitter_Language_Definition* tree_sitter_language_for_buffer(Application_Links* app, Buffer_ID buffer_id);
function Tree_Sitter_Code_Index_Parse_State tree_sitter_code_index_update_single_buffer(Application_Links *app, Buffer_ID buffer_id);
function void tree_sitter_code_index_update_tick(Application_Links *app);

View File

@ -74,7 +74,7 @@ tree_sitter_register_bash(Application_Links* app)
TSLanguage* language = tree_sitter_bash();
Tree_Sitter_Language_Queries queries = {};
queries.ptr[Tree_Sitter_Language_Query_Highlights] = tree_sitter_query_new(app, language, TS_BASH_HIGHLIGHT_QUERY);
tree_sitter_register_language(SCu8("sh"), language, queries);
tree_sitter_register_language(SCu8("sh"), language, queries, 0);
}
#endif //TREE_SITTER_BASH_H

View File

@ -201,11 +201,14 @@ tree_sitter_register_cpp(Application_Links* app)
Tree_Sitter_Language_Queries queries = {};
queries.ptr[Tree_Sitter_Language_Query_Highlights] = tree_sitter_query_new(app, language, TS_CPP_HIGHLIGHT_QUERY_SCM);
queries.ptr[Tree_Sitter_Language_Query_Tags] = tree_sitter_query_new(app, language, TS_CPP_TAGS_QUERY_SCM);
tree_sitter_register_language(SCu8("c"), language, queries);
tree_sitter_register_language(SCu8("cpp"), language, queries);
tree_sitter_register_language(SCu8("h"), language, queries);
tree_sitter_register_language(SCu8("hpp"), language, queries);
tree_sitter_register_language(SCu8("cc"), language, queries);
Tree_Sitter_Language_Flags flags = (
Tree_Sitter_Language_Can_Receive_Virtual_Indent
);
tree_sitter_register_language(SCu8("c"), language, queries, flags);
tree_sitter_register_language(SCu8("cpp"), language, queries, flags);
tree_sitter_register_language(SCu8("h"), language, queries, flags);
tree_sitter_register_language(SCu8("hpp"), language, queries, flags);
tree_sitter_register_language(SCu8("cc"), language, queries, flags);
}
#endif //TREE_SITTER_CPP_H

View File

@ -17,6 +17,10 @@ String_Const_u8 TS_JAI_TAGS_QUERY = string_u8_litexpr(R"DONE(
name: (identifier) @definition.type
)
("{" @scope_begin "}" @scope_end )
("(" @scope_begin ")" @scope_end )
("[" @scope_begin "]" @scope_end )
)DONE");
// NOTE(PS): source: https://github.com/St0wy/tree-sitter-jai/blob/main/queries/highlights.scm
@ -292,7 +296,10 @@ tree_sitter_register_jai (Application_Links* app)
Tree_Sitter_Language_Queries queries = {};
queries.ptr[Tree_Sitter_Language_Query_Highlights] = tree_sitter_query_new(app, language, TS_JAI_HIGHLIGHT_QUERY);
queries.ptr[Tree_Sitter_Language_Query_Tags] = tree_sitter_query_new(app, language, TS_JAI_TAGS_QUERY);
tree_sitter_register_language(SCu8("jai"), language, queries);
Tree_Sitter_Language_Flags flags = (
Tree_Sitter_Language_Can_Receive_Virtual_Indent
);
tree_sitter_register_language(SCu8("jai"), language, queries, flags);
}
#endif //TREE_SITTER_JAI_H