Skip to content

Commit ed6935f

Browse files
authored
Fix - suggest actionable update for toolkit dep (#1785)
1 parent b66141b commit ed6935f

File tree

9 files changed

+77
-32
lines changed

9 files changed

+77
-32
lines changed

modules/build/src/main/scala/scala/build/preprocessing/ScalaPreprocessor.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ case object ScalaPreprocessor extends Preprocessor {
334334
val deps = value {
335335
dependencyTrees
336336
.map { t => /// skip ivy ($ivy.`) or dep syntax ($dep.`)
337-
val pos = toFilePos(Position.Raw(t.start + "$ivy.`".length, t.end))
337+
val pos = toFilePos(Position.Raw(t.start + "$ivy.`".length, t.end - 1))
338338
val strDep = t.prefix.drop(1).mkString(".")
339339
val maybeDep = parseDependency(strDep, pos)
340340
maybeDep.map(dep => Positioned(Seq(pos), dep))

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class ActionableDiagnosticTests extends munit.FunSuite {
4343
expect(osLibDiagnosticOpt.nonEmpty)
4444
val osLibDiagnostic = osLibDiagnosticOpt.get
4545

46-
expect(Version(osLibDiagnostic.newVersion) > Version(osLibDiagnostic.oldDependency.version))
46+
expect(Version(osLibDiagnostic.newVersion) > Version(osLibDiagnostic.currentVersion))
4747
}
4848
}
4949

@@ -71,8 +71,7 @@ class ActionableDiagnosticTests extends munit.FunSuite {
7171
expect(osLibDiagnosticOpt.nonEmpty)
7272
val osLibDiagnostic = osLibDiagnosticOpt.get
7373

74-
expect(osLibDiagnostic.oldDependency.render == dependencyOsLib)
75-
expect(Version(osLibDiagnostic.newVersion) > Version(osLibDiagnostic.oldDependency.version))
74+
expect(Version(osLibDiagnostic.newVersion) > Version(osLibDiagnostic.currentVersion))
7675
}
7776
}
7877

@@ -100,8 +99,7 @@ class ActionableDiagnosticTests extends munit.FunSuite {
10099
expect(osLibDiagnosticOpt.nonEmpty)
101100
val osLibDiagnostic = osLibDiagnosticOpt.get
102101

103-
expect(osLibDiagnostic.oldDependency.render == dependencyOsLib)
104-
expect(Version(osLibDiagnostic.newVersion) > Version(osLibDiagnostic.oldDependency.version))
102+
expect(Version(osLibDiagnostic.newVersion) > Version(osLibDiagnostic.currentVersion))
105103
}
106104
}
107105

modules/cli/src/main/scala/scala/cli/commands/dependencyupdate/DependencyUpdate.scala

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ object DependencyUpdate extends ScalaCommand[DependencyUpdateOptions] {
6262
else {
6363
println("Updates")
6464
actionableUpdateDiagnostics.foreach(update =>
65-
println(s" * ${update.oldDependency.render} -> ${update.newVersion}")
65+
println(
66+
s" * ${update.dependencyModuleName} ${update.currentVersion} -> ${update.newVersion}"
67+
)
6668
)
6769
println(s"""|To update all dependencies run:
6870
| $baseRunnerName dependency-update --all""".stripMargin)
@@ -88,7 +90,9 @@ object DependencyUpdate extends ScalaCommand[DependencyUpdateOptions] {
8890
val appliedDiagnostics = updateDependencies(file, sortedByLine)
8991
os.write.over(file, appliedDiagnostics)
9092
diagnostics.foreach(diagnostic =>
91-
logger.message(s"Updated dependency to: ${diagnostic._2.suggestion}")
93+
logger.message(
94+
s"Updated dependency ${diagnostic._2.dependencyModuleName}: ${diagnostic._2.currentVersion} -> ${diagnostic._2.newVersion}"
95+
)
9296
)
9397
case (Left(file), diagnostics) =>
9498
diagnostics.foreach {
@@ -109,9 +113,10 @@ object DependencyUpdate extends ScalaCommand[DependencyUpdateOptions] {
109113

110114
diagnostics.foldLeft(fileContent) {
111115
case (fileContent, (file, diagnostic)) =>
112-
val (line, column) = (file.startPos._1, file.startPos._2)
113-
val startIndex = startIndicies(line) + column
114-
val endIndex = startIndex + diagnostic.oldDependency.render.length()
116+
val (line, column) = (file.startPos._1, file.startPos._2)
117+
val (lineEnd, columnEnd) = (file.endPos._1, file.endPos._2)
118+
val startIndex = startIndicies(line) + column
119+
val endIndex = startIndicies(lineEnd) + columnEnd
115120

116121
val newDependency = diagnostic.suggestion
117122
s"${fileContent.slice(0, startIndex)}$newDependency${fileContent.drop(endIndex)}"

modules/directives/src/main/scala/scala/build/preprocessing/directives/Toolkit.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ final case class Toolkit(
4141
object Toolkit {
4242
def resolveDependency(toolkitVersion: Positioned[String]) = toolkitVersion.map(version =>
4343
val v = if version == "latest" then "latest.release" else version
44-
dep"${Constants.toolkitOrganization}::${Constants.toolkitName}:$v"
44+
dep"${Constants.toolkitOrganization}::${Constants.toolkitName}:$v,toolkit"
4545
)
4646
val handler: DirectiveHandler[Toolkit] = DirectiveHandler.derive
4747
}

modules/integration/src/test/scala/scala/cli/integration/BspTestDefinitions.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1283,7 +1283,7 @@ abstract class BspTestDefinitions(val scalaVersionOpt: Option[String])
12831283

12841284
checkDiagnostic(
12851285
diagnostic = updateActionableDiagnostic,
1286-
expectedMessage = "com.lihaoyi::os-lib:0.7.8 is outdated",
1286+
expectedMessage = "os-lib is outdated",
12871287
expectedSeverity = b.DiagnosticSeverity.HINT,
12881288
expectedStartLine = 0,
12891289
expectedStartCharacter = 15,

modules/integration/src/test/scala/scala/cli/integration/DependencyUpdateTests.scala

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package scala.cli.integration
22

33
import com.eed3si9n.expecty.Expecty.expect
4+
import coursier.core.Version
45

56
class DependencyUpdateTests extends ScalaCliSuite {
67

@@ -25,7 +26,7 @@ class DependencyUpdateTests extends ScalaCliSuite {
2526
stdin = os.Inherit,
2627
mergeErrIntoOut = true
2728
)
28-
expect(p.out.trim().contains("Updated dependency to"))
29+
expect(p.out.trim().contains("Updated dependency"))
2930
expect( // check if dependency update command modify file
3031
os.read(root / fileName) != fileContent)
3132

@@ -34,4 +35,31 @@ class DependencyUpdateTests extends ScalaCliSuite {
3435
expect(out == message)
3536
}
3637
}
38+
39+
test("update toolkit dependence") {
40+
val toolkitVersion = "0.1.3"
41+
val testInputs = TestInputs(
42+
os.rel / "Foo.scala" ->
43+
s"""//> using toolkit "$toolkitVersion"
44+
|
45+
|object Hello extends App {
46+
| println("Hello")
47+
|}
48+
|""".stripMargin
49+
)
50+
testInputs.fromRoot { root =>
51+
// update toolkit
52+
os.proc(TestUtil.cli, "dependency-update", "--all", ".")
53+
.call(cwd = root)
54+
55+
val toolkitDirective = "//> using toolkit \"(.*)\"".r
56+
val updatedToolkitVersionOpt = {
57+
val regexMatch = toolkitDirective.findFirstMatchIn(os.read(root / "Foo.scala"))
58+
regexMatch.map(_.group(1))
59+
}
60+
expect(updatedToolkitVersionOpt.nonEmpty)
61+
val updatedToolkitVersion = updatedToolkitVersionOpt.get
62+
expect(Version(updatedToolkitVersion) > Version(toolkitVersion))
63+
}
64+
}
3765
}

modules/options/src/main/scala/scala/build/actionable/ActionableDependencyHandler.scala

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,23 @@ case object ActionableDependencyHandler
2929
val currentVersion = dependency.version
3030
val latestVersion = value(findLatestVersion(buildOptions, dependency))
3131

32-
if (latestVersion != currentVersion) {
33-
val msg = s"${dependency.render} is outdated, update to $latestVersion"
34-
Some(ActionableDependencyUpdateDiagnostic(msg, setting.positions, dependency, latestVersion))
35-
}
32+
if (latestVersion != currentVersion)
33+
if (dependency.userParams.contains("toolkit"))
34+
Some(ActionableDependencyUpdateDiagnostic(
35+
setting.positions,
36+
currentVersion,
37+
latestVersion,
38+
dependencyModuleName = "toolkit",
39+
suggestion = latestVersion
40+
))
41+
else
42+
Some(ActionableDependencyUpdateDiagnostic(
43+
setting.positions,
44+
currentVersion,
45+
latestVersion,
46+
dependencyModuleName = dependency.module.name,
47+
suggestion = dependency.copy(version = latestVersion).render
48+
))
3649
else
3750
None
3851
}

modules/options/src/main/scala/scala/build/actionable/ActionableDiagnostic.scala

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,15 @@ abstract class ActionableDiagnostic extends Diagnostic {
2020
object ActionableDiagnostic {
2121

2222
case class ActionableDependencyUpdateDiagnostic(
23-
msg: String,
2423
positions: Seq[Position],
25-
oldDependency: AnyDependency,
26-
newVersion: String
24+
currentVersion: String,
25+
newVersion: String,
26+
dependencyModuleName: String,
27+
suggestion: String
2728
) extends ActionableDiagnostic {
28-
override def message: String = s"""|$msg
29-
| ${oldDependency.render} -> $suggestion""".stripMargin
30-
override def suggestion: String = oldDependency.copy(version = newVersion).render
29+
override def message: String =
30+
s"""|"$dependencyModuleName is outdated, update to $newVersion"
31+
| $dependencyModuleName $currentVersion -> $suggestion""".stripMargin
3132
}
3233

3334
}

website/docs/guides/dependencies.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,10 @@ scala-cli dependency-update Hello.scala
9797

9898
```text
9999
Updates
100-
* com.lihaoyi::os-lib:0.7.8 -> 0.8.1
101-
* com.lihaoyi::utest:0.7.10 -> 0.8.0
102-
* com.lihaoyi::geny:0.6.5 -> 0.7.1
103-
* com.lihaoyi::pprint:0.6.6 -> 0.7.3
100+
* com.lihaoyi 0.7.8 -> 0.8.1
101+
* com.lihaoyi 0.7.10 -> 0.8.0
102+
* com.lihaoyi 0.6.5 -> 0.7.1
103+
* com.lihaoyi 0.6.6 -> 0.7.3
104104
To update all dependencies run:
105105
scala-cli dependency-update --all
106106
```
@@ -116,10 +116,10 @@ scala-cli dependency-update Hello.scala --all
116116
```
117117

118118
```text
119-
Updated dependency to: com.lihaoyi::os-lib:0.8.1
120-
Updated dependency to: com.lihaoyi::utest:0.8.0
121-
Updated dependency to: com.lihaoyi::geny:0.7.1
122-
Updated dependency to: com.lihaoyi::pprint:0.7.3
119+
Updated dependency os-lib: 0.7.8 -> 0.9.0
120+
Updated dependency utest: 0.7.10 -> 0.8.1
121+
Updated dependency geny: 0.6.5 -> 1.0.0
122+
Updated dependency pprint: 0.6.6 -> 0.8.1
123123
```
124124

125125
</ChainedSnippets>

0 commit comments

Comments
 (0)