Hello,
 
Attached is an improved advised version `jde-create-imenu-index' and
`jde-imenu-index-class' which displays full method signatures in the
"Classes" imenu depending on the setting of the customizable option
`jde-enable-full-method-signatures-index-menu'.

Sincerely,
David <[EMAIL PROTECTED]>
(defcustom jde-enable-full-method-signatures-index-menu nil
  "If non-nil the \"Classes\" imenu displays full method signatures.
Use \"*rescan*\" to update the imenu when this option is changed."
  :group 'jde-project
  :type 'boolean)

(defadvice jde-imenu-index-class (around my-jde-imenu-index-class (tokens) activate)
  "Creates an imenu index for a class. Displays full method signatures
if `jde-enable-full-method-signatures-index-menu' is non-nil."
  (let ((methods (semantic-find-nonterminal-by-token 'function tokens))
        (fields  (semantic-find-nonterminal-by-token 'variable tokens))
        (classes (semantic-find-nonterminal-by-token 'type     tokens))
        index)

    (while methods
      (let* ((method-token (car methods))
             (method-name  (semantic-token-name method-token))
             (method-pos   (semantic-token-start method-token))
             method-sig)
        (if jde-enable-full-method-signatures-index-menu
            (let ((method-type  (semantic-token-type method-token))
                  (method-args  (semantic-token-function-args method-token)))
              (setq method-sig (if method-type
                                   (format "%s %s(" method-type method-name)
                                 (format "%s(" method-name)))
              (while method-args
                (let ((method-arg-token (car method-args))
                      method-arg-type)
                  (when method-arg-token
                    (setq method-arg-type (semantic-token-type method-arg-token))
                    (setq method-sig (concat method-sig method-arg-type))))
                (setq method-args (cdr method-args))
                (if method-args (setq method-sig (concat method-sig ","))))
              (setq method-sig (concat method-sig ")")))
          (setq method-sig (format "%s()" method-name)))
        (setq index
              (append
               index (list (cons method-sig method-pos)))))
      (setq methods (cdr methods)))
    
    (while fields
      (let* ((field-token (car fields))
             (field-name  (semantic-token-name  field-token))
             (field-pos   (semantic-token-start field-token)))
        (setq index 
              (append 
               index (list (cons field-name field-pos)))))
      (setq fields (cdr fields)))

    (while classes
      (let* ((class-token  (car classes))
             (class-name   (semantic-token-name       class-token))
             (parts        (semantic-token-type-parts class-token))
             (class-index  (jde-imenu-index-class parts)))
        (setq index 
              (append 
               index 
               (list (cons (concat "class " class-name) class-index)))))
      (setq classes (cdr classes)))
    (setq ad-return-value index)))

(defadvice jde-create-imenu-index (around my-jde-create-imenu-index () activate)
  "Creates an imenu index for a Java source buffer.
This function uses the semantic bovinator to index the buffer."

  ;; The following clears the toplevel bovin cache for the current
  ;; buffer and forces *rescan* to work even if the current buffer has
  ;; not been modifified. This is needed to rebuild the "Classes" imenu when
  ;; `jde-enable-full-method-signatures-index-menu' option is changed.
  (semantic-clear-toplevel-cache)
  
  (let* ((tokens   (semantic-bovinate-toplevel))
         (packages (semantic-find-nonterminal-by-token 'package tokens))
         (depends  (semantic-find-nonterminal-by-token 'include tokens))
         (classes  (semantic-find-nonterminal-by-token 'type tokens))
         depend-index
         index)

    (while classes
      (let* ((class-token (car classes))
             (class-name  (semantic-token-name       class-token))
             (parts       (semantic-token-type-parts class-token))
             (class-index (jde-imenu-index-class parts)))
        (setq index 
              (append 
               index 
               (list (cons (concat "class " class-name) class-index)))))
      (setq classes (cdr classes)))

    (while depends
      (let* ((depend-token (car depends))
             (depend-name  (semantic-token-name  depend-token))
             (depend-pos   (semantic-token-start depend-token)))
        (setq depend-index (append depend-index (list (cons depend-name depend-pos)))))
      (setq depends (cdr depends)))
    (if depend-index
        (setq index (append index (list (cons "Imports" depend-index)))))

    (while packages
      (let* ((package-token (car packages))
             (package-name  (semantic-token-name  package-token))
             (package-pos   (semantic-token-start package-token)))
        (setq index 
              (append 
               index 
               (list (cons (concat "package " package-name) package-pos)))))
      (setq packages (cdr packages)))
    (setq ad-return-value index)))

Reply via email to