Skip to content

Commit

Permalink
Add testing and rework applying SemanticDB plugin after feedback in c…
Browse files Browse the repository at this point in the history
…omments
  • Loading branch information
tgodzik committed Jul 8, 2019
1 parent 817e6c3 commit 9a30e5c
Show file tree
Hide file tree
Showing 18 changed files with 396 additions and 217 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -189,9 +189,6 @@ object ConfigEncoderDecoders {
implicit val projectEncoder: ObjectEncoder[Project] = deriveEncoder
implicit val projectDecoder: Decoder[Project] = deriveDecoder

implicit val settingsEncoder: ObjectEncoder[Settings] = deriveEncoder
implicit val settingsDecoder: Decoder[Settings] = deriveDecoder

implicit val allEncoder: ObjectEncoder[File] = deriveEncoder
implicit val allDecoder: Decoder[File] = deriveDecoder
}
Original file line number Diff line number Diff line change
Expand Up @@ -177,9 +177,6 @@ object ConfigEncoderDecoders {
implicit val projectEncoder: ObjectEncoder[Project] = deriveEncoder
implicit val projectDecoder: Decoder[Project] = deriveDecoder

implicit val settingsEncoder: ObjectEncoder[Settings] = deriveEncoder
implicit val settingsDecoder: Decoder[Settings] = deriveDecoder

implicit val allEncoder: ObjectEncoder[File] = deriveEncoder
implicit val allDecoder: Decoder[File] = deriveDecoder
}
5 changes: 1 addition & 4 deletions config/src/main/scala/bloop/config/Config.scala
Original file line number Diff line number Diff line change
Expand Up @@ -213,8 +213,6 @@ object Config {
modules: List[Module]
)

case class Settings(semanticDBVersion: String)

case class Project(
name: String,
directory: Path,
Expand Down Expand Up @@ -288,8 +286,7 @@ object Config {
List(),
Some(outAnalysisFile),
Some(CompileSetup.empty)
)
),
)),
Some(Java(List("-version"))),
Some(Sbt("1.1.0", Nil)),
Some(Test(List(), TestOptions(Nil, Nil))),
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/it/scala/bloop/CommunityBuild.scala
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,8 @@ abstract class CommunityBuild(val buildpressHomeDir: AbsolutePath) {

def loadStateForBuild(configDirectory: AbsolutePath, logger: Logger): State = {
assert(configDirectory.exists, "Does not exist: " + configDirectory)
val loadedProjects = BuildLoader.loadSynchronously(configDirectory, logger)
val build = Build(configDirectory, loadedProjects)
val (loadedProjects, buildSettings) = BuildLoader.loadSynchronously(configDirectory, logger)
val build = Build(configDirectory, buildSettings, loadedProjects)
val state = State.forTests(build, compilerCache, logger)
state.copy(results = ResultsCache.emptyForTests)
}
Expand Down
5 changes: 3 additions & 2 deletions frontend/src/main/scala/bloop/Bloop.scala
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import _root_.monix.eval.Task

import scala.annotation.tailrec
import scala.concurrent.Promise
import bloop.data.BuildSettings

object Bloop extends CaseApp[CliOptions] {
private val reader = consoleReader()
Expand All @@ -35,8 +36,8 @@ object Bloop extends CaseApp[CliOptions] {
)
logger.warn("Please refer to our documentation for more information.")
val client = ClientInfo.CliClientInfo("bloop-single-app", () => true)
val projects = BuildLoader.loadSynchronously(configDirectory, logger)
val build = Build(configDirectory, projects)
val (projects, settings) = BuildLoader.loadSynchronously(configDirectory, logger)
val build = Build(configDirectory, settings, projects)
val state = State(build, client, NoPool, options.common, logger)
run(state, options)
}
Expand Down
62 changes: 37 additions & 25 deletions frontend/src/main/scala/bloop/bsp/BloopBspServices.scala
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import scala.concurrent.duration.FiniteDuration
import scala.util.Success
import scala.util.Failure
import monix.execution.Cancelable
import bloop.data.BuildSettings

final class BloopBspServices(
callSiteState: State,
Expand Down Expand Up @@ -180,34 +181,45 @@ final class BloopBspServices(
() => isClientConnected.get
)

/*Metals*/
if (params.displayName.contains("Metals")) {
BuildLoader.writeSettingsFile(params.data, configDir, callSiteState.logger)
/*Metals*/
val saveSettings = Task {
if (params.displayName.contains("Metals")) {
params.data match {
case Some(json) =>
val settings = BuildSettings.fromJson(json)
val savedSettings = BuildSettings.fromFile(configDir, callSiteState.logger)
if (savedSettings.isEmpty || savedSettings.exists(_ != settings)) {
BuildSettings.write(configDir, settings)
}
case _ =>
}
}
}
/*------*/

reloadState(configDir, client).map { state =>
callSiteState.logger.info(s"request received: build/initialize")
clientInfo.success(client)
connectedBspClients.put(client, configDir)
observer.foreach(_.onNext(state.copy(client = client)))
Right(
bsp.InitializeBuildResult(
BuildInfo.bloopName,
BuildInfo.version,
BuildInfo.bspVersion,
bsp.BuildServerCapabilities(
compileProvider = Some(BloopBspServices.DefaultCompileProvider),
testProvider = Some(BloopBspServices.DefaultTestProvider),
runProvider = Some(BloopBspServices.DefaultRunProvider),
inverseSourcesProvider = Some(true),
dependencySourcesProvider = Some(true),
resourcesProvider = Some(true),
buildTargetChangedProvider = Some(false)
),
None
saveSettings.flatMap { _ =>
reloadState(configDir, client).map { state =>
callSiteState.logger.info(s"request received: build/initialize")
clientInfo.success(client)
connectedBspClients.put(client, configDir)
observer.foreach(_.onNext(state.copy(client = client)))
Right(
bsp.InitializeBuildResult(
BuildInfo.bloopName,
BuildInfo.version,
BuildInfo.bspVersion,
bsp.BuildServerCapabilities(
compileProvider = Some(BloopBspServices.DefaultCompileProvider),
testProvider = Some(BloopBspServices.DefaultTestProvider),
runProvider = Some(BloopBspServices.DefaultRunProvider),
inverseSourcesProvider = Some(true),
dependencySourcesProvider = Some(true),
resourcesProvider = Some(true),
buildTargetChangedProvider = Some(false)
),
None
)
)
)
}
}
}

Expand Down
70 changes: 70 additions & 0 deletions frontend/src/main/scala/bloop/data/BuildSettings.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package bloop.data

import bloop.engine.BuildLoader
import bloop.logging.Logger
import bloop.logging.DebugFilter
import java.nio.charset.StandardCharsets
import bloop.config.ConfigEncoderDecoders
import io.circe.Printer
import io.circe.Json
import io.circe.parser
import bloop.io.AbsolutePath
import java.nio.file.Files
import io.circe.JsonObject
import bloop.DependencyResolution
import scala.util.Try
import io.circe.ObjectEncoder
import io.circe.Decoder
import io.circe.derivation._
import java.nio.file.Path
import scala.util.Failure
import scala.util.Success

case class BuildSettings(semanticDBVersion: Option[String])

object BuildSettings {

/** File to store Metals specific settings*/
val settingsFileName = "bloop.settings.json"
private val settingsEncoder: ObjectEncoder[BuildSettings] = deriveEncoder
private val settingsDecoder: Decoder[BuildSettings] = deriveDecoder

def fromFile(configPath: AbsolutePath, logger: Logger): Option[BuildSettings] = {
val settingsPath = configPath.resolve(settingsFileName)
if (settingsPath.isFile) {
val bytes = Files.readAllBytes(settingsPath.underlying)
logger.debug(s"Loading workspace settings from $settingsFileName")(
DebugFilter.All
)
val contents = new String(bytes, StandardCharsets.UTF_8)
parser.parse(contents) match {
case Left(failure) => throw failure
case Right(json) => Option(fromJson(json))
}
} else {
None
}
}

def fromJson(json: Json): BuildSettings = {
settingsDecoder.decodeJson(json) match {
case Right(settings) => settings
case Left(failure) => throw failure
}
}

def write(configDir: AbsolutePath, settings: BuildSettings): Either[Throwable, Path] = {
Try {
val jsonObject = settingsEncoder(settings)
val output = Printer.spaces4.copy(dropNullValues = true).pretty(jsonObject)
Files.write(
configDir.resolve(settingsFileName).underlying,
output.getBytes(StandardCharsets.UTF_8)
)
} match {
case Failure(exception) => Left(exception)
case Success(value) => Right(value)
}
}

}
106 changes: 0 additions & 106 deletions frontend/src/main/scala/bloop/data/SettingsMapper.scala

This file was deleted.

12 changes: 9 additions & 3 deletions frontend/src/main/scala/bloop/engine/Build.scala
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@ import bloop.logging.Logger
import bloop.util.CacheHashCode
import bloop.io.ByteHasher
import monix.eval.Task
import bloop.data.BuildSettings

final case class Build private (
origin: AbsolutePath,
settings: Option[BuildSettings],
projects: List[Project]
) extends CacheHashCode {
private val stringToProjects: Map[String, Project] = projects.map(p => p.name -> p).toMap
Expand All @@ -32,8 +34,11 @@ final case class Build private (
val files = projects.iterator.map(p => p.origin.toAttributedPath).toSet
val newFiles = BuildLoader.readConfigurationFilesInBase(origin, logger).toSet

val loadedSettings = BuildSettings.fromFile(origin, logger)
val settingsChanged = loadedSettings == settings

// This is the fast path to short circuit quickly if they are the same
if (newFiles == files) Task.now(Build.ReturnPreviousState)
if (newFiles == files && !settingsChanged) Task.now(Build.ReturnPreviousState)
else {
val filesToAttributed = projects.iterator.map(p => p.origin.path -> p).toMap
// There has been at least either one addition, one removal or one change in a file time
Expand All @@ -58,7 +63,7 @@ final case class Build private (
val deleted = files.toList.collect { case f if !newToAttributed.contains(f.path) => f.path }
(newOrModified, deleted) match {
case (Nil, Nil) => Build.ReturnPreviousState
case _ => Build.UpdateState(newOrModified, deleted)
case _ => Build.UpdateState(newOrModified, deleted, loadedSettings)
}
}
}
Expand All @@ -70,7 +75,8 @@ object Build {
case object ReturnPreviousState extends ReloadAction
case class UpdateState(
createdOrModified: List[ReadConfiguration],
deleted: List[AbsolutePath]
deleted: List[AbsolutePath],
settingsChanged: Option[BuildSettings]
) extends ReloadAction

/** A configuration file is a combination of an absolute path and a file time. */
Expand Down
Loading

0 comments on commit 9a30e5c

Please sign in to comment.