setting query is "sbt/setting"

This commit is contained in:
Eugene Yokota 2017-10-03 01:45:06 -04:00
parent a8e770c446
commit 1ad9360e3e
4 changed files with 45 additions and 14 deletions

View File

@ -5,6 +5,7 @@ package server
import sjsonnew.JsonFormat import sjsonnew.JsonFormat
import sjsonnew.support.scalajson.unsafe.Converter import sjsonnew.support.scalajson.unsafe.Converter
import sbt.protocol.Serialization import sbt.protocol.Serialization
import sbt.protocol.{ SettingQuery => Q }
import sbt.internal.protocol._ import sbt.internal.protocol._
import sbt.internal.protocol.codec._ import sbt.internal.protocol.codec._
import sbt.internal.langserver._ import sbt.internal.langserver._
@ -24,6 +25,7 @@ private[sbt] trait LanguageServerProtocol extends CommandChannel {
protected def authOptions: Set[ServerAuthentication] protected def authOptions: Set[ServerAuthentication]
protected def setInitialized(value: Boolean): Unit protected def setInitialized(value: Boolean): Unit
protected def log: Logger protected def log: Logger
protected def onSettingQuery(execId: Option[String], req: Q): Unit
protected def onRequestMessage(request: JsonRpcRequestMessage): Unit = { protected def onRequestMessage(request: JsonRpcRequestMessage): Unit = {
@ -54,6 +56,11 @@ private[sbt] trait LanguageServerProtocol extends CommandChannel {
case "sbt/exec" => case "sbt/exec" =>
val param = Converter.fromJson[SbtExecParams](json).get val param = Converter.fromJson[SbtExecParams](json).get
append(Exec(param.commandLine, Some(request.id), Some(CommandSource(name)))) append(Exec(param.commandLine, Some(request.id), Some(CommandSource(name))))
case "sbt/setting" => {
import sbt.protocol.codec.JsonProtocol._
val param = Converter.fromJson[Q](json).get
onSettingQuery(Option(request.id), param)
}
case _ => () case _ => ()
} }
} }

View File

@ -9,11 +9,9 @@ import java.net.{ Socket, SocketTimeoutException }
import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicBoolean
import sjsonnew._ import sjsonnew._
import sjsonnew.support.scalajson.unsafe.Converter
import scala.annotation.tailrec import scala.annotation.tailrec
import sbt.protocol._ import sbt.protocol._
import sbt.internal.langserver.ErrorCodes import sbt.internal.langserver.ErrorCodes
import sbt.internal.protocol.JsonRpcResponseMessage
import sbt.internal.util.ObjectEvent import sbt.internal.util.ObjectEvent
import sbt.internal.util.codec.JValueFormats import sbt.internal.util.codec.JValueFormats
import sbt.util.Logger import sbt.util.Logger
@ -283,7 +281,7 @@ final class NetworkChannel(val name: String,
def onCommand(command: CommandMessage): Unit = command match { def onCommand(command: CommandMessage): Unit = command match {
case x: InitCommand => onInitCommand(x) case x: InitCommand => onInitCommand(x)
case x: ExecCommand => onExecCommand(x) case x: ExecCommand => onExecCommand(x)
case x: SettingQuery => onSettingQuery(x) case x: SettingQuery => onSettingQuery(None, x)
} }
private def onInitCommand(cmd: InitCommand): Unit = { private def onInitCommand(cmd: InitCommand): Unit = {
@ -312,9 +310,13 @@ final class NetworkChannel(val name: String,
} }
} }
private def onSettingQuery(req: SettingQuery) = { protected def onSettingQuery(execId: Option[String], req: SettingQuery) = {
if (initialized) { if (initialized) {
StandardMain.exchange publishEventMessage SettingQuery.handleSettingQuery(req, structure) import sbt.protocol.codec.JsonProtocol._
SettingQuery.handleSettingQueryEither(req, structure) match {
case Right(x) => langRespond(x, execId)
case Left(s) => langError(execId, ErrorCodes.InvalidParams, s)
}
} else { } else {
log.warn(s"ignoring query $req before initialization") log.warn(s"ignoring query $req before initialization")
} }

View File

@ -110,18 +110,19 @@ object SettingQuery {
toJson(value) toJson(value)
}) })
def handleSettingQuery(req: SettingQuery, structure: BuildStructure): SettingQueryResponse = { def handleSettingQueryEither(req: SettingQuery,
structure: BuildStructure): Either[String, SettingQuerySuccess] = {
val key = Parser.parse(req.setting, scopedKeyParser(structure)) val key = Parser.parse(req.setting, scopedKeyParser(structure))
val result =
for { for {
key <- key key <- key
json <- getSettingJsonValue(structure, key) json <- getSettingJsonValue(structure, key)
} yield SettingQuerySuccess(json, key.key.manifest.toString) } yield SettingQuerySuccess(json, key.key.manifest.toString)
}
result match { def handleSettingQuery(req: SettingQuery, structure: BuildStructure): SettingQueryResponse =
handleSettingQueryEither(req, structure) match {
case Right(x) => x case Right(x) => x
case Left(s) => SettingQueryFailure(s) case Left(s) => SettingQueryFailure(s)
} }
} }
}

View File

@ -1,13 +1,34 @@
$ cat ~/.sbt/1.0/server/0845deda85cb41abdb9f/token.json
### initialize ### initialize
```json ```json
{ "jsonrpc": "2.0", "id": 1, "method": "initialize", "params": { "initializationOptions": { "token": "************" } } } { "jsonrpc": "2.0", "id": 1, "method": "initialize", "params": { "initializationOptions": { "token": "************" } } }
``` ```
### ExecCommand ### sbt/exec
```json ```json
{ "jsonrpc": "2.0", "id": 1, "method": "sbt/exec", "params": { "commandLine": "compile" } } { "jsonrpc": "2.0", "id": 1, "method": "sbt/exec", "params": { "commandLine": "compile" } }
``` ```
### sbt/setting
```json
{ "jsonrpc": "2.0", "id": 1, "method": "sbt/setting", "params": { "setting": "root/name" } }
```
Here's an example of a bad query:
```json
{ "jsonrpc": "2.0", "id": 1, "method": "sbt/setting", "params": { "setting": "name" } }
```
```
Content-Length: 104
Content-Type: application/vscode-jsonrpc; charset=utf-8
{"jsonrpc":"2.0","id":"1","error":{"code":-32602,"message":"Not a valid project ID: name\nname\n ^"}}
```