UNPKG

fish-lsp

Version:

LSP implementation for fish/fish-shell

130 lines (129 loc) 6.9 kB
"use strict"; 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; }