emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

feature/tree-sitter 434fc2a22e 4/4: Make Emacs compile without tree-sitt


From: Yuan Fu
Subject: feature/tree-sitter 434fc2a22e 4/4: Make Emacs compile without tree-sitter library
Date: Fri, 28 Oct 2022 19:47:09 -0400 (EDT)

branch: feature/tree-sitter
commit 434fc2a22e4fd65fd63018e9373cbf56b51f8ab2
Author: Yuan Fu <casouri@gmail.com>
Commit: Yuan Fu <casouri@gmail.com>

    Make Emacs compile without tree-sitter library
    
    * lisp/treesit.el: Add function declaration forms.
    * src/emacs.c: Always include syms_of_treesit.
---
 lisp/treesit.el | 169 +++++++++++++++++++++++++++++++++++++-------------------
 src/emacs.c     |   9 ++-
 2 files changed, 116 insertions(+), 62 deletions(-)

diff --git a/lisp/treesit.el b/lisp/treesit.el
index 8db4704823..f144041202 100644
--- a/lisp/treesit.el
+++ b/lisp/treesit.el
@@ -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))
-               (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)))
+  ;; 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 :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)))
+                       `("Language unspecified, use :language keyword to 
specify a language for this query" ,token)))
+             (when (null current-feature)
                (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.
diff --git a/src/emacs.c b/src/emacs.c
index ba8b9c651a..ed21cce1e2 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]