fish-lsp
Version:
LSP implementation for fish/fish-shell
130 lines (129 loc) • 6.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ReadModifiers = exports.ReadOptions = void 0;
exports.isReadVariableDefinitionName = isReadVariableDefinitionName;
exports.isReadDefinition = isReadDefinition;
exports.processReadCommand = processReadCommand;
const options_1 = require("./options");
const node_types_1 = require("../utils/node-types");
const symbol_1 = require("./symbol");
const definition_scope_1 = require("../utils/definition-scope");
exports.ReadOptions = [
options_1.Option.create('-U', '--universal'),
options_1.Option.create('-f', '--function'),
options_1.Option.create('-l', '--local'),
options_1.Option.create('-g', '--global'),
options_1.Option.create('-u', '--unexport'),
options_1.Option.create('-x', '--export'),
options_1.Option.create('-c', '--command').withValue(),
options_1.Option.create('-s', '--silent'),
options_1.Option.create('-p', '--prompt').withValue(),
options_1.Option.create('-P', '--prompt-str').withValue(),
options_1.Option.create('-R', '--right-prompt').withValue(),
options_1.Option.create('-S', '--shell'),
options_1.Option.create('-d', '--delimiter').withValue(),
options_1.Option.create('-n', '--nchars').withValue(),
options_1.Option.create('-t', '--tokenize'),
options_1.Option.create('-a', '--list').withAliases('--array'),
options_1.Option.create('-z', '--null'),
options_1.Option.create('-L', '--line'),
options_1.Option.create('-h', '--help'),
];
exports.ReadModifiers = [
options_1.Option.create('-U', '--universal'),
options_1.Option.create('-f', '--function'),
options_1.Option.create('-l', '--local'),
options_1.Option.create('-g', '--global'),
];
function isReadVariableDefinitionName(node) {
if (!node.parent || !isReadDefinition(node.parent))
return false;
const { definitionNodes } = findReadChildren(node.parent);
return !!definitionNodes.find(n => n.equals(node));
}
function isReadDefinition(node) {
return (0, node_types_1.isCommandWithName)(node, 'read') && !node.children.some(child => (0, options_1.isMatchingOption)(child, options_1.Option.create('-q', '--query')));
}
function getFallbackModifierScope(document, node) {
const autoloadType = document.getAutoloadType();
switch (autoloadType) {
case 'conf.d':
case 'config':
case 'functions':
return (0, node_types_1.isTopLevelDefinition)(node) ? 'global' : (0, node_types_1.hasParentFunction)(node) ? 'function' : 'inherit';
case 'completions':
return (0, node_types_1.isTopLevelDefinition)(node) ? 'local' : (0, node_types_1.hasParentFunction)(node) ? 'function' : 'local';
case '':
return 'local';
default:
return 'inherit';
}
}
function findReadChildren(node) {
let modifier = undefined;
const definitionNodes = [];
const allFocused = node.childrenForFieldName('argument')
.filter((n) => {
switch (true) {
case (0, options_1.isMatchingOption)(n, options_1.Option.create('-l', '--local')):
case (0, options_1.isMatchingOption)(n, options_1.Option.create('-f', '--function')):
case (0, options_1.isMatchingOption)(n, options_1.Option.create('-g', '--global')):
case (0, options_1.isMatchingOption)(n, options_1.Option.create('-U', '--universal')):
modifier = (0, options_1.findMatchingOptions)(n, ...exports.ReadModifiers);
return false;
case (0, options_1.isMatchingOption)(n, options_1.Option.create('-c', '--command')):
return false;
case (0, options_1.isMatchingOption)(n.previousSibling, options_1.Option.create('-d', '--delimiter')):
case (0, options_1.isMatchingOption)(n, options_1.Option.create('-d', '--delimiter')):
return false;
case (0, options_1.isMatchingOption)(n.previousSibling, options_1.Option.create('-n', '--nchars')):
case (0, options_1.isMatchingOption)(n, options_1.Option.create('-n', '--nchars')):
return false;
case (0, options_1.isMatchingOption)(n.previousSibling, options_1.Option.create('-p', '--prompt')):
case (0, options_1.isMatchingOption)(n, options_1.Option.create('-p', '--prompt')):
return false;
case (0, options_1.isMatchingOption)(n.previousSibling, options_1.Option.create('-P', '--prompt-str')):
case (0, options_1.isMatchingOption)(n, options_1.Option.create('-P', '--prompt-str')):
return false;
case (0, options_1.isMatchingOption)(n.previousSibling, options_1.Option.create('-R', '--right-prompt')):
case (0, options_1.isMatchingOption)(n, options_1.Option.create('-R', '--right-prompt')):
return false;
case (0, options_1.isMatchingOption)(n, options_1.Option.create('-s', '--silent')):
case (0, options_1.isMatchingOption)(n, options_1.Option.create('-S', '--shell')):
case (0, options_1.isMatchingOption)(n, options_1.Option.create('-t', '--tokenize')):
case (0, options_1.isMatchingOption)(n, options_1.Option.create('-u', '--unexport')):
case (0, options_1.isMatchingOption)(n, options_1.Option.create('-x', '--export')):
case (0, options_1.isMatchingOption)(n, options_1.Option.create('-a', '--list')):
case (0, options_1.isMatchingOption)(n, options_1.Option.create('-z', '--null')):
case (0, options_1.isMatchingOption)(n, options_1.Option.create('-L', '--line')):
return false;
default:
return true;
}
});
allFocused.forEach((arg) => {
if ((0, node_types_1.isOption)(arg))
return;
if ((0, node_types_1.isString)(arg))
return;
definitionNodes.push(arg);
});
return {
definitionNodes,
modifier,
};
}
function processReadCommand(document, node, children = []) {
const result = [];
const { definitionNodes, modifier } = findReadChildren(node);
const scopeModifier = modifier ? (0, symbol_1.SetModifierToScopeTag)(modifier) : getFallbackModifierScope(document, node);
const definitionScope = scopeModifier === 'global'
? definition_scope_1.DefinitionScope.create((0, node_types_1.findParent)(node, node_types_1.isProgram), scopeModifier)
: definition_scope_1.DefinitionScope.create((0, node_types_1.findParent)(node, node_types_1.isFunctionDefinition || node_types_1.isProgram), scopeModifier);
for (const arg of definitionNodes) {
if (arg.text.startsWith('$'))
continue;
result.push(symbol_1.FishSymbol.create(arg.text, node, arg, 'READ', document, document.uri, node.text, definitionScope, children));
}
return result;
}