Make Emacs compile without tree-sitter library

* lisp/treesit.el: Add function declaration forms.
* src/emacs.c: Always include syms_of_treesit.
This commit is contained in:
Yuan Fu 2022-10-28 16:38:37 -07:00
parent 0480e9c445
commit 434fc2a22e
No known key found for this signature in database
GPG key ID: 56E19BC57664A442
2 changed files with 116 additions and 62 deletions

View file

@ -33,6 +33,57 @@
(require 'cl-seq)
(require 'font-lock)
;;; Function declarations
(declare-function treesit-language-available-p "treesit.c")
(declare-function treesit-language-version "treesit.c")
(declare-function treesit-parser-p "treesit.c")
(declare-function treesit-node-p "treesit.c")
(declare-function treesit-compiled-query-p "treesit.c")
(declare-function treesit-query-p "treesit.c")
(declare-function treesit-query-language "treesit.c")
(declare-function treesit-node-parser "treesit.c")
(declare-function treesit-parser-create "treesit.c")
(declare-function treesit-parser-delete "treesit.c")
(declare-function treesit-parser-list "treesit.c")
(declare-function treesit-parser-buffer "treesit.c")
(declare-function treesit-parser-language "treesit.c")
(declare-function treesit-parser-root-node "treesit.c")
(declare-function treesit-parser-set-included-ranges "treesit.c")
(declare-function treesit-parser-included-ranges "treesit.c")
(declare-function treesit-node-type "treesit.c")
(declare-function treesit-node-start "treesit.c")
(declare-function treesit-node-end "treesit.c")
(declare-function treesit-node-string "treesit.c")
(declare-function treesit-node-parent "treesit.c")
(declare-function treesit-node-child "treesit.c")
(declare-function treesit-node-check "treesit.c")
(declare-function treesit-node-field-name-for-child "treesit.c")
(declare-function treesit-node-child-count "treesit.c")
(declare-function treesit-node-child-by-field-name "treesit.c")
(declare-function treesit-node-next-sibling "treesit.c")
(declare-function treesit-node-prev-sibling "treesit.c")
(declare-function treesit-node-first-child-for-pos "treesit.c")
(declare-function treesit-node-descendant-for-range "treesit.c")
(declare-function treesit-node-eq "treesit.c")
(declare-function treesit-pattern-expand "treesit.c")
(declare-function treesit-query-expand "treesit.c")
(declare-function treesit-query-compile "treesit.c")
(declare-function treesit-query-capture "treesit.c")
(declare-function treesit-search-subtree "treesit.c")
(declare-function treesit-search-forward "treesit.c")
(declare-function treesit-induce-sparse-tree "treesit.c")
(declare-function treesit-available-p "treesit.c")
;;; Custom options
;; Tree-sitter always appear as treesit in symbols.
@ -48,8 +99,6 @@ indent, imenu, etc."
:type 'integer
:version "29.1")
(declare-function treesit-available-p "treesit.c")
(defcustom treesit-settings '((t nil t))
"Tree-sitter toggle settings for major modes.
@ -459,63 +508,69 @@ a capture name is not a face name nor a function name, it is
ignored.
\(fn :KEYWORD VALUE QUERY...)"
(let (;; Tracks the current :language/:override/:toggle/:level value
;; that following queries will apply to.
current-language current-override
current-feature
;; The list this function returns.
(result nil))
(while args
(let ((token (pop args)))
(pcase token
;; (1) Process keywords.
(:language
(let ((lang (pop args)))
(when (or (not (symbolp lang)) (null lang))
;; Other tree-sitter function don't tend to be called unless
;; tree-sitter is enabled, which means tree-sitter must be compiled.
;; But this function is usually call in `defvar' which runs
;; regardless whether tree-sitter is enabled. So we need this
;; guard.
(when (treesit-available-p)
(let (;; Tracks the current :language/:override/:toggle/:level value
;; that following queries will apply to.
current-language current-override
current-feature
;; The list this function returns.
(result nil))
(while args
(let ((token (pop args)))
(pcase token
;; (1) Process keywords.
(:language
(let ((lang (pop args)))
(when (or (not (symbolp lang)) (null lang))
(signal 'treesit-font-lock-error
`("Value of :language should be a symbol"
,lang)))
(setq current-language lang)))
(:override
(let ((flag (pop args)))
(when (not (memq flag '(t nil append prepend keep)))
(signal 'treesit-font-lock-error
`("Value of :override should be one of t, nil, append, prepend, keep"
,flag))
(signal 'wrong-type-argument
`((or t nil append prepend keep)
,flag)))
(setq current-override flag)))
(:feature
(let ((var (pop args)))
(when (or (not (symbolp var))
(memq var '(t nil)))
(signal 'treesit-font-lock-error
`("Value of :feature should be a symbol"
,var)))
(setq current-feature var)))
;; (2) Process query.
((pred treesit-query-p)
(when (null current-language)
(signal 'treesit-font-lock-error
`("Value of :language should be a symbol"
,lang)))
(setq current-language lang)))
(:override
(let ((flag (pop args)))
(when (not (memq flag '(t nil append prepend keep)))
`("Language unspecified, use :language keyword to specify a language for this query" ,token)))
(when (null current-feature)
(signal 'treesit-font-lock-error
`("Value of :override should be one of t, nil, append, prepend, keep"
,flag))
(signal 'wrong-type-argument
`((or t nil append prepend keep)
,flag)))
(setq current-override flag)))
(:feature
(let ((var (pop args)))
(when (or (not (symbolp var))
(memq var '(t nil)))
(signal 'treesit-font-lock-error
`("Value of :feature should be a symbol"
,var)))
(setq current-feature var)))
;; (2) Process query.
((pred treesit-query-p)
(when (null current-language)
(signal 'treesit-font-lock-error
`("Language unspecified, use :language keyword to specify a language for this query" ,token)))
(when (null current-feature)
(signal 'treesit-font-lock-error
`("Feature unspecified, use :feature keyword to specify the feature name for this query" ,token)))
(if (treesit-compiled-query-p token)
(push `(,current-language token) result)
(push `(,(treesit-query-compile current-language token)
t
,current-feature
,current-override)
result))
;; Clears any configurations set for this query.
(setq current-language nil
current-override nil
current-feature nil))
(_ (signal 'treesit-font-lock-error
`("Unexpected value" ,token))))))
(nreverse result)))
`("Feature unspecified, use :feature keyword to specify the feature name for this query" ,token)))
(if (treesit-compiled-query-p token)
(push `(,current-language token) result)
(push `(,(treesit-query-compile current-language token)
t
,current-feature
,current-override)
result))
;; Clears any configurations set for this query.
(setq current-language nil
current-override nil
current-feature nil))
(_ (signal 'treesit-font-lock-error
`("Unexpected value" ,token))))))
(nreverse result))))
(defun treesit-font-lock-recompute-features ()
"Enable/disable font-lock settings according to decoration level.

View file

@ -136,9 +136,9 @@ extern char etext;
#include <sys/resource.h>
#endif
#ifdef HAVE_TREE_SITTER
/* We don't guard this with HAVE_TREE_SITTER because treesit.o is
always compiled (to provide treesit-available-p). */
#include "treesit.h"
#endif
#include "pdumper.h"
#include "fingerprint.h"
@ -2269,10 +2269,9 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem
#ifdef HAVE_MODULES
syms_of_module ();
#endif
#ifdef HAVE_TREE_SITTER
/* We don't guard this with HAVE_TREE_SITTER because treesit.o
is always compiled (to provide treesit-available-p). */
syms_of_treesit ();
#endif
#ifdef HAVE_SOUND
syms_of_sound ();
#endif