Re: [CEDET-devel] Replacement for which-func advise
Brought to you by:
zappo
From: Jan M. <jan...@un...> - 2010-04-01 01:37:58
|
Hi. > Scope calculations are pretty quick, but even so, if you call any of > the > routines that needs to build up the semanticdb typecache, it is worth > doing it as a semantic-idle service. The semantic idle service will > build up all the time consuming data structures such as the latest > edit > reparses, typecache, scope, and parsing all the stray headers that are > needed. Once it's done with that, it dispatches to all the idle time > services. > > If you need to calculate a scope, or do any sort of analysis, but do > it during the reparse hooks, you will force data structure rebuilds > before the idle timer gets to it. > > Making a new idle service is pretty easy, as you can use > define-semantic-idle-service to define your feature. There are plenty > of examples in semantic-idle.el with semantic-idle-tag-highlight being > pretty simple. I made semantic-breadcrumbs-minor-mode into an idle service and it worked like a charm. The sluggishness produced by the post-command-hook -version is (as expected) gone. > You may want to consider a "fast" answer, and a "detailed" answer > solution. The immediate feedback variant would use the 'fast' answer, > and an idle mode could then enable a better answer later. For me, the feedback from the idle service seems fast enough, but I only did very limited testing. Please let me know whether the attached patch can be applied (provided I add docstrings and clean up, of course). Btw, I noticed a possible inconsistency in the scope analysis code. Some languages, like Java or Common Lisp for example, have a non-lexical package/namespace declaration construct (Python is even more difficult, because containing directories and their contents matter): package foo.bar; in Java and (in-package :foo) in Common Lisp. These do not show up in the parents slots of the scope object. In my opinion, it would be useful to have them there. Or should the scope be understood to strictly describe the lexical structure of the code? For the recently discussed calculation of qualified names, I did the following for Java: (define-mode-local-override semantic-tag-qualified-name java-mode (tag scope) "Get local variable declarations from the current context." (let* ((package (car (semantic-find-tags-by-class 'package (oref scope table)))) ;; TODO add this stuff to the scope cache? (parents (oref scope parents)) (parent-names (mapcar #'semantic-tag-name parents))) When writing this, I obviously felt that adding the package tag to the list of parents should be part of the scope calculation. This would make things like the breadcrumbs display work "correctly", too. What do you think? Thanks, Jan |