]> code.delx.au - gnu-emacs/blobdiff - lisp/progmodes/cc-vars.el
Merge from origin/emacs-25
[gnu-emacs] / lisp / progmodes / cc-vars.el
index b46b9b82704a56a31a1d5a94fc2495e814de1145..8cad27fd86d16094c532f519d34b7e22e7ef7dbe 100644 (file)
@@ -1632,12 +1632,53 @@ names)."))
   :type 'c-extra-types-widget
   :group 'c)
 
-\f
-;; Non-customizable variables, still part of the interface to CC Mode
-;; The following two are preparations for Emacs 25.2 (2016-05-09):
+(defvar c-noise-macro-with-parens-name-re "\\<\\>")
+(defvar c-noise-macro-name-re "\\<\\>")
+
+(defcustom c-noise-macro-names nil
+  "A list of names of macros which expand to nothing, or compiler extensions
+like \"????\" which are syntactic noise.  Such a macro/extension is complete in
+itself, never having parentheses.  All these names must be syntactically valid
+identifiers.
+
+If you change this variable's value, call the function
+`c-make-noise-macro-regexps' to set the necessary internal variables (or do
+this implicitly by reinitializing C/C++/Objc Mode on any buffer)."
+  :type '(repeat :tag "List of names" string)
+  :group 'c)
 (put 'c-noise-macro-names 'safe-local-variable #'c-string-list-p)
+
+(defcustom c-noise-macro-with-parens-names nil
+  "A list of names of macros \(or compiler extensions like \"__attribute__\")
+which optionally have arguments in parentheses, and which expand to nothing.
+These are recognized by CC Mode only in declarations."
+  :type '(regexp :tag "List of names (possibly empty)" string)
+  :group 'c)
 (put 'c-noise-macro-with-parens-names 'safe-local-variable #'c-string-list-p)
 
+(defun c-make-noise-macro-regexps ()
+  ;; Convert `c-noise-macro-names' and `c-noise-macro-with-parens-names' into
+  ;; `c-noise-macro-name-re' and `c-noise-macro-with-parens-name-re'.
+  (setq c-noise-macro-with-parens-name-re
+       (cond ((null c-noise-macro-with-parens-names) "\\<\\>")
+             ((consp c-noise-macro-with-parens-names)
+              (concat (regexp-opt c-noise-macro-with-parens-names t)
+                      "\\([^[:alnum:]_$]\\|$\\)"))
+             ((stringp c-noise-macro-with-parens-names)
+              (copy-sequence c-noise-macro-with-parens-names))
+             (t (error "c-make-noise-macro-regexps: \
+c-noise-macro-with-parens-names is invalid: %s" c-noise-macro-with-parens-names))))
+  (setq c-noise-macro-name-re
+       (cond ((null c-noise-macro-names) "\\<\\>")
+             ((consp c-noise-macro-names)
+              (concat (regexp-opt c-noise-macro-names t)
+                      "\\([^[:alnum:]_$]\\|$\\)"))
+             ((stringp c-noise-macro-names)
+              (copy-sequence c-noise-macro-names))
+             (t (error "c-make-noise-macro-regexps: \
+c-noise-macro-names is invalid: %s" c-noise-macro-names)))))
+\f
+;; Non-customizable variables, still part of the interface to CC Mode
 (defvar c-macro-with-semi-re nil
   ;; Regular expression which matches a (#define'd) symbol whose expansion
   ;; ends with a semicolon.