@@ -28,6 +28,35 @@ import sbtbuildinfo.BuildInfoPlugin.autoImport._
28
28
29
29
import scala .util .Properties .isJavaAtLeast
30
30
31
+ object MyScalaJSPlugin extends AutoPlugin {
32
+ import Build ._
33
+
34
+ override def requires : Plugins = ScalaJSPlugin
35
+
36
+ override def projectSettings : Seq [Setting [_]] = Def .settings(
37
+ commonBootstrappedSettings,
38
+
39
+ /* Remove the Scala.js compiler plugin for scalac, and enable the
40
+ * Scala.js back-end of dotty instead.
41
+ */
42
+ libraryDependencies := {
43
+ val deps = libraryDependencies.value
44
+ deps.filterNot(_.name.startsWith(" scalajs-compiler" )).map(_.withDottyCompat(scalaVersion.value))
45
+ },
46
+ scalacOptions += " -scalajs" ,
47
+
48
+ // Replace the JVM JUnit dependency by the Scala.js one
49
+ libraryDependencies ~= {
50
+ _.filter(! _.name.startsWith(" junit-interface" ))
51
+ },
52
+ libraryDependencies +=
53
+ (" org.scala-js" %% " scalajs-junit-test-runtime" % scalaJSVersion % " test" ).withDottyCompat(scalaVersion.value),
54
+
55
+ // Typecheck the Scala.js IR found on the classpath
56
+ scalaJSLinkerConfig ~= (_.withCheckIR(true )),
57
+ )
58
+ }
59
+
31
60
object Build {
32
61
val scalacVersion = " 2.12.8"
33
62
val referenceVersion = " 0.14.0-RC1"
@@ -101,6 +130,8 @@ object Build {
101
130
val ideTestsCompilerArguments = taskKey[Seq [String ]](" Compiler arguments to use in IDE tests" )
102
131
val ideTestsDependencyClasspath = taskKey[Seq [File ]](" Dependency classpath to use in IDE tests" )
103
132
133
+ val fetchScalaJSSource = taskKey[File ](" Fetch the sources of Scala.js" )
134
+
104
135
lazy val SourceDeps = config(" sourcedeps" )
105
136
106
137
// Settings shared by the build (scoped in ThisBuild). Used in build.sbt
@@ -712,6 +743,31 @@ object Build {
712
743
case Bootstrapped => `dotty-library-bootstrapped`
713
744
}
714
745
746
+ /** The dotty standard library compiled with the Scala.js back-end, to produce
747
+ * the corresponding .sjsir files.
748
+ *
749
+ * This artifact must be on the classpath on every "Dotty.js" project.
750
+ *
751
+ * Currently, only a very small fraction of the dotty library is actually
752
+ * included in this project, and hence available to Dotty.js projects. More
753
+ * will be added in the future as things are confirmed to be supported.
754
+ */
755
+ lazy val `dotty-library-bootstrappedJS` : Project = project.in(file(" library-js" )).
756
+ asDottyLibrary(Bootstrapped ).
757
+ enablePlugins(MyScalaJSPlugin ).
758
+ settings(
759
+ // TODO Compile more (enventually all) of the library
760
+ /* unmanagedSourceDirectories in Compile :=
761
+ (unmanagedSourceDirectories in (`dotty-library-bootstrapped`, Compile)).value,*/
762
+ sources in Compile := {
763
+ val baseDir = (baseDirectory in (`dotty-library-bootstrapped`, Compile )).value
764
+ Seq (
765
+ baseDir / " src/scala/forceInline.scala" ,
766
+ baseDir / " src-3.x/dotty/DottyPredef.scala" ,
767
+ )
768
+ },
769
+ )
770
+
715
771
lazy val `dotty-sbt-bridge` = project.in(file(" sbt-bridge/src" )).
716
772
// We cannot depend on any bootstrapped project to compile the bridge, since the
717
773
// bridge is needed to compile these projects.
@@ -817,36 +873,102 @@ object Build {
817
873
* useful, as that would not provide the linker and JS runners.
818
874
*/
819
875
lazy val sjsSandbox = project.in(file(" sandbox/scalajs" )).
820
- enablePlugins(ScalaJSPlugin ).
821
- dependsOn(dottyLibrary(Bootstrapped )).
822
- settings(commonBootstrappedSettings).
876
+ enablePlugins(MyScalaJSPlugin ).
877
+ dependsOn(`dotty-library-bootstrappedJS`).
823
878
settings(
824
- /* Remove the Scala.js compiler plugin for scalac, and enable the
825
- * Scala.js back-end of dotty instead.
826
- */
827
- libraryDependencies := {
828
- val deps = libraryDependencies.value
829
- deps.filterNot(_.name.startsWith(" scalajs-compiler" )).map(_.withDottyCompat(scalaVersion.value))
830
- },
831
- scalacOptions += " -scalajs" ,
879
+ scalaJSUseMainModuleInitializer := true ,
880
+ )
832
881
833
- // Replace the JVM JUnit dependency by the Scala.js one
834
- libraryDependencies ~= {
835
- _.filter(! _.name.startsWith(" junit-interface" ))
882
+ /** Scala.js test suite.
883
+ *
884
+ * This project downloads the sources of the upstream Scala.js test suite,
885
+ * and tests them with the dotty Scala.js back-end. Currently, only a very
886
+ * small fraction of the upstream test suite is actually compiled and run.
887
+ * It will grow in the future, as more stuff is confirmed to be supported.
888
+ */
889
+ lazy val sjsJUnitTests = project.in(file(" tests/sjs-junit" )).
890
+ enablePlugins(MyScalaJSPlugin ).
891
+ dependsOn(`dotty-library-bootstrappedJS`).
892
+ settings(
893
+ scalacOptions --= Seq (" -Xfatal-warnings" , " -deprecation" ),
894
+
895
+ sourceDirectory in fetchScalaJSSource := target.value / s " scala-js-src- $scalaJSVersion" ,
896
+
897
+ fetchScalaJSSource := {
898
+ import org .eclipse .jgit .api ._
899
+
900
+ val s = streams.value
901
+ val ver = scalaJSVersion
902
+ val trgDir = (sourceDirectory in fetchScalaJSSource).value
903
+
904
+ if (! trgDir.exists) {
905
+ s.log.info(s " Fetching Scala.js source version $ver" )
906
+ IO .createDirectory(trgDir)
907
+ new CloneCommand ()
908
+ .setDirectory(trgDir)
909
+ .setURI(" https://github.com/scala-js/scala-js.git" )
910
+ .call()
911
+ }
912
+
913
+ // Checkout proper ref. We do this anyway so we fail if something is wrong
914
+ val git = Git .open(trgDir)
915
+ s.log.info(s " Checking out Scala.js source version $ver" )
916
+ git.checkout().setName(s " v $ver" ).call()
917
+
918
+ trgDir
836
919
},
920
+
921
+ // We need JUnit in the Compile configuration
837
922
libraryDependencies +=
838
- (" org.scala-js" %% " scalajs-junit-test-runtime" % scalaJSVersion % " test " ).withDottyCompat(scalaVersion.value),
923
+ (" org.scala-js" %% " scalajs-junit-test-runtime" % scalaJSVersion).withDottyCompat(scalaVersion.value),
839
924
840
- // The main class cannot be found automatically due to the empty inc.Analysis
841
- mainClass in Compile := Some ( " hello.HelloWorld " ),
925
+ sourceGenerators in Compile += Def .task {
926
+ import org . scalajs . linker . CheckedBehavior
842
927
843
- scalaJSUseMainModuleInitializer := true ,
928
+ val stage = scalaJSStage.value
844
929
845
- /* Debug-friendly Scala.js optimizer options.
846
- * In particular, typecheck the Scala.js IR found on the classpath.
847
- */
848
- scalaJSLinkerConfig ~= {
849
- _.withCheckIR(true ).withParallel(false )
930
+ val linkerConfig = stage match {
931
+ case FastOptStage => (scalaJSLinkerConfig in (Compile , fastOptJS)).value
932
+ case FullOptStage => (scalaJSLinkerConfig in (Compile , fullOptJS)).value
933
+ }
934
+
935
+ val moduleKind = linkerConfig.moduleKind
936
+ val sems = linkerConfig.semantics
937
+
938
+ ConstantHolderGenerator .generate(
939
+ (sourceManaged in Compile ).value,
940
+ " org.scalajs.testsuite.utils.BuildInfo" ,
941
+ " scalaVersion" -> scalaVersion.value,
942
+ " hasSourceMaps" -> false , // MyScalaJSPlugin.wantSourceMaps.value,
943
+ " isNoModule" -> (moduleKind == ModuleKind .NoModule ),
944
+ " isESModule" -> (moduleKind == ModuleKind .ESModule ),
945
+ " isCommonJSModule" -> (moduleKind == ModuleKind .CommonJSModule ),
946
+ " isFullOpt" -> (stage == FullOptStage ),
947
+ " compliantAsInstanceOfs" -> (sems.asInstanceOfs == CheckedBehavior .Compliant ),
948
+ " compliantArrayIndexOutOfBounds" -> (sems.arrayIndexOutOfBounds == CheckedBehavior .Compliant ),
949
+ " compliantModuleInit" -> (sems.moduleInit == CheckedBehavior .Compliant ),
950
+ " strictFloats" -> sems.strictFloats,
951
+ " productionMode" -> sems.productionMode,
952
+ " es2015" -> linkerConfig.esFeatures.useECMAScript2015,
953
+ )
954
+ }.taskValue,
955
+
956
+ managedSources in Compile ++= {
957
+ val dir = fetchScalaJSSource.value / " test-suite/js/src/main/scala"
958
+ val filter = (
959
+ (" *.scala" : FileFilter )
960
+ -- " Typechecking*.scala"
961
+ -- " NonNativeTypeTestSeparateRun.scala"
962
+ )
963
+ (dir ** filter).get
964
+ },
965
+
966
+ managedSources in Test ++= {
967
+ val dir = fetchScalaJSSource.value / " test-suite"
968
+ (
969
+ (dir / " shared/src/test/scala/org/scalajs/testsuite/compiler" ** " IntTest.scala" ).get
970
+ ++ (dir / " shared/src/test/scala/org/scalajs/testsuite/utils" ** " *.scala" ).get
971
+ )
850
972
}
851
973
)
852
974
0 commit comments