UNPKG

fish-lsp

Version:

LSP implementation for fish/fish-shell

122 lines (121 loc) 4.07 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FishCompletionList = exports.FishCompletionListBuilder = void 0; const types_1 = require("./types"); const vscode_languageserver_1 = require("vscode-languageserver"); class FishCompletionListBuilder { logger; items; data = {}; constructor(logger) { this.logger = logger; this.items = []; } addItem(item) { this.items.push(item); } addItems(items, priority) { if (priority) { items = items.map((item) => item.setPriority(priority)); } this.items.push(...items); } addSymbols(symbols, insertDollarSign = false) { const symbolItems = symbols.map((symbol) => { if (insertDollarSign && symbol.kind === vscode_languageserver_1.SymbolKind.Variable) { return { ...types_1.FishCompletionItem.fromSymbol(symbol), label: '$' + symbol.name, }; } return types_1.FishCompletionItem.fromSymbol(symbol); }); this.items.push(...symbolItems); } addData(data) { this.items = this.items.map((item) => { if (!data.line.endsWith(' ')) { const newData = { ...data, line: data.line.slice(0, data.line.length - data.word.length) + item.label, }; return item.setData(newData); } return item; }); return this; } reset() { this.items = []; } sortByPriority(items) { const DEFAULT_PRIORITY = 1000; const getFallbackPrioriy = (item) => { if (item.kind === vscode_languageserver_1.CompletionItemKind.Property) { return 1005; } if (item.kind === vscode_languageserver_1.CompletionItemKind.Class) { return 10; } if (item.kind === vscode_languageserver_1.CompletionItemKind.Function) { return 50; } if (item.kind === vscode_languageserver_1.CompletionItemKind.Variable) { return 100; } return DEFAULT_PRIORITY; }; return items.sort((a, b) => { const priorityA = a.priority !== undefined ? a.priority : getFallbackPrioriy(a); const priorityB = b.priority !== undefined ? b.priority : getFallbackPrioriy(b); if (priorityA !== priorityB) { return priorityA - priorityB; } return a.label.localeCompare(b.label); }); } build(isIncomplete = false) { const uniqueItems = this.items.filter((item, index, self) => index === self.findIndex((t) => t.label === item.label)); const sortedItems = this.sortByPriority(uniqueItems); return FishCompletionList.create(isIncomplete, this.data, sortedItems); } log() { const result = this.items.map((item, index) => itemLoggingInfo(item, index)); this.logger.log('CompletionList', result); } get _logger() { return this.logger; } } exports.FishCompletionListBuilder = FishCompletionListBuilder; function itemLoggingInfo(item, index) { return { index, label: item.label, detail: item.detail, kind: types_1.toCompletionItemKind[item.fishKind], fishKind: item.fishKind, documentation: item.documentation, data: item.data, }; } var FishCompletionList; (function (FishCompletionList) { function empty() { return { isIncomplete: false, items: [], }; } FishCompletionList.empty = empty; function create(isIncomplete, data, items = []) { return { isIncomplete, items, itemDefaults: { data, }, }; } FishCompletionList.create = create; })(FishCompletionList || (exports.FishCompletionList = FishCompletionList = {}));