4coder/code/custom/4coder_tree_sitter.h

110 lines
2.6 KiB
C

/* date = July 8th 2025 10:13 am */
#ifndef FCODER_TREE_SITTER_H
#define FCODER_TREE_SITTER_H
#include <tree_sitter/api.h>
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