Thread: [CEDET-devel] Re: xrefdb/semantic overlay bug
Brought to you by:
zappo
From: Suraj A. <sac...@gm...> - 2006-04-14 21:46:09
|
CC'ing cedet-devel as this looks like a semantic bug. Suraj On 4/14/06, vedm <ml...@ro...> wrote: > > > If you have a java method taking an array argument in the form > "aMethod(String args[])" - instead of "aMethod(String[] args)" - then > the the function jde-xref-display-call-tree is confused and thinks that > the method takes an argument named "args[]" of type String, rather than > an argument named "args" of type String[], as it does in reality. > > Therefore the call tree does not display a correct result. > > Here is a simple test class: > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > package xref.tests; > > public class XrefTest { > public static void main(String[] args) { > new XrefTest().run(args); > } > public void run(String args[]) { > System.out.println("Runing, argument:" + args[0]); > } > } > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > If I build the xref db for the above class, put the cursor inside the > "run" method and invoke function jde-xref-display-call-tree, it shows > this: > > [X] void xref.tests.XrefTest.run(String) > > i.e. it tells me that the "run(String) method is not called at all - > which is to be expected, as there is no "run(String)" method in the > code: instead the method is "run(String[])"; > > You can see the root cause if you copy the following in your *scratch* > buffer and execute it, after putting the cursor in the "run" method: > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > (let ((overlays (save-excursion > (set-buffer (get-buffer "XrefTest.java")) > (overlays-at (point))))) > (print (overlay-get (car (cdr overlays)) 'semantic))) > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > When I do this I see something like this in the minibuffer: > > =3D=3D=3D=3D=3D=3D > ("run" function (:typemodifiers ("public") :arguments (("args[]" > variable (:type "String").... > =3D=3D=3D=3D=3D=3D > > i.e the "semantic" overlay says that the run method takes an argument > named "args[]" of type "String", which is wrong. > > > -- > vedm > > |
From: vedm <ml...@ro...> - 2006-04-15 12:40:13
|
"Eric M. Ludlam" <er...@si...> writes: > Hi, > > I used the example below, put it in a java file, then put the cursor > on the 'main' method, and typed: > > M-x semantic-test-all-format-tag-functions > > and the piece I got was: > > semantic-format-tag-prin1: > ("main" function (:typemodifiers ("public" "static") > :arguments (("args" variable (:type "String[]") > (... blah blah blah))))) > > with the [] on String. In run I get as you suggest. > > I suspect this is related to line 722 in > cedet/semantic/wisent/wisent-java-tags.wy where [] is appended to > wherever this thing comes from. > > I don't know enough of Java to know if: > > String[] args > > is different from > > String args[] These two forms express absolutely the same meaning, there is no difference at all. Both of them mean that "args" is an array of Strings. -- vedm |
From: David P. <dav...@wa...> - 2006-04-19 10:06:26
|
Hi Eric, Sorry for this late reply. [...] > I don't know enough of Java to know if: >=20 > String[] args >=20 > is different from >=20 > String args[] There is no difference. It seems that the first notation is the one used in most of the examples in the "Java Language Specifications" manual. Also notice that "String[] args[]" is allowed and equivalent to "String[][] args" or "String args[][]"!=20 > but either way, these [] could be stored as attributes on the tag, > and then exposed later by whatever java specific function is needed > to do the query described below. >=20 > In the c/c++ these are stored in a :dereference attribute, and later > extracted, and the [] are put in a consistent place. You're right. So I took a few time to works on that ;-) And, below is a patch :-) It would be nice If some Java developer could try it (I don't program much in Java now). wisent-java-tags is used to parse Java <=3D1.4 declarations (the default), wisent-java is used to fully parse Java 1.5 syntax. To enable the latter, add the following after loading cedet: ;; Use the full Java 1.5 grammar to parse Java files (autoload 'wisent-java-default-setup "wisent-java" "Hook run to setup Semantic in `java-mode'." nil nil) I updated the prototyping functions in semantic-java to restore the array notation (that suffixes the type) from the :dereference attribute. Please tell me if you want I commit these changes before the release. Enjoy! David 2006-04-19 David Ponce <da...@dp...> =09* cedet/semantic/bovine/semantic-java.el =09(semantic-java-dim, semantic-java-expand-tag): New functions. =09(semantic-java-type): New function. =09(semantic-java-prototype-function) =09(semantic-java-prototype-variable): Use it. =09 =09* cedet/semantic/wisent/wisent-java.el=09 =09* cedet/semantic/wisent/wisent-java-tags.el =09(wisent-java-expand-tag): Remove. =09(wisent-java-default-setup): Use `semantic-java-expand-tag'. Index: bovine/semantic-java.el =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/cedet/cedet/semantic/bovine/semantic-java.el,v retrieving revision 1.12 diff -u -r1.12 semantic-java.el --- bovine/semantic-java.el=0930 Sep 2005 20:22:22 -0000=091.12 +++ bovine/semantic-java.el=0919 Apr 2006 09:49:26 -0000 @@ -1,6 +1,7 @@ ;;; semantic-java.el --- Semantic functions for Java =20 -;;; Copyright (C) 1999, 2000, 2001, 2002, 2003 David Ponce +;;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +;;; David Ponce =20 ;; Author: David Ponce <da...@dp...> ;; X-RCS: $Id: semantic-java.el,v 1.12 2005/09/30 20:22:22 zappo Exp $ @@ -35,7 +36,6 @@ =0C ;;; Lexical analysis ;; - (defconst semantic-java-number-regexp (eval-when-compile (concat "\\(" @@ -83,6 +83,65 @@ | [0-9]+<EXPONENT>?[fFdD] ;") =0C +;;; Parsing +;; +(defsubst semantic-java-dim (id) + "Split ID string into a pair (NAME . DIM). +NAME is ID without trailing brackets: \"[]\". +DIM is the dimension of NAME deduced from the number of trailing +brackets, or 0 if there is no trailing brackets." + (let ((dim (string-match "\\(\\[]\\)+\\'" id))) + (if dim + (cons (substring id 0 dim) + (/ (length (match-string 0 id)) 2)) + (cons id 0)))) + +(defsubst semantic-java-type (tag) + "Return the type of TAG, taking care of array notation." + (let ((type (semantic-tag-type tag)) + (dim (semantic-tag-get-attribute tag :dereference))) + (when dim + (while (> dim 0) + (setq type (concat type "[]") + dim (1- dim)))) + type)) + +(defun semantic-java-expand-tag (tag) + "Expand compound declarations found in TAG into separate tags. +TAG contains compound declarations when its class is `variable', and +its name is a list of elements (NAME START . END), where NAME is a +compound variable name, and START/END are the bounds of the +corresponding compound declaration." + (let* ((class (semantic-tag-class tag)) + (elts (semantic-tag-name tag)) + dim dim0 elt clone start end xpand) + (cond + ((and (eq class 'function) + (> (cdr (setq dim (semantic-java-dim elts))) 0)) + (setq clone (semantic-tag-clone tag (car dim)) + xpand (cons clone xpand)) + (semantic-tag-put-attribute clone :dereference (cdr dim))) + ((eq class 'variable) + (or (consp elts) (setq elts (list (list elts)))) + (setq dim (semantic-java-dim (semantic-tag-get-attribute tag :type)= ) + type (car dim) + dim0 (cdr dim)) + (while elts + ;; For each compound element, clone the initial tag with the + ;; name and bounds of the compound variable declaration. + (setq elt (car elts) + elts (cdr elts) + start (if elts (cadr elt) (semantic-tag-start tag)) + end (if xpand (cddr elt) (semantic-tag-end tag)) + dim (semantic-java-dim (car elt)) + clone (semantic-tag-clone tag (car dim)) + xpand (cons clone xpand)) + (semantic-tag-put-attribute clone :type type) + (semantic-tag-put-attribute clone :dereference (+ dim0 (cdr dim))) + (semantic-tag-set-bounds clone start end))) + ) + xpand)) +=0C ;;; Environment ;; =20 @@ -103,7 +162,7 @@ Optional argument COLOR indicates that color should be mixed in. See also `semantic-format-prototype-tag'." (let ((name (semantic-tag-name tag)) - (type (semantic-tag-type tag)) + (type (semantic-java-type tag)) (args (semantic-tag-function-arguments tag)) (argp "") arg argt) @@ -113,8 +172,8 @@ (if (semantic-tag-p arg) (setq argt (if color (semantic--format-colorize-text - (semantic-tag-type arg) 'type) - (semantic-tag-type arg)) + (semantic-java-type arg) 'type) + (semantic-java-type arg)) argp (concat argp argt (if args "," ""))))) (if color (progn @@ -130,8 +189,8 @@ See also `semantic-format-prototype-tag'." (concat (if color (semantic--format-colorize-text - (semantic-tag-type tag) 'type) - (semantic-tag-type tag)) + (semantic-java-type tag) 'type) + (semantic-java-type tag)) " " (if color (semantic--format-colorize-text Index: wisent/wisent-java-tags.el =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/cedet/cedet/semantic/wisent/wisent-java-tags.el,v retrieving revision 1.31 diff -u -r1.31 wisent-java-tags.el --- wisent/wisent-java-tags.el=0930 Sep 2005 20:25:20 -0000=091.31 +++ wisent/wisent-java-tags.el=0919 Apr 2006 09:49:31 -0000 @@ -1,6 +1,6 @@ ;;; wisent-java-tags.el --- Java LALR parser for Emacs =20 -;; Copyright (C) 2001, 2002 David Ponce +;; Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 David Ponce =20 ;; Author: David Ponce <da...@dp...> ;; Maintainer: David Ponce <da...@dp...> @@ -96,7 +96,7 @@ semantic-lex-number-expression semantic-java-number-regexp semantic-lex-analyzer 'wisent-java-tags-lexer ;; Parsing - semantic-tag-expand-function 'wisent-java-expand-tag + semantic-tag-expand-function 'semantic-java-expand-tag ;; Environment semantic-imenu-summary-function 'semantic-format-tag-prototype imenu-create-index-function 'semantic-create-imenu-index @@ -122,32 +122,8 @@ ;; Setup javadoc stuff (semantic-java-doc-setup)) =20 -(defun wisent-java-expand-tag (tag) - "Expand TAG into a list of equivalent tags, or nil. -Expand multiple variable declarations in the same statement, that is -tags of class `variable' whose name is equal to a list of elements of -the form (NAME START . END). NAME is a variable name. START and END -are the bounds in the declaration, related to this variable NAME." - (let (elts elt clone start end xpand) - (when (and (eq 'variable (semantic-tag-class tag)) - (consp (setq elts (semantic-tag-name tag)))) - ;; There are multiple names in the same variable declaration. - (while elts - ;; For each name element, clone the initial tag and give it - ;; the name of the element. - (setq elt (car elts) - elts (cdr elts) - clone (semantic-tag-clone tag (car elt)) - start (if elts (cadr elt) (semantic-tag-start tag)) - end (if xpand (cddr elt) (semantic-tag-end tag)) - xpand (cons clone xpand)) - ;; Set the bounds of the cloned tag with those of the name - ;; element. - (semantic-tag-set-bounds clone start end)) - xpand))) - ;;;###autoload -(add-hook 'java-mode-hook #'wisent-java-default-setup) +(add-hook 'java-mode-hook 'wisent-java-default-setup) =20 (provide 'wisent-java-tags) =20 Index: wisent/wisent-java.el =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/cedet/cedet/semantic/wisent/wisent-java.el,v retrieving revision 1.48 diff -u -r1.48 wisent-java.el --- wisent/wisent-java.el=0930 Sep 2005 20:25:17 -0000=091.48 +++ wisent/wisent-java.el=0919 Apr 2006 09:49:31 -0000 @@ -1,6 +1,6 @@ ;;; wisent-java.el --- Java LALR parser for Emacs =20 -;; Copyright (C) 2001, 2002 David Ponce +;; Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 David Ponce =20 ;; Author: David Ponce <da...@dp...> ;; Maintainer: David Ponce <da...@dp...> @@ -45,27 +45,6 @@ =20 ;;; Enable Semantic in `java-mode'. ;; -(defun wisent-java-expand-tag (tag) - "Expand compound declarations found in TAG into separate tags. -TAG contains compound declarations when its class is `variable', and -its name is a list of elements (NAME START . END), where NAME is a -compound variable name, and START/END are the bounds of the -corresponding compound declaration." - (let (elts elt clone start end xpand) - (when (and (semantic-tag-of-class-p tag 'variable) - (consp (setq elts (semantic-tag-name tag)))) - (while elts - ;; For each compound element, clone the initial tag with the - ;; name and bounds of the compound variable declaration. - (setq elt (car elts) - elts (cdr elts) - start (if elts (cadr elt) (semantic-tag-start tag)) - end (if xpand (cddr elt) (semantic-tag-end tag)) - clone (semantic-tag-clone tag (car elt)) - xpand (cons clone xpand)) - (semantic-tag-set-bounds clone start end)) - xpand))) - (defun wisent-java-init-parser-context () "Initialize context of the LR parser engine. Used as a local `wisent-pre-parse-hook' to cleanup the stack of enum @@ -85,7 +64,7 @@ semantic-lex-depth nil semantic-lex-analyzer 'wisent-java-lexer ;; Parsing - semantic-tag-expand-function 'wisent-java-expand-tag + semantic-tag-expand-function 'semantic-java-expand-tag ;; Environment semantic-imenu-summary-function 'semantic-format-tag-prototype semantic-imenu-expandable-tag-classes '(type variable) |
From: vedm <ml...@ro...> - 2006-05-02 14:11:05
|
David PONCE <dav...@wa...> writes: [..] > You're right. So I took a few time to works on that ;-) And, below is > a patch :-) It would be nice If some Java developer could try it (I > don't program much in Java now). Hi, I applied the patch but I still get incorrect results in the test that I described in my initial email. In fact now it is a bit worse, because I get an incorrect result both when I use "String[] args" and "String args[]" - in both cases semantic incorrectly shows that the argument is of type "String" instead of "String[]". -- vedm |
From: David P. <dav...@wa...> - 2006-05-04 08:54:04
|
[...] > Hi, I applied the patch but I still get incorrect results in the test > that I described in my initial email. In fact now it is a bit worse, > because I get an incorrect result both when I use "String[] args" and > "String args[]" - in both cases semantic incorrectly shows that the > argument is of type "String" instead of "String[]". Hi, Thanks for testing! It is expected that in both cases you get type "String". As requested by Eric, the array dimension is now stored in the :dereference attribute of the tag, like for C/C++. It is the responsibility of the programmer to interpret that attribute. You can use the new function `semantic-java-type' in semantic-java to get the tag type with the correct array suffix, that is "String[]" in your example. Sincerely, David |
From: Eric M. L. <er...@si...> - 2006-05-04 11:58:55
|
>>> David Ponce <dav...@wa...> seems to think that: >[...] > > Hi, I applied the patch but I still get incorrect results in the test > > that I described in my initial email. In fact now it is a bit worse, > > because I get an incorrect result both when I use "String[] args" and > > "String args[]" - in both cases semantic incorrectly shows that the > > argument is of type "String" instead of "String[]". > >Hi, > >Thanks for testing! > >It is expected that in both cases you get type "String". As requested >by Eric, the array dimension is now stored in the :dereference >attribute of the tag, like for C/C++. It is the responsibility of the >programmer to interpret that attribute. > >You can use the new function `semantic-java-type' in semantic-java to >get the tag type with the correct array suffix, that is "String[]" in >your example. [ ... ] Hi, The function `semantic-java-type' seems like something that would be useful in semantic-format.el as an override function. The code in semantic-format.el that will construct the needed text is duplicated in a couple spots. This seems like a useful discovery that could make that semantic-format API more useful. Eric -- Eric Ludlam: za...@gn..., er...@si... Home: http://www.ludlam.net Siege: www.siege-engine.com Emacs: http://cedet.sourceforge.net GNU: www.gnu.org |
From: David P. <dav...@wa...> - 2006-05-04 18:41:52
|
Hi Eric, [...] >> You can use the new function `semantic-java-type' in semantic-java to >> get the tag type with the correct array suffix, that is "String[]" in >> your example. [...] > The function `semantic-java-type' seems like something that would be > useful in semantic-format.el as an override function. The code in > semantic-format.el that will construct the needed text is duplicated > in a couple spots. This seems like a useful discovery that could make > that semantic-format API more useful. I agree. Would you suggest to use the already existing overload `semantic-format-tag-type'? Or a new array-specific function? The former could be a good candidate. However it seems that the other format functions append the array suffix to the tag name, not the tag type. I am not sure what notation should be used in C/C++: "int i[]", or "int[] i". In Java, it seems that the latter is the preferred one. Any advice? Thanks David |
From: vedm <ml...@ro...> - 2006-05-08 19:22:53
|
OK, seems that this is fixed: I applied the patch below in David's email and then substituted semantic-java-type for semantic-token-type only in one place in the function jde-xref-class-and-token-to-signature: So this is the original form in jde-xref-class-and-token-to-signature: (if (eq tclass 'function) (mapcar (lambda (arg) (jde-parse-get-unqualified-name (semantic-token-type arg))) (semantic-token-function-args token)) (list (jde-parse-get-unqualified-name ttype))) and this is how I modified it (the only difference being the 4th line): (if (eq tclass 'function) (mapcar (lambda (arg) (jde-parse-get-unqualified-name (semantic-java-type arg))) (semantic-token-function-args token)) (list (jde-parse-get-unqualified-name ttype))) After this I get a correct result and jde-xref-display-call-tree displays the correct call tree. Thanks David! -- vedm David PONCE <dav...@wa...> writes: > Hi Eric, > > Sorry for this late reply. > > [...] >> I don't know enough of Java to know if: >> >> String[] args >> >> is different from >> >> String args[] > > There is no difference. It seems that the first notation is the > one used in most of the examples in the "Java Language Specifications" > manual. > > Also notice that "String[] args[]" is allowed and equivalent to > "String[][] args" or "String args[][]"! > >> but either way, these [] could be stored as attributes on the tag, >> and then exposed later by whatever java specific function is needed >> to do the query described below. >> >> In the c/c++ these are stored in a :dereference attribute, and later >> extracted, and the [] are put in a consistent place. > > You're right. So I took a few time to works on that ;-) And, below is > a patch :-) It would be nice If some Java developer could try it (I > don't program much in Java now). > > wisent-java-tags is used to parse Java <=1.4 declarations (the > default), wisent-java is used to fully parse Java 1.5 syntax. To > enable the latter, add the following after loading cedet: > > ;; Use the full Java 1.5 grammar to parse Java files > (autoload 'wisent-java-default-setup "wisent-java" > "Hook run to setup Semantic in `java-mode'." nil nil) > > I updated the prototyping functions in semantic-java to restore the > array notation (that suffixes the type) from the :dereference > attribute. > > Please tell me if you want I commit these changes before the release. > > Enjoy! > David > > 2006-04-19 David Ponce <da...@dp...> > > * cedet/semantic/bovine/semantic-java.el > > (semantic-java-dim, semantic-java-expand-tag): New functions. > (semantic-java-type): New function. > (semantic-java-prototype-function) > (semantic-java-prototype-variable): Use it. > > * cedet/semantic/wisent/wisent-java.el > * cedet/semantic/wisent/wisent-java-tags.el > > (wisent-java-expand-tag): Remove. > (wisent-java-default-setup): Use `semantic-java-expand-tag'. > > Index: bovine/semantic-java.el > =================================================================== > RCS file: /cvsroot/cedet/cedet/semantic/bovine/semantic-java.el,v > retrieving revision 1.12 > diff -u -r1.12 semantic-java.el > --- bovine/semantic-java.el 30 Sep 2005 20:22:22 -0000 1.12 > +++ bovine/semantic-java.el 19 Apr 2006 09:49:26 -0000 > @@ -1,6 +1,7 @@ > ;;; semantic-java.el --- Semantic functions for Java > > -;;; Copyright (C) 1999, 2000, 2001, 2002, 2003 David Ponce > +;;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 > +;;; David Ponce > > ;; Author: David Ponce <da...@dp...> > ;; X-RCS: $Id: semantic-java.el,v 1.12 2005/09/30 20:22:22 zappo Exp $ > @@ -35,7 +36,6 @@ > > ;;; Lexical analysis > ;; > - > (defconst semantic-java-number-regexp > (eval-when-compile > (concat "\\(" > @@ -83,6 +83,65 @@ > | [0-9]+<EXPONENT>?[fFdD] > ;") > > +;;; Parsing > +;; > +(defsubst semantic-java-dim (id) > + "Split ID string into a pair (NAME . DIM). > +NAME is ID without trailing brackets: \"[]\". > +DIM is the dimension of NAME deduced from the number of trailing > +brackets, or 0 if there is no trailing brackets." > + (let ((dim (string-match "\\(\\[]\\)+\\'" id))) > + (if dim > + (cons (substring id 0 dim) > + (/ (length (match-string 0 id)) 2)) > + (cons id 0)))) > + > +(defsubst semantic-java-type (tag) > + "Return the type of TAG, taking care of array notation." > + (let ((type (semantic-tag-type tag)) > + (dim (semantic-tag-get-attribute tag :dereference))) > + (when dim > + (while (> dim 0) > + (setq type (concat type "[]") > + dim (1- dim)))) > + type)) > + > +(defun semantic-java-expand-tag (tag) > + "Expand compound declarations found in TAG into separate tags. > +TAG contains compound declarations when its class is `variable', and > +its name is a list of elements (NAME START . END), where NAME is a > +compound variable name, and START/END are the bounds of the > +corresponding compound declaration." > + (let* ((class (semantic-tag-class tag)) > + (elts (semantic-tag-name tag)) > + dim dim0 elt clone start end xpand) > + (cond > + ((and (eq class 'function) > + (> (cdr (setq dim (semantic-java-dim elts))) 0)) > + (setq clone (semantic-tag-clone tag (car dim)) > + xpand (cons clone xpand)) > + (semantic-tag-put-attribute clone :dereference (cdr dim))) > + ((eq class 'variable) > + (or (consp elts) (setq elts (list (list elts)))) > + (setq dim (semantic-java-dim (semantic-tag-get-attribute tag :type)) > + type (car dim) > + dim0 (cdr dim)) > + (while elts > + ;; For each compound element, clone the initial tag with the > + ;; name and bounds of the compound variable declaration. > + (setq elt (car elts) > + elts (cdr elts) > + start (if elts (cadr elt) (semantic-tag-start tag)) > + end (if xpand (cddr elt) (semantic-tag-end tag)) > + dim (semantic-java-dim (car elt)) > + clone (semantic-tag-clone tag (car dim)) > + xpand (cons clone xpand)) > + (semantic-tag-put-attribute clone :type type) > + (semantic-tag-put-attribute clone :dereference (+ dim0 (cdr dim))) > + (semantic-tag-set-bounds clone start end))) > + ) > + xpand)) > + > ;;; Environment > ;; > > @@ -103,7 +162,7 @@ > Optional argument COLOR indicates that color should be mixed in. > See also `semantic-format-prototype-tag'." > (let ((name (semantic-tag-name tag)) > - (type (semantic-tag-type tag)) > + (type (semantic-java-type tag)) > (args (semantic-tag-function-arguments tag)) > (argp "") > arg argt) > @@ -113,8 +172,8 @@ > (if (semantic-tag-p arg) > (setq argt (if color > (semantic--format-colorize-text > - (semantic-tag-type arg) 'type) > - (semantic-tag-type arg)) > + (semantic-java-type arg) 'type) > + (semantic-java-type arg)) > argp (concat argp argt (if args "," ""))))) > (if color > (progn > @@ -130,8 +189,8 @@ > See also `semantic-format-prototype-tag'." > (concat (if color > (semantic--format-colorize-text > - (semantic-tag-type tag) 'type) > - (semantic-tag-type tag)) > + (semantic-java-type tag) 'type) > + (semantic-java-type tag)) > " " > (if color > (semantic--format-colorize-text > Index: wisent/wisent-java-tags.el > =================================================================== > RCS file: /cvsroot/cedet/cedet/semantic/wisent/wisent-java-tags.el,v > retrieving revision 1.31 > diff -u -r1.31 wisent-java-tags.el > --- wisent/wisent-java-tags.el 30 Sep 2005 20:25:20 -0000 1.31 > +++ wisent/wisent-java-tags.el 19 Apr 2006 09:49:31 -0000 > @@ -1,6 +1,6 @@ > ;;; wisent-java-tags.el --- Java LALR parser for Emacs > > -;; Copyright (C) 2001, 2002 David Ponce > +;; Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 David Ponce > > ;; Author: David Ponce <da...@dp...> > ;; Maintainer: David Ponce <da...@dp...> > @@ -96,7 +96,7 @@ > semantic-lex-number-expression semantic-java-number-regexp > semantic-lex-analyzer 'wisent-java-tags-lexer > ;; Parsing > - semantic-tag-expand-function 'wisent-java-expand-tag > + semantic-tag-expand-function 'semantic-java-expand-tag > ;; Environment > semantic-imenu-summary-function 'semantic-format-tag-prototype > imenu-create-index-function 'semantic-create-imenu-index > @@ -122,32 +122,8 @@ > ;; Setup javadoc stuff > (semantic-java-doc-setup)) > > -(defun wisent-java-expand-tag (tag) > - "Expand TAG into a list of equivalent tags, or nil. > -Expand multiple variable declarations in the same statement, that is > -tags of class `variable' whose name is equal to a list of elements of > -the form (NAME START . END). NAME is a variable name. START and END > -are the bounds in the declaration, related to this variable NAME." > - (let (elts elt clone start end xpand) > - (when (and (eq 'variable (semantic-tag-class tag)) > - (consp (setq elts (semantic-tag-name tag)))) > - ;; There are multiple names in the same variable declaration. > - (while elts > - ;; For each name element, clone the initial tag and give it > - ;; the name of the element. > - (setq elt (car elts) > - elts (cdr elts) > - clone (semantic-tag-clone tag (car elt)) > - start (if elts (cadr elt) (semantic-tag-start tag)) > - end (if xpand (cddr elt) (semantic-tag-end tag)) > - xpand (cons clone xpand)) > - ;; Set the bounds of the cloned tag with those of the name > - ;; element. > - (semantic-tag-set-bounds clone start end)) > - xpand))) > - > ;;;###autoload > -(add-hook 'java-mode-hook #'wisent-java-default-setup) > +(add-hook 'java-mode-hook 'wisent-java-default-setup) > > (provide 'wisent-java-tags) > > Index: wisent/wisent-java.el > =================================================================== > RCS file: /cvsroot/cedet/cedet/semantic/wisent/wisent-java.el,v > retrieving revision 1.48 > diff -u -r1.48 wisent-java.el > --- wisent/wisent-java.el 30 Sep 2005 20:25:17 -0000 1.48 > +++ wisent/wisent-java.el 19 Apr 2006 09:49:31 -0000 > @@ -1,6 +1,6 @@ > ;;; wisent-java.el --- Java LALR parser for Emacs > > -;; Copyright (C) 2001, 2002 David Ponce > +;; Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 David Ponce > > ;; Author: David Ponce <da...@dp...> > ;; Maintainer: David Ponce <da...@dp...> > @@ -45,27 +45,6 @@ > > ;;; Enable Semantic in `java-mode'. > ;; > -(defun wisent-java-expand-tag (tag) > - "Expand compound declarations found in TAG into separate tags. > -TAG contains compound declarations when its class is `variable', and > -its name is a list of elements (NAME START . END), where NAME is a > -compound variable name, and START/END are the bounds of the > -corresponding compound declaration." > - (let (elts elt clone start end xpand) > - (when (and (semantic-tag-of-class-p tag 'variable) > - (consp (setq elts (semantic-tag-name tag)))) > - (while elts > - ;; For each compound element, clone the initial tag with the > - ;; name and bounds of the compound variable declaration. > - (setq elt (car elts) > - elts (cdr elts) > - start (if elts (cadr elt) (semantic-tag-start tag)) > - end (if xpand (cddr elt) (semantic-tag-end tag)) > - clone (semantic-tag-clone tag (car elt)) > - xpand (cons clone xpand)) > - (semantic-tag-set-bounds clone start end)) > - xpand))) > - > (defun wisent-java-init-parser-context () > "Initialize context of the LR parser engine. > Used as a local `wisent-pre-parse-hook' to cleanup the stack of enum > @@ -85,7 +64,7 @@ > semantic-lex-depth nil > semantic-lex-analyzer 'wisent-java-lexer > ;; Parsing > - semantic-tag-expand-function 'wisent-java-expand-tag > + semantic-tag-expand-function 'semantic-java-expand-tag > ;; Environment > semantic-imenu-summary-function 'semantic-format-tag-prototype > semantic-imenu-expandable-tag-classes '(type variable) > > > > |
From: Eric M. L. <er...@si...> - 2006-04-15 00:29:16
|
Hi, I used the example below, put it in a java file, then put the cursor on the 'main' method, and typed: M-x semantic-test-all-format-tag-functions and the piece I got was: semantic-format-tag-prin1: ("main" function (:typemodifiers ("public" "static") :arguments (("args" variable (:type "String[]") (... blah blah blah))))) with the [] on String. In run I get as you suggest. I suspect this is related to line 722 in cedet/semantic/wisent/wisent-java-tags.wy where [] is appended to wherever this thing comes from. I don't know enough of Java to know if: String[] args is different from String args[] but either way, these [] could be stored as attributes on the tag, and then exposed later by whatever java specific function is needed to do the query described below. In the c/c++ these are stored in a :dereference attribute, and later extracted, and the [] are put in a consistent place. In the end, I think line 587 should be converted to 'cons', later in wisent-java-tags.el the function wisent-java-expand-tag would need to be tweaked to add this particular case... whatever that may be. I'll defer to David Ponce who wrote this as he may have had a reason to do it as he did. Eric >>> "Suraj Acharya" <sac...@gm...> seems to think that: >CC'ing cedet-devel as this looks like a semantic bug. > >Suraj > >On 4/14/06, vedm <ml...@ro...> wrote: >> >> >> If you have a java method taking an array argument in the form >> "aMethod(String args[])" - instead of "aMethod(String[] args)" - then >> the the function jde-xref-display-call-tree is confused and thinks that >> the method takes an argument named "args[]" of type String, rather than >> an argument named "args" of type String[], as it does in reality. >> >> Therefore the call tree does not display a correct result. >> >> Here is a simple test class: >> >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> package xref.tests; >> >> public class XrefTest { >> public static void main(String[] args) { >> new XrefTest().run(args); >> } >> public void run(String args[]) { >> System.out.println("Runing, argument:" + args[0]); >> } >> } >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> >> If I build the xref db for the above class, put the cursor inside the >> "run" method and invoke function jde-xref-display-call-tree, it shows >> this: >> >> [X] void xref.tests.XrefTest.run(String) >> >> i.e. it tells me that the "run(String) method is not called at all - >> which is to be expected, as there is no "run(String)" method in the >> code: instead the method is "run(String[])"; >> >> You can see the root cause if you copy the following in your *scratch* >> buffer and execute it, after putting the cursor in the "run" method: >> >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> (let ((overlays (save-excursion >> (set-buffer (get-buffer "XrefTest.java")) >> (overlays-at (point))))) >> (print (overlay-get (car (cdr overlays)) 'semantic))) >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> >> When I do this I see something like this in the minibuffer: >> >> =3D=3D=3D=3D=3D=3D >> ("run" function (:typemodifiers ("public") :arguments (("args[]" >> variable (:type "String").... >> =3D=3D=3D=3D=3D=3D >> >> i.e the "semantic" overlay says that the run method takes an argument >> named "args[]" of type "String", which is wrong. >> >> >> -- >> vedm >> >> > ------------------------------------------------------- This SF.Net email is sponsored by xPML, a groundbreaking scripting language that extends applications into web and mobile media. Attend the live webcast and join the prime developer group breaking into this new coding territory! http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642 _______________________________________________ Cedet-devel mailing list Ced...@li... https://lists.sourceforge.net/lists/listinfo/cedet-devel -- Eric Ludlam: za...@gn..., er...@si... Home: http://www.ludlam.net Siege: www.siege-engine.com Emacs: http://cedet.sourceforge.net GNU: www.gnu.org |