No intergration/interaction with the new type, just adding it.
* lisp/emacs-lisp/cl-preloaded.el (cl--typeof-types): Add new type.
* src/alloc.c (cleanup_vector): Add gc for the new type.
* src/data.c (Ftype_of): Add switch case for the new type.
(syms_of_data): Add symbols for the new type.
* src/lisp.h (DEFINE_GDB_SYMBOL_BEGIN): Add new type.
* src/treesit.c (Ftreesit_compiled_query_p): New function.
(syms_of_treesit): Add symbol for the new type.
* src/treesit.h (struct Lisp_TS_Query): New struct.
(TS_COMPILED_QUERY_P, XTS_COMPILED_QUERY, CHECK_TS_COMPILED_QUERY):
New macros.
* src/print.c (print_vectorlike): Add printing for the new type.
(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.
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))
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. */
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");
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. */
printcharfun, escapeflag);
printchar ('>', printcharfun);
break;
+ case PVEC_TS_COMPILED_QUERY:
+ print_c_string ("#<treesit-compiled-query>", printcharfun);
+ break;
#endif
case PVEC_SQLITE:
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,
{
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");
defsubr (&Streesit_parser_p);
defsubr (&Streesit_node_p);
+ defsubr (&Streesit_compiled_query_p);
defsubr (&Streesit_node_parser);
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)
{
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)
{
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);