branch: master commit 5511be7a40e4c02c1ea38f24c6ce92c5aee32a11 Author: Stephen Leake <stephen_le...@stephe-leake.org> Commit: Stephen Leake <stephen_le...@stephe-leake.org>
Add new files in ada-mode; package version not bumped * packages/ada-mode/ada-project.el: New file. * packages/ada-mode/env-project.el: New file. --- packages/ada-mode/ada-project.el | 81 ++++++++++++++++++++++++++++++++++++++++ packages/ada-mode/env-project.el | 70 ++++++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+) diff --git a/packages/ada-mode/ada-project.el b/packages/ada-mode/ada-project.el new file mode 100644 index 0000000..e917ec3 --- /dev/null +++ b/packages/ada-mode/ada-project.el @@ -0,0 +1,81 @@ +;; ada-project.el - project.el backend for ada-mode projects -*- lexical-binding: t =*- +;; +;; Copyright (C) 2017, 2018, 2019 Free Software Foundation, Inc. +;; +;; Author: Stephen Leake <stephen_le...@stephe-leake.org> +;; Maintainer: Stephen Leake <stephen_le...@stephe-leake.org> +;; Keywords: projects +;; Version: 1.0.0 +;; package-requires: ((emacs "25.0")) +;; +;; This file is part of GNU Emacs. +;; +;; GNU Emacs 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. +;; +;; GNU Emacs 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 GNU Emacs. If not, see <http://www.gnu.org/licenses/>. + +(require 'ada-mode) +(require 'project-patches) +(require 'env-project) +(require 'uniquify-files) + +(cl-defstruct (ada-project + (:include env-project) + (:constructor nil) ;; no default + (:constructor make-ada-project + (&key + env-vars + ada-prj-file + &aux + (ada-prj (expand-file-name ada-prj-file)))) + ) + ada-prj + ;; The ada-mode project file name (absolute). + ) + +(cl-defmethod project-id ((prj ada-project)) + ;; project-id is experimental + (ada-project-ada-prj prj)) + +(cl-defmethod project-library-roots ((prj ada-project)) + ;; Called from project-find-file; result is passed to + ;; project--file-completion-table, where it is ignored. + nil) + +(cl-defmethod project-roots ((prj ada-project)) + ;; Called from project-find-file; result is passed to + ;; project--file-completion-table, where it is ignored. + nil) + +(cl-defmethod project-file-completion-table ((prj ada-project) _dirs) + ;; (ada-prj-get 'src_dir) is more accurate than project-*roots + (let ((iter (make-path-iterator + :user-path-non-recursive (ada-prj-get 'src_dir) + :user-path-recursive nil + :ignore-function nil))) + (apply-partially #'uniq-file-completion-table iter) + )) + +(cl-defmethod project-select :after ((prj ada-project)) + ;; :after ensures env-project project-select is run first, setting env vars. + (ada-select-prj-file (ada-project-ada-prj prj))) + +(cl-defmethod project-deselect :before ((prj ada-project)) + ;; :before ensures env vars are not erased before we are done with them. + (ada-deselect-prj (ada-project-ada-prj prj))) + +(cl-defmethod project-refresh ((_prj ada-project)) + ;; assume prj is current + (ada-refresh-prj-file)) +(provide 'ada-project) + +;; end of file diff --git a/packages/ada-mode/env-project.el b/packages/ada-mode/env-project.el new file mode 100644 index 0000000..53dc99b --- /dev/null +++ b/packages/ada-mode/env-project.el @@ -0,0 +1,70 @@ +;;; env-project.el --- provide a root project type that holds a list of env vars -*- lexical-binding:t -*- +;; +;; Copyright (C) 2017, 2019 Free Software Foundation, Inc. +;; +;; Author: Stephen Leake <stephen_le...@stephe-leake.org> +;; Maintainer: Stephen Leake <stephen_le...@stephe-leake.org> +;; Keywords: projects +;; Version: 0 +;; package-requires: ((emacs "25.0")) +;; +;; This file is part of GNU Emacs. +;; +;; GNU Emacs 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. +;; +;; GNU Emacs 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 GNU Emacs. If not, see <http://www.gnu.org/licenses/>. + +(require 'cl-lib) +(require 'cl-generic) +(require 'project) + +(eval-and-compile + (unless (fboundp 'refresh-project) + ;; In emacs 27 + + (cl-defgeneric project-refresh (prj) + "Refresh all cached data in PRJ.") + + (defun refresh-project () + (interactive) + (project-refresh (project-current))) + + (cl-defgeneric project-select (prj) + "User has selected PRJ as the active project; take actions to make that so." + (setq compilation-search-path + (append (project-roots prj) + (project-external-roots prj))) + ) + + (cl-defgeneric project-deselect (_prj) + "PRJ is the current project; user has selected another project. +Undo actions done in `project-select'." + (setq compilation-search-path nil) + ) + )) + +(cl-defstruct env-project + env-vars ;; a list of (NAME . VALUE) + ) + +(cl-defmethod project-select :before ((prj env-project)) + "Set the project env vars in ’process-environment’." + (dolist (pair (env-project-env-vars prj)) + (setenv (car pair) (cdr pair)))) + +(cl-defmethod project-deselect :after ((prj env-project)) + "Unset the project env vars in ’process-environment’." + (dolist (pair (env-project-env-vars prj)) + (setenv (car pair) nil))) + +(provide 'env-project) +;; end of file