fish-lsp
Version:
LSP implementation for fish/fish-shell
166 lines (165 loc) • 7.73 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CompletionExample = exports.FishAliasCompletionItem = exports.FishAbbrCompletionItem = exports.FishCommandCompletionItem = exports.FishCompletionItem = exports.toCompletionItemKind = exports.FishCompletionItemKind = void 0;
const vscode_languageserver_1 = require("vscode-languageserver");
exports.FishCompletionItemKind = {
ABBR: 'abbr',
BUILTIN: 'builtin',
FUNCTION: 'function',
VARIABLE: 'variable',
EVENT: 'event',
PIPE: 'pipe',
ESC_CHARS: 'esc_chars',
STATUS: 'status',
WILDCARD: 'wildcard',
COMMAND: 'command',
ALIAS: 'alias',
REGEX: 'regex',
COMBINER: 'combiner',
FORMAT_STR: 'format_str',
STATEMENT: 'statement',
ARGUMENT: 'argument',
PATH: 'path',
EMPTY: 'empty',
SHEBANG: 'shebang',
COMMENT: 'comment',
DIAGNOSTIC: 'diagnostic',
};
exports.toCompletionItemKind = {
[exports.FishCompletionItemKind.ABBR]: vscode_languageserver_1.CompletionItemKind.Snippet,
[exports.FishCompletionItemKind.BUILTIN]: vscode_languageserver_1.CompletionItemKind.Keyword,
[exports.FishCompletionItemKind.FUNCTION]: vscode_languageserver_1.CompletionItemKind.Function,
[exports.FishCompletionItemKind.VARIABLE]: vscode_languageserver_1.CompletionItemKind.Variable,
[exports.FishCompletionItemKind.EVENT]: vscode_languageserver_1.CompletionItemKind.Event,
[exports.FishCompletionItemKind.PIPE]: vscode_languageserver_1.CompletionItemKind.Operator,
[exports.FishCompletionItemKind.ESC_CHARS]: vscode_languageserver_1.CompletionItemKind.Operator,
[exports.FishCompletionItemKind.STATUS]: vscode_languageserver_1.CompletionItemKind.EnumMember,
[exports.FishCompletionItemKind.WILDCARD]: vscode_languageserver_1.CompletionItemKind.Operator,
[exports.FishCompletionItemKind.COMMAND]: vscode_languageserver_1.CompletionItemKind.Class,
[exports.FishCompletionItemKind.ALIAS]: vscode_languageserver_1.CompletionItemKind.Constructor,
[exports.FishCompletionItemKind.REGEX]: vscode_languageserver_1.CompletionItemKind.Operator,
[exports.FishCompletionItemKind.COMBINER]: vscode_languageserver_1.CompletionItemKind.Keyword,
[exports.FishCompletionItemKind.FORMAT_STR]: vscode_languageserver_1.CompletionItemKind.Operator,
[exports.FishCompletionItemKind.STATEMENT]: vscode_languageserver_1.CompletionItemKind.Keyword,
[exports.FishCompletionItemKind.ARGUMENT]: vscode_languageserver_1.CompletionItemKind.Property,
[exports.FishCompletionItemKind.PATH]: vscode_languageserver_1.CompletionItemKind.File,
[exports.FishCompletionItemKind.EMPTY]: vscode_languageserver_1.CompletionItemKind.Text,
[exports.FishCompletionItemKind.SHEBANG]: vscode_languageserver_1.CompletionItemKind.File,
[exports.FishCompletionItemKind.COMMENT]: vscode_languageserver_1.CompletionItemKind.Text,
[exports.FishCompletionItemKind.DIAGNOSTIC]: vscode_languageserver_1.CompletionItemKind.Text,
};
class FishCompletionItem {
label;
fishKind;
detail;
documentation;
examples;
constructor(label, fishKind, detail, documentation, examples) {
this.label = label;
this.fishKind = fishKind;
this.detail = detail;
this.documentation = documentation;
this.examples = examples;
this.local = false;
this.useDocAsDetail = false;
this.setKinds(fishKind);
}
setKinds(kind) {
this.kind = exports.toCompletionItemKind[kind];
this.fishKind = kind;
return this;
}
setLocal() {
this.local = true;
return this;
}
setUseDocAsDetail() {
this.useDocAsDetail = true;
return this;
}
setData(data) {
this.data = data;
const removeLength = data.word ? data.word.length : 1;
this.textEdit = vscode_languageserver_1.TextEdit.replace(vscode_languageserver_1.Range.create({ line: data.position.line, character: data.position.character - removeLength }, data.position), this.insertText || this.label);
return this;
}
setPriority(priority) {
this.priority = priority;
return this;
}
}
exports.FishCompletionItem = FishCompletionItem;
class FishCommandCompletionItem extends FishCompletionItem {
}
exports.FishCommandCompletionItem = FishCommandCompletionItem;
class FishAbbrCompletionItem extends FishCommandCompletionItem {
constructor(label, detail, documentation) {
super(label, exports.FishCompletionItemKind.ABBR, detail, documentation);
const last = Math.max(documentation.lastIndexOf('#') + 1, documentation.length);
this.insertText = documentation.slice(label.length + 1, last);
this.commitCharacters = ['\t', ';', ' '];
}
}
exports.FishAbbrCompletionItem = FishAbbrCompletionItem;
class FishAliasCompletionItem extends FishCommandCompletionItem {
constructor(label, detail, documentation) {
super(label, exports.FishCompletionItemKind.ALIAS, detail, documentation);
this.documentation = documentation.slice(label.length + 1);
}
}
exports.FishAliasCompletionItem = FishAliasCompletionItem;
(function (FishCompletionItem) {
function create(label, kind, detail, documentation, examples) {
switch (kind) {
case exports.FishCompletionItemKind.ABBR:
return new FishAbbrCompletionItem(label, detail, documentation);
case exports.FishCompletionItemKind.ALIAS:
return new FishAliasCompletionItem(label, detail, documentation);
case exports.FishCompletionItemKind.COMMAND:
case exports.FishCompletionItemKind.BUILTIN:
case exports.FishCompletionItemKind.FUNCTION:
case exports.FishCompletionItemKind.VARIABLE:
case exports.FishCompletionItemKind.EVENT:
return new FishCommandCompletionItem(label, kind, detail, documentation);
default:
return new FishCompletionItem(label, kind, detail, documentation, examples);
}
}
FishCompletionItem.create = create;
function fromSymbol(symbol) {
switch (symbol.kind) {
case vscode_languageserver_1.SymbolKind.Function:
return create(symbol.name, exports.FishCompletionItemKind.FUNCTION, 'Function', symbol.detail).setLocal().setPriority(50);
case vscode_languageserver_1.SymbolKind.Variable:
return create(symbol.name, exports.FishCompletionItemKind.VARIABLE, 'Variable', symbol.detail).setLocal().setPriority(60);
default:
return create(symbol.name, exports.FishCompletionItemKind.EMPTY, 'Empty', symbol.detail).setLocal().setPriority(70);
}
}
FishCompletionItem.fromSymbol = fromSymbol;
function createData(uri, line, word, position, command, context) {
return { uri, line, word, position, command, context };
}
FishCompletionItem.createData = createData;
})(FishCompletionItem || (exports.FishCompletionItem = FishCompletionItem = {}));
var CompletionExample;
(function (CompletionExample) {
function create(title, ...shellText) {
const shellTextString = shellText.length > 1 ? shellText.join('\n') : shellText.at(0);
return {
title,
shellText: shellTextString,
};
}
CompletionExample.create = create;
function toMarkedString(example) {
return [
'___',
'```fish',
`# ${example.title}`,
example.shellText,
'```',
].join('\n');
}
CompletionExample.toMarkedString = toMarkedString;
})(CompletionExample || (exports.CompletionExample = CompletionExample = {}));