emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

feature/tree-sitter f543a1ca0e 2/5: Add treesit-parser-delete


From: Yuan Fu
Subject: feature/tree-sitter f543a1ca0e 2/5: Add treesit-parser-delete
Date: Mon, 29 Aug 2022 14:43:26 -0400 (EDT)

branch: feature/tree-sitter
commit f543a1ca0ef25fa86eee747423aef28bd98e731b
Author: Yuan Fu <yuan@debian-BULLSEYE-live-builder-AMD64>
Commit: Yuan Fu <yuan@debian-BULLSEYE-live-builder-AMD64>

    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'.
---
 src/treesit.c | 30 +++++++++++++++++++++++-------
 src/treesit.h |  3 +++
 2 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/src/treesit.c b/src/treesit.c
index 1917179d09..48de9436d2 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 cb00fee111..0c043f7d25 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.  */



reply via email to

[Prev in Thread] Current Thread [Next in Thread]