# HG changeset patch # User Martin Stjernholm # Date 1064411749 0 # Node ID e1373b8163acb4ac48aab6bd04a0526f512cef18 # Parent 50c6e94a91cb8cbb5ba79e02b9d59500d93615f3 (c-font-lock-declarations): Fixed recognition of constructors and destructors for classes whose names are matched by `*-font-lock-extra-types'. (c-font-lock-invalid-string): Fixed eob problem that primarily affected XEmacs. Don't use faces to find unterminated strings since Emacs and XEmacs fontify strings differently - this function should now work better in XEmacs. diff -r 50c6e94a91cb -r e1373b8163ac lisp/progmodes/cc-fonts.el --- a/lisp/progmodes/cc-fonts.el Wed Sep 24 13:55:23 2003 +0000 +++ b/lisp/progmodes/cc-fonts.el Wed Sep 24 13:55:49 2003 +0000 @@ -514,26 +514,21 @@ (defun c-font-lock-invalid-string () ;; Assuming the point is after the opening character of a string, ;; fontify that char with `c-invalid-face-name' if the string - ;; decidedly isn't terminated properly. Assumes the string already - ;; is syntactically fontified. - (let ((end (1+ (c-point 'eol)))) - (and (eq (get-text-property (point) 'face) 'font-lock-string-face) - (= (next-single-property-change (point) 'face nil end) end) - ;; We're at eol inside a string. The first check above is - ;; necessary in XEmacs since it doesn't fontify the string - ;; delimiters themselves. Thus an empty string won't have - ;; the string face anywhere. - (if (c-major-mode-is '(c-mode c++-mode objc-mode pike-mode)) - ;; There's no \ before the newline. - (not (eq (char-before (1- end)) ?\\)) - ;; Quoted newlines aren't supported. - t) - (if (c-major-mode-is 'pike-mode) - ;; There's no # before the string, so newlines - ;; aren't allowed. - (not (eq (char-before (1- (point))) ?#)) - t) - (c-put-font-lock-face (1- (point)) (point) c-invalid-face-name)))) + ;; decidedly isn't terminated properly. + (let ((start (1- (point)))) + (save-excursion + (and (nth 3 (parse-partial-sexp start (c-point 'eol))) + (if (c-major-mode-is '(c-mode c++-mode objc-mode pike-mode)) + ;; There's no \ before the newline. + (not (eq (char-before (point)) ?\\)) + ;; Quoted newlines aren't supported. + t) + (if (c-major-mode-is 'pike-mode) + ;; There's no # before the string, so newlines + ;; aren't allowed. + (not (eq (char-before start) ?#)) + t) + (c-put-font-lock-face start (1+ start) c-invalid-face-name))))) (c-lang-defconst c-basic-matchers-before "Font lock matchers for basic keywords, labels, references and various @@ -1497,15 +1492,21 @@ ;; identifier as a type and then backed up again in ;; this case. identifier-type - (or (eq identifier-type 'found) + (or (memq identifier-type '(found known)) (and (eq (char-after identifier-start) ?~) ;; `at-type' probably won't be 'found for ;; destructors since the "~" is then part ;; of the type name being checked against ;; the list of known types, so do a check ;; without that operator. - (c-check-type (1+ identifier-start) - identifier-end)))) + (or (save-excursion + (goto-char (1+ identifier-start)) + (c-forward-syntactic-ws) + (c-with-syntax-table + c-identifier-syntax-table + (looking-at c-known-type-key))) + (c-check-type (1+ identifier-start) + identifier-end))))) (throw 'at-decl-or-cast t)) (if got-identifier