/* date = July 8th 2025 10:13 am */ #ifndef FCODER_TREE_SITTER_H #define FCODER_TREE_SITTER_H #include enum Tree_Sitter_Language_Query_Kind { Tree_Sitter_Language_Query_Highlights, Tree_Sitter_Language_Query_Tags, Tree_Sitter_Language_Query_Count, }; 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; u64 extension_hash; TSLanguage* language; Tree_Sitter_Language_Queries queries; Tree_Sitter_Language_Flags flags; Tree_Sitter_Language_Definition* next; }; struct Tree_Sitter_Languages { Arena arena; Tree_Sitter_Language_Definition* languages[4096]; }; struct Buffer_Tree_Sitter_Data { TSTree* tree; System_Mutex tree_mutex; }; struct Tree_Sitter_Query_Cursor { Buffer_ID buffer_id; TSQuery* query; TSQueryCursor* query_cursor; TSTree* tree; TSNode first_node; bool ok; }; struct Code_Index_Nest_Stack { Code_Index_Nest_Stack* prev; Code_Index_Nest_Stack* next; Code_Index_Nest* nest; u32 match_id; }; struct Tree_Sitter_Code_Index_Parse_State { Buffer_ID buffer_id; String_Const_u8 buffer_contents; Tree_Sitter_Language_Definition* language; Tree_Sitter_Query_Cursor query; Arena index_arena; Code_Index_File* index; Code_Index_Nest_Stack* nest_stack_first = 0; Code_Index_Nest_Stack* nest_stack_last = 0; Code_Index_Note* last_note = 0; u32 last_note_match_id = max_u32; b8 ok; }; /////////////////////////////////////////////////////// // 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); #endif //FCODER_TREE_SITTER_H