branch: externals/idlwave commit bd76e3f62ff8c31e7b364c35d9d97edc7aabf931 Author: jdsmith <jdsmith> Commit: jdsmith <jdsmith>
(idlwave-skip-label-or-case): Avoids explicit class names like a->b::c, to avoid completion errors there. (idlwave-complete): Only expand super-classes if the class name is not explicity listed (in which case it's unnecessary). (idlwave-explicit-class-listed): Written. --- idlwave.el | 47 ++++++++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/idlwave.el b/idlwave.el index d5a224a4c2..901e22b59b 100644 --- a/idlwave.el +++ b/idlwave.el @@ -5,7 +5,7 @@ ;; Chris Chase <ch...@att.com> ;; Maintainer: J.D. Smith <jdsm...@alum.mit.edu> ;; Version: VERSIONTAG -;; Date: $Date: 2001/12/31 21:29:41 $ +;; Date: $Date: 2002/01/11 23:39:25 $ ;; Keywords: languages ;; This file is part of GNU Emacs. @@ -2561,15 +2561,16 @@ If there is no label point is not moved and nil is returned." ;; - it is not in a comment ;; - not in a string constant ;; - not in parenthesis (like a[0:3]) + ;; - not followed by another ":" in explicit class, ala a->b::c ;; As many in this mode, this function is heuristic and not an exact ;; parser. - (let ((start (point)) - (end (idlwave-find-key ":" 1 'nomark - (save-excursion - (idlwave-end-of-statement) (point))))) + (let* ((start (point)) + (eos (save-excursion (idlwave-end-of-statement) (point))) + (end (idlwave-find-key ":" 1 'nomark eos))) (if (and end (= (nth 0 (parse-partial-sexp start end)) 0) - (not (string-match "\\?" (buffer-substring start end)))) + (not (string-match "\\?" (buffer-substring start end))) + (not (string-match "^::" (buffer-substring end eos)))) (progn (forward-char) (point)) @@ -5023,8 +5024,10 @@ When we force a method or a method keyword, CLASS can specify the class." ((eq what 'procedure) ;; Complete a procedure name - (let* ((class-selector (idlwave-determine-class (nth 3 where-list) 'pro)) - (super-classes (idlwave-all-class-inherits class-selector)) + (let* ((cw-list (nth 3 where-list)) + (class-selector (idlwave-determine-class cw-list 'pro)) + (super-classes (unless (idlwave-explicit-class-listed cw-list) + (idlwave-all-class-inherits class-selector))) (isa (concat "procedure" (if class-selector "-method" ""))) (type-selector 'pro)) (setq idlwave-completion-help-info @@ -5042,8 +5045,10 @@ When we force a method or a method keyword, CLASS can specify the class." ((eq what 'function) ;; Complete a function name - (let* ((class-selector (idlwave-determine-class (nth 3 where-list) 'fun)) - (super-classes (idlwave-all-class-inherits class-selector)) + (let* ((cw-list (nth 3 where-list)) + (class-selector (idlwave-determine-class cw-list 'fun)) + (super-classes (unless (idlwave-explicit-class-listed cw-list) + (idlwave-all-class-inherits class-selector))) (isa (concat "function" (if class-selector "-method" ""))) (type-selector 'fun)) (setq idlwave-completion-help-info @@ -5391,6 +5396,13 @@ When TYPE is not specified, both procedures and functions will be considered." (setq list (cdr list))) (nreverse rtn))) +(defun idlwave-explicit-class-listed (info) + "Return whether or not the class is listed explicitly, ala a->b::c. +INFO is as returned by idlwave-what-function or -procedure." + (let ((apos (nth 3 info))) + (save-excursion (goto-char apos) + (looking-at "->[a-zA-Z][a-zA-Z0-9$_]*::")))) + (defun idlwave-determine-class (info type) ;; Determine the class of a routine call. INFO is the structure returned ;; `idlwave-what-function' or `idlwave-what-procedure'. @@ -5474,14 +5486,15 @@ When TYPE is not specified, both procedures and functions will be considered." ))) (defun idlwave-where () - "Find out where we are. + "Find out where we are. The return value is a list with the following stuff: -(PRO-LIST FUNC-LIST COMPLETE-WHAT CW-LIST LAST-CHAR) +\(PRO-LIST FUNC-LIST COMPLETE-WHAT CW-LIST LAST-CHAR) PRO-LIST (PRO POINT CLASS ARROW) FUNC-LIST (FUNC POINT CLASS ARROW) COMPLETE-WHAT a symbol indicating what kind of completion makes sense here -CW-LIST Like PRO-LIST, for what can be completed here. +CW-LIST (PRO-OR-FUNC POINT CLASS ARROW) Like PRO-LIST, for what can + be completed here. LAST-CHAR last relevant character before point (non-white non-comment, not part of current identifier or leading slash). @@ -5490,9 +5503,9 @@ PRO: Procedure name FUNC: Function name POINT: Where is this CLASS: What class has the routine (nil=no, t=is method, but class unknown) -ARROW: Where is the arrow?" +ARROW: Location of the arrow" (idlwave-routines) - (let* (;(bos (save-excursion (idlwave-beginning-of-statement) (point))) + (let* (;(bos (save-excursion (idlwave-beginning-of-statement) (point))) (bos (save-excursion (idlwave-start-of-substatement 'pre) (point))) (func-entry (idlwave-what-function bos)) (func (car func-entry)) @@ -5548,8 +5561,8 @@ ARROW: Where is the arrow?" (if (re-search-backward "->[ \t]*\\(\\([$a-zA-Z0-9_]+\\)::\\)?[$a-zA-Z0-9_]*\\=" bos t) (setq cw-arrow (match-beginning 0) cw-class (if (match-end 2) - (idlwave-sintern-class (match-string 2)) - t)))))) + (idlwave-sintern-class (match-string 2)) + t)))))) (list (list pro pro-point pro-class pro-arrow) (list func func-point func-class func-arrow) cw