Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

(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.
  • Loading branch information...
commit 9a918c83da71706c4f7c2eff65fab51b14ff83d8 1 parent c710b76
jdsmith authored
Showing with 60 additions and 19 deletions.
  1. +60 −19 idlw-complete-structtag.el
View
79 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 <dominik@astro.uva.nl>
-;; Version: 1.0
-;; Date: $Date: 2002/06/14 19:07:37 $
+;; Maintainer: J.D. Smith <jdsmith@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
Please sign in to comment.
Something went wrong with that request. Please try again.