Skip to content

Commit 72219a2

Browse files
committed
Improve the story for setting up an Eclipse development environment.
1 parent 8424974 commit 72219a2

File tree

3 files changed

+92
-45
lines changed

3 files changed

+92
-45
lines changed

Diff for: .gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ target/
88
/cli/pack/
99
/.idea/
1010
/.idea_modules/
11+
bin/

Diff for: DEVELOPING.md

+15
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,21 @@ or, more typically,
7070

7171
> partestSuite/testOnly -- --fastOpt
7272

73+
## Eclipse
74+
75+
If you want to develop in Eclipse, use
76+
[sbteclipse](https://github.com/typesafehub/sbteclipse). Projects as created by
77+
the build by default are not suited for Eclipse. You can create *somewhat*
78+
appropriate projects with:
79+
80+
$ sbt tools/sources
81+
$ GENERATING_ECLIPSE=true sbt "eclipse with-source=true"
82+
83+
You will still have to fix a few things:
84+
85+
* Uncheck the "Allow output directories per source directory" in Build path
86+
* Add transitive project dependencies in Build path
87+
7388
## Organization of the repository
7489

7590
The repository is organized as follows:

Diff for: project/Build.scala

+76-45
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ import sbtassembly.AssemblyPlugin.autoImport._
3939

4040
object Build extends sbt.Build {
4141

42+
val isGeneratingEclipse =
43+
Properties.envOrElse("GENERATING_ECLIPSE", "false").toBoolean
44+
4245
val fetchScalaSource = taskKey[File](
4346
"Fetches the scala source for the current scala version")
4447
val shouldPartest = settingKey[Boolean](
@@ -215,6 +218,13 @@ object Build extends sbt.Build {
215218
}
216219
) ++ mimaDefaultSettings
217220

221+
val noClassFilesSettings: Setting[_] = (
222+
scalacOptions in (Compile, compile) ++= {
223+
if (isGeneratingEclipse) Seq()
224+
else Seq("-Yskip:cleanup,icode,jvm")
225+
}
226+
)
227+
218228
val publishSettings = Seq(
219229
publishMavenStyle := true,
220230
publishTo := {
@@ -312,7 +322,8 @@ object Build extends sbt.Build {
312322

313323
// Link source maps
314324
scalacOptions ++= {
315-
if (scalaJSIsSnapshotVersion) Seq()
325+
if (isGeneratingEclipse) Seq()
326+
else if (scalaJSIsSnapshotVersion) Seq()
316327
else Seq(
317328
// Link source maps to github sources
318329
"-P:scalajs:mapSourceURI:" + root.base.toURI +
@@ -322,13 +333,37 @@ object Build extends sbt.Build {
322333
}
323334
)
324335

325-
/** Depend library as if (exportJars in library) was set to false */
326-
val compileWithLibrarySetting = {
327-
internalDependencyClasspath in Compile ++= {
328-
val prods = (products in (library, Compile)).value
329-
val analysis = (compile in (library, Compile)).value
336+
implicit class ProjectOps(val project: Project) extends AnyVal {
337+
/** Uses the Scala.js compiler plugin. */
338+
def withScalaJSCompiler: Project =
339+
if (isGeneratingEclipse) project
340+
else project.dependsOn(compiler % "plugin")
341+
342+
/** Depends on library as if (exportJars in library) was set to false. */
343+
def dependsOnLibraryNoJar: Project = {
344+
if (isGeneratingEclipse) {
345+
project.dependsOn(library)
346+
} else {
347+
project.settings(
348+
internalDependencyClasspath in Compile ++= {
349+
val prods = (products in (library, Compile)).value
350+
val analysis = (compile in (library, Compile)).value
351+
prods.map(p => Classpaths.analyzed(p, analysis))
352+
}
353+
)
354+
}
355+
}
330356

331-
prods.map(p => Classpaths.analyzed(p, analysis))
357+
/** Depends on the sources of another project. */
358+
def dependsOnSource(dependency: Project): Project = {
359+
if (isGeneratingEclipse) {
360+
project.dependsOn(dependency)
361+
} else {
362+
project.settings(
363+
unmanagedSourceDirectories in Compile +=
364+
(scalaSource in (dependency, Compile)).value
365+
)
366+
}
332367
}
333368
}
334369

@@ -419,16 +454,14 @@ object Build extends sbt.Build {
419454
unmanagedSourceDirectories in Compile +=
420455
(scalaSource in Compile in irProject).value
421456
)
422-
).dependsOn(compiler % "plugin", javalibEx)
457+
).withScalaJSCompiler.dependsOn(javalibEx)
423458

424459
lazy val compiler: Project = Project(
425460
id = "compiler",
426461
base = file("compiler"),
427462
settings = commonSettings ++ publishSettings ++ Seq(
428463
name := "Scala.js compiler",
429464
crossVersion := CrossVersion.full, // because compiler api is not binary compatible
430-
unmanagedSourceDirectories in Compile +=
431-
(scalaSource in (irProject, Compile)).value,
432465
libraryDependencies ++= Seq(
433466
"org.scala-lang" % "scala-compiler" % scalaVersion.value,
434467
"org.scala-lang" % "scala-reflect" % scalaVersion.value,
@@ -459,7 +492,7 @@ object Build extends sbt.Build {
459492
},
460493
exportJars := true
461494
)
462-
)
495+
).dependsOnSource(irProject)
463496

464497
val commonToolsSettings = (
465498
commonSettings ++ publishSettings ++ fatalWarningsSettings
@@ -531,7 +564,7 @@ object Build extends sbt.Build {
531564
runner.run()
532565
}
533566
}
534-
).dependsOn(compiler % "plugin", javalibEx, testSuite % "test->test", irProjectJS)
567+
).withScalaJSCompiler.dependsOn(javalibEx, testSuite % "test->test", irProjectJS)
535568

536569
lazy val jsEnvs: Project = Project(
537570
id = "jsEnvs",
@@ -573,7 +606,6 @@ object Build extends sbt.Build {
573606
normalizedName := "sbt-scalajs",
574607
name in bintray := "sbt-scalajs-plugin", // "sbt-scalajs" was taken
575608
sbtPlugin := true,
576-
scalaVersion := "2.10.6",
577609
scalaBinaryVersion :=
578610
CrossVersion.binaryScalaVersion(scalaVersion.value),
579611
previousArtifactSetting,
@@ -598,7 +630,8 @@ object Build extends sbt.Build {
598630

599631
lazy val delambdafySetting = {
600632
scalacOptions ++= (
601-
if (scalaBinaryVersion.value == "2.10") Seq()
633+
if (isGeneratingEclipse) Seq()
634+
else if (scalaBinaryVersion.value == "2.10") Seq()
602635
else Seq("-Ydelambdafy:method"))
603636
}
604637

@@ -630,8 +663,7 @@ object Build extends sbt.Build {
630663
name := "java.lang library for Scala.js",
631664
publishArtifact in Compile := false,
632665
delambdafySetting,
633-
scalacOptions += "-Yskip:cleanup,icode,jvm",
634-
compileWithLibrarySetting,
666+
noClassFilesSettings,
635667

636668
resourceGenerators in Compile <+= Def.task {
637669
val base = (resourceManaged in Compile).value
@@ -643,7 +675,7 @@ object Build extends sbt.Build {
643675
) ++ (
644676
scalaJSExternalCompileSettings
645677
)
646-
).dependsOn(compiler % "plugin")
678+
).withScalaJSCompiler.dependsOnLibraryNoJar
647679

648680
lazy val javalib: Project = Project(
649681
id = "javalib",
@@ -654,12 +686,11 @@ object Build extends sbt.Build {
654686
name := "Java library for Scala.js",
655687
publishArtifact in Compile := false,
656688
delambdafySetting,
657-
scalacOptions += "-Yskip:cleanup,icode,jvm",
658-
compileWithLibrarySetting
689+
noClassFilesSettings
659690
) ++ (
660691
scalaJSExternalCompileSettings
661692
)
662-
).dependsOn(compiler % "plugin")
693+
).withScalaJSCompiler.dependsOnLibraryNoJar
663694

664695
lazy val scalalib: Project = Project(
665696
id = "scalalib",
@@ -668,16 +699,13 @@ object Build extends sbt.Build {
668699
name := "Scala library for Scala.js",
669700
publishArtifact in Compile := false,
670701
delambdafySetting,
671-
compileWithLibrarySetting,
702+
noClassFilesSettings,
672703

673704
// The Scala lib is full of warnings we don't want to see
674705
scalacOptions ~= (_.filterNot(
675706
Set("-deprecation", "-unchecked", "-feature") contains _)),
676707

677-
678708
scalacOptions ++= List(
679-
// Do not generate .class files
680-
"-Yskip:cleanup,icode,jvm",
681709
// Tell plugin to hack fix bad classOf trees
682710
"-P:scalajs:fixClassOf",
683711
// Link source maps to github sources of original Scalalib
@@ -796,7 +824,7 @@ object Build extends sbt.Build {
796824
) ++ (
797825
scalaJSExternalCompileSettings
798826
)
799-
).dependsOn(compiler % "plugin")
827+
).withScalaJSCompiler.dependsOnLibraryNoJar
800828

801829
lazy val libraryAux: Project = Project(
802830
id = "libraryAux",
@@ -807,12 +835,11 @@ object Build extends sbt.Build {
807835
name := "Scala.js aux library",
808836
publishArtifact in Compile := false,
809837
delambdafySetting,
810-
scalacOptions += "-Yskip:cleanup,icode,jvm",
811-
compileWithLibrarySetting
838+
noClassFilesSettings
812839
) ++ (
813840
scalaJSExternalCompileSettings
814841
)
815-
).dependsOn(compiler % "plugin")
842+
).withScalaJSCompiler.dependsOnLibraryNoJar
816843

817844
lazy val library: Project = Project(
818845
id = "library",
@@ -823,7 +850,7 @@ object Build extends sbt.Build {
823850
name := "Scala.js library",
824851
delambdafySetting,
825852
scalacOptions in (Compile, doc) ++= Seq("-implicits", "-groups"),
826-
exportJars := true,
853+
exportJars := !isGeneratingEclipse,
827854
previousArtifactSetting,
828855
binaryIssueFilters ++= BinaryIncompatibilities.Library,
829856
libraryDependencies +=
@@ -862,7 +889,7 @@ object Build extends sbt.Build {
862889
libraryMappings ++ otherMappings ++ javalibFilteredMappings
863890
}
864891
))
865-
).dependsOn(compiler % "plugin")
892+
).withScalaJSCompiler
866893

867894
lazy val javalibEx: Project = Project(
868895
id = "javalibEx",
@@ -872,14 +899,14 @@ object Build extends sbt.Build {
872899
) ++ Seq(
873900
name := "Scala.js JavaLib Ex",
874901
delambdafySetting,
875-
scalacOptions in (Compile, compile) += "-Yskip:cleanup,icode,jvm",
902+
noClassFilesSettings,
876903
exportJars := true,
877904
jsDependencies +=
878905
"org.webjars" % "jszip" % "2.4.0" / "jszip.min.js" commonJSName "JSZip"
879906
) ++ (
880907
scalaJSExternalCompileSettings
881908
)
882-
).dependsOn(compiler % "plugin", library)
909+
).withScalaJSCompiler.dependsOn(library)
883910

884911
lazy val stubs: Project = Project(
885912
id = "stubs",
@@ -926,7 +953,7 @@ object Build extends sbt.Build {
926953
previousArtifactSetting,
927954
binaryIssueFilters ++= BinaryIncompatibilities.TestInterface
928955
)
929-
).dependsOn(compiler % "plugin", library)
956+
).withScalaJSCompiler.dependsOn(library)
930957

931958
lazy val jasmineTestFramework = Project(
932959
id = "jasmineTestFramework",
@@ -942,14 +969,14 @@ object Build extends sbt.Build {
942969
"jasmine.js" dependsOn "jasmine-polyfills.js"
943970
)
944971
)
945-
).dependsOn(compiler % "plugin", library, testInterface)
972+
).withScalaJSCompiler.dependsOn(library, testInterface)
946973

947974
lazy val jUnitRuntime = Project(
948975
id = "jUnitRuntime",
949976
base = file("junit-runtime"),
950977
settings = commonSettings ++ publishSettings ++ myScalaJSSettings ++
951978
fatalWarningsSettings ++ Seq(name := "Scala.js JUnit test runtime")
952-
).dependsOn(compiler % "plugin", testInterface)
979+
).withScalaJSCompiler.dependsOn(testInterface)
953980

954981
lazy val jUnitPlugin = Project(
955982
id = "jUnitPlugin",
@@ -982,7 +1009,7 @@ object Build extends sbt.Build {
9821009
moduleName := "helloworld",
9831010
persistLauncher := true
9841011
)
985-
).dependsOn(compiler % "plugin", library)
1012+
).withScalaJSCompiler.dependsOn(library)
9861013

9871014
lazy val reversi = Project(
9881015
id = "reversi",
@@ -991,7 +1018,7 @@ object Build extends sbt.Build {
9911018
name := "Reversi - Scala.js example",
9921019
moduleName := "reversi"
9931020
)
994-
).dependsOn(compiler % "plugin", library)
1021+
).withScalaJSCompiler.dependsOn(library)
9951022

9961023
lazy val testingExample = Project(
9971024
id = "testingExample",
@@ -1005,7 +1032,7 @@ object Build extends sbt.Build {
10051032
"org.webjars" % "jquery" % "1.10.2" / "jquery.js" % "test"
10061033
)
10071034
)
1008-
).dependsOn(compiler % "plugin", library, jasmineTestFramework % "test")
1035+
).withScalaJSCompiler.dependsOn(library, jasmineTestFramework % "test")
10091036

10101037
// Testing
10111038

@@ -1185,13 +1212,17 @@ object Build extends sbt.Build {
11851212
Seq(outFile)
11861213
},
11871214

1188-
scalacOptions in Test += {
1189-
val jar = (packageBin in (jUnitPlugin, Compile)).value
1190-
s"-Xplugin:$jar"
1215+
scalacOptions in Test ++= {
1216+
if (isGeneratingEclipse) {
1217+
Seq.empty
1218+
} else {
1219+
val jar = (packageBin in (jUnitPlugin, Compile)).value
1220+
Seq(s"-Xplugin:$jar")
1221+
}
11911222
}
11921223
)
1193-
).dependsOn(
1194-
compiler % "plugin", library, jUnitRuntime % "test", jasmineTestFramework % "test"
1224+
).withScalaJSCompiler.dependsOn(
1225+
library, jUnitRuntime % "test", jasmineTestFramework % "test"
11951226
)
11961227

11971228
lazy val testSuiteJVM: Project = Project(
@@ -1216,7 +1247,7 @@ object Build extends sbt.Build {
12161247
),
12171248
publishArtifact in Compile := false
12181249
)
1219-
).dependsOn(compiler % "plugin", library, jasmineTestFramework % "test")
1250+
).withScalaJSCompiler.dependsOn(library, jasmineTestFramework % "test")
12201251

12211252
lazy val javalibExTestSuite: Project = Project(
12221253
id = "javalibExTestSuite",
@@ -1229,7 +1260,7 @@ object Build extends sbt.Build {
12291260

12301261
scalacOptions in Test ~= (_.filter(_ != "-deprecation"))
12311262
)
1232-
).dependsOn(compiler % "plugin", javalibEx, jasmineTestFramework % "test")
1263+
).withScalaJSCompiler.dependsOn(javalibEx, jasmineTestFramework % "test")
12331264

12341265
lazy val partest: Project = Project(
12351266
id = "partest",

0 commit comments

Comments
 (0)