Function: c-font-lock-fontify-region

c-font-lock-fontify-region is a byte-compiled function defined in cc-mode.el.gz.

Signature

(c-font-lock-fontify-region BEG END &optional VERBOSE)

Source Code

;; Defined in /usr/src/emacs/lisp/progmodes/cc-mode.el.gz
(defun c-font-lock-fontify-region (beg end &optional verbose)
  ;; Effectively advice around `font-lock-fontify-region' which extends the
  ;; region (BEG END), for example, to avoid context fontification chopping
  ;; off the start of the context.  Do not extend the region if it's already
  ;; been done (i.e. from an after-change fontification.  An example (C++)
  ;; where the chopping off used to happen is this:
  ;;
  ;;     template <typename T>
  ;;
  ;;
  ;;     void myfunc(T* p) {}
  ;;
  ;; Type a space in the first blank line, and the fontification of the next
  ;; line was fouled up by context fontification.
  (save-restriction
    (widen)
    (let (new-beg new-end new-region case-fold-search)
      (c-save-buffer-state nil
	(c-with-string-fences
	 (if (and c-in-after-change-fontification
		  (< beg c-new-END) (> end c-new-BEG))
	     ;; Region and the latest after-change fontification region overlap.
	     ;; Determine the upper and lower bounds of our adjusted region
	     ;; separately.
	     (progn
	       (if (<= beg c-new-BEG)
		   (setq c-in-after-change-fontification nil))
	       (setq new-beg
		     (if (and (>= beg (c-point 'bol c-new-BEG))
			      (<= beg c-new-BEG))
			 ;; Either jit-lock has accepted `c-new-BEG', or has
			 ;; (probably) extended the change region spuriously
			 ;; to BOL, which position likely has a
			 ;; syntactically different position.  To ensure
			 ;; correct fontification, we start at `c-new-BEG',
			 ;; assuming any characters to the left of
			 ;; `c-new-BEG' on the line do not require
			 ;; fontification.
			 c-new-BEG
		       (setq new-region (c-before-context-fl-expand-region beg end)
			     new-end (cdr new-region))
		       (car new-region)))
	       (setq new-end
		     (if (and (>= end (c-point 'bol c-new-END))
			      (<= end c-new-END))
			 c-new-END
		       (or new-end
			   (cdr (c-before-context-fl-expand-region beg end))))))
	   ;; Context (etc.) fontification.
	   (setq new-region (c-before-context-fl-expand-region beg end)
		 new-beg (car new-region)  new-end (cdr new-region)))
	 ;; Finally invoke font lock's functionality.
	 (funcall (default-value 'font-lock-fontify-region-function)
		  new-beg new-end verbose))))))