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

Reply via email to