From 273bc683b9e6514e31340c1e3789c43eb2e38dbd Mon Sep 17 00:00:00 2001 From: Wojciech Nawrocki Date: Sun, 31 Jul 2022 23:06:46 +0200 Subject: [PATCH] feat: widget tutorial and general RequestM lifts --- doc/images/widgets_caas.png | Bin 0 -> 25288 bytes doc/images/widgets_rubiks.png | Bin 0 -> 84070 bytes doc/widgets.md | 178 ++++++++++++++++++++++++++++---- src/Lean/Data/JsonRpc.lean | 2 +- src/Lean/Server/Requests.lean | 124 ++++++++++++---------- src/Lean/Server/Snapshots.lean | 19 ++++ src/Lean/Widget/UserWidget.lean | 15 +-- 7 files changed, 258 insertions(+), 80 deletions(-) create mode 100644 doc/images/widgets_caas.png create mode 100644 doc/images/widgets_rubiks.png diff --git a/doc/images/widgets_caas.png b/doc/images/widgets_caas.png new file mode 100644 index 0000000000000000000000000000000000000000..d6e09531e58aad9401d0886b2f0b6575c1d595f4 GIT binary patch literal 25288 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 literal 0 HcmV?d00001 diff --git a/doc/images/widgets_rubiks.png b/doc/images/widgets_rubiks.png new file mode 100644 index 0000000000000000000000000000000000000000..e0c0f1215dd505540a3305b949d70407abcb22c0 GIT binary patch literal 84070 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

dDyj3oB{|sn`2M@-e+h=W*Qi`TmyZzFo_wmp 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")])`. + +💡 NOTE: The RPC system presented below does not depend on JavaScript. However the primary use case +is the web-based infoview in VSCode. + +## Querying the Lean server + +The interesting functionality of user widgets comes from their ability to communicate with the Lean +server. To see this in action, let's implement a `#check` command as a web input form. This example +assumes some familiarity with React. + +The first thing we'll need is to create an *RPC method*. This is basically a Lean function callable +from widget code (possibly remotely over the internet). Our method will take in the `name : Name` +of a constant in the environment and return its type. By convention, we represent the input data +as a `structure`. Since it will be sent over from JavaScript, we need `FromJson` and `ToJson`. +We'll see below why the position field is needed. + +```lean +structure GetTypeParams where + /-- Name of a constant to get the type of. -/ + name : Name + /-- Position of our widget instance in the Lean file. -/ + pos : Lsp.Position + deriving FromJson, ToJson +``` + +After its arguments, we define the `getType` method. Every RPC method executes in the `RequestM` +monad and must return a `RequestTask α` where `α` is its "actual" return type. The `Task` is so +that requests can be handled concurrently. A first guess for `α` might be `Expr`. However, +expressions in general can be large objects which depend on an `Environment` and `LocalContext`. +Thus we cannot directly serialize an `Expr` and send it to the widget. Instead, there are two +options: +- One is to send a *reference* which points to an object residing on the server. From JavaScript's + point of view, references are entirely opaque, but they can be sent back to other RPC methods for + further processing. +- Two is to pretty-print the expression and send its textual representation called `CodeWithInfos`. + This representation contains extra data which the infoview uses for interactivity. We take this + strategy here. + +RPC methods execute in the context of a file, but not any particular `Environment` so they don't +know about the available `def`initions and `theorem`s. Thus, we need to pass in a position at which +we want to use the local `Environment`. This is why we store it in `GetTypeParams`. The `withWaitFindSnapAtPos` +method launches a concurrent computation whose job is to find such an `Environment` and a bit +more information for us, in the form of a `snap : Snapshot`. With this in hand, we can call +`MetaM` procedures to find out the type of `name` and pretty-print it. + +```lean +open Server RequestM in +@[serverRpcMethod] +def getType (params : GetTypeParams) : RequestM (RequestTask CodeWithInfos) := + withWaitFindSnapAtPos params.pos fun snap => do + runTermElabM snap do + let name ← resolveGlobalConstNoOverloadCore params.id + let some c ← Meta.getConst? name + | throwThe RequestError ⟨.invalidParams, s!"no constant named '{name}'"⟩ + Widget.ppExprTagged c.type +``` + +## Using infoview components + +Now that we have all we need on the server side, let's write the widget source. By importing +`@leanprover/infoview`, widgets can render UI components used to implement the infoview itself. +For example, the `` component displays expressions with `term : type` tooltips +as seen in the goal view. We will use it to implement our custom `#check` display. + +⚠️ WARNING: Like the other widget APIs, the infoview JS API is **unstable** and subject to breaking changes. + +The code below demonstrates useful parts of the API. To make RPC method calls, we use the `RpcContext`. +The `useAsync` helper packs the results of a call into a `status` enum, the returned `val`ue in case +the call was successful, and otherwise an `err`or. Based on the `status` we either display +an `InteractiveCode`, or `mapRpcError` the error in order to turn it into a readable message. + +```javascript +import * as React from 'react'; +const e = React.createElement; +import { RpcContext, InteractiveCode, useAsync, mapRpcError } from '@leanprover/infoview'; + +export default function(props) { + const rs = React.useContext(RpcContext) + const [name, setName] = React.useState('getType') + + const [status, val, err] = useAsync(() => + rs.call('getType', { id: name, pos: props.pos }), [name, rs, props.pos]) + + const type = status === 'fulfilled' ? val && e(InteractiveCode, {fmt: val}) + : status === 'rejected' ? e('p', null, mapRpcError(err).message) + : e('p', null, 'Loading..') + + const onChange = (event) => { setName(event.target.value) } + return e('div', null, + e('input', { value: name, onChange }), + ' : ', + type) } ``` -This JavaScript text must include `import * as React from "react"` in the imports and may not use JSX. -The default export of the sourcetext must be a React component whose props are an RPC encoding. -The React component may accept a props argument whose value will be determined for each particular widget instance (below). -Widget sources may import the `@lean4/infoview` package ([todo] publish on NPM) in order to use -components such as `InteractiveMessage` to display `MessageData` interactively. +Finally we can try out the widget. -## Using Lake to build your widgets +```lean +@[widget] +def checkWidget : UserWidgetDefinition where + name := "#check as a service" + javascript := "" -For larger projects, you can use Lake to create files that will be used as `widgetSource`. -To learn how to do this, please view the readme of the [WidgetsMinimal sample](https://github.com/leanprover/lean4-samples/tree/main/WidgetsMinimal) ([todo] merge sample). +#widget checkWidget .null +``` + +![`#check` as a service](images/widgets_caas.png) + +## Building widget sources + +While typing JavaScript inline is fine for a simple example, for real developments we want to use +packages from NPM, a proper build system, and JSX. Thus, most actual widget sources are built with +Lake and NPM. They consist of multiple files and may import libraries which don't work as ESModules +by default. On the other hand a widget source is just a single string. Readers familiar with web +development may already have guessed that to obtain such a string, we need a *bundler*. Two popular +choices are [`rollup.js`](https://rollupjs.org/guide/en/) and [`esbuild`](https://esbuild.github.io/). +If we go with `rollup.js`, to make a widget work with the infoview we need to: +- Set [`output.format`](https://rollupjs.org/guide/en/#outputformat) to `'es'`. +- [Externalize](https://rollupjs.org/guide/en/#external) `react`, `react-dom`, `@leanprover/infoview`. + These libraries are already loaded by the infoview so they should not be bundled. + +We provide a working build setup sample in [`Rubiks/rollup.config.js`](TODO merge). diff --git a/src/Lean/Data/JsonRpc.lean b/src/Lean/Data/JsonRpc.lean index dc42ce3611..066e354f54 100644 --- a/src/Lean/Data/JsonRpc.lean +++ b/src/Lean/Data/JsonRpc.lean @@ -75,7 +75,7 @@ instance : ToJson ErrorCode := ⟨fun | ErrorCode.contentModified => (-32801 : Int) | ErrorCode.requestCancelled => (-32800 : Int) | ErrorCode.rpcNeedsReconnect => (-32900 : Int) - | ErrorCode.workerExited => (-32901 : Int) + | ErrorCode.workerExited => (-32901 : Int) | ErrorCode.workerCrashed => (-32902 : Int)⟩ /-- Uses separate constructors for notifications and errors because client and server diff --git a/src/Lean/Server/Requests.lean b/src/Lean/Server/Requests.lean index 27bf2ed6c6..32d8d28e4d 100644 --- a/src/Lean/Server/Requests.lean +++ b/src/Lean/Server/Requests.lean @@ -8,23 +8,19 @@ import Lean.DeclarationRange import Lean.Data.Json import Lean.Data.Lsp +import Lean.Elab.Command import Lean.Server.FileSource import Lean.Server.FileWorker.Utils import Lean.Server.Rpc.Basic -/-! We maintain a global map of LSP request handlers. This allows user code such as plugins -to register its own handlers, for example to support ITP functionality such as goal state -visualization. - -For details of how to register one, see `registerLspRequestHandler`. -/ - namespace Lean.Server structure RequestError where code : JsonRpc.ErrorCode message : String + deriving Inhabited namespace RequestError open JsonRpc @@ -38,11 +34,13 @@ def methodNotFound (method : String) : RequestError := message := s!"No request handler found for '{method}'" } def internalError (message : String) : RequestError := - { code := ErrorCode.internalError, message := message } + { code := ErrorCode.internalError, message } -instance : Coe IO.Error RequestError where - coe e := { code := ErrorCode.internalError - message := toString e } +def ofException (e : Lean.Exception) : IO RequestError := + return internalError (← e.toMessageData.toString) + +def ofIoError (e : IO.Error) : RequestError := + internalError (toString e) def toLspResponseError (id : RequestID) (e : RequestError) : ResponseError Unit := { id := id @@ -65,31 +63,42 @@ structure RequestContext where initParams : Lsp.InitializeParams abbrev RequestTask α := Task (Except RequestError α) +abbrev RequestT m := ReaderT RequestContext <| ExceptT RequestError m /-- Workers execute request handlers in this monad. -/ abbrev RequestM := ReaderT RequestContext <| EIO RequestError -instance : Inhabited (RequestM α) := - ⟨throw ("executing Inhabited instance?!" : RequestError)⟩ - instance : MonadLift IO RequestM where - monadLift x := x.toEIO fun e => (e : RequestError) + monadLift x := do + match ← x.toBaseIO with + | .error e => throw <| RequestError.ofIoError e + | .ok v => return v + +instance : MonadLift (EIO Exception) RequestM where + monadLift x := do + match ← x.toBaseIO with + | .error e => throw <| ← RequestError.ofException e + | .ok v => return v namespace RequestM open FileWorker open Snapshots -def readDoc : RequestM EditableDocument := fun rc => +def readDoc [Monad m] [MonadReaderOf RequestContext m] : m EditableDocument := do + let rc ← readThe RequestContext return rc.doc -def asTask (t : RequestM α) : RequestM (RequestTask α) := fun rc => do - let t ← EIO.asTask <| t rc +def asTask (t : RequestM α) : RequestM (RequestTask α) := do + let rc ← readThe RequestContext + let t ← EIO.asTask <| t.run rc return t.map liftExcept -def mapTask (t : Task α) (f : α → RequestM β) : RequestM (RequestTask β) := fun rc => do +def mapTask (t : Task α) (f : α → RequestM β) : RequestM (RequestTask β) := do + let rc ← readThe RequestContext let t ← EIO.mapTask (f · rc) t return t.map liftExcept -def bindTask (t : Task α) (f : α → RequestM (RequestTask β)) : RequestM (RequestTask β) := fun rc => do +def bindTask (t : Task α) (f : α → RequestM (RequestTask β)) : RequestM (RequestTask β) := do + let rc ← readThe RequestContext EIO.bindTask t (f · rc) def waitFindSnapAux (notFoundX : RequestM α) (x : Snapshot → RequestM α) @@ -100,7 +109,7 @@ def waitFindSnapAux (notFoundX : RequestM α) (x : Snapshot → RequestM α) | Except.error FileWorker.ElabTaskError.aborted => throwThe RequestError RequestError.fileChanged | Except.error (FileWorker.ElabTaskError.ioError e) => - throw (e : RequestError) + throw (RequestError.ofIoError e) | Except.ok none => notFoundX | Except.ok (some snap) => x snap @@ -108,54 +117,63 @@ def waitFindSnapAux (notFoundX : RequestM α) (x : Snapshot → RequestM α) and if a matching snapshot was found executes `x` with it. If not found, the task executes `notFoundX`. -/ def withWaitFindSnap (doc : EditableDocument) (p : Snapshot → Bool) - (notFoundX : RequestM β) - (x : Snapshot → RequestM β) + (notFoundX : RequestM β) + (x : Snapshot → RequestM β) : RequestM (RequestTask β) := do + let doc ← readDoc let findTask ← doc.cmdSnaps.waitFind? p mapTask findTask <| waitFindSnapAux notFoundX x /-- See `withWaitFindSnap`. -/ def bindWaitFindSnap (doc : EditableDocument) (p : Snapshot → Bool) - (notFoundX : RequestM (RequestTask β)) - (x : Snapshot → RequestM (RequestTask β)) + (notFoundX : RequestM (RequestTask β)) + (x : Snapshot → RequestM (RequestTask β)) : RequestM (RequestTask β) := do + let doc ← readDoc let findTask ← doc.cmdSnaps.waitFind? p bindTask findTask <| waitFindSnapAux notFoundX x -/-- Helper for running an Rpc request at a particular snapshot. -/ +/-- Create a task which waits for the snapshot containing `lspPos` and executes `f` with it. +If no such snapshot exists, the request fails with an error. -/ def withWaitFindSnapAtPos - (lspPos : Lean.Lsp.Position) - (f : Snapshots.Snapshot → RequestM α): RequestM (RequestTask α) := do + (lspPos : Lsp.Position) + (f : Snapshots.Snapshot → RequestM α) + : RequestM (RequestTask α) := do let doc ← readDoc let pos := doc.meta.text.lspPosToUtf8Pos lspPos - withWaitFindSnap - doc - (fun s => s.endPos >= pos) - (notFoundX := throw <| RequestError.mk .invalidParams s!"no snapshot found at {lspPos}") - f + withWaitFindSnap doc (fun s => s.endPos >= pos) + (notFoundX := throw ⟨.invalidParams, s!"no snapshot found at {lspPos}"⟩) + (x := f) -open Lean Elab Command in -/-- Use the command state in the given snapshot to run a `CommandElabM`.-/ -def runCommand (snap : Snapshots.Snapshot) (c : CommandElabM α) : RequestM α := do - let r ← read - let ctx : Command.Context := { - fileName := r.doc.meta.uri, - fileMap := r.doc.meta.text, - tacticCache? := snap.tacticCache, - } - let ea ← c.run ctx |>.run snap.cmdState |> EIO.toIO' - match ea with - | Except.ok (a, _s) => return a - | Except.error ex => do - throw <| RequestError.internalError <|← ex.toMessageData.toString +open Elab.Command in +def runCommandElabM (snap : Snapshot) (c : RequestT CommandElabM α) : RequestM α := do + let rc ← readThe RequestContext + match ← snap.runCommandElabM rc.doc.meta (c.run rc) with + | .ok v => return v + | .error e => throw e -/-- Run a `CoreM` using the data in the given snapshot.-/ -def runCore (snap : Snapshots.Snapshot) (c : CoreM α) : RequestM α := - runCommand snap <| Lean.Elab.Command.liftCoreM c +def runCoreM (snap : Snapshot) (c : RequestT CoreM α) : RequestM α := do + let rc ← readThe RequestContext + match ← snap.runCoreM rc.doc.meta (c.run rc) with + | .ok v => return v + | .error e => throw e + +open Elab.Term in +def runTermElabM (snap : Snapshot) (c : RequestT TermElabM α) : RequestM α := do + let rc ← readThe RequestContext + match ← snap.runTermElabM rc.doc.meta (c.run rc) with + | .ok v => return v + | .error e => throw e end RequestM -/-! # The global request handlers table -/ +/-! # The global request handlers table + +We maintain a global map of LSP request handlers. This allows user code such as plugins +to register its own handlers, for example to support ITP functionality such as goal state +visualization. + +For details of how to register one, see `registerLspRequestHandler`. -/ section HandlerTable open Lsp @@ -215,7 +233,7 @@ def chainLspRequestHandler (method : String) let handle := fun j => do let t ← oldHandler.handle j let t := t.map fun x => x.bind fun j => FromJson.fromJson? j |>.mapError fun e => - IO.userError s!"Failed to parse original LSP response for `{method}` when chaining: {e}" + .internalError s!"Failed to parse original LSP response for `{method}` when chaining: {e}" let params ← liftExcept <| parseRequestParams paramType j let t ← handler params t pure <| t.map <| Except.map ToJson.toJson @@ -231,7 +249,9 @@ def routeLspRequest (method : String) (params : Json) : IO (Except RequestError def handleLspRequest (method : String) (params : Json) : RequestM (RequestTask Json) := do match (← lookupLspRequestHandler method) with - | none => throw (s!"internal server error: request '{method}' routed through watchdog but unknown in worker; are both using the same plugins?" : RequestError) + | none => + throw <| .internalError + s!"request '{method}' routed through watchdog but unknown in worker; are both using the same plugins?" | some rh => rh.handle params end HandlerTable diff --git a/src/Lean/Server/Snapshots.lean b/src/Lean/Server/Snapshots.lean index f3b6d77627..b157bd426a 100644 --- a/src/Lean/Server/Snapshots.lean +++ b/src/Lean/Server/Snapshots.lean @@ -71,6 +71,25 @@ def infoTree (s : Snapshot) : InfoTree := def isAtEnd (s : Snapshot) : Bool := Parser.isEOI s.stx || Parser.isExitCommand s.stx +open Command in +/-- Use the command state in the given snapshot to run a `CommandElabM`.-/ +def runCommandElabM (snap : Snapshot) (meta : DocumentMeta) (c : CommandElabM α) : EIO Exception α := do + let ctx : Command.Context := { + cmdPos := snap.beginPos, + fileName := meta.uri, + fileMap := meta.text, + tacticCache? := snap.tacticCache, + } + c.run ctx |>.run' snap.cmdState + +/-- Run a `CoreM` computation using the data in the given snapshot.-/ +def runCoreM (snap : Snapshot) (meta : DocumentMeta) (c : CoreM α) : EIO Exception α := + snap.runCommandElabM meta <| Command.liftCoreM c + +/-- Run a `TermElabM` computation using the data in the given snapshot.-/ +def runTermElabM (snap : Snapshot) (meta : DocumentMeta) (c : TermElabM α) : EIO Exception α := + snap.runCommandElabM meta <| Command.liftTermElabM none c + end Snapshot /-- Parses the next command occurring after the given snapshot diff --git a/src/Lean/Widget/UserWidget.lean b/src/Lean/Widget/UserWidget.lean index b99b903719..6a193cbb84 100644 --- a/src/Lean/Widget/UserWidget.lean +++ b/src/Lean/Widget/UserWidget.lean @@ -95,16 +95,17 @@ structure GetWidgetSourceParams where pos : Lean.Lsp.Position deriving ToJson, FromJson -open Lean.Server Lean RequestM in +open Server in @[serverRpcMethod] def getWidgetSource (args : GetWidgetSourceParams) : RequestM (RequestTask WidgetSource) := RequestM.withWaitFindSnapAtPos args.pos fun snap => do - let env := snap.cmdState.env - if let some id := widgetSourceRegistry.getState env |>.find? args.hash then - let d ← Lean.Server.RequestM.runCore snap <| getUserWidgetDefinition id - return {sourcetext := d.javascript} - else - throw <| RequestError.mk .invalidParams s!"No registered user-widget with hash {args.hash}" + RequestM.runCoreM snap do + let env ← getEnv + if let some id := widgetSourceRegistry.getState env |>.find? args.hash then + let d ← getUserWidgetDefinition id + return {sourcetext := d.javascript} + else + throwThe RequestError ⟨.invalidParams, s!"No registered user-widget with hash {args.hash}"⟩ open Lean Elab