]> git.eshelyaron.com Git - emacs.git/commitdiff
(c-font-lock-declarations): Fixed recognition of constructors and
authorMartin Stjernholm <mast@lysator.liu.se>
Wed, 24 Sep 2003 13:55:49 +0000 (13:55 +0000)
committerMartin Stjernholm <mast@lysator.liu.se>
Wed, 24 Sep 2003 13:55:49 +0000 (13:55 +0000)
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.

lisp/progmodes/cc-fonts.el

index e9f99d14022e4d72b35f1a8983d5a6e19f611d57..c5a587f41e54d0b537bde5203f5978189980d969 100644 (file)
@@ -514,26 +514,21 @@ stuff.  Used on level 1 and higher."
 (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 @@ casts and declarations are fontified.  Used on level 2 and higher."
                           ;; 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