Thread: [CEDET-devel] Bug in semantic/db-javap and analysis and my kludge/patch for it
Brought to you by:
zappo
From: Ilan <ila...@gm...> - 2014-04-18 18:46:54
|
Hi, There is a bug that stops smart completion for methods working for some classes and not others for Java. Below is an example. It works for "in" but not for "bingo". package com.ilanpillemer.pingpong; import java.lang.String; public class Hello { private java.io.PrintStream in; private java.lang.String bingo; private void test() { in. // smart completion works here bingo. // smart completion does not work here } } // Hello In order to debug I ran bovinate on the javap output for both, and it did not work for java.lang.String and did work for the other. Below is the javap output for java.lang.String // Compiled from "String.java" public final class String implements java.io.Serializable, java.lang.Comparable<java.lang.String>, java.lang.CharSequence { public static final java.util.Comparator<java.lang.String> CASE_INSENSITIVE_ORDER; public java.lang.String(); public java.lang.String(java.lang.String); public java.lang.String(char[]); ... and so forth After a bit of clunking around I found out if I remove the generic in the class signature bovinate starts working.. ie I change the above to this. // Compiled from "String.java" public final class String implements java.io.Serializable, java.lang.Comparable, java.lang.CharSequence { public static final java.util.Comparator<java.lang.String> CASE_INSENSITIVE_ORDER; public java.lang.String(); public java.lang.String(java.lang.String); public java.lang.String(char[]); Then bovinate works; and auto-complete works and I can get back to using cedet for java programming. I patched my copy of the file as follows with a kludge which is probably too much of a hammer as I suspect you only need to remove the generic in the signature. But I don't really know how to use regex and a novice with elisp - so was just pleased that this worked and got auto-complete working again... bzr also I know very little about so was not sure how to send a patch directly through. Below is the output of "bzr diff" === modified file 'lisp/cedet/semantic/db-javap.el' --- lisp/cedet/semantic/db-javap.el 2014-02-17 12:57:23 +0000 +++ lisp/cedet/semantic/db-javap.el 2014-04-18 18:32:12 +0000 @@ -779,7 +779,14 @@ (while (re-search-forward "\\(class\\|interface\\) \\([^\\. ]*\\.\\)+" nil t) (replace-match "\\1 " nil nil)) ) - + + ;; strip out generics as bovinate dies on them + (save-excursion + (goto-char (point-min)) + (while (re-search-forward "<.*>" nil t) + (replace-match "" nil nil)) + ) + ;; Enable java mode and semantic parsing. (java-mode) (semantic-new-buffer-fcn) |
From: Eric M. L. <er...@si...> - 2014-04-21 11:39:19
|
Hi Ilan, I don't use Java much, but I did write the javap data base on top of the existing parser. As I understand it, generics aren't supported by the current java parser. Your solution seems like a reasonable way to go about it. Hopefully one of the java experts on the list will have a suggestion, such as if what you noted below belongs in the parser, or if it is something about javap output that should be stripped out as with the other modifications that are made on javap output. If we can support generics in the parser, even if it is just about parsing over the text, that would help our general Java support more. Thanks Eric On 04/18/2014 02:46 PM, Ilan wrote: > Hi, > > There is a bug that stops smart completion for methods working for some > classes and not others for Java. > Below is an example. It works for "in" but not for "bingo". > > package com.ilanpillemer.pingpong; > import java.lang.String; > > public class Hello { > private java.io.PrintStream in; > private java.lang.String bingo; > private void test() { > in. // smart completion works here > bingo. // smart completion does not work here > } > } // Hello > > In order to debug I ran bovinate on the javap output for both, and it > did not work for java.lang.String and did work for the other. > > Below is the javap output for java.lang.String > > // Compiled from "String.java" > public final class String implements java.io.Serializable, > java.lang.Comparable<java.lang.String>, java.lang.CharSequence { > public static final java.util.Comparator<java.lang.String> > CASE_INSENSITIVE_ORDER; > public java.lang.String(); > public java.lang.String(java.lang.String); > public java.lang.String(char[]); > ... and so forth > > After a bit of clunking around I found out if I remove the generic in > the class signature bovinate starts working.. ie I change the above to this. > > // Compiled from "String.java" > public final class String implements java.io.Serializable, > java.lang.Comparable, java.lang.CharSequence { > public static final java.util.Comparator<java.lang.String> > CASE_INSENSITIVE_ORDER; > public java.lang.String(); > public java.lang.String(java.lang.String); > public java.lang.String(char[]); > > Then bovinate works; and auto-complete works and I can get back to using > cedet for java programming. > > I patched my copy of the file as follows with a kludge which is probably > too much of a hammer as I suspect you only need to remove the generic in > the signature. But I don't really know how to use regex and a novice > with elisp - so was just pleased that this worked and got auto-complete > working again... bzr also I know very little about so was not sure how > to send a patch directly through. Below is the output of "bzr diff" > > === modified file 'lisp/cedet/semantic/db-javap.el' > --- lisp/cedet/semantic/db-javap.el 2014-02-17 12:57:23 +0000 > +++ lisp/cedet/semantic/db-javap.el 2014-04-18 18:32:12 +0000 > @@ -779,7 +779,14 @@ > (while (re-search-forward "\\(class\\|interface\\) \\([^\\. ]*\\.\\)+" > nil t) > (replace-match "\\1 " nil nil)) > ) > - > + > + ;; strip out generics as bovinate dies on them > + (save-excursion > + (goto-char (point-min)) > + (while (re-search-forward "<.*>" nil t) > + (replace-match "" nil nil)) > + ) > + > ;; Enable java mode and semantic parsing. > (java-mode) > (semantic-new-buffer-fcn) > > > > ------------------------------------------------------------------------------ > Learn Graph Databases - Download FREE O'Reilly Book > "Graph Databases" is the definitive new guide to graph databases and their > applications. Written by three acclaimed leaders in the field, > this first edition is now available. Download your free book today! > http://p.sf.net/sfu/NeoTech > > > > _______________________________________________ > Cedet-devel mailing list > Ced...@li... > https://lists.sourceforge.net/lists/listinfo/cedet-devel |