emacs-config/.cask/26.3/elpa/flycheck-swift-20170129.549/flycheck-swift.el
2020-04-28 12:47:35 +02:00

138 lines
5.4 KiB
EmacsLisp

;;; flycheck-swift.el --- Flycheck extension for Apple's Swift. -*- lexical-binding: t -*-
;; Copyright (C) 2014-2016 taku0, Chris Barrett, Bozhidar Batsov, Arthur Evstifeev
;; Authors: taku0 (http://github.com/taku0)
;; Chris Barrett <chris.d.barrett@me.com>
;; Bozhidar Batsov <bozhidar@batsov.com>
;; Arthur Evstifeev <lod@pisem.net>
;; Version: 2.0
;; Package-Version: 20170129.549
;; Package-Requires: ((emacs "24.4") (flycheck "0.25"))
;; Keywords: languages swift
;; This file is not part of GNU Emacs.
;; 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 3 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. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; Flycheck extension for Apple's Swift.
;;; Code:
(require 'flycheck)
(require 'cl-lib)
;;; Flycheck
(flycheck-def-executable-var swift "swiftc")
(flycheck-def-option-var flycheck-swift-extra-flags nil swift
"Extra flags prepended to arguments of swiftc"
:type '(repeat (string :tag "Flags"))
:safe #'flycheck-string-list-p)
(flycheck-def-option-var flycheck-swift-sdk-path nil swift
"A name of the targeted SDK or path to the targeted SDK"
:type '(choice (const :tag "Don't link against sdk" nil)
(string :tag "Targeted SDK path or name"))
:safe #'stringp)
(flycheck-def-option-var flycheck-swift-linked-sources '("*.swift") swift
"Source files path to link against. Can be glob, i.e. *.swift"
:type '(repeat (string :tag "Linked Sources"))
:safe #'flycheck-string-list-p)
(flycheck-def-option-var flycheck-swift-framework-search-paths nil swift
"A list of framework search paths"
:type '(repeat (directory :tag "Include directory"))
:safe #'flycheck-string-list-p)
(flycheck-def-option-var flycheck-swift-cc-include-search-paths nil swift
"A list of include file search paths to pass to the Objective-C compiler"
:type '(repeat (directory :tag "Include directory"))
:safe #'flycheck-string-list-p)
(flycheck-def-option-var flycheck-swift-target nil swift
"Target used by swift compiler"
:type '(choice (const :tag "Don't specify target" nil)
(string :tag "Build target"))
:safe #'stringp)
(flycheck-def-option-var flycheck-swift-import-objc-header nil swift
"Objective C header file to import, if any"
:type '(choice (const :tag "Don't specify objective C bridging header" nil)
(string :tag "Objective C bridging header path"))
:safe #'stringp)
(flycheck-define-checker swift
"Flycheck plugin for for Apple's Swift programming language."
:command ("swiftc"
(eval flycheck-swift-extra-flags)
"-parse"
(option "-sdk" flycheck-swift-sdk-path)
(option-list "-F" flycheck-swift-framework-search-paths)
;; Swift compiler will complain about redeclaration
;; if we will include original file along with
;; temporary source file created by flycheck.
;; We also don't want a hidden emacs interlock files.
(eval
(let ((source-original (expand-file-name
(car
(flycheck-substitute-argument
'source-original
'swift))))
(default-directory-old default-directory))
(unwind-protect
(progn
(setq default-directory
(file-name-directory source-original))
(cl-remove-if
#'(lambda (path)
(or
(string-match "^\\.#" (file-name-nondirectory path))
(equal source-original path)))
(cl-mapcan
#'(lambda (path) (file-expand-wildcards path t))
flycheck-swift-linked-sources)))
(setq default-directory default-directory-old))))
(option "-target" flycheck-swift-target)
(option "-import-objc-header" flycheck-swift-import-objc-header)
(option-list "-Xcc" flycheck-swift-cc-include-search-paths
flycheck-swift-prepend-for-cc-include-search-path)
source)
:error-patterns ((error line-start (file-name) ":" line ":" column ": "
"error: " (message) line-end)
(warning line-start (file-name) ":" line ":" column ": "
"warning: " (message) line-end))
:modes (swift-mode swift3-mode))
(defun flycheck-swift-prepend-for-cc-include-search-path (opt path)
"Return list for -Xcc -I option.
OPT is assumed to be -Xcc.
PATH is a include search path."
(list opt (concat "-I" path)))
;;;###autoload
(defun flycheck-swift-setup ()
"Setup Flycheck for Swift."
(interactive)
;; Add checkers in reverse order, because `add-to-list' adds to front.
(add-to-list 'flycheck-checkers 'swift))
(provide 'flycheck-swift)
;;; flycheck-swift.el ends here