[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master 16669d7 16/28: Fix counting of nested self-closing
From: |
Jackson Ray Hamilton |
Subject: |
[Emacs-diffs] master 16669d7 16/28: Fix counting of nested self-closing JSXOpeningElements |
Date: |
Tue, 9 Apr 2019 02:00:14 -0400 (EDT) |
branch: master
commit 16669d7c5d5a0dfadf672f8359e431ef81044a23
Author: Jackson Ray Hamilton <address@hidden>
Commit: Jackson Ray Hamilton <address@hidden>
Fix counting of nested self-closing JSXOpeningElements
* lisp/progmodes/js.el (js-jsx--matching-close-tag-pos): Fix bug where
self-closing JSXOpeningElements might be missed if one was nested
within another.
* test/manual/indent/jsx-self-closing.jsx: Add test for bug concerning
self-closing JSXOpeningElement counting.
---
lisp/progmodes/js.el | 39 ++++++++++++---------------------
test/manual/indent/jsx-self-closing.jsx | 13 +++++++++++
2 files changed, 27 insertions(+), 25 deletions(-)
diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index f8dd72c..f22c68c 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -1934,40 +1934,29 @@ Assuming a JSXOpeningElement or a JSXOpeningFragment is
immediately before point, find a matching JSXClosingElement or
JSXClosingFragment, skipping over any nested JSXElements to find
the match. Return nil if a match can’t be found."
- (let ((tag-stack 1) self-closing-pos type)
+ (let ((tag-stack 1) type tag-pos last-pos pos)
(catch 'stop
(while (re-search-forward js-jsx--tag-re nil t)
- (setq type (js-jsx--matched-tag-type))
- ;; Balance the total of self-closing tags that we subtract
- ;; from the stack, ignoring those tags which are never added
- ;; to the stack (see below).
- (unless (eq type 'self-closing)
- (when (and self-closing-pos (> (point) self-closing-pos))
+ (setq type (js-jsx--matched-tag-type)
+ tag-pos (match-beginning 0))
+ ;; Clear the stack of any JSXOpeningElements which turned out
+ ;; to be self-closing.
+ (when last-pos
+ (setq pos (point))
+ (goto-char last-pos)
+ (while (re-search-forward js-jsx--self-closing-re pos 'move)
(setq tag-stack (1- tag-stack))))
(if (eq type 'close)
(progn
(setq tag-stack (1- tag-stack))
(when (= tag-stack 0)
- (throw 'stop (match-beginning 0))))
- ;; Tags that we know are self-closing aren’t added to the
- ;; stack at all, because we only close the ones that we have
- ;; anticipated after moving past those anticipated tags’
- ;; ends, and if a self-closing tag is the first tag we
- ;; encounter in this loop, then it will never be anticipated
- ;; (due to an optimization where we sometimes can avoid
- ;; looking for self-closing tags).
+ (throw 'stop tag-pos)))
+ ;; JSXOpeningElements that we know are self-closing aren’t
+ ;; added to the stack at all (since re-search-forward moves
+ ;; point after their self-closing syntax).
(unless (eq type 'self-closing)
(setq tag-stack (1+ tag-stack))))
- ;; Don’t needlessly recalculate.
- (unless (and self-closing-pos (<= (point) self-closing-pos))
- (setq self-closing-pos nil) ; Reset if recalculating.
- (save-excursion
- ;; Anticipate a self-closing tag that we should make sure
- ;; to subtract from the tag stack once we move past its
- ;; end; we might might miss the end otherwise, due to the
- ;; regexp-matching method we use to detect tags.
- (when (re-search-forward js-jsx--self-closing-re nil t)
- (setq self-closing-pos (match-beginning 0)))))))))
+ (setq last-pos (point))))))
(defun js-jsx--enclosing-curly-pos ()
"Return position of enclosing “{” in a “{/}” pair about point."
diff --git a/test/manual/indent/jsx-self-closing.jsx
b/test/manual/indent/jsx-self-closing.jsx
new file mode 100644
index 0000000..f8ea7a1
--- /dev/null
+++ b/test/manual/indent/jsx-self-closing.jsx
@@ -0,0 +1,13 @@
+// Local Variables:
+// indent-tabs-mode: nil
+// js-indent-level: 2
+// End:
+
+// The following test goes below any comments to avoid including
+// misindented comments among the erroring lines.
+
+// Properly parse/indent code with a self-closing tag inside the
+// attribute of another self-closing tag.
+<div>
+ <div attr={() => <div attr="" />} />
+</div>
- [Emacs-diffs] master updated (e1872f8 -> cf416d9), Jackson Ray Hamilton, 2019/04/09
- [Emacs-diffs] master 27e9bce 03/28: Add new (failing) unclosed JSX test and separate such tests, Jackson Ray Hamilton, 2019/04/09
- [Emacs-diffs] master 2bedd23 09/28: Update expectations for JSX indentation in JSXAttribute space, Jackson Ray Hamilton, 2019/04/09
- [Emacs-diffs] master 16669d7 16/28: Fix counting of nested self-closing JSXOpeningElements,
Jackson Ray Hamilton <=
- [Emacs-diffs] master 52a3113 06/28: Add basic JSX font-locking, Jackson Ray Hamilton, 2019/04/09
- [Emacs-diffs] master 339be7c 11/28: Finish replacing SGML-based JSX detection with js-mode’s parsing, Jackson Ray Hamilton, 2019/04/09
- [Emacs-diffs] master 8dae742 08/28: Propertize and font-lock JSXText and JSXExpressionContainers, Jackson Ray Hamilton, 2019/04/09
- [Emacs-diffs] master 3eadf1e 24/28: Identify JSX strings (for js2-mode), Jackson Ray Hamilton, 2019/04/09
- [Emacs-diffs] master 4b305bb 02/28: Refactor JSX indentation code to improve enclosing JSX discovery, Jackson Ray Hamilton, 2019/04/09
- [Emacs-diffs] master 58c77f1 01/28: Add failing tests for JSX indentation bugs, Jackson Ray Hamilton, 2019/04/09
- [Emacs-diffs] master 4d2b5bb 07/28: Font-lock JSX while editing it by extending regions, Jackson Ray Hamilton, 2019/04/09
- [Emacs-diffs] master 462baab 19/28: Add tests for miscellaneous JSX parsing feats, Jackson Ray Hamilton, 2019/04/09
- [Emacs-diffs] master be86ece 04/28: js-syntax-propertize: Disambiguate JS from JSX, fixing some indents, Jackson Ray Hamilton, 2019/04/09
- [Emacs-diffs] master d9d1bb2 14/28: Rename tests to use the “.jsx” file extension, Jackson Ray Hamilton, 2019/04/09