Skip to content

Commit 5cd81f5

Browse files
Setup-ide should run before compile, run and test (#188)
* Setup-ide should run before compile, run and test Co-authored-by: Alexandre Archambault <[email protected]> Co-authored-by: Alexandre Archambault <[email protected]> * Rewrite imports * Absolute paths, ide-options.json and runSafe * Apply suggestions from code review Co-authored-by: Alexandre Archambault <[email protected]> * Try making scala-cli in bsp absolute, bring back test * Greedy algorithm for dropping urls * Update modules/integration/src/test/scala/scala/cli/integration/BspTestDefinitions.scala Co-authored-by: Alexandre Archambault <[email protected]> * Make paths absolute if they exist * Add coursier.mainJar and fallback to current class location * NIT * fixup * Don't run setup-ide for virtual inputs And don't re-parse the input arguments, just use what's in the Inputs instance. * Update tests * fixup * fixup * fixup Co-authored-by: Alexandre Archambault <[email protected]> Co-authored-by: Alexandre Archambault <[email protected]>
1 parent 60eae70 commit 5cd81f5

22 files changed

+284
-83
lines changed

build.sc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,8 @@ trait Cli extends SbtModule with CliLaunchers with ScalaCliPublishModule with Fo
285285
Deps.jniUtils,
286286
Deps.scalaJsLinker,
287287
Deps.scalaPackager,
288-
Deps.svmSubs
288+
Deps.svmSubs,
289+
Deps.upickle
289290
)
290291
def compileIvyDeps = super.compileIvyDeps() ++ Agg(
291292
Deps.svm

modules/cli/src/main/scala/scala/cli/commands/Bsp.scala

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package scala.cli.commands
22

33
import caseapp._
4+
import upickle.default._
45

56
import scala.build.Build
67
import scala.build.bsp.BspThreads
8+
import scala.build.options.BuildOptions
79
import scala.concurrent.Await
810
import scala.concurrent.duration.Duration
911

@@ -13,21 +15,27 @@ object Bsp extends ScalaCommand[BspOptions] {
1315
if (options.shared.logging.verbosity >= 3)
1416
pprint.stderr.log(args)
1517

16-
val buildOptions = options.buildOptions
17-
val bloopRifleConfig = options.shared.bloopRifleConfig()
18-
val logger = options.shared.logging.logger
18+
val sharedOptions: SharedOptions =
19+
options.jsonOptions.map { optionsPath =>
20+
val source = os.read(os.Path(optionsPath, os.pwd))
21+
read[SharedOptions](source)
22+
}.getOrElse(options.shared)
23+
24+
val buildOptionsToUse = buildOptions(sharedOptions)
25+
val bloopRifleConfig = sharedOptions.bloopRifleConfig()
26+
val logger = sharedOptions.logging.logger
1927

2028
val inputs = {
2129
val initialInputs = options.shared.inputsOrExit(args)
2230
if (options.shared.logging.verbosity >= 3)
2331
pprint.stderr.log(initialInputs)
24-
Build.updateInputs(initialInputs, buildOptions)
32+
Build.updateInputs(initialInputs, buildOptionsToUse)
2533
}
2634

2735
BspThreads.withThreads { threads =>
2836
val bsp = scala.build.bsp.Bsp.create(
2937
inputs,
30-
buildOptions,
38+
buildOptionsToUse,
3139
logger,
3240
bloopRifleConfig,
3341
options.shared.logging.verbosity,
@@ -43,4 +51,20 @@ object Bsp extends ScalaCommand[BspOptions] {
4351
finally bsp.shutdown()
4452
}
4553
}
54+
55+
private def buildOptions(sharedOptions: SharedOptions): BuildOptions = {
56+
val baseOptions = sharedOptions.buildOptions(enableJmh = false, jmhVersion = None)
57+
baseOptions.copy(
58+
classPathOptions = baseOptions.classPathOptions.copy(
59+
fetchSources = baseOptions.classPathOptions.fetchSources.orElse(Some(true))
60+
),
61+
scalaOptions = baseOptions.scalaOptions.copy(
62+
generateSemanticDbs = baseOptions.scalaOptions.generateSemanticDbs.orElse(Some(true))
63+
),
64+
internalDependencies = baseOptions.internalDependencies.copy(
65+
addRunnerDependencyOpt =
66+
baseOptions.internalDependencies.addRunnerDependencyOpt.orElse(Some(false))
67+
)
68+
)
69+
}
4670
}

modules/cli/src/main/scala/scala/cli/commands/BspOptions.scala

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,18 @@ package scala.cli.commands
22

33
import caseapp._
44

5-
import scala.build.options.BuildOptions
6-
75
// format: off
86
final case class BspOptions(
97
// FIXME There might be too many options in SharedOptions for the bsp command…
108
@Recurse
11-
shared: SharedOptions = SharedOptions()
9+
shared: SharedOptions = SharedOptions(),
10+
11+
@HelpMessage("Command-line options JSON file")
12+
@ValueDescription("path")
13+
@Hidden
14+
jsonOptions: Option[String] = None
1215
) {
1316
// format: on
14-
15-
def buildOptions: BuildOptions = {
16-
val baseOptions = shared.buildOptions(enableJmh = false, jmhVersion = None)
17-
baseOptions.copy(
18-
classPathOptions = baseOptions.classPathOptions.copy(
19-
fetchSources = baseOptions.classPathOptions.fetchSources.orElse(Some(true))
20-
),
21-
scalaOptions = baseOptions.scalaOptions.copy(
22-
generateSemanticDbs = baseOptions.scalaOptions.generateSemanticDbs.orElse(Some(true))
23-
),
24-
internalDependencies = baseOptions.internalDependencies.copy(
25-
addRunnerDependencyOpt =
26-
baseOptions.internalDependencies.addRunnerDependencyOpt.orElse(Some(false))
27-
)
28-
)
29-
}
3017
}
3118

3219
object BspOptions {

modules/cli/src/main/scala/scala/cli/commands/Compile.scala

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,14 @@ object Compile extends ScalaCommand[CompileOptions] {
1010
override def group = "Main"
1111
override def sharedOptions(options: CompileOptions) = Some(options.shared)
1212
def run(options: CompileOptions, args: RemainingArgs): Unit = {
13-
1413
val inputs = options.shared.inputsOrExit(args)
14+
val logger = options.shared.logger
15+
SetupIde.runSafe(
16+
options.shared,
17+
inputs,
18+
logger,
19+
Some(name)
20+
)
1521

1622
val cross = options.cross.cross.getOrElse(false)
1723
if (options.classPath && cross) {
@@ -48,8 +54,6 @@ object Compile extends ScalaCommand[CompileOptions] {
4854
val buildOptions = options.buildOptions
4955
val bloopRifleConfig = options.shared.bloopRifleConfig()
5056

51-
val logger = options.shared.logger
52-
5357
if (options.watch.watch) {
5458
val watcher = Build.watch(
5559
inputs,

modules/cli/src/main/scala/scala/cli/commands/CoursierOptions.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package scala.cli.commands
22

33
import caseapp._
44
import coursier.cache.{CacheLogger, FileCache}
5+
import upickle.default.{ReadWriter, macroRW}
56

67
import scala.concurrent.duration.Duration
78

@@ -26,4 +27,5 @@ object CoursierOptions {
2627
lazy val parser: Parser[CoursierOptions] = Parser.derive
2728
implicit lazy val parserAux: Parser.Aux[CoursierOptions, parser.D] = parser
2829
implicit lazy val help: Help[CoursierOptions] = Help.derive
30+
implicit lazy val jsonCodec: ReadWriter[CoursierOptions] = macroRW
2931
}

modules/cli/src/main/scala/scala/cli/commands/LoggingOptions.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package scala.cli.commands
22

33
import caseapp._
4+
import upickle.default.{ReadWriter => RW, _}
45

56
import scala.build.Logger
67
import scala.cli.internal.CliLogger
@@ -32,4 +33,9 @@ object LoggingOptions {
3233
lazy val parser: Parser[LoggingOptions] = Parser.derive
3334
implicit lazy val parserAux: Parser.Aux[LoggingOptions, parser.D] = parser
3435
implicit lazy val help: Help[LoggingOptions] = Help.derive
36+
implicit val rwCounter: RW[Int @@ Counter] = readwriter[ujson.Value].bimap[Int @@ Counter](
37+
x => ujson.Num(Tag.unwrap(x)),
38+
json => Tag.of(json.num.toInt)
39+
)
40+
implicit val rw: RW[LoggingOptions] = macroRW
3541
}

modules/cli/src/main/scala/scala/cli/commands/Run.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ object Run extends ScalaCommand[RunOptions] {
2020
run(options, args, () => Inputs.default())
2121

2222
def run(options: RunOptions, args: RemainingArgs, defaultInputs: () => Option[Inputs]): Unit = {
23-
2423
val inputs = options.shared.inputsOrExit(args, defaultInputs = defaultInputs)
2524

2625
val initialBuildOptions = options.buildOptions
@@ -40,6 +39,12 @@ object Run extends ScalaCommand[RunOptions] {
4039
)
4140

4241
val cross = options.compileCross.cross.getOrElse(false)
42+
SetupIde.runSafe(
43+
options.shared,
44+
inputs,
45+
logger,
46+
Some(name)
47+
)
4348

4449
if (options.watch.watch) {
4550
val watcher = Build.watch(

modules/cli/src/main/scala/scala/cli/commands/ScalaJsOptions.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package scala.cli.commands
22

33
import caseapp._
4+
import upickle.default.{ReadWriter, macroRW}
45

56
import scala.build.options
67

@@ -43,4 +44,5 @@ object ScalaJsOptions {
4344
lazy val parser: Parser[ScalaJsOptions] = Parser.derive
4445
implicit lazy val parserAux: Parser.Aux[ScalaJsOptions, parser.D] = parser
4546
implicit lazy val help: Help[ScalaJsOptions] = Help.derive
47+
implicit lazy val jsonCodec: ReadWriter[ScalaJsOptions] = macroRW
4648
}

modules/cli/src/main/scala/scala/cli/commands/ScalaNativeOptions.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package scala.cli.commands
22

33
import caseapp._
4+
import upickle.default.{ReadWriter, macroRW}
45

56
import scala.build.options
67

@@ -55,4 +56,5 @@ object ScalaNativeOptions {
5556
lazy val parser: Parser[ScalaNativeOptions] = Parser.derive
5657
implicit lazy val parserAux: Parser.Aux[ScalaNativeOptions, parser.D] = parser
5758
implicit lazy val help: Help[ScalaNativeOptions] = Help.derive
59+
implicit lazy val jsonCodec: ReadWriter[ScalaNativeOptions] = macroRW
5860
}

modules/cli/src/main/scala/scala/cli/commands/ScalacOptions.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import caseapp._
44
import caseapp.core.Arg
55
import caseapp.core.parser.{Argument, NilParser, StandardArgument}
66
import caseapp.core.util.Formatter
7+
import upickle.default.{ReadWriter, macroRW}
78

89
// format: off
910
final case class ScalacOptions(
@@ -53,5 +54,6 @@ object ScalacOptions {
5354
NilParser
5455
baseParser.to[ScalacOptions]
5556
}
56-
implicit lazy val help: Help[SharedOptions] = Help.derive
57+
implicit lazy val help: Help[SharedOptions] = Help.derive
58+
implicit lazy val jsonCodec: ReadWriter[ScalacOptions] = macroRW
5759
}

0 commit comments

Comments
 (0)