src/Tools/VSCode/src/lsp.scala
author wenzelm
Thu, 03 Mar 2022 15:39:51 +0100
changeset 75197 29e11ce79a52
parent 75195 596e77cda169
child 75199 1ced8ee860e2
permissions -rw-r--r--
clarified signature; clarified data structures;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
72761
4519eeefe3b5 avoid conflicting base names;
wenzelm
parents: 71774
diff changeset
     1
/*  Title:      Tools/VSCode/src/lsp.scala
64605
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
65165
d98ede9e5917 updated to vscode-languageclient 3.0;
wenzelm
parents: 65160
diff changeset
     4
Message formats for Language Server Protocol 3.0, see
64605
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
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
    13
import java.io.{File => JFile}
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
    14
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
    15
72761
4519eeefe3b5 avoid conflicting base names;
wenzelm
parents: 71774
diff changeset
    16
object LSP
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    17
{
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    18
  /* abstract message */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    19
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    20
  object Message
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    21
  {
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
    22
    val empty: JSON.Object.T = JSON.Object("jsonrpc" -> "2.0")
65922
d2f19f05c0e9 clarified message logging;
wenzelm
parents: 65229
diff changeset
    23
73340
0ffcad1f6130 tuned --- fewer warnings;
wenzelm
parents: 73120
diff changeset
    24
    def log(prefix: String, json: JSON.T, logger: Logger, verbose: Boolean): Unit =
65922
d2f19f05c0e9 clarified message logging;
wenzelm
parents: 65229
diff changeset
    25
    {
67851
wenzelm
parents: 67850
diff changeset
    26
      val header =
65922
d2f19f05c0e9 clarified message logging;
wenzelm
parents: 65229
diff changeset
    27
        json match {
67851
wenzelm
parents: 67850
diff changeset
    28
          case JSON.Object(obj) => obj -- (obj.keySet - "method" - "id")
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
    29
          case _ => JSON.Object.empty
65922
d2f19f05c0e9 clarified message logging;
wenzelm
parents: 65229
diff changeset
    30
        }
d2f19f05c0e9 clarified message logging;
wenzelm
parents: 65229
diff changeset
    31
      if (verbose || header.isEmpty) logger(prefix + "\n" + JSON.Format(json))
d2f19f05c0e9 clarified message logging;
wenzelm
parents: 65229
diff changeset
    32
      else logger(prefix + " " + JSON.Format(header))
d2f19f05c0e9 clarified message logging;
wenzelm
parents: 65229
diff changeset
    33
    }
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    34
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    35
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    36
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    37
  /* notification */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    38
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    39
  object Notification
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
    def apply(method: String, params: JSON.T): JSON.T =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    42
      Message.empty + ("method" -> method) + ("params" -> params)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    43
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    44
    def unapply(json: JSON.T): Option[(String, Option[JSON.T])] =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    45
      for {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    46
        method <- JSON.string(json, "method")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    47
        params = JSON.value(json, "params")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    48
      } yield (method, params)
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
  class Notification0(name: String)
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
    def unapply(json: JSON.T): Option[Unit] =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    54
      json match {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    55
        case Notification(method, _) if method == name => Some(())
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    56
        case _ => None
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    57
      }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    58
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    59
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
  /* request message */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    62
66675
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
    63
  object Id
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
    64
  {
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
    65
    def empty: Id = Id("")
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
    66
  }
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
    67
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    68
  sealed case class Id(id: Any)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    69
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    70
    require(
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    71
      id.isInstanceOf[Int] ||
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    72
      id.isInstanceOf[Long] ||
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    73
      id.isInstanceOf[Double] ||
73120
c3589f2dff31 more informative errors: simplify diagnosis of spurious failures reported by users;
wenzelm
parents: 72761
diff changeset
    74
      id.isInstanceOf[String], "bad id type")
64605
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
    override def toString: String = id.toString
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    77
  }
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
  object RequestMessage
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    80
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    81
    def apply(id: Id, method: String, params: JSON.T): JSON.T =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    82
      Message.empty + ("id" -> id.id) + ("method" -> method) + ("params" -> params)
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
    def unapply(json: JSON.T): Option[(Id, String, Option[JSON.T])] =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    85
      for {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    86
        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
    87
        method <- JSON.string(json, "method")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    88
        params = JSON.value(json, "params")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    89
      } yield (Id(id), method, params)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    90
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    91
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    92
  class Request0(name: String)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    93
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    94
    def unapply(json: JSON.T): Option[Id] =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    95
      json match {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    96
        case RequestMessage(id, method, _) if method == name => Some(id)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    97
        case _ => None
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
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   100
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   101
  class RequestTextDocumentPosition(name: String)
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   102
  {
64651
ea5620f7b0d8 clarified signature;
wenzelm
parents: 64649
diff changeset
   103
    def unapply(json: JSON.T): Option[(Id, Line.Node_Position)] =
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   104
      json match {
64651
ea5620f7b0d8 clarified signature;
wenzelm
parents: 64649
diff changeset
   105
        case RequestMessage(id, method, Some(TextDocumentPosition(node_pos))) if method == name =>
ea5620f7b0d8 clarified signature;
wenzelm
parents: 64649
diff changeset
   106
          Some((id, node_pos))
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   107
        case _ => None
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   108
      }
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   109
  }
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   110
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   111
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   112
  /* response message */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   113
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   114
  object ResponseMessage
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
    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
   117
      Message.empty + ("id" -> id.id) ++
64878
wenzelm
parents: 64877
diff changeset
   118
        JSON.optional("result" -> result) ++
wenzelm
parents: 64877
diff changeset
   119
        JSON.optional("error" -> error.map(_.json))
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   120
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   121
    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
   122
      if (error == "") apply(id, result = result)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   123
      else apply(id, error = Some(ResponseError(code = ErrorCodes.serverErrorEnd, message = error)))
66675
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   124
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   125
    def is_empty(json: JSON.T): Boolean =
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   126
      JSON.string(json, "id") == Some("") && JSON.value(json, "result").isDefined
64605
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
  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
   130
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   131
    def json: JSON.T =
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   132
      JSON.Object("code" -> code, "message" -> message) ++ JSON.optional("data" -> data)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   133
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   134
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   135
  object ErrorCodes
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
    val ParseError = -32700
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   138
    val InvalidRequest = -32600
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   139
    val MethodNotFound = -32601
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   140
    val InvalidParams = -32602
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   141
    val InternalError = -32603
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   142
    val serverErrorStart = -32099
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   143
    val serverErrorEnd = -32000
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   144
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   145
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
  /* init and exit */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   148
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   149
  object Initialize extends Request0("initialize")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   150
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   151
    def reply(id: Id, error: String): JSON.T =
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   152
      ResponseMessage.strict(
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   153
        id, Some(JSON.Object("capabilities" -> ServerCapabilities.json)), error)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   154
  }
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
  object ServerCapabilities
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   157
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   158
    val json: JSON.T =
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   159
      JSON.Object(
65160
6e042537555d incremental document changes;
wenzelm
parents: 65106
diff changeset
   160
        "textDocumentSync" -> 2,
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   161
        "completionProvider" -> JSON.Object(
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   162
          "resolveProvider" -> false,
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   163
          "triggerCharacters" ->
75195
596e77cda169 clarified signature;
wenzelm
parents: 75126
diff changeset
   164
            Symbol.symbols.abbrevs.values.flatMap(_.iterator).map(_.toString).toList.distinct
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   165
        ),
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   166
        "hoverProvider" -> true,
64767
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   167
        "definitionProvider" -> true,
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   168
        "documentHighlightProvider" -> true)
64605
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
65229
cc96b8c3b8cb explicitly ignore "initialized" message;
wenzelm
parents: 65201
diff changeset
   171
  object Initialized extends Notification0("initialized")
cc96b8c3b8cb explicitly ignore "initialized" message;
wenzelm
parents: 65201
diff changeset
   172
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   173
  object Shutdown extends Request0("shutdown")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   174
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   175
    def reply(id: Id, error: String): JSON.T =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   176
      ResponseMessage.strict(id, Some("OK"), error)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   177
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   178
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   179
  object Exit extends Notification0("exit")
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
  /* document positions */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   183
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   184
  object Position
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   185
  {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   186
    def apply(pos: Line.Position): JSON.T =
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   187
      JSON.Object("line" -> pos.line, "character" -> pos.column)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   188
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   189
    def unapply(json: JSON.T): Option[Line.Position] =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   190
      for {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   191
        line <- JSON.int(json, "line")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   192
        column <- JSON.int(json, "character")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   193
      } yield Line.Position(line, column)
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 Range
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   197
  {
65173
3700be571a01 more compact protocol message;
wenzelm
parents: 65165
diff changeset
   198
    def compact(range: Line.Range): List[Int] =
3700be571a01 more compact protocol message;
wenzelm
parents: 65165
diff changeset
   199
      List(range.start.line, range.start.column, range.stop.line, range.stop.column)
3700be571a01 more compact protocol message;
wenzelm
parents: 65165
diff changeset
   200
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   201
    def apply(range: Line.Range): JSON.T =
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   202
      JSON.Object("start" -> Position(range.start), "end" -> Position(range.stop))
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   203
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   204
    def unapply(json: JSON.T): Option[Line.Range] =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   205
      (JSON.value(json, "start"), JSON.value(json, "end")) match {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   206
        case (Some(Position(start)), Some(Position(stop))) => Some(Line.Range(start, stop))
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   207
        case _ => None
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   208
      }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   209
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   210
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   211
  object Location
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   212
  {
64651
ea5620f7b0d8 clarified signature;
wenzelm
parents: 64649
diff changeset
   213
    def apply(loc: Line.Node_Range): JSON.T =
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   214
      JSON.Object("uri" -> Url.print_file_name(loc.name), "range" -> Range(loc.range))
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   215
64651
ea5620f7b0d8 clarified signature;
wenzelm
parents: 64649
diff changeset
   216
    def unapply(json: JSON.T): Option[Line.Node_Range] =
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   217
      for {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   218
        uri <- JSON.string(json, "uri")
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   219
        if Url.is_wellformed_file(uri)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   220
        range_json <- JSON.value(json, "range")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   221
        range <- Range.unapply(range_json)
66235
d4fa51e7c4ff retain symlinks in file names from VSCode: relevant for proper file locations in decorations etc.;
wenzelm
parents: 66216
diff changeset
   222
      } yield Line.Node_Range(Url.absolute_file_name(uri), range)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   223
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   224
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   225
  object TextDocumentPosition
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   226
  {
64651
ea5620f7b0d8 clarified signature;
wenzelm
parents: 64649
diff changeset
   227
    def unapply(json: JSON.T): Option[Line.Node_Position] =
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   228
      for {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   229
        doc <- JSON.value(json, "textDocument")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   230
        uri <- JSON.string(doc, "uri")
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   231
        if Url.is_wellformed_file(uri)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   232
        pos_json <- JSON.value(json, "position")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   233
        pos <- Position.unapply(pos_json)
66235
d4fa51e7c4ff retain symlinks in file names from VSCode: relevant for proper file locations in decorations etc.;
wenzelm
parents: 66216
diff changeset
   234
      } yield Line.Node_Position(Url.absolute_file_name(uri), pos)
64605
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
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   237
65103
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   238
  /* marked strings */
65093
5f08197206ce clarified signature;
wenzelm
parents: 64878
diff changeset
   239
5f08197206ce clarified signature;
wenzelm
parents: 64878
diff changeset
   240
  sealed case class MarkedString(text: String, language: String = "plaintext")
5f08197206ce clarified signature;
wenzelm
parents: 64878
diff changeset
   241
  {
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   242
    def json: JSON.T = JSON.Object("language" -> language, "value" -> text)
65093
5f08197206ce clarified signature;
wenzelm
parents: 64878
diff changeset
   243
  }
5f08197206ce clarified signature;
wenzelm
parents: 64878
diff changeset
   244
65103
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   245
  object MarkedStrings
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   246
  {
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   247
    def json(msgs: List[MarkedString]): Option[JSON.T] =
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   248
      msgs match {
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   249
        case Nil => None
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   250
        case List(msg) => Some(msg.json)
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   251
        case _ => Some(msgs.map(_.json))
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   252
      }
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   253
  }
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   254
65093
5f08197206ce clarified signature;
wenzelm
parents: 64878
diff changeset
   255
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   256
  /* diagnostic messages */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   257
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   258
  object MessageType
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
    val Error = 1
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   261
    val Warning = 2
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   262
    val Info = 3
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   263
    val Log = 4
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   264
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   265
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   266
  object DisplayMessage
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   267
  {
73541
1240abf2e3f5 tuned signature;
wenzelm
parents: 73340
diff changeset
   268
    def apply(message_type: Int, message: String, show: Boolean): JSON.T =
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   269
      Notification(if (show) "window/showMessage" else "window/logMessage",
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   270
        JSON.Object("type" -> message_type, "message" -> message))
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   271
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   272
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   273
66138
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   274
  /* commands */
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   275
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   276
  sealed case class Command(title: String, command: String, arguments: List[JSON.T] = Nil)
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   277
  {
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   278
    def json: JSON.T =
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   279
      JSON.Object("title" -> title, "command" -> command, "arguments" -> arguments)
66138
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   280
  }
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   281
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   282
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   283
  /* document edits */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   284
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   285
  object DidOpenTextDocument
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   286
  {
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
   287
    def unapply(json: JSON.T): Option[(JFile, String, Long, String)] =
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   288
      json match {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   289
        case Notification("textDocument/didOpen", Some(params)) =>
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   290
          for {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   291
            doc <- JSON.value(params, "textDocument")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   292
            uri <- JSON.string(doc, "uri")
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   293
            if Url.is_wellformed_file(uri)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   294
            lang <- JSON.string(doc, "languageId")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   295
            version <- JSON.long(doc, "version")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   296
            text <- JSON.string(doc, "text")
66235
d4fa51e7c4ff retain symlinks in file names from VSCode: relevant for proper file locations in decorations etc.;
wenzelm
parents: 66216
diff changeset
   297
          } yield (Url.absolute_file(uri), lang, version, text)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   298
        case _ => None
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   299
      }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   300
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   301
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   302
65160
6e042537555d incremental document changes;
wenzelm
parents: 65106
diff changeset
   303
  sealed case class TextDocumentChange(range: Option[Line.Range], text: String)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   304
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   305
  object DidChangeTextDocument
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   306
  {
65160
6e042537555d incremental document changes;
wenzelm
parents: 65106
diff changeset
   307
    def unapply_change(json: JSON.T): Option[TextDocumentChange] =
6e042537555d incremental document changes;
wenzelm
parents: 65106
diff changeset
   308
      for { text <- JSON.string(json, "text") }
6e042537555d incremental document changes;
wenzelm
parents: 65106
diff changeset
   309
      yield TextDocumentChange(JSON.value(json, "range", Range.unapply _), text)
6e042537555d incremental document changes;
wenzelm
parents: 65106
diff changeset
   310
6e042537555d incremental document changes;
wenzelm
parents: 65106
diff changeset
   311
    def unapply(json: JSON.T): Option[(JFile, Long, List[TextDocumentChange])] =
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   312
      json match {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   313
        case Notification("textDocument/didChange", Some(params)) =>
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   314
          for {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   315
            doc <- JSON.value(params, "textDocument")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   316
            uri <- JSON.string(doc, "uri")
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   317
            if Url.is_wellformed_file(uri)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   318
            version <- JSON.long(doc, "version")
67843
ff561f6e0a8e more operations for typed JSON values;
wenzelm
parents: 67813
diff changeset
   319
            changes <- JSON.list(params, "contentChanges", unapply_change _)
66235
d4fa51e7c4ff retain symlinks in file names from VSCode: relevant for proper file locations in decorations etc.;
wenzelm
parents: 66216
diff changeset
   320
          } yield (Url.absolute_file(uri), version, changes)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   321
        case _ => None
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   322
      }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   323
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   324
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   325
  class TextDocumentNotification(name: String)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   326
  {
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
   327
    def unapply(json: JSON.T): Option[JFile] =
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   328
      json match {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   329
        case Notification(method, Some(params)) if method == name =>
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   330
          for {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   331
            doc <- JSON.value(params, "textDocument")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   332
            uri <- JSON.string(doc, "uri")
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   333
            if Url.is_wellformed_file(uri)
66235
d4fa51e7c4ff retain symlinks in file names from VSCode: relevant for proper file locations in decorations etc.;
wenzelm
parents: 66216
diff changeset
   334
          } yield Url.absolute_file(uri)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   335
        case _ => None
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   336
      }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   337
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   338
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   339
  object DidCloseTextDocument extends TextDocumentNotification("textDocument/didClose")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   340
  object DidSaveTextDocument extends TextDocumentNotification("textDocument/didSave")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   341
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   342
66675
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   343
  /* workspace edits */
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   344
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   345
  sealed case class TextEdit(range: Line.Range, new_text: String)
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   346
  {
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   347
    def json: JSON.T = JSON.Object("range" -> Range(range), "newText" -> new_text)
66675
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   348
  }
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   349
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   350
  sealed case class TextDocumentEdit(file: JFile, version: Long, edits: List[TextEdit])
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   351
  {
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   352
    def json: JSON.T =
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   353
      JSON.Object(
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   354
        "textDocument" -> JSON.Object("uri" -> Url.print_file(file), "version" -> version),
66675
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   355
        "edits" -> edits.map(_.json))
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   356
  }
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   357
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   358
  object WorkspaceEdit
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   359
  {
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   360
    def apply(edits: List[TextDocumentEdit]): JSON.T =
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   361
      RequestMessage(Id.empty, "workspace/applyEdit",
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   362
        JSON.Object("edit" -> JSON.Object("documentChanges" -> edits.map(_.json))))
66675
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   363
  }
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   364
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   365
64877
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   366
  /* completion */
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   367
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   368
  sealed case class CompletionItem(
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   369
    label: String,
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   370
    kind: Option[Int] = None,
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   371
    detail: Option[String] = None,
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   372
    documentation: Option[String] = None,
66140
cdb6c10122b6 tuned signature;
wenzelm
parents: 66139
diff changeset
   373
    text: Option[String] = None,
66138
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   374
    range: Option[Line.Range] = None,
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   375
    command: Option[Command] = None)
64877
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   376
  {
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   377
    def json: JSON.T =
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   378
      JSON.Object("label" -> label) ++
66061
wenzelm
parents: 66052
diff changeset
   379
      JSON.optional("kind" -> kind) ++
wenzelm
parents: 66052
diff changeset
   380
      JSON.optional("detail" -> detail) ++
wenzelm
parents: 66052
diff changeset
   381
      JSON.optional("documentation" -> documentation) ++
66140
cdb6c10122b6 tuned signature;
wenzelm
parents: 66139
diff changeset
   382
      JSON.optional("insertText" -> text) ++
66062
175772371cd0 use old-style "textEdit" for the sake of the external protocol (see also vscode-languageserver-node/issues/188);
wenzelm
parents: 66061
diff changeset
   383
      JSON.optional("range" -> range.map(Range(_))) ++
66675
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   384
      JSON.optional("textEdit" -> range.map(r => TextEdit(r, text.getOrElse(label)).json)) ++
66138
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   385
      JSON.optional("command" -> command.map(_.json))
64877
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   386
  }
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   387
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   388
  object Completion extends RequestTextDocumentPosition("textDocument/completion")
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   389
  {
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   390
    def reply(id: Id, result: List[CompletionItem]): JSON.T =
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   391
      ResponseMessage(id, Some(result.map(_.json)))
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   392
  }
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   393
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   394
66138
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   395
  /* spell checker */
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   396
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   397
  object Include_Word extends Notification0("PIDE/include_word")
66139
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   398
  {
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   399
    val command = Command("Include word", "isabelle.include-word")
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   400
  }
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   401
66138
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   402
  object Include_Word_Permanently extends Notification0("PIDE/include_word_permanently")
66139
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   403
  {
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   404
    val command = Command("Include word permanently", "isabelle.include-word-permanently")
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   405
  }
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   406
66138
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   407
  object Exclude_Word extends Notification0("PIDE/exclude_word")
66139
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   408
  {
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   409
    val command = Command("Exclude word", "isabelle.exclude-word")
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   410
  }
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   411
66138
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   412
  object Exclude_Word_Permanently extends Notification0("PIDE/exclude_word_permanently")
66139
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   413
  {
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   414
    val command = Command("Exclude word permanently", "isabelle.exclude-word-permanently")
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   415
  }
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   416
66138
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   417
  object Reset_Words extends Notification0("PIDE/reset_words")
66139
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   418
  {
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   419
    val command = Command("Reset non-permanent words", "isabelle.reset-words")
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   420
  }
66138
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   421
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   422
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   423
  /* hover request */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   424
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   425
  object Hover extends RequestTextDocumentPosition("textDocument/hover")
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   426
  {
65093
5f08197206ce clarified signature;
wenzelm
parents: 64878
diff changeset
   427
    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
   428
    {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   429
      val res =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   430
        result match {
64747
54afac94f52b proper content format;
wenzelm
parents: 64693
diff changeset
   431
          case Some((range, contents)) =>
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   432
            JSON.Object(
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   433
              "contents" -> MarkedStrings.json(contents).getOrElse(Nil),
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   434
              "range" -> Range(range))
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   435
          case None => JSON.Object("contents" -> Nil)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   436
        }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   437
      ResponseMessage(id, Some(res))
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   438
    }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   439
  }
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   440
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   441
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   442
  /* goto definition request */
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   443
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   444
  object GotoDefinition extends RequestTextDocumentPosition("textDocument/definition")
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   445
  {
64651
ea5620f7b0d8 clarified signature;
wenzelm
parents: 64649
diff changeset
   446
    def reply(id: Id, result: List[Line.Node_Range]): JSON.T =
64649
d67c3094a0c2 tuned signature -- more explicit types;
wenzelm
parents: 64648
diff changeset
   447
      ResponseMessage(id, Some(result.map(Location.apply(_))))
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   448
  }
64675
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   449
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   450
64767
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   451
  /* document highlights request */
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   452
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   453
  object DocumentHighlight
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   454
  {
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   455
    def text(range: Line.Range): DocumentHighlight = DocumentHighlight(range, Some(1))
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   456
    def read(range: Line.Range): DocumentHighlight = DocumentHighlight(range, Some(2))
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   457
    def write(range: Line.Range): DocumentHighlight = DocumentHighlight(range, Some(3))
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   458
  }
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   459
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   460
  sealed case class DocumentHighlight(range: Line.Range, kind: Option[Int] = None)
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   461
  {
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   462
    def json: JSON.T =
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   463
      kind match {
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   464
        case None => JSON.Object("range" -> Range(range))
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   465
        case Some(k) => JSON.Object("range" -> Range(range), "kind" -> k)
64767
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   466
      }
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   467
  }
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   468
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   469
  object DocumentHighlights extends RequestTextDocumentPosition("textDocument/documentHighlight")
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   470
  {
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   471
    def reply(id: Id, result: List[DocumentHighlight]): JSON.T =
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   472
      ResponseMessage(id, Some(result.map(_.json)))
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   473
  }
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   474
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   475
64675
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   476
  /* diagnostics */
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   477
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   478
  sealed case class Diagnostic(range: Line.Range, message: String,
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   479
    severity: Option[Int] = None, code: Option[Int] = None, source: Option[String] = None)
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   480
  {
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   481
    def json: JSON.T =
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   482
      Message.empty + ("range" -> Range(range)) + ("message" -> message) ++
64878
wenzelm
parents: 64877
diff changeset
   483
      JSON.optional("severity" -> severity) ++
wenzelm
parents: 64877
diff changeset
   484
      JSON.optional("code" -> code) ++
wenzelm
parents: 64877
diff changeset
   485
      JSON.optional("source" -> source)
64675
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   486
  }
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   487
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   488
  object DiagnosticSeverity
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   489
  {
64762
cd545bec3fd0 clarified message severity, based on empirical observation of VSCode 1.8.1;
wenzelm
parents: 64747
diff changeset
   490
    val Error = 1
cd545bec3fd0 clarified message severity, based on empirical observation of VSCode 1.8.1;
wenzelm
parents: 64747
diff changeset
   491
    val Warning = 2
cd545bec3fd0 clarified message severity, based on empirical observation of VSCode 1.8.1;
wenzelm
parents: 64747
diff changeset
   492
    val Information = 3
cd545bec3fd0 clarified message severity, based on empirical observation of VSCode 1.8.1;
wenzelm
parents: 64747
diff changeset
   493
    val Hint = 4
64675
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   494
  }
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   495
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   496
  object PublishDiagnostics
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   497
  {
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
   498
    def apply(file: JFile, diagnostics: List[Diagnostic]): JSON.T =
64675
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   499
      Notification("textDocument/publishDiagnostics",
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   500
        JSON.Object("uri" -> Url.print_file(file), "diagnostics" -> diagnostics.map(_.json)))
64675
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   501
  }
65094
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   502
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   503
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   504
  /* decorations */
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   505
65173
3700be571a01 more compact protocol message;
wenzelm
parents: 65165
diff changeset
   506
  sealed case class DecorationOpts(range: Line.Range, hover_message: List[MarkedString])
65094
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   507
  {
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   508
    def json: JSON.T =
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   509
      JSON.Object("range" -> Range.compact(range)) ++
65173
3700be571a01 more compact protocol message;
wenzelm
parents: 65165
diff changeset
   510
      JSON.optional("hover_message" -> MarkedStrings.json(hover_message))
65094
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   511
  }
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   512
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   513
  sealed case class Decoration(decorations: List[(String, List[DecorationOpts])])
65094
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   514
  {
65095
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 65094
diff changeset
   515
    def json(file: JFile): JSON.T =
65094
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   516
      Notification("PIDE/decoration",
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   517
        JSON.Object(
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   518
          "uri" -> Url.print_file(file),
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   519
          "entries" -> decorations.map(decoration => JSON.Object(
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   520
            "type" -> decoration._1,
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   521
            "content" -> decoration._2.map(_.json))
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   522
          ))
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   523
      )
65094
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   524
  }
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   525
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   526
66215
9a8b6b86350c proper hyperlink_command, notably for locate_query;
wenzelm
parents: 66211
diff changeset
   527
  /* caret update: bidirectional */
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   528
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   529
  object Caret_Update
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   530
  {
66216
d4949bae0bad clarified editor focus;
wenzelm
parents: 66215
diff changeset
   531
    def apply(node_pos: Line.Node_Position, focus: Boolean): JSON.T =
66215
9a8b6b86350c proper hyperlink_command, notably for locate_query;
wenzelm
parents: 66211
diff changeset
   532
      Notification("PIDE/caret_update",
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   533
        JSON.Object(
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   534
          "uri" -> Url.print_file_name(node_pos.name),
66215
9a8b6b86350c proper hyperlink_command, notably for locate_query;
wenzelm
parents: 66211
diff changeset
   535
          "line" -> node_pos.pos.line,
66216
d4949bae0bad clarified editor focus;
wenzelm
parents: 66215
diff changeset
   536
          "character" -> node_pos.pos.column,
d4949bae0bad clarified editor focus;
wenzelm
parents: 66215
diff changeset
   537
          "focus" -> focus))
66215
9a8b6b86350c proper hyperlink_command, notably for locate_query;
wenzelm
parents: 66211
diff changeset
   538
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   539
    def unapply(json: JSON.T): Option[Option[(JFile, Line.Position)]] =
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   540
      json match {
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   541
        case Notification("PIDE/caret_update", Some(params)) =>
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   542
          val caret =
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   543
            for {
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   544
              uri <- JSON.string(params, "uri")
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   545
              if Url.is_wellformed_file(uri)
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   546
              pos <- Position.unapply(params)
66235
d4fa51e7c4ff retain symlinks in file names from VSCode: relevant for proper file locations in decorations etc.;
wenzelm
parents: 66216
diff changeset
   547
            } yield (Url.absolute_file(uri), pos)
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   548
          Some(caret)
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   549
        case _ => None
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   550
      }
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   551
  }
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   552
65201
2d01b30e6ac6 clarified modules;
wenzelm
parents: 65200
diff changeset
   553
2d01b30e6ac6 clarified modules;
wenzelm
parents: 65200
diff changeset
   554
  /* dynamic output */
2d01b30e6ac6 clarified modules;
wenzelm
parents: 65200
diff changeset
   555
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   556
  object Dynamic_Output
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   557
  {
66090
wenzelm
parents: 66062
diff changeset
   558
    def apply(content: String): JSON.T =
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   559
      Notification("PIDE/dynamic_output", JSON.Object("content" -> content))
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   560
  }
65977
c51b74be23b6 provide preview content on Scala side (similar to output);
wenzelm
parents: 65924
diff changeset
   561
c51b74be23b6 provide preview content on Scala side (similar to output);
wenzelm
parents: 65924
diff changeset
   562
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   563
  /* state output */
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   564
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   565
  object State_Output
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   566
  {
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   567
    def apply(id: Counter.ID, content: String, auto_update: Boolean): JSON.T =
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   568
      Notification("PIDE/state_output", JSON.Object("id" -> id, "content" -> content, "auto_update" -> auto_update))
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   569
  }
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   570
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   571
  class State_Id_Notification(name: String)
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   572
  {
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   573
    def unapply(json: JSON.T): Option[Counter.ID] =
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   574
      json match {
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   575
        case Notification(method, Some(params)) if method == name => JSON.long(params, "id")
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   576
        case _ => None
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   577
      }
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   578
  }
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   579
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   580
  object State_Init extends Notification0("PIDE/state_init")
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   581
  object State_Exit extends State_Id_Notification("PIDE/state_exit")
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   582
  object State_Locate extends State_Id_Notification("PIDE/state_locate")
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   583
  object State_Update extends State_Id_Notification("PIDE/state_update")
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   584
66211
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   585
  object State_Auto_Update
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   586
  {
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   587
    def unapply(json: JSON.T): Option[(Counter.ID, Boolean)] =
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   588
      json match {
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   589
        case Notification("PIDE/state_auto_update", Some(params)) =>
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   590
          for {
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   591
            id <- JSON.long(params, "id")
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   592
            enabled <- JSON.bool(params, "enabled")
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   593
          } yield (id, enabled)
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   594
        case _ => None
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   595
      }
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   596
  }
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   597
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   598
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   599
  /* preview */
65977
c51b74be23b6 provide preview content on Scala side (similar to output);
wenzelm
parents: 65924
diff changeset
   600
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   601
  object Preview_Request
65977
c51b74be23b6 provide preview content on Scala side (similar to output);
wenzelm
parents: 65924
diff changeset
   602
  {
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   603
    def unapply(json: JSON.T): Option[(JFile, Int)] =
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   604
      json match {
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   605
        case Notification("PIDE/preview_request", Some(params)) =>
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   606
          for {
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   607
            uri <- JSON.string(params, "uri")
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   608
            if Url.is_wellformed_file(uri)
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   609
            column <- JSON.int(params, "column")
66235
d4fa51e7c4ff retain symlinks in file names from VSCode: relevant for proper file locations in decorations etc.;
wenzelm
parents: 66216
diff changeset
   610
          } yield (Url.absolute_file(uri), column)
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   611
        case _ => None
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   612
      }
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   613
  }
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   614
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   615
  object Preview_Response
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   616
  {
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   617
    def apply(file: JFile, column: Int, label: String, content: String): JSON.T =
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   618
      Notification("PIDE/preview_response",
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   619
        JSON.Object(
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   620
          "uri" -> Url.print_file(file),
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   621
          "column" -> column,
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   622
          "label" -> label,
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   623
          "content" -> content))
65977
c51b74be23b6 provide preview content on Scala side (similar to output);
wenzelm
parents: 65924
diff changeset
   624
  }
66052
39eb61b1fa51 provide information about Isabelle symbols within VSCode;
wenzelm
parents: 65983
diff changeset
   625
39eb61b1fa51 provide information about Isabelle symbols within VSCode;
wenzelm
parents: 65983
diff changeset
   626
39eb61b1fa51 provide information about Isabelle symbols within VSCode;
wenzelm
parents: 65983
diff changeset
   627
  /* Isabelle symbols */
39eb61b1fa51 provide information about Isabelle symbols within VSCode;
wenzelm
parents: 65983
diff changeset
   628
39eb61b1fa51 provide information about Isabelle symbols within VSCode;
wenzelm
parents: 65983
diff changeset
   629
  object Symbols_Request extends Notification0("PIDE/symbols_request")
39eb61b1fa51 provide information about Isabelle symbols within VSCode;
wenzelm
parents: 65983
diff changeset
   630
39eb61b1fa51 provide information about Isabelle symbols within VSCode;
wenzelm
parents: 65983
diff changeset
   631
  object Symbols
39eb61b1fa51 provide information about Isabelle symbols within VSCode;
wenzelm
parents: 65983
diff changeset
   632
  {
39eb61b1fa51 provide information about Isabelle symbols within VSCode;
wenzelm
parents: 65983
diff changeset
   633
    def apply(): JSON.T =
39eb61b1fa51 provide information about Isabelle symbols within VSCode;
wenzelm
parents: 65983
diff changeset
   634
    {
39eb61b1fa51 provide information about Isabelle symbols within VSCode;
wenzelm
parents: 65983
diff changeset
   635
      val entries =
75197
29e11ce79a52 clarified signature;
wenzelm
parents: 75195
diff changeset
   636
        for (entry <- Symbol.symbols.entries; code <- entry.code)
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   637
        yield JSON.Object(
75197
29e11ce79a52 clarified signature;
wenzelm
parents: 75195
diff changeset
   638
          "symbol" -> entry.symbol,
29e11ce79a52 clarified signature;
wenzelm
parents: 75195
diff changeset
   639
          "name" -> entry.name,
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   640
          "code" -> code,
75197
29e11ce79a52 clarified signature;
wenzelm
parents: 75195
diff changeset
   641
          "abbrevs" -> entry.abbrevs
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   642
        )
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   643
      Notification("PIDE/symbols", JSON.Object("entries" -> entries))
66052
39eb61b1fa51 provide information about Isabelle symbols within VSCode;
wenzelm
parents: 65983
diff changeset
   644
    }
39eb61b1fa51 provide information about Isabelle symbols within VSCode;
wenzelm
parents: 65983
diff changeset
   645
  }
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   646
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   647
  /* Session structure */
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   648
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   649
  object Session_Theories_Request extends Notification0("PIDE/session_theories_request")
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   650
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   651
  object Session_Theories {
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   652
    def apply(session_theories: Map[String, List[JFile]]): JSON.T = {
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   653
      val entries = session_theories.map { case(session_name, theories) => JSON.Object(
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   654
        "session_name" -> session_name,
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   655
        "theories" -> theories.map(Url.print_file)
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   656
      )}
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   657
      Notification("PIDE/session_theories", JSON.Object("entries" -> entries))
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   658
    }
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   659
  }
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   660
}