Re: [jde] Re: [jde] problems finding symbol definition if class implements interface
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. 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
Re: [jde] Re: [jde] problems finding symbol definition if class implements interface
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
Re: [jde] problems finding symbol definition if class implements interface
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? Raul On Thu, 2004-10-07 at 15:49 -0700, Raul Acevedo wrote: I have something like: public interface FooInterface { public static final int FOO = 1; } public class FooClass implements FooInterface { public void doSomething() { System.out.println(I'm doing something with + FOO); } } If I put the cursor on the System.out.println, on FOO, jde-open-class-at-point can't find the definition. If I write FooInterface.FOO instead of FOO, it's fine, but FOO by itself is not. Raul
Re: [jde] problems finding symbol definition if class implements interface
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. Paul Raul On Thu, 2004-10-07 at 15:49 -0700, Raul Acevedo wrote: I have something like: public interface FooInterface { public static final int FOO = 1; } public class FooClass implements FooInterface { public void doSomething() { System.out.println(I'm doing something with + FOO); } } If I put the cursor on the System.out.println, on FOO, jde-open-class-at-point can't find the definition. If I write FooInterface.FOO instead of FOO, it's fine, but FOO by itself is not. Raul