[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: completion-at-point + semantic : erroneous error
From: |
Eric Ludlam |
Subject: |
Re: completion-at-point + semantic : erroneous error |
Date: |
Sat, 12 Oct 2019 07:56:57 -0400 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.9.0 |
On 10/11/19 1:34 PM, Stefan Monnier wrote:
PS: It would also be good to replace uses of
define-overloadable-function with cl-defmethod, although the mapping
from one to the other is not immediate.
The patch below is an attempt to do that for
semantic-analyze-possible-completions. I'd be interested to hear your
opinion on this (especially the with-mode-local part).
Hi Stefan,
As a followup, I started using the shorter version of your patch, and
found there are additional errors thrown from
semantic-analyze-possible-completions-default (what will be a method in
your patch). I had to eliminate those errors to fully clean up the
original problem that started this thread.
I used catch/throw to solve the problem (see below: patch is against the
original semantic/analyze/complete.el, not your patched version with
methods.)
As an added wrinkle on the `should it be interactive' front, there is a
keybinding in semantic.el for semantic-analyze-possible-completions that
would need to be dealt with.
Eric
diff --git a/lisp/cedet/semantic/analyze/complete.el
b/lisp/cedet/semantic/analyze/complete.el
index b471c0d1a1..b8820b927f 100644
--- a/lisp/cedet/semantic/analyze/complete.el
+++ b/lisp/cedet/semantic/analyze/complete.el
@@ -93,7 +93,8 @@ semantic-analyze-possible-completions
context
(semantic-analyze-current-context context)))
(ans (if (not context)
- (error "Nothing to complete")
+ (when (called-interactively-p 'any)
+ (error "Nothing to complete"))
(:override))))
;; If interactive, display them.
(when (called-interactively-p 'any)
@@ -132,155 +133,159 @@ semantic-analyze-possible-completions-default
(do-unique (not (memq 'no-unique flags)))
)
- (when (not do-longprefix)
- ;; If we are not doing the long prefix, shorten all the key
- ;; elements.
- (setq prefix (list (car (reverse prefix)))
- prefixtypes nil))
-
- ;; Calculate what our prefix string is so that we can
- ;; find all our matching text.
- (setq completetext (car (reverse prefix)))
- (if (semantic-tag-p completetext)
- (setq completetext (semantic-tag-name completetext)))
-
- (if (and (not completetext) (not desired-type))
- (error "Nothing to complete"))
-
- (if (not completetext) (setq completetext ""))
-
- ;; This better be a reasonable type, or we should fry it.
- ;; The prefixtypes should always be at least 1 less than
- ;; the prefix since the type is never looked up for the last
- ;; item when calculating a sequence.
- (setq completetexttype (car (reverse prefixtypes)))
- (when (or (not completetexttype)
- (not (and (semantic-tag-p completetexttype)
- (eq (semantic-tag-class completetexttype) 'type))))
- ;; What should I do here? I think this is an error condition.
- (setq completetexttype nil)
- ;; If we had something that was a completetexttype but it wasn't
- ;; valid, then express our dismay!
- (when (> (length prefix) 1)
- (let* ((errprefix (car (cdr (reverse prefix)))))
- (error "Cannot find types for `%s'"
- (cond ((semantic-tag-p errprefix)
- (semantic-format-tag-prototype errprefix))
- (t
- (format "%S" errprefix)))))
- ))
-
- ;; There are many places to get our completion stream for.
- ;; Here we go.
- (if completetexttype
-
- (setq c (semantic-find-tags-for-completion
- completetext
- (semantic-analyze-scoped-type-parts completetexttype scope)
- ))
-
- ;; No type based on the completetext. This is a free-range
- ;; var or function. We need to expand our search beyond this
- ;; scope into semanticdb, etc.
- (setq c (nconc
- ;; Argument list and local variables
- (semantic-find-tags-for-completion completetext localvar)
- ;; The current scope
- (semantic-find-tags-for-completion completetext (when scope
(oref scope fullscope)))
- ;; The world
- (semantic-analyze-find-tags-by-prefix completetext))
- )
- )
-
- (let ((loopc c)
- (dtname (semantic-tag-name desired-type)))
-
- ;; Save off our first batch of completions
- (setq origc c)
-
- ;; Reset c.
- (setq c nil)
-
- ;; Loop over all the found matches, and categorize them
- ;; as being possible features.
- (while (and loopc do-typeconstraint)
-
- (cond
- ;; Strip operators
- ((semantic-tag-get-attribute (car loopc) :operator-flag)
- nil
- )
-
- ;; If we are completing from within some prefix,
- ;; then we want to exclude constructors and destructors
- ((and completetexttype
- (or (semantic-tag-get-attribute (car loopc) :constructor-flag)
- (semantic-tag-get-attribute (car loopc) :destructor-flag)))
- nil
- )
-
- ;; If there is a desired type, we need a pair of restrictions
- (desired-type
+ (catch 'cant-complete
+ (when (not do-longprefix)
+ ;; If we are not doing the long prefix, shorten all the key
+ ;; elements.
+ (setq prefix (list (car (reverse prefix)))
+ prefixtypes nil))
+
+ ;; Calculate what our prefix string is so that we can
+ ;; find all our matching text.
+ (setq completetext (car (reverse prefix)))
+ (if (semantic-tag-p completetext)
+ (setq completetext (semantic-tag-name completetext)))
+
+ (if (and (not completetext) (not desired-type))
+ (throw 'cant-complete nil)
+ ;;(error "Nothing to complete")
+ )
+
+ (if (not completetext) (setq completetext ""))
+
+ ;; This better be a reasonable type, or we should fry it.
+ ;; The prefixtypes should always be at least 1 less than
+ ;; the prefix since the type is never looked up for the last
+ ;; item when calculating a sequence.
+ (setq completetexttype (car (reverse prefixtypes)))
+ (when (or (not completetexttype)
+ (not (and (semantic-tag-p completetexttype)
+ (eq (semantic-tag-class completetexttype) 'type))))
+ ;; What should I do here? I think this is an error condition.
+ (setq completetexttype nil)
+ ;; If we had something that was a completetexttype but it wasn't
+ ;; valid, then express our dismay!
+ (when (> (length prefix) 1)
+ (throw 'cant-complete nil)
+;;; (let* ((errprefix (car (cdr (reverse prefix)))))
+;;; (error "Cannot find types for `%s'"
+;;; (cond ((semantic-tag-p errprefix)
+;;; (semantic-format-tag-prototype errprefix))
+;;; (t
+;;; (format "%S" errprefix)))))
+ ))
+
+ ;; There are many places to get our completion stream for.
+ ;; Here we go.
+ (if completetexttype
+
+ (setq c (semantic-find-tags-for-completion
+ completetext
+ (semantic-analyze-scoped-type-parts completetexttype scope)
+ ))
+
+ ;; No type based on the completetext. This is a free-range
+ ;; var or function. We need to expand our search beyond this
+ ;; scope into semanticdb, etc.
+ (setq c (nconc
+ ;; Argument list and local variables
+ (semantic-find-tags-for-completion completetext localvar)
+ ;; The current scope
+ (semantic-find-tags-for-completion completetext (when
scope (oref scope fullscope)))
+ ;; The world
+ (semantic-analyze-find-tags-by-prefix completetext))
+ )
+ )
+
+ (let ((loopc c)
+ (dtname (semantic-tag-name desired-type)))
+
+ ;; Save off our first batch of completions
+ (setq origc c)
+
+ ;; Reset c.
+ (setq c nil)
+
+ ;; Loop over all the found matches, and categorize them
+ ;; as being possible features.
+ (while (and loopc do-typeconstraint)
(cond
- ;; Ok, we now have a completion list based on the text we found
- ;; we want to complete on. Now filter that stream against the
- ;; type we want to search for.
- ((string= dtname (semantic-analyze-type-to-name
(semantic-tag-type (car loopc))))
- (setq c (cons (car loopc) c))
+ ;; Strip operators
+ ((semantic-tag-get-attribute (car loopc) :operator-flag)
+ nil
)
- ;; Now anything that is a compound type which could contain
- ;; additional things which are of the desired type
- ((semantic-tag-type (car loopc))
- (let ((att (semantic-analyze-tag-type (car loopc) scope))
- )
- (if (and att (semantic-tag-type-members att))
- (setq c (cons (car loopc) c))))
+ ;; If we are completing from within some prefix,
+ ;; then we want to exclude constructors and destructors
+ ((and completetexttype
+ (or (semantic-tag-get-attribute (car loopc) :constructor-flag)
+ (semantic-tag-get-attribute (car loopc) :destructor-flag)))
+ nil
)
- ) ; cond
- ); desired type
-
- ;; No desired type, no other restrictions. Just add.
- (t
- (setq c (cons (car loopc) c)))
-
- ); cond
-
- (setq loopc (cdr loopc)))
-
- (when desired-type
- ;; Some types, like the enum in C, have special constant values that
- ;; we could complete with. Thus, if the target is an enum, we can
- ;; find possible symbol values to fill in that value.
- (let ((constants
- (semantic-analyze-type-constants desired-type)))
- (if constants
- (progn
- ;; Filter
- (setq constants
- (semantic-find-tags-for-completion
- completetext constants))
- ;; Add to the list
- (setq c (nconc c constants)))
- )))
- )
-
- (when desired-class
- (setq c (semantic-analyze-tags-of-class-list c desired-class)))
-
- (if do-unique
- (if c
- ;; Pull out trash.
- ;; NOTE TO SELF: Is this too slow?
- (setq c (semantic-unique-tag-table-by-name c))
- (setq c (semantic-unique-tag-table-by-name origc)))
- (when (not c)
- (setq c origc)))
-
- ;; All done!
- c))
+ ;; If there is a desired type, we need a pair of restrictions
+ (desired-type
+
+ (cond
+ ;; Ok, we now have a completion list based on the text we found
+ ;; we want to complete on. Now filter that stream against the
+ ;; type we want to search for.
+ ((string= dtname (semantic-analyze-type-to-name
(semantic-tag-type (car loopc))))
+ (setq c (cons (car loopc) c))
+ )
+
+ ;; Now anything that is a compound type which could contain
+ ;; additional things which are of the desired type
+ ((semantic-tag-type (car loopc))
+ (let ((att (semantic-analyze-tag-type (car loopc) scope))
+ )
+ (if (and att (semantic-tag-type-members att))
+ (setq c (cons (car loopc) c))))
+ )
+
+ ) ; cond
+ ) ; desired type
+
+ ;; No desired type, no other restrictions. Just add.
+ (t
+ (setq c (cons (car loopc) c)))
+
+ ) ; cond
+
+ (setq loopc (cdr loopc)))
+
+ (when desired-type
+ ;; Some types, like the enum in C, have special constant values that
+ ;; we could complete with. Thus, if the target is an enum, we can
+ ;; find possible symbol values to fill in that value.
+ (let ((constants
+ (semantic-analyze-type-constants desired-type)))
+ (if constants
+ (progn
+ ;; Filter
+ (setq constants
+ (semantic-find-tags-for-completion
+ completetext constants))
+ ;; Add to the list
+ (setq c (nconc c constants)))
+ )))
+ )
+
+ (when desired-class
+ (setq c (semantic-analyze-tags-of-class-list c desired-class)))
+
+ (if do-unique
+ (if c
+ ;; Pull out trash.
+ ;; NOTE TO SELF: Is this too slow?
+ (setq c (semantic-unique-tag-table-by-name c))
+ (setq c (semantic-unique-tag-table-by-name origc)))
+ (when (not c)
+ (setq c origc)))
+
+ ;; All done!
+ c)))
(provide 'semantic/analyze/complete)
- completion-at-point + semantic : erroneous error, Eric Ludlam, 2019/10/09
- Re: completion-at-point + semantic : erroneous error, Stefan Monnier, 2019/10/11
- Re: completion-at-point + semantic : erroneous error, Stefan Monnier, 2019/10/11
- Re: completion-at-point + semantic : erroneous error, Eric Ludlam, 2019/10/11
- Re: completion-at-point + semantic : erroneous error, Stefan Monnier, 2019/10/24
- Re: completion-at-point + semantic : erroneous error, Eric Ludlam, 2019/10/27
- Re: completion-at-point + semantic : erroneous error, Stefan Monnier, 2019/10/27
- Re: completion-at-point + semantic : erroneous error, Eric Ludlam, 2019/10/27
- Re: completion-at-point + semantic : erroneous error,
Eric Ludlam <=
- Re: completion-at-point + semantic : erroneous error, Stefan Monnier, 2019/10/23
- Re: completion-at-point + semantic : erroneous error, Eric Ludlam, 2019/10/27
- Re: completion-at-point + semantic : erroneous error, Stefan Monnier, 2019/10/27
- Re: completion-at-point + semantic : erroneous error, Eric Ludlam, 2019/10/27
- Re: completion-at-point + semantic : erroneous error, Stefan Monnier, 2019/10/23
- Re: completion-at-point + semantic : erroneous error, Eric Ludlam, 2019/10/27