scalagwt / scalagwt-scala Goto Github PK
View Code? Open in Web Editor NEWThis project forked from lexspoon/scalagwt-scala
Temporary fork of Scala for supporting Scala+GWT.
Home Page: http://code.google.com/p/scalagwt/
This project forked from lexspoon/scalagwt-scala
Temporary fork of Scala for supporting Scala+GWT.
Home Page: http://code.google.com/p/scalagwt/
The Scala team should be able to rely on "ant test" running all the tests, including the ones for the Jribble backend.
The code:
class A
class Test {
val a = new A {
def some = "Works"
}
a.some
}
The exception during scalac:
[scalac] scala.reflect.internal.MissingRequirementError: class scala.runtime.EmptyMethodCache not found.
[scalac] at scala.reflect.internal.MissingRequirementError$.signal(MissingRequirementError.scala:16)
[scalac] at scala.reflect.internal.MissingRequirementError$.notFound(MissingRequirementError.scala:17)
[scalac] at scala.reflect.internal.Definitions$definitions$$anonfun$getModuleOrClass$3.apply(Definitions.scala:697)
[scalac] at scala.reflect.internal.Definitions$definitions$$anonfun$getModuleOrClass$3.apply(Definitions.scala:697)
[scalac] at scala.reflect.internal.Symbols$Symbol.orElse(Symbols.scala:1773)
[scalac] at scala.reflect.internal.Definitions$definitions$.getModuleOrClass(Definitions.scala:696)
[scalac] at scala.reflect.internal.Definitions$definitions$.getModuleOrClass(Definitions.scala:705)
[scalac] at scala.reflect.internal.Definitions$definitions$.getClass(Definitions.scala:662)
[scalac] at scala.reflect.internal.Definitions$definitions$.EmptyMethodCacheClass(Definitions.scala:331)
[scalac] at scala.tools.nsc.transform.CleanUp$CleanUpTransformer.mkNewPolyCache$1(CleanUp.scala:246)
[scalac] at scala.tools.nsc.transform.CleanUp$CleanUpTransformer.reflectiveMethodCache$1(CleanUp.scala:247)
[scalac] at scala.tools.nsc.transform.CleanUp$CleanUpTransformer$$anonfun$callAsReflective$1$1.cache$1(CleanUp.scala:408)
[scalac] at scala.tools.nsc.transform.CleanUp$CleanUpTransformer$$anonfun$callAsReflective$1$1.lookup$1(CleanUp.scala:409)
[scalac] at scala.tools.nsc.transform.CleanUp$CleanUpTransformer$$anonfun$callAsReflective$1$1.invocation$1(CleanUp.scala:411)
[scalac] at scala.tools.nsc.transform.CleanUp$CleanUpTransformer$$anonfun$callAsReflective$1$1.genDefaultCall$1(CleanUp.scala:419)
[scalac] at scala.tools.nsc.transform.CleanUp$CleanUpTransformer$$anonfun$callAsReflective$1$1.apply(CleanUp.scala:451)
[scalac] at scala.tools.nsc.transform.CleanUp$CleanUpTransformer$$anonfun$callAsReflective$1$1.apply(CleanUp.scala:350)
[scalac] at scala.tools.nsc.ast.TreeGen.evalOnce(TreeGen.scala:210)
[scalac] at scala.tools.nsc.transform.CleanUp$CleanUpTransformer.callAsReflective$1(CleanUp.scala:350)
[scalac] at scala.tools.nsc.transform.CleanUp$CleanUpTransformer.transform(CleanUp.scala:502)
[scalac] at scala.reflect.api.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:1245)
[scalac] at scala.reflect.api.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:1243)
[scalac] at scala.collection.immutable.List.loop$1(List.scala:150)
[scalac] at scala.collection.immutable.List.mapConserve(List.scala:166)
[scalac] at scala.reflect.api.Trees$Transformer.transformStats(Trees.scala:1243)
[scalac] at scala.reflect.api.Trees$Transformer.transform(Trees.scala:1157)
[scalac] at scala.tools.nsc.transform.CleanUp$CleanUpTransformer.transform(CleanUp.scala:655)
[scalac] at scala.reflect.api.Trees$Transformer$$anonfun$transform$5.apply(Trees.scala:1143)
[scalac] at scala.reflect.api.Trees$Transformer$$anonfun$transform$5.apply(Trees.scala:1141)
[scalac] at scala.reflect.api.Trees$Transformer.atOwner(Trees.scala:1252)
[scalac] at scala.reflect.api.Trees$Transformer.transform(Trees.scala:1140)
[scalac] at scala.tools.nsc.transform.CleanUp$CleanUpTransformer.transform(CleanUp.scala:655)
[scalac] at scala.reflect.api.Trees$Transformer$$anonfun$transformTrees$1.apply(Trees.scala:1227)
[scalac] at scala.reflect.api.Trees$Transformer$$anonfun$transformTrees$1.apply(Trees.scala:1227)
[scalac] at scala.collection.immutable.List.loop$1(List.scala:150)
[scalac] at scala.collection.immutable.List.mapConserve(List.scala:166)
[scalac] at scala.reflect.api.Trees$Transformer.transformTrees(Trees.scala:1227)
[scalac] at scala.tools.nsc.transform.CleanUp$CleanUpTransformer.transform(CleanUp.scala:559)
[scalac] at scala.reflect.api.Trees$Transformer.transformTemplate(Trees.scala:1229)
[scalac] at scala.reflect.api.Trees$Transformer$$anonfun$transform$2.apply(Trees.scala:1127)
[scalac] at scala.reflect.api.Trees$Transformer$$anonfun$transform$2.apply(Trees.scala:1126)
[scalac] at scala.reflect.api.Trees$Transformer.atOwner(Trees.scala:1252)
[scalac] at scala.reflect.api.Trees$Transformer.transform(Trees.scala:1125)
[scalac] at scala.tools.nsc.transform.CleanUp$CleanUpTransformer.transform(CleanUp.scala:655)
[scalac] at scala.reflect.api.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:1245)
[scalac] at scala.reflect.api.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:1243)
[scalac] at scala.collection.immutable.List.loop$1(List.scala:150)
[scalac] at scala.collection.immutable.List.mapConserve(List.scala:166)
[scalac] at scala.reflect.api.Trees$Transformer.transformStats(Trees.scala:1243)
[scalac] at scala.reflect.api.Trees$Transformer$$anonfun$transform$1.apply(Trees.scala:1121)
[scalac] at scala.reflect.api.Trees$Transformer$$anonfun$transform$1.apply(Trees.scala:1121)
[scalac] at scala.reflect.api.Trees$Transformer.atOwner(Trees.scala:1252)
[scalac] at scala.reflect.api.Trees$Transformer.transform(Trees.scala:1120)
[scalac] at scala.tools.nsc.transform.CleanUp$CleanUpTransformer.transform(CleanUp.scala:655)
[scalac] at scala.tools.nsc.ast.Trees$Transformer.transformUnit(Trees.scala:204)
[scalac] at scala.tools.nsc.transform.Transform$Phase.apply(Transform.scala:30)
[scalac] at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:374)
[scalac] at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:344)
[scalac] at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:344)
[scalac] at scala.collection.Iterator$class.foreach(Iterator.scala:690)
[scalac] at scala.collection.mutable.ListBuffer$$anon$1.foreach(ListBuffer.scala:319)
[scalac] at scala.tools.nsc.Global$GlobalPhase.run(Global.scala:344)
[scalac] at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1066)
[scalac] at scala.tools.nsc.Global$Run.compileSources(Global.scala:1041)
[scalac] at scala.tools.nsc.Global$Run.compile(Global.scala:1154)
[scalac] at scala.tools.ant.Scalac.executeInternal(Scalac.scala:618)
[scalac] at scala.tools.ant.Scalac.execute(Scalac.scala:566)
[scalac] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
[scalac] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[scalac] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
[scalac] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[scalac] at java.lang.reflect.Method.invoke(Method.java:601)
[scalac] at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
[scalac] at org.apache.tools.ant.Task.perform(Task.java:348)
[scalac] at org.apache.tools.ant.Target.execute(Target.java:390)
[scalac] at org.apache.tools.ant.Target.performTasks(Target.java:411)
[scalac] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
[scalac] at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
[scalac] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
[scalac] at org.eclipse.ant.internal.launching.remote.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
[scalac] at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
[scalac] at org.eclipse.ant.internal.launching.remote.InternalAntRunner.run(InternalAntRunner.java:424)
[scalac] at org.eclipse.ant.internal.launching.remote.InternalAntRunner.main(InternalAntRunner.java:138)
I'm using 0.1-M3.
I would like to test on the latest sources, but the build process seems not straightforward.
By the way, thank you for making Scala+GWT possible!
Here's the output from ant gwtc when trying to use Scala's String.format. I'm guessing an implicit isn't being inserted?
[java] com.google.gwt.dev.jjs.InternalCompilerException: Unexpected error during visit.
[java] at com.google.gwt.dev.jjs.ast.JVisitor.translateException(JVisitor.java:109)
[java] at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:276)
[java] at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265)
[java] at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:116)
[java] at com.google.gwt.dev.jjs.ast.JReturnStatement.traverse(JReturnStatement.java:39)
[java] at com.google.gwt.dev.jjs.ast.JModVisitor$ListContextImmutable.traverse(JModVisitor.java:170)
[java] at com.google.gwt.dev.jjs.ast.JModVisitor.acceptWithInsertRemoveImmutable(JModVisitor.java:336)
[java] at com.google.gwt.dev.jjs.ast.JBlock.traverse(JBlock.java:83)
[java] at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
[java] at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
[java] at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:137)
[java] at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:133)
[java] at com.google.gwt.dev.jjs.ast.JMethodBody.traverse(JMethodBody.java:82)
[java] at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
[java] at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
[java] at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265)
[java] at com.google.gwt.dev.jjs.ast.JMethod.visitChildren(JMethod.java:426)
[java] at com.google.gwt.dev.jjs.ast.JMethod.traverse(JMethod.java:395)
[java] at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
[java] at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
[java] at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265)
[java] at com.google.gwt.dev.jjs.impl.UnifyAst.mainLoop(UnifyAst.java:890)
[java] at com.google.gwt.dev.jjs.impl.UnifyAst.exec(UnifyAst.java:615)
[java] at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.precompile(JavaToJavaScriptCompiler.java:545)
[java] at com.google.gwt.dev.jjs.JavaScriptCompiler.precompile(JavaScriptCompiler.java:33)
[java] at com.google.gwt.dev.Precompile.precompile(Precompile.java:278)
[java] at com.google.gwt.dev.Precompile.precompile(Precompile.java:229)
[java] at com.google.gwt.dev.Precompile.precompile(Precompile.java:141)
[java] at com.google.gwt.dev.Compiler.run(Compiler.java:232)
[java] at com.google.gwt.dev.Compiler.run(Compiler.java:198)
[java] at com.google.gwt.dev.Compiler$1.run(Compiler.java:170)
[java] at com.google.gwt.dev.CompileTaskRunner.doRun(CompileTaskRunner.java:88)
[java] at com.google.gwt.dev.CompileTaskRunner.runWithAppropriateLogger(CompileTaskRunner.java:82)
[java] at com.google.gwt.dev.Compiler.main(Compiler.java:177)
[java] Caused by: java.lang.NoSuchMethodError: java.lang.String.format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
[java] at com.google.gwt.dev.jjs.impl.UnifyAst.translate(UnifyAst.java:1086)
[java] at com.google.gwt.dev.jjs.impl.UnifyAst.access$800(UnifyAst.java:120)
[java] at com.google.gwt.dev.jjs.impl.UnifyAst$UnifyVisitor.visit(UnifyAst.java:333)
[java] at com.google.gwt.dev.jjs.ast.JMethodCall.traverse(JMethodCall.java:240)
[java] at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
[java] at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
[java] ... 32 more
[java] [ERROR] at Unknown(0): String.format($this.toString(), (Object[]) ((TraversableOnce) args.map(new StringLike$$anonfun$format$1($this), Seq$.MODULE$.canBuildFrom())).toArray(Manifest$.MODULE$.Object()))
[java] com.google.gwt.dev.jjs.ast.JMethodCall
[java] [ERROR] at Unknown(0): return String.format($this.toString(), (Object[]) ((TraversableOnce) args.map(new StringLike$$anonfun$format$1($this), Seq$.MODULE$.canBuildFrom())).toArray(Manifest$.MODULE$.Object()))
[java] com.google.gwt.dev.jjs.ast.JReturnStatement
[java] [ERROR] at Unknown(0): {
[java] return String.format($this.toString(), (Object[]) ((TraversableOnce) args.map(new StringLike$$anonfun$format$1($this), Seq$.MODULE$.canBuildFrom())).toArray(Manifest$.MODULE$.Object()));
[java] }
[java] com.google.gwt.dev.jjs.ast.JBlock
[java] [ERROR] at Unknown(0): {
[java] return String.format($this.toString(), (Object[]) ((TraversableOnce) args.map(new StringLike$$anonfun$format$1($this), Seq$.MODULE$.canBuildFrom())).toArray(Manifest$.MODULE$.Object()));
[java] }
[java] com.google.gwt.dev.jjs.ast.JMethodBody
[java] [ERROR] at Unknown(0): public static String format(StringLike $this, Seq args);
[java]
[java] com.google.gwt.dev.jjs.ast.JMethod
[java] Shutting down PersistentUnitCache thread
Code like this:
def matchOnPrimitive(x: Any): Int = x match {
case x: Byte => 0
case _ => 1
}
results in broken jribble output:
public I; matchOnPrimitive(Ljava/lang/Object; x) {
Ljava/lang/Object; temp1 = x;
I; $1$;
if (temp1.<instanceof>(B;))
{
$1$ = 0;
}
else
{
$1$ = 1;
}
return $1$;
}
Note instanceof
check with primitive type as an argument.
As discussed before we would like to run jribble backend along with jvm one so we get both jribble files and class files in one compilation run.
We want to do this because we need both class files and jribble files in our current scalagwt-gwt implementation.
This issue is independent of whether we want to package jribble backend as a compiler plug-in or not.
class MyEntryPoint extends EntryPoint {
def onModuleLoad {
val xml = <b><i>text</i>text</b>
RootPanel.get().add(new Label(xml.toString))
}
}
DevMode works. But when compiled to JS
IE says "Stack overflow at line..."
Chrome says "Uncaught RangeError: Maximum call stack size exceeded"
Looks like the problem is inside xml.toString
But this works fine everywhere:
class MyEntryPoint extends EntryPoint {
def onModuleLoad {
val xml = <b>text</b>
RootPanel.get().add(new Label(xml.toString))
}
}
Jribble backend have a bug that results in following jribble output:
$4$ = throw x;
This is clearly wrong and need to investigate why expressions of Nothing type are not lifted to top-level statements.
Consider following code
object A {
val x = new Foo {
println(y)
}
val y = 10
}
class Foo
When compiled using jvm
backend it will print 0
because y
is not initialized before x
is initialized so it prints default value. However, when compiled to jribble it will fail with NPE
because reference to y
is expanded to A.y
which means that we need an instance of A
at the time constructor of A
is being executed. Given current implementation, this instance is not available.
Following snippet
val NaN_FLOAT = java.lang.Float.NaN
val NEG_INF_FLOAT = java.lang.Float.NEGATIVE_INFINITY
val POS_INF_FLOAT = java.lang.Float.POSITIVE_INFINITY
will lead to following (broken jribble output)
F; NaN_FLOAT = NaNF;
F; NEG_INF_FLOAT = -InfinityF;
F; POS_INF_FLOAT = InfinityF;
In order to fix it we need to unroll inlining of constants for these cases in jribble backend.
We should have nightly builds for scalagwt-scala project and we should publish our version of scala-compiler.jar
to maven repo.
Not sure if this is intended or not. I'm using milestone 2, and scalac-client is equivalent to scalac in that ant file. I have my build split up into server and client classpaths so that I can separate things out.
[scalac-client] Compiling 5 source files to /Users/jhartman/code/orgchart/war/WEB-INF/jribble
[scalac-client] /Users/jhartman/code/orgchart/shared/src/josh/shared/Seniority.scala:3: error: not found: type Enumeration
[scalac-client] object Seniority extends Enumeration {
[scalac-client] ^
[scalac-client] /Users/jhartman/code/orgchart/shared/src/josh/shared/Seniority.scala:4: error: not found: type Value
[scalac-client] type Seniority = Value
For example, ClassManifest.newArray throws a RuntimeException.
It is not currently in scala-library-jribble.jar.
When GWT has an emulated NoSuchMethodException.
It's been already discussed and it's seems that everybody agrees that moving hairy logic that prepares scala-library-gwt.jar
out of scalagwt-scala project is a good idea.
Specific changes will include:
git diff master..scalagwt
command gets significantly smaller at the end of the processOnce this is done, scalagwt-scala should build without any external dependencies again.
Following code snippet:
def catchAndPassToLambda {
try { true } catch { case ex: Exception => val f = () => ex }
}
results in jribble output where variable holding exception is named ex
but referenced as ex$2
. See below:
member {
type: Method
modifiers {
isPublic: true
}
method {
name: "catchAndPassToLambda"
returnType {
type: Void
}
body {
type: Block
block {
statement {
type: Try
tryStat {
block {
type: Block
block {
}
}
catch {
tpe {
pkg: "java.lang"
name: "Exception"
}
param: "ex"
body {
type: Block
block {
statement {
type: VarDef
varDef {
tpe {
type: Named
namedType {
pkg: "scala"
name: "Function0"
}
}
name: "f"
initializer {
type: NewObject
newObject {
clazz {
name: "Try$$anonfun$1"
}
signature {
name: "new"
owner {
name: "Try$$anonfun$1"
}
paramType {
type: Named
namedType {
name: "Try"
}
}
paramType {
type: Named
namedType {
pkg: "java.lang"
name: "Exception"
}
}
returnType {
type: Named
namedType {
name: "Try$$anonfun$1"
}
}
}
argument {
type: ThisRef
}
argument {
type: VarRef
varRef {
name: "ex$2"
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
Jribble backend skips annotations at the moment. GWT uses annotations for various purposes so we need to add suport for them.
This issue depends on scalagwt/scalagwt-jribble#1.
Let's say we've got JavaEnum.java
:
public enum JavaEnum { X }
and following Y.scala
:
class Y {
def foo = JavaEnum.X
}
Compile JavaEnum first with javac JavaEnum.java
so there class file created for it and then we compile with scalac:
scalac -target:jribble Y.scala
you'll notice that jribble output is broken:
public class LY; extends Ljava/lang/Object; implements Lscala/ScalaObject; {
public LJavaEnum; foo() {
return value X;
}
public this() {
(Ljava/lang/Object;::super()V;)();
}
}
but if you supply java source file as argument to scalac:
scalac -target:jribble Y.scala JavaEnum.java
then jribble output seems to be correct:
public class LY; extends Ljava/lang/Object; implements Lscala/ScalaObject; {
public LJavaEnum; foo() {
return LJavaEnum;.X;
}
public this() {
(Ljava/lang/Object;::super()V;)();
}
}
Hacks introduced to deal with forward jumps lead to broken jribble output. We should give up on them and come up with proper fix.
class Constants {
def chars = {
val minChar = Char.MinValue
val maxChar = Char.MaxValue
}
}
results in broken jribble output because values are not escaped.
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.