scalac
, compiler plugins and infrastructure
«LSP creates the opportunity to reduce the m-times-n complexity problem of providing a high level of support for any programming language in any editor, IDE, or client endpoint to a simpler m-plus-n problem.»
-- https://langserver.org/
«BSP creates the opportunity to reduce the m-times-n complexity problem of providing a high level of support for any build tool in any editor, IDE, or client endpoint to a simpler m-plus-n problem.»
-- Justin and Jorge
«Bejeezus, I just want bloody fast and correct compiles for my team.»
-- Sam Halliday, serious devtools engineer
--- a/nothing.properties
+++ b/bsp.properties
- build.tool.specific=true
- one.time.effort=false
- shared.code=false
- robust=false
- easier.to.maintain=false
- easier.to.test=false
+ build.tool.specific=false
+ one.time.effort=true
+ shared.code=true
+ robust=true
+ easier.to.maintain=true
+ easier.to.test=true
window/logMessage
textDocument/publishDiagnostics
$/cancelRequest
stdin
/stdout
trait InitializeBuildParams {
def rootUri: URI
def capabilities: BuildClientCapabilities
}
trait BuildClientCapabilities {
def languageIds: List[String]
}
trait InitializeBuildResult {
capabilities: BuildServerCapabilities
}
trait BuildServerCapabilities {
compileProvider: Boolean
testProvider: Boolean
textDocumentBuildTargetsProvider: Boolean
dependencySourcesProvider: Boolean
buildTargetChangedProvider: Boolean
}
trait InitializedBuildParams {}
trait BuildTarget {
def id: BuildTargetIdentifier
def displayName: Option[String]
def languageIds: List[String]
def data: Option[Json]
}
trait URI { def uri: String }
trait BuildTargetIdentifier {
def uri: URI
}
workspace/buildTargets
Client => Server
trait WorkspaceBuildTargetsParams {}
Server => Client
trait WorkspaceBuildTargetsResult {
def targets: List[BuildTarget]
}
buildTarget/dependencySources
Client => Server
trait DependencySourcesParams {
def targets: List[BuildTargetIdentifier]
}
Server => Client
trait DependencySourcesResult {
def items: List[DependencySourcesItem]
}
trait DependencySourcesItem {
def target: BuildTargetIdentifier
def sources: List[URI]
}
buildTarget/compile
Client => Server
trait CompileParams {
def targets: List[BuildTargetIdentifier]
def arguments: List[Json]
}
Server => Client
trait CompileReport {
def items: List[CompileReportItem]
}
trait CompileReportItem {
def target: BuildTargetIdentifier
def errors: Long
def warnings: Long
def time: Option[Long]
def linesOfCode: Option[Long]
}
buildTarget/test
Client => Server
trait TestParams {
def targets: List[BuildTargetIdentifier]
def arguments: List[Json]
}
Server => Client
trait TestReport {
def items: List[TestReportItem]
}
trait TestReportItem {
def target: BuildTargetIdentifier
def compileReport: Option[CompileReportItem]
def passed: Long
def failed: Long
def ignored: Long
def time: Option[Long]
}
buildTarget/didChange
buildTarget/dependencyResources
buildTarget/textDocuments
textDocument/buildTargets
trait ScalaBuildTarget {
def scalaOrganization: String
def scalaCompiler: String
def scalaVersion: String
def scalaBinaryVersion: String
def platform: ScalaPlatform
}
object ScalaPlatform {
val JVM = 1
val JS = 2
val Native = 3
}
buildTarget/scalacOptions
Client => Server
trait ScalacOptionsParams {
def targets: List[BuildTargetIdentifier]
}
Server => Client
trait ScalacOptionsResult {
def items: List[ScalcOptionItem]
}
trait ScalacOptionsItem {
def target: BuildTargetIdentifier
def options: List[String]
def classpath: List[String]
def classDirectory: String
}
buildTarget/scalaTestClasses
Client => Server
trait ScalaTestClassesParams {
def targets: List[BuildTargetIdentifier]
}
Server => Client
trait ScalaTestClassesResult {
def items: List[ScalaTestClassesItem]
}
trait ScalaTestClassesItem {
def target: BuildTargetIdentifier
def classes: List[String]
}
buildTarget/run
.vim
vscode
sublime/atom