UNPKG

11.6 kBJavaScriptView Raw
1"use strict";
2var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3 function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4 return new (P || (P = Promise))(function (resolve, reject) {
5 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7 function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8 step((generator = generator.apply(thisArg, _arguments || [])).next());
9 });
10};
11Object.defineProperty(exports, "__esModule", { value: true });
12const convert_1 = require("../convert");
13const Utils = require("../utils");
14/** Public: Adapts the language server protocol "textDocument/hover" to the Atom IDE UI Datatip package. */
15class DatatipAdapter {
16 /**
17 * Public: Determine whether this adapter can be used to adapt a language server based on the serverCapabilities
18 * matrix containing a hoverProvider.
19 *
20 * @param serverCapabilities The {ServerCapabilities} of the language server to consider.
21 * @returns A {Boolean} indicating adapter can adapt the server based on the given serverCapabilities.
22 */
23 static canAdapt(serverCapabilities) {
24 return serverCapabilities.hoverProvider === true;
25 }
26 /**
27 * Public: Get the Datatip for this {Point} in a {TextEditor} by querying the language server.
28 *
29 * @param connection A {LanguageClientConnection} to the language server that will be queried for the hover text/datatip.
30 * @param editor The Atom {TextEditor} containing the text the Datatip should relate to.
31 * @param point The Atom {Point} containing the point within the text the Datatip should relate to.
32 * @returns A {Promise} containing the {Datatip} to display or {null} if no Datatip is available.
33 */
34 getDatatip(connection, editor, point) {
35 return __awaiter(this, void 0, void 0, function* () {
36 const documentPositionParams = convert_1.default.editorToTextDocumentPositionParams(editor, point);
37 const hover = yield connection.hover(documentPositionParams);
38 if (hover == null || DatatipAdapter.isEmptyHover(hover)) {
39 return null;
40 }
41 const range = hover.range == null ? Utils.getWordAtPosition(editor, point) : convert_1.default.lsRangeToAtomRange(hover.range);
42 const markedStrings = (Array.isArray(hover.contents) ? hover.contents : [hover.contents]).map((str) => DatatipAdapter.convertMarkedString(editor, str));
43 return { range, markedStrings };
44 });
45 }
46 static isEmptyHover(hover) {
47 return (hover.contents == null ||
48 (typeof hover.contents === "string" && hover.contents.length === 0) ||
49 (Array.isArray(hover.contents) && (hover.contents.length === 0 || hover.contents[0] === "")));
50 }
51 static convertMarkedString(editor, markedString) {
52 if (typeof markedString === "string") {
53 return { type: "markdown", value: markedString };
54 }
55 if (markedString.kind) {
56 return {
57 type: "markdown",
58 value: markedString.value,
59 };
60 }
61 // Must check as <{language: string}> to disambiguate between
62 // string and the more explicit object type because MarkedString
63 // is a union of the two types
64 if (markedString.language) {
65 return {
66 type: "snippet",
67 // TODO: find a better mapping from language -> grammar
68 grammar: atom.grammars.grammarForScopeName(`source.${markedString.language}`) ||
69 editor.getGrammar(),
70 value: markedString.value,
71 };
72 }
73 // Catch-all case
74 return { type: "markdown", value: markedString.toString() };
75 }
76}
77exports.default = DatatipAdapter;
78//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXRpcC1hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2FkYXB0ZXJzL2RhdGF0aXAtYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUNBLHdDQUFnQztBQUNoQyxrQ0FBaUM7QUFJakMsMkdBQTJHO0FBQzNHLE1BQXFCLGNBQWM7SUFDakM7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FBQyxrQkFBc0M7UUFDM0QsT0FBTyxrQkFBa0IsQ0FBQyxhQUFhLEtBQUssSUFBSSxDQUFBO0lBQ2xELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ1UsVUFBVSxDQUNyQixVQUFvQyxFQUNwQyxNQUFrQixFQUNsQixLQUFZOztZQUVaLE1BQU0sc0JBQXNCLEdBQUcsaUJBQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFFeEYsTUFBTSxLQUFLLEdBQUcsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUE7WUFDNUQsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLGNBQWMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3ZELE9BQU8sSUFBSSxDQUFBO2FBQ1o7WUFFRCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7WUFFcEgsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUNwRyxjQUFjLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUNoRCxDQUFBO1lBRUQsT0FBTyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsQ0FBQTtRQUNqQyxDQUFDO0tBQUE7SUFFTyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQVk7UUFDdEMsT0FBTyxDQUNMLEtBQUssQ0FBQyxRQUFRLElBQUksSUFBSTtZQUN0QixDQUFDLE9BQU8sS0FBSyxDQUFDLFFBQVEsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1lBQ25FLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUM3RixDQUFBO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxtQkFBbUIsQ0FDaEMsTUFBa0IsRUFDbEIsWUFBMEM7UUFFMUMsSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRLEVBQUU7WUFDcEMsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxDQUFBO1NBQ2pEO1FBRUQsSUFBSyxZQUE4QixDQUFDLElBQUksRUFBRTtZQUN4QyxPQUFPO2dCQUNMLElBQUksRUFBRSxVQUFVO2dCQUNoQixLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUs7YUFDMUIsQ0FBQTtTQUNGO1FBRUQsNkRBQTZEO1FBQzdELGdFQUFnRTtRQUNoRSw4QkFBOEI7UUFDOUIsSUFBSyxZQUFxQyxDQUFDLFFBQVEsRUFBRTtZQUNuRCxPQUFPO2dCQUNMLElBQUksRUFBRSxTQUFTO2dCQUNmLHVEQUF1RDtnQkFDdkQsT0FBTyxFQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsVUFBVyxZQUFxQyxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUM5RixNQUFNLENBQUMsVUFBVSxFQUFFO2dCQUNyQixLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUs7YUFDMUIsQ0FBQTtTQUNGO1FBRUQsaUJBQWlCO1FBQ2pCLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQTtJQUM3RCxDQUFDO0NBQ0Y7QUFqRkQsaUNBaUZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgKiBhcyBhdG9tSWRlIGZyb20gXCJhdG9tLWlkZS1iYXNlXCJcbmltcG9ydCBDb252ZXJ0IGZyb20gXCIuLi9jb252ZXJ0XCJcbmltcG9ydCAqIGFzIFV0aWxzIGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBIb3ZlciwgTGFuZ3VhZ2VDbGllbnRDb25uZWN0aW9uLCBNYXJrdXBDb250ZW50LCBNYXJrZWRTdHJpbmcsIFNlcnZlckNhcGFiaWxpdGllcyB9IGZyb20gXCIuLi9sYW5ndWFnZWNsaWVudFwiXG5pbXBvcnQgeyBQb2ludCwgVGV4dEVkaXRvciB9IGZyb20gXCJhdG9tXCJcblxuLyoqIFB1YmxpYzogQWRhcHRzIHRoZSBsYW5ndWFnZSBzZXJ2ZXIgcHJvdG9jb2wgXCJ0ZXh0RG9jdW1lbnQvaG92ZXJcIiB0byB0aGUgQXRvbSBJREUgVUkgRGF0YXRpcCBwYWNrYWdlLiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGF0YXRpcEFkYXB0ZXIge1xuICAvKipcbiAgICogUHVibGljOiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGFkYXB0ZXIgY2FuIGJlIHVzZWQgdG8gYWRhcHQgYSBsYW5ndWFnZSBzZXJ2ZXIgYmFzZWQgb24gdGhlIHNlcnZlckNhcGFiaWxpdGllc1xuICAgKiBtYXRyaXggY29udGFpbmluZyBhIGhvdmVyUHJvdmlkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2ZXJDYXBhYmlsaXRpZXMgVGhlIHtTZXJ2ZXJDYXBhYmlsaXRpZXN9IG9mIHRoZSBsYW5ndWFnZSBzZXJ2ZXIgdG8gY29uc2lkZXIuXG4gICAqIEByZXR1cm5zIEEge0Jvb2xlYW59IGluZGljYXRpbmcgYWRhcHRlciBjYW4gYWRhcHQgdGhlIHNlcnZlciBiYXNlZCBvbiB0aGUgZ2l2ZW4gc2VydmVyQ2FwYWJpbGl0aWVzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjYW5BZGFwdChzZXJ2ZXJDYXBhYmlsaXRpZXM6IFNlcnZlckNhcGFiaWxpdGllcyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzZXJ2ZXJDYXBhYmlsaXRpZXMuaG92ZXJQcm92aWRlciA9PT0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYzogR2V0IHRoZSBEYXRhdGlwIGZvciB0aGlzIHtQb2ludH0gaW4gYSB7VGV4dEVkaXRvcn0gYnkgcXVlcnlpbmcgdGhlIGxhbmd1YWdlIHNlcnZlci5cbiAgICpcbiAgICogQHBhcmFtIGNvbm5lY3Rpb24gQSB7TGFuZ3VhZ2VDbGllbnRDb25uZWN0aW9ufSB0byB0aGUgbGFuZ3VhZ2Ugc2VydmVyIHRoYXQgd2lsbCBiZSBxdWVyaWVkIGZvciB0aGUgaG92ZXIgdGV4dC9kYXRhdGlwLlxuICAgKiBAcGFyYW0gZWRpdG9yIFRoZSBBdG9tIHtUZXh0RWRpdG9yfSBjb250YWluaW5nIHRoZSB0ZXh0IHRoZSBEYXRhdGlwIHNob3VsZCByZWxhdGUgdG8uXG4gICAqIEBwYXJhbSBwb2ludCBUaGUgQXRvbSB7UG9pbnR9IGNvbnRhaW5pbmcgdGhlIHBvaW50IHdpdGhpbiB0aGUgdGV4dCB0aGUgRGF0YXRpcCBzaG91bGQgcmVsYXRlIHRvLlxuICAgKiBAcmV0dXJucyBBIHtQcm9taXNlfSBjb250YWluaW5nIHRoZSB7RGF0YXRpcH0gdG8gZGlzcGxheSBvciB7bnVsbH0gaWYgbm8gRGF0YXRpcCBpcyBhdmFpbGFibGUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RGF0YXRpcChcbiAgICBjb25uZWN0aW9uOiBMYW5ndWFnZUNsaWVudENvbm5lY3Rpb24sXG4gICAgZWRpdG9yOiBUZXh0RWRpdG9yLFxuICAgIHBvaW50OiBQb2ludFxuICApOiBQcm9taXNlPGF0b21JZGUuRGF0YXRpcCB8IG51bGw+IHtcbiAgICBjb25zdCBkb2N1bWVudFBvc2l0aW9uUGFyYW1zID0gQ29udmVydC5lZGl0b3JUb1RleHREb2N1bWVudFBvc2l0aW9uUGFyYW1zKGVkaXRvciwgcG9pbnQpXG5cbiAgICBjb25zdCBob3ZlciA9IGF3YWl0IGNvbm5lY3Rpb24uaG92ZXIoZG9jdW1lbnRQb3NpdGlvblBhcmFtcylcbiAgICBpZiAoaG92ZXIgPT0gbnVsbCB8fCBEYXRhdGlwQWRhcHRlci5pc0VtcHR5SG92ZXIoaG92ZXIpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0IHJhbmdlID0gaG92ZXIucmFuZ2UgPT0gbnVsbCA/IFV0aWxzLmdldFdvcmRBdFBvc2l0aW9uKGVkaXRvciwgcG9pbnQpIDogQ29udmVydC5sc1JhbmdlVG9BdG9tUmFuZ2UoaG92ZXIucmFuZ2UpXG5cbiAgICBjb25zdCBtYXJrZWRTdHJpbmdzID0gKEFycmF5LmlzQXJyYXkoaG92ZXIuY29udGVudHMpID8gaG92ZXIuY29udGVudHMgOiBbaG92ZXIuY29udGVudHNdKS5tYXAoKHN0cikgPT5cbiAgICAgIERhdGF0aXBBZGFwdGVyLmNvbnZlcnRNYXJrZWRTdHJpbmcoZWRpdG9yLCBzdHIpXG4gICAgKVxuXG4gICAgcmV0dXJuIHsgcmFuZ2UsIG1hcmtlZFN0cmluZ3MgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaXNFbXB0eUhvdmVyKGhvdmVyOiBIb3Zlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBob3Zlci5jb250ZW50cyA9PSBudWxsIHx8XG4gICAgICAodHlwZW9mIGhvdmVyLmNvbnRlbnRzID09PSBcInN0cmluZ1wiICYmIGhvdmVyLmNvbnRlbnRzLmxlbmd0aCA9PT0gMCkgfHxcbiAgICAgIChBcnJheS5pc0FycmF5KGhvdmVyLmNvbnRlbnRzKSAmJiAoaG92ZXIuY29udGVudHMubGVuZ3RoID09PSAwIHx8IGhvdmVyLmNvbnRlbnRzWzBdID09PSBcIlwiKSlcbiAgICApXG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjb252ZXJ0TWFya2VkU3RyaW5nKFxuICAgIGVkaXRvcjogVGV4dEVkaXRvcixcbiAgICBtYXJrZWRTdHJpbmc6IE1hcmtlZFN0cmluZyB8IE1hcmt1cENvbnRlbnRcbiAgKTogYXRvbUlkZS5NYXJrZWRTdHJpbmcge1xuICAgIGlmICh0eXBlb2YgbWFya2VkU3RyaW5nID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcIm1hcmtkb3duXCIsIHZhbHVlOiBtYXJrZWRTdHJpbmcgfVxuICAgIH1cblxuICAgIGlmICgobWFya2VkU3RyaW5nIGFzIE1hcmt1cENvbnRlbnQpLmtpbmQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwibWFya2Rvd25cIixcbiAgICAgICAgdmFsdWU6IG1hcmtlZFN0cmluZy52YWx1ZSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNdXN0IGNoZWNrIGFzIDx7bGFuZ3VhZ2U6IHN0cmluZ30+IHRvIGRpc2FtYmlndWF0ZSBiZXR3ZWVuXG4gICAgLy8gc3RyaW5nIGFuZCB0aGUgbW9yZSBleHBsaWNpdCBvYmplY3QgdHlwZSBiZWNhdXNlIE1hcmtlZFN0cmluZ1xuICAgIC8vIGlzIGEgdW5pb24gb2YgdGhlIHR3byB0eXBlc1xuICAgIGlmICgobWFya2VkU3RyaW5nIGFzIHsgbGFuZ3VhZ2U6IHN0cmluZyB9KS5sYW5ndWFnZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJzbmlwcGV0XCIsXG4gICAgICAgIC8vIFRPRE86IGZpbmQgYSBiZXR0ZXIgbWFwcGluZyBmcm9tIGxhbmd1YWdlIC0+IGdyYW1tYXJcbiAgICAgICAgZ3JhbW1hcjpcbiAgICAgICAgICBhdG9tLmdyYW1tYXJzLmdyYW1tYXJGb3JTY29wZU5hbWUoYHNvdXJjZS4keyhtYXJrZWRTdHJpbmcgYXMgeyBsYW5ndWFnZTogc3RyaW5nIH0pLmxhbmd1YWdlfWApIHx8XG4gICAgICAgICAgZWRpdG9yLmdldEdyYW1tYXIoKSxcbiAgICAgICAgdmFsdWU6IG1hcmtlZFN0cmluZy52YWx1ZSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYXRjaC1hbGwgY2FzZVxuICAgIHJldHVybiB7IHR5cGU6IFwibWFya2Rvd25cIiwgdmFsdWU6IG1hcmtlZFN0cmluZy50b1N0cmluZygpIH1cbiAgfVxufVxuIl19
\No newline at end of file