Function: treesit-node-match-p

treesit-node-match-p is a function defined in treesit.c.

Signature

(treesit-node-match-p NODE PREDICATE &optional IGNORE-MISSING)

Documentation

Check whether NODE matches PREDICATE.

PREDICATE can be a symbol representing a thing in treesit-thing-settings, or a predicate, like regexp matching node type, etc. See treesit-thing-settings for more details.

Return non-nil if NODE matches PREDICATE, nil otherwise. If NODE is nil, return nil.

Signals treesit-invalid-predicate if there's no definition of THING in treesit-thing-settings, or if PREDICATE is malformed. If IGNORE-MISSING is non-nil, don't signal an error for missing THING definition, but still signal for malformed PREDICATE.

View in manual

Source Code

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

  CHECK_TS_NODE (node);

  Lisp_Object parser = XTS_NODE (node)->parser;
  Lisp_Object language = XTS_PARSER (parser)->language_symbol;

  Lisp_Object signal_data = Qnil;
  if (!treesit_traverse_validate_predicate (predicate, language,
					    &signal_data, 0))
    {
      Lisp_Object err_symbol = XCAR (signal_data);
      Lisp_Object data = XCDR (signal_data);

      if (!NILP (ignore_missing)
	  && EQ (err_symbol, Qtreesit_predicate_not_found))
	return Qnil;

      xsignal1 (err_symbol, data);
    }

  TSTreeCursor cursor = ts_tree_cursor_new (XTS_NODE (node)->node);

  specpdl_ref count = SPECPDL_INDEX ();
  record_unwind_protect_ptr (treesit_traverse_cleanup_cursor, &cursor);

  bool match = false;
  match = treesit_traverse_match_predicate (&cursor, predicate,
					    parser, false);

  unbind_to (count, Qnil);

  return match ? Qt : Qnil;
}