fish-lsp
Version:
LSP implementation for fish/fish-shell
122 lines (121 loc) • 4.07 kB
JavaScript
;
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 = {}));