From 8c82d2aa5ec0491e5d09138907797784e0bd1116 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Fri, 24 Jan 2020 17:25:00 +0100 Subject: [PATCH 1/2] Bring LSIF into the web page --- _data/specifications.yml | 8 +- _layouts/specifications.html | 30 +- .../lsif/0.4.0/img/definitionResult.png | Bin 0 -> 59343 bytes .../lsif/0.4.0/img/foldingRange.png | Bin 0 -> 11616 bytes .../lsif/0.4.0/img/hoverResult.png | Bin 0 -> 13606 bytes .../lsif/0.4.0/img/referenceResult.png | Bin 0 -> 55741 bytes _specifications/lsif/0.4.0/img/resultSet.png | Bin 0 -> 50539 bytes _specifications/lsif/0.4.0/implementation.md | 114 ++ _specifications/lsif/0.4.0/specification.md | 1075 +++++++++++++++++ 9 files changed, 1216 insertions(+), 11 deletions(-) create mode 100644 _specifications/lsif/0.4.0/img/definitionResult.png create mode 100644 _specifications/lsif/0.4.0/img/foldingRange.png create mode 100644 _specifications/lsif/0.4.0/img/hoverResult.png create mode 100644 _specifications/lsif/0.4.0/img/referenceResult.png create mode 100644 _specifications/lsif/0.4.0/img/resultSet.png create mode 100644 _specifications/lsif/0.4.0/implementation.md create mode 100644 _specifications/lsif/0.4.0/specification.md diff --git a/_data/specifications.yml b/_data/specifications.yml index 846fd32ad..ba8c5bdd1 100644 --- a/_data/specifications.yml +++ b/_data/specifications.yml @@ -1,6 +1,12 @@ -- title: Specifications Overview +- title: LSP + anchor: lsp children: - title: 3.15 (Current) url: /specifications/specification-current - title: 3.14 (Previous) url: /specifications/specification-3-14 +- title: LSIF + anchor: lsif + children: + - title: 0.4.0 + url: /specifications/lsif/0.4.0/specification diff --git a/_layouts/specifications.html b/_layouts/specifications.html index 7b8538f53..8b4282b66 100644 --- a/_layouts/specifications.html +++ b/_layouts/specifications.html @@ -5,20 +5,30 @@
- {% for specs in site.data.specifications %}
-
{% endfor %} - +
- {% endfor %}
+
{{ content }}
@@ -29,7 +39,7 @@
{% for toc-l2 in toc-l1.children %}
- + {{ toc-l2.title }}
diff --git a/_specifications/lsif/0.4.0/img/definitionResult.png b/_specifications/lsif/0.4.0/img/definitionResult.png new file mode 100644 index 0000000000000000000000000000000000000000..47c49414e57921d071b3a809f56c7057bcc5038a GIT binary patch literal 59343 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 P4iFtpLyc0zP0arQ1YpX2 literal 0 HcmV?d00001 diff --git a/_specifications/lsif/0.4.0/img/foldingRange.png b/_specifications/lsif/0.4.0/img/foldingRange.png new file mode 100644 index 0000000000000000000000000000000000000000..a5ad00176be08ce938f254cb9b6f1418fb958848 GIT binary patch literal 11616 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 Mr9VqmNf-tF4~$Reu>b%7 literal 0 HcmV?d00001 diff --git a/_specifications/lsif/0.4.0/img/hoverResult.png b/_specifications/lsif/0.4.0/img/hoverResult.png new file mode 100644 index 0000000000000000000000000000000000000000..33705d1007afe740b4a43db17ee7e3f336454206 GIT binary patch literal 13606 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 Are we missing an implementation? File a new issue on GitHub to add it here. + +## LSIF exporter skeleton + +As [detailed in the spec](specification.md#project-exports-and-external-imports), the LSIF exporter consists of two tools: the index exporter and the package linker. + +### Index exporter + +The index exporter generates an LSIF dump for a workspace by traversing through source files and storing LSP responses. For TypeScript/JavaScript, [`lsif-tsc`](https://github.com/Microsoft/lsif-node/tree/master/tsc) is the index exporter. + +### Package linker + +The package linker converts the LSIF output of the index exporter into a global friendly index. By using package metadata, export `moniker` vertices are linked to packages available on a registry. For instance, the `observable` export from the mobx dependency is linked to the mobx dependency available on NPM. The package metadata is used to create the `packageInformation` vertices that reference external packages. + +For TypeScript/JavaScript, [`lsif-npm`](https://github.com/Microsoft/lsif-node/tree/master/npm) is the package manager linker for NPM. + +## Testing and validation + +### LSIF validation utility + +The [`lsif-util`](https://github.com/microsoft/lsif-node/tree/master/util) tool can validate your generated LSIF output. Additionally, the tool can also be used to search the output and visualize via Graphviz. + +### VS Code LSIF extension + +With the [LSIF extension for VS Code](https://github.com/Microsoft/vscode-lsif-extension), you can dogfood an LSIF index to power navigation inside VS Code. + +## Performance + +Generating LSIF for a project is expected to take roughly the same time as compilation. + +A primitive LSIF index exporter loops over source files, and for every symbol encountered, queries the language server for responses to LSP requests. With this approach, computing references can become very expensive: references are computed multiple times for the same symbol spread over files. This can be inefficient, depending on the language server implementation. + +This approach can optimized by computing references only once for a symbol spread over files. The approach taken by the [lsif-tsc](https://github.com/Microsoft/lsif-node) tool is outlined below: + +- Parse the project configuration to get source files +- Loop over files, and run the following on the AST of each file + - When you encounter a symbol, find out the binding of the symbol (declaration) + - If the binding is local to the file, create a referencesResult data structure and add symbols with the same binding. When the parsing of the file is complete, we know that the referenceResult is complete and can be emitted. + - If the binding is not local, keep result set in memory, and keep parsing other files. + +## Recommended checklist + +We have seen the following patterns work well in existing implementations. + +### Method checklist + +For an ideal integration with Rich Code Navigation, the following methods are required. For some languages, methods such as `textDocument/declaration` might not be applicable. + +- [ ] `textDocument/hover` +- [ ] `textDocument/definition` +- [ ] `textDocument/references` +- [ ] `textDocument/implementation` +- [ ] `textDocument/declaration` +- [ ] `textDocument/typeDefinition` +- [ ] `textDocument/diagnostic` +- [ ] Cross-repo navigation for dependencies + +### Cross-platform + +If the LSIF exporter does not work across platforms (Windows, Linux, Mac), platform dependencies should be called out. + +### Output format + +The LSIF exporter is expected to implement the [line-delimited JSON](https://en.wikipedia.org/wiki/JSON_streaming#Line-delimited_JSON) (also known as [JSON lines](http://jsonlines.org/)) output format: series of JSON objects (vertex or edge) separated by newline. Since JSON lines is suitable for streaming output and works better for larger repos, it is preferred over a JSON array output. + +If an LSIF consumer requires a valid JSON array as input (for example, the VS Code LSIF extension), the JSON lines output can be converted into a JSON array by piping into a conversion tool. + +``` +cat lsif.jsonl | sed '1s/^/[/;$!s/$/,/;$s/$/]/' +``` + +If the LSIF exporter needs to log additional output, it is recommended to use `stderr`, since `stdout` is reserved for JSON line output. + +### Project configuration + +The LSIF index exporter can expose a flag to specify the root of the project directory. For example, the [TypeScript implementation](https://github.com/Microsoft/lsif-node) exposes the `--project` (`-p`) to specify the root of the tsconfig.json file. + +``` +lsif-tsc --project ./frontend/tsconfig.json +``` + +### Error behavior + +The LSIF tool is expected to signal for error conditions, with a numeric exit code. A successful execution returns a 0, whereas error conditions (unable to build project, unable to find project file) return 1. + +### Required documentation + +Since LSIF is an evolving protocol, it is critical to document the [protocol version](specification.md#changelog) supported by the exporter. + +## Support + +Feel free to reach out to us for questions by raising an issue on GitHub. diff --git a/_specifications/lsif/0.4.0/specification.md b/_specifications/lsif/0.4.0/specification.md new file mode 100644 index 000000000..d990d0cab --- /dev/null +++ b/_specifications/lsif/0.4.0/specification.md @@ -0,0 +1,1075 @@ +--- +title: LSIF Specification +shortTitle: 0.4.0 pre-release +layout: specifications +sectionid: lsif-0-4-0 +toc: lsif-0-4-0-toc +index: 2 +--- + +# Under Construction + +The 0.4.0 version of LSIF is currently under construction. + +## Language Server Index Format + +The purpose of the Language Server Index Format (LSIF) is it to define a standard format for language servers or other programming tools to dump their knowledge about a workspace. This dump can later be used to answer language server [LSP](https://microsoft.github.io/language-server-protocol/) requests for the same workspace without running the language server itself. Since much of the information would be invalidated by a change to the workspace, the dumped information typically excludes requests used when mutating a document. So, for example, the result of a code complete request is typically not part of such a dump. + +### Changelog + +#### Version 0.4.0 + +Up to version 0.4.0 the focus of the LSIF format was to ease the generation of the dump for language tool providers. However this made it very hard for consumers of the dump to efficiently import them into a DB unless the DB format one to one mapped to the LSIF format. This version of the specification tries to balance this by requiring tools providers to emit additional events of when certain data is ready to be consumed. It also adds support to partition data per document. + +Since 0.4.0 changes some of the LSIF aspects more deeply an old 0.3.x version of the specification is available [here](./versions/specification-0-3-x.md) + +### Motivation + +Principal design goals: + +- The format should not imply the use of a certain persistence technology. +- The data defined should be modeled as closely as possible to the [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) to make it possible to serve the data through the LSP without further transformation. +- The data stored is result data usually returned from a LSP request. The dump doesn't contain any program symbol information nor does the LSIF define any symbol semantics (e.g. where a symbol is defined or referenced or when a method overrides another method). The LSIF therefore doesn't define a symbol database. Please note that this is consistent with the LSP itself which doesn't define any symbol semantics either. +- The output format will be based on JSON as with the LSP. + +LSP requests that are good candidates to be supported in LSIF are: + +- [`textDocument/documentSymbol`](https://microsoft.github.io/language-server-protocol/specifications/specification-current#textDocument_documentSymbol) +- [`textDocument/foldingRange`](https://microsoft.github.io/language-server-protocol/specifications/specification-current#textDocument_foldingRange) +- [`textDocument/documentLink`](https://microsoft.github.io/language-server-protocol/specifications/specification-current#textDocument_documentLink) +- [`textDocument/definition`](https://microsoft.github.io/language-server-protocol/specifications/specification-current#textDocument_definition) +- [`textDocument/declaration`](https://microsoft.github.io/language-server-protocol/specifications/specification-current#textDocument_declaration) +- [`textDocument/typeDefinition`](https://microsoft.github.io/language-server-protocol/specifications/specification-current#textDocument_typeDefinition) +- [`textDocument/hover`](https://microsoft.github.io/language-server-protocol/specifications/specification-3-15#textDocument_hover) +- [`textDocument/references`](https://microsoft.github.io/language-server-protocol/specifications/specification-3-15#textDocument_references) +- [`textDocument/implementation`](https://microsoft.github.io/language-server-protocol/specifications/specification-3-15#textDocument_implementation) + +The corresponding LSP requests have one of the following two forms: + +```typescript +request(uri, method) -> result +request(uri, position, method) -> result +``` + +where method is the JSON-RPC request method. + +Concrete examples are + +```typescript +request('file:///Users/dirkb/sample/test.ts', 'textDocument/foldingRange') -> FoldingRange[]; +request('file:///Users/dirkb/sample/test.ts', { line: 10, character: 17 }, 'textDocument/hover') -> Hover; +``` + +The input tuple to a request is either `[uri, method]` or `[uri, position, method]` and the output is some form of result. For the same `uri` and `[uri, position]` tuple, there are many different requests to execute. + +The dump format therefore should support the following features: + +- Input data must be easily queryable (e.g. the document and the position). +- Each element has a unique id (which may be a string or a number). +- It should be possible to emit data as soon as it is available to allow streaming rather than large memory requirements. For example, emitting data based on document syntax should be done for each file as parsing progresses. +- It should be easy to add additional requests later on. +- It should be easy for a tool to consume a dump and for example import it into a database without holding the dump in memory. + + +We came to the conclusion that the most flexible way to emit this is a graph, where edges represent the method and vertices are `[uri]`, `[uri, position]` or a request result. This data could then be stored as JSON or read into a database that can represent these vertices and relationships. + +Assume there is a file `/Users/dirkb/sample.ts` and we want to store the folding range information with it then the indexer emits two vertices: one representing the document with its URI `file:///Users/dirkb/sample.ts`, the other representing the folding result. In addition, an edge would be emitted representing the `textDocument/foldingRange` request. + +```typescript +{ id: 1, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } +{ id: 2, type: "vertex", label: "foldingRangeResult", result: [ { ... }, { ... }, ... ] } +{ id: 3, type: "edge", label: "textDocument/foldingRange", outV: 1, inV: 2 } +``` + +The corresponding graph looks like this + +Folding Range Result + +### Ranges + +For requests that take a position as its input, we need to store the position as well. Usually LSP requests return the same result for positions that point to the same word / name in a document. Take the following TypeScript example: + +```typescript +function bar() { +} +``` + +A hover request for a position denoting the `b` in `bar` will return the same result as a position denoting the `a` or `r`. To make the dump more compact, it will use ranges to capture this instead of single positions. The following vertices will be emitted in this case. Note that line, character are zero based as in the LSP: + +```typescript +{ id: 4, type: "vertex", label: "range", start: { line: 0, character: 9}, end: { line: 0, character: 12 } } +``` + +To bind the range to a document, we use a special edge labeled `contains` which points from a document to a set of ranges. + +```typescript +{ id: 5, type: "edge", label: "contains", outV: 1, inVs: [4] } +``` + +LSIF supports 1:n edges for the `contains` relationship which in a graph can easily be mapped to n 1:1 edges. LSIF support this for two reasons: (a) to make the output more compact since a document usually contains hundreds of those ranges and (b) to easy the import and batching for consumers of a LSIF dump. + +To bind the hover result to the range, we use the same pattern as we used for the folding ranges. We emit a vertex representing the hover result and an edge representing the `textDocument/hover` request. + +```typescript +{ + id: 6, + type: "vertex", + label: "hoverResult", + result: { + contents: [ + { language: "typescript", value: "function bar(): void" } + ] + } +} +{ id: 7, type: "edge", label: "textDocument/hover", outV: 4, inV: 6 } +``` + +The corresponding graph looks like this + +Hover Result + +The ranges emitted for a document in the contains relationship must follow these rules: + +1. a given range ID can only be contained in one document or in other words: ranges must not be shared between documents even if the have the same start / end value. +1. No two ranges can be equal. +1. No two ranges can overlap, claiming the same position in a document unless one range is entirely contained by the other. + +If a position in a document is mapped to a range and more than one range covers the position, the following algorithm should be used: + +1. sort the ranges by containment with innermost first +1. for range in ranges do + 1. check if the range has an outgoing edge `textDocument/${method}` + 1. if yes, use it +1. end +1. return `null` + +### Result Set + +Usually the hover result is the same whether you hover over a definition of a function or over a reference of that function. The same is actually true for many LSP requests like `textDocument/definition`, `textDocument/references` or `textDocument/typeDefinition`. In a naïve model, each range would have outgoing edges for all these LSP requests and would point to the corresponding results. To optimize this and to make the graph easier to understand, the concept of a `ResultSet` is introduced. A result set acts as a hub to be able to store information common to a lot of ranges. The `ResultSet` itself doesn't carry any information. So it looks like this: + +```typescript +export interface ResultSet { +} +``` + +The corresponding output of the above example with a hover using a result set looks like this: + +```typescript +{ id: 1, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } +{ id: 2, type: "vertex", label: "resultSet" } +{ id: 3, type: "vertex", label: "range", start: { line: 0, character: 9}, end: { line: 0, character: 12 } } +{ id: 4, type: "edge", label: "contains", outV: 1, inVs: [3] } +{ id: 5, type: "edge", label: "next", outV: 3, inV: 2 } +{ id: 6, type: "vertex", label: "hoverResult", result: {"contents":[{"language":"typescript","value":"function bar(): void"},""] } +{ id: 7, type: "edge", label: "textDocument/hover", outV: 2, inV: 6 } +``` + +Result Set + +Result sets are linked to ranges using a `next` edge. A results set can also forward information to another result set by linking to it using a `next` edge. + +The pattern of storing the result with the `ResultSet` will be used for other requests as well. The lookup algorithm is therefore as follows for a request [document, position, method]: + +1. find all ranges for [document, position]. If none exist, return `null` as the result +1. sort the ranges by containment the innermost first +1. for range in ranges do + 1. assign range to out + 1. while out !== `null` + 1. check if out has an outgoing edge `textDocument/${method}`. if yes, use it and return the corresponding result + 1. check if out has an outgoing `next` edge. If yes, set out to the target vertex. Else set out to `null` + 1. end +1. end +1. otherwise return `null` + +### Request: `textDocument/definition` + +The same pattern of connecting a range, result set, or a document with a request edge to a method result is used for other requests as well. Let's next look at the `textDocument/definition` request using the following TypeScript sample: + +```typescript +function bar() { +} + +function foo() { + bar(); +} +``` + +This will emit the following vertices and edges to model the `textDocument/definition` request: + +```typescript +// The document +{ id: 4, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } + +// The bar declaration +{ id: 6, type: "vertex", label: "resultSet" } +{ id: 9, type: "vertex", label: "range", start: { line: 0, character: 9 }, end: { line: 0, character: 12 } } +{ id: 10, type: "edge", label: "next", outV: 9, inV: 6 } + + +// The bar reference +{ id: 20, type: "vertex", label: "range", start: { line: 4, character: 2 }, end: { line: 4, character: 5 } } +{ id: 21, type: "edge", label: "next", outV: 20, inV: 6} + +// The definition result linked to the bar result set +{ id: 22, type: "vertex", label: "definitionResult" } +{ id: 23, type: "edge", label: "textDocument/definition", outV: 6, inV: 22 } +{ id: 24, type: "edge", label: "item", outV: 22, inVs: [9], document: 4 } +``` + +Definition Result + +The definition result above has only one value (the range with id '9') and we could have emitted it directly. However, we introduced the definition result vertex for two reasons: + +- To have consistency with all other requests that point to a result. +- To have support for languages where a definition can be spread over multiple ranges or even multiple documents. To support multiple documents ranges are added to a definition result using an 1:N `item` edge. Conceptionally a definition result is an array to which the `item` edge adds items. + +Consider the following TypeScript example: + +```typescript +interface X { + foo(); +} +interface X { + bar(); +} +let x: X; +``` + +Running **Go to Definition** on `X` in `let x: X` will show a dialog which lets the user select between the two definitions of the `interface X`. The emitted JSON in this case looks like this: + +```typescript +{ id : 38, type: "vertex", label: "definitionResult" } +{ id : 40, type: "edge", label: "item", outV: 38, inVs: [9, 13], document: 4 } +``` + +The `item` edge as an additional property document which indicate in which document these declaration are. We added this information to still make it easy to emit the data but also make it easy to process the data to store it in a database. Without that information we would either need to specific an order in which data needs to be emitted (e.g. a item edge and only refer to a range that got already added to a document using a `containes` edge) or we force processing tools to keep a lot of vertices and edges in memory. The approach of having this `document` property looks like a fair balance. + +### Request: `textDocument/declaration` + +There are programming languages that have the concept of declarations and definitions (like C/C++). If this is the case, the dump can contain a corresponding `declarationResult` vertex and a `textDocument/declaration` edge to store the information. They are handled analogously to the entities emitted for the `textDocument/definition` request. + +### More about Request: `textDocument/hover` + +In the LSP, the hover is defined as follows: + +```typescript +export interface Hover { + /** + * The hover's content + */ + contents: MarkupContent | MarkedString | MarkedString[]; + + /** + * An optional range + */ + range?: Range; +} +``` + +where the optional range is the name range of the word hovered over. + +> **Side Note**: This is a pattern used for other LSP requests as well, where the result contains the word range of the word the position parameter pointed to. + +This makes the hover different for every location so we can't really store it with the result set. But wait, the range is the range of one of the `bar` references we already emitted and used to start to compute the result. To make the hover still reusable, we ask the index server to fill in the starting range if no range is defined in the result. So for a hover request executed on range `{ line: 4, character: 2 }, end: { line: 4, character: 5 }` the hover result will be: + +```typescript +{ id: 6, type: "vertex", label: "hoverResult", result: { contents: [ { language: "typescript", value: "function bar(): void" } ], range: { line: 4, character: 2 }, end: { line: 4, character: 5 } } } +``` + +### Request: `textDocument/references` + +Storing references will be done in the same way as storing a hover or go to definition ranges. It uses a reference result vertex and `item` edges to add ranges to the result. + +Look at the following example: + +```typescript +function bar() { +} + +function foo() { + bar(); +} +``` + +The relevant JSON output looks like this: + +```typescript +// The document +{ id: 4, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } + +// The bar declaration +{ id: 6, type: "vertex", label: "resultSet" } +{ id: 9, type: "vertex", label: "range", start: { line: 0, character: 9 }, end: { line: 0, character: 12 } } +{ id: 10, type: "edge", label: "next", outV: 9, inV: 6 } + +// The bar reference range +{ id: 20, type: "vertex", label: "range", start: { line: 4, character: 2 }, end: { line: 4, character: 5 } } +{ id: 21, type: "edge", label: "next", outV: 20, inV: 6 } + +// The reference result +{ id : 25, type: "vertex", label: "referenceResult" } +// Link it to the result set +{ id : 26, type: "edge", label: "textDocument/references", outV: 6, inV: 25 } + +// Add the bar definition as a reference to the reference result +{ id: 27, type: "edge", label: "item", outV: 25, inVs: [9], document: 4, property : "definitions" } + +// Add the bar reference as a reference to the reference result +{ id: 28, type: "edge", label: "item", outV: 25, inVs: [20], document:4, property: "references" } +``` + +References Result + +We tag the `item` edge with id 27 as a definition since the reference result distinguishes between definitions, declarations, and references. This is done since the `textDocument/references` request takes an additional input parameter `includeDeclarations` controlling whether declarations and definitions are included in the result as well. Having three distinct properties allows the server to compute the result accordingly. + +The item edge also support linking reference results to other reference results. This is useful when computing references to methods overridden in a type hierarchy. + +Take the following example: + +```typescript +interface I { + foo(): void; +} + +class A implements I { + foo(): void { + } +} + +class B implements I { + foo(): void { + } +} + +let i: I; +i.foo(); + +let b: B; +b.foo(); +``` + +The reference result for the method `foo` in TypeScript contains all three declarations and both references. While parsing the document, one reference result is created and then shared between all result sets. + +The output looks like this: + +```typescript +// The document +{ id: 4, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } + +// The declaration of I#foo +{ id: 13, type: "vertex", label: "resultSet" } +{ id: 16, type: "vertex", label: "range", start: { line: 1, character: 2 }, end: { line: 1, character: 5 } } +{ id: 17, type: "edge", label: "next", outV: 16, inV: 13 } +// The reference result for I#foo +{ id: 30, type: "vertex", label: "referenceResult" } +{ id: 31, type: "edge", label: "textDocument/references", outV: 13, inV: 30 } + +// The declaration of A#foo +{ id: 29, type: "vertex", label: "resultSet" } +{ id: 34, type: "vertex", label: "range", start: { line: 5, character: 2 }, end: { line: 5, character: 5 } } +{ id: 35, type: "edge", label: "next", outV: 34, inV: 29 } + +// The declaration of B#foo +{ id: 47, type: "vertex", label: "resultSet" } +{ id: 50, type: "vertex", label: "range", start: { line: 10, character: 2 }, end: { line: 10, character: 5 } } +{ id: 51, type: "edge", label: "next", outV: 50, inV: 47 } + +// The reference i.foo() +{ id: 65, type: "vertex", label: "range", start: { line: 15, character: 2 }, end: { line: 15, character: 5 } } + +// The reference b.foo() +{ id: 78, type: "vertex", label: "range", start: { line: 18, character: 2 }, end: { line: 18, character: 5 } } + +// The insertion of the ranges into the shared reference result +{ id: 90, type: "edge", label: "item", outV: 30, inVs: [16,34,50], document: 4, property: definitions } +{ id: 91, type: "edge", label: "item", outV: 30, inVs: [65,78], document: 4, property: references } + +// Linking A#foo to I#foo +{ id: 101, type: "vertex", label: "referenceResult" } +{ id: 102, type: "edge", label: "textDocument/references", outV: 29, inV: 101 } +{ id: 103, type: "edge", label: "item", outV: 101, inVs: [30], document: 4, property: referenceResults } + +// Linking B#foo to I#foo +{ id: 114, type: "vertex", label: "referenceResult" } +{ id: 115, type: "edge", label: "textDocument/references", outV: 47, inV: 114 } +{ id: 116, type: "edge", label: "item", outV: 114, inVs: [30], document: 4, property: referenceResults } +``` + +One goal of the language server index format is that the information can be emitted as soon as possible without caching too much information in memory. With languages that support overriding methods defined in more than one interface, this can be more complicated since the whole inheritance tree might only be known after parsing all documents. + +Take the following TypeScript example: + +```typescript +interface I { + foo(): void; +} + +interface II { + foo(): void; +} + +class B implements I, II { + foo(): void { + } +} + +let i: I; +i.foo(); + +let b: B; +b.foo(); +``` + +Searching for `I#foo()` finds 4 references, searching for `II#foo()` finds 3 reference, and searching on `B#foo()` finds 5 results. The interesting part here is when the declaration of `class B` gets processed which implements `I` and `II`, neither the reference result bound to `I#foo()` nor the one bound to `II#foo()` can be reused. So we need to create a new one. To still be able to profit from the results generated for `I#foo` and `II#foo`, the LSIF supports nested references results. This way the one referenced from `B#foo` will reuse the one from `I#foo` and `II#foo`. Depending on how these declarations are parsed, the two reference results might contain the same references. When a language server interprets reference results consisting of other reference results, the server is responsible to de-dup the final ranges. + +In the above example, there will be three reference results + +```typescript +// The document +{ id: 4, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } + +// Declaration of I#foo +{ id: 13, type: "vertex", label: "resultSet" } +{ id: 16, type: "vertex", label: "range", start: { line: 1, character: 2 }, end: { line: 1, character: 5 } } +{ id: 17, type: "edge", label: "next", outV: 16, inV: 13 } + +// Declaration of II#foo +{ id: 27, type: "vertex", label: "resultSet" } +{ id: 30, type: "vertex", label: "range", start: { line: 5, character: 2 }, end: { line: 5, character: 5 } } +{ id: 31, type: "edge", label: "next", outV: 30, inV: 27 } + +// Declaration of B#foo +{ id: 45, type: "vertex", label: "resultSet" } +{ id: 52, type: "vertex", label: "range", start: { line: 9, character: 2 }, end: { line: 9, character: 5 } } +{ id: 53, type: "edge", label: "next", outV: 52, inV: 45 } + +// Reference result for I#foo +{ id: 46, type: "vertex", label: "referenceResult" } +{ id: 47, type: "edge", label: "textDocument/references", outV: 13, inV: 46 } + +// Reference result for II#foo +{ id: 48, type: "vertex", label: "referenceResult" } +{ id: 49, type: "edge", label: "textDocument/references", outV: 27, inV: 48 } + +// Reference result for B#foo +{ id: 116 "typ" :"vertex", label: "referenceResult" } +{ id: 117 "typ" :"edge", label: "textDocument/references", outV: 45, inV: 116 } + +// Link B#foo reference result to I#foo and II#foo +{ id: 118 "typ" :"edge", label: "item", outV: 116, inVs: [46,48], document: 4, property: "referenceResults" } +``` + +For Typescript, method references are recorded at their most abstract declaration and if methods are merged (`B#foo`), they are combined using a reference result pointing to other results. + +### Request: `textDocument/implementation` + +Supporting a `textDocument/implementation` request is done reusing what we implemented for a `textDocument/references` request. In most cases, the `textDocument/implementation` returns the declaration values of the reference result that a symbol declaration points to. For cases where the result differs, the LSIF provides an `ImplementationResult`. To nest implementation results the `item` edge supports a `property` value `"implementationResults"`. + +The corresponding `ImplementationResult` looks like this: + +```typescript +interface ImplementationResult { + + label: `implementationResult` +} +``` + +### Request: `textDocument/typeDefinition` + +Supporting `textDocument/typeDefinition` is straightforward. The edge is either recorded at the range or at the `ResultSet`. + +The corresponding `TypeDefinitionResult` looks like this: + +```typescript +interface TypeDefinitionResult { + + label: `typeDefinitionResult` +} +``` + +For the following TypeScript example: + +```typescript +interface I { + foo(): void; +} + +let i: I; +``` + +The relevant emitted vertices and edges looks like this: + +```typescript +// The document +{ id: 4, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } + +// The declaration of I +{ id: 6, type: "vertex", label: "resultSet" } +{ id: 9, type: "vertex", label: "range", start: { line: 0, character: 10 }, end: { line: 0, character: 11 } } +{ id: 10, type: "edge", label: "next", outV: 9, inV: 6 } + +// The declaration of i +{ id: 26, type: "vertex", label: "resultSet" } +// The type definition result +{ id: 37, type: "vertex", label: "typeDefinitionResult" } +// Hook the result to the declaration +{ id: 38, type: "edge", label: "textDocument/typeDefinition", outV: 26, inV:37 } +// Add the declaration of I as a target range. +{ id: 51, type: "edge", label: "item", outV: 37, inVs: [9], document: 4 } +``` + +As with other results ranges get added using a `item` edge. In this case without a `property` since there is only on kind of range. + +### Document requests + +The Language Server Protocol also supports requests for documents only (without any position information). These requests are `textDocument/foldingRange`, `textDocument/documentLink`, and `textDocument/documentSymbol`. We follow the same pattern as before to model these, the difference being that the result is linked to the document instead of to a range. + +### Request: `textDocument/foldingRange` + +For the folding range result this looks like this: + +```typescript +function hello() { + console.log('Hello'); +} + +function world() { + console.log('world'); +} + +function space() { + console.log(' '); +} +hello();space();world(); +``` + +```typescript +{ id: 2, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } +{ id: 112, type: "vertex", label: "foldingRangeResult", result:[ + { startLine: 0, startCharacter: 16, endLine: 2, endCharacter: 1 }, + { startLine: 4, startCharacter: 16, endLine: 6, endCharacter: 1 }, + { startLine: 8, startCharacter: 16, endLine: 10, endCharacter: 1 } +]} +{ id: 113, type: "edge", label: "textDocument/foldingRange", outV: 2, inV: 112 } +``` + +The corresponding `FoldingRangeResult` is defined as follows: + +```typescript +export interface FoldingRangeResult { + label: 'foldingRangeResult'; + + result: lsp.FoldingRange[]; +} +``` + +### Request: `textDocument/documentLink` + +Again, for document links, we define a result type and a corresponding edge to link it to a document. Since the link location usually appear in comments, the ranges don't denote any symbol declarations or references. We therefore inline the range into the result like we do with folding ranges. + +```typescript +export interface DocumentLinkResult { + label: 'documentLinkResult'; + + result: lsp.DocumentLink[]; +} +``` + +### Request: `textDocument/documentSymbol` + +Next we look at the `textDocument/documentSymbol` request. This request usually returns an outline view of the document in hierarchical form. However, not all programming symbols declared or defined in a document are part of the result (for example, locals are usually omitted). In addition, an outline item needs to provide additional information like the full range and a symbol kind. There are two ways we can model this: either we do the same as we do for folding ranges and the document links and store the information in a document symbol result as literals, or we extend the range vertex with some additional information and refer to these ranges in the document symbol result. Since the additional information for ranges might be helpful in other scenarios as well, we support adding additional tags to these ranges by defining a `tag` property on the `range` vertex. + +The following tags are currently supported: + +```typescript +/** + * The range represents a declaration + */ +export interface DeclarationTag { + + /** + * A type identifier for the declaration tag. + */ + type: 'declaration'; + + /** + * The text covered by the range + */ + text: string; + + /** + * The kind of the declaration. + */ + kind: lsp.SymbolKind; + + /** + * The full range of the declaration not including leading/trailing whitespace but everything else, e.g comments and code. + * The range must be included in fullRange. + */ + fullRange: lsp.Range; + + /** + * Optional detail information for the declaration. + */ + detail?: string; +} + +/** + * The range respresents a definition + */ +export interface DefinitionTag { + /** + * A type identifier for the declaration tag. + */ + type: 'definition'; + + /** + * The text covered by the range + */ + text: string; + + /** + * The symbol kind. + */ + kind: lsp.SymbolKind; + + /** + * The full range of the definition not including leading/trailing whitespace but everything else, e.g comments and code. + * The range must be included in fullRange. + */ + fullRange: lsp.Range; + + /** + * Optional detail information for the definition. + */ + detail?: string; +} + +/** + * The range represents a reference + */ +export interface ReferenceTag { + + /** + * A type identifier for the reference tag. + */ + type: 'reference'; + + /** + * The text covered by the range + */ + text: string; +} + +/** + * The type of the range is unknown. + */ +export interface UnknownTag { + + /** + * A type identifier for the unknown tag. + */ + type: 'unknown'; + + /** + * The text covered by the range + */ + text: string; +} +``` + +Emitting the tags for the following TypeScript example: + +```typescript +function hello() { +} + +hello(); +``` + +Will look like this: + +```typescript +{ id: 2, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } +{ id: 4, type: "vertex", label: "resultSet" } +{ id: 7, type: "vertex", label: "range", + start: { line: 0, character: 9 }, end: { line: 0, character: 14 }, + tag: { type: "definition", text: "hello", kind: 12, fullRange: { start: { line: 0, character: 0 }, end: { line: 1, character: 1 }}} +} +``` + +The document symbol result is then modeled as follows: + +```typescript +export interface RangeBasedDocumentSymbol { + + id: RangeId + + children?: RangeBasedDocumentSymbol[]; +} + +export interface DocumentSymbolResult extends V { + + label: 'documentSymbolResult'; + + result: lsp.DocumentSymbol[] | RangeBasedDocumentSymbol[]; +} +``` + +The given TypeScript example: + +```typescript +namespace Main { + function hello() { + } + function world() { + let i: number = 10; + } +} +``` + +Produces the following output: + +```typescript +// The document +{ id: 2 , type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } +// The declaration of Main +{ id: 7 , type: "vertex", label: "range", start: { line: 0, character: 10 }, end: { line: 0, character: 14 }, tag: { type: "definition", text: "Main", kind: 7, fullRange: { start: { line: 0, character: 0 }, end: { line: 5, character: 1 } } } } +// The declaration of hello +{ id: 18 , type: "vertex", label: "range", start: { line: 1, character: 11 }, end: { line: 1, character: 16 }, tag: { type: "definition", text: "hello", kind: 12, fullRange: { start: { line: 1, character: 2 }, end: { line: 2, character: 3 } } } } +// The declaration of world +{ id: 29 , type: "vertex", label: "range", start: { line: 3, character: 11 }, end: { line: 3, character: 16 }, tag: { type: "definition", text: "world", kind: 12, fullRange: { start: { line: 3, character: 2 }, end: { line: 4, character: 3 } } } } +// The document symbol +{ id: 39 , type: "vertex", label: "documentSymbolResult", result: [ { id: 7 , children: [ { id: 18 }, { id: 29 } ] } ] } +{ id: 40 , type: "edge", label: "textDocument/documentSymbol", outV: 2, inV: 39 } +``` + +### Request: `textDocument/diagnostic` + +The only information missing that is useful in a dump are the diagnostics associated with documents. Diagnostics in the LSP are modeled as a push notifications sent from the server to the client. This doesn't work well with a dump modeled on request method names. However, the push notification can be emulated as a request where the request's result is the value sent during the push as a parameter. + +In the dump, we model diagnostics as follows: + +- We introduce a pseudo request `textDocument/diagnostic`. +- We introduce a diagnostic result which contains the diagnostics associated with a document. + +The result looks like this: + +```typescript +export interface DiagnosticResult { + + label: 'diagnosticResult'; + + result: lsp.Diagnostic[]; +} +``` + +The given TypeScript example: + +```typescript +function foo() { + let x: string = 10; +} +``` + +Produces the following output: + +```typescript +{ id: 2, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } +{ id: 18, type: "vertex", label: "diagnosticResult", result: [{ severity: 1, code: 2322, message: "Type '10' is not assignable to type 'string'.", range: { start : { line: 1, character: 5 }, end: { line: 1, character: 6 } } } ] } +{ id: 19, type: "edge", label: "textDocument/diagnostic", outV: 2, inV: 18 } +``` + +Since diagnostics are not very common in dumps, no effort has been made to reuse ranges in diagnostics. + +### The Project vertex + +Usually language servers operate in some sort of project context. In TypeScript, a project is defined using a `tsconfig.json` file. C# and C++ have their own means. The project file usually contains information about compile options and other parameters. Having these in the dump can be valuable. The LSIF therefore defines a project vertex. In addition, all documents that belong to that project are connected to the project using a `contains` edge. If there was a `tsconfig.json` in the previous examples, the first emitted edges and vertices would look like this: + +```typescript +{ id: 1, type: "vertex", label: "project", resource: "file:///Users/dirkb/tsconfig.json", kind: "typescript"} +{ id: 2, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript" } +{ id: 3, type: "edge", label: "contains", outV: 1, inVs: [2] } +``` + +The definition of the `project` vertex looks as follows: + +```ts +export interface Project extends V { + + /** + * The label property. + */ + label: VertexLabels.project; + + /** + * The project kind like 'typescript' or 'csharp'. See also the language ids + * in the [specification](https://microsoft.github.io/language-server-protocol/specification) + */ + kind: string; + + /** + * The resource URI of the project file. + */ + resource?: Uri; + + /** + * Optional the content of the project file, `base64` encoded. + */ + contents?: string; +} +``` + +## Embedding contents + +It can be valuable to embed the contents of a document or project file into the dump as well. For example, if the content of the document is a virtual document generated from program meta data. The index format therefore supports an optional `contents` property on the `document` and `project` vertex. If used the content needs to be `base64` encoded. + +## Events + +To ease the processing of an LSIF dump to for example import it into a database the dump emits begin and end events for documents and projects. After the end event of a document has been emitted the dump must not contain any further data referencing that document. For example no ranges from that document can be referenced in `item` edges. Nor can result sets or other vertices linked to the ranges in that document. The document can however be reference in a `contains` edge adding the document to a project. The begin / end events for documents look like this: + +```ts +// The actual document +{ id: 4, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript", contents: "..." } +// The begin event +{ id: 5, type: "vertex", label: "$event", kind: "begin", scope: "document" , data: 4 } +// The end event +{ id: 53, type: "vertex", label: "$event", kind: "end", scope: "document" , data: 4 } +``` + +Between the document vertex `4` and the document begin event `5` no information specific to document `4` can be emitted. Please note that more than one document can be open at a given point in time meaning that there have been n different document begin events without corresponding document end events. + +The events for projects looks similar: + +```ts +{ id: 2, type: "vertex", label: "project", kind: "typescript" } +{ id: 4, type: "vertex", label: "document", uri: "file:///Users/dirkb/sample.ts", languageId: "typescript", contents: "..." } +{ id: 5, type: "vertex", label: "$event", kind: "begin", scope: "document" , data: 4 } +{ id: 3, type: "vertex", label: "$event", kind: "begin", scope: "project", data: 2 } +{ id: 53, type: "vertex", label: "$event", kind: "end", scope: "document", data: 4 } +{ id: 54, type: "edge", label: "contains", outV: 2, inVs: [4] } +{ id: 55, type: "vertex", label: "$event", kind: "end", scope: "project", data: 2 } +``` + +## Project exports and external imports (Monikers) + +One use case of the LSIF is to create dumps for released versions of a product, either a library or a program. If a project **A** references a library **B**, it would also be useful if the information in these two dumps could be related. To make this possible, the LSIF introduces optional monikers which can be linked to ranges using a corresponding edge. The monikers can be used to describe what a project exports and what it imports. Let's first look at the export case. + +Consider the following TypeScript file called `index.ts`: + +```typescript +export function func(): void { +} + +export class Emitter { + private doEmit() { + } + + public emit() { + this.doEmit(); + } +} +``` + +```typescript +{ id: 4, type: "vertex", label: "document", uri: "file:///Users/dirkb/index.ts", languageId: "typescript", contents: "..." } +{ id: 11, type: "vertex", label: "resultSet" } +{ id: 12, type: "vertex", label: "moniker", kind: "export", scheme: "tsc", identifier: "lib/index:func" } +{ id: 13, type: "edge", label: "moniker", outV: 11, inV: 12 } +{ id: 14, type: "vertex", label: "range", start: { line: 0, character: 16 }, end: { line: 0, character: 20 } } +{ id: 15, type: "edge", label: "next", outV: 14, inV: 11 } + +{ id: 18, type: "vertex", label: "resultSet" } +{ id: 19, type: "vertex", label: "moniker", kind: "export", scheme: "tsc", identifier: "lib/index:Emitter" } +{ id: 20, type: "edge", label: "moniker", outV: 18, inV: 19 } +{ id: 21, type: "vertex", label: "range", start: { line: 3, character: 13 }, end: { line: 3, character: 20 } } +{ id: 22, type: "edge", label: "next", outV: 21, inV: 18 } + +{ id: 25, type: "vertex", label: "resultSet" } +{ id: 26, type: "vertex", label: "moniker", kind: "export", scheme: "tsc", identifier: "lib/index:Emitter.doEmit" } +{ id: 27, type: "edge", label: "moniker", outV: 25, inV: 26 } +{ id: 28, type: "vertex", label: "range", start: { line: 4, character: 10 }, end: { line: 4, character: 16 } } +{ id: 29, type: "edge", label: "next", outV: 28, inV: 25 } + +{ id: 32, type: "vertex", label: "resultSet" } +{ id: 33, type: "vertex", label: "moniker", kind: "export", scheme: "tsc", identifier: "lib/index:Emitter.emit" } +{ id: 34, type: "edge", label: "moniker", outV: 32, inV: 33 } +{ id: 35, type: "vertex", label: "range", start: { line: 7, character: 9 }, end: { line: 7, character: 13 } } +{ id: 36, type: "edge", label: "next", outV: 35, inV: 32 } +``` + +This describes the exported declaration inside `index.ts` with a moniker (e.g. a handle in string format) that is bound to the corresponding range declaration. The generated moniker must be position independent and stable so that it can be used to identify the symbol in other projects or documents. It should be sufficiently unique so as to avoid matching other monikers in other projects unless they actually refer to the same symbol. A moniker therefore has two properties: a `scheme` to indicate how the `identifiers` is to be interpreted. And the `identifier` to actually identify the symbol. It structure is opaque to the scheme owner. In the above example the monikers are created by the TypeScript compiler tsc and can only be compared to monikers also having the scheme `tsc`. + +Please also note that the method `Emitter#doEmit` has a moniker although the method is private. If private elements do have monikers depend on the programming language. Since TypeScript cant enforce visibility (it compiles to JS which doesn't have the concept) we treat them as visible. Even the TypeScript language server does so. Find all references does find all references to private methods even if it is flagged as a visibility violation. + +How these exported elements are visible in other projects in most programming languages depends on how many files are packaged into a library or program. In TypeScript, the standard package manager is npm. + +Consider that the following `package.json` file exists: + +```json +{ + "name": "lsif-ts-sample", + "version": "1.0.0", + "description": "", + "main": "lib/index.js", + "author": "MS", + "license": "MIT", +} +``` + +then these monikers can be translated into monikers that are `npm` dependent. Instead of replacing the monikers we emit a second set of monikers and link the `tsc` monikers to corresponding `npm` monikers using a `nextMoniker`edge: + +```typescript +{ id: 991, type: "vertex", label: "packageInformation", name: "lsif-ts-sample", manager: "npm", version: "1.0.0" } + +{ id: 987, type: "vertex", label: "moniker", kind: "export", scheme: "npm", identifier: "lsif-ts-sample::func" } +{ id: 986, type: "edge", label: "packageInformation", outV: 987, inV: 991 } +{ id: 985, type: "edge", label: "nextMoniker", outV: 12, inV: 987 } + +{ id: 984, type: "vertex", label: "moniker", kind: "export", scheme: "npm", identifier: "lsif-ts-sample::Emitter" } +{ id: 983, type: "edge", label: "packageInformation", outV: 984, inV: 991 } +{ id: 982, type: "edge", label: "nextMoniker", outV: 19, inV: 984 } + +{ id: 981, type: "vertex", label: "moniker", kind: "export", scheme: "npm", identifier: "lsif-ts-sample::Emitter.doEmit" } +{ id: 980, type: "edge", label: "packageInformation", outV: 981, inV: 991 } +{ id: 979, type: "edge", label: "nextMoniker", outV: 26, inV: 981 } + +{id: 978, type: "vertex", label: "moniker", kind: "export", scheme: "npm", identifier: "lsif-ts-sample::Emitter.emit" } +{id: 977, type: "edge", label: "packageInformation", outV: 978, inV: 991 } +{id: 976, type: "edge", label: "nextMoniker", outV: 33, inV: 978 } +``` +Things to observe: + +- a special `packageInformation`vertex got emitted to point to the corresponding npm package information. +- the npm moniker refer to the package name. +- since the file `index.ts` is the npm main file the moniker identifier as no file path. The is comparable to importing this module into TypeScript or JavaScript were only the module name and no file path is used (e.g. `import * as lsif from 'lsif-ts-sample'`). +- the `nextMoniker` edge points from the tsc moniker vertex to the npm moniker vertex. + +For LSIF we recommend that a second tool is used to make the monikers emitted by the indexer be package manager dependent. This supports the use of different package managers and allows incorporating custom build tools. In the TypeScript implementation, this is done by a npm specific tool which rewrites the monikers taking the npm package information into account. + +Reporting importing external symbols is done using the same approach. The LSIF emits monikers of kind `import`. Consider the following typescript example: + +```typescript +import * as mobx from 'mobx'; + +let map: mobx.ObservableMap = new mobx.ObservableMap(); +``` + +where `mobx` is the [npm mobx package](https://www.npmjs.com/package/mobx). Running the tsc index tools produces: + +```typescript +{ id: 41, type: "vertex", label: "document", uri: "file:///Users/dirkb/samples/node_modules/mobx/lib/types/observablemap.d.ts", languageId: "typescript", contents: "..." } +{ id: 55, type: "vertex", label: "resultSet" } +{ id: 57, type: "vertex", label: "moniker", kind: "import", scheme: "tsc", identifier: "node_modules/mobx/lib/mobx:ObservableMap" } +{ id: 58, type: "edge", label: "moniker", outV: 55, inV: 57 } +{ id: 59, type: "vertex", label: "range", start: { line: 17, character: 538 }, end: { line: 17, character: 551 } } +{ id: 60, type: "edge", label: "next", outV: 59, inV: 55 } +``` + +Three things to note here: First, TypeScript uses declarations files for externally imported symbols. That has the nice effect that the moniker information can be attached to the declaration ranges in these files. In other languages, the information might be attached to the file actually referencing the symbol. Or a virtual document for the referenced item is generated. Second, the tool only generates this information for symbols actually referenced, not for all available symbols. Third these monikers are `tsc` specific and point to the `node_modules` folder. + +However piping this information through the npm tool will generate the following information: + +```typescript +{id: 991, type: "vertex", label: "packageInformation", name: "mobx", manager: "npm", version: "5.6.0", repository: { type: "git", url: "git+https://github.com/mobxjs/mobx.git" } } +{ id: 978, type: "vertex", label: "moniker", kind: "import", scheme: "npm", identifier: "mobx::ObservableMap" } +{ id: 977, type: "edge", label: "packageInformation", outV: 978, inV: 991 } +{ id: 976, type: "edge", label: "nextMoniker", outV: 978, inV: 57 } +``` + +which made the moniker specific to the npm `mobx` package. In addition information about the `mobx` package itself got emitted. Please note that since this is an import moniker the `nextMoniker` edge points from the `npm` moniker to the `tsc` moniker. + +Usually monikers are attached to result sets since they are the same for all ranges pointing to the result set. However for dumps that don't use result sets, monikers can also be emitted on ranges. + +For tools processing the dump and importing it into a database it is sometime useful to know whether a result is local to a file or not (for example function arguments can only be navigated inside the file). To help postprocessing tools to decide this LSIF generation tools should generate a moniker for locals as well. The corresponding kind to use is `local`. The identifier should still be unique inside the document. + +For the following example + +```ts +funciton foo(x: number): void { +} +``` + +The moniker for `x` looks like this: + +```ts +{ id: 13, type: "vertex", label: "resultSet" } +{ id: 14, type: "vertex", label: "moniker", kind: "local", scheme: "tsc", identifier: "SfeOP6s53Y2HAkcViolxYA==" } +{ id: 15, type: "edge", label: "moniker", outV: 13, inV: 14 } +{ id: 16, type: "vertex", label: "range", start: { line: 0, character: 13 }, end: { line: 0, character: 14 }, tag: { type: "definition", text: "x", kind: 7, fullRange: { start: { line: 0, character: 13 }, end: { line: 0, character: 22 } } } } +{ id: 17, type: "edge", label: "next", outV: 16, inV: 13 } +``` + +In addition to this moniker schemes starting with `$` are reserved and shouldn't be used by a LSIF tool. + +## Result ranges + +Ranges in LSIF have currently two meanings: + +1. they act as LSP request sensitive areas in a document (e.g. we use them to decided of for a given position a corresponding LSP request result exists) +1. they act as navigation targets (e.g. they are the result of a Go To declaration navigation). + +To fulfil the first LSIF specifies that ranges can't overlap or be the same. However this constraint is not necessary for the second meaning. To support equal or overlapping target ranges we introduce a vertex `resultRange`. It is not allowed to use a `resultRange` as a target in a `contains` edge. + +## Meta Data Vertex + +To support versioning the LSIF defines a meta data vertex as follows: + +```typescript +export interface MetaData { + + /** + * The label property. + */ + label: 'metaData'; + + /** + * The version of the LSIF format using semver notation. See https://semver.org/. Please note + * the version numbers starting with 0 don't adhere to semver and adopters have to assume + * the each new version is breaking. + */ + version: string; + + /** + * The project root (in form of an URI) used to compute this dump. + */ + projectRoot: Uri; + + /** + * The string encoding used to compute line and character values in + * positions and ranges. Currently only 'utf-16' is support due to the + * limitations in LSP. + */ + positionEncoding: 'utf-16', + + /** + * Information about the tool that created the dump + */ + toolInfo?: { + name: string; + version?: string; + args?: string[]; + } +} +``` + +## Emitting constraints + +The following emitting constraints (some of which have already mean mentioned in the document) exists: + +- a vertex needs to be emitted before it can be referenced in an edge. +- a `range` and `resultRange` can only be contained in one document. +- a `resultRange` can not be used as a target in a `contains` edge. +- after a document end event has been emitted only result sets, reference or implementation results emitted through that document can be referenced in edges. It is for example not allowed to reference ranges or result ranges from that document. This also includes adding monikers to ranges or result sets. The document data so to speak can not be altered anymore. +- if ranges point to result sets and monikers are emitted, they must be emitted on the result set and can't be emitted on individual ranges. + +## Tools + +- [`lsif-protocol`](https://github.com/Microsoft/lsif-node/tree/master/protocol): Protocol defined as TypeScript interfaces +- [`lsif-util`](https://github.com/jumattos/lsif-util): Utility tools for LSIF development +- [`lsif-tsc`](https://github.com/Microsoft/lsif-node/tree/master/tsc): LSIF indexer for TypeScript +- [`lsif-npm`](https://github.com/Microsoft/lsif-node/tree/master/npm): Linker for NPM monikers + +## Open Questions + +While implementing this for TypeScript and npm we collected a list of [open questions](https://github.com/Microsoft/lsif-typescript/labels/discussion) in form of GitHub issues we are already aware of. From 53ef723b07bbd5ba3f1149beb567b1a34150c98f Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Mon, 27 Jan 2020 11:59:47 +0100 Subject: [PATCH 2/2] Add table of contents --- _data/lsif-0-4-0-toc.yml | 60 +++++++++++++++++++++ _specifications/lsif/0.4.0/specification.md | 54 ++++++++++--------- 2 files changed, 90 insertions(+), 24 deletions(-) create mode 100644 _data/lsif-0-4-0-toc.yml diff --git a/_data/lsif-0-4-0-toc.yml b/_data/lsif-0-4-0-toc.yml new file mode 100644 index 000000000..edbfd96d9 --- /dev/null +++ b/_data/lsif-0-4-0-toc.yml @@ -0,0 +1,60 @@ +- title: Table of Contents + children: + - title: General + anchor: _general + children: + - title: Introduction + anchor: lsifIntro + - title: Motivation + anchor: lsifMotivation + - title: Ranges + anchor: ranges + - title: Result Sets + anchor: resultSet + - title: Language Features + anchor: _languageFeatures + children: + - title: definition + anchor: definition + - title: declaration + anchor: declaration + - title: hover + anchor: hover + - title: references + anchor: references + - title: implementation + anchor: implementation + - title: typeDefinition + anchor: typeDefinition + - title: foldingRange + anchor: foldingRange + - title: documentLink + anchor: documentLink + - title: documentSymbol + anchor: documentSymbol + - title: diagnostic + anchor: diagnostic + - title: project + anchor: projectContext + - title: Embedding Contents + anchor: embeddingContents + - title: Advanced Concepts + anchor: _advancedConcpets + children: + - title: Events + anchor: events + - title: Exports and Imports + anchor: exportsImports + - title: Result Ranges + anchor: resultRanges + - title: Meta Data + anchor: metaData + - title: Emitting Contstraints + anchor: emittingContstraints + - title: Additional Information + anchor: _additionalInformation + children: + - title: Tools + anchor: tools + - title: Open Questions + anchor: openQuestions \ No newline at end of file diff --git a/_specifications/lsif/0.4.0/specification.md b/_specifications/lsif/0.4.0/specification.md index d990d0cab..b80e07772 100644 --- a/_specifications/lsif/0.4.0/specification.md +++ b/_specifications/lsif/0.4.0/specification.md @@ -11,7 +11,7 @@ index: 2 The 0.4.0 version of LSIF is currently under construction. -## Language Server Index Format +## Language Server Index Format The purpose of the Language Server Index Format (LSIF) is it to define a standard format for language servers or other programming tools to dump their knowledge about a workspace. This dump can later be used to answer language server [LSP](https://microsoft.github.io/language-server-protocol/) requests for the same workspace without running the language server itself. Since much of the information would be invalidated by a change to the workspace, the dumped information typically excludes requests used when mutating a document. So, for example, the result of a code complete request is typically not part of such a dump. @@ -23,7 +23,7 @@ Up to version 0.4.0 the focus of the LSIF format was to ease the generation of t Since 0.4.0 changes some of the LSIF aspects more deeply an old 0.3.x version of the specification is available [here](./versions/specification-0-3-x.md) -### Motivation +## Motivation Principal design goals: @@ -85,7 +85,7 @@ The corresponding graph looks like this Folding Range Result -### Ranges +### Ranges For requests that take a position as its input, we need to store the position as well. Usually LSP requests return the same result for positions that point to the same word / name in a document. Take the following TypeScript example: @@ -143,7 +143,7 @@ If a position in a document is mapped to a range and more than one range covers 1. end 1. return `null` -### Result Set +### Result Set Usually the hover result is the same whether you hover over a definition of a function or over a reference of that function. The same is actually true for many LSP requests like `textDocument/definition`, `textDocument/references` or `textDocument/typeDefinition`. In a naïve model, each range would have outgoing edges for all these LSP requests and would point to the corresponding results. To optimize this and to make the graph easier to understand, the concept of a `ResultSet` is introduced. A result set acts as a hub to be able to store information common to a lot of ranges. The `ResultSet` itself doesn't carry any information. So it looks like this: @@ -181,7 +181,9 @@ The pattern of storing the result with the `ResultSet` will be used for other re 1. end 1. otherwise return `null` -### Request: `textDocument/definition` +## Language Features + +### Request: `textDocument/definition` The same pattern of connecting a range, result set, or a document with a request edge to a method result is used for other requests as well. Let's next look at the `textDocument/definition` request using the following TypeScript sample: @@ -244,11 +246,11 @@ Running **Go to Definition** on `X` in `let x: X` will show a dialog which lets The `item` edge as an additional property document which indicate in which document these declaration are. We added this information to still make it easy to emit the data but also make it easy to process the data to store it in a database. Without that information we would either need to specific an order in which data needs to be emitted (e.g. a item edge and only refer to a range that got already added to a document using a `containes` edge) or we force processing tools to keep a lot of vertices and edges in memory. The approach of having this `document` property looks like a fair balance. -### Request: `textDocument/declaration` +### Request: `textDocument/declaration` There are programming languages that have the concept of declarations and definitions (like C/C++). If this is the case, the dump can contain a corresponding `declarationResult` vertex and a `textDocument/declaration` edge to store the information. They are handled analogously to the entities emitted for the `textDocument/definition` request. -### More about Request: `textDocument/hover` +### More about Request: `textDocument/hover` In the LSP, the hover is defined as follows: @@ -276,7 +278,7 @@ This makes the hover different for every location so we can't really store it wi { id: 6, type: "vertex", label: "hoverResult", result: { contents: [ { language: "typescript", value: "function bar(): void" } ], range: { line: 4, character: 2 }, end: { line: 4, character: 5 } } } ``` -### Request: `textDocument/references` +### Request: `textDocument/references` Storing references will be done in the same way as storing a hover or go to definition ranges. It uses a reference result vertex and `item` edges to add ranges to the result. @@ -461,7 +463,7 @@ In the above example, there will be three reference results For Typescript, method references are recorded at their most abstract declaration and if methods are merged (`B#foo`), they are combined using a reference result pointing to other results. -### Request: `textDocument/implementation` +### Request: `textDocument/implementation` Supporting a `textDocument/implementation` request is done reusing what we implemented for a `textDocument/references` request. In most cases, the `textDocument/implementation` returns the declaration values of the reference result that a symbol declaration points to. For cases where the result differs, the LSIF provides an `ImplementationResult`. To nest implementation results the `item` edge supports a `property` value `"implementationResults"`. @@ -474,7 +476,7 @@ interface ImplementationResult { } ``` -### Request: `textDocument/typeDefinition` +### Request: `textDocument/typeDefinition` Supporting `textDocument/typeDefinition` is straightforward. The edge is either recorded at the range or at the `ResultSet`. @@ -520,11 +522,11 @@ The relevant emitted vertices and edges looks like this: As with other results ranges get added using a `item` edge. In this case without a `property` since there is only on kind of range. -### Document requests +## Document requests The Language Server Protocol also supports requests for documents only (without any position information). These requests are `textDocument/foldingRange`, `textDocument/documentLink`, and `textDocument/documentSymbol`. We follow the same pattern as before to model these, the difference being that the result is linked to the document instead of to a range. -### Request: `textDocument/foldingRange` +### Request: `textDocument/foldingRange` For the folding range result this looks like this: @@ -563,7 +565,7 @@ export interface FoldingRangeResult { } ``` -### Request: `textDocument/documentLink` +### Request: `textDocument/documentLink` Again, for document links, we define a result type and a corresponding edge to link it to a document. Since the link location usually appear in comments, the ranges don't denote any symbol declarations or references. We therefore inline the range into the result like we do with folding ranges. @@ -575,7 +577,7 @@ export interface DocumentLinkResult { } ``` -### Request: `textDocument/documentSymbol` +### Request: `textDocument/documentSymbol` Next we look at the `textDocument/documentSymbol` request. This request usually returns an outline view of the document in hierarchical form. However, not all programming symbols declared or defined in a document are part of the result (for example, locals are usually omitted). In addition, an outline item needs to provide additional information like the full range and a symbol kind. There are two ways we can model this: either we do the same as we do for folding ranges and the document links and store the information in a document symbol result as literals, or we extend the range vertex with some additional information and refer to these ranges in the document symbol result. Since the additional information for ranges might be helpful in other scenarios as well, we support adding additional tags to these ranges by defining a `tag` property on the `range` vertex. @@ -744,7 +746,7 @@ Produces the following output: { id: 40 , type: "edge", label: "textDocument/documentSymbol", outV: 2, inV: 39 } ``` -### Request: `textDocument/diagnostic` +### Request: `textDocument/diagnostic` The only information missing that is useful in a dump are the diagnostics associated with documents. Diagnostics in the LSP are modeled as a push notifications sent from the server to the client. This doesn't work well with a dump modeled on request method names. However, the push notification can be emulated as a request where the request's result is the value sent during the push as a parameter. @@ -782,7 +784,7 @@ Produces the following output: Since diagnostics are not very common in dumps, no effort has been made to reuse ranges in diagnostics. -### The Project vertex +### The Project vertex Usually language servers operate in some sort of project context. In TypeScript, a project is defined using a `tsconfig.json` file. C# and C++ have their own means. The project file usually contains information about compile options and other parameters. Having these in the dump can be valuable. The LSIF therefore defines a project vertex. In addition, all documents that belong to that project are connected to the project using a `contains` edge. If there was a `tsconfig.json` in the previous examples, the first emitted edges and vertices would look like this: @@ -820,11 +822,13 @@ export interface Project extends V { } ``` -## Embedding contents +### Embedding contents It can be valuable to embed the contents of a document or project file into the dump as well. For example, if the content of the document is a virtual document generated from program meta data. The index format therefore supports an optional `contents` property on the `document` and `project` vertex. If used the content needs to be `base64` encoded. -## Events +## Advanced Concepts + +### Events To ease the processing of an LSIF dump to for example import it into a database the dump emits begin and end events for documents and projects. After the end event of a document has been emitted the dump must not contain any further data referencing that document. For example no ranges from that document can be referenced in `item` edges. Nor can result sets or other vertices linked to the ranges in that document. The document can however be reference in a `contains` edge adding the document to a project. The begin / end events for documents look like this: @@ -851,7 +855,7 @@ The events for projects looks similar: { id: 55, type: "vertex", label: "$event", kind: "end", scope: "project", data: 2 } ``` -## Project exports and external imports (Monikers) +### Project exports and external imports (Monikers) One use case of the LSIF is to create dumps for released versions of a product, either a library or a program. If a project **A** references a library **B**, it would also be useful if the information in these two dumps could be related. To make this possible, the LSIF introduces optional monikers which can be linked to ranges using a corresponding edge. The monikers can be used to describe what a project exports and what it imports. Let's first look at the export case. @@ -1002,7 +1006,7 @@ The moniker for `x` looks like this: In addition to this moniker schemes starting with `$` are reserved and shouldn't be used by a LSIF tool. -## Result ranges +### Result ranges Ranges in LSIF have currently two meanings: @@ -1011,7 +1015,7 @@ Ranges in LSIF have currently two meanings: To fulfil the first LSIF specifies that ranges can't overlap or be the same. However this constraint is not necessary for the second meaning. To support equal or overlapping target ranges we introduce a vertex `resultRange`. It is not allowed to use a `resultRange` as a target in a `contains` edge. -## Meta Data Vertex +### Meta Data Vertex To support versioning the LSIF defines a meta data vertex as follows: @@ -1053,7 +1057,7 @@ export interface MetaData { } ``` -## Emitting constraints +### Emitting constraints The following emitting constraints (some of which have already mean mentioned in the document) exists: @@ -1063,13 +1067,15 @@ The following emitting constraints (some of which have already mean mentioned in - after a document end event has been emitted only result sets, reference or implementation results emitted through that document can be referenced in edges. It is for example not allowed to reference ranges or result ranges from that document. This also includes adding monikers to ranges or result sets. The document data so to speak can not be altered anymore. - if ranges point to result sets and monikers are emitted, they must be emitted on the result set and can't be emitted on individual ranges. -## Tools +## Additional Information + +### Tools - [`lsif-protocol`](https://github.com/Microsoft/lsif-node/tree/master/protocol): Protocol defined as TypeScript interfaces - [`lsif-util`](https://github.com/jumattos/lsif-util): Utility tools for LSIF development - [`lsif-tsc`](https://github.com/Microsoft/lsif-node/tree/master/tsc): LSIF indexer for TypeScript - [`lsif-npm`](https://github.com/Microsoft/lsif-node/tree/master/npm): Linker for NPM monikers -## Open Questions +### Open Questions While implementing this for TypeScript and npm we collected a list of [open questions](https://github.com/Microsoft/lsif-typescript/labels/discussion) in form of GitHub issues we are already aware of.