branch: elpa/swift-mode commit cbb19f29dcdacfceef802391f1147d4f581e5798 Author: Chris Barrett <chris.d.barr...@me.com> Commit: Chris Barrett <chris.d.barr...@me.com>
Add basic font-locking --- swift-mode.el | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/swift-mode.el b/swift-mode.el index 7afe58b..40de349 100644 --- a/swift-mode.el +++ b/swift-mode.el @@ -26,7 +26,80 @@ ;;; Code: +(require 'dash) +(require 'rx) +;; Font lock. + +(defvar swift-mode--declaration-keywords + '("class" "deinit" "enum" "extension" "func" "import" "init" "let" + "protocol" "static" "struct" "subscript" "typealias" "var")) + +(defvar swift-mode--statment-keywords + '("break" "case" "continue" "default" "do" "else" "fallthrough" + "if" "in" "for" "return" "switch" "where" "while")) + +(defvar swift-mode--expression-keywords + '("as" "dynamicType" "is" "new" "super" "self" "Self" "Type" + "__COLUMN__" "__FILE__" "__FUNCTION__" "__LINE__")) + +(defvar swift-mode--contextual-keywords + '("associativity" "didSet" "get" "infix" "inout" "left" "mutating" "none" + "nonmutating" "operator" "override" "postfix" "precedence" "prefix" "right" + "set" "unowned" "unowned(safe)" "unowned(unsafe)" "weak" "willSet")) + +(defvar swift-mode--keywords + (-flatten (list swift-mode--declaration-keywords + swift-mode--statment-keywords + swift-mode--expression-keywords + swift-mode--contextual-keywords)) + "Keywords used in the Swift language.") + +(defvar swift-mode--font-lock-defaults + (list + (list + + ;; Keywords + ;; + ;; Swift allows reserved words to be used as identifiers when enclosed + ;; with backticks, in which case they should be highlighted as + ;; identifiers, not keywords. + (cons + (rx-to-string `(and (or bol (not (any "`"))) bow + (group (or ,@swift-mode--keywords)) + eow) + t) + 1) + + ;; Types + ;; + ;; Any token beginning with an uppercase character is highlighted as a + ;; type. + (cons (rx bow upper (+ word) eow) + font-lock-type-face) + + ;; Function names + ;; + ;; Any string beginning after the `func' keyword is highlighted as a + ;; function name. + (cons (rx bow "func" eow (+ space) (group bow (+ word) eow)) + (list 1 font-lock-function-name-face))) + ) + "Font lock values for `swift-mode'.") + +;; Mode definition. + +(defvar swift-mode-map + (let ((map (make-sparse-keymap))) + map) + "Keymap used in `swift-mode'.") + +(define-derived-mode swift-mode prog-mode "Swift" + "Major mode for Apple's Swift programming language. + +\\<swift-mode-map>" + :group 'swift + (setq-local font-lock-defaults swift-mode--font-lock-defaults)) (provide 'swift-mode)