Function: treesit-node-descendant-for-range

treesit-node-descendant-for-range is a function defined in treesit.c.

Signature

(treesit-node-descendant-for-range NODE BEG END &optional NAMED)

Documentation

Return the smallest node that covers buffer positions BEG to END.

The returned node is a descendant of NODE. Return nil if there is no such node. If NAMED is non-nil, look for named child only. NAMED defaults to nil. If NODE is nil, return nil.

Other relevant functions are documented in the treesit group.

View in manual

Shortdoc

;; treesit
(treesit-node-descendant-for-range node 2 3)
    e.g. => #<treesit-node (primitive_type) in 1-4>

Source Code

// Defined in /usr/src/emacs/src/treesit.c
{
  if (NILP (node)) return Qnil;
  treesit_check_node (node);

  struct buffer *buf = XBUFFER (XTS_PARSER (XTS_NODE (node)->parser)->buffer);
  ptrdiff_t visible_beg = XTS_PARSER (XTS_NODE (node)->parser)->visible_beg;

  treesit_check_position (beg, buf);
  treesit_check_position (end, buf);

  treesit_initialize ();

  ptrdiff_t byte_beg = buf_charpos_to_bytepos (buf, XFIXNUM (beg));
  ptrdiff_t byte_end = buf_charpos_to_bytepos (buf, XFIXNUM (end));
  TSNode treesit_node = XTS_NODE (node)->node;
  TSNode child;
  if (NILP (named))
    child = ts_node_descendant_for_byte_range (treesit_node, byte_beg - visible_beg,
					       byte_end - visible_beg);
  else
    child = ts_node_named_descendant_for_byte_range (treesit_node,
						     byte_beg - visible_beg,
						     byte_end - visible_beg);

  if (ts_node_is_null (child))
    return Qnil;

  return make_treesit_node (XTS_NODE (node)->parser, child);
}