Allows LSP clients to make Remote Procedure Calls to the server.
The single use case for these is to allow the infoview UI to refer to and manipulate heavy-weight
objects residing on the server. It would be inefficient to serialize these into JSON and send over.
For example, the client can format an Expr
without transporting the whole Environment
.
All RPC requests are relative to an open file and an RPC session for that file. The client must
first connect to the session using $/lean/rpc/connect
.
An object which RPC clients can refer to without marshalling.
The language server may serve the same RpcRef
multiple times and maintains a reference count
to track how many times it has served the reference.
If clients want to release the object associated with an RpcRef
,
they must release the reference as many times as they have received it from the server.
- p : USize
Instances For
Equations
- Lean.Lsp.instBEqRpcRef = { beq := Lean.Lsp.beqRpcRef✝ }
Equations
Equations
- Lean.Lsp.instFromJsonRpcRef = { fromJson? := Lean.Lsp.fromJsonRpcRef✝ }
Equations
- Lean.Lsp.instToJsonRpcRef = { toJson := Lean.Lsp.toJsonRpcRef✝ }
Equations
- Lean.Lsp.instToStringRpcRef = { toString := fun (r : Lean.Lsp.RpcRef) => toString r.p }
Marks values to be encoded as opaque references in RPC packets.
Two WithRpcRef
s with the same id
will yield the same client-side reference.
See also the docstring for RpcEncodable
.
- mk' :: (
- val : α
- id : USize
- )
Instances For
Creates an WithRpcRef
instance with a unique id
.
As long as the client holds at least one reference to this WithRpcRef
,
serving it again will yield the same client-side reference.
Thus, when used as React deps,
client-side references can help preserve UI state across RPC requests.
Equations
- Lean.Server.WithRpcRef.mk val = do let id ← ST.Ref.modifyGet Lean.Server.freshWithRpcRefId fun (id : USize) => (id, id + 1) pure { val := val, id := id }
Instances For
- aliveRefs : PersistentHashMap Lsp.RpcRef ReferencedObject
Objects that are being kept alive for the RPC client, together with their type names, mapped to by their RPC reference.
- refsById : PersistentHashMap USize Lsp.RpcRef
- nextRef : USize
Value to use for the next fresh
RpcRef
, monotonically increasing.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
RpcEncodable α
means that α
can be deserialized from and serialized into JSON
for the purpose of receiving arguments to and sending return values from
Remote Procedure Calls (RPCs).
Any type with FromJson
and ToJson
instances is RpcEncodable
.
Furthermore, types that do not have these instances may still be RpcEncodable
.
Use deriving RpcEncodable
to automatically derive instances for such types.
This occurs when α
contains data that should not or cannot be serialized:
for instance, heavy objects such as Lean.Environment
, or closures.
For such data, we use the WithRpcRef
marker.
Note that for WithRpcRef α
to be RpcEncodable
,
α
must have a TypeName
instance
On the server side, WithRpcRef α
is a structure containing a value of type α
and an associated
id
.
On the client side, it is an opaque reference of (structural) type Lsp.RpcRef
.
Thus, WithRpcRef α
is cheap to transmit over the network
but may only be accessed on the server side.
In practice, it is used by the client to pass data
between various RPC methods provided by the server.
Two WithRpcRef
s with the same id
will yield the same client-side reference.
- rpcEncode : α → StateM RpcObjectStore Json
Instances
Equations
- Lean.Server.instRpcEncodableOfFromJsonOfToJson = { rpcEncode := fun (a : α) => pure (Lean.toJson a), rpcDecode := fun (j : Lean.Json) => ofExcept (Lean.fromJson? j) }
Equations
- One or more equations did not get rendered due to their size.
Equations
- One or more equations did not get rendered due to their size.
Equations
- One or more equations did not get rendered due to their size.
Equations
- One or more equations did not get rendered due to their size.
Equations
- One or more equations did not get rendered due to their size.
Equations
Instances For
Equations
- Lean.Server.instRpcEncodableWithRpcRefOfTypeName.rpcDecode j = do let __do_lift ← liftM (Lean.fromJson? j) Lean.Server.rpcGetRef α __do_lift