;;; dart-mode.el --- a Dart mode for emacs based upon CC mode.

;; This program 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 2 of the License, or
;; (at your option) any later version.
;;
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; 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., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.

;;; Commentary:

;; This is a basic Dart mode based on Martin Stjernholm's GPL'd
;; derived-mode-ex.el template.  It uses cc-mode and falls back on
;; Java for basic rules.
;;
;; Note: The interface used in this file requires CC Mode 5.30 or
;; later.

;;; Code:

(require 'cc-mode)
(require 'compile)

;; These are only required at compile time to get the sources for the
;; language constants.  (The cc-fonts require and the font-lock
;; related constants could additionally be put inside an
;; (eval-after-load "font-lock" ...) but then some trickery is
;; necessary to get them compiled.)
(eval-when-compile
  (require 'cc-langs)
  (require 'cc-fonts))

(eval-and-compile
  ;; Make our mode known to the language constant system.  Use Java
  ;; mode as the fallback for the constants we don't change here.
  ;; This needs to be done also at compile time since the language
  ;; constants are evaluated then.
  (c-add-language 'dart-mode 'java-mode))

;; Dart has no boolean but a string and a vector type.
(c-lang-defconst c-primitive-type-kwds
  dart (append '("bool" "var")
             (delete "boolean"
                     ;; Use append to not be destructive on the
                     ;; return value below.
                     (append
                      ;; Due to the fallback to Java, we need not give
                      ;; a language to `c-lang-const'.
                      (c-lang-const c-primitive-type-kwds)
                      nil))))

;; Recognize member init lists after colons in Dart.
(c-lang-defconst c-nonlabel-token-key
  dart (concat "\\s\(\\|" (c-lang-const c-nonlabel-token-key)))

;; No cpp in this language, but there's still a "#include" directive to
;; fontify.  (The definitions for the extra keywords above are enough
;; to incorporate them into the fontification regexps for types and
;; keywords, so no additional font-lock patterns are required.)
(c-lang-defconst c-cpp-matchers
  dart (cons
      ;; Use the eval form for `font-lock-keywords' to be able to use
      ;; the `c-preprocessor-face-name' variable that maps to a
      ;; suitable face depending on the (X)Emacs version.
      '(eval . (list "^\\s *\\(#include\\)\\>\\(.*\\)"
                     (list 1 c-preprocessor-face-name)
                     '(2 font-lock-string-face)))
      ;; There are some other things in `c-cpp-matchers' besides the
      ;; preprocessor support, so include it.
      (c-lang-const c-cpp-matchers)))

(defcustom dart-font-lock-extra-types nil
  "*List of extra types (aside from the type keywords) to recognize in Dart mode.
Each list item should be a regexp matching a single identifier.")

(defconst dart-font-lock-keywords-1 (c-lang-const c-matchers-1 dart)
  "Minimal highlighting for Dart mode.")

(defconst dart-font-lock-keywords-2 (c-lang-const c-matchers-2 dart)
  "Fast normal highlighting for Dart mode.")

(defconst dart-font-lock-keywords-3 (c-lang-const c-matchers-3 dart)
  "Accurate normal highlighting for Dart mode.")

(defvar dart-font-lock-keywords dart-font-lock-keywords-3
  "Default expressions to highlight in Dart mode.")

(defvar dart-mode-syntax-table nil
  "Syntax table used in dart-mode buffers.")
(or dart-mode-syntax-table
    (setq dart-mode-syntax-table
          (funcall (c-lang-const c-make-mode-syntax-table dart))))

(defvar dart-mode-abbrev-table nil
  "Abbreviation table used in dart-mode buffers.")
(c-define-abbrev-table 'dart-mode-abbrev-table
  ;; Keywords that if they occur first on a line might alter the
  ;; syntactic context, and which therefore should trig reindentation
  ;; when they are completed.
  '(("else" "else" c-electric-continued-statement 0)
    ("while" "while" c-electric-continued-statement 0)
    ("catch" "catch" c-electric-continued-statement 0)
    ("finally" "finally" c-electric-continued-statement 0)))

(defvar dart-mode-map (let ((map (c-make-inherited-keymap)))
                      ;; Add bindings which are only useful for Dart
                      map)
  "Keymap used in dart-mode buffers.")

(easy-menu-define dart-menu dart-mode-map "Dart Mode Commands"
                  ;; Can use `dart' as the language for `c-mode-menu'
                  ;; since its definition covers any language.  In
                  ;; this case the language is used to adapt to the
                  ;; nonexistence of a cpp pass and thus removing some
                  ;; irrelevant menu alternatives.
                  (cons "Dart" (c-lang-const c-mode-menu dart)))

;;;###autoload
(add-to-list 'auto-mode-alist '("\\.dart\\'" . dart-mode))

;;;###autoload
(defun dart-mode ()
  "Major mode for editing Dart code.
This is a simple example of a separate mode derived from CC Mode to
support a language with syntax similar to C/C++/ObjC/Java/IDL/Pike.

The hook `c-mode-common-hook' is run with no args at mode
initialization, then `dart-mode-hook'.

Key bindings:
\\{dart-mode-map}"
  (interactive)
  (kill-all-local-variables)
  (c-initialize-cc-mode t)
  (set-syntax-table dart-mode-syntax-table)
  (setq major-mode 'dart-mode
        mode-name "Dart"
        local-abbrev-table dart-mode-abbrev-table
        abbrev-mode t)
  (use-local-map dart-mode-map)
  ;; `c-init-language-vars' is a macro that is expanded at compile
  ;; time to a large `setq' with all the language variables and their
  ;; customized values for our language.
  (c-init-language-vars dart-mode)
  ;; `c-common-init' initializes most of the components of a CC Mode
  ;; buffer, including setup of the mode menu, font-lock, etc.
  ;; There's also a lower level routine `c-basic-common-init' that
  ;; only makes the necessary initialization to get the syntactic
  ;; analysis and similar things working.
  (c-common-init 'dart-mode)
  (easy-menu-add dart-menu)
  (run-hooks 'c-mode-common-hook)
  (run-hooks 'dart-mode-hook)
  (c-update-modeline))

(add-to-list 'compilation-error-regexp-alist 'dart)
(add-to-list 'compilation-error-regexp-alist-alist '(dart "Function: '[^']*' url: 'file://\\([^']*\\)' line:\\([0-9]*\\) col:\\([0-9]*\\)" 1 2 3))

(provide 'dart-mode)

;;; dart-mode.el ends here
