Skip to content

Commit 9177edf

Browse files
authored
Make dependencies keep their positions when fetching (#2266)
Add ResolutionError handling
1 parent 52f5623 commit 9177edf

File tree

11 files changed

+124
-45
lines changed

11 files changed

+124
-45
lines changed

modules/build/src/main/scala/scala/build/Bloop.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ object Bloop {
7171
either {
7272
val res = value {
7373
Artifacts.artifacts(
74-
Positioned.none(Seq(dep)),
74+
Seq(Positioned.none(dep)),
7575
Nil,
7676
Some(params),
7777
logger,

modules/build/src/main/scala/scala/build/ReplArtifacts.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,14 @@ object ReplArtifacts {
5353
addScalapy.map(ver => dep"${Artifacts.scalaPyOrganization(ver)}::scalapy-core::$ver").toSeq
5454
val allDeps = dependencies ++ Seq(dep"com.lihaoyi:::ammonite:$ammoniteVersion") ++ scalapyDeps
5555
val replArtifacts = Artifacts.artifacts(
56-
Positioned.none(allDeps),
56+
allDeps.map(Positioned.none),
5757
extraRepositories,
5858
Some(scalaParams),
5959
logger,
6060
cache.withMessage(s"Downloading Ammonite $ammoniteVersion")
6161
)
6262
val replSourceArtifacts = Artifacts.artifacts(
63-
Positioned.none(allDeps),
63+
allDeps.map(Positioned.none),
6464
extraRepositories,
6565
Some(scalaParams),
6666
logger,
@@ -95,7 +95,7 @@ object ReplArtifacts {
9595
val allDeps = dependencies ++ Seq(replDep) ++ scalapyDeps
9696
val replArtifacts =
9797
Artifacts.artifacts(
98-
Positioned.none(allDeps),
98+
allDeps.map(Positioned.none),
9999
repositories,
100100
Some(scalaParams),
101101
logger,

modules/build/src/test/scala/scala/build/tests/DirectiveTests.scala

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@ import scala.build.tests.util.BloopServer
99
import build.Ops.EitherThrowOps
1010
import dependency.AnyDependency
1111

12-
import scala.build.errors.{DependencyFormatError, ToolkitDirectiveMissingVersionError}
12+
import scala.build.errors.{
13+
CompositeBuildException,
14+
DependencyFormatError,
15+
FetchingDependenciesError,
16+
ToolkitDirectiveMissingVersionError
17+
}
1318

1419
class DirectiveTests extends munit.FunSuite {
1520

@@ -421,4 +426,50 @@ class DirectiveTests extends munit.FunSuite {
421426
}
422427
}
423428
}
429+
430+
test("separate dependency resolution errors for each dependency") {
431+
val testInputs = TestInputs(
432+
os.rel / "simple.sc" ->
433+
"""//> using dep org.xyz::foo:0.0.1
434+
|//> using dep com.lihaoyi::os-lib:0.9.1 org.qwerty::bar:0.0.1
435+
|""".stripMargin
436+
)
437+
testInputs.withBuild(baseOptions, buildThreads, bloopConfigOpt) {
438+
(root, _, maybeBuild) =>
439+
expect(maybeBuild.isLeft)
440+
val errors = maybeBuild.left.toOption.get
441+
442+
errors match {
443+
case error: CompositeBuildException =>
444+
expect(error.exceptions.length == 2)
445+
expect(error.exceptions.forall(_.isInstanceOf[FetchingDependenciesError]))
446+
expect(error.exceptions.forall(_.positions.length == 1))
447+
448+
{
449+
val xyzError = error.exceptions.find(_.message.contains("org.xyz")).get
450+
expect(xyzError.message.startsWith("Error downloading org.xyz:foo"))
451+
expect(!xyzError.message.contains("com.lihaoyi"))
452+
expect(!xyzError.message.contains("org.qwerty"))
453+
expect(xyzError.positions.head == Position.File(
454+
Right(root / "simple.sc"),
455+
(0, 14),
456+
(0, 32)
457+
))
458+
}
459+
460+
{
461+
val qwertyError = error.exceptions.find(_.message.contains("org.qwerty")).get
462+
expect(qwertyError.message.contains("Error downloading org.qwerty:bar"))
463+
expect(!qwertyError.message.contains("com.lihaoyi"))
464+
expect(!qwertyError.message.contains("org.xyz"))
465+
expect(qwertyError.positions.head == Position.File(
466+
Right(root / "simple.sc"),
467+
(1, 40),
468+
(1, 61)
469+
))
470+
}
471+
case _ => fail("unexpected BuildException type")
472+
}
473+
}
474+
}
424475
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ abstract class ScalaCommand[T <: HasGlobalOptions](implicit myParser: Parser[T],
217217
if (shared.helpGroups.helpScaladoc) {
218218
val docArtifacts = value {
219219
Artifacts.fetch(
220-
Positioned.none(Seq(dep"org.scala-lang::scaladoc:${scalaParams.scalaVersion}")),
220+
Seq(Positioned.none(dep"org.scala-lang::scaladoc:${scalaParams.scalaVersion}")),
221221
value(buildOptions.finalRepositories),
222222
Some(scalaParams),
223223
logger,
@@ -246,7 +246,7 @@ abstract class ScalaCommand[T <: HasGlobalOptions](implicit myParser: Parser[T],
246246
else {
247247
val fmtArtifacts = value {
248248
Artifacts.fetch(
249-
Positioned.none(Seq(
249+
Seq(Positioned.none(
250250
dep"${Constants.scalafmtOrganization}:${Constants.scalafmtName}:${Constants.defaultScalafmtVersion}"
251251
)),
252252
value(buildOptions.finalRepositories),

modules/cli/src/main/scala/scala/cli/commands/doc/Doc.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ object Doc extends ScalaCommand[DocOptions] {
142142
case Some(scalaParams) =>
143143
val res = value {
144144
Artifacts.fetch(
145-
Positioned.none(Seq(dep"org.scala-lang::scaladoc:${scalaParams.scalaVersion}")),
145+
Seq(Positioned.none(dep"org.scala-lang::scaladoc:${scalaParams.scalaVersion}")),
146146
value(build.options.finalRepositories),
147147
Some(scalaParams),
148148
logger,

modules/cli/src/main/scala/scala/cli/commands/new/New.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ object New extends ScalaCommand[NewOptions] {
2020
override def runCommand(options: NewOptions, remainingArgs: RemainingArgs, logger: Logger): Unit =
2121
val scalaParameters = ScalaParameters(Constants.defaultScala213Version)
2222
val fetchedGiter8 = Artifacts.fetch(
23-
Positioned.none(giter8Dependency),
23+
giter8Dependency.map(Positioned.none),
2424
Seq.empty,
2525
Some(scalaParameters),
2626
logger,

modules/cli/src/main/scala/scala/cli/commands/package0/Package.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -757,7 +757,7 @@ object Package extends ScalaCommand[PackageOptions] with BuildCommandHelpers {
757757
if (build.options.notForBloopOptions.doSetupPython.getOrElse(false)) {
758758
val res = value {
759759
Artifacts.fetch(
760-
Positioned.none(Seq(
760+
Seq(Positioned.none(
761761
dep"${Constants.pythonInterfaceOrg}:${Constants.pythonInterfaceName}:${Constants.pythonInterfaceVersion}"
762762
)),
763763
Nil,

modules/cli/src/main/scala/scala/cli/commands/pgp/PgpExternalCommand.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ object PgpExternalCommand {
194194

195195
val signingClassPath = value {
196196
scala.build.Artifacts.fetch0(
197-
Positioned.none(Seq(jvmSigningDep.toCs)),
197+
Seq(Positioned.none(jvmSigningDep.toCs)),
198198
extraRepos,
199199
None,
200200
Nil,

modules/cli/src/main/scala/scala/cli/internal/ScalaJsLinker.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ object ScalaJsLinker {
5454
case Right(()) =>
5555
val linkerClassPath = value {
5656
scala.build.Artifacts.fetch0(
57-
Positioned.none(Seq(scalaJsCliDep.toCs)),
57+
Seq(Positioned.none(scalaJsCliDep.toCs)),
5858
extraRepos,
5959
None,
6060
forcedVersions.map { case (m, v) => (m.toCs, v) },

modules/cli/src/main/scala/scala/cli/launcher/LauncherCli.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ object LauncherCli {
3232

3333
val fetchedScalaCli =
3434
Artifacts.fetch(
35-
Positioned.none(scalaCliDependency),
35+
scalaCliDependency.map(Positioned.none),
3636
snapshotsRepo,
3737
Some(scalaParameters),
3838
logger,

0 commit comments

Comments
 (0)