Skip to content

whatDependsOn fails after successful run (String literal cannot be empty) #8094

@nsutcliffe

Description

@nsutcliffe

steps

Tested against SBT 1.10.7 and 1.10.11

  1. I ran whatDependsOn org.apache.pekko pekko-http-core_2.13 from SBT console and it tells me what depends on the mentioned library.
  2. I ran the same command again, and it fails with error shown in the problem section.
  3. I then ran mySubModule1 / whatDependsOn org.apache.pekko pekko-http-core_2.13 this will run successfully
  4. I then ran mySubModule1 / whatDependsOn org.apache.pekko pekko-http-core_2.13 this will run successfully or mySubModule2 / whatDependsOn org.apache.pekko pekko-http-core_2.13 this will error (on any submodule in the project) with the error shown in the problem.

problem

Stack trace when SBT errors

Stack trace is from version 1.10.11 of SBT

java.lang.RuntimeException: String literal cannot be empty
	at scala.sys.package$.error(package.scala:30)
	at sbt.internal.util.complete.ParserMain.stringLiteral(Parser.scala:616)
	at sbt.internal.util.complete.ParserMain.stringLiteral$(Parser.scala:614)
	at sbt.internal.util.complete.DefaultParsers$.stringLiteral(Parsers.scala:351)
	at sbt.internal.util.complete.ParserMain.literal(Parser.scala:425)
	at sbt.internal.util.complete.ParserMain.literal$(Parser.scala:425)
	at sbt.internal.util.complete.DefaultParsers$.literal(Parsers.scala:351)
	at sbt.plugins.DependencyTreeSettings$.$anonfun$artifactPatternParser$7(DependencyTreeSettings.scala:275)
	at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:286)
	at scala.collection.Iterator.foreach(Iterator.scala:943)
	at scala.collection.Iterator.foreach$(Iterator.scala:943)
	at scala.collection.AbstractIterator.foreach(Iterator.scala:1431)
	at scala.collection.IterableLike.foreach(IterableLike.scala:74)
	at scala.collection.IterableLike.foreach$(IterableLike.scala:73)
	at scala.collection.AbstractIterable.foreach(Iterable.scala:56)
	at scala.collection.TraversableLike.map(TraversableLike.scala:286)
	at scala.collection.TraversableLike.map$(TraversableLike.scala:279)
	at scala.collection.AbstractTraversable.map(Traversable.scala:108)
	at sbt.plugins.DependencyTreeSettings$.$anonfun$artifactPatternParser$6(DependencyTreeSettings.scala:274)
	at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:286)
	at scala.collection.immutable.HashMap$HashMap1.foreach(HashMap.scala:400)
	at scala.collection.immutable.HashMap$HashTrieMap.foreach(HashMap.scala:728)
	at scala.collection.immutable.HashMap$HashTrieMap.foreach(HashMap.scala:728)
	at scala.collection.immutable.HashMap$HashTrieMap.foreach(HashMap.scala:728)
	at scala.collection.TraversableLike.map(TraversableLike.scala:286)
	at scala.collection.TraversableLike.map$(TraversableLike.scala:279)
	at scala.collection.AbstractTraversable.map(Traversable.scala:108)
	at sbt.plugins.DependencyTreeSettings$.$anonfun$artifactPatternParser$2(DependencyTreeSettings.scala:271)
	at sbt.std.ParserInstance$.$anonfun$map$2(TaskMacro.scala:51)
	at sbt.InputTask.$anonfun$mapTask$1(InputTask.scala:21)
	at sbt.internal.Aggregation$.$anonfun$applyDynamicTasks$2(Aggregation.scala:171)
	at scala.collection.TraversableLike$WithFilter.$anonfun$map$2(TraversableLike.scala:935)
	at scala.collection.immutable.List.foreach(List.scala:431)
	at scala.collection.TraversableLike$WithFilter.map(TraversableLike.scala:934)
	at sbt.internal.Aggregation$.applyDynamicTasks(Aggregation.scala:170)
	at sbt.internal.Aggregation$.evaluatingParser(Aggregation.scala:212)
	at sbt.internal.Act$.evaluate$1(Act.scala:495)
	at sbt.internal.Act$.$anonfun$actParser0$11(Act.scala:505)
	at sbt.internal.util.complete.BindParser.derive(Parser.scala:758)
	at sbt.internal.util.complete.ParserMain.loop$1(Parser.scala:486)
	at sbt.internal.util.complete.ParserMain.result(Parser.scala:488)
	at sbt.internal.util.complete.ParserMain.result$(Parser.scala:474)
	at sbt.internal.util.complete.Parser$.result(Parser.scala:139)
	at sbt.internal.util.complete.ParserMain.parse(Parser.scala:437)
	at sbt.internal.util.complete.ParserMain.parse$(Parser.scala:436)
	at sbt.internal.util.complete.DefaultParsers$.parse(Parsers.scala:351)
	at sbt.Command$.process(Command.scala:193)
	at sbt.MainLoop$.$anonfun$processCommand$7(MainLoop.scala:267)
	at scala.Option.getOrElse(Option.scala:189)
	at sbt.MainLoop$.process$1(MainLoop.scala:267)
	at sbt.MainLoop$.processCommand(MainLoop.scala:312)
	at sbt.MainLoop$.$anonfun$next$5(MainLoop.scala:171)
	at sbt.State$StateOpsImpl$.runCmd$1(State.scala:290)
	at sbt.State$StateOpsImpl$.process$extension(State.scala:326)
	at sbt.MainLoop$.$anonfun$next$4(MainLoop.scala:171)
	at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:24)
	at sbt.MainLoop$.next(MainLoop.scala:171)
	at sbt.MainLoop$.run(MainLoop.scala:152)
	at sbt.MainLoop$.$anonfun$runWithNewLog$1(MainLoop.scala:127)
	at sbt.io.Using.apply(Using.scala:41)
	at sbt.MainLoop$.runWithNewLog(MainLoop.scala:120)
	at sbt.MainLoop$.runAndClearLast(MainLoop.scala:74)
	at sbt.MainLoop$.runLoggedLoop(MainLoop.scala:59)
	at sbt.MainLoop$.runLogged(MainLoop.scala:50)
	at sbt.StandardMain$.runManaged(Main.scala:225)
	at sbt.xMain$.$anonfun$run$11(Main.scala:136)
	at scala.util.DynamicVariable.withValue(DynamicVariable.scala:62)
	at scala.Console$.withIn(Console.scala:230)
	at sbt.internal.util.Terminal$.withIn(Terminal.scala:620)
	at sbt.internal.util.Terminal$.$anonfun$withStreams$1(Terminal.scala:400)
	at scala.util.DynamicVariable.withValue(DynamicVariable.scala:62)
	at scala.Console$.withOut(Console.scala:167)
	at sbt.internal.util.Terminal$.$anonfun$withOut$2(Terminal.scala:610)
	at scala.util.DynamicVariable.withValue(DynamicVariable.scala:62)
	at scala.Console$.withErr(Console.scala:196)
	at sbt.internal.util.Terminal$.withOut(Terminal.scala:610)
	at sbt.internal.util.Terminal$.withStreams(Terminal.scala:400)
	at sbt.xMain$.withStreams$1(Main.scala:89)
	at sbt.xMain$.run(Main.scala:124)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at sbt.internal.XMainConfiguration.run(XMainConfiguration.java:59)
	at sbt.xMain.run(Main.scala:48)
	at xsbt.boot.Launch$.$anonfun$run$1(Launch.scala:149)
	at xsbt.boot.Launch$.withContextLoader(Launch.scala:176)
	at xsbt.boot.Launch$.run(Launch.scala:149)
	at xsbt.boot.Launch$.$anonfun$apply$1(Launch.scala:44)
	at xsbt.boot.Launch$.launch(Launch.scala:159)
	at xsbt.boot.Launch$.apply(Launch.scala:44)
	at xsbt.boot.Launch$.apply(Launch.scala:21)
	at xsbt.boot.Boot$.runImpl(Boot.scala:78)
	at xsbt.boot.Boot$.run(Boot.scala:73)
	at xsbt.boot.Boot$.main(Boot.scala:21)
	at xsbt.boot.Boot.main(Boot.scala)

expectation

Repeatedly running the same command should yield the same results (and not produce a stack trace error when the command is valid)

notes

  • After the successful "first" run, whatDependsOn org.apache.pekko pekko-http-core_2.13 1.0.1 will error (i.e. version is specified)
  • This error persists through SBT sessions (so after the first run of whatDependsOn, it'll always error even after restarting SBT
  • This happens both in console mode and submitting a command to sbt
  • Deleting my ~/.sbt folder does not resolve the issue

The following will resolve the immediate problem so I can run the command again (as described in the steps to reproduce:

EITHER

  1. From SBT Console, clean the project (clean).
    • If you run whatDependsOn before restarting, it will error.
  2. Restart SBT Console (must do the restart)
  3. Run whatDependsOn command

OR

  1. Restart SBT Console
    • If you run whatDependsOn before cleaning, it will error.
  2. Clean the project (clean)
  3. Run whatDependsOn command

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions