From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Yuan Fu Newsgroups: gmane.emacs.devel Subject: Re: How to add pseudo vector types Date: Wed, 21 Jul 2021 23:10:14 -0400 Message-ID: References: <83h7gw6pyj.fsf@gnu.org> <45EBF16A-C953-42C7-97D1-3A2BFEF7DD01@gmail.com> <83y2a764oy.fsf@gnu.org> <83v95b60fn.fsf@gnu.org> <00DD5BFE-D14E-449A-9319-E7B725DEBFB3@gmail.com> <83r1fz5xr9.fsf@gnu.org> <1AAB1BCC-362B-4249-B785-4E0530E15C60@gmail.com> <83czri67h0.fsf@gnu.org> <46BBFF88-76C3-4818-8805-5437409BEA93@gmail.com> <83wnpq46uk.fsf@gnu.org> <533BD53B-4E85-4E9E-B46A-346A5BBAD0F5@gmail.com> <258CB68D-1CC1-42C8-BDCD-2A8A8099B783@gmail.com> <1a776770-50b7-93cd-6591-c9a5b3a56eb8@gmail.com> Mime-Version: 1.0 (Mac OS X Mail 14.0 \(3654.60.0.2.21\)) Content-Type: multipart/mixed; boundary="Apple-Mail=_C44B9097-01D7-4DA9-84DB-E5570CD3153A" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="37926"; mail-complaints-to="usenet@ciao.gmane.io" Cc: =?utf-8?Q?Cl=C3=A9ment_Pit-Claudel?= , emacs-devel To: Stefan Monnier Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Thu Jul 22 05:11:18 2021 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1m6P7F-0009ZO-Sy for ged-emacs-devel@m.gmane-mx.org; Thu, 22 Jul 2021 05:11:18 +0200 Original-Received: from localhost ([::1]:44526 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1m6P7E-0002tD-H8 for ged-emacs-devel@m.gmane-mx.org; Wed, 21 Jul 2021 23:11:16 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:48954) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1m6P6I-00027t-E5 for emacs-devel@gnu.org; Wed, 21 Jul 2021 23:10:18 -0400 Original-Received: from mail-qv1-xf2b.google.com ([2607:f8b0:4864:20::f2b]:38910) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1m6P6G-0007UO-3Z for emacs-devel@gnu.org; Wed, 21 Jul 2021 23:10:18 -0400 Original-Received: by mail-qv1-xf2b.google.com with SMTP id o9so1999500qvu.5 for ; Wed, 21 Jul 2021 20:10:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:message-id:mime-version:subject:date:in-reply-to:cc:to :references; bh=KL0zt+A6ktE7zV7qKVfHkB97+DiDr5HOt/gwW09m0Fk=; b=iFBw55k5KS4i0JgjUc9VWFinBfSrWzIn9XtyjRwdiLs4w50fujYAXci0TtlHGgYLmv VuBdIF+858Qx6Jj/ZAP0vf2xepDfAh5R7BMg+RnPbKKnO6pw6cqoNbzl92s+utjOenvy XQu5+B4FHn0VtJf2vASai29zcN1vCbogp806vsCgxVKGpoHHLfBeUpYYHlVT060y60vB iEzE/wvZ69GIv/CYqblGT3HKW/w9BmhV6gnlN66Bj2cLrkFwvWbxLeHVRVoK/5ZSQi9i yEOfPMX/UWQ8GorkGYAfHwI26bYujlBs+D8MFpUof4hJToQ/hciK9q0Z2o81E7BmvOLf Z7sA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:message-id:mime-version:subject:date :in-reply-to:cc:to:references; bh=KL0zt+A6ktE7zV7qKVfHkB97+DiDr5HOt/gwW09m0Fk=; b=hhOnWC1dCJn/tcJrcHyjB3BhKigihEDk/00eS2+rMlkPbSFZQfZNJ0Y86LFIstNnen /UGUgPmWYN9NxNj5pOWQ3isHj3wdJhGVsiLkisZeI9j7Uupax7dFvu1FhJ4TmJvMiIZd npgdRWJWyUvGW35c001wGj7Mr+hUBo3FLzcjwcG4dfptMo0qv88lfl+qbMMO7u5BY5KU KNauymMBQxeTXW+QOSQAIfswfqkNZBeVDVz7bdqJGiqFAwu/s5fswqKEOarklgvFRNDb Xb3RsCBdohMMHcEOApCDS5hECJu0l4yVUDsrbzautBo0E0aGz6n0rVPuQmOhMJcMGAcY pWbg== X-Gm-Message-State: AOAM530T0k+22oAE3JnRZ+nVbxl/O2F1rg4DrflhovMJZaH3DkE9LD3o WG33eqX8IbuPIz9c22NkZcs= X-Google-Smtp-Source: ABdhPJxHfY/5x3nu25JjnOW76vRqxckdaS91XSYc8KZD1ZjKzUxZYEtsKgu54rx7P2lotC1MD8bCNA== X-Received: by 2002:a0c:fbd1:: with SMTP id n17mr39865792qvp.19.1626923414158; Wed, 21 Jul 2021 20:10:14 -0700 (PDT) Original-Received: from 2603-7080-0302-635e-501b-d938-5abe-a221.res6.spectrum.com (2603-7080-0302-635e-501b-d938-5abe-a221.res6.spectrum.com. [2603:7080:302:635e:501b:d938:5abe:a221]) by smtp.gmail.com with ESMTPSA id b23sm9469927qkl.113.2021.07.21.20.10.13 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 21 Jul 2021 20:10:13 -0700 (PDT) In-Reply-To: X-Mailer: Apple Mail (2.3654.60.0.2.21) Received-SPF: pass client-ip=2607:f8b0:4864:20::f2b; envelope-from=casouri@gmail.com; helo=mail-qv1-xf2b.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.io gmane.emacs.devel:271443 Archived-At: --Apple-Mail=_C44B9097-01D7-4DA9-84DB-E5570CD3153A Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Here is another patch. No big progress since I=E2=80=99m busy moving = this week. In this patch I changed from using change hooks to directly = updating the trees in edit functions. I also added some node api and = tests. Should I keep posting patches, or should I create a branch in = /scratch? If the latter, how do I do it? I=E2=80=99m aware of the ongoing enlightening discussion on potential = optimizations for tree-sitter. My plan is to first complete the api and = implement some minimal structural editing/font-lock features, then we = can concretely measure what needs to improve. Yuan --Apple-Mail=_C44B9097-01D7-4DA9-84DB-E5570CD3153A Content-Disposition: attachment; filename=ts.3.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="ts.3.patch" Content-Transfer-Encoding: quoted-printable =46rom=20fd8ad36fe5ea3b9b12e80879b7434b8bc67b53db=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Yuan=20Fu=20=0ADate:=20Wed,=20= 21=20Jul=202021=2022:43:07=20-0400=0ASubject:=20[PATCH]=20checkpoint=203=0A= =0A-=20change_hook=20->=20directly=20in=20edit=20functions=0A-=20add=20a=20= need_reparse=20field=20in=20Lisp_TS_Parser=0A-=20more=20node=20api=0A-=20= tests=0A---=0A=20src/insdel.c=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20|=20=2043=20++++--=0A=20src/tree_sitter.c=20=20=20=20=20=20=20=20= =20=20=20=20=20|=20274=20++++++++++++++++++++++++++++------=0A=20= src/tree_sitter.h=20=20=20=20=20=20=20=20=20=20=20=20=20|=20=2018=20++-=0A= =20test/src/tree-sitter-tests.el=20|=20106=20+++++++++++++=0A=204=20= files=20changed,=20377=20insertions(+),=2064=20deletions(-)=0A=20create=20= mode=20100644=20test/src/tree-sitter-tests.el=0A=0Adiff=20--git=20= a/src/insdel.c=20b/src/insdel.c=0Aindex=203c1e13d38b..b313c50cda=20= 100644=0A---=20a/src/insdel.c=0A+++=20b/src/insdel.c=0A@@=20-947,6=20= +947,10=20@@=20insert_1_both=20(const=20char=20*string,=0A=20=20=20= adjust_point=20(nchars,=20nbytes);=0A=20=0A=20=20=20check_markers=20();=0A= +=0A+#ifdef=20HAVE_TREE_SITTER=0A+=20=20=20=20=20=20ts_record_change=20= (PT_BYTE=20-=20nbytes,=20PT_BYTE=20-=20nbytes,=20PT_BYTE);=0A+#endif=0A=20= }=0A=20=0C=0A=20/*=20Insert=20the=20part=20of=20the=20text=20of=20= STRING,=20a=20Lisp=20object=20assumed=20to=20be=0A@@=20-1078,6=20= +1082,10=20@@=20insert_from_string_1=20(Lisp_Object=20string,=20= ptrdiff_t=20pos,=20ptrdiff_t=20pos_byte,=0A=20=20=20adjust_point=20= (nchars,=20outgoing_nbytes);=0A=20=0A=20=20=20check_markers=20();=0A+=0A= +#ifdef=20HAVE_TREE_SITTER=0A+=20=20ts_record_change=20(PT_BYTE=20-=20= nbytes,=20PT_BYTE=20-=20nbytes,=20PT_BYTE);=0A+#endif=0A=20}=0A=20=0C=0A=20= /*=20Insert=20a=20sequence=20of=20NCHARS=20chars=20which=20occupy=20= NBYTES=20bytes=0A@@=20-1145,6=20+1153,10=20@@=20insert_from_gap=20= (ptrdiff_t=20nchars,=20ptrdiff_t=20nbytes,=20bool=20text_at_gap_tail)=0A=20= =20=20=20=20adjust_point=20(nchars,=20nbytes);=0A=20=0A=20=20=20= check_markers=20();=0A+=0A+#ifdef=20HAVE_TREE_SITTER=0A+=20=20= ts_record_change=20(PT_BYTE=20-=20nbytes,=20PT_BYTE=20-=20nbytes,=20= nbytes);=0A+#endif=0A=20}=0A=20=0C=0A=20/*=20Insert=20text=20from=20BUF,=20= NCHARS=20characters=20starting=20at=20CHARPOS,=20into=20the=0A@@=20= -1292,6=20+1304,11=20@@=20insert_from_buffer_1=20(struct=20buffer=20= *buf,=0A=20=20=20graft_intervals_into_buffer=20(intervals,=20PT,=20= nchars,=20current_buffer,=20inherit);=0A=20=0A=20=20=20adjust_point=20= (nchars,=20outgoing_nbytes);=0A+=0A+#ifdef=20HAVE_TREE_SITTER=0A+=20=20= ts_record_change=20(PT_BYTE=20-=20outgoing_nbytes,=0A+=09=09=20=20=20=20= PT_BYTE=20-=20outgoing_nbytes,=20PT_BYTE);=0A+#endif=0A=20}=0A=20=0C=0A=20= /*=20Record=20undo=20information=20and=20adjust=20markers=20and=20= position=20keepers=20for=0A@@=20-1556,6=20+1573,11=20@@=20replace_range=20= (ptrdiff_t=20from,=20ptrdiff_t=20to,=20Lisp_Object=20new,=0A=20=20=20if=20= (adjust_match_data)=0A=20=20=20=20=20update_search_regs=20(from,=20to,=20= from=20+=20SCHARS=20(new));=0A=20=0A+=0A+#ifdef=20HAVE_TREE_SITTER=0A+=20= =20ts_record_change=20(from_byte,=20to_byte,=20GPT_BYTE);=0A+#endif=0A+=0A= =20=20=20signal_after_change=20(from,=20nchars_del,=20GPT=20-=20from);=0A= =20=20=20update_compositions=20(from,=20GPT,=20CHECK_BORDER);=0A=20}=0A= @@=20-1683,6=20+1705,11=20@@=20replace_range_2=20(ptrdiff_t=20from,=20= ptrdiff_t=20from_byte,=0A=20=0A=20=20=20modiff_incr=20(&MODIFF);=0A=20=20= =20CHARS_MODIFF=20=3D=20MODIFF;=0A+=0A+#ifdef=20HAVE_TREE_SITTER=0A+=20=20= ts_record_change=20(from_byte,=20to_byte,=20from_byte=20+=20insbytes);=0A= +#endif=0A+=0A=20}=0A=20=0C=0A=20/*=20Delete=20characters=20in=20current=20= buffer=0A@@=20-1893,6=20+1920,10=20@@=20del_range_2=20(ptrdiff_t=20from,=20= ptrdiff_t=20from_byte,=0A=20=0A=20=20=20evaporate_overlays=20(from);=0A=20= =0A+#ifdef=20HAVE_TREE_SITTER=0A+=20=20ts_record_change=20(from_byte,=20= to_byte,=20from_byte);=0A+#endif=0A+=0A=20=20=20return=20deletion;=0A=20= }=0A=20=0A@@=20-2156,11=20+2187,6=20@@=20signal_before_change=20= (ptrdiff_t=20start_int,=20ptrdiff_t=20end_int,=0A=20=20=20=20=20=20=20= run_hook=20(Qfirst_change_hook);=0A=20=20=20=20=20}=0A=20=0A-#ifdef=20= HAVE_TREE_SITTER=0A-=20=20/*=20FIXME:=20Is=20this=20the=20best=20place?=20= =20*/=0A-=20=20ts_before_change=20(start_int,=20end_int);=0A-#endif=0A-=0A= =20=20=20/*=20Now=20run=20the=20before-change-functions=20if=20any.=20=20= */=0A=20=20=20if=20(!NILP=20(Vbefore_change_functions))=0A=20=20=20=20=20= {=0A@@=20-2214,13=20+2240,6=20@@=20signal_after_change=20(ptrdiff_t=20= charpos,=20ptrdiff_t=20lendel,=20ptrdiff_t=20lenins)=0A=20=20=20if=20= (inhibit_modification_hooks)=0A=20=20=20=20=20return;=0A=20=0A-#ifdef=20= HAVE_TREE_SITTER=0A-=20=20/*=20We=20disrespect=20combine-after-change,=20= because=20if=20we=20don't=20record=0A-=20=20=20=20=20this=20change,=20= the=20information=20that=20we=20need=20(the=20end=20byte=20position=0A-=20= =20=20=20=20of=20the=20change)=20will=20be=20lost.=20=20*/=0A-=20=20= ts_after_change=20(charpos,=20lendel,=20lenins);=0A-#endif=0A-=0A=20=20=20= /*=20If=20we=20are=20deferring=20calls=20to=20the=20after-change=20= functions=0A=20=20=20=20=20=20and=20there=20are=20no=20before-change=20= functions,=0A=20=20=20=20=20=20just=20record=20the=20args=20that=20we=20= were=20going=20to=20use.=20=20*/=0Adiff=20--git=20a/src/tree_sitter.c=20= b/src/tree_sitter.c=0Aindex=207d1225161c..a6a8912c84=20100644=0A---=20= a/src/tree_sitter.c=0A+++=20b/src/tree_sitter.c=0A@@=20-32,49=20+32,52=20= @@=20Copyright=20(C)=202021=20Free=20Software=20Foundation,=20Inc.=0A=20= #include=20"coding.h"=0A=20#include=20"tree_sitter.h"=0A=20=0A-/*=20= parser.h=20defines=20a=20macro=20ADVANCE=20that=20conflicts=20with=20= alloc.c.=20=20=20*/=0A+/*=20parser.h=20defines=20a=20macro=20ADVANCE=20= that=20conflicts=20with=20alloc.c.=20=20*/=0A=20#include=20= =0A=20=0A-/*=20Record=20the=20byte=20position=20of=20= the=20end=20of=20the=20(to-be)=20changed=20text.=0A-We=20have=20to=20= record=20it=20now,=20because=20by=20the=20time=20we=20get=20to=20= after-change=0A-hook,=20the=20_byte_=20position=20of=20the=20end=20is=20= lost.=20=20*/=0A-void=0A-ts_before_change=20(ptrdiff_t=20start_int,=20= ptrdiff_t=20end_int)=0A+DEFUN=20("tree-sitter-parser-p",=0A+=20=20=20=20=20= =20=20Ftree_sitter_parser_p,=20Stree_sitter_parser_p,=201,=201,=200,=0A+=20= =20=20=20=20=20=20doc:=20/*=20Return=20t=20if=20OBJECT=20is=20a=20= tree-sitter=20parser.=20=20*/)=0A+=20=20(Lisp_Object=20object)=0A=20{=0A= -=20=20/*=20Iterate=20through=20each=20parser=20in=20= 'tree-sitter-parser-list'=20and=0A-=20=20=20=20=20record=20the=20byte=20= position.=20=20There=20could=20be=20better=20ways=20to=20record=0A-=20=20= =20=20=20it=20than=20storing=20the=20same=20position=20in=20every=20= parser,=20but=20this=20is=0A-=20=20=20=20=20the=20most=20fool-proof=20= way,=20and=20I=20expect=20a=20buffer=20to=20have=20only=20one=0A-=20=20=20= =20=20parser=20most=20of=20the=20time=20anyway.=20*/=0A-=20=20ptrdiff_t=20= beg_byte=20=3D=20CHAR_TO_BYTE=20(start_int);=0A-=20=20ptrdiff_t=20= old_end_byte=20=3D=20CHAR_TO_BYTE=20(end_int);=0A-=20=20Lisp_Object=20= parser_list=20=3D=20Fsymbol_value=20(Qtree_sitter_parser_list);=0A-=20=20= while=20(!NILP=20(parser_list))=0A-=20=20=20=20{=0A-=20=20=20=20=20=20= Lisp_Object=20lisp_parser=20=3D=20Fcar=20(parser_list);=0A-=20=20=20=20=20= =20XTS_PARSER=20(lisp_parser)->edit.start_byte=20=3D=20beg_byte;=0A-=20=20= =20=20=20=20XTS_PARSER=20(lisp_parser)->edit.old_end_byte=20=3D=20= old_end_byte;=0A-=20=20=20=20=20=20parser_list=20=3D=20Fcdr=20= (parser_list);=0A-=20=20=20=20}=0A+=20=20if=20(TS_PARSERP=20(object))=0A= +=20=20=20=20return=20Qt;=0A+=20=20else=0A+=20=20=20=20return=20Qnil;=0A= +}=0A+=0A+DEFUN=20("tree-sitter-node-p",=0A+=20=20=20=20=20=20=20= Ftree_sitter_node_p,=20Stree_sitter_node_p,=201,=201,=200,=0A+=20=20=20=20= =20=20=20doc:=20/*=20Return=20t=20if=20OBJECT=20is=20a=20tree-sitter=20= node.=20=20*/)=0A+=20=20(Lisp_Object=20object)=0A+{=0A+=20=20if=20= (TS_NODEP=20(object))=0A+=20=20=20=20return=20Qt;=0A+=20=20else=0A+=20=20= =20=20return=20Qnil;=0A=20}=0A=20=0A=20/*=20Update=20each=20parser's=20= tree=20after=20the=20user=20made=20an=20edit.=20=20This=0A=20function=20= does=20not=20parse=20the=20buffer=20and=20only=20updates=20the=20tree.=20= (So=20it=0A=20should=20be=20very=20fast.)=20=20*/=0A=20void=0A= -ts_after_change=20(ptrdiff_t=20charpos,=20ptrdiff_t=20lendel,=20= ptrdiff_t=20lenins)=0A+ts_record_change=20(ptrdiff_t=20start_byte,=20= ptrdiff_t=20old_end_byte,=0A+=09=09=20=20ptrdiff_t=20new_end_byte)=0A=20= {=0A-=20=20ptrdiff_t=20new_end_byte=20=3D=20CHAR_TO_BYTE=20(charpos=20+=20= lenins);=0A=20=20=20Lisp_Object=20parser_list=20=3D=20Fsymbol_value=20= (Qtree_sitter_parser_list);=0A+=20=20TSPoint=20dummy_point=20=3D=20{0,=20= 0};=0A+=20=20TSInputEdit=20edit=20=3D=20{start_byte,=20old_end_byte,=20= new_end_byte,=0A+=09=09=20=20=20=20=20=20dummy_point,=20dummy_point,=20= dummy_point};=0A=20=20=20while=20(!NILP=20(parser_list))=0A=20=20=20=20=20= {=0A=20=20=20=20=20=20=20Lisp_Object=20lisp_parser=20=3D=20Fcar=20= (parser_list);=0A=20=20=20=20=20=20=20TSTree=20*tree=20=3D=20XTS_PARSER=20= (lisp_parser)->tree;=0A-=20=20=20=20=20=20XTS_PARSER=20= (lisp_parser)->edit.new_end_byte=20=3D=20new_end_byte;=0A=20=20=20=20=20=20= =20if=20(tree=20!=3D=20NULL)=0A-=09=20=20ts_tree_edit=20(tree,=20= &XTS_PARSER=20(lisp_parser)->edit);=0A+=09ts_tree_edit=20(tree,=20= &edit);=0A+=20=20=20=20=20=20XTS_PARSER=20(lisp_parser)->need_reparse=20= =3D=20true;=0A=20=20=20=20=20=20=20parser_list=20=3D=20Fcdr=20= (parser_list);=0A=20=20=20=20=20}=0A+=0A=20}=0A=20=0A=20/*=20Parse=20the=20= buffer.=20=20We=20don't=20parse=20until=20we=20have=20to.=20When=20we=20= have=0A@@=20-82,11=20+85,15=20@@=20ts_after_change=20(ptrdiff_t=20= charpos,=20ptrdiff_t=20lendel,=20ptrdiff_t=20lenins)=0A=20void=0A=20= ts_ensure_parsed=20(Lisp_Object=20parser)=0A=20{=0A+=20=20if=20= (!XTS_PARSER=20(parser)->need_reparse)=0A+=20=20=20=20return;=0A=20=20=20= TSParser=20*ts_parser=20=3D=20XTS_PARSER=20(parser)->parser;=0A=20=20=20= TSTree=20*tree=20=3D=20XTS_PARSER(parser)->tree;=0A=20=20=20TSInput=20= input=20=3D=20XTS_PARSER=20(parser)->input;=0A=20=20=20TSTree=20= *new_tree=20=3D=20ts_parser_parse(ts_parser,=20tree,=20input);=0A+=20=20= ts_tree_delete=20(tree);=0A=20=20=20XTS_PARSER=20(parser)->tree=20=3D=20= new_tree;=0A+=20=20XTS_PARSER=20(parser)->need_reparse=20=3D=20false;=0A=20= }=0A=20=0A=20/*=20This=20is=20the=20read=20function=20provided=20to=20= tree-sitter=20to=20read=20from=20a=0A@@=20-96,33=20+103,30=20@@=20= ts_ensure_parsed=20(Lisp_Object=20parser)=0A=20ts_read_buffer=20(void=20= *buffer,=20uint32_t=20byte_index,=0A=20=09=09TSPoint=20position,=20= uint32_t=20*bytes_read)=0A=20{=0A-=20=20if=20(!=20BUFFER_LIVE_P=20= ((struct=20buffer=20*)=20buffer))=0A+=20=20if=20(!BUFFER_LIVE_P=20= ((struct=20buffer=20*)=20buffer))=0A=20=20=20=20=20error=20("BUFFER=20is=20= not=20live");=0A=20=0A=20=20=20ptrdiff_t=20byte_pos=20=3D=20byte_index=20= +=201;=0A=20=0A-=20=20//=20FIXME:=20Add=20some=20boundary=20checks?=0A-=20= =20/*=20I=20believe=20we=20can=20get=20away=20with=20only=20setting=20= current-buffer=0A-=20=20=20=20=20and=20not=20actually=20switching=20to=20= it,=20like=20what=20we=20did=20in=0A-=20=20=20=20=20'make_gap_1'.=20=20= */=0A-=20=20struct=20buffer=20*old_buffer=20=3D=20current_buffer;=0A-=20=20= current_buffer=20=3D=20(struct=20buffer=20*)=20buffer;=0A-=0A-=20=20/*=20= Read=20one=20character.=20=20*/=0A+=20=20/*=20Read=20one=20character.=20=20= Tree-sitter=20wants=20us=20to=20set=20bytes_read=20to=200=0A+=20=20=20=20= =20if=20it=20reads=20to=20the=20end=20of=20buffer.=20=20It=20doesn't=20= say=20what=20it=20wants=0A+=20=20=20=20=20for=20the=20return=20value=20= in=20that=20case,=20so=20we=20just=20give=20it=20an=20empty=0A+=20=20=20=20= =20string.=20=20*/=0A=20=20=20char=20*beg;=0A=20=20=20int=20len;=0A-=20=20= if=20(byte_pos=20>=3D=20Z_BYTE)=0A+=20=20//=20TODO=20BUF_ZV_BYTE?=0A+=20=20= if=20(byte_pos=20>=3D=20BUF_Z_BYTE=20((struct=20buffer=20*)=20buffer))=0A= =20=20=20=20=20{=0A=20=20=20=20=20=20=20beg=20=3D=20"";=0A=20=20=20=20=20= =20=20len=20=3D=200;=0A=20=20=20=20=20}=0A=20=20=20else=0A=20=20=20=20=20= {=0A-=20=20=20=20=20=20beg=20=3D=20(char=20*)=20BYTE_POS_ADDR=20= (byte_pos);=0A+=20=20=20=20=20=20beg=20=3D=20(char=20*)=20= BUF_BYTE_ADDRESS=20(buffer,=20byte_pos);=0A=20=20=20=20=20=20=20len=20=3D=20= next_char_len(byte_pos);=0A=20=20=20=20=20}=0A=20=20=20*bytes_read=20=3D=20= (uint32_t)=20len;=0A-=20=20current_buffer=20=3D=20old_buffer;=0A+=0A=20=20= =20return=20beg;=0A=20}=0A=20=0A@@=20-137,9=20+141,7=20@@=20= make_ts_parser=20(struct=20buffer=20*buffer,=20TSParser=20*parser,=20= TSTree=20*tree)=0A=20=20=20lisp_parser->tree=20=3D=20tree;=0A=20=20=20= TSInput=20input=20=3D=20{buffer,=20ts_read_buffer,=20= TSInputEncodingUTF8};=0A=20=20=20lisp_parser->input=20=3D=20input;=0A-=20= =20TSPoint=20dummy_point=20=3D=20{0,=200};=0A-=20=20TSInputEdit=20edit=20= =3D=20{0,=200,=200,=20dummy_point,=20dummy_point,=20dummy_point};=0A-=20=20= lisp_parser->edit=20=3D=20edit;=0A+=20=20lisp_parser->need_reparse=20=3D=20= true;=0A=20=20=20return=20make_lisp_ptr=20(lisp_parser,=20= Lisp_Vectorlike);=0A=20}=0A=20=0A@@=20-192,6=20+194,7=20@@=20DEFUN=20= ("tree-sitter-parser-root-node",=0A=20=20=20=20=20=20=20=20doc:=20/*=20= Return=20the=20root=20node=20of=20PARSER.=20=20*/)=0A=20=20=20= (Lisp_Object=20parser)=0A=20{=0A+=20=20CHECK_TS_PARSER=20(parser);=0A=20=20= =20ts_ensure_parsed(parser);=0A=20=20=20TSNode=20root_node=20=3D=20= ts_tree_root_node=20(XTS_PARSER=20(parser)->tree);=0A=20=20=20return=20= make_ts_node=20(parser,=20root_node);=0A@@=20-229,11=20+232,29=20@@=20= DEFUN=20("tree-sitter-parse",=20Ftree_sitter_parse,=20= Stree_sitter_parse,=0A=20=20=20return=20lisp_node;=0A=20}=0A=20=0A+/*=20= Below=20this=20point=20are=20uninteresting=20mechanical=20translations=20= of=0A+=20=20=20tree-sitter=20API.=20=20*/=0A+=0A+/*=20Node=20functions.=20= =20*/=0A+=0A+DEFUN=20("tree-sitter-node-type",=0A+=20=20=20=20=20=20=20= Ftree_sitter_node_type,=20Stree_sitter_node_type,=201,=201,=200,=0A+=20=20= =20=20=20=20=20doc:=20/*=20Return=20the=20NODE's=20type=20as=20a=20= symbol.=20=20*/)=0A+=20=20(Lisp_Object=20node)=0A+{=0A+=20=20= CHECK_TS_NODE=20(node);=0A+=20=20TSNode=20ts_node=20=3D=20XTS_NODE=20= (node)->node;=0A+=20=20const=20char=20*type=20=3D=20= ts_node_type(ts_node);=0A+=20=20return=20intern_c_string=20(type);=0A+}=0A= +=0A+=0A=20DEFUN=20("tree-sitter-node-string",=0A=20=20=20=20=20=20=20=20= Ftree_sitter_node_string,=20Stree_sitter_node_string,=201,=201,=200,=0A=20= =20=20=20=20=20=20=20doc:=20/*=20Return=20the=20string=20representation=20= of=20NODE.=20=20*/)=0A=20=20=20(Lisp_Object=20node)=0A=20{=0A+=20=20= CHECK_TS_NODE=20(node);=0A=20=20=20TSNode=20ts_node=20=3D=20XTS_NODE=20= (node)->node;=0A=20=20=20char=20*string=20=3D=20ts_node_string(ts_node);=0A= =20=20=20return=20make_string(string,=20strlen=20(string));=0A@@=20= -242,29=20+263,125=20@@=20DEFUN=20("tree-sitter-node-string",=0A=20DEFUN=20= ("tree-sitter-node-parent",=0A=20=20=20=20=20=20=20=20= Ftree_sitter_node_parent,=20Stree_sitter_node_parent,=201,=201,=200,=0A=20= =20=20=20=20=20=20=20doc:=20/*=20Return=20the=20immediate=20parent=20of=20= NODE.=0A-Return=20nil=20if=20we=20couldn't=20find=20any.=20=20*/)=0A= +Return=20nil=20if=20there=20isn't=20any.=20=20*/)=0A=20=20=20= (Lisp_Object=20node)=0A=20{=0A+=20=20CHECK_TS_NODE=20(node);=0A=20=20=20= TSNode=20ts_node=20=3D=20XTS_NODE=20(node)->node;=0A-=20=20TSNode=20= parent=20=3D=20ts_node_parent(ts_node);=0A+=20=20TSNode=20parent=20=3D=20= ts_node_parent=20(ts_node);=0A=20=0A=20=20=20if=20= (ts_node_is_null(parent))=0A=20=20=20=20=20return=20Qnil;=0A=20=0A-=20=20= return=20make_ts_node(XTS_NODE=20(node)->parser,=20parent);=0A+=20=20= return=20make_ts_node=20(XTS_NODE=20(node)->parser,=20parent);=0A=20}=0A=20= =0A=20DEFUN=20("tree-sitter-node-child",=0A-=20=20=20=20=20=20=20= Ftree_sitter_node_child,=20Stree_sitter_node_child,=202,=202,=200,=0A+=20= =20=20=20=20=20=20Ftree_sitter_node_child,=20Stree_sitter_node_child,=20= 2,=203,=200,=0A=20=20=20=20=20=20=20=20doc:=20/*=20Return=20the=20Nth=20= child=20of=20NODE.=0A-Return=20nil=20if=20we=20couldn't=20find=20any.=20=20= */)=0A+Return=20nil=20if=20there=20isn't=20any.=20=20If=20NAMED=20is=20= non-nil,=20look=20for=20named=0A+child=20only.=20=20NAMED=20defaults=20= to=20nil.=20=20*/)=0A+=20=20(Lisp_Object=20node,=20Lisp_Object=20n,=20= Lisp_Object=20named)=0A+{=0A+=20=20CHECK_TS_NODE=20(node);=0A+=20=20= CHECK_INTEGER=20(n);=0A+=20=20EMACS_INT=20idx=20=3D=20XFIXNUM=20(n);=0A+=20= =20TSNode=20ts_node=20=3D=20XTS_NODE=20(node)->node;=0A+=20=20TSNode=20= child;=0A+=20=20if=20(NILP=20(named))=0A+=20=20=20=20child=20=3D=20= ts_node_child=20(ts_node,=20(uint32_t)=20idx);=0A+=20=20else=0A+=20=20=20= =20child=20=3D=20ts_node_named_child=20(ts_node,=20(uint32_t)=20idx);=0A= +=0A+=20=20if=20(ts_node_is_null(child))=0A+=20=20=20=20return=20Qnil;=0A= +=0A+=20=20return=20make_ts_node(XTS_NODE=20(node)->parser,=20child);=0A= +}=0A+=0A+DEFUN=20("tree-sitter-node-check",=0A+=20=20=20=20=20=20=20= Ftree_sitter_node_check,=20Stree_sitter_node_check,=202,=202,=200,=0A+=20= =20=20=20=20=20=20doc:=20/*=20Return=20non-nil=20if=20NODE=20is=20in=20= condition=20COND,=20nil=20otherwise.=0A+=0A+COND=20could=20be=20'named,=20= 'missing,=20'extra,=20'has-error.=20=20Named=20nodes=0A+correspond=20to=20= named=20rules=20in=20the=20grammar,=20whereas=20"anonymous"=20nodes=0A= +correspond=20to=20string=20literals=20in=20the=20grammar.=0A+=0A= +Missing=20nodes=20are=20inserted=20by=20the=20parser=20in=20order=20to=20= recover=20from=0A+certain=20kinds=20of=20syntax=20errors,=20i.e.,=20= should=20be=20there=20but=20not=20there.=0A+=0A+Extra=20nodes=20= represent=20things=20like=20comments,=20which=20are=20not=20required=20= the=0A+grammar,=20but=20can=20appear=20anywhere.=0A+=0A+A=20node=20"has=20= error"=20if=20itself=20is=20a=20syntax=20error=20or=20contains=20any=20= syntax=0A+errors.=20=20*/)=0A+=20=20(Lisp_Object=20node,=20Lisp_Object=20= cond)=0A+{=0A+=20=20CHECK_TS_NODE=20(node);=0A+=20=20CHECK_SYMBOL=20= (cond);=0A+=20=20TSNode=20ts_node=20=3D=20XTS_NODE=20(node)->node;=0A+=20= =20bool=20result;=0A+=20=20if=20(EQ=20(cond,=20Qnamed))=0A+=20=20=20=20= result=20=3D=20ts_node_is_named=20(ts_node);=0A+=20=20else=20if=20(EQ=20= (cond,=20Qmissing))=0A+=20=20=20=20result=20=3D=20ts_node_is_missing=20= (ts_node);=0A+=20=20else=20if=20(EQ=20(cond,=20Qextra))=0A+=20=20=20=20= result=20=3D=20ts_node_is_extra=20(ts_node);=0A+=20=20else=20if=20(EQ=20= (cond,=20Qhas_error))=0A+=20=20=20=20result=20=3D=20ts_node_has_error=20= (ts_node);=0A+=20=20else=0A+=20=20=20=20signal_error=20("Expecting=20one=20= of=20four=20symbols,=20see=20docstring",=20cond);=0A+=20=20return=20= result=20?=20Qt=20:=20Qnil;=0A+}=0A+=0A+DEFUN=20= ("tree-sitter-node-field-name-for-child",=0A+=20=20=20=20=20=20=20= Ftree_sitter_node_field_name_for_child,=0A+=20=20=20=20=20=20=20= Stree_sitter_node_field_name_for_child,=202,=202,=200,=0A+=20=20=20=20=20= =20=20doc:=20/*=20Return=20the=20field=20name=20of=20the=20Nth=20child=20= of=20NODE.=0A+Return=20nil=20if=20there=20isn't=20any=20child=20or=20no=20= field=20is=20found.=20=20*/)=0A=20=20=20(Lisp_Object=20node,=20= Lisp_Object=20n)=0A=20{=0A=20=20=20CHECK_INTEGER=20(n);=0A=20=20=20= EMACS_INT=20idx=20=3D=20XFIXNUM=20(n);=0A=20=20=20TSNode=20ts_node=20=3D=20= XTS_NODE=20(node)->node;=0A-=20=20//=20FIXME:=20Is=20this=20cast=20ok?=0A= -=20=20TSNode=20child=20=3D=20ts_node_child(ts_node,=20(uint32_t)=20= idx);=0A+=20=20const=20char=20*name=0A+=20=20=20=20=3D=20= ts_node_field_name_for_child=20(ts_node,=20(uint32_t)=20idx);=0A+=0A+=20=20= if=20(name=20=3D=3D=20NULL)=0A+=20=20=20=20return=20Qnil;=0A+=0A+=20=20= return=20make_string=20(name,=20strlen=20(name));=0A+}=0A+=0A+DEFUN=20= ("tree-sitter-node-child-count",=0A+=20=20=20=20=20=20=20= Ftree_sitter_node_child_count,=0A+=20=20=20=20=20=20=20= Stree_sitter_node_child_count,=201,=202,=200,=0A+=20=20=20=20=20=20=20= doc:=20/*=20Return=20the=20number=20of=20children=20of=20NODE.=0A+If=20= NAMED=20is=20non-nil,=20count=20named=20child=20only.=20=20NAMED=20= defaults=20to=0A+nil.=20=20*/)=0A+=20=20(Lisp_Object=20node,=20= Lisp_Object=20named)=0A+{=0A+=20=20TSNode=20ts_node=20=3D=20XTS_NODE=20= (node)->node;=0A+=20=20uint32_t=20count;=0A+=20=20if=20(NILP=20(named))=0A= +=20=20=20=20count=20=3D=20ts_node_child_count=20(ts_node);=0A+=20=20= else=0A+=20=20=20=20count=20=3D=20ts_node_named_child_count=20(ts_node);=0A= +=20=20return=20make_fixnum=20(count);=0A+}=0A+=0A+DEFUN=20= ("tree-sitter-node-child-by-field-name",=0A+=20=20=20=20=20=20=20= Ftree_sitter_node_child_by_field_name,=0A+=20=20=20=20=20=20=20= Stree_sitter_node_child_by_field_name,=202,=202,=200,=0A+=20=20=20=20=20=20= =20doc:=20/*=20Return=20the=20child=20of=20NODE=20with=20field=20name=20= NAME.=0A+Return=20nil=20if=20there=20isn't=20any.=20=20*/)=0A+=20=20= (Lisp_Object=20node,=20Lisp_Object=20name)=0A+{=0A+=20=20CHECK_STRING=20= (name);=0A+=20=20char=20*name_str=20=3D=20SSDATA=20(name);=0A+=20=20= TSNode=20ts_node=20=3D=20XTS_NODE=20(node)->node;=0A+=20=20TSNode=20= child=0A+=20=20=20=20=3D=20ts_node_child_by_field_name=20(ts_node,=20= name_str,=20strlen=20(name_str));=0A=20=0A=20=20=20if=20= (ts_node_is_null(child))=0A=20=20=20=20=20return=20Qnil;=0A@@=20-272,10=20= +389,62=20@@=20DEFUN=20("tree-sitter-node-child",=0A=20=20=20return=20= make_ts_node(XTS_NODE=20(node)->parser,=20child);=0A=20}=0A=20=0A+DEFUN=20= ("tree-sitter-node-next-sibling",=0A+=20=20=20=20=20=20=20= Ftree_sitter_node_next_sibling,=0A+=20=20=20=20=20=20=20= Stree_sitter_node_next_sibling,=201,=202,=200,=0A+=20=20=20=20=20=20=20= doc:=20/*=20Return=20the=20next=20sibling=20of=20NODE.=0A+Return=20nil=20= if=20there=20isn't=20any.=20=20If=20NAMED=20is=20non-nil,=20look=20for=20= named=0A+child=20only.=20=20NAMED=20defaults=20to=20nil.=20=20*/)=0A+=20=20= (Lisp_Object=20node,=20Lisp_Object=20named)=0A+{=0A+=20=20TSNode=20= ts_node=20=3D=20XTS_NODE=20(node)->node;=0A+=20=20TSNode=20sibling;=0A+=20= =20if=20(NILP=20(named))=0A+=20=20=20=20sibling=20=3D=20= ts_node_next_sibling=20(ts_node);=0A+=20=20else=0A+=20=20=20=20sibling=20= =3D=20ts_node_next_named_sibling=20(ts_node);=0A+=0A+=20=20if=20= (ts_node_is_null(sibling))=0A+=20=20=20=20return=20Qnil;=0A+=0A+=20=20= return=20make_ts_node(XTS_NODE=20(node)->parser,=20sibling);=0A+}=0A+=0A= +DEFUN=20("tree-sitter-node-prev-sibling",=0A+=20=20=20=20=20=20=20= Ftree_sitter_node_prev_sibling,=0A+=20=20=20=20=20=20=20= Stree_sitter_node_prev_sibling,=201,=202,=200,=0A+=20=20=20=20=20=20=20= doc:=20/*=20Return=20the=20previous=20sibling=20of=20NODE.=0A+Return=20= nil=20if=20there=20isn't=20any.=20=20If=20NAMED=20is=20non-nil,=20look=20= for=20named=0A+child=20only.=20=20NAMED=20defaults=20to=20nil.=20=20*/)=0A= +=20=20(Lisp_Object=20node,=20Lisp_Object=20named)=0A+{=0A+=20=20TSNode=20= ts_node=20=3D=20XTS_NODE=20(node)->node;=0A+=20=20TSNode=20sibling;=0A+=0A= +=20=20if=20(NILP=20(named))=0A+=20=20=20=20sibling=20=3D=20= ts_node_prev_sibling=20(ts_node);=0A+=20=20else=0A+=20=20=20=20sibling=20= =3D=20ts_node_prev_named_sibling=20(ts_node);=0A+=0A+=20=20if=20= (ts_node_is_null(sibling))=0A+=20=20=20=20return=20Qnil;=0A+=0A+=20=20= return=20make_ts_node(XTS_NODE=20(node)->parser,=20sibling);=0A+}=0A+=0A= +/*=20Query=20functions=20*/=0A+=0A=20/*=20Initialize=20the=20= tree-sitter=20routines.=20=20*/=0A=20void=0A=20syms_of_tree_sitter=20= (void)=0A=20{=0A+=20=20DEFSYM=20(Qtree_sitter_parser_p,=20= "tree-sitter-parser-p");=0A+=20=20DEFSYM=20(Qtree_sitter_node_p,=20= "tree-sitter-node-p");=0A+=20=20DEFSYM=20(Qnamed,=20"named");=0A+=20=20= DEFSYM=20(Qmissing,=20"missing");=0A+=20=20DEFSYM=20(Qextra,=20"extra");=0A= +=20=20DEFSYM=20(Qhas_error,=20"has-error");=0A+=0A=20=20=20DEFSYM=20= (Qtree_sitter_parser_list,=20"tree-sitter-parser-list");=0A=20=20=20= DEFVAR_LISP=20("ts-parser-list",=20Vtree_sitter_parser_list,=0A=20=09=09=20= =20=20=20=20doc:=20/*=20A=20list=20of=20tree-sitter=20parsers.=0A@@=20= -284,11=20+453,20=20@@=20syms_of_tree_sitter=20(void)=0A=20=20=20= Vtree_sitter_parser_list=20=3D=20Qnil;=0A=20=20=20= Fmake_variable_buffer_local=20(Qtree_sitter_parser_list);=0A=20=0A-=0A+=20= =20defsubr=20(&Stree_sitter_parser_p);=0A+=20=20defsubr=20= (&Stree_sitter_node_p);=0A=20=20=20defsubr=20= (&Stree_sitter_create_parser);=0A=20=20=20defsubr=20= (&Stree_sitter_parser_root_node);=0A=20=20=20defsubr=20= (&Stree_sitter_parse);=0A+=0A+=20=20defsubr=20(&Stree_sitter_node_type);=0A= =20=20=20defsubr=20(&Stree_sitter_node_string);=0A=20=20=20defsubr=20= (&Stree_sitter_node_parent);=0A=20=20=20defsubr=20= (&Stree_sitter_node_child);=0A+=20=20defsubr=20= (&Stree_sitter_node_check);=0A+=20=20defsubr=20= (&Stree_sitter_node_field_name_for_child);=0A+=20=20defsubr=20= (&Stree_sitter_node_child_count);=0A+=20=20defsubr=20= (&Stree_sitter_node_child_by_field_name);=0A+=20=20defsubr=20= (&Stree_sitter_node_next_sibling);=0A+=20=20defsubr=20= (&Stree_sitter_node_prev_sibling);=0A=20}=0Adiff=20--git=20= a/src/tree_sitter.h=20b/src/tree_sitter.h=0Aindex=20= 0606f336cc..a7e2a2d670=20100644=0A---=20a/src/tree_sitter.h=0A+++=20= b/src/tree_sitter.h=0A@@=20-37,7=20+37,7=20@@=20#define=20= EMACS_TREE_SITTER_H=0A=20=20=20TSParser=20*parser;=0A=20=20=20TSTree=20= *tree;=0A=20=20=20TSInput=20input;=0A-=20=20TSInputEdit=20edit;=0A+=20=20= bool=20need_reparse;=0A=20};=0A=20=0A=20/*=20A=20wrapper=20around=20a=20= tree-sitter=20node.=20=20*/=0A@@=20-78,11=20+78,21=20@@=20XTS_NODE=20= (Lisp_Object=20a)=0A=20=20=20return=20XUNTAG=20(a,=20Lisp_Vectorlike,=20= struct=20Lisp_TS_Node);=0A=20}=0A=20=0A-void=0A-ts_before_change=20= (ptrdiff_t=20charpos,=20ptrdiff_t=20lendel);=0A+INLINE=20void=0A= +CHECK_TS_PARSER=20(Lisp_Object=20parser)=0A+{=0A+=20=20CHECK_TYPE=20= (TS_PARSERP=20(parser),=20Qtree_sitter_parser_p,=20parser);=0A+}=0A+=0A= +INLINE=20void=0A+CHECK_TS_NODE=20(Lisp_Object=20node)=0A+{=0A+=20=20= CHECK_TYPE=20(TS_NODEP=20(node),=20Qtree_sitter_node_p,=20node);=0A+}=0A=20= =0A=20void=0A-ts_after_change=20(ptrdiff_t=20charpos,=20ptrdiff_t=20= lendel,=20ptrdiff_t=20lenins);=0A+ts_record_change=20(ptrdiff_t=20= start_byte,=20ptrdiff_t=20old_end_byte,=0A+=09=09=20=20ptrdiff_t=20= new_end_byte);=0A=20=0A=20Lisp_Object=0A=20make_ts_parser=20(struct=20= buffer=20*buffer,=20TSParser=20*parser,=20TSTree=20*tree);=0Adiff=20= --git=20a/test/src/tree-sitter-tests.el=20= b/test/src/tree-sitter-tests.el=0Anew=20file=20mode=20100644=0Aindex=20= 0000000000..cb1c464d3a=0A---=20/dev/null=0A+++=20= b/test/src/tree-sitter-tests.el=0A@@=20-0,0=20+1,106=20@@=0A+;;;=20= tree-sitter-tests.el=20---=20tests=20for=20src/tree-sitter.c=20=20=20=20=20= =20=20=20=20-*-=20lexical-binding:=20t;=20-*-=0A+=0A+;;=20Copyright=20= (C)=202021=20Free=20Software=20Foundation,=20Inc.=0A+=0A+;;=20This=20= file=20is=20part=20of=20GNU=20Emacs.=0A+=0A+;;=20GNU=20Emacs=20is=20free=20= software:=20you=20can=20redistribute=20it=20and/or=20modify=0A+;;=20it=20= under=20the=20terms=20of=20the=20GNU=20General=20Public=20License=20as=20= published=20by=0A+;;=20the=20Free=20Software=20Foundation,=20either=20= version=203=20of=20the=20License,=20or=0A+;;=20(at=20your=20option)=20= any=20later=20version.=0A+=0A+;;=20GNU=20Emacs=20is=20distributed=20in=20= the=20hope=20that=20it=20will=20be=20useful,=0A+;;=20but=20WITHOUT=20ANY=20= WARRANTY;=20without=20even=20the=20implied=20warranty=20of=0A+;;=20= MERCHANTABILITY=20or=20FITNESS=20FOR=20A=20PARTICULAR=20PURPOSE.=20=20= See=20the=0A+;;=20GNU=20General=20Public=20License=20for=20more=20= details.=0A+=0A+;;=20You=20should=20have=20received=20a=20copy=20of=20= the=20GNU=20General=20Public=20License=0A+;;=20along=20with=20GNU=20= Emacs.=20=20If=20not,=20see=20.=0A+=0A= +;;;=20Code:=0A+=0A+(require=20'ert)=0A+(require=20'tree-sitter-json)=0A= +=0A+(ert-deftest=20tree-sitter-basic-parsing=20()=0A+=20=20"Test=20= basic=20parsing=20routines."=0A+=20=20(with-temp-buffer=0A+=20=20=20=20= (let=20((parser=20(tree-sitter-create-parser=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(current-buffer)=20(tree-sitter-json))))=0A= +=20=20=20=20=20=20(should=0A+=20=20=20=20=20=20=20(eq=20parser=20(car=20= tree-sitter-parser-list)))=0A+=20=20=20=20=20=20(should=0A+=20=20=20=20=20= =20=20(equal=20(tree-sitter-node-string=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(tree-sitter-parser-root-node=20parser))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20"(ERROR)"))=0A+=0A+=20=20=20=20=20=20(insert=20= "[1,2,3]")=0A+=20=20=20=20=20=20(should=0A+=20=20=20=20=20=20=20(equal=20= (tree-sitter-node-string=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (tree-sitter-parser-root-node=20parser))=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20"(document=20(array=20(number)=20(number)=20(number)))"))=0A= +=0A+=20=20=20=20=20=20(goto-char=20(point-min))=0A+=20=20=20=20=20=20= (forward-char=203)=0A+=20=20=20=20=20=20(insert=20"{\"name\":=20= \"Bob\"},")=0A+=20=20=20=20=20=20(should=0A+=20=20=20=20=20=20=20(equal=0A= +=20=20=20=20=20=20=20=20(tree-sitter-node-string=0A+=20=20=20=20=20=20=20= =20=20(tree-sitter-parser-root-node=20parser))=0A+=20=20=20=20=20=20=20=20= "(document=20(array=20(number)=20(object=20(pair=20key:=20(string=20= (string_content))=20value:=20(string=20(string_content))))=20(number)=20= (number)))")))))=0A+=0A+(ert-deftest=20tree-sitter-node-api=20()=0A+=20=20= "Tests=20for=20node=20API."=0A+=20=20(with-temp-buffer=0A+=20=20=20=20= (insert=20"[1,2,{\"name\":=20\"Bob\"},3]")=0A+=20=20=20=20(let=20(parser=20= root-node=20doc-node=20object-node=20pair-node)=0A+=20=20=20=20=20=20= (setq=20parser=20(tree-sitter-create-parser=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(current-buffer)=20(tree-sitter-json)))=0A= +=20=20=20=20=20=20(setq=20root-node=20(tree-sitter-parser-root-node=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= parser))=0A+=20=20=20=20=20=20;;=20`tree-sitter-node-type'.=0A+=20=20=20=20= =20=20(should=20(eq=20'document=20(tree-sitter-node-type=20root-node)))=0A= +=20=20=20=20=20=20;;=20`tree-sitter-node-check'.=0A+=20=20=20=20=20=20= (should=20(eq=20t=20(tree-sitter-node-check=20root-node=20'named)))=0A+=20= =20=20=20=20=20(should=20(eq=20nil=20(tree-sitter-node-check=20root-node=20= 'missing)))=0A+=20=20=20=20=20=20(should=20(eq=20nil=20= (tree-sitter-node-check=20root-node=20'extra)))=0A+=20=20=20=20=20=20= (should=20(eq=20nil=20(tree-sitter-node-check=20root-node=20= 'has-error)))=0A+=20=20=20=20=20=20;;=20`tree-sitter-node-child'.=0A+=20=20= =20=20=20=20(setq=20doc-node=20(tree-sitter-node-child=20root-node=200))=0A= +=20=20=20=20=20=20(should=20(eq=20'array=20(tree-sitter-node-type=20= doc-node)))=0A+=20=20=20=20=20=20(should=20(equal=20= (tree-sitter-node-string=20doc-node)=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20"(array=20(number)=20(number)=20(object=20= (pair=20key:=20(string=20(string_content))=20value:=20(string=20= (string_content))))=20(number))"))=0A+=20=20=20=20=20=20;;=20= `tree-sitter-node-child-count'.=0A+=20=20=20=20=20=20(should=20(eql=209=20= (tree-sitter-node-child-count=20doc-node)))=0A+=20=20=20=20=20=20(should=20= (eql=204=20(tree-sitter-node-child-count=20doc-node=20t)))=0A+=20=20=20=20= =20=20;;=20`tree-sitter-node-field-name-for-child'.=0A+=20=20=20=20=20=20= (setq=20object-node=20(tree-sitter-node-child=20doc-node=202=20t))=0A+=20= =20=20=20=20=20(setq=20pair-node=20(tree-sitter-node-child=20object-node=20= 0=20t))=0A+=20=20=20=20=20=20(should=20(eq=20'object=20= (tree-sitter-node-type=20object-node)))=0A+=20=20=20=20=20=20(should=20= (eq=20'pair=20(tree-sitter-node-type=20pair-node)))=0A+=20=20=20=20=20=20= (should=20(equal=20"key"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(tree-sitter-node-field-name-for-child=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20pair-node=200)))=0A+=20= =20=20=20=20=20;;=20`tree-sitter-node-child-by-field-name'.=0A+=20=20=20=20= =20=20(should=20(equal=20"(string=20(string_content))"=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(tree-sitter-node-string=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (tree-sitter-node-child-by-field-name=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20pair-node=20"key"))))=0A+=20=20=20=20= =20=20;;=20`tree-sitter-node-next-sibling'.=0A+=20=20=20=20=20=20(should=20= (equal=20"(number)"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(tree-sitter-node-string=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(tree-sitter-node-next-sibling=20= object-node=20t))))=0A+=20=20=20=20=20=20(should=20(equal=20"(\",\")"=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (tree-sitter-node-string=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(tree-sitter-node-next-sibling=20object-node))))=0A= +=20=20=20=20=20=20;;=20`tree-sitter-node-prev-sibling'.=0A+=20=20=20=20=20= =20(should=20(equal=20"(number)"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(tree-sitter-node-string=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (tree-sitter-node-prev-sibling=20object-node=20t))))=0A+=20=20=20=20=20=20= (should=20(equal=20"(\",\")"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(tree-sitter-node-string=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(tree-sitter-node-prev-sibling=20= object-node))))=0A+=20=20=20=20=20=20)))=0A+=0A+(provide=20= 'tree-sitter-tests)=0A+;;;=20tree-sitter-tests.el=20ends=20here=0A--=20=0A= 2.24.3=20(Apple=20Git-128)=0A=0A= --Apple-Mail=_C44B9097-01D7-4DA9-84DB-E5570CD3153A--