Re: Trouble with Java package imports

David Ventimiglia <[email protected]> Sun, 23 Oct 2016 08:39:13 -0700
Newsgroups gmane.emacs.semantic
Message-ID <CALaE=t-dZ754mZP0UGHpt0wLGV_SW2XYq7BM3EAxMS_XRumnLw@mail.gmail.com>
--===============2915050964605889261==
Content-Type: multipart/alternative; boundary=001a113a7de8ff3f63053f8a1489

--001a113a7de8ff3f63053f8a1489
Content-Type: text/plain; charset=UTF-8

Hi Edward,

Thanks for the reply.  Sorry for the delay; I was on vacation, I'm afraid.
In any case, I took your advice and am publishing it in the usual way,
which is to push an update to my Docker image dventimi/docker-emacs.  It
has these changes.

   1. In ~/Scratch/emacs/ there are new files:  Greet1.java, Greet2.java,
   and greeter.jar
   2. In ~/.emacs the ede-java-root-project form includes the
   :localclasspath keyword, set to '("greeter.java").

Here's what's going on.  The greeter.jar file contains two compiled class
files, Greeter1.class and Greeter2.class, both of which are in the
"greeter" package.  They both define methods "hello" and "goodbye."  Moving
on, the Greet1.java and Greet2.java files are, naturally, almost identical,
and are simple "Hello, World" style programs just to test completion.  Both
of these use (or try to use) the Greeter1 class, which is in the supplied
greeter.jar file.  Minor point:  the Greeter2 class is kinda superfluous,
except I wanted to have a JAR file that had more than one class.  Anyway,
Greet1 and Greet2 take two different approaches.  The former has an "import
greeter.Greeter1" declaration, while the latter has an "import greeter.*"
declaration, i.e. the former imports just a class while the latter imports
the whole package.  Nothing imports or makes use of classes in the standard
library and nothing makes use of either Generics or Annotations.  This is
my attempt at replicating it with the smallest possible example of the
problem.  The result is that semantic is able to complete symbols (there
are just two, hello() and goodbye()) when in Greet1.java it does "import
greeter.Greeter1," but it is not able to complete anything when in
Greet2.java it does "import greeter.*"

I hope that makes sense.  :)

I haven't yet tried to debug this.  I will do that now, but will be
unsurprised if I encounter the same underlying factors listed above.
Again, the Docker image can be pulled with

docker pull dventimi/docker-emacs


and Emacs can be launched on the problematic Greet2.java file with

docker run -t -i dventimi/docker-emacs emacs /root/Scratch/Greet2.java


Warm regards,
David

On Tue, Oct 4, 2016 at 11:09 AM, Edward John Steere <[email protected]
> wrote:

>
> > I've a few clues about the error with Java package includes.
> >
> > First, with a package include (i.e., "include java.util.*") the tag at
> point has a proxy (:proxy keyword)--whatever that is--that sends us down a
> branch starting with semanticdb-javap-resolve-proxy. Without a package
> include (i.e., "include java.util.Map") the proxy
> > is nil, there's no proxy-function, and we steam on ahead. See
> semantic-tag-resolve-proxy in tag.el:
> >
> >  (defun semantic-tag-resolve-proxy (tag)
> >  "Resolve the proxy in TAG.
> >  The return value is whatever format the proxy was setup as.
> >  It should be a list of complete tags.
> >  If TAG has no proxy, then just return tag."
> >  (let* ((proxy (semantic--tag-get-property tag :proxy))
> >  (function (get proxy 'proxy-function))
> >  (data (get proxy 'proxy-data)))
> >  (if proxy
> >  (funcall function data tag)
> >  tag)))
> >
> > In that branch, we eventually end up in semanticdb-normalize-tags in
> db-javap.el where a let* binds realtable to the value of
> (semanticdb-jar-extract-and-save-tags obj tfn), which is determined to
> set it to nil. The problem is that the next let* expression binds
> > foundtags to (semanticdb-find-tags-by-name-method realtable
> (semantic-tag-name T)), and realtable has just been set to nil. See
> semanticdb-normalize-tags in db-javap.el:
> >
> >  (defmethod semanticdb-normalize-tags ((obj semanticdb-table-jar-directory)
> tags)
> >  "Convert tags found by our java directory table into a complete tag.
> >  The default tag just has a name, type, and the filename. Normalize by
> >  loading in the file it belongs to, and looking up that symbol in the
> file
> >  and returning that tag instead."
> >  (let ((tagret nil)
> >  (parentdb (oref obj parent-db)))
> >  (dolist (T tags)
> >  (let* ((tfn (semantic-tag-file-name T))
> >  (realtable (semanticdb-jar-extract-and-save-tags obj tfn))
> >  (foundtags (semanticdb-find-tags-by-name-method
> >  realtable (semantic-tag-name T))))
> >  (dolist (FT foundtags)
> >  (semantic--tag-put-property FT :filename tfn)
> >  (setq tagret (cons FT tagret)))))
> >  tagret))
> >
> > Some questions leap to mind.
> >
> > 1 What is a tag proxy and is it correct for the tag to have one with a
> package import (i.e., "import java.util.*") and not have one otherwise?
> > 2 Is it correct for semanticdb-jar-extract-and-save-tags to return nil
> in this case?
> > 3 Should semanticdb-find-tags-by-name-method be able to cope with a nil
> argument to the realtable parameter, without throwing an error?
> > 4 If it were able to cope such that execution would continue, would the
> analyzer do the right thing for a package import, or would it break
> somewhere else down the line?
> >
> > I'll try to answer these questions in the coming days. Stay tuned!
> >
> > Cheers,
> > David
> >
> > On Sun, Sep 18, 2016 at 11:57 AM, David Ventimiglia <[email protected]>
> wrote:
> >
> >  Hi!
> >
> >  I'm having trouble with the Semantic Analyzer and "package imports" for
> Java programs. I've an example Java program that looks like this:
> >
> >  import java.util.*;
> >  import java.util.HashMap;
> >  public class HelloWorld2 {
> >  public static void main (String[] args) {
> >  System.out.println("Hello, World!");
> >  Map m = new HashMap();
> >  m.
> >  }
> >  }
> >
> >  When I put point after the "m." and try semantic-ia-complete-symbol-menu
> (for example) it fails with this message:
> >
> >  Cannot find types for `"m"'
> >
> >  If I try semantic-analyze-current-context, the output indicates that
> it encountered this error (full message below):
> >
> >  Method semanticdb-find-tags-by-name-method called on nil
> >
> >  These problems don't occur if I replace the "import java.util.*;" in
> the Java file with "import java.utl.Map" and so I'd never encounter them if
> I didn't used wildcards in the import statements.
> >
> >  Any idea what's going on here?
> >
> >  I have a Docker image that reproduces this behavior, if anyone's game
> for trying it out. It uses Ubuntu, Emacs 24.5.1, the latest CEDET (as of
> 2016/09/18), and OpenJDK 8. If you have Docker installed, you should be ale
> to get the image with this
> >  command:
> >
> >  docker pull dventimi/docker-emacs
> >
> >  You can then launch a container that opens Emacs on a version of the
> Java file with package imports, with this command:
> >
> >  docker run -t -i dventimi/docker-emacs emacs
> /root/Scratch/HelloWorld2.java
> >
> >  Likewise, you can launch a container that opens Emacs on a version of
> the Java file without package imports, with this command:
> >
> >  docker run -t -i dventimi/docker-emacs emacs
> /root/Scratch/HelloWorld.java
> >
> >  The Semantic Analyzer works in the second case, but not in the first
> case. I've been groping my way through this with the debugger, and will
> continue to do so, but I thought I'd throw this out there to see if anyone
> else has a clue as to what the problem
> >  might be. Thanks!
> >
> >  Best,
> >  David
> >
> >  ====== Output of semantic-analyze-current-context =======
> >
> >  Context Type: #<semantic-analyze-context context>
> >  Bounds: (186 . 186)
> >  Prefix: "m"
> >  ""
> >  Prefix Classes: 'function
> >  'variable
> >  'type
> >  Prefix Types: <none>
> >  Encountered Errors: '(error "Method semanticdb-find-tags-by-name-method
> called on nil")
> >  --------
> >  -> ScopeTypes: class HelloWorld2
> >  -> Parents: class HelloWorld2
> >  -> Scope: void main(String[])
> >  -> Local Args: String[] args
> >  -> Local Vars: String[] args
> >  this
> >  Map m
> >
> >
> > ------------------------------------------------------------
> ------------------
> >
> > _______________________________________________
> > cedet-semantic mailing list
> > [email protected]
> > https://lists.sourceforge.net/lists/listinfo/cedet-semantic
>
> Hi David,
>
> Without debugging this myself I really can't say.  Before you start
> debugging though I would recommend that you try to replicate it with the
> smallest possible example of the problem.  i.e. jar up a package with a
> few classes you wrote and see whether it finds definitions from a star
> import of the package in that jar.  I think that you might be running
> into other issues which could be clouding the actual problem.
>
> There are, for example, some features of modern Java which the current
> grammar doesn't support (e.g. annotations.)  I've done some work on
> getting the parser to recognise annotations (I don't think that it's
> ready yet.)  In my experience problems with the grammar can sometimes
> cause entire files to not be parsed correctly and although I'm not sure
> what impact that would have on db-javap it does seem like something
> worth eliminating first.
>
> If I get some time over the weekend then I'll see what I can find.
>
> Kind regards,
>
> Edward Steere
>
>
> ------------------------------------------------------------
> ------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, SlashDot.org! http://sdm.link/slashdot
> _______________________________________________
> cedet-semantic mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/cedet-semantic
>

--001a113a7de8ff3f63053f8a1489
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">Hi Edward,<div><br></div><div>Thanks for the reply.=C2=A0 =
Sorry for the delay; I was on vacation, I&#39;m afraid.=C2=A0 In any case, =
I took your advice and am publishing it in the usual way, which is to push =
an update to my Docker image=C2=A0dventimi/docker-emacs.=C2=A0 It has these=
 changes.</div><div><ol><li>In ~/Scratch/emacs/ there are new files: =C2=A0=
Greet1.java, Greet2.java, and greeter.jar</li><li>In ~/.emacs the ede-java-=
root-project form includes the :localclasspath keyword, set to &#39;(&quot;=
greeter.java&quot;).</li></ol><div>Here&#39;s what&#39;s going on.=C2=A0 Th=
e greeter.jar file contains two compiled class files, Greeter1.class and Gr=
eeter2.class, both of which are in the &quot;greeter&quot; package.=C2=A0 T=
hey both define methods &quot;hello&quot; and &quot;goodbye.&quot; =C2=A0Mo=
ving on, the Greet1.java and Greet2.java files are, naturally, almost ident=
ical, and are simple &quot;Hello, World&quot; style programs just to test c=
ompletion.=C2=A0 Both of these use (or try to use) the Greeter1 class, whic=
h is in the supplied greeter.jar file.=C2=A0 Minor point: =C2=A0the Greeter=
2 class is kinda superfluous, except I wanted to have a JAR file that had m=
ore than one class.=C2=A0 Anyway, Greet1 and Greet2 take two different appr=
oaches.=C2=A0 The former has an &quot;import greeter.Greeter1&quot; declara=
tion, while the latter has an &quot;import greeter.*&quot; declaration, i.e=
. the former imports just a class while the latter imports the whole packag=
e.=C2=A0 Nothing imports or makes use of classes in the standard library an=
d nothing makes use of either Generics or Annotations.=C2=A0 This is my att=
empt at replicating it with the smallest possible example of the problem.=
=C2=A0 The result is that semantic is able to complete symbols (there are j=
ust two, hello() and goodbye()) when in Greet1.java it does &quot;import gr=
eeter.Greeter1,&quot; but it is not able to complete anything when in Greet=
2.java it does &quot;import greeter.*&quot;</div></div><div><br></div><div>=
I hope that makes sense. =C2=A0:)</div><div><br></div><div>I haven&#39;t ye=
t tried to debug this.=C2=A0 I will do that now, but will be unsurprised if=
 I encounter the same underlying factors listed above.=C2=A0 Again, the Doc=
ker image can be pulled with</div><div><br></div><blockquote class=3D"gmail=
_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left=
-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><span sty=
le=3D"font-family:monospace,monospace;font-size:12.8px">docker pull dventim=
i/docker-emacs</span></blockquote><div><span style=3D"font-family:monospace=
,monospace;font-size:12.8px"><br></span></div><div>and Emacs can be launche=
d on the problematic Greet2.java file with</div><div><br></div><blockquote =
class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1=
px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:=
1ex"><span style=3D"font-family:monospace,monospace;font-size:12.8px">docke=
r run -t -i dventimi/docker-emacs emacs /root/Scratch/Greet2.java</span></b=
lockquote><div><br></div><div>Warm regards,</div><div>David</div></div><div=
 class=3D"gmail_extra"><br><div class=3D"gmail_quote">On Tue, Oct 4, 2016 a=
t 11:09 AM, Edward John Steere <span dir=3D"ltr">&lt;<a href=3D"mailto:edwa=
[email protected]" target=3D"_blank">[email protected]</a>&gt;</spa=
n> wrote:<br><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;b=
order-left:1px #ccc solid;padding-left:1ex"><div class=3D"HOEnZb"><div clas=
s=3D"h5"><br>
&gt; I&#39;ve a few clues about the error with Java package includes.<br>
&gt;<br>
&gt; First, with a package include (i.e., &quot;include java.util.*&quot;) =
the tag at point has a proxy (:proxy keyword)--whatever that is--that sends=
 us down a branch starting with semanticdb-javap-resolve-<wbr>proxy. Withou=
t a package include (i.e., &quot;include java.util.Map&quot;) the proxy<br>
&gt; is nil, there&#39;s no proxy-function, and we steam on ahead. See sema=
ntic-tag-resolve-proxy in tag.el:<br>
&gt;<br>
&gt;=C2=A0 (defun semantic-tag-resolve-proxy (tag)<br>
&gt;=C2=A0 &quot;Resolve the proxy in TAG.<br>
&gt;=C2=A0 The return value is whatever format the proxy was setup as.<br>
&gt;=C2=A0 It should be a list of complete tags.<br>
&gt;=C2=A0 If TAG has no proxy, then just return tag.&quot;<br>
&gt;=C2=A0 (let* ((proxy (semantic--tag-get-property tag :proxy))<br>
&gt;=C2=A0 (function (get proxy &#39;proxy-function))<br>
&gt;=C2=A0 (data (get proxy &#39;proxy-data)))<br>
&gt;=C2=A0 (if proxy<br>
&gt;=C2=A0 (funcall function data tag)<br>
&gt;=C2=A0 tag)))<br>
&gt;<br>
&gt; In that branch, we eventually end up in semanticdb-normalize-tags in d=
b-javap.el where a let* binds realtable to the value of (semanticdb-jar-ext=
ract-and-<wbr>save-tags obj tfn), which is determined to set it to nil. The=
 problem is that the next let* expression binds<br>
&gt; foundtags to (semanticdb-find-tags-by-name-<wbr>method realtable (sema=
ntic-tag-name T)), and realtable has just been set to nil. See semanticdb-n=
ormalize-tags in db-javap.el:<br>
&gt;<br>
&gt;=C2=A0 (defmethod semanticdb-normalize-tags ((obj semanticdb-table-jar-=
<wbr>directory) tags)<br>
&gt;=C2=A0 &quot;Convert tags found by our java directory table into a comp=
lete tag.<br>
&gt;=C2=A0 The default tag just has a name, type, and the filename. Normali=
ze by<br>
&gt;=C2=A0 loading in the file it belongs to, and looking up that symbol in=
 the file<br>
&gt;=C2=A0 and returning that tag instead.&quot;<br>
&gt;=C2=A0 (let ((tagret nil)<br>
&gt;=C2=A0 (parentdb (oref obj parent-db)))<br>
&gt;=C2=A0 (dolist (T tags)<br>
&gt;=C2=A0 (let* ((tfn (semantic-tag-file-name T))<br>
&gt;=C2=A0 (realtable (semanticdb-jar-extract-and-<wbr>save-tags obj tfn))<=
br>
&gt;=C2=A0 (foundtags (semanticdb-find-tags-by-name-<wbr>method<br>
&gt;=C2=A0 realtable (semantic-tag-name T))))<br>
&gt;=C2=A0 (dolist (FT foundtags)<br>
&gt;=C2=A0 (semantic--tag-put-property FT :filename tfn)<br>
&gt;=C2=A0 (setq tagret (cons FT tagret)))))<br>
&gt;=C2=A0 tagret))<br>
&gt;<br>
&gt; Some questions leap to mind.<br>
&gt;<br>
</div></div>&gt; 1 What is a tag proxy and is it correct for the tag to hav=
e one with a package import (i.e., &quot;import java.util.*&quot;) and not =
have one otherwise?<br>
&gt; 2 Is it correct for semanticdb-jar-extract-and-<wbr>save-tags to retur=
n nil in this case?<br>
&gt; 3 Should semanticdb-find-tags-by-name-<wbr>method be able to cope with=
 a nil argument to the realtable parameter, without throwing an error?<br>
&gt; 4 If it were able to cope such that execution would continue, would th=
e analyzer do the right thing for a package import, or would it break somew=
here else down the line?<br>
<div><div class=3D"h5">&gt;<br>
&gt; I&#39;ll try to answer these questions in the coming days. Stay tuned!=
<br>
&gt;<br>
&gt; Cheers,<br>
&gt; David<br>
&gt;<br>
&gt; On Sun, Sep 18, 2016 at 11:57 AM, David Ventimiglia &lt;<a href=3D"mai=
lto:[email protected]">[email protected]</a>&gt; wrote:<br>
&gt;<br>
&gt;=C2=A0 Hi!<br>
&gt;<br>
&gt;=C2=A0 I&#39;m having trouble with the Semantic Analyzer and &quot;pack=
age imports&quot; for Java programs. I&#39;ve an example Java program that =
looks like this:<br>
&gt;<br>
&gt;=C2=A0 import java.util.*;<br>
&gt;=C2=A0 import java.util.HashMap;<br>
&gt;=C2=A0 public class HelloWorld2 {<br>
&gt;=C2=A0 public static void main (String[] args) {<br>
&gt;=C2=A0 System.out.println(&quot;Hello, World!&quot;);<br>
&gt;=C2=A0 Map m =3D new HashMap();<br>
&gt;=C2=A0 m.<br>
&gt;=C2=A0 }<br>
&gt;=C2=A0 }<br>
&gt;<br>
&gt;=C2=A0 When I put point after the &quot;m.&quot; and try semantic-ia-co=
mplete-symbol-<wbr>menu (for example) it fails with this message:<br>
&gt;<br>
&gt;=C2=A0 Cannot find types for `&quot;m&quot;&#39;<br>
&gt;<br>
&gt;=C2=A0 If I try semantic-analyze-current-<wbr>context, the output indic=
ates that it encountered this error (full message below):<br>
&gt;<br>
&gt;=C2=A0 Method semanticdb-find-tags-by-name-<wbr>method called on nil<br=
>
&gt;<br>
&gt;=C2=A0 These problems don&#39;t occur if I replace the &quot;import jav=
a.util.*;&quot; in the Java file with &quot;import java.utl.Map&quot; and s=
o I&#39;d never encounter them if I didn&#39;t used wildcards in the import=
 statements.<br>
&gt;<br>
&gt;=C2=A0 Any idea what&#39;s going on here?<br>
&gt;<br>
&gt;=C2=A0 I have a Docker image that reproduces this behavior, if anyone&#=
39;s game for trying it out. It uses Ubuntu, Emacs 24.5.1, the latest CEDET=
 (as of 2016/09/18), and OpenJDK 8. If you have Docker installed, you shoul=
d be ale to get the image with this<br>
&gt;=C2=A0 command:<br>
&gt;<br>
&gt;=C2=A0 docker pull dventimi/docker-emacs<br>
&gt;<br>
&gt;=C2=A0 You can then launch a container that opens Emacs on a version of=
 the Java file with package imports, with this command:<br>
&gt;<br>
&gt;=C2=A0 docker run -t -i dventimi/docker-emacs emacs /root/Scratch/Hello=
World2.java<br>
&gt;<br>
&gt;=C2=A0 Likewise, you can launch a container that opens Emacs on a versi=
on of the Java file without package imports, with this command:<br>
&gt;<br>
&gt;=C2=A0 docker run -t -i dventimi/docker-emacs emacs /root/Scratch/Hello=
World.java<br>
&gt;<br>
&gt;=C2=A0 The Semantic Analyzer works in the second case, but not in the f=
irst case. I&#39;ve been groping my way through this with the debugger, and=
 will continue to do so, but I thought I&#39;d throw this out there to see =
if anyone else has a clue as to what the problem<br>
&gt;=C2=A0 might be. Thanks!<br>
&gt;<br>
&gt;=C2=A0 Best,<br>
&gt;=C2=A0 David<br>
&gt;<br>
&gt;=C2=A0 =3D=3D=3D=3D=3D=3D Output of semantic-analyze-current-<wbr>conte=
xt =3D=3D=3D=3D=3D=3D=3D<br>
&gt;<br>
&gt;=C2=A0 Context Type: #&lt;semantic-analyze-context context&gt;<br>
&gt;=C2=A0 Bounds: (186 . 186)<br>
&gt;=C2=A0 Prefix: &quot;m&quot;<br>
&gt;=C2=A0 &quot;&quot;<br>
&gt;=C2=A0 Prefix Classes: &#39;function<br>
&gt;=C2=A0 &#39;variable<br>
&gt;=C2=A0 &#39;type<br>
&gt;=C2=A0 Prefix Types: &lt;none&gt;<br>
&gt;=C2=A0 Encountered Errors: &#39;(error &quot;Method semanticdb-find-tag=
s-by-name-<wbr>method called on nil&quot;)<br>
&gt;=C2=A0 --------<br>
&gt;=C2=A0 -&gt; ScopeTypes: class HelloWorld2<br>
&gt;=C2=A0 -&gt; Parents: class HelloWorld2<br>
&gt;=C2=A0 -&gt; Scope: void main(String[])<br>
&gt;=C2=A0 -&gt; Local Args: String[] args<br>
&gt;=C2=A0 -&gt; Local Vars: String[] args<br>
&gt;=C2=A0 this<br>
&gt;=C2=A0 Map m<br>
&gt;<br>
&gt;<br>
</div></div>&gt; ------------------------------<wbr>-----------------------=
-------<wbr>------------------<br>
&gt;<br>
&gt; ______________________________<wbr>_________________<br>
&gt; cedet-semantic mailing list<br>
&gt; <a href=3D"mailto:[email protected]">cedet-semantic=
@lists.<wbr>sourceforge.net</a><br>
&gt; <a href=3D"https://lists.sourceforge.net/lists/listinfo/cedet-semantic=
" rel=3D"noreferrer" target=3D"_blank">https://lists.sourceforge.net/<wbr>l=
ists/listinfo/cedet-semantic</a><br>
<br>
Hi David,<br>
<br>
Without debugging this myself I really can&#39;t say.=C2=A0 Before you star=
t<br>
debugging though I would recommend that you try to replicate it with the<br=
>
smallest possible example of the problem.=C2=A0 i.e. jar up a package with =
a<br>
few classes you wrote and see whether it finds definitions from a star<br>
import of the package in that jar.=C2=A0 I think that you might be running<=
br>
into other issues which could be clouding the actual problem.<br>
<br>
There are, for example, some features of modern Java which the current<br>
grammar doesn&#39;t support (e.g. annotations.)=C2=A0 I&#39;ve done some wo=
rk on<br>
getting the parser to recognise annotations (I don&#39;t think that it&#39;=
s<br>
ready yet.)=C2=A0 In my experience problems with the grammar can sometimes<=
br>
cause entire files to not be parsed correctly and although I&#39;m not sure=
<br>
what impact that would have on db-javap it does seem like something<br>
worth eliminating first.<br>
<br>
If I get some time over the weekend then I&#39;ll see what I can find.<br>
<br>
Kind regards,<br>
<br>
Edward Steere<br>
<br>
<br>
------------------------------<wbr>------------------------------<wbr>-----=
-------------<br>
Check out the vibrant tech community on one of the world&#39;s most<br>
engaging tech sites, SlashDot.org! <a href=3D"http://sdm.link/slashdot" rel=
=3D"noreferrer" target=3D"_blank">http://sdm.link/slashdot</a><br>
______________________________<wbr>_________________<br>
cedet-semantic mailing list<br>
<a href=3D"mailto:[email protected]">cedet-semantic@list=
s.<wbr>sourceforge.net</a><br>
<a href=3D"https://lists.sourceforge.net/lists/listinfo/cedet-semantic" rel=
=3D"noreferrer" target=3D"_blank">https://lists.sourceforge.net/<wbr>lists/=
listinfo/cedet-semantic</a><br>
</blockquote></div><br></div>

--001a113a7de8ff3f63053f8a1489--


--===============2915050964605889261==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most 
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
--===============2915050964605889261==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
cedet-semantic mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/cedet-semantic

--===============2915050964605889261==--