]> git.eshelyaron.com Git - emacs.git/commitdiff
Allow checking for outdated nodes in tree-sitter
authorYuan Fu <casouri@gmail.com>
Wed, 16 Nov 2022 05:54:30 +0000 (21:54 -0800)
committerYuan Fu <casouri@gmail.com>
Wed, 16 Nov 2022 22:40:41 +0000 (14:40 -0800)
Now you can run (treesit-node-check node 'outdated).

* doc/lispref/parsing.texi (Accessing Node Information): Update
manual.
* src/treesit.c (Ftreesit_node_check): Add new property 'outdated'.
* test/src/treesit-tests.el (treesit-node-check): Add tests.

doc/lispref/parsing.texi
src/treesit.c
test/src/treesit-tests.el

index 2ea229ec90776048922511ad2177750a0957c27b..d73057321e1efd14de639c0713457e9bfd1aaede 100644 (file)
@@ -930,6 +930,11 @@ is not yet in its final form.
 A node can be ``extra'': such nodes represent things like comments,
 which can appear anywhere in the text.
 
+@cindex tree-sitter outdated node
+@cindex outdated node, tree-sitter
+A node can be ``outdated'': If its parser has reparse at least once
+after the node was created, the node is outdated.
+
 @cindex tree-sitter node that has error
 @cindex has error, tree-sitter node
 A node ``has error'' if the text it spans contains a syntax error.  It
@@ -938,14 +943,16 @@ has an error.
 
 @defun treesit-node-check node property
 This function checks if @var{node} has the specified @var{property}.
-@var{property} can be @code{named}, @code{missing}, @code{extra}, or
-@code{has-error}.
+@var{property} can be @code{named}, @code{missing}, @code{extra},
+@code{outdated}, or @code{has-error}.
 @end defun
 
 @defun treesit-node-type node
 Named nodes have ``types'' (@pxref{tree-sitter node type, node type}).
 For example, a named node can be a @code{string_literal} node, where
-@code{string_literal} is its type.
+@code{string_literal} is its type.  The type of an anonymous node is
+just the text that node represents, e.g., the type of a @samp{,} node
+is just @samp{,}.
 
 This function returns @var{node}'s type as a string.
 @end defun
index 0b9f0e98d92293c5105ced55ae9eb9ea60fd6d21..1e1238eefd378327efbf8b8e04970cb5c7a17548 100644 (file)
@@ -1723,7 +1723,7 @@ DEFUN ("treesit-node-check",
        Ftreesit_node_check, Streesit_node_check, 2, 2, 0,
        doc: /* Return non-nil if NODE has PROPERTY, nil otherwise.
 
-PROPERTY could be `named', `missing', `extra', or `has-error'.
+PROPERTY could be `named', `missing', `extra', `outdated', or `has-error'.
 
 Named nodes correspond to named rules in the language definition,
 whereas "anonymous" nodes correspond to string literals in the
@@ -1735,17 +1735,25 @@ certain kinds of syntax errors, i.e., should be there but not there.
 Extra nodes represent things like comments, which are not required the
 language definition, but can appear anywhere.
 
+A node is "outdated" if the parser has reparsed at least once after
+the node was created.
+
 A node "has error" if itself is a syntax error or contains any syntax
 errors.  */)
   (Lisp_Object node, Lisp_Object property)
 {
   if (NILP (node)) return Qnil;
-  treesit_check_node (node);
+  CHECK_TS_NODE (node);
   CHECK_SYMBOL (property);
   treesit_initialize ();
 
   TSNode treesit_node = XTS_NODE (node)->node;
   bool result;
+
+  if (EQ (property, Qoutdated))
+    return treesit_node_uptodate_p (node) ? Qnil : Qt;
+
+  treesit_check_node (node);
   if (EQ (property, Qnamed))
     result = ts_node_is_named (treesit_node);
   else if (EQ (property, Qmissing))
@@ -1756,7 +1764,7 @@ errors.  */)
     result = ts_node_has_error (treesit_node);
   else
     signal_error ("Expecting `named', `missing', `extra', "
-                 "or `has-error', but got",
+                 "`outdated', or `has-error', but got",
                  property);
   return result ? Qt : Qnil;
 }
@@ -2918,6 +2926,7 @@ syms_of_treesit (void)
   DEFSYM (Qnamed, "named");
   DEFSYM (Qmissing, "missing");
   DEFSYM (Qextra, "extra");
+  DEFSYM (Qoutdated, "outdated");
   DEFSYM (Qhas_error, "has-error");
 
   DEFSYM (Qnot_found, "not-found");
index 9b8e3466f22a3c569e7d1a412b00f57ee33b7b28..2a3f43916a4b2a54308f8b72b65301db9d25b277 100644 (file)
@@ -516,8 +516,11 @@ visible_end.)"
     (should (treesit-node-check comment-node 'extra))
     (should (treesit-node-check array-node 'has-error))
     (should-error (treesit-node-check array-node 'xxx))
-    ;; TODO: Test for `missing'.
-    ))
+    (should (treesit-node-check (treesit-node-child array-node -1)
+                                'missing))
+    (goto-char (point-max))
+    (insert "]")
+    (should (treesit-node-check array-node 'outdated))))
 
 (ert-deftest treesit-misc ()
   "Misc helper functions."