Raul Acevedo writes: > On Sat, 2004-10-09 at 00:32 -0400, Paul Kinnucan wrote: > > Raul Acevedo writes: > > > Looking at the JDEE source, it looks like it just doesn't know about > > > symbols in interfaces at all. In particular, jde-open-jump-to-class > > > only knows to look in the parent class, but it doesn't consider any > > > implemented interfaces, either in the current class or in any parent > > > class. Is this a known limitation? > > > > > > > Not to me. jde-open-jump-to-class has other limitations as well. I > > plan to work on removing them as soon as possible. If anybody else > > wants to jump in and help with this, feel free. >
Hi Raul, I'll take a look at your implementation as soon as possible. At the moment, I am working on integrating and qualifying a large backlog of contributions and so it may take me a few days to get to yours. Regards, Paul > Here's an implementation that looks through all interfaces in addition > to the parent classes. It keeps a list of already seen classes lest we > get into an infinite loop somehow. It also restores buffer positions > after it visits a buffer and doesn't find what it wants, and does a > bury-buffer on all intermediate buffers visited so if the definition you > want is in another buffer, and you do Ctrl-x b, your previous buffer is > right there (instead of the default now being some random file you > haven't explicitly visited). > > This method is somewhat complicated so I'm sure I haven't done it the > best way and haven't taken everything into account, but it Works For Me. > > Ideally though this would be done entirely differently... rather than > visiting a bunch of files, maybe there's a way to use the jde-usages > plugin data to find the definition directly and more efficiently. > > Raul > > (defun jde-open-jump-to-class (parsed-symbol class-name java-file-name) > "Opens JAVA-FILE-NAME and place the cursor in the parsed variable" > (let* (tokens super-class seen-before old-point (first-time t)) > ;; if the current buffer contains java-file-name do not try to > ;; open the file > (if (not (string-equal (buffer-file-name) java-file-name)) > (funcall (or jde-open-cap-ff-function-temp-override > jde-open-class-at-point-find-file-function) > java-file-name)) > (setq old-point (point)) > (search-forward "{" nil t) > (setq tokens (append (semantic-tag-type-superclasses > (semantic-current-tag-of-class 'type)) > (semantic-tag-type-interfaces > (semantic-current-tag-of-class 'type)))) > (setq super-class (car tokens)) > (when (and (fboundp 'senator-search-forward) (not (string= parsed-symbol ""))) > (beginning-of-buffer) > (senator-parse) > (setq parsed-symbol (concat "\\b" parsed-symbol "\\b")) > (while (and (not (senator-re-search-forward parsed-symbol nil t)) > (consp tokens)) > (message (format "tokens %s " tokens)) > (let ((token (car tokens))) > (setq tokens (cdr tokens)) > (if (and (stringp token) > (not (member token seen-before))) > ;; searching for the thing-of-interest has failed > ;; let's try in the base class > (progn > (setq seen-before (cons token seen-before)) > (goto-char old-point) > (if (not first-time) (bury-buffer)) > (let ((jde-open-cap-ff-function-temp-override 'find-file)) > (jde-show-superclass-source-2 (ncons token))) > (setq old-point (point)) > (beginning-of-buffer) > (senator-parse) > (search-forward "{" nil t) > (setq tokens (append tokens > (semantic-tag-type-superclasses > (semantic-current-tag-of-class 'type)) > (semantic-tag-type-interfaces > (semantic-current-tag-of-class 'type)))) > ;;if it is the first time try in the class definition > ;;itself. > (if first-time > (progn > (setq first-time nil) > (senator-re-search-forward > (progn > (string-match ".*\\.\\([^.]+\\)$" (concat "." class-name)) > (match-string 1 (concat "." class-name))) > nil t))) > (if (not super-class) > (error "Method not found")) > (setq super-class token)))))))) > >