Skip to content

Commit

Permalink
Auto import builds option (scalameta#6064)
Browse files Browse the repository at this point in the history
* Auto import builds option

* Revert indexer change

* Change option name

* Revert "Revert indexer change"

This reverts commit 9e13b15.

* Switch to enum

* Switch to initialization option

* Update metals/src/main/scala/scala/meta/internal/metals/InitializationOptions.scala

Co-authored-by: Filip Wiechowski <filip.wiechowski@gmail.com>

* Revert "Switch to initialization option"

This reverts commit 7a17c82.

* Update metals/src/main/scala/scala/meta/internal/metals/UserConfiguration.scala

Co-authored-by: Katarzyna Marek <kasia@marek.net>

---------

Co-authored-by: Filip Wiechowski <filip.wiechowski@gmail.com>
Co-authored-by: Katarzyna Marek <kasia@marek.net>
  • Loading branch information
3 people committed Feb 16, 2024
1 parent 0a5fc17 commit 3228b3f
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 31 deletions.
41 changes: 24 additions & 17 deletions metals/src/main/scala/scala/meta/internal/builds/BloopInstall.scala
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import scala.concurrent.ExecutionContext
import scala.concurrent.Future

import scala.meta.internal.builds.Digest.Status
import scala.meta.internal.metals.AutoImportBuildKind
import scala.meta.internal.metals.BuildInfo
import scala.meta.internal.metals.Confirmation
import scala.meta.internal.metals.Messages._
Expand Down Expand Up @@ -132,24 +133,30 @@ final class BloopInstall(
scribe.info(s"skipping build import with status '${result.name}'")
Future.successful(result)
case _ =>
scribe.debug("Awaiting user response...")
for {
userResponse <- requestImport(
buildTools,
buildTool,
languageClient,
digest,
)
installResult <- {
if (userResponse.isYes) {
runUnconditionally(buildTool, isImportInProcess)
} else {
// Don't spam the user with requests during rapid build changes.
notification.dismiss(2, TimeUnit.MINUTES)
Future.successful(WorkspaceLoadedStatus.Rejected)
if (
userConfig().automaticImportBuild == AutoImportBuildKind.Initial || userConfig().automaticImportBuild == AutoImportBuildKind.All
) {
runUnconditionally(buildTool, isImportInProcess)
} else {
scribe.debug("Awaiting user response...")
for {
userResponse <- requestImport(
buildTools,
buildTool,
languageClient,
digest,
)
installResult <- {
if (userResponse.isYes) {
runUnconditionally(buildTool, isImportInProcess)
} else {
// Don't spam the user with requests during rapid build changes.
notification.dismiss(2, TimeUnit.MINUTES)
Future.successful(WorkspaceLoadedStatus.Rejected)
}
}
}
} yield installResult
} yield installResult
}
}
}

Expand Down
32 changes: 18 additions & 14 deletions metals/src/main/scala/scala/meta/internal/metals/Indexer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -130,21 +130,25 @@ final case class Indexer(
scribe.info(s"Skipping reload with status '${status.name}'")
Future.successful(BuildChange.None)
case None =>
for {
userResponse <- workspaceReload().requestReload(
buildTool,
checksum,
)
installResult <- {
if (userResponse.isYes) {
reloadAndIndex(session)
} else {
tables.dismissedNotifications.ImportChanges
.dismiss(2, TimeUnit.MINUTES)
Future.successful(BuildChange.None)
if (userConfig().automaticImportBuild == AutoImportBuildKind.All) {
reloadAndIndex(session)
} else {
for {
userResponse <- workspaceReload().requestReload(
buildTool,
checksum,
)
installResult <- {
if (userResponse.isYes) {
reloadAndIndex(session)
} else {
tables.dismissedNotifications.ImportChanges
.dismiss(2, TimeUnit.MINUTES)
Future.successful(BuildChange.None)
}
}
}
} yield installResult
} yield installResult
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ case class UserConfiguration(
scalafixRulesDependencies: List[String] = Nil,
customProjectRoot: Option[String] = None,
verboseCompilation: Boolean = false,
automaticImportBuild: AutoImportBuildKind = AutoImportBuildKind.Off,
scalaCliLauncher: Option[String] = None,
) {

Expand Down Expand Up @@ -339,6 +340,15 @@ object UserConfiguration {
|will make the logs contain all the possible debugging information including
|about incremental compilation in Zinc.""".stripMargin,
),
UserConfigurationOption(
"auto-import-build",
"off",
"all",
"Import build when changes detected without prompting",
"""|Automatically import builds rather than prompting the user to choose. "initial" will
|only automatically import a build when a project is first opened, "all" will automate
|build imports after subsequent changes as well.""".stripMargin,
),
)

def fromJson(
Expand Down Expand Up @@ -553,6 +563,13 @@ object UserConfiguration {
val verboseCompilation =
getBooleanKey("verbose-compilation").getOrElse(false)

val autoImportBuilds =
getStringKey("auto-import-builds").map(_.trim().toLowerCase()) match {
case Some("initial") => AutoImportBuildKind.Initial
case Some("all") => AutoImportBuildKind.All
case _ => AutoImportBuildKind.Off
}

if (errors.isEmpty) {
Right(
UserConfiguration(
Expand Down Expand Up @@ -584,6 +601,7 @@ object UserConfiguration {
scalafixRulesDependencies,
customProjectRoot,
verboseCompilation,
autoImportBuilds,
)
)
} else {
Expand All @@ -603,3 +621,10 @@ object TestUserInterfaceKind {
object CodeLenses extends TestUserInterfaceKind
object TestExplorer extends TestUserInterfaceKind
}

sealed trait AutoImportBuildKind
object AutoImportBuildKind {
object Off extends AutoImportBuildKind
object Initial extends AutoImportBuildKind
object All extends AutoImportBuildKind
}

0 comments on commit 3228b3f

Please sign in to comment.