unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
blob 7e0fec0ee9319253482d7362c903245903b58d41 3340 bytes (raw)
name: src/tree_sitter.h 	 # note: path name is non-authoritative(*)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
 
/* Header file for the tree-sitter integration.

Copyright (C) 2021 Free Software Foundation, Inc.

This file is part of GNU Emacs.

GNU Emacs is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at
your option) any later version.

GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */

#ifndef EMACS_TREE_SITTER_H
#define EMACS_TREE_SITTER_H

#include "lisp.h"

#include <tree_sitter/api.h>

INLINE_HEADER_BEGIN

/* A wrapper for a tree-sitter parser, but also contains a parse tree
   and other goodies for convenience.  */
struct Lisp_TS_Parser
{
  union vectorlike_header header;
  /* A parser's name is just a convenient tag, see docstring for
     'tree-sitter-make-parser', and 'tree-sitter-get-parser'. */
  Lisp_Object name;
  struct buffer *buffer;
  TSParser *parser;
  TSTree *tree;
  TSInput input;
  /* Re-parsing an unchanged buffer is not free for tree-sitter, so we
     only make it re-parse when need_reparse == true.  That usually
     means some change is made in the buffer.  But others could set
     this field to true to force tree-sitter to re-parse.  */
  bool need_reparse;
  /* This two positions record the byte position of the "visible
     region" that tree-sitter sees.  Unlike markers, These two
     positions do not change as the user inserts and deletes text
     around them. Before re-parse, we move these positions to match
     BUF_BEGV_BYTE and BUF_ZV_BYTE.  */
  ptrdiff_t visible_beg;
  ptrdiff_t visible_end;
};

/* A wrapper around a tree-sitter node.  */
struct Lisp_TS_Node
{
  union vectorlike_header header;
  /* This should prevent the gc from collecting the parser before the
     node is done with it.  TSNode contains a pointer to the tree it
     belongs to, and the parser object, when collected by gc, will
     free that tree. */
  Lisp_Object parser;
  TSNode node;
};

INLINE bool
TS_PARSERP (Lisp_Object x)
{
  return PSEUDOVECTORP (x, PVEC_TS_PARSER);
}

INLINE struct Lisp_TS_Parser *
XTS_PARSER (Lisp_Object a)
{
  eassert (TS_PARSERP (a));
  return XUNTAG (a, Lisp_Vectorlike, struct Lisp_TS_Parser);
}

INLINE bool
TS_NODEP (Lisp_Object x)
{
  return PSEUDOVECTORP (x, PVEC_TS_NODE);
}

INLINE struct Lisp_TS_Node *
XTS_NODE (Lisp_Object a)
{
  eassert (TS_NODEP (a));
  return XUNTAG (a, Lisp_Vectorlike, struct Lisp_TS_Node);
}

INLINE void
CHECK_TS_PARSER (Lisp_Object parser)
{
  CHECK_TYPE (TS_PARSERP (parser), Qtree_sitter_parser_p, parser);
}

INLINE void
CHECK_TS_NODE (Lisp_Object node)
{
  CHECK_TYPE (TS_NODEP (node), Qtree_sitter_node_p, node);
}

void
ts_record_change (ptrdiff_t start_byte, ptrdiff_t old_end_byte,
		  ptrdiff_t new_end_byte);

Lisp_Object
make_ts_parser (struct buffer *buffer, TSParser *parser,
		TSTree *tree, Lisp_Object name);

Lisp_Object
make_ts_node (Lisp_Object parser, TSNode node);

extern void syms_of_tree_sitter (void);

INLINE_HEADER_END

#endif /* EMACS_TREE_SITTER_H */

debug log:

solving 7e0fec0ee9 ...
found 7e0fec0ee9 in https://yhetil.org/emacs-devel/574573B6-8844-45CC-9ACB-D5F75AE465E5@gmail.com/ ||
	https://yhetil.org/emacs-devel/E0D4E307-E5FE-4791-A3D5-8DA80CAF0AB7@gmail.com/
found e9b4a71326 in https://yhetil.org/emacs-devel/CF42CD83-02FF-4945-B3A5-0D71E8299EE2@gmail.com/
found a7e2a2d670 in https://yhetil.org/emacs-devel/F95D0E9B-0B21-450A-B91D-87E9E05873CE@gmail.com/
found 0606f336cc in https://yhetil.org/emacs-devel/258CB68D-1CC1-42C8-BDCD-2A8A8099B783@gmail.com/
found 3c9e03475f in https://yhetil.org/emacs-devel/9F1D903D-0BD2-44F5-B83C-4E9F3D12AC85@gmail.com/

applying [1/5] https://yhetil.org/emacs-devel/9F1D903D-0BD2-44F5-B83C-4E9F3D12AC85@gmail.com/
diff --git a/src/tree_sitter.h b/src/tree_sitter.h
new file mode 100644
index 0000000000..3c9e03475f


applying [2/5] https://yhetil.org/emacs-devel/258CB68D-1CC1-42C8-BDCD-2A8A8099B783@gmail.com/
diff --git a/src/tree_sitter.h b/src/tree_sitter.h
index 3c9e03475f..0606f336cc 100644


applying [3/5] https://yhetil.org/emacs-devel/F95D0E9B-0B21-450A-B91D-87E9E05873CE@gmail.com/
diff --git a/src/tree_sitter.h b/src/tree_sitter.h
index 0606f336cc..a7e2a2d670 100644


applying [4/5] https://yhetil.org/emacs-devel/CF42CD83-02FF-4945-B3A5-0D71E8299EE2@gmail.com/
diff --git a/src/tree_sitter.h b/src/tree_sitter.h
index a7e2a2d670..e9b4a71326 100644


applying [5/5] https://yhetil.org/emacs-devel/574573B6-8844-45CC-9ACB-D5F75AE465E5@gmail.com/
diff --git a/src/tree_sitter.h b/src/tree_sitter.h
index e9b4a71326..7e0fec0ee9 100644

Checking patch src/tree_sitter.h...
Applied patch src/tree_sitter.h cleanly.
Checking patch src/tree_sitter.h...
Applied patch src/tree_sitter.h cleanly.
Checking patch src/tree_sitter.h...
Applied patch src/tree_sitter.h cleanly.
Checking patch src/tree_sitter.h...
Applied patch src/tree_sitter.h cleanly.
Checking patch src/tree_sitter.h...
Applied patch src/tree_sitter.h cleanly.

skipping https://yhetil.org/emacs-devel/E0D4E307-E5FE-4791-A3D5-8DA80CAF0AB7@gmail.com/ for 7e0fec0ee9
index at:
100644 7e0fec0ee9319253482d7362c903245903b58d41	src/tree_sitter.h

(*) Git path names are given by the tree(s) the blob belongs to.
    Blobs themselves have no identifier aside from the hash of its contents.^

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).