UNPKG

fish-lsp

Version:

LSP implementation for fish/fish-shell

62 lines (61 loc) 2.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getDocumentHighlights = getDocumentHighlights; const tree_sitter_1 = require("./utils/tree-sitter"); const vscode_languageserver_1 = require("vscode-languageserver"); const node_types_1 = require("./utils/node-types"); const references_1 = require("./references"); const builtins_1 = require("./utils/builtins"); function getDocumentHighlights(analyzer) { function convertSymbolLocationsToHighlights(doc, locations) { return locations .filter(loc => loc.uri === doc.uri) .map(loc => { return { range: loc.range, kind: vscode_languageserver_1.DocumentHighlightKind.Text, }; }); } return function (params) { const { uri } = params.textDocument; const { line, character } = params.position; const doc = analyzer.getDocument(uri); if (!doc) return []; const word = analyzer.wordAtPoint(uri, line, character); if (!word || word.trim() === '') return []; const nodes = analyzer.getNodes(uri); if ((0, builtins_1.isBuiltin)(word)) { return nodes .filter(n => (0, builtins_1.isBuiltin)(n.text) && n.text === word) .map(n => { return { range: (0, tree_sitter_1.getRange)(n), kind: vscode_languageserver_1.DocumentHighlightKind.Text, }; }); } const symbol = analyzer.getDefinition(doc, params.position); const node = analyzer.nodeAtPoint(uri, line, character); if (!node || !node.isNamed) return []; if (!symbol && (0, node_types_1.isCommandName)(node)) { const matchingCommandNodes = nodes.filter(n => (0, node_types_1.isCommandName)(n) && n.text === node.text); return matchingCommandNodes.map(n => { return { range: (0, tree_sitter_1.getRange)(n), kind: vscode_languageserver_1.DocumentHighlightKind.Text, }; }); } if (symbol) { const refLocations = (0, references_1.getReferences)(doc, symbol.selectionRange.start, { localOnly: true }); if (!refLocations) return []; return convertSymbolLocationsToHighlights(doc, refLocations); } return []; }; }