1. 10 Apr, 2019 2 commits
  2. 09 Apr, 2019 38 commits
    • Paul Eggert's avatar
      Remove the need for temacs.in · d8260374
      Paul Eggert authored
      Instead of building a file temacs.in used only to compute a
      fingerprint, compute the fingerprint directly from the .o and
      .a files that go into temacs.in.  This speeds up the build by
      avoiding the need to link temacs twice, once with a dummy
      fingerprint.
      * lib-src/make-fingerprint.c (main): No need to generate
      a fingerprint file that includes config.h, now that fingerprint.c
      depends on all the .o files.
      * src/Makefile.in ($(libsrc)/make-fingerprint$(EXEEXT)):
      Use the same rule as $(libsrc)/make-docfile$(EXEEXT).
      * src/fingerprint-dummy.c: Remove.
      * src/Makefile.in (${charsets}, $(libsrc)/make-docfile$(EXEEXT))
      ($(LIBEGNU_ARCHIVE), $(lwlibdir)/liblw.a, $(oldXMenudir)/libXMenu11.a)
      (../config.status, ${ETAGS}, ../lisp/TAGS, $(lwlibdir)/TAGS)
      ($(lispsource)/loaddefs.el):
      Prefer ‘$(MAKE) -C $(dir $@)’ to ‘${MAKE} -C SOMESTRING’ when
      either will do, as the former is more regular and lets us
      coalesce rules better.
      (EMACS_DEPS_PRE, EMACS_DEPS_POST, BUILD_EMACS_PRE)
      (BUILD_EMACS_POST, temacs.in$(EXEEXT)): Remove.
      (FINGERPRINTED): New macro.
      (fingerprint.c): Use it instead of temacs.in$(EXEEXT), to
      avoid the need to build temacs.in at all.
      (temacs$(EXEEXT)): No need to depend on other .o files now;
      fingerprint.o is enough, since it depends on the rest.
      Spell out what used to be in BUILD_EMACS_PRE and BUILD_EMACS_POST.
      (mostlyclean): No need to remove temacs.in.
      d8260374
    • Paul Eggert's avatar
      Remove assumption of uint64_t etc. in portable code · e44ff2de
      Paul Eggert authored
      C11 doesn’t guarantee the existence of types like uint64_t,
      so avoid these types in portable code, as it’s easy to do so.
      There’s no need to avoid the types in w32-specific code,
      since w32 is guaranteed to have them.
      * lib-src/make-fingerprint.c (main):
      * src/fingerprint-dummy.c:
      * src/fingerprint.h:
      * src/pdumper.c (dump_fingerprint, struct dump_header):
      Prefer unsigned char to uint8_t in portable code, as either will do.
      Put an "#include <config.h>" in fingerprint.c files, so
      that the corresponding .o file is rebuilt after ./configure is run.
      * lib-src/make-fingerprint.c (main):
      Simplify loop.
      * src/Makefile.in (fingerprint.c): Update atomically.
      * src/pdumper.c: Omit unnecessary check that off_t is the same
      size as int32_t or int64_t, as the code does not rely on this
      assumption.
      (dump_off): Use int_least32_t, not int32_t.
      (struct dump_reloc): Use unsigned int, not uint32_t.
      (dump_anonymous_allocate_w32, dump_anonymous_allocate_posix)
      (dump_anonymous_allocate, dump_map_file_w32, dump_map_file_posix)
      (dump_map_file:
      Do the sanity checks at compile time, not at run-time, to avoid
      usage of uint64_t etc. on non-w32 platforms.
      e44ff2de
    • Paul Eggert's avatar
      Remove dmpstruct.h · 44a39e3e
      Paul Eggert authored
      The hassles of updating the dmpstruct.h-using code bit me again.
      These updates are more trouble than they’re worth.  See:
      https://lists.gnu.org/r/emacs-devel/2019-03/msg00122.html
      As I’m the main person who’s made changes in this area since
      dmpstruct.h was introduced, I’m the most motivated to clean up
      the situation.
      * make-dist (possibly_non_vc_files): Remove src/dmpstruct.h.
      * src/Makefile.in (dmpstruct_headers, dmpstruct.h): Remove.
      (pdumper.o): Do not depend on dmpstruct.h.
      (mostlyclean): Do not remove dmpstruct.h.
      * src/dmpstruct.awk: Remove.
      * src/pdumper.c: Do not include dmpstruct.h.
      (CHECK_STRUCTS): Remove.  All uses removed.
      44a39e3e
    • Stefan Monnier's avatar
      diff-font-lock-syntax: clarify distinction between t and hunk-also · 85fbdf02
      Stefan Monnier authored
      * lisp/vc/diff-mode.el (diff-font-lock-syntax): Rework docstring.
      (diff-syntax-fontify-hunk): Never use the hunk method when
      diff-font-lock-syntax is just t.
      85fbdf02
    • Alex Branham's avatar
      Use lexical-binding in bug-reference.el · d96b672f
      Alex Branham authored
      * .dir-locals.el: Set bug-reference-url-format in all modes, not just
      changelog mode. Use (eval . (bug-reference-mode)) as described
      in (info "(emacs) Specifying File Variables")
      * lisp/progmodes/bug-reference.el: Use lexical binding.
      (bug-reference-unfontify):
      (bug-reference-fontify): Mention args in docstring.
      
      Bug#35123
      d96b672f
    • Basil L. Contovounesios's avatar
      Fix Gnus duplicate suppression guards (bug#34987) · 6cb49922
      Basil L. Contovounesios authored
      * lisp/gnus/gnus-dup.el (gnus-dup-enter-articles)
      (gnus-dup-suppress-articles): Use gnus-dup-hashtb as an indicator of
      initialization instead of gnus-dup-list, which may happen to be nil.
      (gnus-dup-unsuppress-article): Do nothing if gnus-dup-hashtb is
      uninitialized.
      6cb49922
    • Stefan Monnier's avatar
      * lisp/printing.el: Use lexical-binding · 4f19bbb1
      Stefan Monnier authored
      Require easy-menu instead of adding declarations.
      Remove backward compatiblity.  Remove redundant ':group' args.
      (pr-region-active-p): Use use-region-p.
      (pr-set-keymap-name): Delete function and callers.
      (pr-set-keymap-parents): Delete function; use set-keymap-parent instead.
      (pr-read-string): Delete function; use read-string instead.
      (pr-menu-char-height): Delete function; use frame-char-height instead.
      (pr-menu-char-width): Delete function; use frame-char-width instead.
      (pr-menu-position): Merge the two definitions.
      (pr-get-symbol): Delete function; use easy-menu-intern instead.
      (pr-update-mode-line): Delete function; use force-mode-line-update instead.
      (pr-do-update-menus): Turn local save-var into dynbound pr--save-var.
      (pr-menu-alist): Use setf.  Simplify since we don't keep key-bindings
      in the menus any more.
      (pr-dosify-file-name): Remove interactive spec.
      (pr-filename-style): Rename from pr-path-style.
      (pr-unixify-file-name): Delete function.
      (pr-standard-file-name): Don't turn \ into / under POSIX.
      (pr-temp-dir): Don't dosify.  Use temporary-file-directory unconditionally.
      (pr-save-file-modes): Delete macro.
      (pr-ps-directory-using-ghostscript, pr-ps-directory-print)
      (pr-ps-directory-ps-print, pr-ps-mode-using-ghostscript, pr-ps-print)
      (pr-ps-mode-preview, pr-ps-mode-print, pr-printify-directory)
      (pr-txt-directory, pr-ps-file-up-preview, pr-ps-directory-preview)
      (pr-ps-file-up-ps-print, pr-ps-preview, pr-ps-using-ghostscript):
      Use properly prefixed, declared, and
      explicitly let-bound dynamically bound variables around calls to
      pr-ps-utility-args and pr-set-dir-args.
      (pr-ps-file-using-ghostscript): Only dosify when passing to suprocess.
      (pr-expand-file-name): Delete function; use expand-file-name instead.
      (pr-ps-file-print): Properly dosify.
      (pr-menu-create): Use backquotes.
      (pr-eval-alist, pr-eval-local-alist): Use dolist.
      (pr-ps-utility-args): Don't dosify here.
      (pr-ps-utility-process): Dosify here instead.
      (pr-ps-file, pr-command): Don't dosify here either.
      (pr-interface-map): Move initialization into declaration.
      (pr-insert-section-1): Use 'push'.
      (pr-insert-toggle): Use closure instead of backquoted lambda.
      (pr-insert-menu): Use apply i.s.o eval.
      (pr-insert-radio-button): Avoid 'eval'.
      4f19bbb1
    • Stefan Monnier's avatar
      quail.el: Use delete-and-extract-region · 8a5ecdaa
      Stefan Monnier authored
      * lisp/international/quail.el (quail-overlay-region-events):
      Use delete-and-extract-region.
      (quail-activate): Use setq-local.
      8a5ecdaa
    • Stefan Monnier's avatar
      python.el: don't syntax-propertize single/double quoted strings · 4b39b741
      Stefan Monnier authored
      * lisp/progmodes/python.el (python-syntax-propertize-function):
      Only mark triple-quoted strings, let the normal syntax-table handle
      the rest.
      (python-syntax-stringify): Adjust accordingly.
      4b39b741
    • Stefan Monnier's avatar
    • Stefan Monnier's avatar
      Fix up Eshell 'require's after previous dependency reshuffle. · a017927c
      Stefan Monnier authored
      * lisp/eshell/em-unix.el:
      * lisp/eshell/em-script.el:
      * lisp/eshell/em-pred.el:
      * lisp/eshell/em-dirs.el:
      * lisp/eshell/em-alias.el:
      Fix up 'require's to silence byte-compiler.
      
      * lisp/eshell/esh-util.el (eshell-read-hosts-file): Don't limit number
      of entries per line.  Preserve the structure.
      (eshell-read-hosts): Adjust accordingly.
      a017927c
    • Stefan Monnier's avatar
      * lisp/gnus/mm-view.el (mm-display-inline-fontify): Simplify. · 1055eee6
      Stefan Monnier authored
      Remove hacks that were needed before font-lock-ensure.
      Don't use switch-to-buffer.  Don't assume point-min == 1.
      1055eee6
    • Basil L. Contovounesios's avatar
      ; Warn of while/dolist pitfall in gnus-sum.el · e1a457e6
      Basil L. Contovounesios authored
      Suggested by Andy Moreton in the following thread:
      https://lists.gnu.org/archive/html/emacs-devel/2019-04/msg00294.html
      * lisp/gnus/gnus-sum.el (gnus-summary-move-article): Add comment
      warning of common while/dolist pitfall. (bug#33653#134)
      e1a457e6
    • Stefan Monnier's avatar
      * lisp/vc/diff-mode.el: Cosmetic changes in diff-syntax-fontify-hunk · 90c7e363
      Stefan Monnier authored
      (diff-default-directory): Use defvar-local.
      (diff-syntax-fontify-hunk): Use 'setq' less.  Fit within 80 columns.
      Simplify some looking-at tests.
      (diff-syntax-fontify-props): Don't check the buffer-local part of
      find-file-hook.
      90c7e363
    • Mattias Engdegård's avatar
      Clarify the TESTFN argument to `alist-get' · c8146558
      Mattias Engdegård authored
      * lisp/subr.el (alist-get):
      Rephrase the initial text to clarify the meaning of the TESTFN argument.
      It's an equality predicate, not a look-up function (Bug#35206).
      c8146558
    • Eli Zaretskii's avatar
      ; * etc/NEWS: Fix recently added entries. · 44b306d3
      Eli Zaretskii authored
      44b306d3
    • Eli Zaretskii's avatar
      Fix "M-x eshell" · 1e58dc9e
      Eli Zaretskii authored
      * lisp/eshell/em-dirs.el (eshell-variable-aliases-list)
      (eshell-directory-name, eshell-mode): Defvar them.
      (eshell-dirs-initialize): Require esh-var.  (Bug#35203)
      (eshell-apply-indices): Declare.
      1e58dc9e
    • Jackson Ray Hamilton's avatar
    • Jackson Ray Hamilton's avatar
      Explain reasonings for JSX syntax support design decisions · cf416d96
      Jackson Ray Hamilton authored
      * lisp/progmodes/js.el: Throughout the code, provide explanations for
      why JSX support was implemented in the way that it was; in particular,
      address the overlap between syntax-propertize-function, font-lock, and
      indentation (as requested by Stefan).
      cf416d96
    • Jackson Ray Hamilton's avatar
      Move curly functions closer to where they’re used · 7c3ffdaf
      Jackson Ray Hamilton authored
      * lisp/progmodes/js.el (js-jsx--enclosing-curly-pos)
      (js-jsx--goto-outermost-enclosing-curly): As the code evolved, these
      functions’ definitions ended up being far away from the only places
      where they were used.  Move them there.
      7c3ffdaf
    • Jackson Ray Hamilton's avatar
      Add open/close parenthesis syntax to “<” and “>” in JSX · 95455195
      Jackson Ray Hamilton authored
      * lisp/progmodes/js.el (js-jsx--syntax-propertize-tag): Like in
      sgml-mode, treat “<” and “>” like open/close parenthesis, making the
      text more navigable via forward-sexp, etc.
      95455195
    • Jackson Ray Hamilton's avatar
      Permit non-ASCII identifiers in JS · 18bbfc4c
      Jackson Ray Hamilton authored
      * lisp/progmodes/js.el (js--name-start-re): Generally allow
      identifiers to begin with non-ASCII letters.  This is of particular
      importance to JSX parsing.
      
      * test/manual/indent/jsx-unclosed-2.jsx: Add test to ensure non-ASCII
      characters are parsed properly.
      18bbfc4c
    • Jackson Ray Hamilton's avatar
      Identify JSX strings (for js2-mode) · 3eadf1ef
      Jackson Ray Hamilton authored
      * lisp/progmodes/js.el (js-jsx--syntax-propertize-tag): Derived modes
      like js2-mode may use font-lock-syntactic-face-function to apply faces
      to JSX strings (and only JSX strings).  Apply the js-jsx-string text
      property to such strings so they can be distinctly identified.
      (js-jsx--text-properties): Ensure the js-jsx-string text property gets
      cleaned up, too.
      3eadf1ef
    • Jackson Ray Hamilton's avatar
      Properly set a dynamic, syntactic mode name · e48306f8
      Jackson Ray Hamilton authored
      Use mode-line-format constructs to properly set mode-name, rather than
      use the very hacky solution that was filling-in for my lack of
      knowledge of this feature.
      
      * lisp/progmodes/js.el (js--update-mode-name)
      (js--idly-update-mode-name): Remove.
      
      (js--syntactic-mode-name-part): New helper function for mode-name.
      (js-use-syntactic-mode-name): Helper to set up the dynamic mode-name.
      
      (js-jsx-enable): Don’t need to call any extra functions now.
      (js-mode): Use the new setup function rather than the old ones.
      
      (js-jsx-mode): Use the same initial mode name as js-mode so the final
      one is identical for both modes.
      e48306f8
    • Jackson Ray Hamilton's avatar
      Improve whitespace and unary keyword parsing · 7a9dac5c
      Jackson Ray Hamilton authored
      * lisp/progmodes/js.el (js--name-start-chars): Remove, adding these
      chars back to js--name-start-re.
      (js--name-start-re): Add chars back from js--name-start-chars.
      
      (js-jsx--tag-start-re): Improve regexp to capture the tag name (so it
      can be disambiguated from a unary keyword), to match newlines (which
      are common in this spot), and to require at least one whitespace
      character before the attribute name.
      
      (js-jsx--matched-tag-type): Ensure the “tag name” isn’t possibly a
      unary keyword.
      
      (js-jsx--self-closing-re, js-jsx--matching-close-tag-pos): Allow
      whitespace around “<” and “>”.
      
      * test/manual/indent/jsx-unclosed-2.jsx: Add tests for unary keyword
      and whitespace parsing.
      7a9dac5c
    • Jackson Ray Hamilton's avatar
      Optimize js-jsx--enclosing-tag-pos · 98e36a3e
      Jackson Ray Hamilton authored
      * lisp/progmodes/js.el (js-jsx--enclosing-tag-pos): Update docstring
      to be more precise.  Also, remember close tag positions after they’ve
      been calculated once to avoid many redundant calls to
      js-jsx--matching-close-tag-pos.
      (js-jsx--text-properties): Ensure js-jsx-close-tag-pos text properties
      get cleaned up, too.
      98e36a3e
    • Jackson Ray Hamilton's avatar
      Optimize js-jsx--matching-close-tag-pos · 7b2e3c60
      Jackson Ray Hamilton authored
      This function’s performance was having a noticeable impact when
      editing large JSX structures.  Improve its performance
      slightly (elapsed time will be cut in half according to ELP).
      
      * lisp/progmodes/js.el (js-jsx--tag-re): Remove.
      (js-jsx--matched-tag-type): Simplify implementation with respect to
      the new implementation of js-jsx--matching-close-tag-pos.
      (js-jsx--self-closing-re): Simplify regexp slightly in sync with a
      generally simpler matching algorithm.
      (js-jsx--matching-close-tag-pos): Optimize matching algorithm by using
      multiple simple regexp searches, rather than one big complex search.
      
      * test/manual/indent/jsx-unclosed-2.jsx: Use the term “inequality” and
      add a test for a possible parsing foible.
      7b2e3c60
    • Jackson Ray Hamilton's avatar
      Add tests for miscellaneous JSX parsing feats · 462baabe
      Jackson Ray Hamilton authored
      * test/manual/indent/jsx.jsx: Add tests for JSXMemberExpression names
      and JSXOpeningFragment/JSXClosingFragment support (already supported).
      462baabe
    • Jackson Ray Hamilton's avatar
      Split JSX indentation calculation into several functions · afec4511
      Jackson Ray Hamilton authored
      * lisp/progmodes/js.el (js-jsx--contextual-indentation)
      (js-jsx--expr-attribute-pos, js-jsx--expr-indentation): Extract logic
      from js-jsx--indentation, and improve the logic’s documentation.
      (js-jsx--indentation): Simplify by splitting into several
      functions (see above) and improve the logic’s documentation.
      afec4511
    • Jackson Ray Hamilton's avatar
      Indent expressions in JSXAttributes relative to the attribute’s name · 55c80d43
      Jackson Ray Hamilton authored
      * lisp/progmodes/js.el (js-jsx--syntax-propertize-tag): Refer to the
      beginning of a JSXExpressionContainer’s associated JSXAttribute (so
      line numbers can be calculated later).
      (js-jsx--text-properties): Also clear the new text property
      js-jsx-expr-attribute.
      
      (js-jsx--indenting): Remove.
      (js-jsx--indent-col, js-jsx--indent-attribute-line): New variables.
      (js-jsx--indentation): Instead of alternating between two separate
      column calculations, neither necessarily correct, bind the JSX column
      such that the second call to js--proper-indentation can use it as a
      base column.
      (js--proper-indentation): Use JSX as the base column for some indents
      while indenting JSX.
      
      * test/manual/indent/jsx.jsx: Add more tests for expression indents.
      55c80d43
    • Jackson Ray Hamilton's avatar
      Fix counting of nested self-closing JSXOpeningElements · 16669d7c
      Jackson Ray Hamilton authored
      * 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.
      16669d7c
    • Jackson Ray Hamilton's avatar
      Indent broken arrow function bodies as an N+1th arg · 84b1cfbc
      Jackson Ray Hamilton authored
      * lisp/progmodes/js.el (js--line-terminating-arrow-re): Revise regexp
      for use with re-search-backward.
      (js--looking-at-broken-arrow-function-p): Remove.
      (js--broken-arrow-terminates-line-p): Replacement for
      js--looking-at-broken-arrow-function-p.  Don’t consider whether an
      arrow appears at point (in an arglist); instead, just look for an
      arrow that terminates the line.
      (js--proper-indentation): Use js--broken-arrow-terminates-line-p.
      
      * test/manual/indent/js.js: Add test for a broken arrow as an N+1th
      arg.
      84b1cfbc
    • Jackson Ray Hamilton's avatar
      Rename tests to use the “.jsx” file extension · d9d1bb2b
      Jackson Ray Hamilton authored
      * test/manual/indent/js-jsx-quote.js: Renamed to “jsx-quote.jsx”.
      * test/manual/indent/js-jsx-unclosed-1.js: Renamed to
      “jsx-unclosed-1.jsx”.
      * test/manual/indent/js-jsx-unclosed-2.js: Renamed to
      “jsx-unclosed-2.jsx”.
      * test/manual/indent/js-jsx.js: Renamed to “jsx.jsx”.
      
      * test/manual/indent/jsx-quote.jsx: Renamed from “js-jsx-quote.js”.
      * test/manual/indent/jsx-unclosed-1.jsx: Renamed from
      “js-jsx-unclosed-1.js”.
      * test/manual/indent/jsx-unclosed-2.jsx: Renamed from
      “js-jsx-unclosed-2.js”.
      * test/manual/indent/jsx.jsx: Renamed from “js-jsx.js”.
      d9d1bb2b
    • Jackson Ray Hamilton's avatar
      Improve JSX syntax propertization · 8b92719b
      Jackson Ray Hamilton authored
      * lisp/progmodes/js.el (js-jsx--attribute-name-re): New variable.
      (js-jsx--syntax-propertize-tag): Allow “-” in JSXAttribute names.  Fix
      “out of range” error when typing at the end of a buffer.  Fix/improve
      future propertization of unfinished JSXBoundaryElements.
      
      * test/manual/indent/js-jsx-unclosed-2.js: Add tests for allowed
      characters in JSX.
      8b92719b
    • Jackson Ray Hamilton's avatar
      Automatically detect JSX in JavaScript files · bf37078d
      Jackson Ray Hamilton authored
      * lisp/files.el (auto-mode-alist): Simply enable
      javascript-mode (js-mode) when opening “.jsx” files, since the “.jsx”
      file extension will be used as an indicator of JSX syntax by js-mode,
      and more code is likely to work in js-mode than js-jsx-mode, and we
      probably want to guide users to use js-mode (with js-jsx-syntax)
      instead.  Code that used to work exclusively in js-jsx-mode (if anyone
      ever wrote any) ought to be updated to work in js-mode too when
      js-jsx-syntax is set to t.
      
      * lisp/progmodes/js.el (js-jsx-detect-syntax, js-jsx-regexps)
      (js-jsx--detect-and-enable, js-jsx--detect-after-change): New
      variables and functions for detecting and enabling JSX.
      
      (js-jsx-syntax): Update docstring with respect to the widened scope of
      the effects and use of this variable.
      
      (js-syntactic-mode-name, js--update-mode-name)
      (js--idly-update-mode-name, js-jsx-enable): New variable and functions
      for indicating when JSX is enabled.
      
      (js-mode): Detect and enable JSX.  Print all enabled syntaxes after
      the mode name whenever Emacs goes idle; this ensures lately-enabled
      syntaxes are evident.
      
      (js-jsx-mode): Update mode name for consistency with the state in
      which JSX is enabled in js-mode.  Update docstring to suggest
      alternative means of using JSX without this mode.  Going forward, it
      may be best to gently guide users away from js-jsx-mode, since a “one
      mode per syntax extension” model would not scale well if more syntax
      extensions were to be simultaneously supported (e.g. Facebook’s
      “Flow”).
      bf37078d
    • Jackson Ray Hamilton's avatar
      Finish replacing SGML-based JSX detection with js-mode’s parsing · 339be7c0
      Jackson Ray Hamilton authored
      This removes the last dependency on sgml-mode for JSX-related logic.
      
      * lisp/progmodes/js.el (js-jsx--start-tag-re)
      (js-jsx--end-tag-re): Remove.
      (js-jsx--looking-at-start-tag-p)
      (js-jsx--looking-back-at-end-tag-p): Reimplement using text
      properties, using syntax information which ought to be slightly more
      accurate than regexps since it was found by complete parsing.
      339be7c0
    • Jackson Ray Hamilton's avatar
      Indent JSX as parsed in a JS context · 1a1ef285
      Jackson Ray Hamilton authored
      Fixes the following issues (and re-fixes indentation issues initially
      fixed but later re-broken by previous commits in the process of adding
      comprehensive JSX support):
      
      - https://github.com/mooz/js2-mode/issues/389#issuecomment-390766873
      - https://github.com/mooz/js2-mode/issues/482
      - Bug#32158
      - https://github.com/mooz/js2-mode/issues/462
      
      Previously, we delegated to sgml-mode functions for JSX indentation.
      However, there were some problems with this approach:
      
      - sgml-mode does not anticipate tags inside attributes when indenting,
        which compromises JSX indentation inside JSXExpressionContainers
        inside JSXAttributes.
      
      - In previous iterations to provide comprehensive JSX support, it
        proved tedious to disambiguate “<” and “>” as JS inequality
        operators and arrow functions from opening and closing angle
        brackets as part of SGML tags.  That code evolved into a more
        complete JSX parsing implementation for syntax-propertize rules for
        font-locking, discarding the superfluous “<”/“>” disambiguation in
        anticipation of using the improved JSX analysis for indentation.
      
      - Using sgml-mode functions, we controlled JSX indentation using SGML
        variables.  However, JSX is a different thing than SGML; referencing
        SGML in JS was a leaky abstraction.
      
      To resolve these issues, use the text properties added by the JSX
      syntax-propertize code to determine the boundaries of various aspects
      of JSX syntax, and reimplement the sgml-mode indentation code in
      js-mode with better respect to JSX indentation conventions.
      
      * lisp/progmodes/js.el (js-jsx-attribute-offset): New variable to
      provide a way for users to still control JSX attribute offsets as they
      could with sgml-attribute-offset before.  The value of this feature is
      dubious IMO, but it’s trivial to keep it, so let’s do it just in case.
      
      (js-jsx--goto-outermost-enclosing-curly): New function.
      
      (js-jsx--enclosing-tag-pos): Refactor to be unbounded by curlies, so
      this function can be used to find JSXExpressionContainers within JSX.
      Fix bug where an enclosing JSXElement couldn’t be found when point was
      at the start of its JSXClosingElement.  Return the JSXClosingElement’s
      position as well, so the JSXClosingElement can be indentified when
      indenting and be indented like the matching JSXOpeningElement.
      
      (js-jsx--at-enclosing-tag-child-p): js-jsx--enclosing-tag-pos now
      returns a list rather than a cons, so retrieve the JSXOpeningElement’s
      end position from a list.
      
      (js-jsx--context, js-jsx--indenting): New function and variable.
      (js-jsx--indentation): New function replacing the prior
      js-jsx--indent* functions and js-jsx-indent-line’s implementation.
      Use the JSX parsing performed in a JS context to more accurately
      calculate JSX indentation than by delegating to sgml-mode functions.
      (js--proper-indentation): Use js-jsx--indentation as yet another type
      of indentation.
      (js-jsx--as-sgml, js-jsx--outermost-enclosing-tag-pos)
      (js-jsx--indentation-type, js-jsx--indent-line-in-expression)
      (js-jsx--indent-n+1th-line): Remove obsolete functions.
      
      (js-jsx-indent-line): Refactor nearly-obsolete function to behave the
      same as it usually would before these changes, without respect to the
      binding of js-jsx-syntax.
      
      (js-jsx-mode): Remove obsolete documentation about the use of SGML
      variables to control indentation, and don’t bind indent-line-function
      any more, because it is no longer necessary given the new
      implementation of js-jsx-indent-line.
      1a1ef285
    • Jackson Ray Hamilton's avatar
      Update expectations for JSX indentation in JSXAttribute space · 2bedd233
      Jackson Ray Hamilton authored
      * test/manual/indent/js-jsx.js: Align expectations for dangling
      closing constructs with other places in the tests.
      2bedd233