[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. */