From f926139d415e0e17e0fb3a46aa81f72a7a77be08 Mon Sep 17 00:00:00 2001 From: USAMI Kenta Date: Sat, 10 Sep 2022 04:23:34 +0900 Subject: [PATCH 1/3] Fix indentation of expression continuation in arglist --- lisp/php-mode.el | 35 ++++++++++++++++++++++++++++++++--- tests/indent/issue-623.php | 2 +- tests/indent/issue-702.php | 37 +++++++++++++++++++++++++++++++++++++ tests/php-mode-test.el | 4 ++++ 4 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 tests/indent/issue-702.php diff --git a/lisp/php-mode.el b/lisp/php-mode.el index cff90b08..aef3f3c8 100644 --- a/lisp/php-mode.el +++ b/lisp/php-mode.el @@ -82,6 +82,7 @@ (require 'regexp-opt) (defvar add-log-current-defun-header-regexp) (defvar add-log-current-defun-function) + (defvar c-syntactic-context) (defvar c-vsemi-status-unknown-p) (defvar syntax-propertize-via-font-lock)) @@ -603,11 +604,39 @@ might be to handle switch and goto labels differently." (defun php-lineup-cascaded-calls (langelem) "Line up chained methods using `c-lineup-cascaded-calls', but only if the setting is enabled." - (if php-mode-lineup-cascaded-calls - (c-lineup-cascaded-calls langelem) + (cond + (php-mode-lineup-cascaded-calls (c-lineup-cascaded-calls langelem)) + ((assq 'arglist-cont-nonempty c-syntactic-context) nil) + ((assq 'defun-block-intro c-syntactic-context) nil) + ((assq 'defun-close c-syntactic-context) nil) + ((assq 'statement-cont c-syntactic-context) nil) + (t (save-excursion (beginning-of-line) - (if (looking-at-p "\\s-*->") '+ nil)))) + (let ((beginning-of-langelem (cdr langelem)) + (beginning-of-current-line (point)) + start) + (skip-chars-forward " ") + (cond + ((looking-at-p "->") '+) + ((looking-at-p "[:?]") '+) + ((looking-at-p "[,;]") nil) + ;; Is the previous line terminated with `,' ? + ((progn + (forward-line -1) + (end-of-line) + (skip-chars-backward " ") + (backward-char 1) + (while (and (< beginning-of-langelem (point)) + (setq start (php-in-string-or-comment-p))) + (goto-char start) + (skip-chars-backward " ") + (backward-char 1)) + (and (not (eq (point) beginning-of-current-line)) + (not (looking-at-p ",")) + (not (php-in-string-or-comment-p)))) + '+) + (t nil))))))) (defun php-c-looking-at-or-maybe-in-bracelist (&optional _containing-sexp lim) "Replace `c-looking-at-or-maybe-in-bracelist'. diff --git a/tests/indent/issue-623.php b/tests/indent/issue-623.php index d1059fef..833d8e4e 100644 --- a/tests/indent/issue-623.php +++ b/tests/indent/issue-623.php @@ -12,6 +12,6 @@ $arr = [ $object->something() // ###php-mode-test### ((indent 4)) - /* comment */ ->something() // ###php-mode-test### ((indent 4)) + /* comment */ ->something() // ###php-mode-test### ((indent 8)) ->something(), // ###php-mode-test### ((indent 8)) ]; // ###php-mode-test### ((indent 0)) diff --git a/tests/indent/issue-702.php b/tests/indent/issue-702.php new file mode 100644 index 00000000..3ef717e4 --- /dev/null +++ b/tests/indent/issue-702.php @@ -0,0 +1,37 @@ + PHP_VERSION_ID === 80000 + ? 'foo' + : 'bar', + true && + false, + false + || true, + 'value1' + , + 'value2' + , +]; + +var_dump( + PHP_VERSION_ID === 80000 + ? 'foo' + : 'bar', + true && // ###php-mode-test### ((indent 4)) + false, + false // ###php-mode-test### ((indent 4)) + || true, // ###php-mode-test### ((indent 8)) + // ###php-mode-test### ((indent 4)) + 1 // ###php-mode-test### ((indent 4)) + + 2 // ###php-mode-test### ((indent 8)) + / 3, // ###php-mode-test### ((indent 8)) + 'value1' // ###php-mode-test### ((indent 4)) + , // ###php-mode-test### ((indent 4)) + 'value2' // ###php-mode-test### ((indent 4)) + , // ###php-mode-test### ((indent 4)) +); diff --git a/tests/php-mode-test.el b/tests/php-mode-test.el index 3a9c4de4..bcddc7bf 100644 --- a/tests/php-mode-test.el +++ b/tests/php-mode-test.el @@ -649,6 +649,10 @@ Meant for `php-mode-test-issue-503'." "Proper alignment object -> accessor." (with-php-mode-test ("indent/issue-623.php" :indent t :magic t))) +(ert-deftest php-mode-test-issue-702 () + "Proper alignment arglist." + (with-php-mode-test ("indent/issue-702.php" :indent t :magic t))) + (ert-deftest php-mode-test-php74 () "Test highlighting language constructs added in PHP 7.4." (with-php-mode-test ("7.4/arrow-function.php" :faces t)) From c3f96b79329688f14539aacb2b5fd682b3cc7ba2 Mon Sep 17 00:00:00 2001 From: USAMI Kenta Date: Sun, 18 Sep 2022 03:03:40 +0900 Subject: [PATCH 2/3] Add dump c-syntactic-context in test --- tests/php-mode-test.el | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/php-mode-test.el b/tests/php-mode-test.el index bcddc7bf..6e10a991 100644 --- a/tests/php-mode-test.el +++ b/tests/php-mode-test.el @@ -66,6 +66,7 @@ be processed." (lambda (offset) (let ((current-offset (current-indentation))) (unless (eq current-offset offset) + (warn "line: %d context: %s\n" (line-number-at-pos) (c-guess-basic-syntax)) (list :line (line-number-at-pos) :expected offset :actual current-offset)))))) From ff16da2c5321f30c3e4c48a1958a694f795274bf Mon Sep 17 00:00:00 2001 From: USAMI Kenta Date: Sun, 18 Sep 2022 04:01:30 +0900 Subject: [PATCH 3/3] Update CHANGELOG --- CHANGELOG.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2da0a407..be5eb044 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,20 @@ All notable changes of the PHP Mode 1.19.1 release series are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. - +## Unreleased + +### Changed + + * Make continued expressions inside lists (arguments and arrays, etc.) have the same indent width as outside the list ([#703]) + * (internal) Improved readability of test failures about indentation ([#707]) + +### Fixed + + * Removed invalid definitions that caused errors in some expressions ([#704]) + +[#703]: https://github.com/emacs-php/php-mode/pull/703 +[#704]: https://github.com/emacs-php/php-mode/pull/704 +[#707]: https://github.com/emacs-php/php-mode/pull/707 ## [1.24.1] - 2022-10-08