aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/progmodes/ada-xref.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/progmodes/ada-xref.el')
-rw-r--r--lisp/progmodes/ada-xref.el162
1 files changed, 81 insertions, 81 deletions
diff --git a/lisp/progmodes/ada-xref.el b/lisp/progmodes/ada-xref.el
index 0390ac0485..369119208f 100644
--- a/lisp/progmodes/ada-xref.el
+++ b/lisp/progmodes/ada-xref.el
@@ -225,7 +225,7 @@ CROSS-PREFIX is the prefix to use for the gnatls command"
(goto-char (point-min))
;; Source path
-
+
(search-forward "Source Search Path:")
(forward-line 1)
(while (not (looking-at "^$"))
@@ -238,7 +238,7 @@ CROSS-PREFIX is the prefix to use for the gnatls command"
(forward-line 1))
;; Object path
-
+
(search-forward "Object Search Path:")
(forward-line 1)
(while (not (looking-at "^$"))
@@ -282,7 +282,7 @@ replaced by the name including the extension."
(if (null value)
(if (not (setq value (getenv name)))
(message (concat "No environment variable " name " found"))))
-
+
(cond
((null value)
(setq cmd-string (replace-match "" t t cmd-string)))
@@ -303,7 +303,7 @@ replaced by the name including the extension."
plist)
(save-excursion
(set-buffer ada-buffer)
-
+
(set 'plist
;; Try hard to find a default value for filename, so that the user
;; can edit his project file even if the current buffer is not an
@@ -357,7 +357,7 @@ replaced by the name including the extension."
'debug_post_cmd (list nil)))
)
(set symbol plist)))
-
+
(defun ada-xref-get-project-field (field)
"Extract the value of FIELD from the current project file.
The project file must have been loaded first.
@@ -373,7 +373,7 @@ addition return the default paths."
;; Get the project file (either the current one, or a default one)
(setq file (or (assoc file-name ada-xref-project-files)
(assoc nil ada-xref-project-files)))
-
+
;; If the file was not found, use the default values
(if file
;; Get the value from the file
@@ -409,10 +409,10 @@ All the directories are returned as absolute directories."
(append
;; Add ${build_dir} in front of the path
(list build-dir)
-
+
(ada-get-absolute-dir-list (ada-xref-get-project-field 'src_dir)
build-dir)
-
+
;; Add the standard runtime at the end
ada-xref-runtime-library-specs-path)))
@@ -424,10 +424,10 @@ All the directories are returned as absolute directories."
(append
;; Add ${build_dir} in front of the path
(list build-dir)
-
+
(ada-get-absolute-dir-list (ada-xref-get-project-field 'obj_dir)
build-dir)
-
+
;; Add the standard runtime at the end
ada-xref-runtime-library-ali-path)))
@@ -442,7 +442,7 @@ All the directories are returned as absolute directories."
(cons 'New (cons "New..." 'ada-prj-new))
(cons 'Edit (cons "Edit..." 'ada-prj-edit))
(cons 'sep (cons "---" nil))))
-
+
;; Add the new items
(mapcar
(lambda (x)
@@ -469,7 +469,7 @@ All the directories are returned as absolute directories."
(equal ada-prj-default-project-file
(car x))
))))))))
-
+
;; Parses all the known project files, and insert at least the default
;; one (in case ada-xref-project-files is nil)
(or ada-xref-project-files '(nil)))
@@ -650,7 +650,7 @@ name as was passed to `ada-create-menu'."
(not ada-tight-gvd-integration))
:style toggle :selected ada-tight-gvd-integration]))
)
-
+
;; for Emacs
(let* ((menu (or (lookup-key ada-mode-map [menu-bar Ada])
;; Emacs-21.4's easymenu.el downcases the events.
@@ -699,7 +699,7 @@ name as was passed to `ada-create-menu'."
'("Goto Declaration Other Frame" . ada-goto-declaration-other-frame))
(define-key goto-menu [Decl]
'("Goto Declaration/Body" . ada-goto-declaration))
-
+
(define-key edit-menu [rem] '("----" . nil))
(define-key edit-menu [Complete] '("Complete Identifier"
. ada-complete-identifier))
@@ -745,7 +745,7 @@ name as was passed to `ada-create-menu'."
(not ada-xref-project-files)
(string= ada-prj-default-project-file ""))
(ada-reread-prj-file)))
-
+
(defun ada-xref-push-pos (filename position)
"Push (FILENAME, POSITION) on the position ring for cross-references."
(setq ada-xref-pos-ring (cons (list position filename) ada-xref-pos-ring))
@@ -787,21 +787,21 @@ file. If none is set, return nil."
;; Use the active project file if there is one.
;; This is also valid if we don't currently have an Ada buffer, or if
;; the current buffer is not a real file (for instance an emerge buffer)
-
+
(if (or (not (string= mode-name "Ada"))
(not (buffer-file-name))
(and ada-prj-default-project-file
(not (string= ada-prj-default-project-file ""))))
(set 'selected ada-prj-default-project-file)
-
+
;; other cases: use a more complex algorithm
-
+
(let* ((current-file (buffer-file-name))
(first-choice (concat
(file-name-sans-extension current-file)
ada-project-file-extension))
(dir (file-name-directory current-file))
-
+
;; on Emacs 20.2, directory-files does not work if
;; parse-sexp-lookup-properties is set
(parse-sexp-lookup-properties nil)
@@ -810,18 +810,18 @@ file. If none is set, return nil."
(concat ".*" (regexp-quote
ada-project-file-extension) "$")))
(choice nil))
-
+
(cond
-
+
;; Else if there is a project file with the same name as the Ada
;; file, but not the same extension.
((file-exists-p first-choice)
(set 'selected first-choice))
-
+
;; Else if only one project file was found in the current directory
((= (length prj-files) 1)
(set 'selected (car prj-files)))
-
+
;; Else if there are multiple files, ask the user
((and (> (length prj-files) 1) (not no-user-question))
(save-window-excursion
@@ -846,7 +846,7 @@ file. If none is set, return nil."
(setq choice (string-to-int
(read-from-minibuffer "Enter No. of your choice: "))))
(set 'selected (nth (1- choice) prj-files))))
-
+
;; Else if no project file was found in the directory, ask a name
;; to the user, using as a default value the last one entered by
;; the user
@@ -921,7 +921,7 @@ The current buffer should be the ada-file buffer."
(set 'project (plist-put project (intern (match-string 1))
(match-string 2))))))
(forward-line 1))
-
+
(if src_dir (set 'project (plist-put project 'src_dir
(reverse src_dir))))
(if obj_dir (set 'project (plist-put project 'obj_dir
@@ -946,7 +946,7 @@ The current buffer should be the ada-file buffer."
;; the list
(if (assoc nil ada-xref-project-files)
(setq ada-xref-project-files nil))
-
+
;; Memorize the newly read project file
(if (assoc prj-file ada-xref-project-files)
(setcdr (assoc prj-file ada-xref-project-files) project)
@@ -954,7 +954,7 @@ The current buffer should be the ada-file buffer."
;; Set the project file as the active one.
(setq ada-prj-default-project-file prj-file)
-
+
;; Sets up the compilation-search-path so that Emacs is able to
;; go to the source of the errors in a compilation buffer
(setq compilation-search-path (ada-xref-get-src-dir-field))
@@ -964,13 +964,13 @@ The current buffer should be the ada-file buffer."
(progn
(setq ada-case-exception-file (reverse casing))
(ada-case-read-exceptions)))
-
+
;; Add the directories to the search path for ff-find-other-file
;; Do not add the '/' or '\' at the end
(setq ada-search-directories
(append (mapcar 'directory-file-name compilation-search-path)
ada-search-directories))
-
+
;; Kill the project buffer
(kill-buffer nil)
(set-buffer ada-buffer)
@@ -985,8 +985,8 @@ The current buffer should be the ada-file buffer."
;; directory.
(setq compilation-search-path (list nil default-directory))
))
-
-
+
+
(defun ada-find-references (&optional pos arg local-only)
"Find all references to the entity under POS.
Calls gnatfind to find the references.
@@ -1061,7 +1061,7 @@ buffer *gnatfind* if it exists."
(save-excursion
(set-buffer "*gnatfind*")
(setq old-contents (buffer-string))))
-
+
(compile-internal command "No more references" "gnatfind")
;; Hide the "Compilation" menu
@@ -1251,7 +1251,7 @@ If ARG is not nil, ask for user confirmation."
;; Make a single command from the list of commands, including the
;; commands to run it on a remote machine.
(setq cmd (ada-remote (mapconcat 'identity cmd ada-command-separator)))
-
+
(if (or ada-xref-confirm-compile arg)
(setq cmd (read-from-minibuffer "enter command to compile: " cmd)))
@@ -1260,7 +1260,7 @@ If ARG is not nil, ask for user confirmation."
;; which gets confused by newline characters.
(if (not (string-match "cmdproxy.exe" shell-file-name))
(setq cmd (concat cmd "\n\n")))
-
+
(compile (ada-quote-cmd cmd))))
(defun ada-compile-current (&optional arg prj-field)
@@ -1274,16 +1274,16 @@ command, and should be either comp_cmd (default) or check_cmd."
(cmd (ada-xref-get-project-field field))
(process-environment (ada-set-environment))
(compilation-scroll-output t))
-
+
(setq compilation-search-path (ada-xref-get-src-dir-field))
(unless cmd
(setq cmd '("") arg t))
-
+
;; Make a single command from the list of commands, including the
;; commands to run it on a remote machine.
(setq cmd (ada-remote (mapconcat 'identity cmd ada-command-separator)))
-
+
;; If no project file was found, ask the user
(if (or ada-xref-confirm-compile arg)
(setq cmd (read-from-minibuffer "enter command to compile: " cmd)))
@@ -1293,7 +1293,7 @@ command, and should be either comp_cmd (default) or check_cmd."
;; which gets confused by newline characters.
(if (not (string-match "cmdproxy.exe" shell-file-name))
(setq cmd (concat cmd "\n\n")))
-
+
(compile (ada-quote-cmd cmd))))
(defun ada-check-current (&optional arg)
@@ -1321,7 +1321,7 @@ if ARG is not-nil, asks for user confirmation."
;; Modify the command to run remotely
(setq command (ada-remote (mapconcat 'identity command
ada-command-separator)))
-
+
;; Ask for the arguments to the command if required
(if (or ada-xref-confirm-compile arg)
(setq command (read-from-minibuffer "Enter command to execute: "
@@ -1412,7 +1412,7 @@ If ARG is non-nil, ask the user to confirm the command."
;; Temporarily replaces the definition of `comint-exec' so that we
;; can execute commands before running gdb.
- (fset 'comint-exec
+ (fset 'comint-exec
`(lambda (buffer name command startfile switches)
(let (compilation-buffer-name-function)
(save-excursion
@@ -1429,7 +1429,7 @@ If ARG is non-nil, ask the user to confirm the command."
ada-tight-gvd-integration
(not (string-match "--tty" cmd)))
(setq cmd (concat cmd "--tty")))
-
+
(if (and (string-match "jdb" (comint-arguments cmd 0 0))
(boundp 'jdb))
(funcall (symbol-function 'jdb) cmd)
@@ -1480,7 +1480,7 @@ replacing the file extension with .ali"
(if (and ali-file-name
(get-file-buffer ali-file-name))
(kill-buffer (get-file-buffer ali-file-name)))
-
+
(let* ((name (ada-convert-file-name file))
(body-name (or (ada-get-body-name name) name)))
@@ -1516,7 +1516,7 @@ replacing the file extension with .ali"
(while (and (not found) dir-list)
(set 'found (concat (file-name-as-directory (car dir-list))
(file-name-nondirectory file)))
-
+
(unless (file-exists-p found)
(set 'found nil))
(set 'dir-list (cdr dir-list)))
@@ -1587,14 +1587,14 @@ the project file."
(file-name-nondirectory
(ada-other-file-name)))
".ali"))))
-
+
(setq ali-file-name
(or ali-file-name
-
+
;; Else we take the .ali file associated with the unit
(ada-find-ali-file-in-dir short-ali-file-name)
-
+
;; else we did not find the .ali file Second chance: in case
;; the files do not have standard names (such as for instance
@@ -1605,35 +1605,35 @@ the project file."
(file-name-nondirectory (ada-other-file-name)))
".ali"))
-
+
;; If we still don't have an ali file, try to get the one
;; from the parent unit, in case we have a separate entity.
(let ((parent-name (file-name-sans-extension
(file-name-nondirectory file))))
-
+
(while (and (not ali-file-name)
(string-match "^\\(.*\\)[.-][^.-]*" parent-name))
-
+
(set 'parent-name (match-string 1 parent-name))
(set 'ali-file-name (ada-find-ali-file-in-dir
(concat parent-name ".ali")))
)
ali-file-name)))
-
+
;; If still not found, try to recompile the file
(if (not ali-file-name)
;; recompile only if the user asked for this. and search the ali
;; filename again. We avoid a possible infinite recursion by
;; temporarily disabling the automatic compilation.
-
+
(if ada-xref-create-ali
(setq ali-file-name
(concat (file-name-sans-extension (ada-xref-current file))
".ali"))
(error "Ali file not found. Recompile your file"))
-
-
+
+
;; same if the .ali file is too old and we must recompile it
(if (and (file-newer-than-file-p file ali-file-name)
ada-xref-create-ali)
@@ -1657,7 +1657,7 @@ file for possible paths."
(set-buffer buffer)
(find-file original-file)
(ada-require-project-file)))
-
+
;; we choose the first possible completion and we
;; return the absolute file name
(let ((filename (ada-find-src-file-in-dir file)))
@@ -1687,7 +1687,7 @@ macros `ada-name-of', `ada-line-of', `ada-column-of', `ada-file-of',..."
;; If at end of buffer (e.g the buffer is empty), error
(if (>= (point) (point-max))
(error "No identifier on point"))
-
+
;; goto first character of the identifier/operator (skip backward < and >
;; since they are part of multiple character operators
(goto-char pos)
@@ -1724,7 +1724,7 @@ macros `ada-name-of', `ada-line-of', `ada-column-of', `ada-file-of',..."
(if (looking-at "[a-zA-Z0-9_]+")
(set 'identifier (match-string 0))
(error "No identifier around")))
-
+
;; Build the identlist
(set 'identlist (ada-make-identlist))
(ada-set-name identlist (downcase identifier))
@@ -1739,7 +1739,7 @@ macros `ada-name-of', `ada-line-of', `ada-column-of', `ada-file-of',..."
(defun ada-get-all-references (identlist)
"Completes and returns IDENTLIST with the information extracted
from the ali file (definition file and places where it is referenced)."
-
+
(let ((ali-buffer (ada-get-ali-buffer (ada-file-of identlist)))
declaration-found)
(set-buffer ali-buffer)
@@ -1749,7 +1749,7 @@ from the ali file (definition file and places where it is referenced)."
;; First attempt: we might already be on the declaration of the identifier
;; We want to look for the declaration only in a definite interval (after
;; the "^X ..." line for the current file, and before the next "^X" line
-
+
(if (re-search-forward
(concat "^X [0-9]+ " (file-name-nondirectory (ada-file-of identlist)))
nil t)
@@ -1768,7 +1768,7 @@ from the ali file (definition file and places where it is referenced)."
;; have to fall back on other algorithms
(unless declaration-found
-
+
;; Since we alread know the number of the file, search for a direct
;; reference to it
(goto-char (point-min))
@@ -1796,7 +1796,7 @@ from the ali file (definition file and places where it is referenced)."
"[^0-9]"
(ada-column-of identlist) "\\>")
nil t)
-
+
;; If still not found, then either the declaration is unknown
;; or the source file has been modified since the ali file was
;; created
@@ -1831,7 +1831,7 @@ from the ali file (definition file and places where it is referenced)."
)))
)
-
+
;; Now that we have found a suitable line in the .ali file, get the
;; information available
(beginning-of-line)
@@ -1854,13 +1854,13 @@ from the ali file (definition file and places where it is referenced)."
identlist
(ada-get-ada-file-name (match-string 1)
(ada-file-of identlist)))
-
+
;; Else clean up the ali file
(error
(kill-buffer ali-buffer)
(error (error-message-string err)))
))
-
+
(ada-set-references identlist current-line)
))
))
@@ -1913,16 +1913,16 @@ This function is disabled for operators, and only works for identifiers."
(error (concat "No declaration of "
(ada-name-of identlist)
" recorded in .ali file")))
-
+
;; one => should be the right one
((= len 1)
(goto-line (caar declist)))
-
+
;; more than one => display choice list
(t
(save-window-excursion
(with-output-to-temp-buffer "*choice list*"
-
+
(princ "Identifier is overloaded and Xref information is not up to date.\n")
(princ "Possible declarations are:\n\n")
(princ " no. in file at line col\n")
@@ -1994,7 +1994,7 @@ opens a new window to show the declaration."
)
;; Else get the nearest file
(set 'file (ada-declare-file-of identlist)))
-
+
(set 'locations (append locations (list (list line col file)))))
;; Add the specs at the end again, so that from the last body we go to
@@ -2007,7 +2007,7 @@ opens a new window to show the declaration."
(setq line (caar locations)
col (nth 1 (car locations))
file (nth 2 (car locations)))
-
+
(while locations
(if (and (string= (caar locations) (ada-line-of identlist))
(string= (nth 1 (car locations)) (ada-column-of identlist))
@@ -2046,27 +2046,27 @@ This command requires the external `egrep' program to be available.
This works well when one is using an external librarie and wants
to find the declaration and documentation of the subprograms one is
is using."
-
+
(let (list
(dirs (ada-xref-get-obj-dir-field))
(regexp (concat "[ *]" (ada-name-of identlist)))
line column
choice
file)
-
+
(save-excursion
-
+
;; Do the grep in all the directories. We do multiple shell
;; commands instead of one in case there is no .ali file in one
;; of the directory and the shell stops because of that.
-
+
(set-buffer (get-buffer-create "*grep*"))
(while dirs
(insert (shell-command-to-string
(concat "egrep -i -h '^X|" regexp "( |$)' "
(file-name-as-directory (car dirs)) "*.ali")))
(set 'dirs (cdr dirs)))
-
+
;; Now parse the output
(set 'case-fold-search t)
(goto-char (point-min))
@@ -2080,23 +2080,23 @@ is using."
column (match-string 2))
(re-search-backward "^X [0-9]+ \\(.*\\)$")
(set 'file (list (match-string 1) line column))
-
+
;; There could be duplicate choices, because of the structure
;; of the .ali files
(unless (member file list)
(set 'list (append list (list file))))))))
-
+
;; Current buffer is still "*grep*"
(kill-buffer "*grep*")
)
-
+
;; Now display the list of possible matches
(cond
-
+
;; No choice found => Error
((null list)
(error "No cross-reference found, please recompile your file"))
-
+
;; Only one choice => Do the cross-reference
((= (length list) 1)
(set 'file (ada-find-src-file-in-dir (caar list)))
@@ -2109,12 +2109,12 @@ is using."
(error (concat (caar list) " not found in src_dir")))
(message "This is only a (good) guess at the cross-reference.")
)
-
+
;; Else, ask the user
(t
(save-window-excursion
(with-output-to-temp-buffer "*choice list*"
-
+
(princ "Identifier is overloaded and Xref information is not up to date.\n")
(princ "Possible declarations are:\n\n")
(princ " no. in file at line col\n")
@@ -2315,7 +2315,7 @@ This function typically is to be hooked into `ff-file-created-hooks'."
(progn
(set-buffer-modified-p nil)
(kill-buffer (current-buffer))))
-
+
;; Make sure the current buffer is the spec (this might not be the case
;; if for instance the user was asked for a project file)