From b7a3e8cfa872246935bacd774e2fb873de8d4b54 Mon Sep 17 00:00:00 2001 From: Martin Duhem Date: Mon, 19 Nov 2018 10:54:29 +0100 Subject: [PATCH 1/2] Fix #5380: Add documentation for worksheet mode --- docs/docs/usage/ide-support.md | 3 +- docs/docs/usage/worksheet-mode.md | 116 ++++++++++++++++++++++ docs/images/worksheets/worksheet-help.png | Bin 0 -> 10540 bytes docs/images/worksheets/worksheet-run.png | Bin 0 -> 19641 bytes docs/sidebar.yml | 2 + 5 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 docs/docs/usage/worksheet-mode.md create mode 100644 docs/images/worksheets/worksheet-help.png create mode 100644 docs/images/worksheets/worksheet-run.png diff --git a/docs/docs/usage/ide-support.md b/docs/docs/usage/ide-support.md index 0884736fb031..05917462f5a1 100644 --- a/docs/docs/usage/ide-support.md +++ b/docs/docs/usage/ide-support.md @@ -34,6 +34,8 @@ Status - Type information on hover - Go to definition (in the current project) - Find all references +- Documentation on hover +- [Worksheet mode](worksheet-mode.html) ## Partially working features: - Completion @@ -41,7 +43,6 @@ Status - Go to definition in external projects ## Unimplemented features: -- Documentation on hover - Formatting code (requires integrating with scalafmt) - Quick fixes (probably by integrating with scalafix) diff --git a/docs/docs/usage/worksheet-mode.md b/docs/docs/usage/worksheet-mode.md new file mode 100644 index 000000000000..89a85eb49f37 --- /dev/null +++ b/docs/docs/usage/worksheet-mode.md @@ -0,0 +1,116 @@ +--- +layout: doc-page +title: "Worksheet mode with Dotty IDE" +--- + +A worksheet is a Scala file that is evaluated on save, and the result of each +expression is shown in a column to the right of your program. Worksheets are +like a REPL session on steroids, and enjoy 1st class editor support: completion, +hyperlinking, interactive errors-as-you-type, etc. Worksheet use the extension +`.sc`. + +How to use the worksheets +========================= +The only supported client for the Worksheet mode is [Visual Studio +Code](https://code.visualstudio.com/). + +To use the worksheets, start Dotty IDE by [following the +instruction]("./ide-support.html") and create a new file `MyWorksheet.sc` and +write some code: + +```scala +val xyz = 123 +println("Hello, worksheets!") +456 + xyz +``` + +On top of the buffer, the message `Run this worksheet` appears. Click it to +evaluate the code of the worksheet. Each line of output is printed on the right +of the expression that produced it. The worksheets run with the classes of your +project and its dependencies on their classpath. + +![](../../images/worksheets/worksheet-run.png "Run worksheet") + +Note that the worksheet are fully integrated with the rest of Dotty IDE: While +typing, errors are shown, completions are suggested, and you can use all the +other features of Dotty IDE such as go to definition, find all references, etc. + +![](../../images/worksheets/worksheet-help.png "IDE features in the worksheet") + +Implementation details +====================== + +In overview, the worksheets extend the Language Server Protocol and rely on the +Dotty REPL to evaluate code. + +## Evaluation +Each of the individual expressions and statements of the worksheet is extracted +and passed to the Dotty REPL. After the REPL has finished evaluating one unit of +input, it emits a special delimiter that indicates the end of the output for +this input. (See `dotty.tools.languageserver.worksheet.InputStreamConsumer`) + +This process continues until all input has been evaluated. + +The Dotty REPL is run in a separate JVM. The `Evaluator` (see +`dotty.tools.languageserver.worksheet.Evaluator`) will re-use a JVM if the +configuration of the project hasn't changed. + +## Communication with the client +The worksheets extend the Language Server Protocol and add one request and one +notification. + +### Run worksheet request +The worksheet run request is sent from the client to the server to request that +the server runs a given worksheet and streams the result. + +*Request:* + + - method: `worksheet/run` + - params: `WorksheetRunParams` defined as follows: + ```typescript + interface WorksheetRunParams { + /** + * The worksheet to evaluate. + */ + textDocument: VersionedTextDocumentIdentifier; + } + ``` + +*Response:* + + - result: `WorksheetRunResult` defined as follows: + ```typescript + interface WorksheetRunResult { + /** + * Indicates whether evaluation was successful. + */ + success: boolean; + } + ``` + +### Worksheet output notification +The worksheet output notification is sent from the server to the client to +indicate that worksheet execution has produced some output. + +*Notification:* + + - method: `worksheet/publishOutput` + - params: `WorksheetRunOutput` defined as follows: + ```typescript + interface WorksheetRunOutput { + /** + * The worksheet that produced this output. + */ + textDocument: VersionedTextDocumentIdentifier; + + /** + * The line number of the expression that produced this output. + */ + line: int; + + /** + * The output that has been produced. + */ + content: string; + } + ``` diff --git a/docs/images/worksheets/worksheet-help.png b/docs/images/worksheets/worksheet-help.png new file mode 100644 index 0000000000000000000000000000000000000000..1aee216e7c117aca0fc61a4952a6cef17bec8802 GIT binary patch literal 10540 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 literal 0 HcmV?d00001 diff --git a/docs/images/worksheets/worksheet-run.png b/docs/images/worksheets/worksheet-run.png new file mode 100644 index 0000000000000000000000000000000000000000..d1aa99bab2a85b9f487d92a30d12e79066ccb6fb GIT binary patch literal 19641 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 literal 0 HcmV?d00001 diff --git a/docs/sidebar.yml b/docs/sidebar.yml index 5dfa6d052b2e..1d16c221a7b8 100644 --- a/docs/sidebar.yml +++ b/docs/sidebar.yml @@ -9,6 +9,8 @@ sidebar: url: docs/usage/sbt-projects.html - title: IDE support for Dotty url: docs/usage/ide-support.html + - title: Worksheet mode in Dotty IDE + url: docs/usage/worksheet-mode.html - title: cbt-projects url: docs/usage/cbt-projects.html - title: Dottydoc From 1d031dd746bedffcbefc7757acb0ad3214a55740 Mon Sep 17 00:00:00 2001 From: Martin Duhem Date: Tue, 20 Nov 2018 11:02:23 +0100 Subject: [PATCH 2/2] Address review comments --- .../worksheet-mode-implementation-details.md | 79 +++++++++++++++++ docs/docs/usage/worksheet-mode.md | 82 ++---------------- docs/images/worksheets/config-autorun.png | Bin 0 -> 34396 bytes 3 files changed, 87 insertions(+), 74 deletions(-) create mode 100644 docs/docs/usage/worksheet-mode-implementation-details.md create mode 100644 docs/images/worksheets/config-autorun.png diff --git a/docs/docs/usage/worksheet-mode-implementation-details.md b/docs/docs/usage/worksheet-mode-implementation-details.md new file mode 100644 index 000000000000..38664292c4fe --- /dev/null +++ b/docs/docs/usage/worksheet-mode-implementation-details.md @@ -0,0 +1,79 @@ +--- +layout: doc-page +title: "Worksheet Mode - Implementation details" +--- + +In brief, the worksheets extend the Language Server Protocol and rely on the +Dotty REPL to evaluate code. + +## Evaluation +Each of the individual expressions and statements of the worksheet is extracted +and passed to the Dotty REPL. After the REPL has finished evaluating one unit of +input, it emits a special delimiter that indicates the end of the output for +this input. (See `dotty.tools.languageserver.worksheet.InputStreamConsumer`) + +This process continues until all input has been evaluated. + +The Dotty REPL is run in a separate JVM. The `Evaluator` (see +`dotty.tools.languageserver.worksheet.Evaluator`) will re-use a JVM if the +configuration of the project hasn't changed. + +## Communication with the client +The worksheets extend the Language Server Protocol and add one request and one +notification. + +### Run worksheet request +The worksheet run request is sent from the client to the server to request that +the server runs a given worksheet and streams the result. + +*Request:* + + - method: `worksheet/run` + - params: `WorksheetRunParams` defined as follows: + ```typescript + interface WorksheetRunParams { + /** + * The worksheet to evaluate. + */ + textDocument: VersionedTextDocumentIdentifier; + } + ``` + +*Response:* + + - result: `WorksheetRunResult` defined as follows: + ```typescript + interface WorksheetRunResult { + /** + * Indicates whether evaluation was successful. + */ + success: boolean; + } + ``` + +### Worksheet output notification +The worksheet output notification is sent from the server to the client to +indicate that worksheet execution has produced some output. + +*Notification:* + + - method: `worksheet/publishOutput` + - params: `WorksheetRunOutput` defined as follows: + ```typescript + interface WorksheetRunOutput { + /** + * The worksheet that produced this output. + */ + textDocument: VersionedTextDocumentIdentifier; + + /** + * The line number of the expression that produced this output. + */ + line: int; + + /** + * The output that has been produced. + */ + content: string; + } + ``` diff --git a/docs/docs/usage/worksheet-mode.md b/docs/docs/usage/worksheet-mode.md index 89a85eb49f37..13793041404d 100644 --- a/docs/docs/usage/worksheet-mode.md +++ b/docs/docs/usage/worksheet-mode.md @@ -31,6 +31,11 @@ project and its dependencies on their classpath. ![](../../images/worksheets/worksheet-run.png "Run worksheet") +By default, the worksheets are also run when the file is saved. This can be +configured in VSCode preferences: + +![](../../images/worksheets/config-autorun.png "Configure run on save") + Note that the worksheet are fully integrated with the rest of Dotty IDE: While typing, errors are shown, completions are suggested, and you can use all the other features of Dotty IDE such as go to definition, find all references, etc. @@ -40,77 +45,6 @@ other features of Dotty IDE such as go to definition, find all references, etc. Implementation details ====================== -In overview, the worksheets extend the Language Server Protocol and rely on the -Dotty REPL to evaluate code. - -## Evaluation -Each of the individual expressions and statements of the worksheet is extracted -and passed to the Dotty REPL. After the REPL has finished evaluating one unit of -input, it emits a special delimiter that indicates the end of the output for -this input. (See `dotty.tools.languageserver.worksheet.InputStreamConsumer`) - -This process continues until all input has been evaluated. - -The Dotty REPL is run in a separate JVM. The `Evaluator` (see -`dotty.tools.languageserver.worksheet.Evaluator`) will re-use a JVM if the -configuration of the project hasn't changed. - -## Communication with the client -The worksheets extend the Language Server Protocol and add one request and one -notification. - -### Run worksheet request -The worksheet run request is sent from the client to the server to request that -the server runs a given worksheet and streams the result. - -*Request:* - - - method: `worksheet/run` - - params: `WorksheetRunParams` defined as follows: - ```typescript - interface WorksheetRunParams { - /** - * The worksheet to evaluate. - */ - textDocument: VersionedTextDocumentIdentifier; - } - ``` - -*Response:* - - - result: `WorksheetRunResult` defined as follows: - ```typescript - interface WorksheetRunResult { - /** - * Indicates whether evaluation was successful. - */ - success: boolean; - } - ``` - -### Worksheet output notification -The worksheet output notification is sent from the server to the client to -indicate that worksheet execution has produced some output. - -*Notification:* - - - method: `worksheet/publishOutput` - - params: `WorksheetRunOutput` defined as follows: - ```typescript - interface WorksheetRunOutput { - /** - * The worksheet that produced this output. - */ - textDocument: VersionedTextDocumentIdentifier; - - /** - * The line number of the expression that produced this output. - */ - line: int; - - /** - * The output that has been produced. - */ - content: string; - } - ``` +The implementation details of the worksheet mode and the information necessary to add support for +other clients are available in [Worksheet mode - Implementation +details](worksheet-mode-implementation-details.html). diff --git a/docs/images/worksheets/config-autorun.png b/docs/images/worksheets/config-autorun.png new file mode 100644 index 0000000000000000000000000000000000000000..510bb3f0f86b9c3d1d0707fd42df5c88988fe58e GIT binary patch literal 34396 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

YA;1$AnKSw?jmH1SFUB0F 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 pLENS3;7sz~{