mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
259 lines
9.8 KiB
EmacsLisp
259 lines
9.8 KiB
EmacsLisp
;===--- swift-project-settings.el - Swift project's format conventions ---===;
|
|
;
|
|
; This source file is part of the Swift.org open source project
|
|
;
|
|
; Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors
|
|
; Licensed under Apache License v2.0 with Runtime Library Exception
|
|
;
|
|
; See http://swift.org/LICENSE.txt for license information
|
|
; See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
;
|
|
;===----------------------------------------------------------------------===;
|
|
;
|
|
; Emacs-lisp support for automatically formatting things according to this
|
|
; project's conventions. To prevent this file from being automatically
|
|
; loaded, add (provide 'swift-project-settings) to your .emacs
|
|
;
|
|
;===----------------------------------------------------------------------===;
|
|
|
|
|
|
;; Associate .swift files with swift-mode
|
|
(setq auto-mode-alist
|
|
(append '(("\\.swift$" . swift-mode) ("\\.gyb$" python-mode t)) auto-mode-alist))
|
|
|
|
;; Make sure we know where to find swift-mode
|
|
(autoload 'swift-mode "swift-mode"
|
|
"Major mode for editing SWIFT source files.
|
|
\\{swift-mode-map}
|
|
Runs swift-mode-hook on startup."
|
|
:interactive
|
|
)
|
|
|
|
(require 'cc-styles)
|
|
|
|
;; This style is appropriate for indenting Swift's C++ source
|
|
(c-add-style "swift"
|
|
'((c-basic-offset . 2)
|
|
(c-offsets-alist
|
|
(namespace-open . 0)
|
|
(template-args-cont c-lineup-template-args +)
|
|
(knr-argdecl-intro . +)
|
|
(substatement-open . +)
|
|
(substatement-label . 2)
|
|
(label . 2)
|
|
(inline-open . +)
|
|
(inexpr-class . +)
|
|
(defun-open . 0)
|
|
(func-decl-cont . +)
|
|
(knr-argdecl . 0)
|
|
(topmost-intro-cont . c-lineup-topmost-intro-cont)
|
|
(annotation-top-cont . 0)
|
|
(annotation-var-cont . +)
|
|
(member-init-cont . c-lineup-multi-inher)
|
|
(block-open . 0)
|
|
(brace-list-open . 0)
|
|
(brace-entry-open . 0)
|
|
(statement-case-open . 0)
|
|
(do-while-closure . 0)
|
|
(catch-clause . 0)
|
|
(stream-op . c-lineup-streamop)
|
|
(cpp-macro-cont . +)
|
|
(friend . 0)
|
|
(objc-method-intro .
|
|
[0])
|
|
(objc-method-args-cont . c-lineup-ObjC-method-args)
|
|
(objc-method-call-cont c-lineup-ObjC-method-call-colons c-lineup-ObjC-method-call +)
|
|
(extern-lang-open . 0)
|
|
(module-open . 0)
|
|
(composition-open . 0)
|
|
(extern-lang-close . 0)
|
|
(module-close . 0)
|
|
(composition-close . 0)
|
|
(inextern-lang . +)
|
|
(inmodule . +)
|
|
(incomposition . +)
|
|
(inlambda . c-lineup-inexpr-block)
|
|
(lambda-intro-cont . +)
|
|
(inexpr-statement . +)
|
|
(topmost-intro . 0)
|
|
(defun-block-intro . +)
|
|
(statement . 0)
|
|
(defun-close . 0)
|
|
(statement-cont . +)
|
|
(brace-list-intro . +)
|
|
(brace-list-entry . 0)
|
|
(brace-list-close . 0)
|
|
(statement-block-intro . +)
|
|
(block-close . 0)
|
|
(innamespace . 0)
|
|
(inher-intro . +)
|
|
(class-open . 0)
|
|
(inclass . +)
|
|
(access-label . 0)
|
|
(member-init-intro . +)
|
|
(substatement . +)
|
|
(inline-close . 0)
|
|
(class-close . 0)
|
|
(namespace-close . 0)
|
|
(case-label . -)
|
|
(statement-case-intro . +)
|
|
(cpp-define-intro . +)
|
|
(else-clause . 0)
|
|
(arglist-intro . +)
|
|
(arglist-cont . +)
|
|
(c . c-lineup-C-comments)
|
|
(inher-cont . c-lineup-multi-inher)
|
|
(string . -1000)
|
|
(comment-intro . c-lineup-comment)
|
|
(arglist-cont-nonempty . c-lineup-arglist)
|
|
(arglist-close . c-lineup-close-paren)
|
|
(cpp-macro . -1000))))
|
|
|
|
;; When this file is loaded in response to visiting a file in the
|
|
;; project, it won't have had its major mode set up according to the
|
|
;; project settings yet. For example, Swift files may come up in
|
|
;; Fundamental mode, and C++ files won't use the swift style, unless
|
|
;; we do something. This hack causes the file to be re-mode-ed.
|
|
(set-auto-mode)
|
|
|
|
|
|
(define-skeleton swift-header
|
|
"Insert the Swift header at the top of a file
|
|
|
|
Note: this skeleton presently assumes that comment-start creates
|
|
a comment until end-of-line. Handling paired comment syntax is
|
|
possible, but more work, and someone needs to decide what such an
|
|
Swift header should look like.
|
|
"
|
|
;; prompt
|
|
"Short description (RET for none): "
|
|
|
|
;; v1 is comment-start without trailing whitespace. Presumably
|
|
;; nobody is crazy enough to define a language where whitespace
|
|
;; determines whether something is a comment, but c++ mode and
|
|
;; friends have a space at the end of comment-start, which messes up
|
|
;; the Swift header format.
|
|
;;
|
|
;; When there's no comment syntax defined, we use "//"; precedent is
|
|
;; in the project's README file.
|
|
'(setq v1 (replace-regexp-in-string " +\\'" "" (or comment-start "//")))
|
|
|
|
;; v2 is the name of the file
|
|
'(setq v2 (file-name-nondirectory (buffer-file-name)))
|
|
v1 "===--- " v2
|
|
;; if the short description is empty, eat up the preceding " - "
|
|
" - " str | -3
|
|
" "
|
|
;; v3 is t if there was a short description
|
|
'(setq v3 (> (length str) 0))
|
|
|
|
;; Generate dashes to fill out the rest of the top line
|
|
(make-string (max (- 65 (+ (if v3 (+ 3 (length str)) 0) (length v2))) 3) ?-)
|
|
"===" v1 "\n"
|
|
|
|
;; Use whatever comment character is usual for the current mode in place of "//"
|
|
(replace-regexp-in-string "//" v1
|
|
"//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See http://swift.org/LICENSE.txt for license information
|
|
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
")
|
|
;; if there was a short description, add a section for a longer
|
|
;; description and leave the cursor there
|
|
(when v3
|
|
(replace-regexp-in-string "//" v1
|
|
"//
|
|
// "))
|
|
(when v3 '_)
|
|
(when v3
|
|
(replace-regexp-in-string "//" v1 "
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
")
|
|
))
|
|
|
|
(define-skeleton swift-divider
|
|
"Insert a Swift //===--- ... ---===// divider
|
|
"
|
|
;; prompt
|
|
"Text (RET for none): "
|
|
|
|
;; v1 is comment-start without trailing whitespace. Presumably
|
|
;; nobody is crazy enough to define a language where whitespace
|
|
;; determines whether something is a comment, but c++ mode and
|
|
;; friends have a space at the end of comment-start, which messes up
|
|
;; the Swift header format.
|
|
;;
|
|
;; When there's no comment syntax defined, we use "//"; precedent is
|
|
;; in the project's README file.
|
|
'(setq v1 (replace-regexp-in-string " +\\'" "" (or comment-start "//")))
|
|
|
|
;; v2 is either comment-end stripped of leading whitespace, or if it
|
|
;; is non-empty, v1 all over again
|
|
'(setq v2
|
|
(replace-regexp-in-string "\\` +" ""
|
|
(if (and comment-end (> (length comment-end) 0)) comment-end v1)))
|
|
|
|
v1 "===--- "
|
|
str & " " | -1
|
|
'(setq v3 (length str))
|
|
|
|
;; Generate dashes to fill out the rest of the top line
|
|
(make-string
|
|
(max 3
|
|
(- 77 (current-column) (length v2)))
|
|
?-)
|
|
|
|
"===" v2
|
|
)
|
|
|
|
(defvar swift-project-auto-insert-alist
|
|
;; Currently we match any file and insert the Swift header. We can
|
|
;; make the regexp more specific or filter based on mode if this
|
|
;; doesn't work out.
|
|
'((("" . "Swift header") . swift-header))
|
|
"auto-insert-alist entries that are just for the Swift project"
|
|
)
|
|
|
|
(defadvice auto-insert (around swift-project-auto-insert activate)
|
|
"Modify auto-insert so that swift-project-auto-insert-alist
|
|
takes precedence for files in the Swift project"
|
|
;; Assume that files with c-file-style set to "swift" are
|
|
;; part of the Swift project. Because it's set in
|
|
;; .dir-locals.el, this will apply to all files, not just
|
|
;; those using cc-mode
|
|
(if (and (boundp 'c-file-style) (equal c-file-style "swift"))
|
|
(let ((auto-insert-alist
|
|
(append swift-project-auto-insert-alist auto-insert-alist))
|
|
;; The default is to ask when creating a new file. Inside
|
|
;; this project, we always want the Swift header, so only
|
|
;; prompt if the user has set auto-insert to /always/
|
|
;; prompt.
|
|
(auto-insert-query (if (eq auto-insert-query 'function) nil auto-insert-query)))
|
|
ad-do-it)
|
|
ad-do-it))
|
|
|
|
(push 'swift-stdlibunittest-possibly-expected-assertion compilation-error-regexp-alist)
|
|
(push `(swift-stdlibunittest-possibly-expected-assertion "^\\(\\(?:out\\|err\\)>>> *\\).*\\(?:failed\\(?: at\\|.*file\\)\\|.*: file\\) \\([^,]*\\), line \\([0-9]+\\)$"
|
|
2 3 ,(not :column) 0)
|
|
compilation-error-regexp-alist-alist)
|
|
|
|
(push 'swift-stdlibunittest-stackframe compilation-error-regexp-alist)
|
|
(push `(swift-stdlibunittest-stackframe "^\\(?:\\(?:out\\|err\\)>>> *\\)#[0-9]+: \\(.+\\):\\([0-9]+\\)\\(?: +.*\\)?$"
|
|
1 2 ,(not :column) ,(not :just-a-warning))
|
|
compilation-error-regexp-alist-alist)
|
|
|
|
(push 'swift-stdlibunittest-failure compilation-error-regexp-alist)
|
|
(push `(swift-stdlibunittest-failure "^\\(?:out\\|err\\)>>> check failed at \\([^,]*\\), line \\([0-9]+\\)$"
|
|
1 2 ,(not :column) ,(not :just-a-warning))
|
|
compilation-error-regexp-alist-alist)
|
|
|
|
(provide 'swift-project-settings)
|
|
;; end of swift-project-settings.el
|