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, 14 Jul 2021 22:48:30 -0400 Message-ID: <9F1D903D-0BD2-44F5-B83C-4E9F3D12AC85@gmail.com> References: <84B70E9B-E1E5-40D3-AFBE-033CACF15914@gmail.com> <82443C84-A4C8-4FD2-AD08-C317416CA709@gmail.com> Mime-Version: 1.0 (Mac OS X Mail 14.0 \(3654.60.0.2.21\)) Content-Type: multipart/alternative; boundary="Apple-Mail=_9B1BA943-8FC8-4DC2-9DAC-2304DBDE30EF" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="29405"; mail-complaints-to="usenet@ciao.gmane.io" Cc: emacs-devel To: Stefan Monnier Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Thu Jul 15 04:49:13 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 1m3rR2-0007U5-Pl for ged-emacs-devel@m.gmane-mx.org; Thu, 15 Jul 2021 04:49:12 +0200 Original-Received: from localhost ([::1]:49330 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1m3rR1-0005RH-9f for ged-emacs-devel@m.gmane-mx.org; Wed, 14 Jul 2021 22:49:11 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:53226) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1m3rQR-0004lX-JU for emacs-devel@gnu.org; Wed, 14 Jul 2021 22:48:35 -0400 Original-Received: from mail-qt1-x831.google.com ([2607:f8b0:4864:20::831]:34538) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1m3rQP-0001vq-Ih for emacs-devel@gnu.org; Wed, 14 Jul 2021 22:48:35 -0400 Original-Received: by mail-qt1-x831.google.com with SMTP id g8so3522228qtj.1 for ; Wed, 14 Jul 2021 19:48:32 -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=uwGFj/RIAnSHgg+qo/Y1gn3NbuMI31WwVPgiWYCvZAI=; b=M3v/SAJJty13CMZ7cyEjB33WgCMiKpiQ0l6pdUwgPH0X4CdwJouaF2/rtuHNH172YT FEOSz1Rs2en3hJM+bnzFeO9ju7oxP/eKUgqHWune+u3g0HCBXlCHi6HhsDNoJVIa6rSd 347JQclrVCT3Dh5tfSeM/l37wArtOyDk9ECmWlLTPqZEz4/JhMB9ahSiRazPth7J35mT 4mq2pYJ8X1E9TsrhEVS4bwA6/fYP/978guoTn9ZIhpPLqhpyLpkTUqbCw+bPVbHGq15C pvSAGOGR40MKCN/8F7qKVkmBSWWBauOCIoSPEW2EVp+hoYB0CyXPzWUAC6FEleteNvT2 fCag== 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=uwGFj/RIAnSHgg+qo/Y1gn3NbuMI31WwVPgiWYCvZAI=; b=YET71ftjHARbe+t0+X34/9mPWcHDnoLY7qF/KVgTn64kA9trAOZ7kV2gJsst9JTaoA hrJ+0n+tupluGyRKYtwoMK6eBZz+IIoXwck4yuUDG6sAPFkKmHGA88MCUB47SDmu2+L2 Cvecg+ocvr2+fac7CrUS6oXGl/Xeat6KdHk3zwIYbgSV+YHASXTQ9jYVwoJFFN3QvqOQ pYXtEcTP1Aqy8MsHx/l9eQWlYc/Txj4SkdRJnZm7q7UcdocvfB4upTZMffgLg2YdRdq+ zEXT2qjUTWUtIG/hhfn7vxMYE8z3UJuAOhSCPvi6m5nFVEDVe5Q66TK4hR5iY6Eeoxex 3EUQ== X-Gm-Message-State: AOAM530U+rNxsYJUaoqIR6gjIyndbVKEPMVMoHgq+UtaphuOwy8BHlTv oDxHU7ZYqLlbQOpsmmVJTE8= X-Google-Smtp-Source: ABdhPJyAjno9ZTFjiUFBHCcCok2R6hnRXabTiHtqNRKOCCHjKVCtw/LYYPGK1l0TzTAw6mOxTJoabQ== X-Received: by 2002:ac8:1008:: with SMTP id z8mr1468015qti.232.1626317312204; Wed, 14 Jul 2021 19:48:32 -0700 (PDT) Original-Received: from ?IPv6:2601:98a:4102:3d80:86f:d40e:402b:2fc7? ([2601:98a:4102:3d80:86f:d40e:402b:2fc7]) by smtp.gmail.com with ESMTPSA id i4sm60065qka.130.2021.07.14.19.48.31 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 14 Jul 2021 19:48:31 -0700 (PDT) In-Reply-To: X-Mailer: Apple Mail (2.3654.60.0.2.21) Received-SPF: pass client-ip=2607:f8b0:4864:20::831; envelope-from=casouri@gmail.com; helo=mail-qt1-x831.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, HTML_MESSAGE=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:271232 Archived-At: --Apple-Mail=_9B1BA943-8FC8-4DC2-9DAC-2304DBDE30EF Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 I defined two pseudo vectors for tree-sitter's parser and node and = packaged a dynamic module for tree-sitter=E2=80=99s json language = definition. I also wrapped a few tree-sitter functions just to test if = everything works. Please have a look. I=E2=80=99m sure there are some = problems because I mainly wrote by copy, paste and modifying from other = code I found in Emacs source. To try out this patch, get tree-sitter from = https://github.com/tree-sitter/tree-sitter.git = , make and make install = it. Then unzip json-module.zip to get the source of the json dynamic = module. If my Makefile is correct, make'ing it should produce a = tree-sitter-json.so. Then if you apply ts.patch, compile emacs, and run = this snippet, you should get a string representation of the root node. (require 'tree-sitter-json) (tree-sitter-node-string (tree-sitter-parse "[1,2]" (tree-sitter-json))) Yuan --Apple-Mail=_9B1BA943-8FC8-4DC2-9DAC-2304DBDE30EF Content-Type: multipart/mixed; boundary="Apple-Mail=_B3EE442C-923E-44FA-905B-875D4029EC46" --Apple-Mail=_B3EE442C-923E-44FA-905B-875D4029EC46 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8 I defined two pseudo = vectors for tree-sitter's parser and node and packaged a dynamic module = for tree-sitter=E2=80=99s json language definition. I also wrapped a few = tree-sitter functions just to test if everything works. Please have a = look. I=E2=80=99m sure there are some problems because I mainly wrote by = copy, paste and modifying from other code I found in Emacs source.

To try out this patch, = get tree-sitter from https://github.com/tree-sitter/tree-sitter.git, make and = make install it. Then unzip json-module.zip to get the source of the = json dynamic module. If my Makefile is correct, make'ing it should = produce a tree-sitter-json.so. Then if you apply ts.patch, compile = emacs, and run this snippet, you should get a string representation of = the root node.

(require 'tree-sitter-json)
(tree-sitter-node-string (tree-sitter-parse "[1,2]" = (tree-sitter-json)))

Yuan



= --Apple-Mail=_B3EE442C-923E-44FA-905B-875D4029EC46 Content-Disposition: attachment; filename=ts.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="ts.patch" Content-Transfer-Encoding: quoted-printable =46rom=2085baf92975224ea99b7f68d5854342803c61f1d1=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Yuan=20Fu=20=0ADate:=20Wed,=20= 14=20Jul=202021=2022:26:42=20-0400=0ASubject:=20[PATCH]=20checkpoint=0A=0A= ---=0A=20configure.ac=20=20=20=20=20=20|=20=2027=20++++++++-=0A=20= src/Makefile.in=20=20=20|=20=2011=20+++-=0A=20src/alloc.c=20=20=20=20=20=20= =20|=20=2013=20+++++=0A=20src/emacs.c=20=20=20=20=20=20=20|=20=20=204=20= ++=0A=20src/lisp.h=20=20=20=20=20=20=20=20|=20=20=202=20+=0A=20= src/print.c=20=20=20=20=20=20=20|=20=2017=20++++++=0A=20= src/tree_sitter.c=20|=20145=20= ++++++++++++++++++++++++++++++++++++++++++++++=0A=20src/tree_sitter.h=20= |=20=2087=20++++++++++++++++++++++++++++=0A=208=20files=20changed,=20302=20= insertions(+),=204=20deletions(-)=0A=20create=20mode=20100644=20= src/tree_sitter.c=0A=20create=20mode=20100644=20src/tree_sitter.h=0A=0A= diff=20--git=20a/configure.ac=20b/configure.ac=0Aindex=20= 830f33844b..42d2d43455=20100644=0A---=20a/configure.ac=0A+++=20= b/configure.ac=0A@@=20-454,6=20+454,7=20@@=20AC_DEFUN=0A=20= OPTION_DEFAULT_OFF([imagemagick],[compile=20with=20ImageMagick=20image=20= support])=0A=20OPTION_DEFAULT_ON([native-image-api],=20[don't=20use=20= native=20image=20APIs=20(GDI+=20on=20Windows)])=0A=20= OPTION_DEFAULT_IFAVAILABLE([json],=20[compile=20with=20native=20JSON=20= support])=0A+OPTION_DEFAULT_IFAVAILABLE([tree-sitter],=20[compile=20with=20= tree-sitter])=0A=20=0A=20OPTION_DEFAULT_ON([xft],[don't=20use=20XFT=20= for=20anti=20aliased=20fonts])=0A=20OPTION_DEFAULT_ON([harfbuzz],[don't=20= use=20HarfBuzz=20for=20text=20shaping])=0A@@=20-2963,6=20+2964,23=20@@=20= AC_DEFUN=0A=20AC_SUBST(JSON_CFLAGS)=0A=20AC_SUBST(JSON_OBJ)=0A=20=0A= +HAVE_TREE_SITTER=3Dno=0A+TREE_SITTER_OBJ=3D=0A+=0A+if=20test=20= "${with_tree_sitter}"=20!=3D=20"no";=20then=0A+=20=20= EMACS_CHECK_MODULES([TREE_SITTER],=20[tree-sitter=20>=3D=200.0],=0A+=20=20= =20=20[HAVE_TREE_SITTER=3Dyes],=20[HAVE_TREE_SITTER=3Dno])=0A+=20=20if=20= test=20"${HAVE_TREE_SITTER}"=20=3D=20yes;=20then=0A+=20=20=20=20= AC_DEFINE(HAVE_TREE_SITTER,=201,=20[Define=20if=20using=20tree-sitter.])=0A= +=20=20=20=20TREE_SITTER_LIBS=3D-ltree-sitter=0A+=20=20=20=20= TREE_SITTER_OBJ=3D"tree_sitter.o"=0A+=20=20fi=0A+fi=0A+=0A= +AC_SUBST(TREE_SITTER_LIBS)=0A+AC_SUBST(TREE_SITTER_CFLAGS)=0A= +AC_SUBST(TREE_SITTER_OBJ)=0A+=0A=20NOTIFY_OBJ=3D=0A=20NOTIFY_SUMMARY=3Dno= =0A=20=0A@@=20-4028,6=20+4046,12=20@@=20AC_DEFUN=0A=20=20=20*)=20= MISSING=3D"$MISSING=20json"=0A=20=20=20=20=20=20= WITH_IFAVAILABLE=3D"$WITH_IFAVAILABLE=20--with-json=3Difavailable";;=0A=20= esac=0A+case=20$with_tree_sitter,$HAVE_TREE_SITTER=20in=0A+=20=20no,*=20= |=20ifavailable,*=20|=20*,yes)=20;;=0A+=20=20*)=20MISSING=3D"$MISSING=20= tree-sitter"=0A+=20=20=20=20=20WITH_IFAVAILABLE=3D"$WITH_IFAVAILABLE=20= --with-tree-sitter=3Difavailable";;=0A+esac=0A+=0A=20if=20test=20= "X${MISSING}"=20!=3D=20X;=20then=0A=20=20=20#=20If=20we=20have=20a=20= missing=20library,=20and=20we=20don't=20have=20pkg-config=20installed,=0A= =20=20=20#=20the=20missing=20pkg-config=20may=20be=20the=20reason.=20=20= Give=20the=20user=20a=20hint.=0A@@=20-5833,7=20+5857,7=20@@=20AC_DEFUN=0A= =20optsep=3D=0A=20emacs_config_features=3D=0A=20for=20opt=20in=20ACL=20= CAIRO=20DBUS=20FREETYPE=20GCONF=20GIF=20GLIB=20GMP=20GNUTLS=20GPM=20= GSETTINGS=20\=0A-=20HARFBUZZ=20IMAGEMAGICK=20JPEG=20JSON=20LCMS2=20= LIBOTF=20LIBSELINUX=20LIBSYSTEMD=20LIBXML2=20\=0A+=20HARFBUZZ=20= IMAGEMAGICK=20JPEG=20JSON=20TREE-SITTER=20LCMS2=20LIBOTF=20LIBSELINUX=20= LIBSYSTEMD=20LIBXML2=20\=0A=20=20M17N_FLT=20MODULES=20NATIVE_COMP=20= NOTIFY=20NS=20OLDXMENU=20PDUMPER=20PNG=20RSVG=20SECCOMP=20\=0A=20=20= SOUND=20THREADS=20TIFF=20\=0A=20=20TOOLKIT_SCROLL_BARS=20UNEXEC=20X11=20= XAW3D=20XDBE=20XFT=20XIM=20XPM=20XWIDGETS=20X_TOOLKIT=20\=0A@@=20-5902,6=20= +5926,7=20@@=20AC_DEFUN=0A=20=20=20Does=20Emacs=20use=20-lxft?=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20${HAVE_XFT}=0A=20=20=20Does=20Emacs=20use=20-lsystemd?=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20${HAVE_LIBSYSTEMD}=0A=20=20=20Does=20Emacs=20use=20= -ljansson?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20${HAVE_JSON}=0A+=20=20Does=20Emacs=20use=20= -ltree-sitter?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20${HAVE_TREE_SITTER}=0A=20=20=20Does=20Emacs=20use=20= the=20GMP=20library?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20${HAVE_GMP}=0A=20=20=20Does=20Emacs=20directly=20= use=20zlib?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20${HAVE_ZLIB}=0A=20=20=20Does=20Emacs=20have=20dynamic=20= modules=20support?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ${HAVE_MODULES}=0Adiff=20--git=20a/src/Makefile.in=20b/src/Makefile.in=0A= index=2079cddb35b5..bfdfda566e=20100644=0A---=20a/src/Makefile.in=0A+++=20= b/src/Makefile.in=0A@@=20-320,6=20+320,10=20@@=20JSON_LIBS=20=3D=0A=20= JSON_CFLAGS=20=3D=20@JSON_CFLAGS@=0A=20JSON_OBJ=20=3D=20@JSON_OBJ@=0A=20=0A= +TREE_SITTER_LIBS=20=3D=20@TREE_SITTER_LIBS@=0A+TREE_SITTER_FLAGS=20=3D=20= @TREE_SITTER_FLAGS@=0A+TREE_SITTER_OBJ=20=3D=20@TREE_SITTER_OBJ@=0A+=0A=20= INTERVALS_H=20=3D=20dispextern.h=20intervals.h=20composite.h=0A=20=0A=20= GETLOADAVG_LIBS=20=3D=20@GETLOADAVG_LIBS@=0A@@=20-372,7=20+376,7=20@@=20= EMACS_CFLAGS=3D=0A=20=20=20$(WEBKIT_CFLAGS)=20$(LCMS2_CFLAGS)=20\=0A=20=20= =20$(SETTINGS_CFLAGS)=20$(FREETYPE_CFLAGS)=20$(FONTCONFIG_CFLAGS)=20\=0A=20= =20=20$(HARFBUZZ_CFLAGS)=20$(LIBOTF_CFLAGS)=20$(M17N_FLT_CFLAGS)=20= $(DEPFLAGS)=20\=0A-=20=20$(LIBSYSTEMD_CFLAGS)=20$(JSON_CFLAGS)=20\=0A+=20= =20$(LIBSYSTEMD_CFLAGS)=20$(JSON_CFLAGS)=20$(TREE_SITTER_CFLAGS)=20\=0A=20= =20=20$(LIBGNUTLS_CFLAGS)=20$(NOTIFY_CFLAGS)=20$(CAIRO_CFLAGS)=20\=0A=20=20= =20$(WERROR_CFLAGS)=0A=20ALL_CFLAGS=20=3D=20$(EMACS_CFLAGS)=20= $(WARN_CFLAGS)=20$(CFLAGS)=0A@@=20-406,7=20+410,8=20@@=20base_obj=20=3D=0A= =20=09thread.o=20systhread.o=20\=0A=20=09$(if=20= $(HYBRID_MALLOC),sheap.o)=20\=0A=20=09$(MSDOS_OBJ)=20$(MSDOS_X_OBJ)=20= $(NS_OBJ)=20$(CYGWIN_OBJ)=20$(FONT_OBJ)=20\=0A-=09$(W32_OBJ)=20= $(WINDOW_SYSTEM_OBJ)=20$(XGSELOBJ)=20$(JSON_OBJ)=0A+=09$(W32_OBJ)=20= $(WINDOW_SYSTEM_OBJ)=20$(XGSELOBJ)=20$(JSON_OBJ)=20\=0A+=09= $(TREE_SITTER_OBJ)=0A=20obj=20=3D=20$(base_obj)=20$(NS_OBJC_OBJ)=0A=20=0A= =20##=20Object=20files=20used=20on=20some=20machine=20or=20other.=0A@@=20= -516,7=20+521,7=20@@=20LIBES=20=3D=0A=20=20=20=20$(FREETYPE_LIBS)=20= $(FONTCONFIG_LIBS)=20$(HARFBUZZ_LIBS)=20$(LIBOTF_LIBS)=20= $(M17N_FLT_LIBS)=20\=0A=20=20=20=20$(LIBGNUTLS_LIBS)=20$(LIB_PTHREAD)=20= $(GETADDRINFO_A_LIBS)=20$(LCMS2_LIBS)=20\=0A=20=20=20=20$(NOTIFY_LIBS)=20= $(LIB_MATH)=20$(LIBZ)=20$(LIBMODULES)=20$(LIBSYSTEMD_LIBS)=20\=0A-=20=20=20= $(JSON_LIBS)=20$(LIBGMP)=20$(LIBGCCJIT)=0A+=20=20=20$(JSON_LIBS)=20= $(LIBGMP)=20$(LIBGCCJIT)=20$(TREE_SITTER_LIBS)=0A=20=0A=20##=20FORCE=20= it=20so=20that=20admin/unidata=20can=20decide=20whether=20this=20file=20= is=0A=20##=20up-to-date.=20=20Although=20since=20charprop=20depends=20on=20= bootstrap-emacs,=0Adiff=20--git=20a/src/alloc.c=20b/src/alloc.c=0Aindex=20= 76d8c7ddd1..f144e053f2=20100644=0A---=20a/src/alloc.c=0A+++=20= b/src/alloc.c=0A@@=20-50,6=20+50,10=20@@=20Copyright=20(C)=201985-1986,=20= 1988,=201993-1995,=201997-2021=20Free=20Software=0A=20#include=20= TERM_HEADER=0A=20#endif=20/*=20HAVE_WINDOW_SYSTEM=20*/=0A=20=0A+#ifdef=20= HAVE_TREE_SITTER=0A+#include=20"tree_sitter.h"=0A+#endif=0A+=0A=20= #include=20=0A=20#include=20=0A=20#include=20= =20=20=20=20=20=20=20=20=20=20=20/*=20For=20backtrace.=20=20= */=0A@@=20-3144,6=20+3148,15=20@@=20cleanup_vector=20(struct=20= Lisp_Vector=20*vector)=0A=20=20=20=20=20=20=20if=20(uptr->finalizer)=0A=20= =09uptr->finalizer=20(uptr->p);=0A=20=20=20=20=20}=0A+#ifdef=20= HAVE_TREE_SITTER=0A+=20=20else=20if=20(PSEUDOVECTOR_TYPEP=20= (&vector->header,=20PVEC_TS_PARSER))=0A+=20=20=20=20{=0A+=20=20=20=20=20=20= struct=20Lisp_TS_Parser=20*lisp_parser=0A+=09=3D=20PSEUDOVEC_STRUCT=20= (vector,=20Lisp_TS_Parser);=0A+=20=20=20=20=20=20= ts_tree_delete(lisp_parser->tree);=0A+=20=20=20=20=20=20= ts_parser_delete(lisp_parser->parser);=0A+=20=20=20=20}=0A+#endif=0A=20= #ifdef=20HAVE_MODULES=0A=20=20=20else=20if=20(PSEUDOVECTOR_TYPEP=20= (&vector->header,=20PVEC_MODULE_FUNCTION))=0A=20=20=20=20=20{=0Adiff=20= --git=20a/src/emacs.c=20b/src/emacs.c=0Aindex=2060a57a693c..ede390231d=20= 100644=0A---=20a/src/emacs.c=0A+++=20b/src/emacs.c=0A@@=20-85,6=20+85,7=20= @@=20#define=20MAIN_PROGRAM=0A=20#include=20"intervals.h"=0A=20#include=20= "character.h"=0A=20#include=20"buffer.h"=0A+#include=20"tree_sitter.h"=0A= =20#include=20"window.h"=0A=20#include=20"xwidget.h"=0A=20#include=20= "atimer.h"=0A@@=20-2057,6=20+2058,9=20@@=20main=20(int=20argc,=20char=20= **argv)=0A=20=20=20=20=20=20=20syms_of_floatfns=20();=0A=20=0A=20=20=20=20= =20=20=20syms_of_buffer=20();=0A+=20=20=20=20=20=20#ifdef=20= HAVE_TREE_SITTER=0A+=20=20=20=20=20=20syms_of_tree_sitter=20();=0A+=20=20= =20=20=20=20#endif=0A=20=20=20=20=20=20=20syms_of_bytecode=20();=0A=20=20= =20=20=20=20=20syms_of_callint=20();=0A=20=20=20=20=20=20=20= syms_of_casefiddle=20();=0Adiff=20--git=20a/src/lisp.h=20b/src/lisp.h=0A= index=204fb8923678..e439447283=20100644=0A---=20a/src/lisp.h=0A+++=20= b/src/lisp.h=0A@@=20-1070,6=20+1070,8=20@@=20DEFINE_GDB_SYMBOL_END=20= (PSEUDOVECTOR_FLAG)=0A=20=20=20PVEC_CONDVAR,=0A=20=20=20= PVEC_MODULE_FUNCTION,=0A=20=20=20PVEC_NATIVE_COMP_UNIT,=0A+=20=20= PVEC_TS_PARSER,=0A+=20=20PVEC_TS_NODE,=0A=20=0A=20=20=20/*=20These=20= should=20be=20last,=20for=20internal_equal=20and=20sxhash_obj.=20=20*/=0A= =20=20=20PVEC_COMPILED,=0Adiff=20--git=20a/src/print.c=20b/src/print.c=0A= index=20d4301fd7b6..e20a1d065a=20100644=0A---=20a/src/print.c=0A+++=20= b/src/print.c=0A@@=20-48,6=20+48,10=20@@=20Copyright=20(C)=201985-1986,=20= 1988,=201993-1995,=201997-2021=20Free=20Software=0A=20#=20include=20= =20/*=20for=20F_DUPFD_CLOEXEC=20*/=0A=20#endif=0A=20=0A= +#ifdef=20HAVE_TREE_SITTER=0A+#include=20"tree_sitter.h"=0A+#endif=0A+=0A= =20struct=20terminal;=0A=20=0A=20/*=20Avoid=20actual=20stack=20overflow=20= in=20print.=20=20*/=0A@@=20-1853,6=20+1857,19=20@@=20print_vectorlike=20= (Lisp_Object=20obj,=20Lisp_Object=20printcharfun,=20bool=20escapeflag,=0A= =20=20=20=20=20=20=20}=0A=20=20=20=20=20=20=20break;=0A=20#endif=0A+=0A= +#ifdef=20HAVE_TREE_SITTER=0A+=20=20=20=20case=20PVEC_TS_PARSER:=0A+=20=20= =20=20=20=20print_c_string=20("#buffer,=20name),=20printcharfun);=0A+=20=20=20=20=20=20printchar=20= ('>',=20printcharfun);=0A+=20=20=20=20=20=20break;=0A+=20=20=20=20case=20= PVEC_TS_NODE:=0A+=20=20=20=20=20=20print_c_string=20= ("#',=20printcharfun);=0A+=20=20=20=20=20=20break;=0A+#endif=0A+=0A=20=20= =20=20=20default:=0A=20=20=20=20=20=20=20emacs_abort=20();=0A=20=20=20=20= =20}=0Adiff=20--git=20a/src/tree_sitter.c=20b/src/tree_sitter.c=0Anew=20= file=20mode=20100644=0Aindex=200000000000..f2134c571a=0A---=20/dev/null=0A= +++=20b/src/tree_sitter.c=0A@@=20-0,0=20+1,145=20@@=0A+/*=20Tree-sitter=20= integration=20for=20GNU=20Emacs.=0A+=0A+Copyright=20(C)=202021=20Free=20= Software=20Foundation,=20Inc.=0A+=0A+This=20file=20is=20part=20of=20GNU=20= Emacs.=0A+=0A+GNU=20Emacs=20is=20free=20software:=20you=20can=20= redistribute=20it=20and/or=20modify=0A+it=20under=20the=20terms=20of=20= the=20GNU=20General=20Public=20License=20as=20published=20by=0A+the=20= Free=20Software=20Foundation,=20either=20version=203=20of=20the=20= License,=20or=20(at=0A+your=20option)=20any=20later=20version.=0A+=0A= +GNU=20Emacs=20is=20distributed=20in=20the=20hope=20that=20it=20will=20= be=20useful,=0A+but=20WITHOUT=20ANY=20WARRANTY;=20without=20even=20the=20= implied=20warranty=20of=0A+MERCHANTABILITY=20or=20FITNESS=20FOR=20A=20= PARTICULAR=20PURPOSE.=20=20See=20the=0A+GNU=20General=20Public=20License=20= for=20more=20details.=0A+=0A+You=20should=20have=20received=20a=20copy=20= of=20the=20GNU=20General=20Public=20License=0A+along=20with=20GNU=20= Emacs.=20=20If=20not,=20see=20.=20=20*/=0A= +=0A+#include=20=0A+=0A+#include=20=0A+#include=20= =0A+#include=20=0A+#include=20=0A= +#include=20=0A+#include=20=0A+#include=20=0A= +=0A+#include=20"buffer.h"=0A+#include=20"coding.h"=0A+#include=20= "tree_sitter.h"=0A+=0A+/*=20parser.h=20defines=20a=20macro=20ADVANCE=20= that=20conflicts=20with=20alloc.c.=20=20=20*/=0A+#include=20= =0A+=0A+Lisp_Object=0A+make_ts_parser=20(struct=20= buffer=20*buffer,=20TSParser=20*parser,=20TSTree=20*tree)=0A+{=0A+=20=20= struct=20Lisp_TS_Parser=20*lisp_parser=0A+=20=20=20=20=3D=20= ALLOCATE_PLAIN_PSEUDOVECTOR=20(struct=20Lisp_TS_Parser,=20= PVEC_TS_PARSER);=0A+=20=20lisp_parser->buffer=20=3D=20buffer;=0A+=20=20= lisp_parser->parser=20=3D=20parser;=0A+=20=20lisp_parser->tree=20=3D=20= tree;=0A+=20=20//=20TODO=20TSInput.=0A+=20=20return=20make_lisp_ptr=20= (lisp_parser,=20Lisp_Vectorlike);=0A+}=0A+=0A+Lisp_Object=0A= +make_ts_node=20(Lisp_Object=20parser,=20TSNode=20node)=0A+{=0A+=20=20= struct=20Lisp_TS_Node=20*lisp_node=0A+=20=20=20=20=3D=20= ALLOCATE_PSEUDOVECTOR=20(struct=20Lisp_TS_Node,=20parser,=20= PVEC_TS_NODE);=0A+=20=20lisp_node->parser=20=3D=20parser;=0A+=20=20= lisp_node->node=20=3D=20node;=0A+=20=20return=20make_lisp_ptr=20= (lisp_node,=20Lisp_Vectorlike);=0A+}=0A+=0A+=0A+/*=20Tree-sitter=20= parser.=20=20*/=0A+=0A+DEFUN=20("tree-sitter-parse",=20= Ftree_sitter_parse,=20Stree_sitter_parse,=0A+=20=20=20=20=20=20=202,=20= 2,=200,=0A+=20=20=20=20=20=20=20doc:=20/*=20Parse=20STRING=20and=20= return=20a=20parser=20object.=0A+LANGUAGE=20should=20be=20the=20language=20= provided=20by=20a=20tree-sitter=20language=0A+dynamic=20module.=20=20*/)=0A= +=20=20(Lisp_Object=20string,=20Lisp_Object=20language)=0A+{=0A+=20=20= CHECK_STRING=20(string);=0A+=0A+=20=20/*=20LANGUAGE=20is=20a=20USER_PTR=20= that=20contains=20the=20pointer=20to=20a=0A+=20=20=20=20=20TSLanguage=20= struct.=20=20*/=0A+=20=20TSParser=20*parser=20=3D=20ts_parser_new=20();=0A= +=20=20TSLanguage=20*lang=20=3D=20(XUSER_PTR=20(language)->p);=0A+=20=20= ts_parser_set_language=20(parser,=20lang);=0A+=0A+=20=20TSTree=20*tree=20= =3D=20ts_parser_parse_string=20(parser,=20NULL,=0A+=09=09=09=09=09=20= SSDATA=20(string),=0A+=09=09=09=09=09=20strlen=20(SSDATA=20(string)));=0A= +=0A+=20=20/*=20See=20comment=20for=20ts_parser_parse=20in=20= tree_sitter/api.h=0A+=20=20=20=20=20for=20possible=20reasons=20for=20a=20= failure.=20=20*/=0A+=20=20if=20(tree=20=3D=3D=20NULL)=0A+=20=20=20=20= signal_error=20("Failed=20to=20parse=20STRING",=20string);=0A+=0A+=20=20= TSNode=20root_node=20=3D=20ts_tree_root_node=20(tree);=0A+=0A+=20=20= Lisp_Object=20lisp_parser=20=3D=20make_ts_parser=20(NULL,=20parser,=20= tree);=0A+=20=20Lisp_Object=20lisp_node=20=3D=20make_ts_node=20= (lisp_parser,=20root_node);=0A+=0A+=20=20return=20lisp_node;=0A+}=0A+=0A= +DEFUN=20("tree-sitter-node-string",=0A+=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=20doc:=20/*=20Return=20the=20string=20representation=20= of=20NODE.=20=20*/)=0A+=20=20(Lisp_Object=20node)=0A+{=0A+=20=20TSNode=20= ts_node=20=3D=20XTS_NODE=20(node)->node;=0A+=20=20char=20*string=20=3D=20= ts_node_string(ts_node);=0A+=20=20return=20make_string(string,=20strlen=20= (string));=0A+}=0A+=0A+DEFUN=20("tree-sitter-node-parent",=0A+=20=20=20=20= =20=20=20Ftree_sitter_node_parent,=20Stree_sitter_node_parent,=201,=201,=20= 0,=0A+=20=20=20=20=20=20=20doc:=20/*=20Return=20the=20immediate=20parent=20= of=20NODE.=0A+Return=20nil=20if=20couldn't=20find=20any.=20=20*/)=0A+=20=20= (Lisp_Object=20node)=0A+{=0A+=20=20TSNode=20ts_node=20=3D=20XTS_NODE=20= (node)->node;=0A+=20=20TSNode=20parent=20=3D=20ts_node_parent(ts_node);=0A= +=0A+=20=20if=20(ts_node_is_null(parent))=0A+=20=20=20=20return=20Qnil;=0A= +=0A+=20=20return=20make_ts_node(XTS_NODE=20(node)->parser,=20parent);=0A= +}=0A+=0A+DEFUN=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=20doc:=20/*=20Return=20the=20Nth=20child=20of=20NODE.=0A= +Return=20nil=20if=20couldn't=20find=20any.=20=20*/)=0A+=20=20= (Lisp_Object=20node,=20Lisp_Object=20n)=0A+{=0A+=20=20CHECK_INTEGER=20= (n);=0A+=20=20EMACS_INT=20idx=20=3D=20XFIXNUM=20(n);=0A+=20=20TSNode=20= ts_node=20=3D=20XTS_NODE=20(node)->node;=0A+=20=20//=20FIXME:=20Is=20= this=20cast=20ok?=0A+=20=20TSNode=20child=20=3D=20ts_node_child(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+/*=20Initialize=20the=20= tree-sitter=20routines.=20=20*/=0A+void=0A+syms_of_tree_sitter=20(void)=0A= +{=0A+=20=20defsubr=20(&Stree_sitter_parse);=0A+=20=20defsubr=20= (&Stree_sitter_node_string);=0A+=20=20defsubr=20= (&Stree_sitter_node_parent);=0A+=20=20defsubr=20= (&Stree_sitter_node_child);=0A+}=0Adiff=20--git=20a/src/tree_sitter.h=20= b/src/tree_sitter.h=0Anew=20file=20mode=20100644=0Aindex=20= 0000000000..3c9e03475f=0A---=20/dev/null=0A+++=20b/src/tree_sitter.h=0A= @@=20-0,0=20+1,87=20@@=0A+/*=20Header=20file=20for=20the=20tree-sitter=20= integration.=0A+=0A+Copyright=20(C)=202021=20Free=20Software=20= Foundation,=20Inc.=0A+=0A+This=20file=20is=20part=20of=20GNU=20Emacs.=0A= +=0A+GNU=20Emacs=20is=20free=20software:=20you=20can=20redistribute=20it=20= and/or=20modify=0A+it=20under=20the=20terms=20of=20the=20GNU=20General=20= Public=20License=20as=20published=20by=0A+the=20Free=20Software=20= Foundation,=20either=20version=203=20of=20the=20License,=20or=20(at=0A= +your=20option)=20any=20later=20version.=0A+=0A+GNU=20Emacs=20is=20= distributed=20in=20the=20hope=20that=20it=20will=20be=20useful,=0A+but=20= WITHOUT=20ANY=20WARRANTY;=20without=20even=20the=20implied=20warranty=20= of=0A+MERCHANTABILITY=20or=20FITNESS=20FOR=20A=20PARTICULAR=20PURPOSE.=20= =20See=20the=0A+GNU=20General=20Public=20License=20for=20more=20details.=0A= +=0A+You=20should=20have=20received=20a=20copy=20of=20the=20GNU=20= General=20Public=20License=0A+along=20with=20GNU=20Emacs.=20=20If=20not,=20= see=20.=20=20*/=0A+=0A+#ifndef=20= EMACS_TREE_SITTER_H=0A+#define=20EMACS_TREE_SITTER_H=0A+=0A+#include=20= =0A+=0A+#include=20"lisp.h"=0A+=0A+#include=20= =0A+=0A+INLINE_HEADER_BEGIN=0A+=0A+struct=20= Lisp_TS_Parser=0A+{=0A+=20=20union=20vectorlike_header=20header;=0A+=20=20= struct=20buffer=20*buffer;=0A+=20=20TSParser=20*parser;=0A+=20=20TSTree=20= *tree;=0A+=20=20TSInput=20input;=0A+};=0A+=0A+struct=20Lisp_TS_Node=0A+{=0A= +=20=20union=20vectorlike_header=20header;=0A+=20=20/*=20This=20should=20= prevent=20the=20gc=20from=20collecting=20the=20parser=20before=20the=0A+=20= =20=20=20=20node=20is=20done=20with=20it.=20=20TSNode=20contains=20a=20= pointer=20to=20the=20tree=20it=0A+=20=20=20=20=20belongs=20to,=20and=20= the=20parser=20object,=20when=20collected=20by=20gc,=20will=0A+=20=20=20=20= =20free=20that=20tree.=20*/=0A+=20=20Lisp_Object=20parser;=0A+=20=20= TSNode=20node;=0A+};=0A+=0A+INLINE=20bool=0A+TS_PARSERP=20(Lisp_Object=20= x)=0A+{=0A+=20=20return=20PSEUDOVECTORP=20(x,=20PVEC_TS_PARSER);=0A+}=0A= +=0A+INLINE=20struct=20Lisp_TS_Parser=20*=0A+XTS_PARSER=20(Lisp_Object=20= a)=0A+{=0A+=20=20eassert=20(TS_PARSERP=20(a));=0A+=20=20return=20XUNTAG=20= (a,=20Lisp_Vectorlike,=20struct=20Lisp_TS_Parser);=0A+}=0A+=0A+INLINE=20= bool=0A+TS_NODEP=20(Lisp_Object=20x)=0A+{=0A+=20=20return=20= PSEUDOVECTORP=20(x,=20PVEC_TS_NODE);=0A+}=0A+=0A+INLINE=20struct=20= Lisp_TS_Node=20*=0A+XTS_NODE=20(Lisp_Object=20a)=0A+{=0A+=20=20eassert=20= (TS_NODEP=20(a));=0A+=20=20return=20XUNTAG=20(a,=20Lisp_Vectorlike,=20= struct=20Lisp_TS_Node);=0A+}=0A+=0A+Lisp_Object=0A+make_ts_parser=20= (struct=20buffer=20*buffer,=20TSParser=20*parser,=20TSTree=20*tree);=0A+=0A= +Lisp_Object=0A+make_ts_node=20(Lisp_Object=20parser,=20TSNode=20node);=0A= +=0A+extern=20void=20syms_of_tree_sitter=20(void);=0A+=0A= +INLINE_HEADER_END=0A+=0A+#endif=20/*=20EMACS_TREE_SITTER_H=20*/=0A--=20=0A= 2.24.3=20(Apple=20Git-128)=0A=0A= --Apple-Mail=_B3EE442C-923E-44FA-905B-875D4029EC46 Content-Transfer-Encoding: 7bit Content-Type: text/html; charset=us-ascii
--Apple-Mail=_B3EE442C-923E-44FA-905B-875D4029EC46 Content-Disposition: attachment; filename=json-module.zip Content-Type: application/zip; x-unix-mode=0644; name="json-module.zip" Content-Transfer-Encoding: base64 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 BgAAAAAFAAUA8gEAAFUgAAAAAA== --Apple-Mail=_B3EE442C-923E-44FA-905B-875D4029EC46 Content-Transfer-Encoding: 7bit Content-Type: text/html; charset=us-ascii

--Apple-Mail=_B3EE442C-923E-44FA-905B-875D4029EC46-- --Apple-Mail=_9B1BA943-8FC8-4DC2-9DAC-2304DBDE30EF--