1
1
package dotty .tools .sbtplugin
2
2
3
3
import sbt ._
4
+ import sbt .Def .Initialize
4
5
import sbt .Keys ._
5
6
import sbt .librarymanagement .{
6
7
ivy , DependencyResolution , ScalaModuleInfo , SemanticSelector , UpdateConfiguration , UnresolvedWarningConfiguration ,
@@ -172,12 +173,13 @@ object DottyPlugin extends AutoPlugin {
172
173
scalaCompilerBridgeBinaryJar := Def .settingDyn {
173
174
if (isDotty.value) Def .task {
174
175
val dottyBridgeArtifacts = fetchArtifactsOf(
176
+ scalaOrganization.value % " dotty-sbt-bridge" % scalaVersion.value,
175
177
dependencyResolution.value,
176
178
scalaModuleInfo.value,
177
179
updateConfiguration.value,
178
180
(unresolvedWarningConfiguration in update).value,
179
181
streams.value.log,
180
- scalaOrganization.value % " dotty-sbt-bridge " % scalaVersion.value ).allFiles
182
+ ).allFiles
181
183
val jars = dottyBridgeArtifacts.filter(art => art.getName.startsWith(" dotty-sbt-bridge" ) && art.getName.endsWith(" .jar" )).toArray
182
184
if (jars.size == 0 )
183
185
throw new MessageOnlyException (" No jar found for dotty-sbt-bridge" )
@@ -288,39 +290,9 @@ object DottyPlugin extends AutoPlugin {
288
290
old
289
291
},
290
292
// ... instead, we'll fetch the compiler and its dependencies ourselves.
291
- scalaInstance := Def .taskDyn {
292
- if (isDotty.value) Def .task {
293
- val updateReport =
294
- fetchArtifactsOf(
295
- dependencyResolution.value,
296
- scalaModuleInfo.value,
297
- updateConfiguration.value,
298
- (unresolvedWarningConfiguration in update).value,
299
- streams.value.log,
300
- scalaOrganization.value %% " dotty-doc" % scalaVersion.value)
301
- val scalaLibraryJar = getJar(updateReport,
302
- " org.scala-lang" , " scala-library" , revision = AllPassFilter )
303
- val dottyLibraryJar = getJar(updateReport,
304
- scalaOrganization.value, s " dotty-library_ ${scalaBinaryVersion.value}" , scalaVersion.value)
305
- val compilerJar = getJar(updateReport,
306
- scalaOrganization.value, s " dotty-compiler_ ${scalaBinaryVersion.value}" , scalaVersion.value)
307
- val allJars =
308
- getJars(updateReport, AllPassFilter , AllPassFilter , AllPassFilter )
309
-
310
- makeScalaInstance(
311
- state.value,
312
- scalaVersion.value,
313
- scalaLibraryJar,
314
- dottyLibraryJar,
315
- compilerJar,
316
- allJars
317
- )
318
- }
319
- else
320
- // This dereferences the Initialize graph, but keeps the Task unevaluated,
321
- // so its effect gets fired only when isDotty.value evaluates to false. yay monad.
322
- Def .valueStrict { scalaInstance.taskValue }
323
- }.value,
293
+ scalaInstance := scalaInstanceTask(" dotty-compiler" ).value,
294
+ // We need more stuff on the classpath to run the `doc` task.
295
+ scalaInstance in doc := scalaInstanceTask(" dotty-doc" ).value,
324
296
325
297
// Because managedScalaInstance is false, sbt won't add the standard library to our dependencies for us
326
298
libraryDependencies ++= {
@@ -355,6 +327,7 @@ object DottyPlugin extends AutoPlugin {
355
327
old
356
328
}
357
329
}.value,
330
+
358
331
scalacOptions ++= {
359
332
if (isDotty.value) {
360
333
val projectName =
@@ -369,17 +342,17 @@ object DottyPlugin extends AutoPlugin {
369
342
}
370
343
else
371
344
Seq ()
372
- }
345
+ },
373
346
))
374
347
375
348
/** Fetch artifacts for moduleID */
376
349
def fetchArtifactsOf (
350
+ moduleID : ModuleID ,
377
351
dependencyRes : DependencyResolution ,
378
352
scalaInfo : Option [ScalaModuleInfo ],
379
353
updateConfig : UpdateConfiguration ,
380
354
warningConfig : UnresolvedWarningConfiguration ,
381
- log : Logger ,
382
- moduleID : ModuleID ): UpdateReport = {
355
+ log : Logger ): UpdateReport = {
383
356
val descriptor = dependencyRes.wrapDependencyInModule(moduleID, scalaInfo)
384
357
385
358
dependencyRes.update(descriptor, updateConfig, warningConfig, log) match {
@@ -401,13 +374,53 @@ object DottyPlugin extends AutoPlugin {
401
374
}
402
375
403
376
/** Get the single jar in updateReport that match the given filter.
404
- * If zero or more than one jar match, an exception will be thrown. */
377
+ * If zero or more than one jar match, an exception will be thrown.
378
+ */
405
379
def getJar (updateReport : UpdateReport , organization : NameFilter , name : NameFilter , revision : NameFilter ): File = {
406
380
val jars = getJars(updateReport, organization, name, revision)
407
381
assert(jars.size == 1 , s " There should only be one $name jar but found: $jars" )
408
382
jars.head
409
383
}
410
384
385
+ /** If `isDotty` is true, create a scalaInstance task that uses Dotty based on
386
+ * `moduleName`, otherwise return the default scalaInstance.
387
+ */
388
+ def scalaInstanceTask (moduleName : String ): Initialize [Task [ScalaInstance ]] = Def .taskDyn {
389
+ if (isDotty.value)
390
+ dottyScalaInstanceTask(scalaOrganization.value %% moduleName % scalaVersion.value)
391
+ else
392
+ Def .valueStrict { scalaInstance.taskValue }
393
+ }
394
+
395
+ /** Create a scalaInstance task that uses Dotty based on `moduleID`. */
396
+ def dottyScalaInstanceTask (moduleID : ModuleID ): Initialize [Task [ScalaInstance ]] = Def .task {
397
+ val updateReport =
398
+ fetchArtifactsOf(
399
+ moduleID,
400
+ dependencyResolution.value,
401
+ scalaModuleInfo.value,
402
+ updateConfiguration.value,
403
+ (unresolvedWarningConfiguration in update).value,
404
+ streams.value.log)
405
+ val scalaLibraryJar = getJar(updateReport,
406
+ " org.scala-lang" , " scala-library" , revision = AllPassFilter )
407
+ val dottyLibraryJar = getJar(updateReport,
408
+ scalaOrganization.value, s " dotty-library_ ${scalaBinaryVersion.value}" , scalaVersion.value)
409
+ val compilerJar = getJar(updateReport,
410
+ scalaOrganization.value, s " dotty-compiler_ ${scalaBinaryVersion.value}" , scalaVersion.value)
411
+ val allJars =
412
+ getJars(updateReport, AllPassFilter , AllPassFilter , AllPassFilter )
413
+
414
+ makeScalaInstance(
415
+ state.value,
416
+ scalaVersion.value,
417
+ scalaLibraryJar,
418
+ dottyLibraryJar,
419
+ compilerJar,
420
+ allJars
421
+ )
422
+ }
423
+
411
424
def makeScalaInstance (
412
425
state : State , dottyVersion : String , scalaLibrary : File , dottyLibrary : File , compiler : File , all : Seq [File ]
413
426
): ScalaInstance = {
0 commit comments