From: Yuan Fu Date: Thu, 18 Aug 2022 08:44:39 +0000 (-0700) Subject: Add treesit-parser-delete X-Git-Tag: emacs-29.0.90~1896 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=f543a1ca0ef25fa86eee747423aef28bd98e731b;p=emacs.git Add treesit-parser-delete * src/treesit.c (ts_record_change): Replace CHECK_TS_PARSER with ts_check_parser. (make_ts_parser): Initialize deleted field. (Ftreesit_parser_delete): Replace CHECK_TS_PARSER with ts_check_parser. Set deleted field. (Ftreesit_parser_buffer, Ftreesit_parser_language): Replace CHECK_TS_PARSER with ts_check_parser. (ts_check_parser): New function. (Ftreesit_parser_root_node, Ftreesit_parser_set_included_ranges) (Ftreesit_parser_included_ranges): Replace CHECK_TS_PARSER with ts_check_parser. (Qtreesit_parser_deleted): New symbol. (Qtreesit_parser_deleted): New error. * src/treesit.h (Lisp_TS_Parser): New field 'deleted'. --- diff --git a/src/treesit.c b/src/treesit.c index 1917179d092..48de9436d2b 100644 --- a/src/treesit.c +++ b/src/treesit.c @@ -318,6 +318,14 @@ DEFUN ("treesit-language-available-p", /*** Parsing functions */ +static void +ts_check_parser (Lisp_Object obj) +{ + CHECK_TS_PARSER (obj); + if (XTS_PARSER (obj)->deleted) + xsignal1 (Qtreesit_parser_deleted, obj); +} + /* An auxiliary function that saves a few lines of code. Assumes TREE is not NULL. */ static inline void @@ -349,7 +357,7 @@ ts_record_change (ptrdiff_t start_byte, ptrdiff_t old_end_byte, { CHECK_CONS (parser_list); Lisp_Object lisp_parser = XCAR (parser_list); - CHECK_TS_PARSER (lisp_parser); + ts_check_parser (lisp_parser); TSTree *tree = XTS_PARSER (lisp_parser)->tree; if (tree != NULL) { @@ -595,6 +603,7 @@ make_ts_parser (Lisp_Object buffer, TSParser *parser, lisp_parser->visible_beg = BUF_BEGV (XBUFFER (buffer)); lisp_parser->visible_end = BUF_ZV (XBUFFER (buffer)); lisp_parser->timestamp = 0; + lisp_parser->deleted = false; eassert (lisp_parser->visible_beg <= lisp_parser->visible_end); return make_lisp_ptr (lisp_parser, Lisp_Vectorlike); } @@ -748,11 +757,14 @@ DEFUN ("treesit-parser-delete", doc: /* Delete PARSER from its buffer. */) (Lisp_Object parser) { - CHECK_TS_PARSER (parser); + ts_check_parser (parser); + Lisp_Object buffer = XTS_PARSER (parser)->buffer; struct buffer *buf = XBUFFER (buffer); BVAR (buf, ts_parser_list) = Fdelete (parser, BVAR (buf, ts_parser_list)); + + XTS_PARSER (parser)->deleted = true; return Qnil; } @@ -789,7 +801,7 @@ DEFUN ("treesit-parser-buffer", doc: /* Return the buffer of PARSER. */) (Lisp_Object parser) { - CHECK_TS_PARSER (parser); + ts_check_parser (parser); Lisp_Object buf; XSETBUFFER (buf, XBUFFER (XTS_PARSER (parser)->buffer)); return buf; @@ -802,7 +814,7 @@ DEFUN ("treesit-parser-language", This symbol is the one used to create the parser. */) (Lisp_Object parser) { - CHECK_TS_PARSER (parser); + ts_check_parser (parser); return XTS_PARSER (parser)->language_symbol; } @@ -814,7 +826,7 @@ DEFUN ("treesit-parser-root-node", doc: /* Return the root node of PARSER. */) (Lisp_Object parser) { - CHECK_TS_PARSER (parser); + ts_check_parser (parser); ts_ensure_parsed (parser); TSNode root_node = ts_tree_root_node (XTS_PARSER (parser)->tree); return make_ts_node (parser, root_node); @@ -862,7 +874,7 @@ if the argument is invalid, or something else went wrong. If RANGES is nil, set PARSER to parse the whole buffer. */) (Lisp_Object parser, Lisp_Object ranges) { - CHECK_TS_PARSER (parser); + ts_check_parser (parser); CHECK_CONS (ranges); ts_check_range_argument (ranges); @@ -927,7 +939,7 @@ See `treesit-parser-set-ranges'. If no range is set, return nil. */) (Lisp_Object parser) { - CHECK_TS_PARSER (parser); + ts_check_parser (parser); uint32_t len; const TSRange *ranges = ts_parser_included_ranges (XTS_PARSER (parser)->parser, &len); @@ -1813,6 +1825,7 @@ syms_of_treesit (void) "treesit-node-outdated"); DEFSYM (Quser_emacs_directory, "user-emacs-directory"); + DEFSYM (Qtreesit_parser_deleted, "treesit-parser-deleted"); define_error (Qtreesit_error, "Generic tree-sitter error", Qerror); define_error (Qtreesit_query_error, "Query pattern is malformed", @@ -1831,6 +1844,9 @@ syms_of_treesit (void) define_error (Qtreesit_node_outdated, "This node is outdated, please retrieve a new one", Qtreesit_error); + define_error (Qtreesit_parser_deleted, + "This parser is deleted and cannot be used", + Qtreesit_error); DEFVAR_LISP ("treesit-load-name-override-list", Vtreesit_load_name_override_list, diff --git a/src/treesit.h b/src/treesit.h index cb00fee1113..0c043f7d250 100644 --- a/src/treesit.h +++ b/src/treesit.h @@ -62,6 +62,9 @@ struct Lisp_TS_Parser inherits this timestamp. This way we can make sure the node is not outdated when we access its information. */ ptrdiff_t timestamp; + /* If this field is true, parser functions raises + treesit-parser-deleted signal. */ + bool deleted; }; /* A wrapper around a tree-sitter node. */