add ac-dcd-add-imports function

This function sends import flags of the current DUB project to
dcd-server.
This commit is contained in:
Sergei Nosov 2014-08-11 17:49:29 +04:00
parent a7679c7003
commit 4758db4161
1 changed files with 77 additions and 0 deletions

View File

@ -533,6 +533,83 @@ output is just like following.\n
(cons nil nil)))
))
(defun ac-dcd-parent-directory (dir)
"Returns parent directory of dir"
(when dir
(file-name-directory (directory-file-name (expand-file-name dir)))))
(defun ac-dcd-search-file-up (name &optional path)
"Searches for file `name' in parent directories recursively"
(let* ((tags-file-name (concat path name))
(parent (ac-dcd-parent-directory path))
(path (or path default-directory))
)
(cond
((file-exists-p tags-file-name) tags-file-name)
((string= parent path) nil)
(t (ac-dcd-search-file-up name parent)))))
(defun ac-dcd-find-imports-dub ()
"Extract import flags from \"dub describe\" output."
(let ((dub-root-dir (ac-dcd-parent-directory
(or (ac-dcd-search-file-up "dub.json" default-directory)
(ac-dcd-search-file-up "package.json" default-directory))))
(dub-executable "dub"))
(when dub-root-dir
(with-temp-buffer
(let ((default-directory dub-root-dir))
(call-process dub-executable nil (current-buffer) nil "describe"))
(require 'json)
(let* ((json-object-type 'hash-table)
(describe-hash (json-read-from-string (buffer-string)))
(packages-array (gethash "packages" describe-hash))
(imports-list '()))
(mapcar
(lambda (package)
(let ((package-path (gethash "path" package))
(import-paths-array (gethash "importPaths" package)))
(mapcar
(lambda (import-path)
(add-to-list 'imports-list
(concat "-I" package-path import-path)))
import-paths-array)))
packages-array)
imports-list)))))
(defun ac-dcd-find-imports-std ()
"Extract import flags from dmd.conf file."
(require 'cl)
(let ((dmd-conf-filename
(find-if 'file-exists-p
(list
;; TODO: the first directory to look into should be dmd's current
;; working dir
(concat (getenv "HOME") "/dmd.conf")
(concat (ac-dcd-parent-directory (executable-find "dmd")) "dmd.conf")
"/etc/dmd.conf"))))
;; TODO: this extracting procedure is pretty rough, it just searches for
;; the first occurrence of the DFLAGS
(save-window-excursion
(with-temp-buffer
(find-file dmd-conf-filename)
(goto-char (point-min))
(search-forward "\nDFLAGS")
(skip-chars-forward " =")
(let ((flags-list (split-string (buffer-substring-no-properties
(point) (line-end-position)))))
(remove-if-not '(lambda (s)
(string-prefix-p "-I" s))
flags-list))))))
(defun ac-dcd-add-imports ()
"Send import flags of the current DUB project to dcd-server."
(interactive)
(ac-dcd-call-process ""
(append
(ac-dcd-find-imports-std)
(ac-dcd-find-imports-dub))))
(provide 'ac-dcd)
;;; ac-dcd.el ends here