Consolidate treesit parser create functions

Merge treesit-parser-create, treesit-get-parser,
treesit-get-parser-create into one: treesit-parser-create.

* src/treesit.c (Ftreesit_parser_language): make BUFFER parameter
optional, add new parameter NO-REUSE.  Optionally reuse parser.
* test/src/treesit-tests.el: Change all parser creation to use
treesit-parser-create.  Remove tests for the removed functions.
* lisp/treesit.el (treesit-get-parser, treesit-get-parser-create):
Remove.
* lisp/treesit.el (treesit-set-ranges, treesit-get-ranges)
(treesit-buffer-root-node, treesit-query-string)
(treesit-font-lock-fontify-region, treesit-search-forward)
(treesit-query-validate): Change to use treesit-parser-create.
This commit is contained in:
Yuan Fu 2022-06-16 01:11:09 -07:00
parent 7cee82a91d
commit dd65d1c396
3 changed files with 46 additions and 62 deletions

View file

@ -65,27 +65,13 @@ available on the system at all."
;;; Parser API supplement
(defun treesit-get-parser (language)
"Find the first parser using LANGUAGE in `treesit-parser-list'."
(catch 'found
(dolist (parser treesit-parser-list)
(when (eq language (treesit-parser-language parser))
(throw 'found parser)))))
(defun treesit-get-parser-create (language)
"Find the first parser using LANGUAGE in `treesit-parser-list'.
If none exists, create one and return it."
(or (treesit-get-parser language)
(treesit-parser-create
(current-buffer) language)))
(defun treesit-parse-string (string language)
"Parse STRING using a parser for LANGUAGE.
Return the root node of the syntax tree."
(with-temp-buffer
(insert string)
(treesit-parser-root-node
(treesit-parser-create (current-buffer) language))))
(treesit-parser-create language))))
(defun treesit-language-at (point)
"Return the language used at POINT."
@ -97,7 +83,7 @@ Return the root node of the syntax tree."
"Set the ranges of PARSER-OR-LANG to RANGES."
(treesit-parser-set-included-ranges
(cond ((symbolp parser-or-lang)
(or (treesit-get-parser parser-or-lang)
(or (treesit-parser-create parser-or-lang)
(error "Cannot find a parser for %s" parser-or-lang)))
((treesit-parser-p parser-or-lang)
parser-or-lang)
@ -109,7 +95,7 @@ Return the root node of the syntax tree."
"Get the ranges of PARSER-OR-LANG."
(treesit-parser-included-ranges
(cond ((symbolp parser-or-lang)
(or (treesit-get-parser parser-or-lang)
(or (treesit-parser-create parser-or-lang)
(error "Cannot find a parser for %s" parser-or-lang)))
((treesit-parser-p parser-or-lang)
parser-or-lang)
@ -178,7 +164,7 @@ Use the first parser in `treesit-parser-list', if LANGUAGE is
non-nil, use the first parser for LANGUAGE."
(if-let ((parser
(or (if language
(or (treesit-get-parser language)
(or (treesit-parser-create language)
(error "Cannot find a parser for %s" language))
(or (car treesit-parser-list)
(error "Buffer has no parser"))))))
@ -410,7 +396,7 @@ Raise an treesit-query-error if QUERY is malformed."
See `treesit-query-capture' for QUERY."
(with-temp-buffer
(insert string)
(let ((parser (treesit-parser-create (current-buffer) language)))
(let ((parser (treesit-parser-create language)))
(treesit-query-capture
(treesit-parser-root-node parser)
query))))
@ -520,7 +506,7 @@ If LOUDLY is non-nil, message some debugging information."
(dolist (setting treesit-font-lock-settings)
(when-let* ((language (nth 0 setting))
(match-pattern (nth 1 setting))
(parser (treesit-get-parser-create language)))
(parser (treesit-parser-create language)))
(when-let ((node (treesit-node-on start end parser)))
(let ((captures (treesit-query-capture
node match-pattern
@ -888,7 +874,7 @@ parent in the tree, never go down into children when traversing
the tree."
(cl-loop for idx from 1 to (abs arg)
for parser = (if lang
(treesit-get-parser-create lang)
(treesit-parser-create lang)
(car treesit-parser-list))
for node =
(if-let ((starting-point (point))
@ -1088,7 +1074,7 @@ to the offending pattern and highlight the pattern."
(cl-assert (or (consp query) (stringp query)))
(let ((buf (get-buffer-create "*tree-sitter check query*")))
(with-temp-buffer
(treesit-get-parser-create language)
(treesit-parser-create language)
(condition-case err
(progn (treesit-query-in language query)
(message "QUERY is valid"))

View file

@ -692,24 +692,39 @@ DEFUN ("treesit-node-parser",
DEFUN ("treesit-parser-create",
Ftreesit_parser_create, Streesit_parser_create,
2, 2, 0,
1, 3, 0,
doc: /* Create and return a parser in BUFFER for LANGUAGE.
The parser is automatically added to BUFFER's
`treesit-parser-list'. LANGUAGE should be the symbol of a
function provided by a tree-sitter language dynamic module, e.g.,
'treesit-json. If BUFFER is nil, use the current buffer. */)
(Lisp_Object buffer, Lisp_Object language)
The parser is automatically added to BUFFER's `treesit-parser-list'.
LANGUAGE is a language symbol. If BUFFER is nil, use the current
buffer. If BUFFER already has a parser for LANGUAGE, return that
parser. If NO-REUSE is non-nil, always create a new parser. */)
(Lisp_Object language, Lisp_Object buffer, Lisp_Object no_reuse)
{
if (NILP (buffer))
buffer = Fcurrent_buffer ();
CHECK_BUFFER (buffer);
CHECK_SYMBOL (language);
ts_check_buffer_size (XBUFFER (buffer));
ts_initialize ();
CHECK_SYMBOL (language);
struct buffer *old_buffer = current_buffer;
if (!NILP (buffer))
{
CHECK_BUFFER (buffer);
set_buffer_internal (XBUFFER (buffer));
}
ts_check_buffer_size (current_buffer);
/* See if we can reuse a parser. */
for (Lisp_Object tail = Fsymbol_value (Qtreesit_parser_list);
NILP (no_reuse) && !NILP (tail);
tail = XCDR (tail))
{
struct Lisp_TS_Parser *parser = XTS_PARSER (XCAR (tail));
if (EQ (parser->language_symbol, language))
{
set_buffer_internal (old_buffer);
return XCAR (tail);
}
}
TSParser *parser = ts_parser_new ();
TSLanguage *lang = ts_load_language (language, true);
/* We check language version when loading a language, so this should

View file

@ -25,8 +25,7 @@
(ert-deftest treesit-basic-parsing ()
"Test basic parsing routines."
(with-temp-buffer
(let ((parser (treesit-parser-create
(current-buffer) 'json)))
(let ((parser (treesit-parser-create 'json)))
(should
(eq parser (car treesit-parser-list)))
(should
@ -55,8 +54,7 @@
(let (parser root-node doc-node object-node pair-node)
(progn
(insert "[1,2,{\"name\": \"Bob\"},3]")
(setq parser (treesit-parser-create
(current-buffer) 'json))
(setq parser (treesit-parser-create 'json))
(setq root-node (treesit-parser-root-node
parser)))
;; `treesit-node-type'.
@ -129,8 +127,7 @@
(let (parser root-node pattern doc-node object-node pair-node)
(progn
(insert "[1,2,{\"name\": \"Bob\"},3]")
(setq parser (treesit-parser-create
(current-buffer) 'json))
(setq parser (treesit-parser-create 'json))
(setq root-node (treesit-parser-root-node
parser)))
@ -181,8 +178,7 @@
(progn
(insert "xxx[1,{\"name\": \"Bob\"},2,3]xxx")
(narrow-to-region (+ (point-min) 3) (- (point-max) 3))
(setq parser (treesit-parser-create
(current-buffer) 'json))
(setq parser (treesit-parser-create 'json))
(setq root-node (treesit-parser-root-node
parser)))
;; This test is from the basic test.
@ -233,8 +229,7 @@
(let (parser root-node pattern doc-node object-node pair-node)
(progn
(insert "[[1],oooxxx[1,2,3],xxx[1,2]]")
(setq parser (treesit-parser-create
(current-buffer) 'json))
(setq parser (treesit-parser-create 'json))
(setq root-node (treesit-parser-root-node
parser)))
(should-error
@ -258,9 +253,9 @@
(let (html css js html-range css-range js-range)
(progn
(insert "<html><script>1</script><style>body {}</style></html>")
(setq html (treesit-get-parser-create 'html))
(setq css (treesit-get-parser-create 'css))
(setq js (treesit-get-parser-create 'javascript)))
(setq html (treesit-parser-create 'html))
(setq css (treesit-parser-create 'css))
(setq js (treesit-parser-create 'javascript)))
;; JavaScript.
(setq js-range
(treesit-query-range
@ -287,13 +282,6 @@
(ert-deftest treesit-parser-supplemental ()
"Supplemental node functions."
;; `treesit-get-parser'.
(with-temp-buffer
(should (equal (treesit-get-parser 'json) nil)))
;; `treesit-get-parser-create'.
(with-temp-buffer
(should (not (equal (treesit-get-parser-create 'json)
nil))))
;; `treesit-parse-string'.
(should (equal (treesit-node-string
(treesit-parse-string
@ -304,14 +292,10 @@
(let (parser root-node doc-node object-node pair-node)
(progn
(insert "[1,2,{\"name\": \"Bob\"},3]")
(setq parser (treesit-parser-create
(current-buffer) 'json))
(setq parser (treesit-parser-create 'json))
(setq root-node (treesit-parser-root-node
parser))
(setq doc-node (treesit-node-child root-node 0)))
;; `treesit-get-parser'.
(should (not (equal (treesit-get-parser 'json)
nil)))
;; `treesit-language-at'.
(should (equal (treesit-language-at (point))
'json))
@ -326,8 +310,7 @@
(let (parser root-node doc-node array-node)
(progn
(insert "[1,2,{\"name\": \"Bob\"},3]")
(setq parser (treesit-parser-create
(current-buffer) 'json))
(setq parser (treesit-parser-create 'json))
(setq root-node (treesit-parser-root-node
parser))
(setq doc-node (treesit-node-child root-node 0)))