fish-lsp
Version:
LSP implementation for fish/fish-shell
62 lines (61 loc) • 2.5 kB
JavaScript
;
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 [];
};
}