diff options
| author | Noam Postavsky | 2019-04-18 23:36:04 -0400 |
|---|---|---|
| committer | Noam Postavsky | 2019-05-09 06:42:40 -0400 |
| commit | ca14dd1d4628094dd33d5d94694dcf5f29e843b8 (patch) | |
| tree | 3e875dde24b32704e647ba9853f52d341861a4a6 /lisp | |
| parent | e7ab351caa884755c032fd9544ba67a3c953144f (diff) | |
| download | emacs-ca14dd1d4628094dd33d5d94694dcf5f29e843b8.tar.gz emacs-ca14dd1d4628094dd33d5d94694dcf5f29e843b8.zip | |
Fix nxml-get-inside (Bug#32003)
The change from 2016-01-16 "lisp/nxml: Use syntax-tables for comments"
made nxml-get-inside return non-nil for any string or comment,
including attribute strings. This caused incorrect and therefore
indentation.
* lisp/nxml/nxml-rap.el: Update commentary to reflect changes to
nxml-mode parsing.
(nxml-get-inside): Only return non-nil when inside comments and
generic strings, not normal quote-delimited strings.
* test/lisp/nxml/nxml-mode-tests.el: New tests.
Diffstat (limited to 'lisp')
| -rw-r--r-- | lisp/nxml/nxml-rap.el | 42 |
1 files changed, 20 insertions, 22 deletions
diff --git a/lisp/nxml/nxml-rap.el b/lisp/nxml/nxml-rap.el index 2bd758be3a5..21dbaded25a 100644 --- a/lisp/nxml/nxml-rap.el +++ b/lisp/nxml/nxml-rap.el | |||
| @@ -35,35 +35,25 @@ | |||
| 35 | ;; | 35 | ;; |
| 36 | ;; Our strategy is to keep track of just the problematic things. | 36 | ;; Our strategy is to keep track of just the problematic things. |
| 37 | ;; Specifically, we keep track of all comments, CDATA sections and | 37 | ;; Specifically, we keep track of all comments, CDATA sections and |
| 38 | ;; processing instructions in the instance. We do this by marking all | 38 | ;; processing instructions in the instance. We do this by marking |
| 39 | ;; except the first character of these with a non-nil nxml-inside text | 39 | ;; the first character of these with the generic string syntax by setting |
| 40 | ;; property. The value of the nxml-inside property is comment, | 40 | ;; a 'syntax-table' text property in `sgml-syntax-propertize'. |
| 41 | ;; cdata-section or processing-instruction. The first character does | ||
| 42 | ;; not have the nxml-inside property so we can find the beginning of | ||
| 43 | ;; the construct by looking for a change in a text property value | ||
| 44 | ;; (Emacs provides primitives for this). We use text properties | ||
| 45 | ;; rather than overlays, since the implementation of overlays doesn't | ||
| 46 | ;; look like it scales to large numbers of overlays in a buffer. | ||
| 47 | ;; | ||
| 48 | ;; We don't in fact track all these constructs, but only track them in | ||
| 49 | ;; some initial part of the instance. | ||
| 50 | ;; | 41 | ;; |
| 51 | ;; Thus to parse some random point in the file we first ensure that we | 42 | ;; Thus to parse some random point in the file we first ensure that we |
| 52 | ;; have scanned up to that point. Then we search backwards for a | 43 | ;; have scanned up to that point. Then we search backwards for a <. |
| 53 | ;; <. Then we check whether the < has an nxml-inside property. If it | 44 | ;; Then we check whether the < has the generic string syntax. If it |
| 54 | ;; does we go backwards to first character that does not have an | 45 | ;; does we go backwards to first character of the generic string (this |
| 55 | ;; nxml-inside property (this character must be a <). Then we start | 46 | ;; character must be a <). Then we start parsing forward from the < |
| 56 | ;; parsing forward from the < we have found. | 47 | ;; we have found. |
| 57 | ;; | 48 | ;; |
| 58 | ;; The prolog has to be parsed specially, so we also keep track of the | 49 | ;; The prolog has to be parsed specially, so we also keep track of the |
| 59 | ;; end of the prolog in `nxml-prolog-end'. The prolog is reparsed on | 50 | ;; end of the prolog in `nxml-prolog-end'. The prolog is reparsed on |
| 60 | ;; every change to the prolog. This won't work well if people try to | 51 | ;; every change to the prolog. This won't work well if people try to |
| 61 | ;; edit huge internal subsets. Hopefully that will be rare. | 52 | ;; edit huge internal subsets. Hopefully that will be rare. |
| 62 | ;; | 53 | ;; |
| 63 | ;; We keep track of the changes by adding to the buffer's | 54 | ;; We rely on the `syntax-propertize-function' machinery to keep track |
| 64 | ;; after-change-functions hook. Scanning is also done as a | 55 | ;; of the changes in the buffer. Fontification also relies on correct |
| 65 | ;; prerequisite to fontification by adding to fontification-functions | 56 | ;; `syntax-table' properties. This means that scanning for these |
| 66 | ;; (in the same way as jit-lock). This means that scanning for these | ||
| 67 | ;; constructs had better be quick. Fortunately it is. Firstly, the | 57 | ;; constructs had better be quick. Fortunately it is. Firstly, the |
| 68 | ;; typical proportion of comments, CDATA sections and processing | 58 | ;; typical proportion of comments, CDATA sections and processing |
| 69 | ;; instructions is small relative to other things. Secondly, to scan | 59 | ;; instructions is small relative to other things. Secondly, to scan |
| @@ -79,7 +69,15 @@ | |||
| 79 | "Integer giving position following end of the prolog.") | 69 | "Integer giving position following end of the prolog.") |
| 80 | 70 | ||
| 81 | (defsubst nxml-get-inside (pos) | 71 | (defsubst nxml-get-inside (pos) |
| 82 | (save-excursion (nth 8 (syntax-ppss pos)))) | 72 | "Return non-nil if inside comment, CDATA, or PI." |
| 73 | (let ((ppss (save-excursion (syntax-ppss pos)))) | ||
| 74 | (or | ||
| 75 | ;; Inside comment. | ||
| 76 | (nth 4 ppss) | ||
| 77 | ;; Inside "generic" string which is used for CDATA, and PI. | ||
| 78 | ;; "Normal" double and single quoted strings are used for | ||
| 79 | ;; attribute values. | ||
| 80 | (eq t (nth 3 ppss))))) | ||
| 83 | 81 | ||
| 84 | (defun nxml-inside-end (pos) | 82 | (defun nxml-inside-end (pos) |
| 85 | "Return the end of the inside region containing POS. | 83 | "Return the end of the inside region containing POS. |