timowest / scalagen Goto Github PK
View Code? Open in Web Editor NEWJava to Scala transformation
License: Apache License 2.0
Java to Scala transformation
License: Apache License 2.0
Hello,
I'm a student who's been working on Scala IDE this summer (GSoC) and I randomly stumbled onto this project.
Since I have some experience with writing Scala IDE plugins (see https://github.com/SandroGrzicic/sbtconsole), I was wondering if you would be up for collaborating with me on writing a Scalagen plugin for Scala IDE.
In short, I would do most/all of the work. It seems that Scalagen can be used from the command line as an external process, but also programatically (https://github.com/mysema/scalagen/blob/master/scalagen/src/main/scala/com/mysema/scalagen/Converter.scala) (although it would be nice if it there was a method accepting String input and giving back String output) which means that it could be very easily made into a Scala IDE plugin and later maybe integrated within Scala IDE itself.
So, what do you think? Again, from my perspective it seems easy enough to do.
By the way, this is probably not the best question to ask this but I didn't see a link to a mailing list or a contact email. :)
Sandro
handle initializers
handle !a.equals(b) properly
The current mode is too simplistic and doesn't always compile
for (element <- elements) {
for (annotation <- element.getAnnotations) {
annotations.put(annotation.annotationType(), annotation)
}
}
should be rendered as
for (element <- elements; annotation <- element.getAnnotations) {
annotations.put(annotation.annotationType(), annotation)
}
turn
if (a == a1) return b1
else if (a == a2) return b2
else return x
into
a match {
case a1 => b1
case a2 => b2
case _ => x
}
If you have the java double d = Double.MAX_VALUE;
, converting it gives val d = Double.MAX_VALUE
, which doesn't compile because in Java an unqualified Double
means java.lang.Double
, but in Scala it means scala.Double
which doesn't have a MAX_VALUE
field, instead it has a MaxValue
field.
This is the same with many other boxed primitives (Float, Byte, Short, etc), and any methods on them that are not present in Scala's version (eg Double.doubleToLongBits(1.0)
).
There could be special cases for these fields and methods to replace them with the Scala equivalent when present, or to change unqualified Double/Float/etc to be fully qualified with java.lang otherwise.
Merge constructor initializer statements with field declarations
From this Java
public Concept(Term tm, Memory memory) {
super(tm.getName());
term = tm;
}
This gets generated:
class Concept(@BeanProperty var term: Term, var memory: Memory) extends Item(tm.getName) {
( should be Item(term.getName) )
The Java source:
https://open-nars.googlecode.com/svn/trunk/nars/entity/Concept.java
The generated Scala (hand edited) :
https://open-nars.googlecode.com/svn/trunk/nars_core/src/main/scala/nars/entity/Concept.scala
handling lazy init bean property patterns
public class LazyInitBeanAccessor {
private String value;
public String getValue() {
if (value == null) {
value = "XXX";
}
return value;
}
}
Array imports should be handled with an import alias
handle serialVersionUID as annotation in Scala
Hey,
I tried to run the build 'mvn clean package' on my machine but it fails many of the tests:
Results :
Tests in error:
Convert_Creates_Files(com.mysema.scalagen.ConverterTest)
Convert_Creates_File_with_Content(com.mysema.scalagen.ConverterTest)
Dump(com.mysema.scalagen.ScalaDumpVisitorTest)
Compile(com.mysema.scalagen.ScalaCompilationTest)
Control(com.mysema.scalagen.SerializationTest)
AbstractCodeWriter(com.mysema.scalagen.SerializationTest)
ArrayConstructorExpression(com.mysema.scalagen.SerializationTest)
Bean(com.mysema.scalagen.SerializationTest)
Bean2(com.mysema.scalagen.SerializationTest)
BeanWithUnderscores(com.mysema.scalagen.SerializationTest)
Casts(com.mysema.scalagen.SerializationTest)
ConstantImpl(com.mysema.scalagen.SerializationTest)
DateTimeExpression(com.mysema.scalagen.SerializationTest)
IfElse(com.mysema.scalagen.SerializationTest)
Immutable(com.mysema.scalagen.SerializationTest)
Modifiers(com.mysema.scalagen.SerializationTest)
Ops(com.mysema.scalagen.SerializationTest)
Reserved(com.mysema.scalagen.SerializationTest)
Resource(com.mysema.scalagen.SerializationTest)
SimpleCompiler(com.mysema.scalagen.SerializationTest)
SwitchCase(com.mysema.scalagen.SerializationTest)
TryCatch(com.mysema.scalagen.SerializationTest)
WithStaticAndInstance(com.mysema.scalagen.SerializationTest)
Tests run: 53, Failures: 0, Errors: 23, Skipped: 1
Weirdly when I look in the target/surefire-reports directory I see an entry for each failed test but there's pretty much no information in there as to why they failed..
Java:
boolean method(String str) {
for (String b : java.util.Arrays.asList("a", "b")) {
if (str.startsWith(b)) {
return true;
}
}
return false;
}
converted to Scala yields:
def method(str: String): Boolean = {
java.util.Arrays.asList("a", "b").find(str.startsWith(_))
.map(true)
.getOrElse(false)
}
which has a compile error with the .map(true)
. This should be .map(_ => true)
.
I have written in my notes "Probably in ControlStatements.createFindCall", but I haven't looked in to it more.
override def equals(o: Any): Boolean = {
o.isInstanceOf[Resource] && o.asInstanceOf[Resource].path == path
}
should be
override def equals(o: Any): Boolean = o match {
case o: Resource => o.path == path
case _ => false
}
Here is the offending Java source :
https://open-nars.googlecode.com/svn/trunk/nars/storage/Bag.java
I'm using the git version of scalagen.
Here is the stack :
Caused by: java.lang.NullPointerException
at com.mysema.scalagen.Helpers$RichBlockStmt.apply(Helpers.scala:72)
at com.mysema.scalagen.Properties$$anonfun$visit$2.apply(Properties.scala:51)
at com.mysema.scalagen.Properties$$anonfun$visit$2.apply(Properties.scala:48)
at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
at scala.collection.immutable.List.foreach(List.scala:45)
at com.mysema.scalagen.Properties.visit(Properties.scala:48)
at com.mysema.scalagen.Properties.visit(Properties.scala:27)
at japa.parser.ast.body.ClassOrInterfaceDeclaration.accept(ClassOrInterfaceDeclaration.java:71)
Starting from the Java:
class A {
public A(String str) {}
}
class B extends A {
public B() {
super("some value");
}
public B(String str) {
super(str);
}
}
Converting the class B gives:
class B extends A {
def this(str: String) {
super(str)
}
}
The default constructor that called super("some value")
is silently dropped.
e.g.
for (i <- List.range(from, to) if i % 2 == 0) yield i
turn
override def equals(obj: Any): Boolean = {
if (obj == this) {
true
} else if (obj.isInstanceOf[JoinFlag]) {
obj.asInstanceOf[JoinFlag].flag == flag
} else {
false
}
}
into
override def equals(obj: Any) : Boolean = obj match {
case obj: JoinFlag => obj.flag == flag
case _ => false
}
convert following patterns
private Type variable = null
public Type variable() {
if (variable == null) {
variable = ...
}
return variable;
}
into
lazy val variable: Type = ....
def getFormat(contentType: String, defaultFormat: Format): Format = {
for (format <- values if format.mimetype == contentType) {
return format
}
defaultFormat
}
could be expressed as
def getFormat(contentType: String, defaultFormat: Format): Format = {
values.find(_.mimetype == contenType).getOrElse(defaultFormat)
}
Remove underscores in field names before Bean processing
In this example, title is transmitted by calling the ancestor constructor in the main constructor of BagWindow :
class BagWindow(var bag: Bag[_], title: String)
extends NarsFrame(title) with ActionListener with AdjustmentListener {
but scalagen generates an useless and incorrect super() ( line 53 ) :
super(title)
The Java source:
https://open-nars.googlecode.com/svn/trunk/nars/gui/BagWindow.java
The generated Scala :
https://open-nars.googlecode.com/svn/trunk/nars_core/src/main/scala/nars/gui/BagWindow.scala
Improve return handling
Right now, scalagen is only compiled for Scala 2.9. I'm working on a Scala IDE plugin backed by scalagen, but in order to have it available for both Scala IDE targets I need a version of the scalagen jar compiled for Scala 2.10 (as well as 2.9).
It would be ideal if scalagen was published to a maven repository for both versions, using the sbt naming convention. To do it manually, in the pom.xml you would change the scala.version
property to 2.10.1 and change the artifactId
to scalagen_2.10.1
and publish that, and again for 2.9.3 (or 2.9.1 if there's a reason to stick with that). See http://mvnrepository.com/artifact/com.typesafe.akka for an example of this.
for (entry <- map.entrySet)
should be converted into
for ( (key, value) <- map)
Use BooleanBeanProperty annotation for boolean properties
This is the exception when I run the 0.1.3 version of scalagen against the project hosted here : https://code.google.com/p/blockplus/source/browse/
I'd be happy to help you reproduce the issue or investigate further.
java -version
java version "1.7.0_09"
Java(TM) SE Runtime Environment (build 1.7.0_09-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)mvn -V
Apache Maven 3.0.3 (r1075438; 2011-02-28 18:31:09+0100)
Maven home: C:\dev\tools\apache-maven-3.0.3\bin..
Java version: 1.7.0_09, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jre7
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
Caused by: scala.collection.parallel.package$CompositeThrowable: Multiple exceptions thrown during a parallel computation: (java.lang.ClassCastException: japa.parser.ast.stmt.IfStmt cannot be cast to japa.parser.ast.stmt.BlockStmt,List(com.mysema.scalagen.ControlStatements.visit(ControlStatements.scala:91), com.mysema.scalagen.ControlStatements.visit(ControlStatements.scala:25), japa.parser.ast.stmt.ForeachStmt.accept(ForeachStmt.java:58), com.mysema.scalagen.ModifierVisitor.filter(ModifierVisitor.scala:41), com.mysema.scalagen.ModifierVisitor.visit(ModifierVisitor.scala:117), com.mysema.scalagen.ControlStatements.visit(ControlStatements.scala:104), com.mysema.scalagen.ControlStatements.visit(ControlStatements.scala:25), japa.parser.ast.stmt.BlockStmt.accept(BlockStmt.java:50), com.mysema.scalagen.ModifierVisitor.filter(ModifierVisitor.scala:28), com.mysema.scalagen.ModifierVisitor.visit(ModifierVisitor.scala:338), com.mysema.scalagen.ModifierVisitor.visit(ModifierVisitor.scala:25), japa.parser.ast.body.MethodDeclaration.accept(MethodDeclaration.java:97), com.mysema.scalagen.ModifierVisitor.filter(ModifierVisitor.scala:41), com.mysema.scalagen.ModifierVisitor.visit(ModifierVisitor.scala:142), com.mysema.scalagen.ModifierVisitor.visit(ModifierVisitor.scala:25), japa.parser.ast.body.ClassOrInterfaceDeclaration.accept(ClassOrInterfaceDeclaration.java:71), com.mysema.scalagen.ModifierVisitor.filter(ModifierVisitor.scala:41), com.mysema.scalagen.UnitTransformer$UnitTransformerBase.visit(UnitTransformer.scala:54), com.mysema.scalagen.UnitTransformer$UnitTransformerBase.visit(UnitTransformer.scala:47), japa.parser.ast.CompilationUnit.accept(CompilationUnit.java:87), com.mysema.scalagen.ControlStatements.transform(ControlStatements.scala:49), com.mysema.scalagen.Converter$$anonfun$2.apply(Converter.scala:74), com.mysema.scalagen.Converter$$anonfun$2.apply(Converter.scala:74), scala.collection.LinearSeqOptimized$class.foldLeft(LinearSeqOptimized.scala:111), scala.collection.immutable.List.foldLeft(List.scala:45), com.mysema.scalagen.Converter.toScala(Converter.scala:74), com.mysema.scalagen.Converter.convertFile(Converter.scala:66), com.mysema.scalagen.Converter$$anonfun$convert$2.apply(Converter.scala:61), com.mysema.scalagen.Converter$$anonfun$convert$2.apply(Converter.scala:61), scala.collection.parallel.mutable.ParArray$ParArrayIterator.foreach_quick(ParArray.scala:143), scala.collection.parallel.mutable.ParArray$ParArrayIterator.foreach(ParArray.scala:136), scala.collection.parallel.ParIterableLike$Foreach.leaf(ParIterableLike.scala:896), scala.collection.parallel.Tasks$Task$$anonfun$tryLeaf$1.apply$mcV$sp(Tasks.scala:66), scala.collection.parallel.Tasks$Task$class.tryLeaf(Tasks.scala:68), scala.collection.parallel.ParIterableLike$Foreach.tryLeaf(ParIterableLike.scala:894), scala.collection.parallel.AdaptiveWorkStealingTasks$TaskImpl$class.internal(Tasks.scala:179), scala.collection.parallel.AdaptiveWorkStealingThreadPoolTasks$TaskImpl.internal(Tasks.scala:521), scala.collection.parallel.AdaptiveWorkStealingTasks$TaskImpl$class.compute(Tasks.scala:164), scala.collection.parallel.AdaptiveWorkStealingThreadPoolTasks$TaskImpl.compute(Tasks.scala:521), scala.collection.parallel.ThreadPoolTasks$TaskImpl$class.run(Tasks.scala:273), scala.collection.parallel.AdaptiveWorkStealingThreadPoolTasks$TaskImpl.run(Tasks.scala:521), java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source), java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source), java.util.concurrent.FutureTask.run(Unknown Source), java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source), java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source), java.lang.Thread.run(Unknown Source))), (java.lang.ClassCastException: japa.parser.ast.stmt.ForeachStmt cannot be cast to japa.parser.ast.stmt.BlockStmt,List(com.mysema.scalagen.ControlStatements.visit(ControlStatements.scala:91), com.mysema.scalagen.ControlStatements.visit(ControlStatements.scala:25), japa.parser.ast.stmt.ForeachStmt.accept(ForeachStmt.java:58), com.mysema.scalagen.ModifierVisitor.filter(ModifierVisitor.scala:41), com.mysema.scalagen.ModifierVisitor.visit(ModifierVisitor.scala:117), com.mysema.scalagen.ControlStatements.visit(ControlStatements.scala:104), com.mysema.scalagen.ControlStatements.visit(ControlStatements.scala:25), japa.parser.ast.stmt.BlockStmt.accept(BlockStmt.java:50), com.mysema.scalagen.ModifierVisitor.filter(ModifierVisitor.scala:28), com.mysema.scalagen.ModifierVisitor.visit(ModifierVisitor.scala:338), com.mysema.scalagen.ModifierVisitor.visit(ModifierVisitor.scala:25), japa.parser.ast.body.MethodDeclaration.accept(MethodDeclaration.java:97), com.mysema.scalagen.ModifierVisitor.filter(ModifierVisitor.scala:41), com.mysema.scalagen.ModifierVisitor.visit(ModifierVisitor.scala:142), com.mysema.scalagen.ModifierVisitor.visit(ModifierVisitor.scala:25), japa.parser.ast.body.ClassOrInterfaceDeclaration.accept(ClassOrInterfaceDeclaration.java:71), com.mysema.scalagen.ModifierVisitor.filter(ModifierVisitor.scala:41), com.mysema.scalagen.UnitTransformer$UnitTransformerBase.visit(UnitTransformer.scala:54), com.mysema.scalagen.UnitTransformer$UnitTransformerBase.visit(UnitTransformer.scala:47), japa.parser.ast.CompilationUnit.accept(CompilationUnit.java:87), com.mysema.scalagen.ControlStatements.transform(ControlStatements.scala:49), com.mysema.scalagen.Converter$$anonfun$2.apply(Converter.scala:74), com.mysema.scalagen.Converter$$anonfun$2.apply(Converter.scala:74), scala.collection.LinearSeqOptimized$class.foldLeft(LinearSeqOptimized.scala:111), scala.collection.immutable.List.foldLeft(List.scala:45), com.mysema.scalagen.Converter.toScala(Converter.scala:74), com.mysema.scalagen.Converter.convertFile(Converter.scala:66), com.mysema.scalagen.Converter$$anonfun$convert$2.apply(Converter.scala:61), com.mysema.scalagen.Converter$$anonfun$convert$2.apply(Converter.scala:61), scala.collection.parallel.mutable.ParArray$ParArrayIterator.foreach_quick(ParArray.scala:143), scala.collection.parallel.mutable.ParArray$ParArrayIterator.foreach(ParArray.scala:136), scala.collection.parallel.ParIterableLike$Foreach.leaf(ParIterableLike.scala:896), scala.collection.parallel.Tasks$Task$$anonfun$tryLeaf$1.apply$mcV$sp(Tasks.scala:66), scala.collection.parallel.Tasks$Task$class.tryLeaf(Tasks.scala:68), scala.collection.parallel.ParIterableLike$Foreach.tryLeaf(ParIterableLike.scala:894), scala.collection.parallel.AdaptiveWorkStealingTasks$TaskImpl$class.internal(Tasks.scala:179), scala.collection.parallel.AdaptiveWorkStealingThreadPoolTasks$TaskImpl.internal(Tasks.scala:521), scala.collection.parallel.AdaptiveWorkStealingTasks$TaskImpl$class.compute(Tasks.scala:164), scala.collection.parallel.AdaptiveWorkStealingThreadPoolTasks$TaskImpl.compute(Tasks.scala:521), scala.collection.parallel.ThreadPoolTasks$TaskImpl$class.run(Tasks.scala:273), scala.collection.parallel.AdaptiveWorkStealingThreadPoolTasks$TaskImpl.run(Tasks.scala:521), java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source), java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source), java.util.concurrent.FutureTask.run(Unknown Source), java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source), java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source), java.lang.Thread.run(Unknown Source))), (java.lang.ClassCastException: japa.parser.ast.stmt.ForeachStmt cannot be cast to japa.parser.ast.stmt.BlockStmt,List(com.mysema.scalagen.ControlStatements.visit(ControlStatements.scala:91), com.mysema.scalagen.ControlStatements.visit(ControlStatements.scala:25), japa.parser.ast.stmt.ForeachStmt.accept(ForeachStmt.java:58), com.mysema.scalagen.ModifierVisitor.filter(ModifierVisitor.scala:41), com.mysema.scalagen.ModifierVisitor.visit(ModifierVisitor.scala:117), com.mysema.scalagen.ControlStatements.visit(ControlStatements.scala:104), com.mysema.scalagen.ControlStatements.visit(ControlStatements.scala:25), japa.parser.ast.stmt.BlockStmt.accept(BlockStmt.java:50), com.mysema.scalagen.ModifierVisitor.filter(ModifierVisitor.scala:28), com.mysema.scalagen.ModifierVisitor.visit(ModifierVisitor.scala:338), com.mysema.scalagen.ModifierVisitor.visit(ModifierVisitor.scala:25), japa.parser.ast.body.MethodDeclaration.accept(MethodDeclaration.java:97), com.mysema.scalagen.ModifierVisitor.filter(ModifierVisitor.scala:41), com.mysema.scalagen.ModifierVisitor.visit(ModifierVisitor.scala:142), com.mysema.scalagen.ModifierVisitor.visit(ModifierVisitor.scala:25), japa.parser.ast.body.ClassOrInterfaceDeclaration.accept(ClassOrInterfaceDeclaration.java:71), com.mysema.scalagen.ModifierVisitor.filter(ModifierVisitor.scala:41), com.mysema.scalagen.UnitTransformer$UnitTransformerBase.visit(UnitTransformer.scala:54), com.mysema.scalagen.UnitTransformer$UnitTransformerBase.visit(UnitTransformer.scala:47), japa.parser.ast.CompilationUnit.accept(CompilationUnit.java:87), com.mysema.scalagen.ControlStatements.transform(ControlStatements.scala:49), com.mysema.scalagen.Converter$$anonfun$2.apply(Converter.scala:74), com.mysema.scalagen.Converter$$anonfun$2.apply(Converter.scala:74), scala.collection.LinearSeqOptimized$class.foldLeft(LinearSeqOptimized.scala:111), scala.collection.immutable.List.foldLeft(List.scala:45), com.mysema.scalagen.Converter.toScala(Converter.scala:74), com.mysema.scalagen.Converter.convertFile(Converter.scala:66), com.mysema.scalagen.Converter$$anonfun$convert$2.apply(Converter.scala:61), com.mysema.scalagen.Converter$$anonfun$convert$2.apply(Converter.scala:61), scala.collection.parallel.mutable.ParArray$ParArrayIterator.foreach_quick(ParArray.scala:143), scala.collection.parallel.mutable.ParArray$ParArrayIterator.foreach(ParArray.scala:136), scala.collection.parallel.ParIterableLike$Foreach.leaf(ParIterableLike.scala:896), scala.collection.parallel.Tasks$Task$$anonfun$tryLeaf$1.apply$mcV$sp(Tasks.scala:66), scala.collection.parallel.Tasks$Task$class.tryLeaf(Tasks.scala:68), scala.collection.parallel.ParIterableLike$Foreach.tryLeaf(ParIterableLike.scala:894), scala.collection.parallel.AdaptiveWorkStealingTasks$TaskImpl$class.internal(Tasks.scala:179), scala.collection.parallel.AdaptiveWorkStealingThreadPoolTasks$TaskImpl.internal(Tasks.scala:521), scala.collection.parallel.AdaptiveWorkStealingTasks$TaskImpl$class.compute(Tasks.scala:164), scala.collection.parallel.AdaptiveWorkStealingThreadPoolTasks$TaskImpl.compute(Tasks.scala:521), scala.collection.parallel.ThreadPoolTasks$TaskImpl$class.run(Tasks.scala:273), scala.collection.parallel.AdaptiveWorkStealingThreadPoolTasks$TaskImpl.run(Tasks.scala:521), java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source), java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source), java.util.concurrent.FutureTask.run(Unknown Source), java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source), java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source), java.lang.Thread.run(Unknown Source))), (java.lang.ClassCastException: japa.parser.ast.stmt.IfStmt cannot be cast to japa.parser.ast.stmt.BlockStmt,List(com.mysema.scalagen.ControlStatements.visit(ControlStatements.scala:91), com.mysema.scalagen.ControlStatements.visit(ControlStatements.scala:25), japa.parser.ast.stmt.ForeachStmt.accept(ForeachStmt.java:58), com.mysema.scalagen.ModifierVisitor.filter(ModifierVisitor.scala:41), com.mysema.scalagen.ModifierVisitor.visit(ModifierVisitor.scala:117), com.mysema.scalagen.ControlStatements.visit(ControlStatements.scala:104), com.mysema.scalagen.ControlStatements.visit(ControlStatements.scala:25), japa.parser.ast.stmt.BlockStmt.accept(BlockStmt.java:50), com.mysema.scalagen.ModifierVisitor.filter(ModifierVisitor.scala:28), com.mysema.scalagen.ModifierVisitor.visit(ModifierVisitor.scala:281), com.mysema.scalagen.ControlStatements.visit(ControlStatements.scala:134), com.mysema.scalagen.ControlStatements.visit(ControlStatements.scala:25), japa.parser.ast.stmt.IfStmt.accept(IfStmt.java:57), com.mysema.scalagen.ModifierVisitor.filter(ModifierVisitor.scala:28), com.mysema.scalagen.ModifierVisitor.visit(ModifierVisitor.scala:281), com.mysema.scalagen.ControlStatements.visit(ControlStatements.scala:134), com.mysema.scalagen.ControlStatements.visit(ControlStatements.scala:25), japa.parser.ast.stmt.IfStmt.accept(IfStmt.java:57), com.mysema.scalagen.ModifierVisitor.filter(ModifierVisitor.scala:41), com.mysema.scalagen.ModifierVisitor.visit(ModifierVisitor.scala:117), com.mysema.scalagen.ControlStatements.visit(ControlStatements.scala:104), com.mysema.scalagen.ControlStatements.visit(ControlStatements.scala:25), japa.parser.ast.stmt.BlockStmt.accept(BlockStmt.java:50), com.mysema.scalagen.ModifierVisitor.filter(ModifierVisitor.scala:28), com.mysema.scalagen.ModifierVisitor.visit(ModifierVisitor.scala:338), com.mysema.scalagen.ModifierVisitor.visit(ModifierVisitor.scala:25), japa.parser.ast.body.MethodDeclaration.accept(MethodDeclaration.java:97), com.mysema.scalagen.ModifierVisitor.filter(ModifierVisitor.scala:41), com.mysema.scalagen.ModifierVisitor.visit(ModifierVisitor.scala:142), com.mysema.scalagen.ModifierVisitor.visit(ModifierVisitor.scala:25), japa.parser.ast.body.ClassOrInterfaceDeclaration.accept(ClassOrInterfaceDeclaration.java:71), com.mysema.scalagen.ModifierVisitor.filter(ModifierVisitor.scala:41), com.mysema.scalagen.UnitTransformer$UnitTransformerBase.visit(UnitTransformer.scala:54), com.mysema.scalagen.UnitTransformer$UnitTransformerBase.visit(UnitTransformer.scala:47), japa.parser.ast.CompilationUnit.accept(CompilationUnit.java:87), com.mysema.scalagen.ControlStatements.transform(ControlStatements.scala:49), com.mysema.scalagen.Converter$$anonfun$2.apply(Converter.scala:74), com.mysema.scalagen.Converter$$anonfun$2.apply(Converter.scala:74), scala.collection.LinearSeqOptimized$class.foldLeft(LinearSeqOptimized.scala:111), scala.collection.immutable.List.foldLeft(List.scala:45), com.mysema.scalagen.Converter.toScala(Converter.scala:74), com.mysema.scalagen.Converter.convertFile(Converter.scala:66), com.mysema.scalagen.Converter$$anonfun$convert$2.apply(Converter.scala:61), com.mysema.scalagen.Converter$$anonfun$convert$2.apply(Converter.scala:61), scala.collection.parallel.mutable.ParArray$ParArrayIterator.foreach_quick(ParArray.scala:143), scala.collection.parallel.mutable.ParArray$ParArrayIterator.foreach(ParArray.scala:136), scala.collection.parallel.ParIterableLike$Foreach.leaf(ParIterableLike.scala:896), scala.collection.parallel.Tasks$Task$$anonfun$tryLeaf$1.apply$mcV$sp(Tasks.scala:66), scala.collection.parallel.Tasks$Task$class.tryLeaf(Tasks.scala:68), scala.collection.parallel.ParIterableLike$Foreach.tryLeaf(ParIterableLike.scala:894), scala.collection.parallel.AdaptiveWorkStealingTasks$TaskImpl$class.internal(Tasks.scala:179), scala.collection.parallel.AdaptiveWorkStealingThreadPoolTasks$TaskImpl.internal(Tasks.scala:521), scala.collection.parallel.AdaptiveWorkStealingTasks$TaskImpl$class.compute(Tasks.scala:164), scala.collection.parallel.AdaptiveWorkStealingThreadPoolTasks$TaskImpl.compute(Tasks.scala:521), scala.collection.parallel.ThreadPoolTasks$TaskImpl$class.run(Tasks.scala:273), scala.collection.parallel.AdaptiveWorkStealingThreadPoolTasks$TaskImpl.run(Tasks.scala:521), java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source), java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source), java.util.concurrent.FutureTask.run(Unknown Source), java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source), java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source), java.lang.Thread.run(Unknown Source)))
at scala.collection.parallel.package$$anon$3.alongWith(package.scala:114)
at scala.collection.parallel.Tasks$Task$class.mergeThrowables(Tasks.scala:98)
at scala.collection.parallel.ParIterableLike$Foreach.mergeThrowables(ParIterableLike.scala:894)
at scala.collection.parallel.Tasks$Task$class.tryMerge(Tasks.scala:84)
at scala.collection.parallel.ParIterableLike$Foreach.tryMerge(ParIterableLike.scala:894)
at scala.collection.parallel.AdaptiveWorkStealingTasks$TaskImpl$class.internal(Tasks.scala:186)
at scala.collection.parallel.AdaptiveWorkStealingThreadPoolTasks$TaskImpl.internal(Tasks.scala:521)
at scala.collection.parallel.AdaptiveWorkStealingTasks$TaskImpl$class.compute(Tasks.scala:164)
at scala.collection.parallel.AdaptiveWorkStealingThreadPoolTasks$TaskImpl.compute(Tasks.scala:521)
at scala.collection.parallel.ThreadPoolTasks$TaskImpl$class.run(Tasks.scala:273)
at scala.collection.parallel.AdaptiveWorkStealingThreadPoolTasks$TaskImpl.run(Tasks.scala:521)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
private var male: Boolean = _
def isMale(): Boolean = male
def setMale(male: Boolean) {
this.male = male
}
should be
@BeanProperty
var male: Boolean = _
Motivation:
Currently, one has to add the plugin to the pom.xml to use the maven-scalagen-plugin. As converting code from an existing maven project is usually an one-time-task, it makes much sense to use the plugin without any need to edit the pom.xml.
To do this use the following commandline:
$ mvn com.mysema.scalagen:scalagen-maven-plugin:0.1.2:main
Unfortunatelly, you can not configure the targetFolder that way, which is especially inconvenient when you already have some scala code in your project.
Solution:
Add the "expression"-tag to the JavaDoc of the targetFolder
field:
/**
* @parameter default-value="src/test/scala" expression="${targetFolder}"
*/
private String targetFolder;
Now you can run maven like this, to generate the converted code into another directory (here target/generated-for-review):
$ mvn com.mysema.scalagen:scalagen-maven-plugin:0.1.2:main -DtargetFolder=target/generated-for-review
Same applys for the test goal.
Many thanks for scalagen and the Maven plugin!
Tobias Roeser
add varargs invocation support
Example:
private String recordedLinks[];
//...
recordedLinks = new String[Parameters.TERM_LINK_RECORD_LENGTH];
translated as:
private var recordedLinks: String = new String(Parameters.TERM_LINK_RECORD_LENGTH)
In Java source:
https://open-nars.googlecode.com/svn/trunk/open-nars/src/com/googlecode/opennars/entity/TaskLink.java
The Java source (line 439 ) :
boolean success;
ArrayList<Term> list = t1.cloneComponents();
if (t1.getClass() == t2.getClass()) {
success = list.addAll(((CompoundTerm) t2).getComponents());
} else {
success = list.add(t2);
}
https://open-nars.googlecode.com/svn/trunk/nars/language/CompoundTerm.java
The generated Scala :
var success: Boolean = _
val list = t1.cloneComponents()
success = if (t1.getClass == t2.getClass) list.addAll(t2.asInstanceOf[CompoundTerm].getComponents) else list.add(t2)
COMMENT: moving up the val list declaration would be ideal solution, but maybe hard to implement ; maybe instead initialization to a neutral value like false for a Boolean and "" for a String will do . But NOTE : maybe this is intentional, because fixing like this would not be safe .
generated Scala, hand edited :
https://open-nars.googlecode.com/svn/trunk/nars_core/src/main/scala/nars/language/CompoundTerm.scala
remove all Exception rethrows
The code:
class A {
public static void main(String[] args) {
args = new String[] {"some", "test", "args"};
}
}
gets converted to:
object A {
def main(args: Array[String]) {
args = Array("some", "test", "args")
}
}
which doesn't compile, since method parameters are always final.
I'm not sure what the best way to fix this is. Maybe detecting re-assignment of a method parameter, changing the name in the method declaration, and creating a var with the original name (assigning the initial value to it).
always override for equals and hashCode
scalagen:scalagen -> scalagen:main
scalagen:scalagentest -> scalagen:test
Support setter only Bean properties
for (p <- paths) {
if (p.contains(".svn")) {
//continue
} else if (suffix == null || p.endsWith(suffix)) {
additions.add(new Resource(p, false, false))
}
}
should be translated as
for (p <- paths if !p.contains(".svn") && (suffix == null || p.endsWith(suffix))) {
additions.add(new Resource(p, false, false))
}
Transform following
if (packageName.length() > 0) {
this.localName = fullName.substring(packageName.length() + 1)
} else {
this.localName = fullName
}
into
this.localName = if (packageName.length() > 0) fullName.substring(packageName.length() + 1)
else fullName
Change UnitTransformerBase to support immutable List properties
e.g class EclipseLinkTemplatesprotected () extends JPQLTemplates {
The Java main method is translated by :
def main(args: String) {
when it should be :
def main(args: Array[String]) {
It may be the same with any static methods having array as arguments.
via block transformation
assert ( a && b ) // java
gets translated as
assert a && b
which does not compile.
This Java :
class Base {
Base(){} // unused
Base(String s){} // used
}
class Derived extends Base {
Derived(String s){ super(s); }
}
gives this :
class Base() {
def this(s: String) {
}
}
class Derived(s: String) extends Base(s)
fix Annotation usage issues
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.