branch: externals/idlwave commit 9a918c83da71706c4f7c2eff65fab51b14ff83d8 Author: jdsmith <jdsmith> Commit: jdsmith <jdsmith>
(idlwave-prepare-structure-tag-completion): Look for structure definitions with tags, from the end of the file (to avoid, e.g. info={STATE_STRUCT} non-definitions). (idlwave-complete-structure-tag): Set `idlwave-completion-help-info'. (idlwave-complete-structure-tag-help): Written, to set keyword for help on structure tags. (idlwave-complete-structure-tag): Added test to avoid conflicting with sysvar tag completion. --- idlw-complete-structtag.el | 79 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 60 insertions(+), 19 deletions(-) diff --git a/idlw-complete-structtag.el b/idlw-complete-structtag.el index 7d4ec95029..6feb9a963c 100644 --- a/idlw-complete-structtag.el +++ b/idlw-complete-structtag.el @@ -1,11 +1,31 @@ ;;; idlw-complete-structtag.el --- Completion of structure tags. -;; Copyright (c) 1999, 2000, 2001 Free Software Foundation +;; Copyright (c) 2001,2002 Free Software Foundation ;; Author: Carsten Dominik <domi...@astro.uva.nl> -;; Version: 1.0 -;; Date: $Date: 2002/06/14 19:07:37 $ +;; Maintainer: J.D. Smith <jdsm...@as.arizona.edu +;; Version: 1.1 +;; Date: $Date: 2002/09/12 16:38:29 $ ;; Keywords: languages +;; 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 2, 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; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Commentary: + ;; Completion of structure tags is highly ambiguous since you never ;; know what kind of structure a variable will hold at runtime. ;; However, in some applications there is one main structure which @@ -52,8 +72,8 @@ ;; - The structure definition assignment "state = {...}" must use the ;; same variable name as the the completion location "state.*". ;; - The structure definition must be in the same file. -;; - The structure definition is searched first backwards, then -;; forward from the cursor position. +;; - The structure definition is searched backwards from the end of +;; the file, until a definition with tags is found. ;; - The file is parsed again for the definition only if the variable ;; name (like "state") of the current completion differs from the ;; previous tag completion. @@ -81,15 +101,17 @@ for big structures like the state variables of a widget application." ;; Check if the context is right (skip-chars-backward "[a-zA-Z0-9._$]") (and (< (point) pos) + (not (equal (char-before) ?!)) ; no sysvars (looking-at "\\([a-zA-Z][a-zA-Z0-9_]*\\)\\.") (>= pos (match-end 0)) (not (string= (downcase (match-string 1)) "self")))) ;; FIXME: Can we avoid checking for self here? (let* ((var (downcase (match-string 1)))) - ;; Check if we need to update the "current" class + ;; Check if we need to update the "current" structure (if (or (not (string= var (or idlwave-current-tags-var "@"))) (not (eq (current-buffer) idlwave-current-tags-buffer))) (idlwave-prepare-structure-tag-completion var)) - (setq idlwave-completion-help-info nil) + (setq idlwave-completion-help-info + (list 'idlwave-complete-structure-tag-help)) (idlwave-complete-in-buffer 'structtag 'structtag idlwave-current-struct-tags nil "Select a structure tag" "structure tag") @@ -99,22 +121,41 @@ for big structures like the state variables of a widget application." (defun idlwave-structtag-reset () (setq idlwave-current-tags-buffer nil)) +(defvar idlwave-structtag-struct-location nil) (defun idlwave-prepare-structure-tag-completion (var) "Find and parse the necessary class definitions for class structure tags." ;; (message "switching to var %s" var) ; FIXME: take this out. ;; (sit-for 2) - (save-excursion - (if (idlwave-find-structure-definition var nil 'all) - (progn - (setq idlwave-sint-structtags nil - idlwave-current-tags-buffer (current-buffer) - idlwave-current-tags-var var - idlwave-current-struct-tags - (mapcar (lambda (x) - (list (idlwave-sintern-structtag x 'set))) - (idlwave-struct-tags)))) - (error "Cannot complete structure tags of variable %s" var)))) + (unless + (catch 'exit + (save-excursion + (goto-char (point-max)) + (while (idlwave-find-structure-definition var nil 'back) + (let ((tags (idlwave-struct-tags))) + (when tags + (setq idlwave-sint-structtags nil + idlwave-current-tags-buffer (current-buffer) + idlwave-current-tags-var var + idlwave-structtag-struct-location (point) + idlwave-current-struct-tags + (mapcar (lambda (x) + (list (idlwave-sintern-structtag x 'set))) + tags)) + (throw 'exit t)))))) + (error "Cannot complete structure tags of variable %s" var))) + +;; Fake help in the source buffer for structure tags. +;; kwd and name are global-variables here. +(defvar idlwave-help-do-struct-tag) +(defun idlwave-complete-structure-tag-help (mode word) + (cond + ((eq mode 'test) ; nothing gets fontified for class tags + nil) + ((eq mode 'set) + (setq kwd word + idlwave-help-do-struct-tag idlwave-structtag-struct-location)) + (t (error "This should not happen")))) -(provide 'idlwave-complete-structtag) +(provide 'idlw-complete-structtag) ;;; idlw-complete-structtag.el ends here \ No newline at end of file