emacs-diffs
[Top][All Lists]
Advanced

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

feature/tree-sitter 1d3234988a 2/2: Add node-only parameter to treesit-q


From: Yuan Fu
Subject: feature/tree-sitter 1d3234988a 2/2: Add node-only parameter to treesit-query-capture
Date: Thu, 8 Sep 2022 15:53:21 -0400 (EDT)

branch: feature/tree-sitter
commit 1d3234988a32d32570729b4dfcc00712636ec450
Author: Yuan Fu <casouri@gmail.com>
Commit: Yuan Fu <casouri@gmail.com>

    Add node-only parameter to treesit-query-capture
    
    * doc/lispref/parsing.texi (Pattern Matching): Mention the new
    parameter.
    * lisp/treesit.el (treesit-query-in): Add node-only.
    * src/treesit.c (Ftreesit_query_capture): Add node-only.
---
 doc/lispref/parsing.texi | 15 +++++++++------
 lisp/treesit.el          |  6 +++---
 src/treesit.c            | 25 +++++++++++++++++--------
 3 files changed, 29 insertions(+), 17 deletions(-)

diff --git a/doc/lispref/parsing.texi b/doc/lispref/parsing.texi
index 0a025bd249..ac156d9996 100644
--- a/doc/lispref/parsing.texi
+++ b/doc/lispref/parsing.texi
@@ -874,15 +874,17 @@ name @code{biexp}:
 
 Now we can introduce the query functions.
 
-@defun treesit-query-capture node query &optional beg end
+@defun treesit-query-capture node query &optional beg end node-only
 This function matches patterns in @var{query} in @var{node}.  Argument
 @var{query} can be either a string, a s-expression, or a compiled
 query object.  For now, we focus on the string syntax; s-expression
 syntax and compiled query are described at the end of the section.
 
 The function returns all captured nodes in a list of
-@code{(@var{capture_name} . @var{node})}.  If @var{beg} and @var{end}
-are both non-nil, it only pattern matches nodes in that range.
+@code{(@var{capture_name} . @var{node})}.  If @var{node-only} is
+non-nil, a list of node is returned instead.  If @var{beg} and
+@var{end} are both non-nil, this function only pattern matches nodes
+in that range.
 
 @vindex treesit-query-error
 This function raise a @var{treesit-query-error} if @var{query} is
@@ -890,11 +892,12 @@ malformed.  The signal data contains a description of the 
specific
 error.  You can use @code{treesit-query-validate} to debug the query.
 @end defun
 
-@defun treesit-query-in source query &optional beg end
+@defun treesit-query-in source query &optional beg end node-only
 This function matches patterns in @var{query} in @var{source}, and
 returns all captured nodes in a list of @code{(@var{capture_name}
-. @var{node})}.  If @var{beg} and @var{end} are both non-nil, it only
-pattern match nodes in that range.
+. @var{node})}.  If @var{node-only} is non-nil, a list of node is
+returned instead.  If @var{beg} and @var{end} are both non-nil, it
+only pattern match nodes in that range.
 
 Argument @var{source} designates a node, it can be a language symbol,
 a parser, or simply a node.  If a language symbol, @var{source}
diff --git a/lisp/treesit.el b/lisp/treesit.el
index a374ceda6d..709f826f32 100644
--- a/lisp/treesit.el
+++ b/lisp/treesit.el
@@ -350,7 +350,7 @@ If NAMED is non-nil, count named child only."
 
 ;;; Query API supplement
 
-(defun treesit-query-in (source query &optional beg end)
+(defun treesit-query-in (source query &optional beg end node-only)
   "Query the current buffer with QUERY.
 
 SOURCE can be a language symbol, a parser, or a node.  If a
@@ -366,7 +366,7 @@ one, so it is recommend to compile your queries if it will 
be
 used over and over.
 
 BEG and END, if _both_ non-nil, specifies the range in which the query
-is executed.
+is executed.  If NODE-ONLY non-nil, return a list of nodes.
 
 Raise an treesit-query-error if QUERY is malformed."
   (treesit-query-capture
@@ -375,7 +375,7 @@ Raise an treesit-query-error if QUERY is malformed."
           (treesit-parser-root-node source))
          ((treesit-node-p source) source))
    query
-   beg end))
+   beg end node-only))
 
 (defun treesit-query-string (string query language)
   "Query STRING with QUERY in LANGUAGE.
diff --git a/src/treesit.c b/src/treesit.c
index 48de9436d2..2b3ab643fa 100644
--- a/src/treesit.c
+++ b/src/treesit.c
@@ -1678,7 +1678,7 @@ query.  */)
 
 DEFUN ("treesit-query-capture",
        Ftreesit_query_capture,
-       Streesit_query_capture, 2, 4, 0,
+       Streesit_query_capture, 2, 5, 0,
        doc: /* Query NODE with patterns in QUERY.
 
 Return a list of (CAPTURE_NAME . NODE).  CAPTURE_NAME is the name
@@ -1691,13 +1691,13 @@ query is much faster than a string or sexp one, so it 
is recommend to
 compile your queries if it will be used over and over.
 
 BEG and END, if both non-nil, specifies the range in which the query
-is executed.
+is executed.  If NODE-ONLY is non-nil, return a list of nodes.
 
 Signals treesit-query-error if QUERY is malformed or something else
 goes wrong.  You can use `treesit-query-validate' to debug the
 query.  */)
   (Lisp_Object node, Lisp_Object query,
-   Lisp_Object beg, Lisp_Object end)
+   Lisp_Object beg, Lisp_Object end, Lisp_Object node_only)
 {
   ts_check_node (node);
   if (!NILP (beg))
@@ -1775,11 +1775,20 @@ query.  */)
          TSQueryCapture capture = captures[idx];
          Lisp_Object captured_node =
            make_ts_node(lisp_parser, capture.node);
-         const char *capture_name = ts_query_capture_name_for_id
-           (ts_query, capture.index, &capture_name_len);
-         Lisp_Object cap =
-           Fcons (intern_c_string_1 (capture_name, capture_name_len),
-                  captured_node);
+
+         Lisp_Object cap;
+         if (NILP (node_only))
+           {
+             const char *capture_name = ts_query_capture_name_for_id
+               (ts_query, capture.index, &capture_name_len);
+             cap =
+               Fcons (intern_c_string_1 (capture_name, capture_name_len),
+                      captured_node);
+           }
+         else
+           {
+             cap = captured_node;
+           }
          result = Fcons (cap, result);
        }
       /* Get predicates.  */



reply via email to

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