src/Tools/VSCode/src/lsp.scala
author wenzelm
Sat, 01 Nov 2025 17:54:44 +0100
changeset 83446 c0c0d860acd2
parent 83445 ed531427234a
child 83454 62178604511c
permissions -rw-r--r--
clarified signature: more concise args;
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
83377
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
     3
    Author:     Thomas Lindae, TU Muenchen
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
     4
    Author:     Diana Korchmar, LMU Muenchen
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
     5
75201
8f6b8a46f54c clarified modules: more uniform .scala vs. ts (amending 4519eeefe3b5);
wenzelm
parents: 75199
diff changeset
     6
Message formats for Language Server Protocol, with adhoc PIDE extensions.
8f6b8a46f54c clarified modules: more uniform .scala vs. ts (amending 4519eeefe3b5);
wenzelm
parents: 75199
diff changeset
     7
See https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
     8
*/
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
package isabelle.vscode
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    11
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
import isabelle._
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    14
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
    15
import java.io.{File => JFile}
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
    16
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
    17
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
    18
object LSP {
64605
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
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
    21
  object Message {
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
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
    24
    def log(prefix: String, json: JSON.T, logger: Logger, verbose: Boolean): Unit = {
67851
wenzelm
parents: 67850
diff changeset
    25
      val header =
65922
d2f19f05c0e9 clarified message logging;
wenzelm
parents: 65229
diff changeset
    26
        json match {
67851
wenzelm
parents: 67850
diff changeset
    27
          case JSON.Object(obj) => obj -- (obj.keySet - "method" - "id")
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
    28
          case _ => JSON.Object.empty
65922
d2f19f05c0e9 clarified message logging;
wenzelm
parents: 65229
diff changeset
    29
        }
d2f19f05c0e9 clarified message logging;
wenzelm
parents: 65229
diff changeset
    30
      if (verbose || header.isEmpty) logger(prefix + "\n" + JSON.Format(json))
d2f19f05c0e9 clarified message logging;
wenzelm
parents: 65229
diff changeset
    31
      else logger(prefix + " " + JSON.Format(header))
d2f19f05c0e9 clarified message logging;
wenzelm
parents: 65229
diff changeset
    32
    }
64605
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
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
  /* notification */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    37
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
    38
  object Notification {
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    39
    def apply(method: String, params: JSON.T): JSON.T =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    40
      Message.empty + ("method" -> method) + ("params" -> params)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    41
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    42
    def unapply(json: JSON.T): Option[(String, Option[JSON.T])] =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    43
      for {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    44
        method <- JSON.string(json, "method")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    45
        params = JSON.value(json, "params")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    46
      } yield (method, params)
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
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
    49
  class Notification0(name: String) {
83422
31aceecbd3f2 clarified signature: proper 0-parameter pattern;
wenzelm
parents: 83421
diff changeset
    50
    def unapply(json: JSON.T): Boolean =
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    51
      json match {
83422
31aceecbd3f2 clarified signature: proper 0-parameter pattern;
wenzelm
parents: 83421
diff changeset
    52
        case Notification(method, _) => method == name
31aceecbd3f2 clarified signature: proper 0-parameter pattern;
wenzelm
parents: 83421
diff changeset
    53
        case _ => false
64605
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
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    56
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
  /* request message */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    59
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
    60
  object Id {
66675
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
    61
    def empty: Id = Id("")
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
    62
  }
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
    63
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
    64
  sealed case class Id(id: Any) {
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    65
    require(
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    66
      id.isInstanceOf[Int] ||
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    67
      id.isInstanceOf[Long] ||
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    68
      id.isInstanceOf[Double] ||
73120
c3589f2dff31 more informative errors: simplify diagnosis of spurious failures reported by users;
wenzelm
parents: 72761
diff changeset
    69
      id.isInstanceOf[String], "bad id type")
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    70
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    71
    override def toString: String = id.toString
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    72
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    73
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
    74
  object RequestMessage {
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    75
    def apply(id: Id, method: String, params: JSON.T): JSON.T =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    76
      Message.empty + ("id" -> id.id) + ("method" -> method) + ("params" -> params)
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
    def unapply(json: JSON.T): Option[(Id, String, Option[JSON.T])] =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    79
      for {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    80
        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
    81
        method <- JSON.string(json, "method")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    82
        params = JSON.value(json, "params")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    83
      } yield (Id(id), method, params)
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
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
    86
  class Request0(name: String) {
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    87
    def unapply(json: JSON.T): Option[Id] =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    88
      json match {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    89
        case RequestMessage(id, method, _) if method == name => Some(id)
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    90
        case _ => None
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
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    93
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
    94
  class RequestTextDocumentPosition(name: String) {
64651
ea5620f7b0d8 clarified signature;
wenzelm
parents: 64649
diff changeset
    95
    def unapply(json: JSON.T): Option[(Id, Line.Node_Position)] =
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
    96
      json match {
64651
ea5620f7b0d8 clarified signature;
wenzelm
parents: 64649
diff changeset
    97
        case RequestMessage(id, method, Some(TextDocumentPosition(node_pos))) if method == name =>
ea5620f7b0d8 clarified signature;
wenzelm
parents: 64649
diff changeset
    98
          Some((id, node_pos))
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
    99
        case _ => None
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   100
      }
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   101
  }
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   102
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   103
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   104
  /* response message */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   105
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   106
  object ResponseMessage {
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   107
    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
   108
      Message.empty + ("id" -> id.id) ++
64878
wenzelm
parents: 64877
diff changeset
   109
        JSON.optional("result" -> result) ++
wenzelm
parents: 64877
diff changeset
   110
        JSON.optional("error" -> error.map(_.json))
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
    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
   113
      if (error == "") apply(id, result = result)
81084
96eb20106a34 minor tuning;
Fabian Huch <huch@in.tum.de>
parents: 81081
diff changeset
   114
      else {
96eb20106a34 minor tuning;
Fabian Huch <huch@in.tum.de>
parents: 81081
diff changeset
   115
        apply(id, error =
96eb20106a34 minor tuning;
Fabian Huch <huch@in.tum.de>
parents: 81081
diff changeset
   116
          Some(ResponseError(code = ErrorCodes.jsonrpcReservedErrorRangeEnd, message = error)))
96eb20106a34 minor tuning;
Fabian Huch <huch@in.tum.de>
parents: 81081
diff changeset
   117
      }
66675
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   118
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   119
    def is_empty(json: JSON.T): Boolean =
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   120
      JSON.string(json, "id") == Some("") && JSON.value(json, "result").isDefined
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   121
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   122
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   123
  sealed case class ResponseError(code: Int, message: String, data: Option[JSON.T] = None) {
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   124
    def json: JSON.T =
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   125
      JSON.Object("code" -> code, "message" -> message) ++ JSON.optional("data" -> data)
64605
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
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   128
  object ErrorCodes {
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   129
    val ParseError = -32700
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   130
    val InvalidRequest = -32600
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   131
    val MethodNotFound = -32601
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   132
    val InvalidParams = -32602
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   133
    val InternalError = -32603
81026
c4bc259393f6 lsp: updated ErrorCodes;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81021
diff changeset
   134
c4bc259393f6 lsp: updated ErrorCodes;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81021
diff changeset
   135
    val jsonrpcReservedErrorRangeStart = -32099
c4bc259393f6 lsp: updated ErrorCodes;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81021
diff changeset
   136
    val ServerNotInitialized = -32002
c4bc259393f6 lsp: updated ErrorCodes;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81021
diff changeset
   137
    val UnknownErrorCode = -32001
c4bc259393f6 lsp: updated ErrorCodes;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81021
diff changeset
   138
    val jsonrpcReservedErrorRangeEnd = -32000
c4bc259393f6 lsp: updated ErrorCodes;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81021
diff changeset
   139
c4bc259393f6 lsp: updated ErrorCodes;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81021
diff changeset
   140
    val lspReservedErrorRangeStart = -32899
c4bc259393f6 lsp: updated ErrorCodes;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81021
diff changeset
   141
    val RequestFailed = -32803
c4bc259393f6 lsp: updated ErrorCodes;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81021
diff changeset
   142
    val ServerCancelled = -32802
c4bc259393f6 lsp: updated ErrorCodes;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81021
diff changeset
   143
    val ContentModified = -32801
c4bc259393f6 lsp: updated ErrorCodes;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81021
diff changeset
   144
    val RequestCancelled = -32800
c4bc259393f6 lsp: updated ErrorCodes;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81021
diff changeset
   145
    val lspReservedErrorRangeEnd = -32800
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   146
  }
83377
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   147
64605
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
  /* init and exit */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   150
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   151
  object Initialize extends Request0("initialize") {
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   152
    def reply(id: Id, error: String): JSON.T =
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   153
      ResponseMessage.strict(
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   154
        id, Some(JSON.Object("capabilities" -> ServerCapabilities.json)), error)
64605
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
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   157
  object ServerCapabilities {
64605
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" ->
81081
6aafcdc0217f lsp: added more triggerCharacters to make completion popups more consistent;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81079
diff changeset
   164
            (Symbol.symbols.entries.flatMap(_.abbrevs).flatMap(_.toList).map(_.toString)
6aafcdc0217f lsp: added more triggerCharacters to make completion popups more consistent;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81079
diff changeset
   165
            ++ Symbol.symbols.entries.map(_.name).flatMap(_.toList).map(_.toString)).distinct
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   166
        ),
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   167
        "hoverProvider" -> true,
64767
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   168
        "definitionProvider" -> true,
81067
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   169
        "documentHighlightProvider" -> true,
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   170
        "codeActionProvider" -> true)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   171
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   172
65229
cc96b8c3b8cb explicitly ignore "initialized" message;
wenzelm
parents: 65201
diff changeset
   173
  object Initialized extends Notification0("initialized")
cc96b8c3b8cb explicitly ignore "initialized" message;
wenzelm
parents: 65201
diff changeset
   174
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   175
  object Shutdown extends Request0("shutdown") {
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   176
    def reply(id: Id, error: String): JSON.T =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   177
      ResponseMessage.strict(id, Some("OK"), error)
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
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   180
  object Exit extends Notification0("exit")
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
  /* document positions */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   184
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   185
  object Position {
64605
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
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   196
  object Range {
65173
3700be571a01 more compact protocol message;
wenzelm
parents: 65165
diff changeset
   197
    def compact(range: Line.Range): List[Int] =
3700be571a01 more compact protocol message;
wenzelm
parents: 65165
diff changeset
   198
      List(range.start.line, range.start.column, range.stop.line, range.stop.column)
3700be571a01 more compact protocol message;
wenzelm
parents: 65165
diff changeset
   199
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   200
    def apply(range: Line.Range): JSON.T =
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   201
      JSON.Object("start" -> Position(range.start), "end" -> Position(range.stop))
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   202
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   203
    def unapply(json: JSON.T): Option[Line.Range] =
83423
f849e0bb6ec3 misc tuning;
wenzelm
parents: 83422
diff changeset
   204
      for {
f849e0bb6ec3 misc tuning;
wenzelm
parents: 83422
diff changeset
   205
        case Position(start) <- JSON.value(json, "start")
f849e0bb6ec3 misc tuning;
wenzelm
parents: 83422
diff changeset
   206
        case Position(stop) <- JSON.value(json, "end")
f849e0bb6ec3 misc tuning;
wenzelm
parents: 83422
diff changeset
   207
      } yield Line.Range(start, stop)
64605
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
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   210
  object Location {
64651
ea5620f7b0d8 clarified signature;
wenzelm
parents: 64649
diff changeset
   211
    def apply(loc: Line.Node_Range): JSON.T =
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   212
      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
   213
64651
ea5620f7b0d8 clarified signature;
wenzelm
parents: 64649
diff changeset
   214
    def unapply(json: JSON.T): Option[Line.Node_Range] =
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   215
      for {
83423
f849e0bb6ec3 misc tuning;
wenzelm
parents: 83422
diff changeset
   216
        uri <- JSON.string(json, "uri") if Url.is_wellformed_file(uri)
f849e0bb6ec3 misc tuning;
wenzelm
parents: 83422
diff changeset
   217
        case Range(range) <- JSON.value(json, "range")
66235
d4fa51e7c4ff retain symlinks in file names from VSCode: relevant for proper file locations in decorations etc.;
wenzelm
parents: 66216
diff changeset
   218
      } yield Line.Node_Range(Url.absolute_file_name(uri), range)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   219
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   220
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   221
  object TextDocumentPosition {
64651
ea5620f7b0d8 clarified signature;
wenzelm
parents: 64649
diff changeset
   222
    def unapply(json: JSON.T): Option[Line.Node_Position] =
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   223
      for {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   224
        doc <- JSON.value(json, "textDocument")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   225
        uri <- JSON.string(doc, "uri")
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   226
        if Url.is_wellformed_file(uri)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   227
        pos_json <- JSON.value(json, "position")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   228
        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
   229
      } yield Line.Node_Position(Url.absolute_file_name(uri), pos)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   230
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   231
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   232
65103
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   233
  /* marked strings */
65093
5f08197206ce clarified signature;
wenzelm
parents: 64878
diff changeset
   234
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   235
  sealed case class MarkedString(text: String, language: String = "plaintext") {
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   236
    def json: JSON.T = JSON.Object("language" -> language, "value" -> text)
65093
5f08197206ce clarified signature;
wenzelm
parents: 64878
diff changeset
   237
  }
5f08197206ce clarified signature;
wenzelm
parents: 64878
diff changeset
   238
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   239
  object MarkedStrings {
65103
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   240
    def json(msgs: List[MarkedString]): Option[JSON.T] =
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   241
      msgs match {
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   242
        case Nil => None
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   243
        case List(msg) => Some(msg.json)
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   244
        case _ => Some(msgs.map(_.json))
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   245
      }
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   246
  }
0bf1836ce4b1 tight protocol messages;
wenzelm
parents: 65095
diff changeset
   247
65093
5f08197206ce clarified signature;
wenzelm
parents: 64878
diff changeset
   248
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   249
  /* diagnostic messages */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   250
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   251
  object MessageType {
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   252
    val Error = 1
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   253
    val Warning = 2
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   254
    val Info = 3
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   255
    val Log = 4
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   256
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   257
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   258
  object DisplayMessage {
73541
1240abf2e3f5 tuned signature;
wenzelm
parents: 73340
diff changeset
   259
    def apply(message_type: Int, message: String, show: Boolean): JSON.T =
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   260
      Notification(if (show) "window/showMessage" else "window/logMessage",
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   261
        JSON.Object("type" -> message_type, "message" -> message))
64605
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
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   264
66138
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   265
  /* commands */
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   266
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   267
  sealed case class Command(title: String, command: String, arguments: List[JSON.T] = Nil) {
66138
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   268
    def json: JSON.T =
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   269
      JSON.Object("title" -> title, "command" -> command, "arguments" -> arguments)
66138
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   270
  }
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   271
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   272
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   273
  /* document edits */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   274
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   275
  object DidOpenTextDocument {
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
   276
    def unapply(json: JSON.T): Option[(JFile, String, Long, String)] =
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   277
      json match {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   278
        case Notification("textDocument/didOpen", Some(params)) =>
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   279
          for {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   280
            doc <- JSON.value(params, "textDocument")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   281
            uri <- JSON.string(doc, "uri")
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   282
            if Url.is_wellformed_file(uri)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   283
            lang <- JSON.string(doc, "languageId")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   284
            version <- JSON.long(doc, "version")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   285
            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
   286
          } yield (Url.absolute_file(uri), lang, version, text)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   287
        case _ => None
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   288
      }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   289
  }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   290
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   291
65160
6e042537555d incremental document changes;
wenzelm
parents: 65106
diff changeset
   292
  sealed case class TextDocumentChange(range: Option[Line.Range], text: String)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   293
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   294
  object DidChangeTextDocument {
65160
6e042537555d incremental document changes;
wenzelm
parents: 65106
diff changeset
   295
    def unapply_change(json: JSON.T): Option[TextDocumentChange] =
83423
f849e0bb6ec3 misc tuning;
wenzelm
parents: 83422
diff changeset
   296
      for (text <- JSON.string(json, "text"))
75204
b0910e6c1320 tuned, based on suggestions by IntelliJ IDEA;
wenzelm
parents: 75201
diff changeset
   297
      yield TextDocumentChange(JSON.value(json, "range", Range.unapply), text)
65160
6e042537555d incremental document changes;
wenzelm
parents: 65106
diff changeset
   298
6e042537555d incremental document changes;
wenzelm
parents: 65106
diff changeset
   299
    def unapply(json: JSON.T): Option[(JFile, Long, List[TextDocumentChange])] =
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   300
      json match {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   301
        case Notification("textDocument/didChange", Some(params)) =>
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   302
          for {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   303
            doc <- JSON.value(params, "textDocument")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   304
            uri <- JSON.string(doc, "uri")
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   305
            if Url.is_wellformed_file(uri)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   306
            version <- JSON.long(doc, "version")
75204
b0910e6c1320 tuned, based on suggestions by IntelliJ IDEA;
wenzelm
parents: 75201
diff changeset
   307
            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
   308
          } yield (Url.absolute_file(uri), version, changes)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   309
        case _ => None
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   310
      }
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
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   313
  class TextDocumentNotification(name: String) {
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
   314
    def unapply(json: JSON.T): Option[JFile] =
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   315
      json match {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   316
        case Notification(method, Some(params)) if method == name =>
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   317
          for {
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   318
            doc <- JSON.value(params, "textDocument")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   319
            uri <- JSON.string(doc, "uri")
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   320
            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
   321
          } yield Url.absolute_file(uri)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   322
        case _ => None
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
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   326
  object DidCloseTextDocument extends TextDocumentNotification("textDocument/didClose")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   327
  object DidSaveTextDocument extends TextDocumentNotification("textDocument/didSave")
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   328
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   329
66675
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   330
  /* workspace edits */
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   331
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   332
  sealed case class TextEdit(range: Line.Range, new_text: String) {
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   333
    def json: JSON.T = JSON.Object("range" -> Range(range), "newText" -> new_text)
66675
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   334
  }
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   335
81065
37590e377db6 lsp: made TextDocumentEdit accept optional versions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81060
diff changeset
   336
  sealed case class TextDocumentEdit(file: JFile, version: Option[Long], edits: List[TextEdit]) {
66675
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   337
    def json: JSON.T =
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   338
      JSON.Object(
81065
37590e377db6 lsp: made TextDocumentEdit accept optional versions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81060
diff changeset
   339
        "textDocument" -> (
37590e377db6 lsp: made TextDocumentEdit accept optional versions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81060
diff changeset
   340
          JSON.Object("uri" -> Url.print_file(file)) ++
37590e377db6 lsp: made TextDocumentEdit accept optional versions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81060
diff changeset
   341
          JSON.optional("version" -> version)
37590e377db6 lsp: made TextDocumentEdit accept optional versions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81060
diff changeset
   342
        ),
37590e377db6 lsp: made TextDocumentEdit accept optional versions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81060
diff changeset
   343
        "edits" -> edits.map(_.json)
37590e377db6 lsp: made TextDocumentEdit accept optional versions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81060
diff changeset
   344
      )
66675
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   345
  }
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   346
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   347
  object WorkspaceEdit {
66675
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   348
    def apply(edits: List[TextDocumentEdit]): JSON.T =
81066
18c98588388d lsp: clarified WorkspaceEdit;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81065
diff changeset
   349
      JSON.Object("documentChanges" -> edits.map(_.json))
18c98588388d lsp: clarified WorkspaceEdit;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81065
diff changeset
   350
  }
18c98588388d lsp: clarified WorkspaceEdit;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81065
diff changeset
   351
18c98588388d lsp: clarified WorkspaceEdit;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81065
diff changeset
   352
  object ApplyWorkspaceEdit {
18c98588388d lsp: clarified WorkspaceEdit;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81065
diff changeset
   353
    def apply(edits: List[TextDocumentEdit]): JSON.T =
66675
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   354
      RequestMessage(Id.empty, "workspace/applyEdit",
81066
18c98588388d lsp: clarified WorkspaceEdit;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81065
diff changeset
   355
        JSON.Object("edit" -> WorkspaceEdit(edits))
18c98588388d lsp: clarified WorkspaceEdit;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81065
diff changeset
   356
      )
66675
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   357
  }
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   358
6f4613dbfef6 support for workspace edits;
wenzelm
parents: 66235
diff changeset
   359
64877
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   360
  /* completion */
83377
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   361
81079
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   362
  object CompletionItemKind {
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   363
    val Text = 1;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   364
    val Method = 2;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   365
    val Function = 3;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   366
    val Constructor = 4;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   367
    val Field = 5;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   368
    val Variable = 6;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   369
    val Class = 7;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   370
    val Interface = 8;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   371
    val Module = 9;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   372
    val Property = 10;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   373
    val Unit = 11;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   374
    val Value = 12;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   375
    val Enum = 13;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   376
    val Keyword = 14;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   377
    val Snippet = 15;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   378
    val Color = 16;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   379
    val File = 17;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   380
    val Reference = 18;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   381
    val Folder = 19;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   382
    val EnumMember = 20;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   383
    val Constant = 21;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   384
    val Struct = 22;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   385
    val Event = 23;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   386
    val Operator = 24;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   387
    val TypeParameter = 25;
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   388
  }
64877
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   389
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   390
  sealed case class CompletionItem(
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   391
    label: String,
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   392
    kind: Option[Int] = None,
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   393
    detail: Option[String] = None,
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   394
    documentation: Option[String] = None,
81079
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   395
    filter_text: Option[String] = None,
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   396
    commit_characters: Option[List[String]] = None,
66140
cdb6c10122b6 tuned signature;
wenzelm
parents: 66139
diff changeset
   397
    text: Option[String] = None,
66138
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   398
    range: Option[Line.Range] = None,
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   399
    command: Option[Command] = None
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   400
  ) {
64877
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   401
    def json: JSON.T =
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   402
      JSON.Object("label" -> label) ++
66061
wenzelm
parents: 66052
diff changeset
   403
      JSON.optional("kind" -> kind) ++
wenzelm
parents: 66052
diff changeset
   404
      JSON.optional("detail" -> detail) ++
wenzelm
parents: 66052
diff changeset
   405
      JSON.optional("documentation" -> documentation) ++
81079
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   406
      JSON.optional("filterText" -> filter_text) ++
81084
96eb20106a34 minor tuning;
Fabian Huch <huch@in.tum.de>
parents: 81081
diff changeset
   407
      JSON.optional("textEdit" -> range.map(TextEdit(_, text.getOrElse(label)).json)) ++
81079
ff813e8a3271 lsp: improved completions;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81075
diff changeset
   408
      JSON.optional("commitCharacters" -> commit_characters) ++
66138
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   409
      JSON.optional("command" -> command.map(_.json))
64877
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   410
  }
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   411
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   412
  object Completion extends RequestTextDocumentPosition("textDocument/completion") {
64877
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   413
    def reply(id: Id, result: List[CompletionItem]): JSON.T =
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   414
      ResponseMessage(id, Some(result.map(_.json)))
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   415
  }
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   416
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64777
diff changeset
   417
66138
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   418
  /* spell checker */
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   419
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   420
  object Include_Word extends Notification0("PIDE/include_word") {
66139
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   421
    val command = Command("Include word", "isabelle.include-word")
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   422
  }
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   423
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   424
  object Include_Word_Permanently extends Notification0("PIDE/include_word_permanently") {
66139
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   425
    val command = Command("Include word permanently", "isabelle.include-word-permanently")
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   426
  }
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   427
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   428
  object Exclude_Word extends Notification0("PIDE/exclude_word") {
66139
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   429
    val command = Command("Exclude word", "isabelle.exclude-word")
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   430
  }
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   431
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   432
  object Exclude_Word_Permanently extends Notification0("PIDE/exclude_word_permanently") {
66139
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   433
    val command = Command("Exclude word permanently", "isabelle.exclude-word-permanently")
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   434
  }
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   435
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   436
  object Reset_Words extends Notification0("PIDE/reset_words") {
66139
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   437
    val command = Command("Reset non-permanent words", "isabelle.reset-words")
6a8f8be2741c provide spell-checker menu via completion commands;
wenzelm
parents: 66138
diff changeset
   438
  }
66138
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   439
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66096
diff changeset
   440
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   441
  /* hover request */
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   442
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   443
  object Hover extends RequestTextDocumentPosition("textDocument/hover") {
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   444
    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
   445
      val res =
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   446
        result match {
64747
54afac94f52b proper content format;
wenzelm
parents: 64693
diff changeset
   447
          case Some((range, contents)) =>
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   448
            JSON.Object(
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   449
              "contents" -> MarkedStrings.json(contents).getOrElse(Nil),
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   450
              "range" -> Range(range))
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   451
          case None => JSON.Object("contents" -> Nil)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   452
        }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   453
      ResponseMessage(id, Some(res))
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   454
    }
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   455
  }
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   456
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   457
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   458
  /* goto definition request */
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   459
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   460
  object GotoDefinition extends RequestTextDocumentPosition("textDocument/definition") {
64651
ea5620f7b0d8 clarified signature;
wenzelm
parents: 64649
diff changeset
   461
    def reply(id: Id, result: List[Line.Node_Range]): JSON.T =
75204
b0910e6c1320 tuned, based on suggestions by IntelliJ IDEA;
wenzelm
parents: 75201
diff changeset
   462
      ResponseMessage(id, Some(result.map(Location.apply)))
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64605
diff changeset
   463
  }
64675
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   464
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   465
64767
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   466
  /* document highlights request */
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   467
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   468
  object DocumentHighlight {
64767
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   469
    def text(range: Line.Range): DocumentHighlight = DocumentHighlight(range, Some(1))
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   470
    def read(range: Line.Range): DocumentHighlight = DocumentHighlight(range, Some(2))
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   471
    def write(range: Line.Range): DocumentHighlight = DocumentHighlight(range, Some(3))
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   472
  }
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   473
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   474
  sealed case class DocumentHighlight(range: Line.Range, kind: Option[Int] = None) {
64767
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   475
    def json: JSON.T =
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   476
      kind match {
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   477
        case None => JSON.Object("range" -> Range(range))
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   478
        case Some(k) => JSON.Object("range" -> Range(range), "kind" -> k)
64767
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   479
      }
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   480
  }
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   481
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   482
  object DocumentHighlights extends RequestTextDocumentPosition("textDocument/documentHighlight") {
64767
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   483
    def reply(id: Id, result: List[DocumentHighlight]): JSON.T =
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   484
      ResponseMessage(id, Some(result.map(_.json)))
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   485
  }
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   486
f5c4ffdb1124 support VSCode DocumentHighlights;
wenzelm
parents: 64762
diff changeset
   487
64675
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   488
  /* diagnostics */
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   489
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   490
  sealed case class Diagnostic(
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   491
    range: Line.Range,
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   492
    message: String,
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   493
    severity: Option[Int] = None,
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   494
    code: Option[Int] = None,
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   495
    source: Option[String] = None
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   496
  ) {
64675
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   497
    def json: JSON.T =
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   498
      Message.empty + ("range" -> Range(range)) + ("message" -> message) ++
64878
wenzelm
parents: 64877
diff changeset
   499
      JSON.optional("severity" -> severity) ++
wenzelm
parents: 64877
diff changeset
   500
      JSON.optional("code" -> code) ++
wenzelm
parents: 64877
diff changeset
   501
      JSON.optional("source" -> source)
64675
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   502
  }
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   503
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   504
  object DiagnosticSeverity {
64762
cd545bec3fd0 clarified message severity, based on empirical observation of VSCode 1.8.1;
wenzelm
parents: 64747
diff changeset
   505
    val Error = 1
cd545bec3fd0 clarified message severity, based on empirical observation of VSCode 1.8.1;
wenzelm
parents: 64747
diff changeset
   506
    val Warning = 2
cd545bec3fd0 clarified message severity, based on empirical observation of VSCode 1.8.1;
wenzelm
parents: 64747
diff changeset
   507
    val Information = 3
cd545bec3fd0 clarified message severity, based on empirical observation of VSCode 1.8.1;
wenzelm
parents: 64747
diff changeset
   508
    val Hint = 4
64675
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   509
  }
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   510
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   511
  object PublishDiagnostics {
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64767
diff changeset
   512
    def apply(file: JFile, diagnostics: List[Diagnostic]): JSON.T =
64675
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   513
      Notification("textDocument/publishDiagnostics",
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   514
        JSON.Object("uri" -> Url.print_file(file), "diagnostics" -> diagnostics.map(_.json)))
64675
c557279d93f2 support for diagnostics;
wenzelm
parents: 64651
diff changeset
   515
  }
65094
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   516
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   517
81067
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   518
  /* code actions */
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   519
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   520
  sealed case class CodeAction(title: String, edits: List[TextDocumentEdit]) {
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   521
    def json: JSON.T =
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   522
      JSON.Object("title" -> title, "edit" -> WorkspaceEdit(edits))
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   523
  }
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   524
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   525
  object CodeActionRequest {
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   526
    def unapply(json: JSON.T): Option[(Id, JFile, Line.Range)] =
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   527
      json match {
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   528
        case RequestMessage(id, "textDocument/codeAction", Some(params)) =>
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   529
          for {
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   530
            doc <- JSON.value(params, "textDocument")
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   531
            uri <- JSON.string(doc, "uri")
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   532
            if Url.is_wellformed_file(uri)
83423
f849e0bb6ec3 misc tuning;
wenzelm
parents: 83422
diff changeset
   533
            case Range(range) <- JSON.value(params, "range")
81067
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   534
          } yield (id, Url.absolute_file(uri), range)
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   535
        case _ => None
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   536
      }
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   537
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   538
    def reply(id: Id, actions: List[CodeAction]): JSON.T =
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   539
      ResponseMessage(id, Some(actions.map(_.json)))
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   540
  }
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   541
1b1d72c45ff4 lsp: added support for code actions to apply active sendback markups;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81066
diff changeset
   542
65094
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   543
  /* decorations */
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   544
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   545
  sealed case class Decoration_Options(range: Line.Range, hover_message: List[MarkedString]) {
65094
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   546
    def json: JSON.T =
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   547
      JSON.Object("range" -> Range.compact(range)) ++
65173
3700be571a01 more compact protocol message;
wenzelm
parents: 65165
diff changeset
   548
      JSON.optional("hover_message" -> MarkedStrings.json(hover_message))
65094
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   549
  }
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   550
81051
4fa6e5f9d393 lsp: extracted panel content generation logic;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81043
diff changeset
   551
  type Decoration_List = List[(String, List[Decoration_Options])]
4fa6e5f9d393 lsp: extracted panel content generation logic;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81043
diff changeset
   552
4fa6e5f9d393 lsp: extracted panel content generation logic;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81043
diff changeset
   553
  sealed case class Decoration(decorations: Decoration_List) {
81060
159d1b09fe66 lsp: refactored conversion from Decoration_List to JSON;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81051
diff changeset
   554
    def json_entries: JSON.T =
83377
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   555
      decorations.map(decoration =>
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   556
        JSON.Object(
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   557
          "type" -> decoration._1,
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   558
          "content" -> decoration._2.map(_.json)))
81060
159d1b09fe66 lsp: refactored conversion from Decoration_List to JSON;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81051
diff changeset
   559
65095
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 65094
diff changeset
   560
    def json(file: JFile): JSON.T =
65094
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   561
      Notification("PIDE/decoration",
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   562
        JSON.Object(
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 73541
diff changeset
   563
          "uri" -> Url.print_file(file),
81084
96eb20106a34 minor tuning;
Fabian Huch <huch@in.tum.de>
parents: 81081
diff changeset
   564
          "entries" -> json_entries))
65094
386d9d487f62 support for decorations;
wenzelm
parents: 65093
diff changeset
   565
  }
83377
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   566
81043
2174ec5f0d0c lsp: added decoration_request notification;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81042
diff changeset
   567
  object Decoration_Request {
2174ec5f0d0c lsp: added decoration_request notification;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81042
diff changeset
   568
    def unapply(json: JSON.T): Option[JFile] =
2174ec5f0d0c lsp: added decoration_request notification;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81042
diff changeset
   569
      json match {
2174ec5f0d0c lsp: added decoration_request notification;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81042
diff changeset
   570
        case Notification("PIDE/decoration_request", Some(params)) =>
2174ec5f0d0c lsp: added decoration_request notification;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81042
diff changeset
   571
          for {
2174ec5f0d0c lsp: added decoration_request notification;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81042
diff changeset
   572
            uri <- JSON.string(params, "uri")
2174ec5f0d0c lsp: added decoration_request notification;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81042
diff changeset
   573
            if Url.is_wellformed_file(uri)
2174ec5f0d0c lsp: added decoration_request notification;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81042
diff changeset
   574
          } yield Url.absolute_file(uri)
2174ec5f0d0c lsp: added decoration_request notification;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81042
diff changeset
   575
        case _ => None
2174ec5f0d0c lsp: added decoration_request notification;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81042
diff changeset
   576
      }
2174ec5f0d0c lsp: added decoration_request notification;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81042
diff changeset
   577
  }
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   578
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   579
66215
9a8b6b86350c proper hyperlink_command, notably for locate_query;
wenzelm
parents: 66211
diff changeset
   580
  /* caret update: bidirectional */
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   581
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   582
  object Caret_Update {
66216
d4949bae0bad clarified editor focus;
wenzelm
parents: 66215
diff changeset
   583
    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
   584
      Notification("PIDE/caret_update",
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   585
        JSON.Object(
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   586
          "uri" -> Url.print_file_name(node_pos.name),
66215
9a8b6b86350c proper hyperlink_command, notably for locate_query;
wenzelm
parents: 66211
diff changeset
   587
          "line" -> node_pos.pos.line,
66216
d4949bae0bad clarified editor focus;
wenzelm
parents: 66215
diff changeset
   588
          "character" -> node_pos.pos.column,
d4949bae0bad clarified editor focus;
wenzelm
parents: 66215
diff changeset
   589
          "focus" -> focus))
66215
9a8b6b86350c proper hyperlink_command, notably for locate_query;
wenzelm
parents: 66211
diff changeset
   590
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   591
    def unapply(json: JSON.T): Option[Option[(JFile, Line.Position)]] =
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   592
      json match {
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   593
        case Notification("PIDE/caret_update", Some(params)) =>
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   594
          val caret =
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   595
            for {
83432
wenzelm
parents: 83423
diff changeset
   596
              uri <- JSON.string(params, "uri") if Url.is_wellformed_file(uri)
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   597
              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
   598
            } yield (Url.absolute_file(uri), pos)
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   599
          Some(caret)
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   600
        case _ => None
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   601
      }
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   602
  }
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   603
65201
2d01b30e6ac6 clarified modules;
wenzelm
parents: 65200
diff changeset
   604
2d01b30e6ac6 clarified modules;
wenzelm
parents: 65200
diff changeset
   605
  /* dynamic output */
2d01b30e6ac6 clarified modules;
wenzelm
parents: 65200
diff changeset
   606
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   607
  object Dynamic_Output {
81060
159d1b09fe66 lsp: refactored conversion from Decoration_List to JSON;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81051
diff changeset
   608
    def apply(content: String, decoration: Option[Decoration] = None): JSON.T =
81037
f1aef7110329 lsp: added decorations to dynamic output;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81032
diff changeset
   609
      Notification("PIDE/dynamic_output",
f1aef7110329 lsp: added decorations to dynamic output;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81032
diff changeset
   610
        JSON.Object("content" -> content) ++
81084
96eb20106a34 minor tuning;
Fabian Huch <huch@in.tum.de>
parents: 81081
diff changeset
   611
        JSON.optional("decorations" -> decoration.map(_.json_entries)))
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65173
diff changeset
   612
  }
65977
c51b74be23b6 provide preview content on Scala side (similar to output);
wenzelm
parents: 65924
diff changeset
   613
81029
f4cb1e35c63e lsp: added Output_Set_Margin and State_Set_Margin Notifications;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81028
diff changeset
   614
  object Output_Set_Margin {
f4cb1e35c63e lsp: added Output_Set_Margin and State_Set_Margin Notifications;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81028
diff changeset
   615
    def unapply(json: JSON.T): Option[Double] =
f4cb1e35c63e lsp: added Output_Set_Margin and State_Set_Margin Notifications;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81028
diff changeset
   616
      json match {
f4cb1e35c63e lsp: added Output_Set_Margin and State_Set_Margin Notifications;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81028
diff changeset
   617
        case Notification("PIDE/output_set_margin", Some(params)) =>
81032
de94fcfbc3ce lsp: tuned;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81030
diff changeset
   618
          JSON.double(params, "margin")
81029
f4cb1e35c63e lsp: added Output_Set_Margin and State_Set_Margin Notifications;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81028
diff changeset
   619
        case _ => None
f4cb1e35c63e lsp: added Output_Set_Margin and State_Set_Margin Notifications;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81028
diff changeset
   620
      }
f4cb1e35c63e lsp: added Output_Set_Margin and State_Set_Margin Notifications;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81028
diff changeset
   621
  }
f4cb1e35c63e lsp: added Output_Set_Margin and State_Set_Margin Notifications;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81028
diff changeset
   622
65977
c51b74be23b6 provide preview content on Scala side (similar to output);
wenzelm
parents: 65924
diff changeset
   623
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   624
  /* state output */
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   625
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   626
  object State_Output {
81042
f1e0ca5aaa6b lsp: added decorations to state updates;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81039
diff changeset
   627
    def apply(
f1e0ca5aaa6b lsp: added decorations to state updates;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81039
diff changeset
   628
       id: Counter.ID,
f1e0ca5aaa6b lsp: added decorations to state updates;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81039
diff changeset
   629
       content: String,
f1e0ca5aaa6b lsp: added decorations to state updates;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81039
diff changeset
   630
       auto_update: Boolean,
81060
159d1b09fe66 lsp: refactored conversion from Decoration_List to JSON;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81051
diff changeset
   631
       decorations: Option[Decoration] = None
81042
f1e0ca5aaa6b lsp: added decorations to state updates;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81039
diff changeset
   632
    ): JSON.T =
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   633
      Notification("PIDE/state_output",
81042
f1e0ca5aaa6b lsp: added decorations to state updates;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81039
diff changeset
   634
        JSON.Object("id" -> id, "content" -> content, "auto_update" -> auto_update) ++
81084
96eb20106a34 minor tuning;
Fabian Huch <huch@in.tum.de>
parents: 81081
diff changeset
   635
        JSON.optional("decorations" -> decorations.map(_.json_entries)))
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   636
  }
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   637
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   638
  class State_Id_Notification(name: String) {
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   639
    def unapply(json: JSON.T): Option[Counter.ID] =
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   640
      json match {
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   641
        case Notification(method, Some(params)) if method == name => JSON.long(params, "id")
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   642
        case _ => None
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   643
      }
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   644
  }
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   645
81028
84f6f17274d0 lsp: changed State_Init notification into a request and removed State_Init_Response;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81026
diff changeset
   646
  object State_Init extends Request0("PIDE/state_init") {
84f6f17274d0 lsp: changed State_Init notification into a request and removed State_Init_Response;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81026
diff changeset
   647
    def reply(id: Id, state_id: Counter.ID): JSON.T =
84f6f17274d0 lsp: changed State_Init notification into a request and removed State_Init_Response;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81026
diff changeset
   648
      ResponseMessage(id, Some(JSON.Object("state_id" -> state_id)))
84f6f17274d0 lsp: changed State_Init notification into a request and removed State_Init_Response;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81026
diff changeset
   649
  }
84f6f17274d0 lsp: changed State_Init notification into a request and removed State_Init_Response;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81026
diff changeset
   650
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   651
  object State_Exit extends State_Id_Notification("PIDE/state_exit")
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   652
  object State_Locate extends State_Id_Notification("PIDE/state_locate")
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   653
  object State_Update extends State_Id_Notification("PIDE/state_update")
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   654
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   655
  object State_Auto_Update {
66211
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   656
    def unapply(json: JSON.T): Option[(Counter.ID, Boolean)] =
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   657
      json match {
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   658
        case Notification("PIDE/state_auto_update", Some(params)) =>
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   659
          for {
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   660
            id <- JSON.long(params, "id")
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   661
            enabled <- JSON.bool(params, "enabled")
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   662
          } yield (id, enabled)
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   663
        case _ => None
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   664
      }
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   665
  }
100c9c997e2b HTML GUI actions via JavaScript;
wenzelm
parents: 66140
diff changeset
   666
81029
f4cb1e35c63e lsp: added Output_Set_Margin and State_Set_Margin Notifications;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81028
diff changeset
   667
  object State_Set_Margin {
f4cb1e35c63e lsp: added Output_Set_Margin and State_Set_Margin Notifications;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81028
diff changeset
   668
    def unapply(json: JSON.T): Option[(Counter.ID, Double)] =
f4cb1e35c63e lsp: added Output_Set_Margin and State_Set_Margin Notifications;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81028
diff changeset
   669
      json match {
f4cb1e35c63e lsp: added Output_Set_Margin and State_Set_Margin Notifications;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81028
diff changeset
   670
        case Notification("PIDE/state_set_margin", Some(params)) =>
f4cb1e35c63e lsp: added Output_Set_Margin and State_Set_Margin Notifications;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81028
diff changeset
   671
          for {
f4cb1e35c63e lsp: added Output_Set_Margin and State_Set_Margin Notifications;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81028
diff changeset
   672
            id <- JSON.long(params, "id")
f4cb1e35c63e lsp: added Output_Set_Margin and State_Set_Margin Notifications;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81028
diff changeset
   673
            margin <- JSON.double(params, "margin")
f4cb1e35c63e lsp: added Output_Set_Margin and State_Set_Margin Notifications;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81028
diff changeset
   674
          } yield (id, margin)
f4cb1e35c63e lsp: added Output_Set_Margin and State_Set_Margin Notifications;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81028
diff changeset
   675
        case _ => None
f4cb1e35c63e lsp: added Output_Set_Margin and State_Set_Margin Notifications;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81028
diff changeset
   676
      }
f4cb1e35c63e lsp: added Output_Set_Margin and State_Set_Margin Notifications;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81028
diff changeset
   677
  }
f4cb1e35c63e lsp: added Output_Set_Margin and State_Set_Margin Notifications;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 81028
diff changeset
   678
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66090
diff changeset
   679
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   680
  /* preview */
65977
c51b74be23b6 provide preview content on Scala side (similar to output);
wenzelm
parents: 65924
diff changeset
   681
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   682
  object Preview_Request {
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   683
    def unapply(json: JSON.T): Option[(JFile, Int)] =
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   684
      json match {
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   685
        case Notification("PIDE/preview_request", Some(params)) =>
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   686
          for {
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   687
            uri <- JSON.string(params, "uri")
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   688
            if Url.is_wellformed_file(uri)
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   689
            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
   690
          } yield (Url.absolute_file(uri), column)
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   691
        case _ => None
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   692
      }
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   693
  }
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   694
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75263
diff changeset
   695
  object Preview_Response {
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   696
    def apply(file: JFile, column: Int, label: String, content: String): JSON.T =
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   697
      Notification("PIDE/preview_response",
67850
3e9fe7a84b5d tuned signature;
wenzelm
parents: 67843
diff changeset
   698
        JSON.Object(
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   699
          "uri" -> Url.print_file(file),
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   700
          "column" -> column,
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   701
          "label" -> label,
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   702
          "content" -> content))
65977
c51b74be23b6 provide preview content on Scala side (similar to output);
wenzelm
parents: 65924
diff changeset
   703
  }
83363
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   704
83377
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   705
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   706
  /* symbols */
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   707
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   708
  object Symbols_Request extends Request0("PIDE/symbols_request") {
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   709
    def reply(id: Id, symbols: Symbol.Symbols): JSON.T = {
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   710
      def json(symbol: Symbol.Entry): JSON.T =
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   711
        JSON.Object(
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   712
          "symbol" -> symbol.symbol,
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   713
          "name" -> symbol.name,
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   714
          "argument" -> symbol.argument.toString) ++
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   715
        JSON.optional("code", symbol.code) ++
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   716
        JSON.optional("font", symbol.font) ++
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   717
        JSON.Object(
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   718
          "groups" -> symbol.groups,
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   719
          "abbrevs" -> symbol.abbrevs)
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   720
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   721
      ResponseMessage(id, Some(symbols.entries.map(s => json(s))))
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   722
    }
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   723
  }
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   724
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   725
  object Symbols_Convert_Request {
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   726
    def unapply(json: JSON.T): Option[(Id, String, Boolean)] =
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   727
      json match {
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   728
        case RequestMessage(id, "PIDE/symbols_convert_request", Some(params)) =>
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   729
          for {
83379
f5ddeb309540 misc tuning and clarification;
wenzelm
parents: 83378
diff changeset
   730
            text <- JSON.string(params, "text")
83377
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   731
            unicode <- JSON.bool(params, "unicode")
83379
f5ddeb309540 misc tuning and clarification;
wenzelm
parents: 83378
diff changeset
   732
          } yield (id, text, unicode)
83377
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   733
        case _ => None
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   734
      }
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   735
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   736
    def reply(id: Id, new_string: String): JSON.T =
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   737
      ResponseMessage(id, Some(JSON.Object("text" -> new_string)))
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   738
  }
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   739
83406
9b3a9d739c2e discontinue pointless "init" flag;
wenzelm
parents: 83405
diff changeset
   740
  object Symbols_Panel_Request
9b3a9d739c2e discontinue pointless "init" flag;
wenzelm
parents: 83405
diff changeset
   741
    extends Notification0("PIDE/symbols_panel_request")
83363
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   742
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   743
  object Symbols_Response {
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   744
    def apply(symbols: Symbol.Symbols, abbrevs: List[(String, String)]): JSON.T = {
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   745
      def json(symbol: Symbol.Entry): JSON.T = {
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   746
        val decoded = Symbol.decode(symbol.symbol)
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   747
        JSON.Object(
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   748
          "symbol" -> symbol.symbol,
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   749
          "name" -> symbol.name,
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   750
          "argument" -> symbol.argument.toString,
83379
f5ddeb309540 misc tuning and clarification;
wenzelm
parents: 83378
diff changeset
   751
          "decoded" -> decoded) ++
f5ddeb309540 misc tuning and clarification;
wenzelm
parents: 83378
diff changeset
   752
        JSON.optional("code", symbol.code) ++
f5ddeb309540 misc tuning and clarification;
wenzelm
parents: 83378
diff changeset
   753
        JSON.optional("font", symbol.font) ++
f5ddeb309540 misc tuning and clarification;
wenzelm
parents: 83378
diff changeset
   754
        JSON.Object(
f5ddeb309540 misc tuning and clarification;
wenzelm
parents: 83378
diff changeset
   755
          "groups" -> symbol.groups,
f5ddeb309540 misc tuning and clarification;
wenzelm
parents: 83378
diff changeset
   756
          "abbrevs" -> symbol.abbrevs)
83363
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   757
      }
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   758
83377
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   759
      Notification("PIDE/symbols_response",
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   760
        JSON.Object(
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   761
          "symbols" -> symbols.entries.map(json),
83379
f5ddeb309540 misc tuning and clarification;
wenzelm
parents: 83378
diff changeset
   762
          "abbrevs_from_Thy" -> (for ((a, b) <- abbrevs) yield List(a, b))))
83363
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   763
    }
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   764
  }
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   765
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   766
83377
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   767
  /* documentation */
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   768
83413
068cfdd057d0 discontinue pointless "init" flag;
wenzelm
parents: 83410
diff changeset
   769
  object Documentation_Request
068cfdd057d0 discontinue pointless "init" flag;
wenzelm
parents: 83410
diff changeset
   770
    extends Notification0("PIDE/documentation_request")
83377
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   771
83378
485ba4e3787a clarified signature: more explicit types;
wenzelm
parents: 83377
diff changeset
   772
  object Doc_Entry {
485ba4e3787a clarified signature: more explicit types;
wenzelm
parents: 83377
diff changeset
   773
    def apply(entry: Doc.Entry): JSON.T =
83388
8d90bd0e4f39 more accurate Doc_Entry: print_html like Isabelle/jEdit, proper platform_path;
wenzelm
parents: 83380
diff changeset
   774
      JSON.Object(
8d90bd0e4f39 more accurate Doc_Entry: print_html like Isabelle/jEdit, proper platform_path;
wenzelm
parents: 83380
diff changeset
   775
        "print_html" -> entry.print_html,
8d90bd0e4f39 more accurate Doc_Entry: print_html like Isabelle/jEdit, proper platform_path;
wenzelm
parents: 83380
diff changeset
   776
        "platform_path" -> File.platform_path(entry.path))
83378
485ba4e3787a clarified signature: more explicit types;
wenzelm
parents: 83377
diff changeset
   777
  }
485ba4e3787a clarified signature: more explicit types;
wenzelm
parents: 83377
diff changeset
   778
485ba4e3787a clarified signature: more explicit types;
wenzelm
parents: 83377
diff changeset
   779
  object Doc_Section {
485ba4e3787a clarified signature: more explicit types;
wenzelm
parents: 83377
diff changeset
   780
    def apply(section: Doc.Section): JSON.T =
485ba4e3787a clarified signature: more explicit types;
wenzelm
parents: 83377
diff changeset
   781
      JSON.Object(
485ba4e3787a clarified signature: more explicit types;
wenzelm
parents: 83377
diff changeset
   782
        "title" -> section.title,
485ba4e3787a clarified signature: more explicit types;
wenzelm
parents: 83377
diff changeset
   783
        "important" -> section.important,
485ba4e3787a clarified signature: more explicit types;
wenzelm
parents: 83377
diff changeset
   784
        "entries" -> section.entries.map(Doc_Entry.apply))
485ba4e3787a clarified signature: more explicit types;
wenzelm
parents: 83377
diff changeset
   785
  }
485ba4e3787a clarified signature: more explicit types;
wenzelm
parents: 83377
diff changeset
   786
83363
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   787
  object Documentation_Response {
83380
93a035696418 proper ml_settings, following Isabelle/jEdit;
wenzelm
parents: 83379
diff changeset
   788
    def apply(ml_settings: ML_Settings): JSON.T = {
83363
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   789
      val doc_contents = Doc.contents(ml_settings)
83378
485ba4e3787a clarified signature: more explicit types;
wenzelm
parents: 83377
diff changeset
   790
      Notification("PIDE/documentation_response",
485ba4e3787a clarified signature: more explicit types;
wenzelm
parents: 83377
diff changeset
   791
        JSON.Object("sections" -> doc_contents.sections.map(Doc_Section.apply)))
83363
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   792
    }
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   793
  }
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   794
83377
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   795
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   796
  /* sledgehammer */
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   797
83410
166196bdda3c clarified signature: more uniform names;
wenzelm
parents: 83407
diff changeset
   798
  object Sledgehammer_Provers_Request
83401
1d9b1ca7977e dismantle redundant sledgehammer history in Isabelle/Scala, which does not quite work --- and is already done via vscode.setState / vscode.getState;
wenzelm
parents: 83388
diff changeset
   799
    extends Notification0("PIDE/sledgehammer_provers_request")
83377
b4cafd261b23 tuned whitespace and comments;
wenzelm
parents: 83363
diff changeset
   800
83410
166196bdda3c clarified signature: more uniform names;
wenzelm
parents: 83407
diff changeset
   801
  object Sledgehammer_Provers_Response {
166196bdda3c clarified signature: more uniform names;
wenzelm
parents: 83407
diff changeset
   802
    def apply(provers: String): JSON.T =
166196bdda3c clarified signature: more uniform names;
wenzelm
parents: 83407
diff changeset
   803
      Notification("PIDE/sledgehammer_provers_response", JSON.Object("provers" -> provers))
166196bdda3c clarified signature: more uniform names;
wenzelm
parents: 83407
diff changeset
   804
  }
166196bdda3c clarified signature: more uniform names;
wenzelm
parents: 83407
diff changeset
   805
83363
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   806
  object Sledgehammer_Request {
83446
c0c0d860acd2 clarified signature: more concise args;
wenzelm
parents: 83445
diff changeset
   807
    def unapply(json: JSON.T): Option[List[String]] =
83363
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   808
      json match {
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   809
        case Notification("PIDE/sledgehammer_request", Some(params)) =>
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   810
          for {
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   811
            provers <- JSON.string(params, "provers")
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   812
            isar <- JSON.bool(params, "isar")
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   813
            try0 <- JSON.bool(params, "try0")
83446
c0c0d860acd2 clarified signature: more concise args;
wenzelm
parents: 83445
diff changeset
   814
          } yield List(provers, isar.toString, try0.toString)
83363
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   815
        case _ => None
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   816
      }
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   817
  }
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   818
83421
2740ae774d80 clarified signature and protocol (again);
wenzelm
parents: 83416
diff changeset
   819
  object Sledgehammer_Status {
2740ae774d80 clarified signature and protocol (again);
wenzelm
parents: 83416
diff changeset
   820
    def apply(message: String): JSON.T =
2740ae774d80 clarified signature and protocol (again);
wenzelm
parents: 83416
diff changeset
   821
      Notification("PIDE/sledgehammer_status", JSON.Object("message" -> message))
2740ae774d80 clarified signature and protocol (again);
wenzelm
parents: 83416
diff changeset
   822
  }
2740ae774d80 clarified signature and protocol (again);
wenzelm
parents: 83416
diff changeset
   823
2740ae774d80 clarified signature and protocol (again);
wenzelm
parents: 83416
diff changeset
   824
  object Sledgehammer_Output {
2740ae774d80 clarified signature and protocol (again);
wenzelm
parents: 83416
diff changeset
   825
    def apply(json: JSON.Object.T): JSON.T =
2740ae774d80 clarified signature and protocol (again);
wenzelm
parents: 83416
diff changeset
   826
      Notification("PIDE/sledgehammer_output", json)
2740ae774d80 clarified signature and protocol (again);
wenzelm
parents: 83416
diff changeset
   827
  }
2740ae774d80 clarified signature and protocol (again);
wenzelm
parents: 83416
diff changeset
   828
83414
f61236e8c7b0 clarified signature and protocol (again);
wenzelm
parents: 83413
diff changeset
   829
  object Sledgehammer_Cancel extends Notification0("PIDE/sledgehammer_cancel")
83363
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   830
83416
c7849fa2ece0 more direct sledgehammer "locate" operation via official Query_Operation interface;
wenzelm
parents: 83414
diff changeset
   831
  object Sledgehammer_Locate extends Notification0("PIDE/sledgehammer_locate")
c7849fa2ece0 more direct sledgehammer "locate" operation via official Query_Operation interface;
wenzelm
parents: 83414
diff changeset
   832
83421
2740ae774d80 clarified signature and protocol (again);
wenzelm
parents: 83416
diff changeset
   833
  object Sledgehammer_Insert extends Notification0("PIDE/sledgehammer_insert")
83363
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   834
83410
166196bdda3c clarified signature: more uniform names;
wenzelm
parents: 83407
diff changeset
   835
  object Sledgehammer_Insert_Position_Response {
83379
f5ddeb309540 misc tuning and clarification;
wenzelm
parents: 83378
diff changeset
   836
    def apply(json: JSON.Object.T): JSON.T =
f5ddeb309540 misc tuning and clarification;
wenzelm
parents: 83378
diff changeset
   837
      Notification("PIDE/sledgehammer_insert_position_response", json)
83363
486e094b676c various improvements of Isabelle/VSCode: original changeset by Diana Korchmar, LMU München;
wenzelm
parents: 81084
diff changeset
   838
  }
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   839
}