src/Tools/VSCode/src/protocol.scala
author wenzelm
Sat, 04 Mar 2017 13:33:47 +0100
changeset 65103 0bf1836ce4b1
parent 65095 eb21a4f70b0e
child 65106 a57794dbe0af
permissions -rw-r--r--
tight protocol messages;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
     1
/*  Title:      Tools/VSCode/src/protocol.scala
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
     3
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
     4
Message formats for Language Server Protocol 2.0, see
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
     5
https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
     6
*/
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
     7
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
     8
package isabelle.vscode
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
     9
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    10
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    11
import isabelle._
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    12
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    13
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
    14
import java.io.{File => JFile}
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
    15
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
    16
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    17
object Protocol
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    18
{
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    19
  /* abstract message */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    20
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    21
  object Message
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    22
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    23
    val empty: Map[String, JSON.T] = Map("jsonrpc" -> "2.0")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    24
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    25
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    26
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    27
  /* notification */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    28
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    29
  object Notification
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    30
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    31
    def apply(method: String, params: JSON.T): JSON.T =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    32
      Message.empty + ("method" -> method) + ("params" -> params)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    33
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    34
    def unapply(json: JSON.T): Option[(String, Option[JSON.T])] =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    35
      for {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    36
        method <- JSON.string(json, "method")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    37
        params = JSON.value(json, "params")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    38
      } yield (method, params)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    39
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    40
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    41
  class Notification0(name: String)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    42
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    43
    def unapply(json: JSON.T): Option[Unit] =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    44
      json match {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    45
        case Notification(method, _) if method == name => Some(())
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    46
        case _ => None
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    47
      }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    48
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    49
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    50
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    51
  /* request message */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    52
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    53
  sealed case class Id(id: Any)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    54
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    55
    require(
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    56
      id.isInstanceOf[Int] ||
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    57
      id.isInstanceOf[Long] ||
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    58
      id.isInstanceOf[Double] ||
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    59
      id.isInstanceOf[String])
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    60
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    61
    override def toString: String = id.toString
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    62
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    63
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    64
  object RequestMessage
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    65
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    66
    def apply(id: Id, method: String, params: JSON.T): JSON.T =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    67
      Message.empty + ("id" -> id.id) + ("method" -> method) + ("params" -> params)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    68
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    69
    def unapply(json: JSON.T): Option[(Id, String, Option[JSON.T])] =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    70
      for {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    71
        id <- JSON.long(json, "id") orElse JSON.double(json, "id") orElse JSON.string(json, "id")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    72
        method <- JSON.string(json, "method")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    73
        params = JSON.value(json, "params")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    74
      } yield (Id(id), method, params)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    75
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    76
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    77
  class Request0(name: String)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    78
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    79
    def unapply(json: JSON.T): Option[Id] =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    80
      json match {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    81
        case RequestMessage(id, method, _) if method == name => Some(id)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    82
        case _ => None
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    83
      }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    84
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    85
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
    86
  class RequestTextDocumentPosition(name: String)
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
    87
  {
64651
ea5620f7b0d8 clarified signature;
wenzelm
parents: 64649
diff changeset
    88
    def unapply(json: JSON.T): Option[(Id, Line.Node_Position)] =
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
    89
      json match {
64651
ea5620f7b0d8 clarified signature;
wenzelm
parents: 64649
diff changeset
    90
        case RequestMessage(id, method, Some(TextDocumentPosition(node_pos))) if method == name =>
ea5620f7b0d8 clarified signature;
wenzelm
parents: 64649
diff changeset
    91
          Some((id, node_pos))
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
    92
        case _ => None
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
    93
      }
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
    94
  }
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
    95
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    96
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    97
  /* response message */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    98
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    99
  object ResponseMessage
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   100
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   101
    def apply(id: Id, result: Option[JSON.T] = None, error: Option[ResponseError] = None): JSON.T =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   102
      Message.empty + ("id" -> id.id) ++
64878
wenzelm
parents: 64877
diff changeset
   103
        JSON.optional("result" -> result) ++
wenzelm
parents: 64877
diff changeset
   104
        JSON.optional("error" -> error.map(_.json))
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   105
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   106
    def strict(id: Id, result: Option[JSON.T] = None, error: String = ""): JSON.T =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   107
      if (error == "") apply(id, result = result)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   108
      else apply(id, error = Some(ResponseError(code = ErrorCodes.serverErrorEnd, message = error)))
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   109
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   110
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   111
  sealed case class ResponseError(code: Int, message: String, data: Option[JSON.T] = None)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   112
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   113
    def json: JSON.T =
64878
wenzelm
parents: 64877
diff changeset
   114
      Map("code" -> code, "message" -> message) ++ JSON.optional("data" -> data)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   115
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   116
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   117
  object ErrorCodes
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   118
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   119
    val ParseError = -32700
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   120
    val InvalidRequest = -32600
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   121
    val MethodNotFound = -32601
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   122
    val InvalidParams = -32602
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   123
    val InternalError = -32603
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   124
    val serverErrorStart = -32099
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   125
    val serverErrorEnd = -32000
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   126
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   127
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   128
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   129
  /* init and exit */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   130
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   131
  object Initialize extends Request0("initialize")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   132
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   133
    def reply(id: Id, error: String): JSON.T =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   134
      ResponseMessage.strict(id, Some(Map("capabilities" -> ServerCapabilities.json)), error)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   135
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   136
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   137
  object ServerCapabilities
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   138
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   139
    val json: JSON.T =
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   140
      Map(
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   141
        "textDocumentSync" -> 1,
64877
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   142
        "completionProvider" -> Map("resolveProvider" -> false, "triggerCharacters" -> Nil),
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   143
        "hoverProvider" -> true,
64767
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   144
        "definitionProvider" -> true,
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   145
        "documentHighlightProvider" -> true)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   146
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   147
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   148
  object Shutdown extends Request0("shutdown")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   149
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   150
    def reply(id: Id, error: String): JSON.T =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   151
      ResponseMessage.strict(id, Some("OK"), error)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   152
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   153
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   154
  object Exit extends Notification0("exit")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   155
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   156
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   157
  /* document positions */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   158
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   159
  object Position
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   160
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   161
    def apply(pos: Line.Position): JSON.T =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   162
      Map("line" -> pos.line, "character" -> pos.column)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   163
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   164
    def unapply(json: JSON.T): Option[Line.Position] =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   165
      for {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   166
        line <- JSON.int(json, "line")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   167
        column <- JSON.int(json, "character")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   168
      } yield Line.Position(line, column)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   169
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   170
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   171
  object Range
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   172
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   173
    def apply(range: Line.Range): JSON.T =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   174
      Map("start" -> Position(range.start), "end" -> Position(range.stop))
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   175
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   176
    def unapply(json: JSON.T): Option[Line.Range] =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   177
      (JSON.value(json, "start"), JSON.value(json, "end")) match {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   178
        case (Some(Position(start)), Some(Position(stop))) => Some(Line.Range(start, stop))
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   179
        case _ => None
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   180
      }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   181
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   182
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   183
  object Location
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   184
  {
64651
ea5620f7b0d8 clarified signature;
wenzelm
parents: 64649
diff changeset
   185
    def apply(loc: Line.Node_Range): JSON.T =
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
   186
      Map("uri" -> Url.print_file_name(loc.name), "range" -> Range(loc.range))
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   187
64651
ea5620f7b0d8 clarified signature;
wenzelm
parents: 64649
diff changeset
   188
    def unapply(json: JSON.T): Option[Line.Node_Range] =
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   189
      for {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   190
        uri <- JSON.string(json, "uri")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   191
        range_json <- JSON.value(json, "range")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   192
        range <- Range.unapply(range_json)
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
   193
      } yield Line.Node_Range(Url.canonical_file_name(uri), range)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   194
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   195
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   196
  object TextDocumentPosition
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   197
  {
64651
ea5620f7b0d8 clarified signature;
wenzelm
parents: 64649
diff changeset
   198
    def unapply(json: JSON.T): Option[Line.Node_Position] =
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   199
      for {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   200
        doc <- JSON.value(json, "textDocument")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   201
        uri <- JSON.string(doc, "uri")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   202
        pos_json <- JSON.value(json, "position")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   203
        pos <- Position.unapply(pos_json)
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
   204
      } yield Line.Node_Position(Url.canonical_file_name(uri), pos)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   205
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   206
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   207
65103
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   208
  /* marked strings */
65093
5f08197206ce clarified signature;
wenzelm
parents: 64878
diff changeset
   209
5f08197206ce clarified signature;
wenzelm
parents: 64878
diff changeset
   210
  sealed case class MarkedString(text: String, language: String = "plaintext")
5f08197206ce clarified signature;
wenzelm
parents: 64878
diff changeset
   211
  {
5f08197206ce clarified signature;
wenzelm
parents: 64878
diff changeset
   212
    def json: JSON.T = Map("language" -> language, "value" -> text)
5f08197206ce clarified signature;
wenzelm
parents: 64878
diff changeset
   213
  }
5f08197206ce clarified signature;
wenzelm
parents: 64878
diff changeset
   214
65103
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   215
  object MarkedStrings
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   216
  {
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   217
    def json(msgs: List[MarkedString]): Option[JSON.T] =
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   218
      msgs match {
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   219
        case Nil => None
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   220
        case List(msg) => Some(msg.json)
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   221
        case _ => Some(msgs.map(_.json))
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   222
      }
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   223
  }
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   224
65093
5f08197206ce clarified signature;
wenzelm
parents: 64878
diff changeset
   225
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   226
  /* diagnostic messages */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   227
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   228
  object MessageType
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   229
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   230
    val Error = 1
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   231
    val Warning = 2
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   232
    val Info = 3
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   233
    val Log = 4
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   234
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   235
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   236
  object DisplayMessage
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   237
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   238
    def apply(message_type: Int, message: String, show: Boolean = true): JSON.T =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   239
      Notification(if (show) "window/showMessage" else "window/logMessage",
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   240
        Map("type" -> message_type, "message" -> message))
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   241
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   242
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   243
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   244
  /* document edits */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   245
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   246
  object DidOpenTextDocument
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   247
  {
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
   248
    def unapply(json: JSON.T): Option[(JFile, String, Long, String)] =
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   249
      json match {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   250
        case Notification("textDocument/didOpen", Some(params)) =>
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   251
          for {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   252
            doc <- JSON.value(params, "textDocument")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   253
            uri <- JSON.string(doc, "uri")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   254
            lang <- JSON.string(doc, "languageId")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   255
            version <- JSON.long(doc, "version")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   256
            text <- JSON.string(doc, "text")
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
   257
          } yield (Url.canonical_file(uri), lang, version, text)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   258
        case _ => None
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   259
      }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   260
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   261
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   262
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   263
  sealed abstract class TextDocumentContentChange
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   264
  case class TextDocumentContent(text: String) extends TextDocumentContentChange
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   265
  case class TextDocumentChange(range: Line.Range, range_length: Int, text: String)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   266
    extends TextDocumentContentChange
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   267
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   268
  object TextDocumentContentChange
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   269
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   270
    def unapply(json: JSON.T): Option[TextDocumentContentChange] =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   271
      for { text <- JSON.string(json, "text") }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   272
      yield {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   273
        (JSON.value(json, "range"), JSON.int(json, "rangeLength")) match {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   274
          case (Some(Range(range)), Some(range_length)) =>
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   275
            TextDocumentChange(range, range_length, text)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   276
          case _ => TextDocumentContent(text)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   277
        }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   278
      }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   279
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   280
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   281
  object DidChangeTextDocument
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   282
  {
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
   283
    def unapply(json: JSON.T): Option[(JFile, Long, List[TextDocumentContentChange])] =
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   284
      json match {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   285
        case Notification("textDocument/didChange", Some(params)) =>
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   286
          for {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   287
            doc <- JSON.value(params, "textDocument")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   288
            uri <- JSON.string(doc, "uri")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   289
            version <- JSON.long(doc, "version")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   290
            changes <- JSON.array(params, "contentChanges", TextDocumentContentChange.unapply _)
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
   291
          } yield (Url.canonical_file(uri), version, changes)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   292
        case _ => None
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   293
      }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   294
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   295
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   296
  class TextDocumentNotification(name: String)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   297
  {
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
   298
    def unapply(json: JSON.T): Option[JFile] =
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   299
      json match {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   300
        case Notification(method, Some(params)) if method == name =>
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   301
          for {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   302
            doc <- JSON.value(params, "textDocument")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   303
            uri <- JSON.string(doc, "uri")
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
   304
          } yield Url.canonical_file(uri)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   305
        case _ => None
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   306
      }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   307
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   308
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   309
  object DidCloseTextDocument extends TextDocumentNotification("textDocument/didClose")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   310
  object DidSaveTextDocument extends TextDocumentNotification("textDocument/didSave")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   311
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   312
64877
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   313
  /* completion */
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   314
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   315
  sealed case class CompletionItem(
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   316
    label: String,
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   317
    kind: Option[Int] = None,
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   318
    detail: Option[String] = None,
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   319
    documentation: Option[String] = None,
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   320
    insertText: Option[String] = None,
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   321
    range: Option[Line.Range] = None)
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   322
  {
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   323
    def json: JSON.T =
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   324
      Message.empty + ("label" -> label) ++
64878
wenzelm
parents: 64877
diff changeset
   325
        JSON.optional("kind" -> kind) ++
wenzelm
parents: 64877
diff changeset
   326
        JSON.optional("detail" -> detail) ++
wenzelm
parents: 64877
diff changeset
   327
        JSON.optional("documentation" -> documentation) ++
wenzelm
parents: 64877
diff changeset
   328
        JSON.optional("insertText" -> insertText) ++
wenzelm
parents: 64877
diff changeset
   329
        JSON.optional("range" -> range.map(Range(_)))
64877
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   330
  }
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   331
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   332
  object Completion extends RequestTextDocumentPosition("textDocument/completion")
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   333
  {
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   334
    def reply(id: Id, result: List[CompletionItem]): JSON.T =
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   335
      ResponseMessage(id, Some(result.map(_.json)))
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   336
  }
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   337
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   338
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   339
  /* hover request */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   340
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   341
  object Hover extends RequestTextDocumentPosition("textDocument/hover")
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   342
  {
65093
5f08197206ce clarified signature;
wenzelm
parents: 64878
diff changeset
   343
    def reply(id: Id, result: Option[(Line.Range, List[MarkedString])]): JSON.T =
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   344
    {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   345
      val res =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   346
        result match {
64747
54afac94f52b proper content format;
wenzelm
parents: 64693
diff changeset
   347
          case Some((range, contents)) =>
65103
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   348
            Map("contents" -> MarkedStrings.json(contents).getOrElse(Nil), "range" -> Range(range))
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   349
          case None => Map("contents" -> Nil)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   350
        }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   351
      ResponseMessage(id, Some(res))
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   352
    }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   353
  }
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   354
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   355
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   356
  /* goto definition request */
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   357
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   358
  object GotoDefinition extends RequestTextDocumentPosition("textDocument/definition")
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   359
  {
64651
ea5620f7b0d8 clarified signature;
wenzelm
parents: 64649
diff changeset
   360
    def reply(id: Id, result: List[Line.Node_Range]): JSON.T =
64649
d67c3094a0c2 tuned signature -- more explicit types;
wenzelm
parents: 64648
diff changeset
   361
      ResponseMessage(id, Some(result.map(Location.apply(_))))
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   362
  }
64675
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   363
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   364
64767
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   365
  /* document highlights request */
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   366
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   367
  object DocumentHighlight
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   368
  {
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   369
    def text(range: Line.Range): DocumentHighlight = DocumentHighlight(range, Some(1))
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   370
    def read(range: Line.Range): DocumentHighlight = DocumentHighlight(range, Some(2))
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   371
    def write(range: Line.Range): DocumentHighlight = DocumentHighlight(range, Some(3))
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   372
  }
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   373
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   374
  sealed case class DocumentHighlight(range: Line.Range, kind: Option[Int] = None)
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   375
  {
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   376
    def json: JSON.T =
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   377
      kind match {
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   378
        case None => Map("range" -> Range(range))
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   379
        case Some(k) => Map("range" -> Range(range), "kind" -> k)
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   380
      }
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   381
  }
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   382
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   383
  object DocumentHighlights extends RequestTextDocumentPosition("textDocument/documentHighlight")
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   384
  {
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   385
    def reply(id: Id, result: List[DocumentHighlight]): JSON.T =
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   386
      ResponseMessage(id, Some(result.map(_.json)))
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   387
  }
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   388
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   389
64675
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   390
  /* diagnostics */
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   391
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   392
  sealed case class Diagnostic(range: Line.Range, message: String,
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   393
    severity: Option[Int] = None, code: Option[Int] = None, source: Option[String] = None)
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   394
  {
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   395
    def json: JSON.T =
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   396
      Message.empty + ("range" -> Range(range)) + ("message" -> message) ++
64878
wenzelm
parents: 64877
diff changeset
   397
      JSON.optional("severity" -> severity) ++
wenzelm
parents: 64877
diff changeset
   398
      JSON.optional("code" -> code) ++
wenzelm
parents: 64877
diff changeset
   399
      JSON.optional("source" -> source)
64675
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   400
  }
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   401
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   402
  object DiagnosticSeverity
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   403
  {
64762
cd545bec3fd0 clarified message severity, based on empirical observation of VSCode 1.8.1;
wenzelm
parents: 64747
diff changeset
   404
    val Error = 1
cd545bec3fd0 clarified message severity, based on empirical observation of VSCode 1.8.1;
wenzelm
parents: 64747
diff changeset
   405
    val Warning = 2
cd545bec3fd0 clarified message severity, based on empirical observation of VSCode 1.8.1;
wenzelm
parents: 64747
diff changeset
   406
    val Information = 3
cd545bec3fd0 clarified message severity, based on empirical observation of VSCode 1.8.1;
wenzelm
parents: 64747
diff changeset
   407
    val Hint = 4
64675
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   408
  }
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   409
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   410
  object PublishDiagnostics
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   411
  {
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
   412
    def apply(file: JFile, diagnostics: List[Diagnostic]): JSON.T =
64675
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   413
      Notification("textDocument/publishDiagnostics",
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
   414
        Map("uri" -> Url.print_file(file), "diagnostics" -> diagnostics.map(_.json)))
64675
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   415
  }
65094
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   416
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   417
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   418
  /* decorations */
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   419
65095
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 65094
diff changeset
   420
  object Decorations
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 65094
diff changeset
   421
  {
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 65094
diff changeset
   422
    val bad = "bad"
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 65094
diff changeset
   423
  }
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 65094
diff changeset
   424
65094
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   425
  sealed case class DecorationOptions(range: Line.Range, hover_message: List[MarkedString])
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   426
  {
65103
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   427
    def no_hover_message: Boolean = hover_message.isEmpty
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   428
    def json_range: JSON.T = Range(range)
65094
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   429
    def json: JSON.T =
65103
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   430
      Map("range" -> json_range) ++
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   431
      JSON.optional("hoverMessage" -> MarkedStrings.json(hover_message))
65094
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   432
  }
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   433
65095
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 65094
diff changeset
   434
  sealed case class Decoration(typ: String, content: List[DecorationOptions])
65094
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   435
  {
65103
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   436
    def json_content: JSON.T =
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   437
      if (content.forall(_.no_hover_message)) content.map(_.json_range) else content.map(_.json)
65095
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 65094
diff changeset
   438
    def json(file: JFile): JSON.T =
65094
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   439
      Notification("PIDE/decoration",
65103
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   440
        Map("uri" -> Url.print_file(file), "type" -> typ, "content" -> json_content))
65094
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   441
  }
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   442
}