|
| 1 | +# Implementing a BSP server |
| 2 | + |
| 3 | +SourceKit-LSP can connect to any build system to provide semantic functionality through the [Build Server Protocol (BSP)](https://build-server-protocol.github.io). This is a short guide of the requests and notifications that a BSP server for SourceKit-LSP should implement. For more detailed information, refer to the [BSP spec](https://build-server-protocol.github.io/docs/specification) and the [SourceKit-LSP BSP Extensions](BSP%20Extensions.md). This document just references BSP methods and properties and those specification documents contain their documentation. |
| 4 | + |
| 5 | +## Required lifecycle methods |
| 6 | + |
| 7 | +In order to be launched and shut down successfully, the BSP server must implement the following methods |
| 8 | + |
| 9 | +- `build/initialize` |
| 10 | +- `build/initialized` |
| 11 | +- `build/shutdown` |
| 12 | +- `build/exit` |
| 13 | + |
| 14 | +The `build/initialize` response must have `dataKind: "sourceKit"` and `data.sourceKitOptionsProvider: true`. In order to provide global code navigation features such as call hierarchy and global rename, the build server must set `data.indexDatabasePath` and `data.indexStorePath`. |
| 15 | + |
| 16 | +## Retrieving build settings |
| 17 | + |
| 18 | +In order to provide semantic functionality for source files, the BSP server must provide the following methods: |
| 19 | + |
| 20 | +- `workspace/buildTargets` |
| 21 | +- `buildTarget/sources` |
| 22 | +- `textDocument/sourceKitOptions` |
| 23 | +- `buildTarget/didChange` |
| 24 | +- `workspace/waitForBuildSystemUpdates` |
| 25 | + |
| 26 | +If the build system does not have a notion of targets, eg. because it provides build settings from a file akin to a JSON compilation database, it may use a single dummy target for all source files or a separate target for each source file, either choice will work. |
| 27 | + |
| 28 | +If the build system loads the entire build graph during initialization, it may immediately return from `workspace/waitForBuildSystemUpdates`. |
| 29 | + |
| 30 | + |
| 31 | +## Supporting background indexing |
| 32 | + |
| 33 | +To support background indexing, the build system must set `data.prepareProvider: true` in the `build/initialize` response and implement the `buildTarget/prepare` method. |
| 34 | + |
| 35 | +## Optional methods |
| 36 | + |
| 37 | +The following methods are not necessary to implement for SourceKit-LSP to work but might help with the implementation of the build server. |
| 38 | + |
| 39 | +- `build/logMessage` |
| 40 | +- `window/workDoneProgress/create` |
| 41 | +- `workspace/didChangeWatchedFiles` |
| 42 | +- `$/progress` |
| 43 | + |
| 44 | +## Build server discovery |
| 45 | + |
| 46 | +To make your build server discoverable, create a [BSP connection specification](https://build-server-protocol.github.io/docs/overview/server-discovery) file named `buildServer.json` in the root of your project. |
0 commit comments