123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414typepoint={row:int;column:int}typerange={start_byte:int;end_byte:int;start_point:point;end_point:point;}(* Tree handle type, defined early so Node can reference it. *)typetree_handletypesymbol_type=Regular|Anonymous|Supertype|AuxiliarymoduleLanguage=structtypetexternalof_address:nativeint->t="caml_ts_language_of_address"externalname:t->string="caml_ts_language_name"externalversion:t->int="caml_ts_language_version"externalsymbol_count:t->int="caml_ts_language_symbol_count"externalfield_count:t->int="caml_ts_language_field_count"externalsymbol_name:t->int->string="caml_ts_language_symbol_name"externalfield_name_for_id:t->int->stringoption="caml_ts_language_field_name_for_id"externalfield_id_for_name:t->string->intoption="caml_ts_language_field_id_for_name"externalsymbol_for_name_raw:t->string->bool->intoption="caml_ts_language_symbol_for_name"letsymbol_for_nametname~named=symbol_for_name_rawtnamenamedexternalsymbol_type_raw:t->int->int="caml_ts_language_symbol_type"letsymbol_typetid=matchsymbol_type_rawtidwith|1->Anonymous|2->Supertype|3->Auxiliary|_->RegularendmoduleNode=structtypenode_handletypet={node:node_handle;tree:tree_handle}externalkind_handle:node_handle->string="caml_ts_node_type"externalis_named_handle:node_handle->bool="caml_ts_node_is_named"externalis_missing_handle:node_handle->bool="caml_ts_node_is_missing"externalis_extra_handle:node_handle->bool="caml_ts_node_is_extra"externalis_error_handle:node_handle->bool="caml_ts_node_is_error"externalhas_error_handle:node_handle->bool="caml_ts_node_has_error"externalhas_changes_handle:node_handle->bool="caml_ts_node_has_changes"externalsymbol_handle:node_handle->int="caml_ts_node_symbol"externalstart_byte_handle:node_handle->int="caml_ts_node_start_byte"externalend_byte_handle:node_handle->int="caml_ts_node_end_byte"externalstart_point_handle:node_handle->point="caml_ts_node_start_point"externalend_point_handle:node_handle->point="caml_ts_node_end_point"externalchild_count_handle:node_handle->int="caml_ts_node_child_count"externalnamed_child_count_handle:node_handle->int="caml_ts_node_named_child_count"externalchild_handle:node_handle->int->node_handleoption="caml_ts_node_child"externalnamed_child_handle:node_handle->int->node_handleoption="caml_ts_node_named_child"externalchild_by_field_name_handle:node_handle->string->node_handleoption="caml_ts_node_child_by_field_name"externalparent_handle:node_handle->node_handleoption="caml_ts_node_parent"externalnext_sibling_handle:node_handle->node_handleoption="caml_ts_node_next_sibling"externalprev_sibling_handle:node_handle->node_handleoption="caml_ts_node_prev_sibling"externalnext_named_sibling_handle:node_handle->node_handleoption="caml_ts_node_next_named_sibling"externalprev_named_sibling_handle:node_handle->node_handleoption="caml_ts_node_prev_named_sibling"externaldescendant_for_byte_range_handle:node_handle->int->int->node_handleoption="caml_ts_node_descendant_for_byte_range"externaldescendant_for_point_range_handle:node_handle->point->point->node_handleoption="caml_ts_node_descendant_for_point_range"externalnamed_descendant_for_byte_range_handle:node_handle->int->int->node_handleoption="caml_ts_node_named_descendant_for_byte_range"externalnamed_descendant_for_point_range_handle:node_handle->point->point->node_handleoption="caml_ts_node_named_descendant_for_point_range"externalto_sexp_handle:node_handle->string="caml_ts_node_to_sexp"externalequal_handle:node_handle->node_handle->bool="caml_ts_node_eq"letwraptree=functionNone->None|Somenode->Some{node;tree}letkindt=kind_handlet.nodeletis_namedt=is_named_handlet.nodeletis_missingt=is_missing_handlet.nodeletis_extrat=is_extra_handlet.nodeletis_errort=is_error_handlet.nodelethas_errort=has_error_handlet.nodelethas_changest=has_changes_handlet.nodeletsymbolt=symbol_handlet.nodeletstart_bytet=start_byte_handlet.nodeletend_bytet=end_byte_handlet.nodeletstart_pointt=start_point_handlet.nodeletend_pointt=end_point_handlet.nodeletchild_countt=child_count_handlet.nodeletnamed_child_countt=named_child_count_handlet.nodeletchildtidx=wrapt.tree(child_handlet.nodeidx)letnamed_childtidx=wrapt.tree(named_child_handlet.nodeidx)letchild_by_field_nametname=wrapt.tree(child_by_field_name_handlet.nodename)letparentt=wrapt.tree(parent_handlet.node)letnext_siblingt=wrapt.tree(next_sibling_handlet.node)letprev_siblingt=wrapt.tree(prev_sibling_handlet.node)letnext_named_siblingt=wrapt.tree(next_named_sibling_handlet.node)letprev_named_siblingt=wrapt.tree(prev_named_sibling_handlet.node)letdescendant_for_byte_ranget~start~end_=wrapt.tree(descendant_for_byte_range_handlet.nodestartend_)letdescendant_for_point_ranget~start~end_=wrapt.tree(descendant_for_point_range_handlet.nodestartend_)letnamed_descendant_for_byte_ranget~start~end_=wrapt.tree(named_descendant_for_byte_range_handlet.nodestartend_)letnamed_descendant_for_point_ranget~start~end_=wrapt.tree(named_descendant_for_point_range_handlet.nodestartend_)letto_sexpt=to_sexp_handlet.nodeletequalab=equal_handlea.nodeb.nodeendmoduleTree=structtypet=tree_handleexternalroot_node_handle:t->Node.node_handle="caml_ts_tree_root_node"externalroot_sexp:t->string="caml_ts_tree_root_sexp"externallanguage:t->Language.t="caml_ts_tree_language"externalcopy:t->t="caml_ts_tree_copy"externaledit:t->start_byte:int->old_end_byte:int->new_end_byte:int->start_point:point->old_end_point:point->new_end_point:point->unit="caml_ts_tree_edit_bytecode""caml_ts_tree_edit_native"externalchanged_ranges_native:t->t->rangearray="caml_ts_tree_get_changed_ranges"externalincluded_ranges:t->rangearray="caml_ts_tree_included_ranges"letroot_nodetree:Node.t=letnode=root_node_handletreein{Node.node;tree}letchanged_ranges~oldnew_tree=changed_ranges_nativeoldnew_treeendmoduleParser=structtypetexternalcreate_with_language:Language.t->t="caml_ts_parser_create_with_language"externallanguage:t->Language.t="caml_ts_parser_language"externalset_language:t->Language.t->unit="caml_ts_parser_set_language"externalparse_string_simple:t->string->Tree.t="caml_ts_parser_parse_string"externalparse_string_with_old:t->Tree.toption->string->Tree.t="caml_ts_parser_parse_string_old"externalreset:t->unit="caml_ts_parser_reset"externalset_included_ranges:t->rangearray->unit="caml_ts_parser_set_included_ranges"letcreate=create_with_languageletparse_string?oldparsersource=matcholdwith|None->parse_string_simpleparsersource|Some_->parse_string_with_oldparseroldsourceendmoduleQuery=structtypetexternalcreate_native:Language.t->string->t="caml_ts_query_new"externalcapture_count:t->int="caml_ts_query_capture_count"externalpattern_count:t->int="caml_ts_query_pattern_count"externalcapture_name_for_id:t->int->stringoption="caml_ts_query_capture_name_for_id"externalcapture_index_for_name:t->string->intoption="caml_ts_query_capture_index_for_name"externaldisable_capture_native:t->string->unit="caml_ts_query_disable_capture"externaldisable_pattern_native:t->int->unit="caml_ts_query_disable_pattern"externalstring_value_for_id:t->int->stringoption="caml_ts_query_string_value_for_id"externalpredicates_raw:t->int->(int*int)array="caml_ts_query_predicates_for_pattern"letcreatelanguage~source=create_nativelanguagesourceletdisable_capturet~name=disable_capture_nativetnameletdisable_patternt~pattern=disable_pattern_nativetpatterntypepredicate_step=Done|Captureofint|Stringofintletpredicates_for_patterntpattern=Array.map(fun(typ,value_id)->matchtypwith|1->Capturevalue_id|2->Stringvalue_id|_->Done)(predicates_rawtpattern)endmoduleQuery_cursor=structtypecursor_handletypet={cursor:cursor_handle;mutabletree:Tree.toption}typecapture={capture_index:int;pattern_index:int;node:Node.t}typematch_result={pattern_index:int;captures:(int*Node.t)array}externalcreate_handle:unit->cursor_handle="caml_ts_query_cursor_new"externalexec_handle:cursor_handle->Query.t->Node.node_handle->unit="caml_ts_query_cursor_exec"externalset_byte_range_native:cursor_handle->int->int->unit="caml_ts_query_cursor_set_byte_range"externalset_point_range_native:cursor_handle->point->point->unit="caml_ts_query_cursor_set_point_range"externalnext_match_raw:cursor_handle->(int*(int*Node.node_handle)array)option="caml_ts_query_cursor_next_match"externalnext_capture_raw:cursor_handle->Query.t->(int*int*Node.node_handle)option="caml_ts_query_cursor_next_capture"letcreate()={cursor=create_handle();tree=None}letexectquery(node:Node.t)=t.tree<-Somenode.tree;exec_handlet.cursorquerynode.nodeletset_byte_ranget~start~end_=set_byte_range_nativet.cursorstartend_letset_point_ranget~start~end_=set_point_range_nativet.cursorstartend_letnext_matcht=match(next_match_rawt.cursor,t.tree)with|None,_->None|Some_,None->failwith"Query_cursor.next_match: cursor not initialized with exec"|Some(pattern_index,captures),Sometree->letcaptures=Array.map(fun(idx,node_handle)->(idx,({Node.node=node_handle;tree}:Node.t)))capturesinSome{pattern_index;captures}letnext_capturetquery=match(next_capture_rawt.cursorquery,t.tree)with|None,_->None|Some_,None->failwith"Query_cursor.next_capture: cursor not initialized with exec"|Some(capture_index,pattern_index,node_handle),Sometree->Some{capture_index;pattern_index;node={Node.node=node_handle;tree};}endmoduleTree_cursor=structtypecursor_handletypet={cursor:cursor_handle;tree:tree_handle}externalcreate_handle:Node.node_handle->cursor_handle="caml_ts_tree_cursor_new"externaldelete_handle:cursor_handle->unit="caml_ts_tree_cursor_delete"externalreset_handle:cursor_handle->Node.node_handle->unit="caml_ts_tree_cursor_reset"externalcurrent_node_handle:cursor_handle->Node.node_handle="caml_ts_tree_cursor_current_node"externalcurrent_field_name:cursor_handle->stringoption="caml_ts_tree_cursor_current_field_name"externalcurrent_field_id:cursor_handle->int="caml_ts_tree_cursor_current_field_id"externalcurrent_depth:cursor_handle->int="caml_ts_tree_cursor_current_depth"externalgoto_parent:cursor_handle->bool="caml_ts_tree_cursor_goto_parent"externalgoto_first_child:cursor_handle->bool="caml_ts_tree_cursor_goto_first_child"externalgoto_last_child:cursor_handle->bool="caml_ts_tree_cursor_goto_last_child"externalgoto_next_sibling:cursor_handle->bool="caml_ts_tree_cursor_goto_next_sibling"externalgoto_previous_sibling:cursor_handle->bool="caml_ts_tree_cursor_goto_previous_sibling"externalgoto_first_child_for_byte:cursor_handle->int->int="caml_ts_tree_cursor_goto_first_child_for_byte"letcreate(node:Node.t)={cursor=create_handlenode.node;tree=node.tree}letdeletet=delete_handlet.cursorletresett(node:Node.t)=reset_handlet.cursornode.nodeletcurrent_nodet:Node.t={Node.node=current_node_handlet.cursor;tree=t.tree}letcurrent_field_namet=current_field_namet.cursorletcurrent_field_idt=current_field_idt.cursorletcurrent_deptht=current_deptht.cursorletgoto_parentt=goto_parentt.cursorletgoto_first_childt=goto_first_childt.cursorletgoto_last_childt=goto_last_childt.cursorletgoto_next_siblingt=goto_next_siblingt.cursorletgoto_previous_siblingt=goto_previous_siblingt.cursorletgoto_first_child_for_bytetbyte=goto_first_child_for_bytet.cursorbyteend(* --- Highlighting --- *)letcapture_namesquery=letn=Query.capture_countqueryinArray.initn(funi->Query.capture_name_for_idqueryi)lethighlight_implquerytree~set_range=letnames=capture_namesqueryinletcursor=Query_cursor.create()inset_rangecursor;letroot=Tree.root_nodetreeinQuery_cursor.execcursorqueryroot;letrecloopacc=matchQuery_cursor.next_capturecursorquerywith|None->List.revacc|Somecap->(matchnames.(cap.capture_index)with|None->loopacc|Somename->ifString.lengthname>0&&name.[0]='_'thenloopaccelselets=Node.start_bytecap.nodeinlete=Node.end_bytecap.nodeinifs<ethenloop((s,e,name)::acc)elseloopacc)inloop[]lethighlightquerytree=highlight_implquerytree~set_range:(fun_->())lethighlight_rangequerytree~start_byte~end_byte=highlight_implquerytree~set_range:(funcursor->Query_cursor.set_byte_rangecursor~start:start_byte~end_:end_byte)