wok annotate emacs-pkg-vala-mode/stuff/vala-mode.el @ rev 12254

Up: slitaz-configs (4.9.1) - Last minute bug fix
author Christophe Lincoln <pankso@slitaz.org>
date Tue Apr 10 13:54:27 2012 +0200 (2012-04-10)
parents
children
rev   line source
domcox@8443 1 ;;; vala-mode.el --- Vala mode derived mode
domcox@8443 2
domcox@8443 3 ;; Author: 2005 Dylan R. E. Moonfire
domcox@8443 4 ;; 2008 Étienne BERSAC
domcox@8443 5 ;; Maintainer: Étienne BERSAC <bersace03@laposte.net>
domcox@8443 6 ;; Created: 2008 May the 4th
domcox@8443 7 ;; Modified: May 2008
domcox@8443 8 ;; Version: 0.1
domcox@8443 9 ;; Keywords: vala languages oop
domcox@8443 10
domcox@8443 11 ;; This program is free software; you can redistribute it and/or modify
domcox@8443 12 ;; it under the terms of the GNU General Public License as published by
domcox@8443 13 ;; the Free Software Foundation; either version 2 of the License, or
domcox@8443 14 ;; (at your option) any later version.
domcox@8443 15 ;;
domcox@8443 16 ;; This program is distributed in the hope that it will be useful,
domcox@8443 17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
domcox@8443 18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
domcox@8443 19 ;; GNU General Public License for more details.
domcox@8443 20 ;;
domcox@8443 21 ;; You should have received a copy of the GNU General Public License
domcox@8443 22 ;; along with this program; see the file COPYING. If not, write to
domcox@8443 23 ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
domcox@8443 24 ;; Boston, MA 02111-1307, USA.
domcox@8443 25
domcox@8443 26 ;;; Commentary:
domcox@8443 27 ;;
domcox@8443 28 ;; See http://live.gnome.org/Vala for details about Vala language.
domcox@8443 29 ;;
domcox@8443 30 ;; This is a separate mode to implement the Vala constructs and
domcox@8443 31 ;; font-locking. It is mostly the csharp-mode from
domcox@8443 32 ;; http://mfgames.com/linux/csharp-mode with vala specific keywords
domcox@8443 33 ;; and filename suffixes.
domcox@8443 34 ;;
domcox@8443 35 ;; Note: The interface used in this file requires CC Mode 5.30 or
domcox@8443 36 ;; later.
domcox@8443 37
domcox@8443 38 ;;; .emacs (don't put in (require 'vala-mode))
domcox@8443 39 ;; (autoload 'vala-mode "vala-mode" "Major mode for editing Vala code." t)
domcox@8443 40 ;; (setq auto-mode-alist
domcox@8443 41 ;; (append '(("\\.vala$" . vala-mode)) auto-mode-alist))
domcox@8443 42
domcox@8443 43 ;;; Versions:
domcox@8443 44 ;;
domcox@8443 45 ;; 0.1 : Initial version based on csharp-mode
domcox@8443 46 ;;
domcox@8443 47
domcox@8443 48 ;; This is a copy of the function in cc-mode which is used to handle
domcox@8443 49 ;; the eval-when-compile which is needed during other times.
domcox@8443 50 (defun c-filter-ops (ops opgroup-filter op-filter &optional xlate)
domcox@8443 51 ;; See cc-langs.el, a direct copy.
domcox@8443 52 (unless (listp (car-safe ops))
domcox@8443 53 (setq ops (list ops)))
domcox@8443 54 (cond ((eq opgroup-filter t)
domcox@8443 55 (setq opgroup-filter (lambda (opgroup) t)))
domcox@8443 56 ((not (functionp opgroup-filter))
domcox@8443 57 (setq opgroup-filter `(lambda (opgroup)
domcox@8443 58 (memq opgroup ',opgroup-filter)))))
domcox@8443 59 (cond ((eq op-filter t)
domcox@8443 60 (setq op-filter (lambda (op) t)))
domcox@8443 61 ((stringp op-filter)
domcox@8443 62 (setq op-filter `(lambda (op)
domcox@8443 63 (string-match ,op-filter op)))))
domcox@8443 64 (unless xlate
domcox@8443 65 (setq xlate 'identity))
domcox@8443 66 (c-with-syntax-table (c-lang-const c-mode-syntax-table)
domcox@8443 67 (delete-duplicates
domcox@8443 68 (mapcan (lambda (opgroup)
domcox@8443 69 (when (if (symbolp (car opgroup))
domcox@8443 70 (when (funcall opgroup-filter (car opgroup))
domcox@8443 71 (setq opgroup (cdr opgroup))
domcox@8443 72 t)
domcox@8443 73 t)
domcox@8443 74 (mapcan (lambda (op)
domcox@8443 75 (when (funcall op-filter op)
domcox@8443 76 (let ((res (funcall xlate op)))
domcox@8443 77 (if (listp res) res (list res)))))
domcox@8443 78 opgroup)))
domcox@8443 79 ops)
domcox@8443 80 :test 'equal)))
domcox@8443 81
domcox@8443 82 ;; This inserts the bulk of the code.
domcox@8443 83 (require 'cc-mode)
domcox@8443 84
domcox@8443 85 ;; These are only required at compile time to get the sources for the
domcox@8443 86 ;; language constants. (The cc-fonts require and the font-lock
domcox@8443 87 ;; related constants could additionally be put inside an
domcox@8443 88 ;; (eval-after-load "font-lock" ...) but then some trickery is
domcox@8443 89 ;; necessary to get them compiled.)
domcox@8443 90 (eval-when-compile
domcox@8443 91 (let ((load-path
domcox@8443 92 (if (and (boundp 'byte-compile-dest-file)
domcox@8443 93 (stringp byte-compile-dest-file))
domcox@8443 94 (cons (file-name-directory byte-compile-dest-file) load-path)
domcox@8443 95 load-path)))
domcox@8443 96 (load "cc-mode" nil t)
domcox@8443 97 (load "cc-fonts" nil t)
domcox@8443 98 (load "cc-langs" nil t)))
domcox@8443 99
domcox@8443 100 (eval-and-compile
domcox@8443 101 ;; Make our mode known to the language constant system. Use Java
domcox@8443 102 ;; mode as the fallback for the constants we don't change here.
domcox@8443 103 ;; This needs to be done also at compile time since the language
domcox@8443 104 ;; constants are evaluated then.
domcox@8443 105 (c-add-language 'vala-mode 'java-mode))
domcox@8443 106
domcox@8443 107 ;; Java uses a series of regexes to change the font-lock for class
domcox@8443 108 ;; references. The problem comes in because Java uses Pascal (leading
domcox@8443 109 ;; space in names, SomeClass) for class and package names, but
domcox@8443 110 ;; Camel-casing (initial lowercase, upper case in words,
domcox@8443 111 ;; i.e. someVariable) for variables.
domcox@8443 112 ;;(error (byte-compile-dest-file))
domcox@8443 113 ;;(error (c-get-current-file))
domcox@8443 114 (c-lang-defconst c-opt-after-id-concat-key
domcox@8443 115 vala (if (c-lang-const c-opt-identifier-concat-key)
domcox@8443 116 (c-lang-const c-symbol-start)))
domcox@8443 117
domcox@8443 118 (c-lang-defconst c-basic-matchers-before
domcox@8443 119 vala `(
domcox@8443 120 ;;;; Font-lock the attributes by searching for the
domcox@8443 121 ;;;; appropriate regex and marking it as TODO.
domcox@8443 122 ;;,`(,(concat "\\(" vala-attribute-regex "\\)")
domcox@8443 123 ;; 0 font-lock-function-name-face)
domcox@8443 124
domcox@8443 125 ;; Put a warning face on the opener of unclosed strings that
domcox@8443 126 ;; can't span lines. Later font
domcox@8443 127 ;; lock packages have a `font-lock-syntactic-face-function' for
domcox@8443 128 ;; this, but it doesn't give the control we want since any
domcox@8443 129 ;; fontification done inside the function will be
domcox@8443 130 ;; unconditionally overridden.
domcox@8443 131 ,(c-make-font-lock-search-function
domcox@8443 132 ;; Match a char before the string starter to make
domcox@8443 133 ;; `c-skip-comments-and-strings' work correctly.
domcox@8443 134 (concat ".\\(" c-string-limit-regexp "\\)")
domcox@8443 135 '((c-font-lock-invalid-string)))
domcox@8443 136
domcox@8443 137 ;; Fontify keyword constants.
domcox@8443 138 ,@(when (c-lang-const c-constant-kwds)
domcox@8443 139 (let ((re (c-make-keywords-re nil
domcox@8443 140 (c-lang-const c-constant-kwds))))
domcox@8443 141 `((eval . (list ,(concat "\\<\\(" re "\\)\\>")
domcox@8443 142 1 c-constant-face-name)))))
domcox@8443 143
domcox@8443 144 ;; Fontify all keywords except the primitive types.
domcox@8443 145 ,`(,(concat "\\<" (c-lang-const c-regular-keywords-regexp))
domcox@8443 146 1 font-lock-keyword-face)
domcox@8443 147
domcox@8443 148 ;; Fontify leading identifiers in fully
domcox@8443 149 ;; qualified names like "Foo.Bar".
domcox@8443 150 ,@(when (c-lang-const c-opt-identifier-concat-key)
domcox@8443 151 `((,(byte-compile
domcox@8443 152 `(lambda (limit)
domcox@8443 153 (while (re-search-forward
domcox@8443 154 ,(concat "\\(\\<" ; 1
domcox@8443 155 "\\(" (c-lang-const c-symbol-key)
domcox@8443 156 "\\)" ; 2
domcox@8443 157 "[ \t\n\r\f\v]*"
domcox@8443 158 (c-lang-const
domcox@8443 159 c-opt-identifier-concat-key)
domcox@8443 160 "[ \t\n\r\f\v]*"
domcox@8443 161 "\\)"
domcox@8443 162 "\\("
domcox@8443 163 (c-lang-const
domcox@8443 164 c-opt-after-id-concat-key)
domcox@8443 165 "\\)")
domcox@8443 166 limit t)
domcox@8443 167 (unless (progn
domcox@8443 168 (goto-char (match-beginning 0))
domcox@8443 169 (c-skip-comments-and-strings limit))
domcox@8443 170 (or (get-text-property (match-beginning 2) 'face)
domcox@8443 171 (c-put-font-lock-face (match-beginning 2)
domcox@8443 172 (match-end 2)
domcox@8443 173 c-reference-face-name))
domcox@8443 174 (goto-char (match-end 1)))))))))
domcox@8443 175 ))
domcox@8443 176
domcox@8443 177 ;; Vala does not allow a leading qualifier operator. It also doesn't
domcox@8443 178 ;; allow the ".*" construct of Java. So, we redo this regex without
domcox@8443 179 ;; the "\\|\\*" regex.
domcox@8443 180 (c-lang-defconst c-identifier-key
domcox@8443 181 vala (concat "\\(" (c-lang-const c-symbol-key) "\\)" ; 1
domcox@8443 182 (concat "\\("
domcox@8443 183 "[ \t\n\r\f\v]*"
domcox@8443 184 (c-lang-const c-opt-identifier-concat-key)
domcox@8443 185 "[ \t\n\r\f\v]*"
domcox@8443 186 (concat "\\("
domcox@8443 187 "\\(" (c-lang-const c-symbol-key) "\\)"
domcox@8443 188 "\\)")
domcox@8443 189 "\\)*")))
domcox@8443 190
domcox@8443 191 ;; Vala has a few rules that are slightly different than Java for
domcox@8443 192 ;; operators. This also removed the Java's "super" and replaces it
domcox@8443 193 ;; with the Vala's "base".
domcox@8443 194 (c-lang-defconst c-operators
domcox@8443 195 vala `((prefix "base")))
domcox@8443 196
domcox@8443 197 ;; Vala directives ?
domcox@8443 198 ;; (c-lang-defconst c-opt-cpp-prefix
domcox@8443 199 ;; csharp "^\\s *#.*")
domcox@8443 200
domcox@8443 201
domcox@8443 202 ;; Vala uses the following assignment operators
domcox@8443 203 (c-lang-defconst c-assignment-operators
domcox@8443 204 vala '("=" "*=" "/=" "%=" "+=" "-=" ">>=" "<<="
domcox@8443 205 "&=" "^=" "|=" "++" "--"))
domcox@8443 206
domcox@8443 207 ;; This defines the primative types for Vala
domcox@8443 208 (c-lang-defconst c-primitive-type-kwds
domcox@8443 209 vala '("void" "char" "int" "float" "double" "string"))
domcox@8443 210
domcox@8443 211 ;; The keywords that define that the following is a type, such as a
domcox@8443 212 ;; class definition.
domcox@8443 213 (c-lang-defconst c-type-prefix-kwds
domcox@8443 214 vala '("class" "interface" "struct" "enum" "signal"))
domcox@8443 215
domcox@8443 216 ;; Type modifier keywords. They appear anywhere in types, but modifiy
domcox@8443 217 ;; instead create one.
domcox@8443 218 (c-lang-defconst c-type-modifier-kwds
domcox@8443 219 vala '("const"))
domcox@8443 220
domcox@8443 221 ;; Structures that are similiar to classes.
domcox@8443 222 (c-lang-defconst c-class-decl-kwds
domcox@8443 223 vala '("class" "interface"))
domcox@8443 224
domcox@8443 225 ;; The various modifiers used for class and method descriptions.
domcox@8443 226 (c-lang-defconst c-modifier-kwds
domcox@8443 227 vala '("public" "partial" "private" "const" "abstract"
domcox@8443 228 "protected" "ref" "in" "out" "static" "virtual"
domcox@8443 229 "override" "params" "internal" "weak" "owned"
domcox@8443 230 "unowned"))
domcox@8443 231
domcox@8443 232 ;; We don't use the protection level stuff because it breaks the
domcox@8443 233 ;; method indenting. Not sure why, though.
domcox@8443 234 (c-lang-defconst c-protection-kwds
domcox@8443 235 vala nil)
domcox@8443 236
domcox@8443 237 ;; Define the keywords that can have something following after them.
domcox@8443 238 (c-lang-defconst c-type-list-kwds
domcox@8443 239 vala '("struct" "class" "interface" "is" "as"
domcox@8443 240 "delegate" "event" "set" "get" "add" "remove"
domcox@8443 241 "callback" "signal" "var" "default"))
domcox@8443 242
domcox@8443 243 ;; This allows the classes after the : in the class declartion to be
domcox@8443 244 ;; fontified.
domcox@8443 245 (c-lang-defconst c-typeless-decl-kwds
domcox@8443 246 vala '(":"))
domcox@8443 247
domcox@8443 248 ;; Sets up the enum to handle the list properly
domcox@8443 249 (c-lang-defconst c-brace-list-decl-kwds
domcox@8443 250 vala '("enum" "errordomain"))
domcox@8443 251
domcox@8443 252 ;; We need to remove Java's package keyword
domcox@8443 253 (c-lang-defconst c-ref-list-kwds
domcox@8443 254 vala '("using" "namespace" "construct"))
domcox@8443 255
domcox@8443 256 ;; Follow-on blocks that don't require a brace
domcox@8443 257 (c-lang-defconst c-block-stmt-2-kwds
domcox@8443 258 vala '("for" "if" "switch" "while" "catch" "foreach" "lock"))
domcox@8443 259
domcox@8443 260 ;; Statements that break out of braces
domcox@8443 261 (c-lang-defconst c-simple-stmt-kwds
domcox@8443 262 vala '("return" "continue" "break" "throw"))
domcox@8443 263
domcox@8443 264 ;; Statements that allow a label
domcox@8443 265 ;; TODO?
domcox@8443 266 (c-lang-defconst c-before-label-kwds
domcox@8443 267 vala nil)
domcox@8443 268
domcox@8443 269 ;; Constant keywords
domcox@8443 270 (c-lang-defconst c-constant-kwds
domcox@8443 271 vala '("true" "false" "null"))
domcox@8443 272
domcox@8443 273 ;; Keywords that start "primary expressions."
domcox@8443 274 (c-lang-defconst c-primary-expr-kwds
domcox@8443 275 vala '("this" "base"))
domcox@8443 276
domcox@8443 277 ;; We need to treat namespace as an outer block to class indenting
domcox@8443 278 ;; works properly.
domcox@8443 279 (c-lang-defconst c-other-block-decl-kwds
domcox@8443 280 vala '("namespace"))
domcox@8443 281
domcox@8443 282 ;; We need to include the "in" for the foreach
domcox@8443 283 (c-lang-defconst c-other-kwds
domcox@8443 284 vala '("in" "sizeof" "typeof"))
domcox@8443 285
domcox@8443 286 (require 'cc-awk)
domcox@8443 287
domcox@8443 288 (c-lang-defconst c-at-vsemi-p-fn
domcox@8443 289 vala 'c-awk-at-vsemi-p)
domcox@8443 290
domcox@8443 291
domcox@8443 292 (defcustom vala-font-lock-extra-types nil
domcox@8443 293 "*List of extra types (aside from the type keywords) to recognize in Vala mode.
domcox@8443 294 Each list item should be a regexp matching a single identifier.")
domcox@8443 295
domcox@8443 296 (defconst vala-font-lock-keywords-1 (c-lang-const c-matchers-1 vala)
domcox@8443 297 "Minimal highlighting for Vala mode.")
domcox@8443 298
domcox@8443 299 (defconst vala-font-lock-keywords-2 (c-lang-const c-matchers-2 vala)
domcox@8443 300 "Fast normal highlighting for Vala mode.")
domcox@8443 301
domcox@8443 302 (defconst vala-font-lock-keywords-3 (c-lang-const c-matchers-3 vala)
domcox@8443 303 "Accurate normal highlighting for Vala mode.")
domcox@8443 304
domcox@8443 305 (defvar vala-font-lock-keywords vala-font-lock-keywords-3
domcox@8443 306 "Default expressions to highlight in Vala mode.")
domcox@8443 307
domcox@8443 308 (defvar vala-mode-syntax-table
domcox@8443 309 nil
domcox@8443 310 "Syntax table used in vala-mode buffers.")
domcox@8443 311 (or vala-mode-syntax-table
domcox@8443 312 (setq vala-mode-syntax-table
domcox@8443 313 (funcall (c-lang-const c-make-mode-syntax-table vala))))
domcox@8443 314
domcox@8443 315 (defvar vala-mode-abbrev-table nil
domcox@8443 316 "Abbreviation table used in vala-mode buffers.")
domcox@8443 317 (c-define-abbrev-table 'vala-mode-abbrev-table
domcox@8443 318 ;; Keywords that if they occur first on a line
domcox@8443 319 ;; might alter the syntactic context, and which
domcox@8443 320 ;; therefore should trig reindentation when
domcox@8443 321 ;; they are completed.
domcox@8443 322 '(("else" "else" c-electric-continued-statement 0)
domcox@8443 323 ("while" "while" c-electric-continued-statement 0)
domcox@8443 324 ("catch" "catch" c-electric-continued-statement 0)
domcox@8443 325 ("finally" "finally" c-electric-continued-statement 0)))
domcox@8443 326
domcox@8443 327 (defvar vala-mode-map (let ((map (c-make-inherited-keymap)))
domcox@8443 328 ;; Add bindings which are only useful for Vala
domcox@8443 329 map)
domcox@8443 330 "Keymap used in vala-mode buffers.")
domcox@8443 331
domcox@8443 332 ;;(easy-menu-define vala-menu vala-mode-map "Vala Mode Commands"
domcox@8443 333 ;; ;; Can use `vala' as the language for `c-mode-menu'
domcox@8443 334 ;; ;; since its definition covers any language. In
domcox@8443 335 ;; ;; this case the language is used to adapt to the
domcox@8443 336 ;; ;; nonexistence of a cpp pass and thus removing some
domcox@8443 337 ;; ;; irrelevant menu alternatives.
domcox@8443 338 ;; (cons "Vala" (c-lang-const c-mode-menu vala)))
domcox@8443 339
domcox@8443 340 ;;; Autoload mode trigger
domcox@8443 341 (add-to-list 'auto-mode-alist '("\\.vala$" . vala-mode))
domcox@8443 342 (add-to-list 'auto-mode-alist '("\\.vapi$" . vala-mode))
domcox@8443 343
domcox@8443 344 ;; Custom variables
domcox@8443 345 (defcustom vala-mode-hook nil
domcox@8443 346 "*Hook called by `vala-mode'."
domcox@8443 347 :type 'hook
domcox@8443 348 :group 'c)
domcox@8443 349
domcox@8443 350 ;;; The entry point into the mode
domcox@8443 351 ;;;###autoload
domcox@8443 352 (defun vala-mode ()
domcox@8443 353 "Major mode for editing Vala code.
domcox@8443 354 This is a simple example of a separate mode derived from CC Mode
domcox@8443 355 to support a language with syntax similar to
domcox@8443 356 C#/C/C++/ObjC/Java/IDL/Pike.
domcox@8443 357
domcox@8443 358 The hook `c-mode-common-hook' is run with no args at mode
domcox@8443 359 initialization, then `vala-mode-hook'.
domcox@8443 360
domcox@8443 361 Key bindings:
domcox@8443 362 \\{vala-mode-map}"
domcox@8443 363 (interactive)
domcox@8443 364 (kill-all-local-variables)
domcox@8443 365 (c-initialize-cc-mode t)
domcox@8443 366 (set-syntax-table vala-mode-syntax-table)
domcox@8443 367 (setq major-mode 'vala-mode
domcox@8443 368 mode-name "Vala"
domcox@8443 369 local-abbrev-table vala-mode-abbrev-table
domcox@8443 370 abbrev-mode t)
domcox@8443 371 (use-local-map c-mode-map)
domcox@8443 372 ;; `c-init-language-vars' is a macro that is expanded at compile
domcox@8443 373 ;; time to a large `setq' with all the language variables and their
domcox@8443 374 ;; customized values for our language.
domcox@8443 375 (c-init-language-vars vala-mode)
domcox@8443 376 ;; `c-common-init' initializes most of the components of a CC Mode
domcox@8443 377 ;; buffer, including setup of the mode menu, font-lock, etc.
domcox@8443 378 ;; There's also a lower level routine `c-basic-common-init' that
domcox@8443 379 ;; only makes the necessary initialization to get the syntactic
domcox@8443 380 ;; analysis and similar things working.
domcox@8443 381 (c-common-init 'vala-mode)
domcox@8443 382 ;;(easy-menu-add vala-menu)
domcox@8443 383 (c-set-style "linux")
domcox@8443 384 (setq indent-tabs-mode t)
domcox@8443 385 (setq c-basic-offset 4)
domcox@8443 386 (setq tab-width 4)
domcox@8443 387 (c-toggle-auto-newline -1)
domcox@8443 388 (c-toggle-hungry-state -1)
domcox@8443 389 (run-hooks 'c-mode-common-hook)
domcox@8443 390 (run-hooks 'vala-mode-hook)
domcox@8443 391 (c-update-modeline))
domcox@8443 392
domcox@8443 393 (provide 'vala-mode)
domcox@8443 394
domcox@8443 395 ;;; vala-mode.el ends here