diff options
| -rw-r--r-- | lisp/progmodes/cc-defs.el | 23 | ||||
| -rw-r--r-- | lisp/progmodes/cc-mode.el | 110 |
2 files changed, 95 insertions, 38 deletions
diff --git a/lisp/progmodes/cc-defs.el b/lisp/progmodes/cc-defs.el index 6a9371e6f19..c6818819e74 100644 --- a/lisp/progmodes/cc-defs.el +++ b/lisp/progmodes/cc-defs.el | |||
| @@ -1340,6 +1340,29 @@ nil; point is then left undefined." | |||
| 1340 | (search-forward-regexp "\\(\n\\|.\\)") ; to set the match-data. | 1340 | (search-forward-regexp "\\(\n\\|.\\)") ; to set the match-data. |
| 1341 | (point)))) | 1341 | (point)))) |
| 1342 | 1342 | ||
| 1343 | (defmacro c-search-backward-char-property-with-value-on-char | ||
| 1344 | (property value char &optional limit) | ||
| 1345 | "Search backward for a text-property PROPERTY having value VALUE on a | ||
| 1346 | character with value CHAR. | ||
| 1347 | LIMIT bounds the search. The value comparison is done with `equal'. | ||
| 1348 | PROPERTY must be a constant. | ||
| 1349 | |||
| 1350 | Leave point just before the character, and set the match data on | ||
| 1351 | this character, and return point. If the search fails, return | ||
| 1352 | nil; point is then left undefined." | ||
| 1353 | `(let ((char-skip (concat "^" (char-to-string ,char))) | ||
| 1354 | (-limit- (or ,limit (point-min))) | ||
| 1355 | (-value- ,value)) | ||
| 1356 | (while | ||
| 1357 | (and | ||
| 1358 | (progn (skip-chars-backward char-skip -limit-) | ||
| 1359 | (> (point) -limit-)) | ||
| 1360 | (not (equal (c-get-char-property (1- (point)) ,property) -value-))) | ||
| 1361 | (backward-char)) | ||
| 1362 | (when (> (point) -limit-) | ||
| 1363 | (search-backward-regexp "\\(\n\\|.\\)") ; to set the match-data. | ||
| 1364 | (point)))) | ||
| 1365 | |||
| 1343 | (defmacro c-search-forward-char-property-without-value-on-char | 1366 | (defmacro c-search-forward-char-property-without-value-on-char |
| 1344 | (property value char &optional limit) | 1367 | (property value char &optional limit) |
| 1345 | "Search forward for a character CHAR without text property PROPERTY having | 1368 | "Search forward for a character CHAR without text property PROPERTY having |
diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el index 73160fc7a42..7fcc8a6d1c5 100644 --- a/lisp/progmodes/cc-mode.el +++ b/lisp/progmodes/cc-mode.el | |||
| @@ -1233,6 +1233,15 @@ Note that the style variables are always made local to the buffer." | |||
| 1233 | ;; Check we haven't left any unbalanced "s. | 1233 | ;; Check we haven't left any unbalanced "s. |
| 1234 | (save-excursion | 1234 | (save-excursion |
| 1235 | (setq pos beg) | 1235 | (setq pos beg) |
| 1236 | ;; Is there already an unbalanced " before BEG? | ||
| 1237 | (setq pos (c-min-property-position pos end 'c-fl-syn-tab)) | ||
| 1238 | (when (< pos end) (goto-char pos)) | ||
| 1239 | (when (and (save-match-data | ||
| 1240 | (c-search-backward-char-property-with-value-on-char | ||
| 1241 | 'c-fl-syn-tab '(15) ?\" | ||
| 1242 | (max (- (point) 500) (point-min)))) | ||
| 1243 | (not (equal (c-get-char-property (point) 'syntax-table) '(1)))) | ||
| 1244 | (setq pos (1+ pos))) | ||
| 1236 | (while (< pos end) | 1245 | (while (< pos end) |
| 1237 | (setq pos | 1246 | (setq pos |
| 1238 | (c-min-property-position pos end 'c-fl-syn-tab)) | 1247 | (c-min-property-position pos end 'c-fl-syn-tab)) |
| @@ -2234,44 +2243,69 @@ Note that this is a strict tail, so won't match, e.g. \"0x....\".") | |||
| 2234 | ;; line was fouled up by context fontification. | 2243 | ;; line was fouled up by context fontification. |
| 2235 | (save-restriction | 2244 | (save-restriction |
| 2236 | (widen) | 2245 | (widen) |
| 2237 | (let (new-beg new-end new-region case-fold-search) | 2246 | (let (new-beg new-end new-region case-fold-search string-fence-beg lim) |
| 2238 | (if (and c-in-after-change-fontification | 2247 | ;; Check how far back we need to extend the region where we reapply the |
| 2239 | (< beg c-new-END) (> end c-new-BEG)) | 2248 | ;; string fence syntax-table properties. These must be in place for the |
| 2240 | ;; Region and the latest after-change fontification region overlap. | 2249 | ;; coming fontification operations. |
| 2241 | ;; Determine the upper and lower bounds of our adjusted region | 2250 | (save-excursion |
| 2242 | ;; separately. | 2251 | (goto-char (if c-in-after-change-fontification |
| 2243 | (progn | 2252 | (min beg c-new-BEG) |
| 2244 | (if (<= beg c-new-BEG) | 2253 | beg)) |
| 2245 | (setq c-in-after-change-fontification nil)) | 2254 | (setq lim (max (- (point) 500) (point-min))) |
| 2246 | (setq new-beg | 2255 | (while |
| 2247 | (if (and (>= beg (c-point 'bol c-new-BEG)) | 2256 | (progn |
| 2248 | (<= beg c-new-BEG)) | 2257 | (skip-chars-backward "^\"" lim) |
| 2249 | ;; Either jit-lock has accepted `c-new-BEG', or has | 2258 | (or (bobp) (backward-char)) |
| 2250 | ;; (probably) extended the change region spuriously to | 2259 | (save-excursion |
| 2251 | ;; BOL, which position likely has a syntactically | 2260 | (eq (logand (skip-chars-backward "\\\\") 1) 1)))) |
| 2252 | ;; different position. To ensure correct fontification, | 2261 | (setq string-fence-beg |
| 2253 | ;; we start at `c-new-BEG', assuming any characters to the | 2262 | (cond ((c-get-char-property (point) 'c-fl-syn-tab) |
| 2254 | ;; left of `c-new-BEG' on the line do not require | 2263 | (point)) |
| 2255 | ;; fontification. | 2264 | (c-in-after-change-fontification |
| 2256 | c-new-BEG | 2265 | c-new-BEG) |
| 2257 | (setq new-region (c-before-context-fl-expand-region beg end) | 2266 | (t beg))) |
| 2258 | new-end (cdr new-region)) | 2267 | (c-save-buffer-state nil |
| 2259 | (car new-region))) | 2268 | ;; Temporarily reapply the string fence syntax-table properties. |
| 2260 | (setq new-end | 2269 | (c-with-extended-string-fences |
| 2261 | (if (and (>= end (c-point 'bol c-new-END)) | 2270 | string-fence-beg (if c-in-after-change-fontification |
| 2262 | (<= end c-new-END)) | 2271 | (max end c-new-END) |
| 2263 | c-new-END | 2272 | end) |
| 2264 | (or new-end | 2273 | |
| 2265 | (cdr (c-before-context-fl-expand-region beg end)))))) | 2274 | (if (and c-in-after-change-fontification |
| 2266 | ;; Context (etc.) fontification. | 2275 | (< beg c-new-END) (> end c-new-BEG)) |
| 2267 | (setq new-region (c-before-context-fl-expand-region beg end) | 2276 | ;; Region and the latest after-change fontification region overlap. |
| 2268 | new-beg (car new-region) new-end (cdr new-region))) | 2277 | ;; Determine the upper and lower bounds of our adjusted region |
| 2269 | (c-save-buffer-state nil | 2278 | ;; separately. |
| 2270 | (unwind-protect | 2279 | (progn |
| 2271 | (progn (c-restore-string-fences new-beg new-end) | 2280 | (if (<= beg c-new-BEG) |
| 2272 | (funcall (default-value 'font-lock-fontify-region-function) | 2281 | (setq c-in-after-change-fontification nil)) |
| 2273 | new-beg new-end verbose)) | 2282 | (setq new-beg |
| 2274 | (c-clear-string-fences)))))) | 2283 | (if (and (>= beg (c-point 'bol c-new-BEG)) |
| 2284 | (<= beg c-new-BEG)) | ||
| 2285 | ;; Either jit-lock has accepted `c-new-BEG', or has | ||
| 2286 | ;; (probably) extended the change region spuriously | ||
| 2287 | ;; to BOL, which position likely has a | ||
| 2288 | ;; syntactically different position. To ensure | ||
| 2289 | ;; correct fontification, we start at `c-new-BEG', | ||
| 2290 | ;; assuming any characters to the left of | ||
| 2291 | ;; `c-new-BEG' on the line do not require | ||
| 2292 | ;; fontification. | ||
| 2293 | c-new-BEG | ||
| 2294 | (setq new-region (c-before-context-fl-expand-region beg end) | ||
| 2295 | new-end (cdr new-region)) | ||
| 2296 | (car new-region))) | ||
| 2297 | (setq new-end | ||
| 2298 | (if (and (>= end (c-point 'bol c-new-END)) | ||
| 2299 | (<= end c-new-END)) | ||
| 2300 | c-new-END | ||
| 2301 | (or new-end | ||
| 2302 | (cdr (c-before-context-fl-expand-region beg end)))))) | ||
| 2303 | ;; Context (etc.) fontification. | ||
| 2304 | (setq new-region (c-before-context-fl-expand-region beg end) | ||
| 2305 | new-beg (car new-region) new-end (cdr new-region))) | ||
| 2306 | ;; Finally invoke font lock's functionality. | ||
| 2307 | (funcall (default-value 'font-lock-fontify-region-function) | ||
| 2308 | new-beg new-end verbose))))))) | ||
| 2275 | 2309 | ||
| 2276 | (defun c-after-font-lock-init () | 2310 | (defun c-after-font-lock-init () |
| 2277 | ;; Put on `font-lock-mode-hook'. This function ensures our after-change | 2311 | ;; Put on `font-lock-mode-hook'. This function ensures our after-change |