chore: drop RPC wrappers for now

This commit is contained in:
Wojciech Nawrocki 2021-07-13 13:56:18 -07:00 committed by Sebastian Ullrich
parent b3316fd9c2
commit d97e1b91ea
2 changed files with 0 additions and 117 deletions

View file

@ -69,14 +69,6 @@ structure PlainTermGoal where
/-- An object which RPC clients can refer to without marshalling. -/
abbrev RpcRef := USize
inductive RpcValue where
| json : Json → RpcValue
| ref : RpcRef → RpcValue
deriving FromJson, ToJson, Inhabited
inductive RpcValueKind where
| json | ref
deriving FromJson, ToJson
/-- Initialize an RPC session at the given file's worker. -/
structure RpcInitializeParams where

View file

@ -139,112 +139,3 @@ def registerRpcCallHandler (method : Name)
rpcProcedures.modify fun ps => ps.insert method ⟨wrapper⟩
end Lean.Server
#exit -- TODO wrappers below
namespace Lean.Server.Rpc
open Lsp (RpcValueKind)
/-- Like `RpcValue`, but with decoded `ref` IDs. -/
inductive RpcInput where
| ref : IO.UntypedRef → RpcInput
| json : Json → RpcInput
deriving Inhabited
open RpcInput
private unsafe def RpcSession.decodePtrOrJson [Inhabited α] [FromJson α] : RpcInput → IO α
| ref r => r.getAsUnsafe α
| json j => match @fromJson? α _ j with
| Except.error e => throwThe IO.Error e
| Except.ok v => v
private unsafe def RpcSession.decodePtr [Inhabited α] : RpcInput → IO α
| ref r => r.getAsUnsafe α
| json j => throwThe IO.Error "cannot decode, no FromJson instance"
private def toRpcWrapperName (funcNm : Name) : Name :=
Name.mkStr funcNm "__rpc"
open Elab Meta in
private def wrapRpcFunc (funcId : Syntax) : Command.CommandElabM Unit := do
let env ← getEnv
let funcNm := funcId.getId
match env.find? funcNm with
| none => throwError "unknown constant '{funcNm}'"
| some info =>
let cmds ← Command.liftTermElabM none do
forallTelescopeReducing info.type fun args retT => do
let mkFreshFVarName (arg : Expr) : TermElabM Name := do
let localDecl ← getLocalDecl arg.fvarId!
mkFreshUserName localDecl.userName.eraseMacroScopes
let hasInstance (cl : Name) (tp : Expr) : TermElabM Bool := do
let clTp ←
try mkAppM cl #[tp]
catch _ => throwError "failed to construct '{cl} {tp}'"
let inst? ← trySynthInstance clTp
inst? matches LOption.some _
-- (args : Array RpcInput) (retKind : RpcValueKind)
let rpcArgsId ← mkIdent <$> mkFreshUserName `args
let retKindArgId ← mkIdent <$> mkFreshUserName `retKind
let mut argTNames := #[]
let mut letIds := #[]
let mut decoders := #[]
let mut i := 0 -- enumerate? :(
for arg in args do
let argName ← mkFreshFVarName arg
let argT ← inferType arg
let some argTName ← argT.constName?
| throwError "non-constant type '{argT}'"
argTNames := argTNames.push <| mkIdent argTName
letIds := letIds.push <| mkIdent argName
-- a term to decode the `i`th argument
-- TODO add [FromJson α] for polymorphic arguments
let decoder ←
if (← hasInstance ``FromJson argT) then
`(Parser.Term.doExpr| RpcSession.decodePtrOrJson $rpcArgsId:ident[$(quote i)] )
else
`(Parser.Term.doExpr| RpcSession.decodePtr $rpcArgsId:ident[$(quote i)] )
decoders := decoders.push decoder
i := i+1
let rpcUnsafeId := mkIdent <| Name.mkStr funcNm "__rpc_unsafe"
let mkRetJson ←
if (← hasInstance ``ToJson retT) then
`(Parser.Term.doSeqIndent| pure <| RpcInput.json <| toJson <| @$funcId:ident $letIds*)
else
`(Parser.Term.doSeqIndent| throwThe IO.Error "cannot encode, no ToJson instance")
let cmd₁ ← `(
private unsafe def $rpcUnsafeId:ident ($rpcArgsId : Array RpcInput) ($retKindArgId : RpcValueKind)
: IO RpcInput := do
$[let $letIds:ident : $argTNames:ident ← $decoders]*
let ret ← @$funcId:ident $letIds*
let retJson ← match $retKindArgId:ident with
| RpcValueKind.ref => RpcInput.ref <$> IO.UntypedRef.mkRefUnsafe ret
| RpcValueKind.json => $mkRetJson
return retJson
)
let rpcId := mkIdent <| toRpcWrapperName funcNm
let cmd₂ ← `(
@[implementedBy $rpcUnsafeId:ident]
private constant $rpcId:ident ($rpcArgsId : Array RpcInput) ($retKindArgId : RpcValueKind)
: IO RpcInput
)
return #[cmd₁, cmd₂]
cmds.forM Command.elabCommand
end Lean.Server.Rpc
open Lean Elab Meta in
elab "register_rpc_func" funcId:ident : command => do
Server.Rpc.wrapRpcFunc funcId
let funcNm := funcId.getId
let wrapperId := mkIdent <| Server.Rpc.toRpcWrapperName funcNm
let cmd ← `(
initialize Lean.Server.Rpc.registerRpcProcedure $(quote funcNm) ⟨$wrapperId:ident⟩)
Command.elabCommand cmd