aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorYuan Fu2023-09-04 15:33:19 -0700
committerYuan Fu2023-09-05 21:03:37 -0700
commit722daf6fffe42f82323ed45a380fcccd322da69f (patch)
treea2a7fa6ed81ad48e2f801e87b4c4af9a86e68042 /src
parentaa872f2540377ae5c5e054a55cdd789934a56a47 (diff)
downloademacs-722daf6fffe42f82323ed45a380fcccd322da69f.tar.gz
emacs-722daf6fffe42f82323ed45a380fcccd322da69f.zip
Add tag to tree-sitter parsers
* doc/lispref/parsing.texi (Using Parser): Update manual. * lisp/treesit.el (treesit-buffer-root-node) * src/treesit.c (make_treesit_parser) * src/treesit.c (Ftreesit_parser_create): Add TAG parameter. (treesit_resolve_node): Create a parser with nil tag. * src/treesit.h (Lisp_TS_Parser): Add TAG field.
Diffstat (limited to 'src')
-rw-r--r--src/treesit.c26
-rw-r--r--src/treesit.h8
2 files changed, 23 insertions, 11 deletions
diff --git a/src/treesit.c b/src/treesit.c
index 9f0e0e94186..13be9594963 100644
--- a/src/treesit.c
+++ b/src/treesit.c
@@ -1153,7 +1153,8 @@ treesit_read_buffer (void *parser, uint32_t byte_index,
1153 machine. */ 1153 machine. */
1154Lisp_Object 1154Lisp_Object
1155make_treesit_parser (Lisp_Object buffer, TSParser *parser, 1155make_treesit_parser (Lisp_Object buffer, TSParser *parser,
1156 TSTree *tree, Lisp_Object language_symbol) 1156 TSTree *tree, Lisp_Object language_symbol,
1157 Lisp_Object tag)
1157{ 1158{
1158 struct Lisp_TS_Parser *lisp_parser; 1159 struct Lisp_TS_Parser *lisp_parser;
1159 1160
@@ -1162,6 +1163,7 @@ make_treesit_parser (Lisp_Object buffer, TSParser *parser,
1162 1163
1163 lisp_parser->language_symbol = language_symbol; 1164 lisp_parser->language_symbol = language_symbol;
1164 lisp_parser->after_change_functions = Qnil; 1165 lisp_parser->after_change_functions = Qnil;
1166 lisp_parser->tag = tag;
1165 lisp_parser->buffer = buffer; 1167 lisp_parser->buffer = buffer;
1166 lisp_parser->parser = parser; 1168 lisp_parser->parser = parser;
1167 lisp_parser->tree = tree; 1169 lisp_parser->tree = tree;
@@ -1379,24 +1381,29 @@ DEFUN ("treesit-node-parser",
1379 1381
1380DEFUN ("treesit-parser-create", 1382DEFUN ("treesit-parser-create",
1381 Ftreesit_parser_create, Streesit_parser_create, 1383 Ftreesit_parser_create, Streesit_parser_create,
1382 1, 3, 0, 1384 1, 4, 0,
1383 doc: /* Create and return a parser in BUFFER for LANGUAGE. 1385 doc: /* Create and return a parser in BUFFER for LANGUAGE with TAG.
1384 1386
1385The parser is automatically added to BUFFER's parser list, as returned 1387The parser is automatically added to BUFFER's parser list, as returned
1386by `treesit-parser-list'. LANGUAGE is a language symbol. If BUFFER 1388by `treesit-parser-list'. LANGUAGE is a language symbol. If BUFFER
1387is nil or omitted, it defaults to the current buffer. If BUFFER 1389is nil or omitted, it defaults to the current buffer. If BUFFER
1388already has a parser for LANGUAGE, return that parser, but if NO-REUSE 1390already has a parser for LANGUAGE with TAG, return that parser, but if
1389is non-nil, always create a new parser. 1391NO-REUSE is non-nil, always create a new parser.
1392
1393TAG should be a symbol and defaults to nil. Different parsers can
1394have the same tag.
1390 1395
1391If that buffer is an indirect buffer, its base buffer is used instead. 1396If that buffer is an indirect buffer, its base buffer is used instead.
1392That is, indirect buffers use their base buffer's parsers. Lisp 1397That is, indirect buffers use their base buffer's parsers. Lisp
1393programs should widen as necessary should they want to use a parser in 1398programs should widen as necessary should they want to use a parser in
1394an indirect buffer. */) 1399an indirect buffer. */)
1395 (Lisp_Object language, Lisp_Object buffer, Lisp_Object no_reuse) 1400 (Lisp_Object language, Lisp_Object buffer, Lisp_Object no_reuse,
1401 Lisp_Object tag)
1396{ 1402{
1397 treesit_initialize (); 1403 treesit_initialize ();
1398 1404
1399 CHECK_SYMBOL (language); 1405 CHECK_SYMBOL (language);
1406 CHECK_SYMBOL (tag);
1400 struct buffer *buf; 1407 struct buffer *buf;
1401 if (NILP (buffer)) 1408 if (NILP (buffer))
1402 buf = current_buffer; 1409 buf = current_buffer;
@@ -1417,7 +1424,8 @@ an indirect buffer. */)
1417 FOR_EACH_TAIL (tail) 1424 FOR_EACH_TAIL (tail)
1418 { 1425 {
1419 struct Lisp_TS_Parser *parser = XTS_PARSER (XCAR (tail)); 1426 struct Lisp_TS_Parser *parser = XTS_PARSER (XCAR (tail));
1420 if (EQ (parser->language_symbol, language)) 1427 if (EQ (parser->tag, tag)
1428 && EQ (parser->language_symbol, language))
1421 return XCAR (tail); 1429 return XCAR (tail);
1422 } 1430 }
1423 } 1431 }
@@ -1437,7 +1445,7 @@ an indirect buffer. */)
1437 /* Create parser. */ 1445 /* Create parser. */
1438 Lisp_Object lisp_parser = make_treesit_parser (Fcurrent_buffer (), 1446 Lisp_Object lisp_parser = make_treesit_parser (Fcurrent_buffer (),
1439 parser, NULL, 1447 parser, NULL,
1440 language); 1448 language, tag);
1441 1449
1442 /* Update parser-list. */ 1450 /* Update parser-list. */
1443 BVAR (buf, ts_parser_list) = Fcons (lisp_parser, BVAR (buf, ts_parser_list)); 1451 BVAR (buf, ts_parser_list) = Fcons (lisp_parser, BVAR (buf, ts_parser_list));
@@ -2775,7 +2783,7 @@ static Lisp_Object treesit_resolve_node (Lisp_Object obj)
2775 else if (SYMBOLP (obj)) 2783 else if (SYMBOLP (obj))
2776 { 2784 {
2777 Lisp_Object parser 2785 Lisp_Object parser
2778 = Ftreesit_parser_create (obj, Fcurrent_buffer (), Qnil); 2786 = Ftreesit_parser_create (obj, Fcurrent_buffer (), Qnil, Qnil);
2779 return Ftreesit_parser_root_node (parser); 2787 return Ftreesit_parser_root_node (parser);
2780 } 2788 }
2781 else 2789 else
diff --git a/src/treesit.h b/src/treesit.h
index 5382bc58817..ed5bab18733 100644
--- a/src/treesit.h
+++ b/src/treesit.h
@@ -34,13 +34,17 @@ INLINE_HEADER_BEGIN
34struct Lisp_TS_Parser 34struct Lisp_TS_Parser
35{ 35{
36 union vectorlike_header header; 36 union vectorlike_header header;
37 /* A symbol representing the language this parser uses. See the 37 /* A symbol representing the language this parser uses. See the
38 manual for more explanation. */ 38 manual for more explanation. */
39 Lisp_Object language_symbol; 39 Lisp_Object language_symbol;
40 /* A list of functions to call after re-parse. Every function is 40 /* A list of functions to call after re-parse. Every function is
41 called with the changed ranges and the parser. The changed 41 called with the changed ranges and the parser. The changed
42 ranges is a list of (BEG . END). */ 42 ranges is a list of (BEG . END). */
43 Lisp_Object after_change_functions; 43 Lisp_Object after_change_functions;
44 /* A tag (symbol) for the parser. Different parsers can have the
45 same tag. A tag is primarily used to differentiate between
46 parsers for the same language. */
47 Lisp_Object tag;
44 /* The buffer associated with this parser. */ 48 /* The buffer associated with this parser. */
45 Lisp_Object buffer; 49 Lisp_Object buffer;
46 /* The pointer to the tree-sitter parser. Never NULL. */ 50 /* The pointer to the tree-sitter parser. Never NULL. */
@@ -183,7 +187,7 @@ INLINE_HEADER_END
183 187
184extern void treesit_record_change (ptrdiff_t, ptrdiff_t, ptrdiff_t); 188extern void treesit_record_change (ptrdiff_t, ptrdiff_t, ptrdiff_t);
185extern Lisp_Object make_treesit_parser (Lisp_Object, TSParser *, TSTree *, 189extern Lisp_Object make_treesit_parser (Lisp_Object, TSParser *, TSTree *,
186 Lisp_Object); 190 Lisp_Object, Lisp_Object);
187extern Lisp_Object make_treesit_node (Lisp_Object, TSNode); 191extern Lisp_Object make_treesit_node (Lisp_Object, TSNode);
188 192
189extern bool treesit_node_uptodate_p (Lisp_Object); 193extern bool treesit_node_uptodate_p (Lisp_Object);