From 8e1c553260b04ce692986d428472490230b0a807 Mon Sep 17 00:00:00 2001 From: Jackson Ray Hamilton Date: Sat, 7 Dec 2019 13:10:45 -0800 Subject: [PATCH] Ignore comments and strings when matching JSX * lisp/progmodes/js.el (js-jsx--matching-close-tag-pos): Ignore comments and strings. * test/manual/indent/jsx-comment-string.jsx: New test. --- lisp/progmodes/js.el | 38 ++++++++++++----------- test/manual/indent/jsx-comment-string.jsx | 7 +++++ 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el index 2de7777af5f..c73c4795de3 100644 --- a/lisp/progmodes/js.el +++ b/lisp/progmodes/js.el @@ -2059,24 +2059,26 @@ the match. Return nil if a match can’t be found." (let ((tag-stack 1) tag-pos type last-pos pos) (catch 'stop (while (and (re-search-forward "<\\s-*" nil t) (not (eobp))) - (when (setq tag-pos (match-beginning 0) - type (js-jsx--matched-tag-type)) - (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 tag-pos))) - ;; JSXOpeningElements that we know are self-closing aren’t - ;; added to the stack at all (because point is already - ;; past that syntax). - (unless (eq type 'self-closing) - (setq tag-stack (1+ tag-stack)))) - (setq last-pos (point))))))) + ;; Not inside a comment or string. + (unless (nth 8 (save-excursion (syntax-ppss (match-beginning 0)))) + (when (setq tag-pos (match-beginning 0) + type (js-jsx--matched-tag-type)) + (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 tag-pos))) + ;; JSXOpeningElements that we know are self-closing + ;; aren’t added to the stack at all (because point is + ;; already past that syntax). + (unless (eq type 'self-closing) + (setq tag-stack (1+ tag-stack)))) + (setq last-pos (point)))))))) (defun js-jsx--enclosing-tag-pos () "Return beginning and end of a JSXElement about point. diff --git a/test/manual/indent/jsx-comment-string.jsx b/test/manual/indent/jsx-comment-string.jsx index 37a6c3233d8..cae023e7288 100644 --- a/test/manual/indent/jsx-comment-string.jsx +++ b/test/manual/indent/jsx-comment-string.jsx @@ -14,3 +14,10 @@ void 0 "" void 0 + + + {/* */} + + Yum! + + -- 2.39.2