emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/lisp/progmodes/cwarn.el


From: Stefan Monnier
Subject: [Emacs-diffs] Changes to emacs/lisp/progmodes/cwarn.el
Date: Mon, 08 Apr 2002 18:45:13 -0400

Index: emacs/lisp/progmodes/cwarn.el
diff -c emacs/lisp/progmodes/cwarn.el:1.6 emacs/lisp/progmodes/cwarn.el:1.7
*** emacs/lisp/progmodes/cwarn.el:1.6   Wed Dec  5 13:40:50 2001
--- emacs/lisp/progmodes/cwarn.el       Mon Apr  8 18:45:13 2002
***************
*** 39,45 ****
  ;;
  ;; The code contains two, possibly fatal, bugs.  The first is that the
  ;; assignment operator "=" is used as part of the test; the user
! ;; probably ment to use the comparison operator "==".
  ;;
  ;; The second problem is that an extra semicolon is placed after
  ;; closing parenthesis of the test expression.  This makes the body of
--- 39,45 ----
  ;;
  ;; The code contains two, possibly fatal, bugs.  The first is that the
  ;; assignment operator "=" is used as part of the test; the user
! ;; probably meant to use the comparison operator "==".
  ;;
  ;; The second problem is that an extra semicolon is placed after
  ;; closing parenthesis of the test expression.  This makes the body of
***************
*** 55,61 ****
  ;; * C++ functions with reference parameters.
  ;;
  ;; Note that none of the constructions highlighted (especially not C++
! ;; reference parameters) are considered errors by the langauage
  ;; definitions.
  
  ;; Usage:
--- 55,61 ----
  ;; * C++ functions with reference parameters.
  ;;
  ;; Note that none of the constructions highlighted (especially not C++
! ;; reference parameters) are considered errors by the language
  ;; definitions.
  
  ;; Usage:
***************
*** 95,101 ****
  ;; * State exactly what you did, what happened, and what you expected
  ;;   to see when you found the bug.
  ;; * If the bug cause an error, set the variable `debug-on-error' to t,
! ;;   repreat the operations that triggered the error and include
  ;;   the backtrace in the letter.
  ;; * If possible, include an example that activates the bug.
  ;; * Should you speculate about the cause of the problem, please
--- 95,101 ----
  ;; * State exactly what you did, what happened, and what you expected
  ;;   to see when you found the bug.
  ;; * If the bug cause an error, set the variable `debug-on-error' to t,
! ;;   repeat the operations that triggered the error and include
  ;;   the backtrace in the letter.
  ;; * If possible, include an example that activates the bug.
  ;; * Should you speculate about the cause of the problem, please
***************
*** 128,145 ****
  Never set this variable directly, use the command `cwarn-mode'
  instead.")
  
- (defcustom global-cwarn-mode nil
-   "When on, suspicious C and C++ constructions are highlighted.
- 
- Set this variable using \\[customize] or use the command
- `global-cwarn-mode'."
-   :group 'cwarn
-   :initialize 'custom-initialize-default
-   :set (lambda (symbol value)
-        (global-cwarn-mode (or value 0)))
-   :type 'boolean
-   :require 'cwarn)
- 
  (defcustom cwarn-configuration
    '((c-mode (not reference))
      (c++-mode t))
--- 128,133 ----
***************
*** 187,212 ****
    :group 'cwarn
    :type 'string)
  
- (defcustom cwarn-mode-hook nil
-   "*Functions to run when CWarn mode is activated."
-   :tag "CWarn mode hook"                ; To separate it from `global-...'
-   :group 'cwarn
-   :type 'hook)
- 
- (defcustom global-cwarn-mode-text ""
-   "*String to display when Global CWarn mode is active.
- 
- The default is nothing since when this mode is active this text doesn't
- vary over time, or between buffers.  Hence mode line text
- would only waste precious space."
-   :group 'cwarn
-   :type 'string)
- 
- (defcustom global-cwarn-mode-hook nil
-   "*Hook called when Global CWarn mode is activated."
-   :group 'cwarn
-   :type 'hook)
- 
  (defcustom cwarn-load-hook nil
    "*Functions to run when CWarn mode is first loaded."
    :tag "Load Hook"
--- 175,180 ----
***************
*** 217,223 ****
  ;;{{{ The modes
  
  ;;;###autoload
! (defun cwarn-mode (&optional arg)
    "Minor mode that highlights suspicious C and C++ constructions.
  
  Note, in addition to enabling this minor mode, the major mode must
--- 185,191 ----
  ;;{{{ The modes
  
  ;;;###autoload
! (define-minor-mode cwarn-mode
    "Minor mode that highlights suspicious C and C++ constructions.
  
  Note, in addition to enabling this minor mode, the major mode must
***************
*** 225,247 ****
  C++ modes are included.
  
  With ARG, turn CWarn mode on if and only if arg is positive."
!   (interactive "P")
!   (make-local-variable 'cwarn-mode)
!   (setq cwarn-mode
!       (if (null arg)
!           (not cwarn-mode)
!         (> (prefix-numeric-value arg) 0)))
!   (if (and cwarn-verbose
!          (interactive-p))
!       (message "Cwarn mode is now %s."
!              (if cwarn-mode "on" "off")))
!   (if (not global-cwarn-mode)
!       (if cwarn-mode
!         (cwarn-font-lock-add-keywords)
!       (cwarn-font-lock-remove-keywords)))
!   (font-lock-fontify-buffer)
!   (if cwarn-mode
!       (run-hooks 'cwarn-mode-hook)))
  
  ;;;###autoload
  (defun turn-on-cwarn-mode ()
--- 193,201 ----
  C++ modes are included.
  
  With ARG, turn CWarn mode on if and only if arg is positive."
!   nil cwarn-mode-text nil
!   (cwarn-font-lock-keywords cwarn-mode)
!   (if font-lock-mode (font-lock-fontify-buffer)))
  
  ;;;###autoload
  (defun turn-on-cwarn-mode ()
***************
*** 251,296 ****
    (add-hook 'c-mode-hook 'turn-on-cwarn-mode)"
    (cwarn-mode 1))
  
- ;;;###autoload
- (defun global-cwarn-mode (&optional arg)
-   "Hightlight suspicious C and C++ constructions in all buffers.
- 
- With ARG, turn CWarn mode on globally if and only if arg is positive."
-   (interactive "P")
-   (let ((old-global-cwarn-mode global-cwarn-mode))
-     (setq global-cwarn-mode
-         (if (null arg)
-             (not global-cwarn-mode)
-           (> (prefix-numeric-value arg) 0)))
-     (if (and cwarn-verbose
-            (interactive-p))
-       (message "Global CWarn mode is now %s."
-                (if global-cwarn-mode "on" "off")))
-     (when (not (eq global-cwarn-mode old-global-cwarn-mode))
-       ;; Update for all future buffers.
-       (dolist (conf cwarn-configuration)
-       (if global-cwarn-mode
-           (cwarn-font-lock-add-keywords (car conf))
-         (cwarn-font-lock-remove-keywords (car conf))))
-       ;; Update all existing buffers.
-       (save-excursion
-       (dolist (buffer (buffer-list))
-         (set-buffer buffer)
-         ;; Update keywords in alive buffers.
-         (when (and font-lock-mode
-                    (not cwarn-mode)
-                    (cwarn-is-enabled major-mode))
-           (if global-cwarn-mode
-               (cwarn-font-lock-add-keywords)
-             (cwarn-font-lock-remove-keywords))
-           (font-lock-fontify-buffer))))))
-     ;; Kills all added keywords :-(
-     ;; (font-lock-mode 0)
-     ;; (makunbound 'font-lock-keywords)
-     ;; (font-lock-mode 1))))
-   (when global-cwarn-mode
-     (run-hooks 'global-cwarn-mode-hook)))
- 
  ;;}}}
  ;;{{{ Help functions
  
--- 205,210 ----
***************
*** 320,344 ****
      (back-to-indentation)
      (eq (char-after) ?#)))
  
! (defun cwarn-font-lock-add-keywords (&optional mode)
!   "Install keywords into major MODE, or into current buffer if nil."
    (dolist (pair cwarn-font-lock-feature-keywords-alist)
      (let ((feature (car pair))
          (keywords (cdr pair)))
        (if (not (listp keywords))
          (setq keywords (symbol-value keywords)))
!       (if (cwarn-is-enabled (or mode major-mode) feature)
!         (font-lock-add-keywords mode keywords)))))
! 
! (defun cwarn-font-lock-remove-keywords (&optional mode)
!   "Remove keywords from major MODE, or from current buffer if nil."
!   (dolist (pair cwarn-font-lock-feature-keywords-alist)
!     (let ((feature (car pair))
!         (keywords (cdr pair)))
!       (if (not (listp keywords))
!         (setq keywords (symbol-value keywords)))
!       (if (cwarn-is-enabled (or mode major-mode) feature)
!         (font-lock-remove-keywords mode keywords)))))
  
  ;;}}}
  ;;{{{ Backward compatibility
--- 234,250 ----
      (back-to-indentation)
      (eq (char-after) ?#)))
  
! (defun cwarn-font-lock-keywords (addp)
!   "Install/Remove keywords into current buffer.
! If ADDP is non-nil, install else remove."
    (dolist (pair cwarn-font-lock-feature-keywords-alist)
      (let ((feature (car pair))
          (keywords (cdr pair)))
        (if (not (listp keywords))
          (setq keywords (symbol-value keywords)))
!       (if (cwarn-is-enabled major-mode feature)
!         (funcall (if addp 'font-lock-add-keywords 'font-lock-remove-keywords)
!                  nil keywords)))))
  
  ;;}}}
  ;;{{{ Backward compatibility
***************
*** 356,362 ****
  top-level not enclosed within a class definition, t is returned.
  Otherwise, a 2-vector is returned where the zeroth element is the
  buffer position of the start of the class declaration, and the first
! element is the buffer position of the enclosing class's opening
  brace."
    (let ((state (c-parse-state)))
      (or (not (c-most-enclosing-brace state))
--- 262,268 ----
  top-level not enclosed within a class definition, t is returned.
  Otherwise, a 2-vector is returned where the zeroth element is the
  buffer position of the start of the class declaration, and the first
! element is the buffer position of the enclosing class' opening
  brace."
    (let ((state (c-parse-state)))
      (or (not (c-most-enclosing-brace state))
***************
*** 375,381 ****
  ;; A match function should act like a normal forward search.  They
  ;; should return non-nil if they found a candidate and the match data
  ;; should correspond to the highlight part of the font-lock keyword.
! ;; The functions shold not generate errors, in that case font-lock
  ;; will fail to highlight the buffer.  A match function takes one
  ;; argument, LIMIT, that represent the end of area to be searched.
  ;;
--- 281,287 ----
  ;; A match function should act like a normal forward search.  They
  ;; should return non-nil if they found a candidate and the match data
  ;; should correspond to the highlight part of the font-lock keyword.
! ;; The functions should not generate errors, in that case font-lock
  ;; will fail to highlight the buffer.  A match function takes one
  ;; argument, LIMIT, that represent the end of area to be searched.
  ;;
***************
*** 383,388 ****
--- 289,309 ----
  ;; mapping from CWarn features to the font-lock keywords defined
  ;; below.
  
+ (defmacro cwarn-font-lock-match (re &rest body)
+   "Match RE but only if BODY holds."
+   `(let ((res nil))
+      (while
+        (progn
+          (setq res (re-search-forward ,re limit t))
+          (and res
+               (save-excursion
+                 (when (match-beginning 1) (goto-char (match-beginning 1)))
+                 (condition-case nil   ; In case something barfs.
+                     (not (save-match-data
+                            ,@body))
+                   (error t))))))
+      res))
+ 
  ;;{{{ Assignment in expressions
  
  (defconst cwarn-font-lock-assignment-keywords
***************
*** 391,418 ****
  
  (defun cwarn-font-lock-match-assignment-in-expression (limit)
    "Match assignments inside expressions."
!   (let ((res nil))
!     (while
!       (progn
!         (setq res (re-search-forward
!                    "[^!<>=]\\(\\([-+*/%&^|]\\|<<\\|>>\\)?=\\)[^=]"
!                    limit t))
!         (and res
!              (save-excursion
!                (goto-char (match-beginning 1))
!                (condition-case nil    ; In case "backward-up-list" barfs.
!                    (progn
!                      (backward-up-list 1)
!                      (or (not (memq (following-char) '(?\( ?\[)))
!                          (save-match-data
!                            (skip-chars-backward " ")
!                            (skip-chars-backward "a-zA-Z0-9_")
!                            (or
!                             ;; Default parameter of function.
!                             (c-at-toplevel-p)
!                             (looking-at "for\\>")))))
!                  (error t))))))
!       res))
  
  ;;}}}
  ;;{{{ Semicolon
--- 312,328 ----
  
  (defun cwarn-font-lock-match-assignment-in-expression (limit)
    "Match assignments inside expressions."
!   (cwarn-font-lock-match
!    "[^!<>=]\\(\\([-+*/%&^|]\\|<<\\|>>\\)?=\\)[^=]"
!    (backward-up-list 1)
!    (and (memq (following-char) '(?\( ?\[))
!       (not (progn
!              (skip-chars-backward " ")
!              (skip-chars-backward "a-zA-Z0-9_")
!              (or
!               ;; Default parameter of function.
!               (c-at-toplevel-p)
!               (looking-at "for\\>")))))))
  
  ;;}}}
  ;;{{{ Semicolon
***************
*** 422,446 ****
  
  (defun cwarn-font-lock-match-dangerous-semicolon (limit)
    "Match semicolons directly after `for', `while', and `if'.
! Tne semicolon after a `do { ... } while (x);' construction is not matched."
!   (let ((res nil))
!     (while
!       (progn
!         (setq res (search-forward ";" limit t))
!         (and res
!              (save-excursion
!                (condition-case nil    ; In case something barfs.
!                    (save-match-data
!                      (backward-sexp 2) ; Expression and keyword.
!                      (not (or (looking-at "\\(for\\|if\\)\\>")
!                               (and (looking-at "while\\>")
!                                    (condition-case nil
!                                        (progn
!                                          (backward-sexp 2) ; Body and "do".
!                                          (not (looking-at "do\\>")))
!                                      (error t))))))
!                  (error t))))))
!       res))
  
  ;;}}}
  ;;{{{ Reference
--- 332,348 ----
  
  (defun cwarn-font-lock-match-dangerous-semicolon (limit)
    "Match semicolons directly after `for', `while', and `if'.
! The semicolon after a `do { ... } while (x);' construction is not matched."
!   (cwarn-font-lock-match
!    ";"
!    (backward-sexp 2)                  ; Expression and keyword.
!    (or (looking-at "\\(for\\|if\\)\\>")
!        (and (looking-at "while\\>")
!           (condition-case nil
!               (progn
!                 (backward-sexp 2)     ; Body and "do".
!                 (not (looking-at "do\\>")))
!             (error t))))))
  
  ;;}}}
  ;;{{{ Reference
***************
*** 450,491 ****
  
  (defun cwarn-font-lock-match-reference (limit)
    "Font-lock matcher for C++ reference parameters."
!   (let ((res nil))
!     (while
!       (progn
!         (setq res (re-search-forward "[^&]\\(&\\)[^&=]" limit t))
!         (and res
!              (save-excursion
!                (goto-char (match-beginning 1))
!                (condition-case nil    ; In case something barfs.
!                    (save-match-data
!                      (backward-up-list 1)
!                      (or (not (eq (following-char) ?\())
!                          (cwarn-inside-macro)
!                          (not (c-at-toplevel-p))))
!                  (error t))))))
!     res))
  
  ;;}}}
  
  ;;}}}
  ;;{{{ The end
  
! (unless (assq 'cwarn-mode minor-mode-alist)
!   (push '(cwarn-mode cwarn-mode-text)
!       minor-mode-alist))
! (unless (assq 'global-cwarn-mode minor-mode-alist)
!   (push '(global-cwarn-mode global-cwarn-mode-text)
!       minor-mode-alist))
  
  (provide 'cwarn)
  
  (run-hooks 'cwarn-load-hook)
- 
- ;; This makes it possible to set Global CWarn mode from
- ;; Customize.
- (if global-cwarn-mode
-     (global-cwarn-mode 1))
  
  ;;}}}
  
--- 352,382 ----
  
  (defun cwarn-font-lock-match-reference (limit)
    "Font-lock matcher for C++ reference parameters."
!   (cwarn-font-lock-match
!    "[^&]\\(&\\)[^&=]"
!    (backward-up-list 1)
!    (and (eq (following-char) ?\()
!       (not (cwarn-inside-macro))
!       (c-at-toplevel-p))))
  
  ;;}}}
  
  ;;}}}
  ;;{{{ The end
  
! (defun turn-on-cwarn-mode-if-enabled ()
!   "Turn on CWarn mode in the current buffer if applicable.
! The mode is turned if some feature is enabled for the current
! `major-mode' in `cwarn-configuration'."
!   (if (cwarn-is-enabled major-mode) (turn-on-cwarn-mode)))
! 
! ;;;###autoload
! (easy-mmode-define-global-mode global-cwarn-mode cwarn-mode
!                              turn-on-cwarn-mode-if-enabled)
  
  (provide 'cwarn)
  
  (run-hooks 'cwarn-load-hook)
  
  ;;}}}
  



reply via email to

[Prev in Thread] Current Thread [Next in Thread]