summaryrefslogtreecommitdiff
path: root/lisp/progmodes/php-ts-mode.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/progmodes/php-ts-mode.el')
-rw-r--r--lisp/progmodes/php-ts-mode.el122
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."