;;; cc-langs.el --- language specific settings for CC Mode
-;; Copyright (C) 1985, 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-;; 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1985, 1987, 1992-2012 Free Software Foundation, Inc.
;; Authors: 2002- Alan Mackenzie
;; 1998- Martin Stjernholm
;; 1992-1999 Barry A. Warsaw
-;; 1987 Dave Detlefs and Stewart Clamen
+;; 1987 Dave Detlefs
+;; 1987 Stewart Clamen
;; 1985 Richard M. Stallman
;; Maintainer: bug-cc-mode@gnu.org
;; Created: 22-Apr-1997 (split from cc-mode.el)
-;; Version: See cc-mode.el
-;; Keywords: c languages oop
+;; Keywords: c languages
+;; Package: cc-mode
;; This file is part of GNU Emacs.
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 3, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
-;; along with this program; see the file COPYING. If not, write to
-;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;;; Code:
+;; For Emacs < 22.2.
+(eval-and-compile
+ (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))))
+
(eval-when-compile
(let ((load-path
(if (and (boundp 'byte-compile-dest-file)
(def-edebug-spec c-lang-defvar
(&define name def-form &optional stringp)) ;)
+;; Suppress "might not be defined at runtime" warning.
+;; This file is only used when compiling other cc files.
+(declare-function delete-duplicates "cl-seq" (cl-seq &rest cl-keys))
+(declare-function mapcan "cl-extra" (cl-func cl-seq &rest cl-rest))
+(declare-function cl-macroexpand-all "cl-extra" (form &optional env))
+
(eval-and-compile
;; Some helper functions used when building the language constants.
;;
;; OPS either has the structure of `c-operators', is a single
;; group in `c-operators', or is a plain list of operators.
- ;;
+ ;;
;; OPGROUP-FILTER specifies how to select the operator groups. It
;; can be t to choose all groups, a list of group type symbols
;; (such as 'prefix) to accept, or a function which will be called
["Backslashify" c-backslash-region
(c-fn-region-is-active-p)]))
"----"
+ ("Style..."
+ ["Set Style..." c-set-style t]
+ ["Show Current Style Name" (message
+ "Style Name: %s"
+ c-indentation-style) t]
+ ["Guess Style from this Buffer" c-guess-buffer-no-install t]
+ ["Install the Last Guessed Style..." c-guess-install
+ (and c-guess-guessed-offsets-alist
+ c-guess-guessed-basic-offset) ]
+ ["View the Last Guessed Style" c-guess-view
+ (and c-guess-guessed-offsets-alist
+ c-guess-guessed-basic-offset) ])
+ "----"
("Toggle..."
["Syntactic indentation" c-toggle-syntactic-indentation
:style toggle :selected c-syntactic-indentation]
:style toggle :selected c-auto-newline]
["Hungry delete" c-toggle-hungry-state
:style toggle :selected c-hungry-delete-key]
- ["Subword mode" c-subword-mode
- :style toggle :selected (and (boundp 'c-subword-mode)
- c-subword-mode)])))
+ ["Subword mode" subword-mode
+ :style toggle :selected (and (boundp 'subword-mode)
+ subword-mode)])))
\f
;;; Syntax tables.
(let ((table (make-syntax-table)))
(c-populate-syntax-table table)
;; Mode specific syntaxes.
- ,(cond ((c-major-mode-is 'objc-mode)
+ ,(cond ((or (c-major-mode-is 'objc-mode) (c-major-mode-is 'java-mode))
;; Let '@' be part of symbols in ObjC to cope with
;; its compiler directives as single keyword tokens.
;; This is then necessary since it's assumed that
;; '<' and '>' characters. Therefore this syntax table might go
;; away when CC Mode handles templates correctly everywhere.
t nil
- c++ `(lambda ()
+ (java c++) `(lambda ()
(let ((table (funcall ,(c-lang-const c-make-mode-syntax-table))))
(modify-syntax-entry ?< "(>" table)
(modify-syntax-entry ?> ")<" table)
(and (c-lang-const c++-make-template-syntax-table)
(funcall (c-lang-const c++-make-template-syntax-table))))
+(c-lang-defconst c-no-parens-syntax-table
+ ;; A variant of the standard syntax table which is used to find matching
+ ;; "<"s and ">"s which have been marked as parens using syntax table
+ ;; properties. The other paren characters (e.g. "{", ")" "]") are given a
+ ;; non-paren syntax here. so that the list commands will work on "< ... >"
+ ;; even when there's unbalanced other parens inside them.
+ ;;
+ ;; This variable is nil for languages which don't have template stuff.
+ t `(lambda ()
+ (if (c-lang-const c-recognize-<>-arglists)
+ (let ((table (funcall ,(c-lang-const c-make-mode-syntax-table))))
+ (modify-syntax-entry ?\( "." table)
+ (modify-syntax-entry ?\) "." table)
+ (modify-syntax-entry ?\[ "." table)
+ (modify-syntax-entry ?\] "." table)
+ (modify-syntax-entry ?\{ "." table)
+ (modify-syntax-entry ?\} "." table)
+ table))))
+(c-lang-defvar c-no-parens-syntax-table
+ (funcall (c-lang-const c-no-parens-syntax-table)))
+
(c-lang-defconst c-identifier-syntax-modifications
"A list that describes the modifications that should be done to the
mode syntax table to get a syntax table that matches all identifiers
the new syntax, as accepted by `modify-syntax-entry'."
;; The $ character is not allowed in most languages (one exception
;; is Java which allows it for legacy reasons) but we still classify
- ;; it as an indentifier character since it's often used in various
+ ;; it as an identifier character since it's often used in various
;; machine generated identifiers.
t '((?_ . "w") (?$ . "w"))
- objc (append '((?@ . "w"))
+ (objc java) (append '((?@ . "w"))
(c-lang-const c-identifier-syntax-modifications))
awk '((?_ . "w")))
(c-lang-defvar c-identifier-syntax-modifications
classifies symbol constituents like '_' and '$' as word constituents,
so that all identifiers are recognized as words.")
-(c-lang-defconst c-get-state-before-change-function
- "If non-nil, a function called from c-before-change-hook.
-Typically it will record enough state to allow
+(c-lang-defconst c-get-state-before-change-functions
+ ;; For documentation see the following c-lang-defvar of the same name.
+ ;; The value here may be a list of functions or a single function.
+ t nil
+ c++ '(c-extend-region-for-CPP
+ c-before-change-check-<>-operators
+ c-invalidate-macro-cache)
+ (c objc) '(c-extend-region-for-CPP c-invalidate-macro-cache)
+ ;; java 'c-before-change-check-<>-operators
+ awk 'c-awk-record-region-clear-NL)
+(c-lang-defvar c-get-state-before-change-functions
+ (let ((fs (c-lang-const c-get-state-before-change-functions)))
+ (if (listp fs)
+ fs
+ (list fs)))
+ "If non-nil, a list of functions called from c-before-change-hook.
+Typically these will record enough state to allow
`c-before-font-lock-function' to extend the region to fontify,
and may do such things as removing text-properties which must be
recalculated.
-It takes 2 parameters, the BEG and END supplied to every
+These functions will be run in the order given. Each of them
+takes 2 parameters, the BEG and END supplied to every
before-change function; on entry, the buffer will have been
widened and match-data will have been saved; point is undefined
on both entry and exit; the return value is ignored.
-When the mode is initialized, this function is called with
-parameters \(point-min) and \(point-max)."
- t nil
- (c c++ objc) 'c-extend-region-for-CPP
- awk 'c-awk-record-region-clear-NL)
-(c-lang-defvar c-get-state-before-change-function
- (c-lang-const c-get-state-before-change-function))
-
-(c-lang-defconst c-before-font-lock-function
- "If non-nil, a function called just before font locking.
-Typically it will extend the region about to be fontified \(see
+The functions are called even when font locking isn't enabled.
+
+When the mode is initialized, the functions are called with
+parameters \(point-min) and \(point-max).")
+
+(c-lang-defconst c-before-font-lock-functions
+ ;; For documentation see the following c-lang-defvar of the same name.
+ ;; The value here may be a list of functions or a single function.
+ t 'c-change-set-fl-decl-start
+ (c c++ objc) '(c-neutralize-syntax-in-and-mark-CPP
+ c-change-set-fl-decl-start)
+ awk 'c-awk-extend-and-syntax-tablify-region)
+(c-lang-defvar c-before-font-lock-functions
+ (let ((fs (c-lang-const c-before-font-lock-functions)))
+ (if (listp fs)
+ fs
+ (list fs)))
+ "If non-nil, a list of functions called just before font locking.
+Typically they will extend the region about to be fontified \(see
below) and will set `syntax-table' text properties on the region.
-It takes 3 parameters, the BEG, END, and OLD-LEN supplied to
-every after-change function; point is undefined on both entry and
-exit; on entry, the buffer will have been widened and match-data
-will have been saved; the return value is ignored.
+These functions will be run in the order given. Each of them
+takes 3 parameters, the BEG, END, and OLD-LEN supplied to every
+after-change function; point is undefined on both entry and exit;
+on entry, the buffer will have been widened and match-data will
+have been saved; the return value is ignored.
-The function may extend the region to be fontified by setting the
+The functions may extend the region to be fontified by setting the
buffer local variables c-new-BEG and c-new-END.
-The function is called even when font locking is disabled.
+The functions are called even when font locking is disabled.
+
+When the mode is initialized, these functions are called with
+parameters \(point-min), \(point-max) and <buffer size>.")
+
+(c-lang-defconst c-before-context-fontification-functions
+ awk nil
+ t 'c-context-set-fl-decl-start)
+ ;; For documentation see the following c-lang-defvar of the same name.
+ ;; The value here may be a list of functions or a single function.
+(c-lang-defvar c-before-context-fontification-functions
+ (let ((fs (c-lang-const c-before-context-fontification-functions)))
+ (if (listp fs)
+ fs
+ (list fs)))
+ "If non-nil, a list of functions called just before context (or
+other non-change) fontification is done. Typically they will
+extend the region.
+
+These functions will be run in the order given. Each of them
+takes 2 parameters, the BEG and END of the region to be
+fontified. Point is undefined on both entry and exit. On entry,
+the buffer will have been widened and match-data will have been
+saved; the return value is a cons of the adjusted
+region, (NEW-BEG . NEW-END).")
-When the mode is initialized, this function is called with
-parameters \(point-min), \(point-max) and <buffer size>."
+\f
+;;; Syntactic analysis ("virtual semicolons") for line-oriented languages (AWK).
+(c-lang-defconst c-at-vsemi-p-fn
+ "Contains a function \"Is there a virtual semicolon at POS or point?\".
+Such a function takes one optional parameter, a buffer position (defaults to
+point), and returns nil or t. This variable contains nil for languages which
+don't have EOL terminated statements. "
t nil
- (c c++ objc) 'c-neutralize-syntax-in-CPP
- awk 'c-awk-extend-and-syntax-tablify-region)
-(c-lang-defvar c-before-font-lock-function
- (c-lang-const c-before-font-lock-function))
+ (c c++ objc) 'c-at-macro-vsemi-p
+ awk 'c-awk-at-vsemi-p)
+(c-lang-defvar c-at-vsemi-p-fn (c-lang-const c-at-vsemi-p-fn))
+
+(c-lang-defconst c-vsemi-status-unknown-p-fn
+ "Contains a function \"are we unsure whether there is a virtual semicolon on this line?\".
+The (admittedly kludgy) purpose of such a function is to prevent an infinite
+recursion in c-beginning-of-statement-1 when point starts at a `while' token.
+The function MUST NOT UNDER ANY CIRCUMSTANCES call c-beginning-of-statement-1,
+even indirectly. This variable contains nil for languages which don't have
+EOL terminated statements."
+ t nil
+ (c c++ objc) 'c-macro-vsemi-status-unknown-p
+ awk 'c-awk-vsemi-status-unknown-p)
+(c-lang-defvar c-vsemi-status-unknown-p-fn
+ (c-lang-const c-vsemi-status-unknown-p-fn))
\f
;;; Lexer-level syntax (identifiers, tokens etc).
+(c-lang-defconst c-has-bitfields
+ "Whether the language has bitfield declarations."
+ t nil
+ (c c++ objc) t)
+(c-lang-defvar c-has-bitfields (c-lang-const c-has-bitfields))
+
(c-lang-defconst c-symbol-start
"Regexp that matches the start of a symbol, i.e. any identifier or
-keyword. It's unspecified how far it matches. Does not contain a \\|
+keyword. It's unspecified how far it matches. Does not contain a \\|
operator at the top level."
t (concat "[" c-alpha "_]")
+ java (concat "[" c-alpha "_@]")
objc (concat "[" c-alpha "@]")
pike (concat "[" c-alpha "_`]"))
(c-lang-defvar c-symbol-start (c-lang-const c-symbol-start))
(c-lang-defconst c-symbol-chars
"Set of characters that can be part of a symbol.
-This is on the form that fits inside [ ] in a regexp."
+This is of the form that fits inside [ ] in a regexp."
;; Pike note: With the backquote identifiers this would include most
;; operator chars too, but they are handled with other means instead.
t (concat c-alnum "_$")
objc (concat c-alnum "_$@"))
+(c-lang-defvar c-symbol-chars (c-lang-const c-symbol-chars))
(c-lang-defconst c-symbol-key
"Regexp matching identifiers and keywords (with submatch 0). Assumed
(c-lang-defvar c-multiline-string-start-char
(c-lang-const c-multiline-string-start-char))
+(c-lang-defconst c-opt-cpp-symbol
+ "The symbol which starts preprocessor constructs when in the margin."
+ t "#"
+ (java awk) nil)
+(c-lang-defvar c-opt-cpp-symbol (c-lang-const c-opt-cpp-symbol))
+
(c-lang-defconst c-opt-cpp-prefix
"Regexp matching the prefix of a cpp directive in the languages that
normally use that macro preprocessor. Tested at bol or at boi.
Assumed to not contain any submatches or \\| operators."
- ;; TODO (ACM, 2005-04-01). Amend the following to recognise escaped NLs;
+ ;; TODO (ACM, 2005-04-01). Amend the following to recognize escaped NLs;
;; amend all uses of c-opt-cpp-prefix which count regexp-depth.
t "\\s *#\\s *"
(java awk) nil)
definition, or nil if the language doesn't have any."
t (if (c-lang-const c-opt-cpp-prefix)
"define"))
+(c-lang-defvar c-opt-cpp-macro-define
+ (c-lang-const c-opt-cpp-macro-define))
(c-lang-defconst c-opt-cpp-macro-define-start
- ;; Regexp matching everything up to the macro body of a cpp define,
- ;; or the end of the logical line if there is none. Set if
- ;; c-opt-cpp-macro-define is.
+ ;; Regexp matching everything up to the macro body of a cpp define, or the
+ ;; end of the logical line if there is none. Submatch 1 is the name of the
+ ;; macro. Set if c-opt-cpp-macro-define is.
t (if (c-lang-const c-opt-cpp-macro-define)
(concat (c-lang-const c-opt-cpp-prefix)
(c-lang-const c-opt-cpp-macro-define)
- "[ \t]+\\(\\sw\\|_\\)+\\(\([^\)]*\)\\)?"
+ "[ \t]+\\(\\(\\sw\\|_\\)+\\)\\(\([^\)]*\)\\)?"
+ ;; ^ ^ #defined name
"\\([ \t]\\|\\\\\n\\)*")))
(c-lang-defvar c-opt-cpp-macro-define-start
(c-lang-const c-opt-cpp-macro-define-start))
t (if (c-lang-const c-opt-cpp-prefix)
'("if" "elif")))
+(c-lang-defconst c-cpp-expr-intro-re
+ "Regexp which matches the start of a CPP directive which contains an
+expression, or nil if there aren't any in the language."
+ t (if (c-lang-const c-cpp-expr-directives)
+ (concat
+ (c-lang-const c-opt-cpp-prefix)
+ (c-make-keywords-re t (c-lang-const c-cpp-expr-directives)))))
+(c-lang-defvar c-cpp-expr-intro-re
+ (c-lang-const c-cpp-expr-intro-re))
+
(c-lang-defconst c-cpp-expr-functions
"List of functions in cpp expressions."
t (if (c-lang-const c-opt-cpp-prefix)
;; Primary.
,@(c-lang-const c-identifier-ops)
- ,@(cond ((c-major-mode-is 'c++-mode)
+ ,@(cond ((or (c-major-mode-is 'c++-mode) (c-major-mode-is 'java-mode))
`((postfix-if-paren "<" ">"))) ; Templates.
((c-major-mode-is 'pike-mode)
`((prefix "global" "predef")))
;; Note: the following alias is an old name which was a mis-spelling. It has
;; been corrected above and throughout cc-engine.el. It will be removed at
;; some release very shortly in the future. ACM, 2006-04-14.
-(defalias 'c-opt-op-identitier-prefix 'c-opt-op-identifier-prefix)
+(defvaralias 'c-opt-op-identitier-prefix 'c-opt-op-identifier-prefix)
(make-obsolete-variable 'c-opt-op-identitier-prefix 'c-opt-op-identifier-prefix
"CC Mode 5.31.4, 2006-04-14")
t
"\\`<."
(lambda (op) (substring op 1)))))
+
(c-lang-defvar c-<-op-cont-regexp (c-lang-const c-<-op-cont-regexp))
(c-lang-defconst c->-op-cont-regexp
(c-filter-ops (c-lang-const c-all-op-syntax-tokens)
t
"\\`>."
- (lambda (op) (substring op 1)))))
+ (lambda (op) (substring op 1))))
+ java (c-make-keywords-re nil
+ (c-filter-ops (c-lang-const c-all-op-syntax-tokens)
+ t
+ "\\`>[^>]\\|\\`>>[^>]"
+ (lambda (op) (substring op 1)))))
+
(c-lang-defvar c->-op-cont-regexp (c-lang-const c->-op-cont-regexp))
(c-lang-defconst c-stmt-delim-chars
;; optimize `c-crosses-statement-barrier-p' somewhat, it's assumed to
;; begin with "^" to negate the set. If ? : operators should be
;; detected then the string must end with "?:".
- t "^;{}?:"
- awk "^;{}#\n\r?:") ; The newline chars gets special treatment.
+ t "^;{}?:")
(c-lang-defvar c-stmt-delim-chars (c-lang-const c-stmt-delim-chars))
(c-lang-defconst c-stmt-delim-chars-with-comma
;; Variant of `c-stmt-delim-chars' that additionally contains ','.
- t "^;,{}?:"
- awk "^;,{}\n\r?:") ; The newline chars gets special treatment.
+ t "^;,{}?:")
(c-lang-defvar c-stmt-delim-chars-with-comma
(c-lang-const c-stmt-delim-chars-with-comma))
re)))
(c-lang-defvar c-comment-start-regexp (c-lang-const c-comment-start-regexp))
-;;;; Added by ACM, 2003/9/18.
(c-lang-defconst c-block-comment-start-regexp
;; Regexp which matches the start of a block comment (if such exists in the
;; language)
(c-lang-defvar c-block-comment-start-regexp
(c-lang-const c-block-comment-start-regexp))
+(c-lang-defconst c-line-comment-start-regexp
+ ;; Regexp which matches the start of a line comment (if such exists in the
+ ;; language; it does in all 7 CC Mode languages).
+ t (if (c-lang-const c-line-comment-starter)
+ (regexp-quote (c-lang-const c-line-comment-starter))
+ "\\<\\>"))
+(c-lang-defvar c-line-comment-start-regexp
+ (c-lang-const c-line-comment-start-regexp))
+
(c-lang-defconst c-literal-start-regexp
;; Regexp to match the start of comments and string literals.
t (concat (c-lang-const c-comment-start-regexp)
"\\)"))
(c-lang-defvar c-syntactic-eol (c-lang-const c-syntactic-eol))
-\f
-;;; Syntactic analysis ("virtual semicolons") for line-oriented languages (AWK).
-(c-lang-defconst c-at-vsemi-p-fn
- "Contains a function \"Is there a virtual semicolon at POS or point?\".
-Such a function takes one optional parameter, a buffer position (defaults to
-point), and returns nil or t. This variable contains nil for languages which
-don't have EOL terminated statements. "
- t nil
- awk 'c-awk-at-vsemi-p)
-(c-lang-defvar c-at-vsemi-p-fn (c-lang-const c-at-vsemi-p-fn))
-
-(c-lang-defconst c-vsemi-status-unknown-p-fn
- "Contains a function \"are we unsure whether there is a virtual semicolon on this line?\".
-The (admittedly kludgey) purpose of such a function is to prevent an infinite
-recursion in c-beginning-of-statement-1 when point starts at a `while' token.
-The function MUST NOT UNDER ANY CIRCUMSTANCES call c-beginning-of-statement-1,
-even indirectly. This variable contains nil for languages which don't have
-EOL terminated statements."
- t nil
- awk 'c-awk-vsemi-status-unknown-p)
-(c-lang-defvar c-vsemi-status-unknown-p-fn
- (c-lang-const c-vsemi-status-unknown-p-fn))
-
\f
;;; Defun functions
;; end-of-defun-function will be set so that commands like
;; `mark-defun' and `narrow-to-defun' work right. The key sequences
;; C-M-a and C-M-e are, however, bound directly to the CC Mode
-;; functions, allowing optimisation for large n.
+;; functions, allowing optimization for large n.
(c-lang-defconst beginning-of-defun-function
"Function to which beginning-of-defun-function will be set."
t 'c-beginning-of-defun
;; In CORBA PSDL:
"strong"))
+(c-lang-defconst c-typedef-kwds
+ "Prefix keyword\(s\) like \"typedef\" which make a type declaration out
+of a variable declaration."
+ t '("typedef")
+ (awk idl java) nil)
+
+(c-lang-defconst c-typedef-key
+ ;; Adorned regexp matching `c-typedef-kwds'.
+ t (c-make-keywords-re t (c-lang-const c-typedef-kwds)))
+(c-lang-defvar c-typedef-key (c-lang-const c-typedef-key))
+
(c-lang-defconst c-type-prefix-kwds
"Keywords where the following name - if any - is a type name, and
where the keyword together with the symbol works as a type in
c++ '("class" "struct" "union")
objc '("struct" "union"
"@interface" "@implementation" "@protocol")
- java '("class" "interface")
+ java '("class" "@interface" "interface")
idl '("component" "eventtype" "exception" "home" "interface" "struct"
"union" "valuetype"
;; In CORBA PSDL:
`c-<>-type-kwds', or `c-<>-arglist-kwds' then the associated clauses
will be handled."
t '("enum")
- (java awk) nil)
+ (awk) nil)
(c-lang-defconst c-brace-list-key
;; Regexp matching the start of declarations where the following
;; types in IDL since they only can occur in "raises" specs.
idl (delete "exception" (append (c-lang-const c-typedef-decl-kwds) nil)))
+(c-lang-defconst c-typedef-decl-key
+ t (c-make-keywords-re t (c-lang-const c-typedef-decl-kwds)))
+(c-lang-defvar c-typedef-decl-key (c-lang-const c-typedef-decl-key))
+
(c-lang-defconst c-typeless-decl-kwds
"Keywords introducing declarations where the \(first) identifier
\(declarator) follows directly after the keyword, without any type.
(c-lang-defconst c-prefix-spec-kwds-re
;; Adorned regexp of `c-prefix-spec-kwds'.
t (c-make-keywords-re t (c-lang-const c-prefix-spec-kwds)))
+
(c-lang-defvar c-prefix-spec-kwds-re (c-lang-const c-prefix-spec-kwds-re))
(c-lang-defconst c-specifier-key
(c-lang-defvar c-not-decl-init-keywords
(c-lang-const c-not-decl-init-keywords))
+(c-lang-defconst c-not-primitive-type-keywords
+ "List of all keywords apart from primitive types (like \"int\")."
+ t (set-difference (c-lang-const c-keywords)
+ (c-lang-const c-primitive-type-kwds)
+ :test 'string-equal)
+ ;; The "more" for C++ is the QT keyword (as in "more slots:").
+ ;; This variable is intended for use in c-beginning-of-statement-1.
+ c++ (append (c-lang-const c-not-primitive-type-keywords) '("more")))
+
+(c-lang-defconst c-not-primitive-type-keywords-regexp
+ t (c-make-keywords-re t
+ (c-lang-const c-not-primitive-type-keywords)))
+(c-lang-defvar c-not-primitive-type-keywords-regexp
+ (c-lang-const c-not-primitive-type-keywords-regexp))
+
(c-lang-defconst c-protection-kwds
"Access protection label keywords in classes."
t nil
t nil
c++ '("operator")
objc '("@class")
- java '("import" "new" "extends" "implements" "throws")
+ java '("import" "new" "extends" "super" "implements" "throws")
idl '("manages" "native" "primarykey" "supports"
;; In CORBA PSDL:
"as" "implements" "of" "scope")
(c-make-keywords-re t (c-lang-const c-asm-stmt-kwds))))
(c-lang-defvar c-opt-asm-stmt-key (c-lang-const c-opt-asm-stmt-key))
+(c-lang-defconst c-case-kwds
+ "The keyword\(s) which introduce a \"case\" like construct.
+This construct is \"<keyword> <expression> :\"."
+ t '("case")
+ awk nil)
+
+(c-lang-defconst c-case-kwds-regexp
+ ;; Adorned regexp matching any "case"-like keyword.
+ t (c-make-keywords-re t (c-lang-const c-case-kwds)))
+(c-lang-defvar c-case-kwds-regexp (c-lang-const c-case-kwds-regexp))
+
(c-lang-defconst c-label-kwds
"Keywords introducing colon terminated labels in blocks."
- t '("case" "default")
- awk nil)
+ t '("case" "default"))
(c-lang-defconst c-label-kwds-regexp
;; Adorned regexp matching any keyword that introduces a label.
t nil
(c c++) '("NULL" ;; Not a keyword, but practically works as one.
"false" "true") ; Defined in C99.
- objc '("nil" "Nil")
+ objc '("nil" "Nil" "YES" "NO" "NS_DURING" "NS_HANDLER" "NS_ENDHANDLER")
idl '("TRUE" "FALSE")
java '("true" "false" "null") ; technically "literals", not keywords
pike '("UNDEFINED")) ;; Not a keyword, but practically works as one.
"\\.?[0-9]"
"\\|"
- ;; The nonambiguous operators from `prefix-ops'.
+ ;; The unambiguous operators from `prefix-ops'.
(c-make-keywords-re nil
(set-difference nonkeyword-prefix-ops in-or-postfix-ops
:test 'string-equal))
;; in all languages except Java for when a cpp macro definition
;; begins with a declaration.
t "\\([\{\}\(\);,]+\\)"
- java "\\([\{\}\(;,]+\\)"
+ java "\\([\{\}\(;,<]+\\)"
;; Match "<" in C++ to get the first argument in a template arglist.
;; In that case there's an additional check in `c-find-decl-spots'
;; that it got open paren syntax.
pos (match-end 0)))
res))))
- ;; Allow cpp operatios (where applicable).
+ ;; Allow cpp operations (where applicable).
t (if (c-lang-const c-opt-cpp-prefix)
(set-difference (c-lang-const c-block-prefix-disallowed-chars)
'(?#))
c++ (concat "\\("
"[*\(&]"
"\\|"
- (concat "\\(" ; 2
+ (c-lang-const c-type-decl-prefix-key)
+ "\\|"
+ (concat "\\(" ; 3
;; If this matches there's special treatment in
;; `c-font-lock-declarators' and
;; `c-font-lock-declarations' that check for a
;; complete name followed by ":: *".
(c-lang-const c-identifier-start)
"\\)")
- "\\|"
- (c-lang-const c-type-decl-prefix-key)
"\\)"
"\\([^=]\\|$\\)")
pike "\\(\\*\\)\\([^=]\\|$\\)")
is in effect or not."
t nil
(c c++ objc pike) "\\(\\.\\.\\.\\)"
- java (concat "\\(\\[" (c-lang-const c-simple-ws) "*\\]\\)"))
+ java (concat "\\(\\[" (c-lang-const c-simple-ws) "*\\]\\|\\.\\.\\.\\)"))
(c-lang-defvar c-opt-type-suffix-key (c-lang-const c-opt-type-suffix-key))
(c-lang-defvar c-known-type-key
(consp (c-lang-const c-<>-arglist-kwds))))
(c-lang-defvar c-recognize-<>-arglists (c-lang-const c-recognize-<>-arglists))
+(c-lang-defconst c-enums-contain-decls
+ "Non-nil means that an enum structure can contain declarations."
+ t nil
+ java t)
+(c-lang-defvar c-enums-contain-decls (c-lang-const c-enums-contain-decls))
+
(c-lang-defconst c-recognize-paren-inits
"Non-nil means that parenthesis style initializers exist,
i.e. constructs like
tested at the beginning of every sexp in a suspected label,
i.e. before \":\". Only used if `c-recognize-colon-labels' is set."
t (concat
- ;; Don't allow string literals.
- "[\"']\\|"
;; All keywords except `c-label-kwds' and `c-protection-kwds'.
(c-make-keywords-re t
(set-difference (c-lang-const c-keywords)
(append (c-lang-const c-label-kwds)
(c-lang-const c-protection-kwds))
:test 'string-equal)))
+ ;; Don't allow string literals, except in AWK. Character constants are OK.
+ (c objc java pike idl) (concat "\"\\|"
+ (c-lang-const c-nonlabel-token-key))
;; Also check for open parens in C++, to catch member init lists in
;; constructors. We normally allow it so that macros with arguments
;; work in labels.
- c++ (concat "\\s\(\\|" (c-lang-const c-nonlabel-token-key)))
+ c++ (concat "\\s\(\\|\"\\|" (c-lang-const c-nonlabel-token-key)))
(c-lang-defvar c-nonlabel-token-key (c-lang-const c-nonlabel-token-key))
+(c-lang-defconst c-nonlabel-token-2-key
+ "Regexp matching things that can't occur two symbols before a colon in
+a label construct. This catches C++'s inheritance construct \"class foo
+: bar\". Only used if `c-recognize-colon-labels' is set."
+ t "\\<\\>" ; matches nothing
+ c++ (c-make-keywords-re t '("class")))
+(c-lang-defvar c-nonlabel-token-2-key (c-lang-const c-nonlabel-token-2-key))
+
(c-lang-defconst c-opt-extra-label-key
"Optional regexp matching labels.
Normally, labels are detected according to `c-nonlabel-token-key',
;; ',mode ,c-version c-version)
;; (put ',mode 'c-has-warned-lang-consts t))
- (require 'cc-langs)
(setq source-eval t)
- (let ((init (append (cdr c-emacs-variable-inits)
- (cdr c-lang-variable-inits))))
+ (let ((init ',(append (cdr c-emacs-variable-inits)
+ (cdr c-lang-variable-inits))))
(while init
(setq current-var (caar init))
(set (caar init) (eval (cadar init)))
\f
(cc-provide 'cc-langs)
-;; arch-tag: 1ab57482-cfc2-4c5b-b628-3539c3098822
;;; cc-langs.el ends here