Skip to content

Commit bce1ca2

Browse files
committed
Return build exception to propagate error using EitherCps
1 parent b5b415a commit bce1ca2

File tree

8 files changed

+47
-27
lines changed

8 files changed

+47
-27
lines changed

modules/build/src/main/scala/scala/build/Inputs.scala

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import java.security.MessageDigest
77

88
import scala.annotation.tailrec
99
import scala.build.Inputs.WorkspaceOrigin
10+
import scala.build.errors.{BuildException, InputsException}
1011
import scala.build.internal.Constants
1112
import scala.build.internal.zip.WrappedZipInputStream
1213
import scala.build.options.Scope
@@ -414,7 +415,7 @@ object Inputs {
414415
javaSnippetOpt: Option[String],
415416
acceptFds: Boolean,
416417
forcedWorkspace: Option[os.Path]
417-
): Either[String, Inputs] = {
418+
): Either[BuildException, Inputs] = {
418419
val validatedArgs: Seq[Either[String, Seq[Element]]] =
419420
validateArgs(args, cwd, download, stdinOpt, acceptFds)
420421
val validatedExpressions: Seq[Either[String, Seq[Element]]] =
@@ -432,7 +433,7 @@ object Inputs {
432433
Right(forValidatedElems(validElems, baseProjectName, directories, forcedWorkspace))
433434
}
434435
else
435-
Left(invalid.mkString(System.lineSeparator()))
436+
Left(new InputsException(invalid.mkString(System.lineSeparator())))
436437
}
437438

438439
def apply(
@@ -448,13 +449,13 @@ object Inputs {
448449
javaSnippetOpt: Option[String] = None,
449450
acceptFds: Boolean = false,
450451
forcedWorkspace: Option[os.Path] = None
451-
): Either[String, Inputs] =
452+
): Either[BuildException, Inputs] =
452453
if (
453454
args.isEmpty && scriptSnippetOpt.isEmpty && scalaSnippetOpt.isEmpty && javaSnippetOpt.isEmpty
454455
)
455-
defaultInputs().toRight(
456+
defaultInputs().toRight(new InputsException(
456457
"No inputs provided (expected files with .scala or .sc extensions, and / or directories)."
457-
)
458+
))
458459
else
459460
forNonEmptyArgs(
460461
args,

modules/build/src/main/scala/scala/build/bsp/Bsp.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package scala.build.bsp
33
import java.io.{InputStream, OutputStream}
44

55
import scala.build.Inputs
6+
import scala.build.errors.BuildException
67
import scala.concurrent.Future
78

89
trait Bsp {
@@ -12,7 +13,7 @@ trait Bsp {
1213

1314
object Bsp {
1415
def create(
15-
argsToInputs: Seq[String] => Either[String, Inputs],
16+
argsToInputs: Seq[String] => Either[BuildException, Inputs],
1617
bspReloadableOptionsReference: BspReloadableOptions.Reference,
1718
threads: BspThreads,
1819
in: InputStream,

modules/build/src/main/scala/scala/build/bsp/BspImpl.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import scala.build.EitherCps.{either, value}
1313
import scala.build._
1414
import scala.build.bloop.{BloopServer, ScalaDebugServer}
1515
import scala.build.compiler.BloopCompiler
16-
import scala.build.errors.{BuildException, Diagnostic}
16+
import scala.build.errors.{BuildException, Diagnostic, ParsingInputsException}
1717
import scala.build.internal.{Constants, CustomCodeWrapper}
1818
import scala.build.options.{BuildOptions, Scope}
1919
import scala.collection.mutable.ListBuffer
@@ -23,7 +23,7 @@ import scala.jdk.CollectionConverters._
2323
import scala.util.{Failure, Success}
2424

2525
final class BspImpl(
26-
argsToInputs: Seq[String] => Either[String, Inputs],
26+
argsToInputs: Seq[String] => Either[BuildException, Inputs],
2727
bspReloadableOptionsReference: BspReloadableOptions.Reference,
2828
threads: BspThreads,
2929
in: InputStream,
@@ -459,13 +459,13 @@ final class BspImpl(
459459
val ideInputsJsonPath =
460460
currentBloopSession.inputs.workspace / Constants.workspaceDirName / "ide-inputs.json"
461461
if (os.isFile(ideInputsJsonPath)) {
462-
val maybeResponse = either[String] {
462+
val maybeResponse = either[BuildException] {
463463
val ideInputs = value {
464464
try Right(readFromArray(os.read.bytes(ideInputsJsonPath))(IdeInputs.codec))
465465
catch {
466466
case e: JsonReaderException =>
467467
logger.debug(s"Caught $e while decoding $ideInputsJsonPath")
468-
Left(e.getMessage)
468+
Left(new ParsingInputsException(e.getMessage, e))
469469
}
470470
}
471471
val newInputs = value(argsToInputs(ideInputs.args))

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ final case class TestInputs(
4444
forcedWorkspace = forcedWorkspaceOpt.map(_.resolveFrom(tmpDir))
4545
)
4646
res match {
47-
case Left(err) => sys.error(err)
47+
case Left(err) => throw new Exception(err)
4848
case Right(inputs) => f(tmpDir, inputs)
4949
}
5050
}

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

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ package scala.cli.commands
33
import caseapp._
44
import com.github.plokhotnyuk.jsoniter_scala.core._
55

6+
import scala.build.EitherCps.{either, value}
67
import scala.build.bsp.{BspReloadableOptions, BspThreads}
8+
import scala.build.errors.BuildException
79
import scala.build.options.BuildOptions
810
import scala.build.{Build, Inputs}
911
import scala.cli.CurrentParams
@@ -25,16 +27,17 @@ object Bsp extends ScalaCommand[BspOptions] {
2527
readFromArray(content)(SharedOptions.jsonCodec)
2628
}.getOrElse(options.shared)
2729

28-
val argsToInputs: Seq[String] => Either[String, Inputs] =
29-
argsSeq => {
30-
val sharedOptions = getSharedOptions()
31-
sharedOptions.inputs(argsSeq, () => Inputs.default())
32-
.map { i =>
33-
if (sharedOptions.logging.verbosity >= 3)
34-
pprint.err.log(i)
35-
Build.updateInputs(i, buildOptions(sharedOptions))
36-
}
37-
}
30+
val argsToInputs: Seq[String] => Either[BuildException, Inputs] =
31+
argsSeq =>
32+
either {
33+
val sharedOptions = getSharedOptions()
34+
val initialInputs = value(sharedOptions.inputs(argsSeq, () => Inputs.default()))
35+
36+
if (sharedOptions.logging.verbosity >= 3)
37+
pprint.err.log(initialInputs)
38+
39+
Build.updateInputs(initialInputs, buildOptions(sharedOptions))
40+
}
3841

3942
val bspReloadableOptionsReference = BspReloadableOptions.Reference { () =>
4043
val sharedOptions = getSharedOptions()
@@ -46,7 +49,8 @@ object Bsp extends ScalaCommand[BspOptions] {
4649
)
4750
}
4851

49-
val inputs = getSharedOptions().inputsOrExit(argsToInputs(args.all))
52+
val logger = getSharedOptions().logging.logger
53+
val inputs = argsToInputs(args.all).orExit(logger)
5054
CurrentParams.workspaceOpt = Some(inputs.workspace)
5155
BspThreads.withThreads { threads =>
5256
val bsp = scala.build.bsp.Bsp.create(

modules/cli/src/main/scala/scala/cli/commands/util/SharedOptionsUtil.scala

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ import java.io.{File, InputStream}
1111
import scala.build._
1212
import scala.build.blooprifle.BloopRifleConfig
1313
import scala.build.compiler.{BloopCompilerMaker, ScalaCompilerMaker, SimpleScalaCompilerMaker}
14+
import scala.build.errors.BuildException
1415
import scala.build.internal.CsLoggerUtil._
15-
import scala.build.internal.{Constants, FetchExternalBinary, OsLibc}
16+
import scala.build.internal.{Constants, FetchExternalBinary, OsLibc, Util}
1617
import scala.build.options.{Platform, ScalacOpt, ShadowingSeq}
1718
import scala.build.{options => bo}
1819
import scala.cli.commands.ScalaJsOptions
@@ -229,9 +230,9 @@ object SharedOptionsUtil {
229230
): Inputs =
230231
inputsOrExit(inputs(args, defaultInputs))
231232

232-
def inputsOrExit(maybeInputs: Either[String, Inputs]): Inputs = maybeInputs match {
233-
case Left(message) =>
234-
System.err.println(message)
233+
def inputsOrExit(maybeInputs: Either[BuildException, Inputs]): Inputs = maybeInputs match {
234+
case Left(exception) =>
235+
Util.printException(exception)
235236
sys.exit(1)
236237
case Right(i) => i
237238
}
@@ -252,7 +253,7 @@ object SharedOptionsUtil {
252253
def inputs(
253254
args: Seq[String],
254255
defaultInputs: () => Option[Inputs]
255-
): Either[String, Inputs] = {
256+
): Either[BuildException, Inputs] = {
256257
val resourceInputs = resourceDirs
257258
.map(os.Path(_, Os.pwd))
258259
.map { path =>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package scala.build.errors
2+
3+
class InputsException(message: String)
4+
extends BuildException(
5+
message = message
6+
)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package scala.build.errors
2+
3+
class ParsingInputsException(exceptionMessage: String, cause: Throwable)
4+
extends BuildException(
5+
message = exceptionMessage,
6+
cause = cause
7+
)

0 commit comments

Comments
 (0)