How to programmatically find a Scala type by qualified name?

124 views
Skip to first unread message

Felix Mayer

unread,
Jan 23, 2015, 3:42:26 PM1/23/15
to scala-i...@googlegroups.com
How would I obtain a Scala type (i.e. a org.scalaide.core.internal.jdt.model.ScalaElement) by qualified name using the Scala IDE programmatically? In the JDT, there are the IJavaProject#findType(String, ...) methods. I looked into IScalaProject and couldn't find anything. I also couldn't find a way to obtain just a ScalaCompilationUnit, maybe just with a workspace path.

So am I just overlooking something and there are ways to get these items?

Simon Schäfer

unread,
Jan 23, 2015, 6:06:50 PM1/23/15
to scala-i...@googlegroups.com

On 01/23/2015 09:42 PM, Felix Mayer wrote:
How would I obtain a Scala type (i.e. a org.scalaide.core.internal.jdt.model.ScalaElement) by qualified name using the Scala IDE programmatically? In the JDT, there are the IJavaProject#findType(String, ...) methods. I looked into IScalaProject and couldn't find anything. I also couldn't find a way to obtain just a ScalaCompilationUnit, maybe just with a workspace path.
You can retrieve a ScalaCompilationUnit through IScalaPlugin: https://github.com/scala-ide/scala-ide/blob/b9bbb6c8c59cc29cf1f4eb02410bfebcac7fc06f/org.scala-ide.sdt.core/src/org/scalaide/core/IScalaPlugin.scala#L65

Note, that SCU represent open editors, you do not get one just through a fully qualified name. If this is what you have, you should be able to retrieve a ScalaElement on the same way on how you retrieve a IJavaElement. You just need to pattern match on the result to cast it to ScalaElement. Note, that a ScalaElement is mostly needed if you want to interact with JDT.

If you want to interact with scalac you need to use the presentation compiler. See this piece of code on how to get a symbol from a fully qualified name: https://github.com/scala-ide/scala-ide/blob/b9bbb6c8c59cc29cf1f4eb02410bfebcac7fc06f/org.scala-ide.sdt.core/src/org/scalaide/ui/wizards/ScalaFileCreator.scala#L136

So am I just overlooking something and there are ways to get these items?
--
You received this message because you are subscribed to the Google Groups "Scala IDE User" group.
To unsubscribe from this group and stop receiving emails from it, send an email to scala-ide-use...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/scala-ide-user/c1622984-050d-493c-ad58-fd446920448c%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Felix Mayer

unread,
Jan 24, 2015, 11:47:30 AM1/24/15
to scala-i...@googlegroups.com
Thanks for the quick response. But how can IJavaProject#findType(String, ...) return an IJavaElement for a Scala file? It probably just looks at .java files, and it cannot parse .scala files.

Simon Schäfer

unread,
Jan 24, 2015, 1:39:14 PM1/24/15
to scala-i...@googlegroups.com

On 01/24/2015 05:47 PM, Felix Mayer wrote:
Thanks for the quick response. But how can IJavaProject#findType(String, ...) return an IJavaElement for a Scala file? It probably just looks at .java files, and it cannot parse .scala files.
The answer is AspectJ...
--
You received this message because you are subscribed to the Google Groups "Scala IDE User" group.
To unsubscribe from this group and stop receiving emails from it, send an email to scala-ide-use...@googlegroups.com.

Felix Mayer

unread,
Mar 9, 2015, 5:20:47 PM3/9/15
to scala-i...@googlegroups.com
I am not sure this is working. I created a JUnit plugin test that creates a Scala project and a Scala class within it. Then it uses org.eclipse.jdt.core.IJavaProject#findType(String, IProgressMonitor) to retrieve that Scala class, but nothing is returned. I also called org.eclipse.jdt.core.ICompilationUnit#getAllTypes() on a Scala compilation unit I created in a similar JUnit plugin test, and I get back an empty array. 

Is there any way to do these two things, i.e. find a Scala class by qualified name and get all Scala types within a compilation unit?

Simon Schäfer

unread,
Mar 9, 2015, 5:56:19 PM3/9/15
to scala-i...@googlegroups.com

On 03/09/2015 10:20 PM, Felix Mayer wrote:
I am not sure this is working. I created a JUnit plugin test that creates a Scala project and a Scala class within it. Then it uses org.eclipse.jdt.core.IJavaProject#findType(String, IProgressMonitor) to retrieve that Scala class, but nothing is returned. I also called org.eclipse.jdt.core.ICompilationUnit#getAllTypes() on a Scala compilation unit I created in a similar JUnit plugin test, and I get back an empty array. 

Is there any way to do these two things, i.e. find a Scala class by qualified name and get all Scala types within a compilation unit?
I'm not sure how it is supposed to work for your case. Could you please share your code so that I can have a more detailed look?

--
You received this message because you are subscribed to the Google Groups "Scala IDE User" group.
To unsubscribe from this group and stop receiving emails from it, send an email to scala-ide-use...@googlegroups.com.

Felix Mayer

unread,
Mar 10, 2015, 9:23:20 AM3/10/15
to scala-i...@googlegroups.com
My apologies, the problem was with my test, not the Scala IDE.

iulian dragos

unread,
Mar 10, 2015, 12:32:59 PM3/10/15
to scala-i...@googlegroups.com

What do you want to do with the type, once you find it?

The correct way to do it is to use the Scala presentation compiler. The Java equivalent is there for interoperability with Java, and might not always work (it’s pretty hard to map everything correctly to Java elements). I’d do something like this to find a Scala symbol for a given name:

scalaProject.presentationCompiler { compiler =>
  compiler.rootMirror.getClassByName(newTypeName(fullName))
}

Be prepared to handle errors, though (if the type name is not found). You can have a look at the JUnit4TestClassesCollector for the way it looks for JUnit annotations.

What you get back is a symbol (as in scala reflection). You can map this one to a JDT element using scalaProject.presentationCompiler.getJavaElement.

iulian


On Fri, Jan 23, 2015 at 12:42 PM, Felix Mayer <fljm...@gmail.com> wrote:
How would I obtain a Scala type (i.e. a org.scalaide.core.internal.jdt.model.ScalaElement) by qualified name using the Scala IDE programmatically? In the JDT, there are the IJavaProject#findType(String, ...) methods. I looked into IScalaProject and couldn't find anything. I also couldn't find a way to obtain just a ScalaCompilationUnit, maybe just with a workspace path.

So am I just overlooking something and there are ways to get these items?

--
You received this message because you are subscribed to the Google Groups "Scala IDE User" group.
To unsubscribe from this group and stop receiving emails from it, send an email to scala-ide-use...@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.



--
« Je déteste la montagne, ça cache le paysage »
Alphonse Allais

Felix Mayer

unread,
Mar 10, 2015, 10:41:10 PM3/10/15
to scala-i...@googlegroups.com
Once I have the type, I want to display it in a class or sequence diagram. Hence I am mostly interested in features, relationships, etc. of existing Scala types. Finding a type by qualified name is needed to open a diagram from a file, while compilation units need to be handled when one is dropped onto a diagram. I don't really need any JDT mapping, but the JDT has a fairly comprehensive API that I already know.


Simon Schäfer

unread,
Mar 11, 2015, 10:32:46 AM3/11/15
to scala-i...@googlegroups.com

On 03/11/2015 03:41 AM, Felix Mayer wrote:
Once I have the type, I want to display it in a class or sequence diagram. Hence I am mostly interested in features, relationships, etc. of existing Scala types. Finding a type by qualified name is needed to open a diagram from a file, while compilation units need to be handled when one is dropped onto a diagram. I don't really need any JDT mapping, but the JDT has a fairly comprehensive API that I already know.
In this case I would consider Iulians suggestion and use the ScalaIDE/scalac API directly. In the long term, that makes a lot of things easier.


--
You received this message because you are subscribed to the Google Groups "Scala IDE User" group.
To unsubscribe from this group and stop receiving emails from it, send an email to scala-ide-use...@googlegroups.com.
Message has been deleted

Felix Mayer

unread,
Mar 12, 2015, 10:33:28 PM3/12/15
to scala-i...@googlegroups.com
Thanks, I will have to work with the AST for some things anyway.

But what about binary types, how are they represented in the Scala IDE? Is there something comparable to org.eclipse.jdt.core.IClassFile in the Scala IDE or can an AST be built from byte code? Or is it possible to get attached source code and parse that?


iulian dragos

unread,
Mar 13, 2015, 2:23:22 AM3/13/15
to scala-i...@googlegroups.com
They are represented as symbols. You can start by reading the reflection documentation: http://docs.scala-lang.org/overviews/reflection/overview.html, it's pretty much the way the compiler works.

iulian

On Thu, Mar 12, 2015 at 7:33 PM, Felix Mayer <fljm...@gmail.com> wrote:
Thanks, I will have to work with the AST for some things anyway.

But what about binary types, how are they represented in the Scala IDE? Is there something comparable to org.eclipse.jdt.core.IClassFile in the Scala IDE or can an AST be built from byte code? Or is it possible to get attached source code and parse that?


--
You received this message because you are subscribed to the Google Groups "Scala IDE User" group.
To unsubscribe from this group and stop receiving emails from it, send an email to scala-ide-use...@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

Felix Mayer

unread,
Mar 27, 2015, 8:28:52 AM3/27/15
to scala-i...@googlegroups.com
Thanks for all the help, I have a better understanding now. Unfortunately the Traverser is not very useful to me because I cannot reliably detect the parent of the current Tree element.


iulian dragos

unread,
Mar 27, 2015, 8:41:59 AM3/27/15
to scala-i...@googlegroups.com
Not sure what you mean by Traverser... the Scala traverser can help.

On Fri, Mar 27, 2015 at 5:28 AM, Felix Mayer <fljm...@gmail.com> wrote:
Thanks for all the help, I have a better understanding now. Unfortunately the Traverser is not very useful to me because I cannot reliably detect the parent of the current Tree element.


--
You received this message because you are subscribed to the Google Groups "Scala IDE User" group.
To unsubscribe from this group and stop receiving emails from it, send an email to scala-ide-use...@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

Felix Mayer

unread,
Mar 27, 2015, 2:14:43 PM3/27/15
to scala-i...@googlegroups.com
I mean class scala.reflect.api.Trees.Traverser. But never mind, I think can I can do what I need my limiting the downward traversal. I was just used to the Eclipse JDT AST visitor, which notifies you when you are done visiting an element.

Thanks for your time.


iulian dragos

unread,
Mar 27, 2015, 2:31:54 PM3/27/15
to scala-i...@googlegroups.com

On Fri, Mar 27, 2015 at 7:14 PM, Felix Mayer <fljm...@gmail.com> wrote:

I mean class scala.reflect.api.Trees.Traverser. But never mind, I think can I can do what I need my limiting the downward traversal. I was just used to the Eclipse JDT AST visitor, which notifies you when you are done visiting an element.

Most of the times you don’t need the immediate parent, but the enclosing definition. I don’t know if that’s the case for you, but if that’s so, you can use currentOwner. That’s maintained by the framework, and it points to the innermost enclosing definition (as a Symbol, not a tree). If you need other context you’ll need to maintain it yourself during traversal, but it shouldn’t be too hard.

iulian


Thanks for your time.


--
You received this message because you are subscribed to the Google Groups "Scala IDE User" group.
To unsubscribe from this group and stop receiving emails from it, send an email to scala-ide-use...@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

Felix Mayer

unread,
Mar 31, 2015, 7:50:04 PM3/31/15
to scala-i...@googlegroups.com
When I use your suggestion to find a Scala symbol for a given name, I get the exception below. Should I do as the message says?

java.lang.AssertionError: assertion failed: Race condition detected: You are running a presentation compiler method outside the PC thread.[phase: <no phase>] Please file a ticket with the current stack trace at https://www.assembla.com/spaces/scala-ide/support/tickets
 at scala
.tools.nsc.interactive.Global.assertCorrectThread(Global.scala:535)
 at scala
.reflect.internal.Symbols$Symbol.info(Symbols.scala:1486)
 at scala
.reflect.internal.Types$TypeRef.thisInfo(Types.scala:2194)
 at scala
.reflect.internal.Types$TypeRef.baseClasses(Types.scala:2199)
 at scala
.reflect.internal.tpe.FindMembers$FindMemberBase.<init>(FindMembers.scala:17)
 at scala
.reflect.internal.tpe.FindMembers$FindMember.<init>(FindMembers.scala:219)
 at scala
.reflect.internal.Types$Type.scala$reflect$internal$Types$Type$$findMemberInternal$1(Types.scala:1014)
 at scala
.reflect.internal.Types$Type.findMember(Types.scala:1016)
 at scala
.reflect.internal.Types$Type.memberBasedOnName(Types.scala:631)
 at scala
.reflect.internal.Types$Type.member(Types.scala:600)
 at scala
.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:48)
 at scala
.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:45)
 at scala
.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:45)
 at scala
.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:45)
 at scala
.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:66)
 at scala
.reflect.internal.Mirrors$RootsBase.getClassByName(Mirrors.scala:102)
 at com
.objectaid.uml.scala.ScalaElementFactory$$anonfun$1.apply(ScalaElementFactory.scala:252)
 at com
.objectaid.uml.scala.ScalaElementFactory$$anonfun$1.apply(ScalaElementFactory.scala:251)
 at org
.scalaide.core.internal.compiler.PresentationCompilerProxy$$anonfun$internal$1.apply(PresentationCompilerProxy.scala:105)
 at org
.scalaide.core.internal.compiler.PresentationCompilerProxy$$anonfun$internal$1.apply(PresentationCompilerProxy.scala:104)
 at scala
.Option.flatMap(Option.scala:171)
 at org
.scalaide.core.internal.compiler.PresentationCompilerProxy.internal(PresentationCompilerProxy.scala:104)
 at org
.scalaide.core.internal.compiler.PresentationCompilerProxy.apply(PresentationCompilerProxy.scala:62)
 at com
.objectaid.uml.scala.ScalaElementFactory.find(ScalaElementFactory.scala:251)
 at com
.objectaid.uml.scala.ScalaElementFactoryIT.testFind(ScalaElementFactoryIT.java:68)





Simon Schäfer

unread,
Apr 1, 2015, 1:21:23 AM4/1/15
to scala-i...@googlegroups.com

On 04/01/2015 01:50 AM, Felix Mayer wrote:
When I use your suggestion to find a Scala symbol for a given name, I get the exception below. Should I do as the message says?
No ;) I guess the error message should be improved nowadays because Scala IDE is no longer the only party that uses the presentation compiler.

This is a bug in your code. Actually at:

com.objectaid.uml.scala.ScalaElementFactory$$anonfun$1.apply(ScalaElementFactory.scala:252)

You are not allowed to access most methods of symbols (in your case Symbol.info) outside of the presentation compiler. Wrap the above line (or the code of block that contains it) in

c.asyncExec {
  // your code
}.getOption()

where c is of type IScalaPresentationCompiler. Also make sure to import implicits:

import org.scalaide.core.compiler.IScalaPresentationCompiler.Implicits._


--
You received this message because you are subscribed to the Google Groups "Scala IDE User" group.
To unsubscribe from this group and stop receiving emails from it, send an email to scala-ide-use...@googlegroups.com.

iulian dragos

unread,
Apr 1, 2015, 3:34:47 AM4/1/15
to scala-i...@googlegroups.com

Felix Mayer

unread,
Apr 2, 2015, 12:08:06 PM4/2/15
to scala-i...@googlegroups.com
Thanks, it works now. Also it looks like scala.reflect.internal.Symbols#ClassSymbol is a good native representation for Scala types.

But how do I get a ClassSymbol from a ScalaElement? Do I have to go through compiler.rootMirror.getClassByName()?

And once I have a ClassSymbol, how can I parse it into a Tree? ClassSymbol has an associatedFile, is there a way to make that a ScalaSourceFile to parse?


Felix Mayer

unread,
Apr 7, 2015, 4:48:58 PM4/7/15
to scala-i...@googlegroups.com
Here is something I don't understand with a ClassSymbol I got from the presentation compiler:

I looked up 'scala.collection.Seq', which should be either a trait or its companion object. The returned ClassSymbol has isTrait() == falseisConcreteClass() == true, isModuleClass() == false and the companionSymbol() is object Seq. So if I got the expected trait Seq, why does the ClassSymbol not say it's a trait?


Simon Schäfer

unread,
Apr 7, 2015, 5:13:36 PM4/7/15
to scala-i...@googlegroups.com

On 04/07/2015 10:48 PM, Felix Mayer wrote:
Here is something I don't understand with a ClassSymbol I got from the presentation compiler:

I looked up 'scala.collection.Seq', which should be either a trait or its companion object. The returned ClassSymbol has isTrait() == falseisConcreteClass() == true, isModuleClass() == false and the companionSymbol() is object Seq. So if I got the expected trait Seq, why does the ClassSymbol not say it's a trait?
Generally Seq is a higher kinded type, Seq[_] would be the type of a trait/class. Seq.type is the type of the companion object. Finding the type Seq should return the correct thing, though.

Did you do the following and it returns false?

scala> rootMirror.getClassByName(TermName("scala.collection.Seq")).isTrait
res1: Boolean = true



--
You received this message because you are subscribed to the Google Groups "Scala IDE User" group.
To unsubscribe from this group and stop receiving emails from it, send an email to scala-ide-use...@googlegroups.com.

Felix Mayer

unread,
Apr 7, 2015, 8:38:33 PM4/7/15
to scala-i...@googlegroups.com
I have a JUnit Plug-in test that creates a Scala project with the appropriate classpath and natures within a running Eclipse instance. The presentation compiler comes from that project. Then I call compiler.rootMirror.getClassByName(compiler.newTypeName("scala.collection.Seq")) and ClassSymbol#isTrait() == false.


iulian dragos

unread,
Apr 8, 2015, 5:10:44 AM4/8/15
to scala-i...@googlegroups.com
Could you share your code?

On Wed, Apr 8, 2015 at 2:38 AM, Felix Mayer <fljm...@gmail.com> wrote:
I have a JUnit Plug-in test that creates a Scala project with the appropriate classpath and natures within a running Eclipse instance. The presentation compiler comes from that project. Then I call compiler.rootMirror.getClassByName(compiler.newTypeName("scala.collection.Seq")) and ClassSymbol#isTrait() == false.


--
You received this message because you are subscribed to the Google Groups "Scala IDE User" group.
To unsubscribe from this group and stop receiving emails from it, send an email to scala-ide-use...@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

Felix Mayer

unread,
Apr 8, 2015, 12:47:57 PM4/8/15
to scala-i...@googlegroups.com
I have attached an Eclipse project with a launch file that works on my Mac. Your mileage with the launch file may vary depending on the environment. The launch configuration needs to have plenty of heap (this one has -Xmx2048M) and the bundle org.eclipse.equinox.weaving.aspectj must have Auto-Start true. The test expects isTrait() == true and fails.
scala-test.tar.gz

iulian dragos

unread,
Apr 9, 2015, 4:12:10 AM4/9/15
to scala-i...@googlegroups.com
Thanks, but I was thinking more about a github project :) I'm happy to look at code, but I won't have time to run and debug code for the next few days. I might have a look over the weekend, but no promises.

iulian


On Wed, Apr 8, 2015 at 6:47 PM, Felix Mayer <fljm...@gmail.com> wrote:
I have attached an Eclipse project with a launch file that works on my Mac. Your mileage with the launch file may vary depending on the environment. The launch configuration needs to have plenty of heap (this one has -Xmx2048M) and the bundle org.eclipse.equinox.weaving.aspectj must have Auto-Start true. The test expects isTrait() == true and fails.

--
You received this message because you are subscribed to the Google Groups "Scala IDE User" group.
To unsubscribe from this group and stop receiving emails from it, send an email to scala-ide-use...@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

Felix Mayer

unread,
Apr 9, 2015, 9:30:39 AM4/9/15
to scala-i...@googlegroups.com
How would a Github project help to reproduce the issue?

Simon Schäfer

unread,
Apr 9, 2015, 10:48:06 AM4/9/15
to scala-i...@googlegroups.com

On 04/09/2015 03:30 PM, Felix Mayer wrote:
How would a Github project help to reproduce the issue?
faster cloning/traversing of the source code

I just had a look at the code but I can't see what is wrong. I guess something in the initialization of your test project is wrong. This is how we are doing it: https://github.com/scala-ide/scala-ide/blob/857aa603d52c5bb578ee8aad3a0190c30f07eb0a/org.scala-ide.sdt.core.tests/src/org/scalaide/core/testsetup/SDTTestUtils.scala#L303

Maybe you can see an important difference somewhere.

iulian dragos

unread,
Apr 9, 2015, 11:43:20 AM4/9/15
to scala-i...@googlegroups.com
On Thu, Apr 9, 2015 at 3:30 PM, Felix Mayer <fljm...@gmail.com> wrote:
How would a Github project help to reproduce the issue?

One click to see the code. I don't need to run it. If something pops up by just reading the code, you get a quick answer. If not.. I can still checkout and build/debug later. In short: faster happy path.
 

For more options, visit https://groups.google.com/d/optout.

iulian dragos

unread,
Apr 9, 2015, 11:47:54 AM4/9/15
to scala-i...@googlegroups.com
You could try adding `.initialize` before testing for `isTrait`. Sometimes flags are not correctly set before initialization, and some methods won't force initialization (because of potential cycles).

Felix Mayer

unread,
Apr 9, 2015, 10:35:25 PM4/9/15
to scala-i...@googlegroups.com
Okay, but this way it's very little code you had  to look at. And I can't really share the entire project.

After I added an 'initialize()' into compiler.asyncExec() (as this needs to happen in the compiler thread), the test succeeded.

So thanks once again!


iulian dragos

unread,
Apr 10, 2015, 3:58:55 AM4/10/15
to scala-i...@googlegroups.com
On Fri, Apr 10, 2015 at 4:35 AM, Felix Mayer <fljm...@gmail.com> wrote:
Okay, but this way it's very little code you had  to look at. And I can't really share the entire project.

Sure, I understand. Sometimes I just have a couple of minutes and go through emails. A click and a glance of code fits that window of time, but getting an attachment, unzipping, importing the project in Eclipse, etc... feels more like a deep dive and I postpone for when I have more time. I understand not everyone works the same way. :)
 

After I added an 'initialize()' into compiler.asyncExec() (as this needs to happen in the compiler thread), the test succeeded.

So thanks once again!

I'm glad it worked! Could you share with us what feature you're working on, and if it will stay private, or eventually be available to the community as well?

thanks,
iulian
 


--
You received this message because you are subscribed to the Google Groups "Scala IDE User" group.
To unsubscribe from this group and stop receiving emails from it, send an email to scala-ide-use...@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

Felix Mayer

unread,
Apr 13, 2015, 8:44:28 AM4/13/15
to scala-i...@googlegroups.com
I am working on a Scala plugin for ObjectAid, which will not be free, but quite inexpensive. Is that a problem?


Felix Mayer

unread,
Apr 20, 2015, 11:26:31 AM4/20/15
to scala-i...@googlegroups.com
I have been looking at nested types, and I am getting the impression that I cannot get nested ClassSymbols from a ClassSymbol. Is this correct? I can see that the TreeTraverser in the ScalaStructureBuilder uses Trees instead of Symbols. My issue is that I only expect Trees to be available from source code, but I would like to detect nesting relationships for binary code as well.


iulian dragos

unread,
Apr 22, 2015, 11:07:57 AM4/22/15
to scala-i...@googlegroups.com
It's incorrect. You should find all members inside a symbol type.

On Mon, Apr 20, 2015 at 5:26 PM, Felix Mayer <fljm...@gmail.com> wrote:
I have been looking at nested types, and I am getting the impression that I cannot get nested ClassSymbols from a ClassSymbol. Is this correct? I can see that the TreeTraverser in the ScalaStructureBuilder uses Trees instead of Symbols. My issue is that I only expect Trees to be available from source code, but I would like to detect nesting relationships for binary code as well.


--
You received this message because you are subscribed to the Google Groups "Scala IDE User" group.
To unsubscribe from this group and stop receiving emails from it, send an email to scala-ide-use...@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages