Eric,
  Once again, thanks for the info; 
For those who are following along at home, i'll include the two functions of 
interest.
(and the patch to create them from 2.4.0 svn-191)
And it all works pretty much as you expect and describe.
The only deviation is that I find jde-insert-imports-into-buffer requires both 
of:
     (semantic-fetch-tags)  (semantic-parse-changes)
In order that then next/subsequent usage of jde-insert-imports-into-buffer
actually sees the previously inserted import lines. 
A simple call to (semantic-fetch-tags) does not seem to notice the new import 
statements.
(and not seeing them, the logic in jde-insert-imports-into-buffer inserts a 
*new* copy of the imports)
Given the file:
package foo;
public class Foo {
 Map foo = new HashMap();
}

jde-import-get-insertion-point first gets "tags" as:
tags = ((foo package nil (reparse-symbol package_declaration) #<overlay from 1 
to 13 in Foo.java>)
        (Foo type (:typemodifiers (public) ... class_declaration... )) 
#<overlay from 14 to 60 in Foo.java>))
And then inserts two import lines (and highlight-edits shows no highlighting):
package foo;
import java.util.HashMap;
import java.util.Map;
public class Foo {
 Map foo = new HashMap();
}

and then call jde-insert-import-into-buffer again; now, 
jde-import-get-insertion-point gets "tags" as:
tags = ((foo package nil (reparse-symbol package_declaration) #<overlay from 1 
to 13 in Foo.java>)
 (java.util.HashMap include nil ... import_delaration ... #<overlay from 14 to 
39 in Foo.java>)
 (java.util.Map include nil (reparse-symbol import_declaration) #<overlay from 
40 to 61 in Foo.java>)
 (Foo type (:typemodifiers (public) ... class_declaration...)) #<overlay from 
62 to 108 in Foo.java>))

Note: without adding (semantic-fetch-tags)  (semantic-parse-changes), 
the import_declaration tags are not found, leaving a "hole" between 13 and 62:
tags = ((foo package nil (reparse-symbol package_declaration) #<overlay from 1 
to 13 in Foo.java>)
        (Foo type (:typemodifiers (public) :members ... class_declaration 
#<overlay from 62 to 108 in Foo.java>))

As you say, the speed of reparse is not an issue, and with this patch, the 
logic works just fine.
For those that are curious, here are the two functions involved:

(defun jde-import-insert-imports-into-buffer (new-imports &optional exclude)
  "Inserts imports into the correct place in the buffer."
  (save-excursion
    (goto-char (jde-import-get-import-insertion-point)) ;
    (if (not jde-xemacsp) (deactivate-mark))
    (if exclude
        (setq new-imports (jde-import-exclude-imports new-imports)))
    (loop for new-import in new-imports do
          (when (> (length new-import) 0) ; added to avoid insert empty import 
statements.
            (insert (concat "import " new-import ";\n"))
            (message "Imported %s" new-import)))
    (if jde-import-auto-collapse-imports
        (let (jde-import-auto-collapse-imports) ; setting this to avoid 
infinite recursion
          (jde-import-collapse-imports)))
    (if jde-import-auto-sort
        (funcall jde-import-auto-sort-function))
    (semantic-fetch-tags)       ; add these two lines
    (semantic-parse-changes)    ; to avoid duplicate inserts
    ))

(defun jde-import-get-import-insertion-point ()
  "Determine where to insert an import statement.
If the buffer contains an import statement, return
the beginning of the next line; otherwise, if
the buffer contains a package statement, insert
three empty lines and return the beginning of
the second empty line; otherwise, if the buffer
contains a class definition, return the beginning
of the line before the class definition; otherwise,
return the beginning of the buffer."
  (flet ((insertion-point-after (tag-end)
          (save-excursion
            (goto-char tag-end)
            (if (eolp) (forward-char 1)(forward-line 1)) ;skip comment
            (unless (bolp) (insert "\n"))                ;open empty line
            (point)
            )))
    (let* ((tags (semantic-fetch-tags))    ; (xx (message "tags = %s" tags))
           (import-tag (car
                        (last (semantic-brute-find-tag-by-class
                               'include tags))))
           (package-tag (car (semantic-brute-find-tag-by-class
                              'package tags)))
           (class-tag (car (semantic-brute-find-tag-by-class
                            'type tags)))
           )
      (cond (import-tag
             (insertion-point-after (semantic-tag-end import-tag)))
            (package-tag
             (insertion-point-after (semantic-tag-end package-tag)))
            (class-tag
             (let ((comment-token (semantic-documentation-for-tag
                                   class-tag 'lex)))
               (if comment-token
                   (semantic-lex-token-start comment-token)
                 (semantic-tag-start class-tag))))
            (t 1))
      )))

 
------------------------------------------------------------------------------
This SF.Net email is sponsored by the Verizon Developer Community
Take advantage of Verizon's best-in-class app development support
A streamlined, 14 day to market process makes app distribution fast and easy
Join now and get one step closer to millions of Verizon customers
http://p.sf.net/sfu/verizon-dev2dev 
_______________________________________________
jdee-devel mailing list
jdee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jdee-devel

Reply via email to