diff options
-rw-r--r-- | lisp/emacs-lisp/cl-preloaded.el | 1 | ||||
-rw-r--r-- | src/alloc.c | 7 | ||||
-rw-r--r-- | src/data.c | 3 | ||||
-rw-r--r-- | src/lisp.h | 1 | ||||
-rw-r--r-- | src/print.c | 3 | ||||
-rw-r--r-- | src/treesit.c | 13 | ||||
-rw-r--r-- | src/treesit.h | 31 |
7 files changed, 59 insertions, 0 deletions
diff --git a/lisp/emacs-lisp/cl-preloaded.el b/lisp/emacs-lisp/cl-preloaded.el index 46f5ab35ff7..812d0af86b1 100644 --- a/lisp/emacs-lisp/cl-preloaded.el +++ b/lisp/emacs-lisp/cl-preloaded.el @@ -80,6 +80,7 @@ (user-ptr atom) (tree-sitter-parser atom) (tree-sitter-node atom) + (tree-sitter-compiled-query atom) ;; Plus, really hand made: (null symbol list sequence atom)) "Alist of supertypes. diff --git a/src/alloc.c b/src/alloc.c index 40a3e235eab..3c622d05ff1 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -3174,6 +3174,13 @@ cleanup_vector (struct Lisp_Vector *vector) ts_tree_delete(lisp_parser->tree); ts_parser_delete(lisp_parser->parser); } + else if (PSEUDOVECTOR_TYPEP (&vector->header, PVEC_TS_COMPILED_QUERY)) + { + struct Lisp_TS_Query *lisp_query + = PSEUDOVEC_STRUCT (vector, Lisp_TS_Query); + ts_query_delete (lisp_query->query); + ts_query_cursor_delete (lisp_query->cursor); + } #endif #ifdef HAVE_MODULES else if (PSEUDOVECTOR_TYPEP (&vector->header, PVEC_MODULE_FUNCTION)) diff --git a/src/data.c b/src/data.c index a28bf414147..8dbb2902a72 100644 --- a/src/data.c +++ b/src/data.c @@ -265,6 +265,8 @@ for example, (type-of 1) returns `integer'. */) return Qtreesit_parser; case PVEC_TS_NODE: return Qtreesit_node; + case PVEC_TS_COMPILED_QUERY: + return Qtreesit_compiled_query; case PVEC_SQLITE: return Qsqlite; /* "Impossible" cases. */ @@ -4264,6 +4266,7 @@ syms_of_data (void) DEFSYM (Qxwidget_view, "xwidget-view"); DEFSYM (Qtreesit_parser, "treesit-parser"); DEFSYM (Qtreesit_node, "treesit-node"); + DEFSYM (Qtreesit_compiled_query, "treesit-compiled-query"); DEFSYM (Qdefun, "defun"); diff --git a/src/lisp.h b/src/lisp.h index eb1f1ec2c21..8832e76b447 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -1060,6 +1060,7 @@ enum pvec_type PVEC_NATIVE_COMP_UNIT, PVEC_TS_PARSER, PVEC_TS_NODE, + PVEC_TS_COMPILED_QUERY, PVEC_SQLITE, /* These should be last, for internal_equal and sxhash_obj. */ diff --git a/src/print.c b/src/print.c index d8b8513f311..81b524d79fe 100644 --- a/src/print.c +++ b/src/print.c @@ -1982,6 +1982,9 @@ print_vectorlike (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag, printcharfun, escapeflag); printchar ('>', printcharfun); break; + case PVEC_TS_COMPILED_QUERY: + print_c_string ("#<treesit-compiled-query>", printcharfun); + break; #endif case PVEC_SQLITE: diff --git a/src/treesit.c b/src/treesit.c index 91114b06f10..19f83437650 100644 --- a/src/treesit.c +++ b/src/treesit.c @@ -558,6 +558,17 @@ DEFUN ("treesit-node-p", return Qnil; } +DEFUN ("treesit-compiled-query-p", + Ftreesit_compiled_query_p, Streesit_compiled_query_p, 1, 1, 0, + doc: /* Return t if OBJECT is a compiled tree-sitter query. */) + (Lisp_Object object) +{ + if (TS_COMPILED_QUERY_P (object)) + return Qt; + else + return Qnil; +} + DEFUN ("treesit-node-parser", Ftreesit_node_parser, Streesit_node_parser, 1, 1, 0, @@ -1568,6 +1579,7 @@ syms_of_treesit (void) { DEFSYM (Qtreesit_parser_p, "treesit-parser-p"); DEFSYM (Qtreesit_node_p, "treesit-node-p"); + DEFSYM (Qtreesit_compiled_query_p, "treesit-compiled-query-p"); DEFSYM (Qnamed, "named"); DEFSYM (Qmissing, "missing"); DEFSYM (Qextra, "extra"); @@ -1648,6 +1660,7 @@ dynamic libraries, in that order. */); defsubr (&Streesit_parser_p); defsubr (&Streesit_node_p); + defsubr (&Streesit_compiled_query_p); defsubr (&Streesit_node_parser); diff --git a/src/treesit.h b/src/treesit.h index 639c4eedc55..cb00fee1113 100644 --- a/src/treesit.h +++ b/src/treesit.h @@ -81,6 +81,17 @@ struct Lisp_TS_Node ptrdiff_t timestamp; }; +/* A compiled tree-sitter query. */ +struct Lisp_TS_Query +{ + union vectorlike_header header; + /* Pointer to the query object. */ + TSQuery *query; + /* Pointer to a cursor. If we are storing the query object, we + might as well store a cursor, too. */ + TSQueryCursor *cursor; +}; + INLINE bool TS_PARSERP (Lisp_Object x) { @@ -107,6 +118,19 @@ XTS_NODE (Lisp_Object a) return XUNTAG (a, Lisp_Vectorlike, struct Lisp_TS_Node); } +INLINE bool +TS_COMPILED_QUERY_P (Lisp_Object x) +{ + return PSEUDOVECTORP (x, PVEC_TS_COMPILED_QUERY); +} + +INLINE struct Lisp_TS_Query * +XTS_COMPILED_QUERY (Lisp_Object a) +{ + eassert (TS_COMPILED_QUERY_P (a)); + return XUNTAG (a, Lisp_Vectorlike, struct Lisp_TS_Query); +} + INLINE void CHECK_TS_PARSER (Lisp_Object parser) { @@ -119,6 +143,13 @@ CHECK_TS_NODE (Lisp_Object node) CHECK_TYPE (TS_NODEP (node), Qtreesit_node_p, node); } +INLINE void +CHECK_TS_COMPILED_QUERY (Lisp_Object query) +{ + CHECK_TYPE (TS_COMPILED_QUERY_P (query), + Qtreesit_compiled_query_p, query); +} + void ts_record_change (ptrdiff_t start_byte, ptrdiff_t old_end_byte, ptrdiff_t new_end_byte); |