diff options
Diffstat (limited to 'lisp/progmodes/php-ts-mode.el')
-rw-r--r-- | lisp/progmodes/php-ts-mode.el | 122 |
1 files changed, 81 insertions, 41 deletions
diff --git a/lisp/progmodes/php-ts-mode.el b/lisp/progmodes/php-ts-mode.el index 56c15dad36f..a5d81449ae5 100644 --- a/lisp/progmodes/php-ts-mode.el +++ b/lisp/progmodes/php-ts-mode.el @@ -22,6 +22,20 @@ ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. +;;; Tree-sitter language versions +;; +;; php-ts-mode is known to work with the following languages and version: +;; - tree-sitter-phpdoc: fe3202e468bc17332bec8969f2b50ff1f1da3a46 +;; - tree-sitter-css: v0.23.1-1-g6a442a3 +;; - tree-sitter-jsdoc: v0.23.2 +;; - tree-sitter-javascript: v0.23.1-2-g108b2d4 +;; - tree-sitter-html: v0.23.2-1-gd9219ad +;; - tree-sitter-php: v0.23.11 +;; +;; We try our best to make builtin modes work with latest grammar +;; versions, so a more recent grammar version has a good chance to work. +;; Send us a bug report if it doesn't. + ;;; Commentary: ;; ;; This package provides `php-ts-mode' which is a major mode @@ -58,30 +72,13 @@ (require 'css-mode) ;; for embed css into html (require 'js) ;; for embed javascript into html (require 'comint) +(treesit-declare-unavailable-functions) (eval-when-compile (require 'cl-lib) (require 'rx) (require 'subr-x)) -(declare-function treesit-node-child "treesit.c") -(declare-function treesit-node-child-by-field-name "treesit.c") -(declare-function treesit-node-end "treesit.c") -(declare-function treesit-node-parent "treesit.c") -(declare-function treesit-node-start "treesit.c") -(declare-function treesit-node-string "treesit.c") -(declare-function treesit-node-type "treesit.c") -(declare-function treesit-parser-add-notifier "treesit.c") -(declare-function treesit-parser-buffer "treesit.c") -(declare-function treesit-parser-create "treesit.c") -(declare-function treesit-parser-included-ranges "treesit.c") -(declare-function treesit-parser-list "treesit.c") -(declare-function treesit-parser-language "treesit.c") -(declare-function treesit-query-compile "treesit.c") -(declare-function treesit-search-forward "treesit.c") -(declare-function treesit-node-prev-sibling "treesit.c") -(declare-function treesit-node-first-child-for-pos "treesit.c") - ;;; Install treesitter language parsers (defvar php-ts-mode--language-source-alist '((php . ("https://github.com/tree-sitter/tree-sitter-php" "v0.23.11" "php/src")) @@ -595,12 +592,12 @@ doesn't have a child. PARENT is NODE's parent, BOL is the beginning of non-whitespace characters of the current line." - (when-let ((prev-sibling - (or (treesit-node-prev-sibling node t) - (treesit-node-prev-sibling - (treesit-node-first-child-for-pos parent bol) t) - (treesit-node-child parent -1 t))) - (continue t)) + (when-let* ((prev-sibling + (or (treesit-node-prev-sibling node t) + (treesit-node-prev-sibling + (treesit-node-first-child-for-pos parent bol) t) + (treesit-node-child parent -1 t))) + (continue t)) (save-excursion (while (and prev-sibling continue) (goto-char (treesit-node-start prev-sibling)) @@ -1236,8 +1233,8 @@ Return nil if the NODE has no field “name” or if NODE is not a defun node." "Indent the current top-level declaration syntactically. `treesit-defun-type-regexp' defines what constructs to indent." (interactive "*") - (when-let ((orig-point (point-marker)) - (node (treesit-defun-at-point))) + (when-let* ((orig-point (point-marker)) + (node (treesit-defun-at-point))) (indent-region (treesit-node-start node) (treesit-node-end node)) (goto-char orig-point))) @@ -1562,8 +1559,12 @@ Depends on `c-ts-common-comment-setup'." ;;;###autoload -(defun php-ts-mode-run-php-webserver (&optional port hostname document-root - router-script num-of-workers) +(defun php-ts-mode-run-php-webserver (&optional port + hostname + document-root + router-script + num-of-workers + config) "Run PHP built-in web server. PORT: Port number of built-in web server, default `php-ts-mode-ws-port'. @@ -1577,10 +1578,12 @@ ROUTER-SCRIPT: Path of the router PHP script, see `https://www.php.net/manual/en/features.commandline.webserver.php' NUM-OF-WORKERS: Before run the web server set the PHP_CLI_SERVER_WORKERS env variable useful for testing code against -multiple simultaneous requests. +multiple simultaneous requests +CONFIG: Alternative php.ini config, default `php-ts-mode-php-config'. -Interactively, when invoked with prefix argument, always prompt -for PORT, HOSTNAME, DOCUMENT-ROOT and ROUTER-SCRIPT." +Interactively, when invoked with prefix argument, always prompt for +PORT, HOSTNAME, DOCUMENT-ROOT, ROUTER-SCRIPT, NUM-OF-WORKERS and +CONFIG." (interactive (when current-prefix-arg (php-ts-mode--webserver-read-args))) (let* ((port (or @@ -1595,6 +1598,9 @@ for PORT, HOSTNAME, DOCUMENT-ROOT and ROUTER-SCRIPT." document-root php-ts-mode-ws-document-root (php-ts-mode--webserver-read-args 'document-root))) + (config (or config + (when php-ts-mode-php-config + (expand-file-name php-ts-mode-php-config)))) (host (format "%s:%d" hostname port)) (name (format "PHP web server on: %s" host)) (buf-name (format "*%s*" name)) @@ -1602,12 +1608,18 @@ for PORT, HOSTNAME, DOCUMENT-ROOT and ROUTER-SCRIPT." nil (list "-S" host "-t" document-root + (when config + (format "-c %s" config)) router-script))) (process-environment - (cons (cond - (num-of-workers (format "PHP_CLI_SERVER_WORKERS=%d" num-of-workers)) - (php-ts-mode-ws-workers (format "PHP_CLI_SERVER_WORKERS=%d" php-ts-mode-ws-workers))) - process-environment))) + (nconc (cond + (num-of-workers + (list + (format "PHP_CLI_SERVER_WORKERS=%d" num-of-workers))) + (php-ts-mode-ws-workers + (list + (format "PHP_CLI_SERVER_WORKERS=%d" php-ts-mode-ws-workers)))) + process-environment))) (if (get-buffer buf-name) (message "Switch to already running web server into buffer %s" buf-name) (message "Run PHP built-in web server with args %s into buffer %s" @@ -1622,12 +1634,17 @@ for PORT, HOSTNAME, DOCUMENT-ROOT and ROUTER-SCRIPT." (defun php-ts-mode--webserver-read-args (&optional type) "Helper for `php-ts-mode-run-php-webserver'. -The optional TYPE can be the symbol \"port\", \"hostname\", \"document-root\" or -\"router-script\", otherwise it requires all of them." +The optional TYPE can be the symbol \"port\", \"hostname\", \"document-root\", +\"router-script\", \"num-workers\" or \"config\", otherwise it requires all of them." (let ((ask-port (lambda () - (read-number "Port: " 3000))) + (read-number "Port: " (or + php-ts-mode-ws-port + 3000)))) (ask-hostname (lambda () - (read-string "Hostname: " "localhost"))) + (read-string "Hostname: " + (or + php-ts-mode-ws-hostname + "localhost")))) (ask-document-root (lambda () (expand-file-name (read-directory-name "Document root: " @@ -1639,17 +1656,40 @@ The optional TYPE can be the symbol \"port\", \"hostname\", \"document-root\" or (read-file-name "Router script: " (file-name-directory (or (buffer-file-name) - default-directory))))))) + default-directory)))))) + (ask-num-workers (lambda () + (let ((num-workers + (read-number + "Number of workers (less then 2 means no workers): " + (or php-ts-mode-ws-workers 0)))) + ;; num-workers must be >= 2 or nil + ;; otherwise PHP's built-in web server will not start. + (if (> num-workers 1) + num-workers + nil)))) + (ask-config (lambda() + (let ((file-name (expand-file-name + (read-file-name "Alternative php.ini: " + (file-name-directory + (or (buffer-file-name) + default-directory)))))) + (if (string= "" (file-name-directory file-name)) + nil + file-name))))) (cl-case type (port (funcall ask-port)) (hostname (funcall ask-hostname)) (document-root (funcall ask-document-root)) (router-script (funcall ask-router-script)) + (num-of-workers (funcall ask-num-workers)) + (config (funcall ask-config)) (t (list (funcall ask-port) (funcall ask-hostname) (funcall ask-document-root) - (funcall ask-router-script)))))) + (funcall ask-router-script) + (funcall ask-num-workers) + (funcall ask-config)))))) (define-derived-mode inferior-php-ts-mode comint-mode "Inferior PHP" "Major mode for PHP inferior process." |