Function: js-jsx--contextual-indentation
js-jsx--contextual-indentation is a byte-compiled function defined in
js.el.gz.
Signature
(js-jsx--contextual-indentation LINE CONTEXT)
Documentation
Calculate indentation column for LINE from CONTEXT.
The column calculation is based off of sgml-calculate-indent.
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/js.el.gz
(defun js-jsx--contextual-indentation (line context)
"Calculate indentation column for LINE from CONTEXT.
The column calculation is based off of `sgml-calculate-indent'."
(pcase (nth 0 context)
('string
;; Go back to previous non-empty line.
(while (and (> (point) (nth 1 context))
(zerop (forward-line -1))
(looking-at "[ \t]*$")))
(if (> (point) (nth 1 context))
;; Previous line is inside the string.
(current-indentation)
(goto-char (nth 1 context))
(1+ (current-column))))
('tag
;; Special JSX indentation rule: a “dangling” closing angle
;; bracket on its own line is indented at the same level as the
;; opening angle bracket of the JSXElement. Otherwise, indent
;; JSXAttribute space like SGML.
(if (and
js-jsx-align->-with-<
(progn
(goto-char (nth 2 context))
(and (= line (line-number-at-pos))
(looking-back "^\\s-*/?>" (line-beginning-position)))))
(progn
(goto-char (nth 1 context))
(current-column))
;; Indent JSXAttribute space like SGML.
(goto-char (nth 1 context))
;; Skip tag name:
(skip-chars-forward " \t")
(skip-chars-forward "^ \t\n")
(skip-chars-forward " \t")
(if (not (eolp))
(current-column)
;; This is the first attribute: indent.
(goto-char (+ (nth 1 context) js-jsx-attribute-offset))
(+ (current-column) (or js-jsx-indent-level js-indent-level)))))
('text
;; Indent to reflect nesting.
(goto-char (nth 1 context))
(+ (current-column)
;; The last line isn’t nested, but the rest are.
(if (or (not (nth 2 context)) ; Unclosed.
(< line (line-number-at-pos (nth 2 context))))
(or js-jsx-indent-level js-indent-level)
0)))
))