Function: js-jsx--text-range
js-jsx--text-range is a byte-compiled function defined in js.el.gz.
Signature
(js-jsx--text-range BEG END)
Documentation
Identify JSXText within a “>/{/}/<” pair.
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/js.el.gz
;; We implement `syntax-propertize-function' logic fully parsing JSX
;; in order to provide very accurate JSX indentation, even in the most
;; complex cases (e.g. to indent JSX within a JS expression within a
;; JSXAttribute…), as over the years users have requested this. Since
;; we find so much information during this parse, we later use some of
;; the useful bits for font-locking, too.
;;
;; Some extra effort is devoted to ensuring that no code which could
;; possibly be valid JS is ever misinterpreted as partial JSX, since
;; that would be regressive.
;;
;; We first parse trying to find the minimum number of components
;; necessary to unambiguously identify a JSXBoundaryElement, even if
;; it is a partial one. If a complete one is parsed, we move on to
;; parse any JSXText. When that’s terminated, we unwind back to the
;; `syntax-propertize-rules' loop so the next JSXBoundaryElement can
;; be parsed, if any, be it an opening or closing one.
(defun js-jsx--text-range (beg end)
"Identify JSXText within a “>/{/}/<” pair."
(when (> (- end beg) 0)
(save-excursion
(goto-char beg)
(while (and (skip-chars-forward " \t\n" end) (< (point) end))
;; Comments and string quotes don’t serve their usual
;; syntactic roles in JSXText; make them plain punctuation to
;; negate those roles.
(when (or (= (char-after) ?/) ; comment
(= (syntax-class (syntax-after (point))) 7)) ; string quote
(put-text-property (point) (1+ (point)) 'syntax-table '(1)))
(forward-char)))
;; Mark JSXText so it can be font-locked as non-keywords.
(put-text-property beg (1+ beg) 'js-jsx-text (list beg end (current-buffer)))
;; Ensure future propertization beginning from within the
;; JSXText determines JSXText context from earlier lines.
(put-text-property beg end 'syntax-multiline t)))