UNPKG

fish-lsp

Version:

LSP implementation for fish/fish-shell

71 lines (70 loc) 3.18 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.LocalFishLspDocumentVariable = void 0; exports.configDefinitionParser = configDefinitionParser; const node_types_1 = require("../utils/node-types"); const config_1 = require("../config"); const set_1 = require("./set"); const options_1 = require("./options"); const file_operations_1 = require("../utils/file-operations"); const vscode_languageserver_1 = require("vscode-languageserver"); var LocalFishLspDocumentVariable; (function (LocalFishLspDocumentVariable) { function isConfigVariableDefinition(symbol) { if (symbol.kind !== vscode_languageserver_1.SymbolKind.Variable || symbol.fishKind !== 'SET') { return false; } return Object.keys(config_1.config).includes(symbol.name); } LocalFishLspDocumentVariable.isConfigVariableDefinition = isConfigVariableDefinition; function isConfigVariableDefinitionWithErase(symbol) { if (!symbol.isConfigDefinition()) { return false; } return hasEraseFlag(symbol); } LocalFishLspDocumentVariable.isConfigVariableDefinitionWithErase = isConfigVariableDefinitionWithErase; function findValueNodes(symbol) { const valueNodes = []; if (!symbol.isConfigDefinition()) return valueNodes; let node = symbol.focusedNode.nextNamedSibling; while (node) { if (!isEmptyString(node)) valueNodes.push(node); node = node.nextNamedSibling; } return valueNodes; } LocalFishLspDocumentVariable.findValueNodes = findValueNodes; function nodeToShellValue(node) { let text = node.text; if ((0, node_types_1.isString)(node)) text = text.slice(1, -1); return file_operations_1.SyncFileHelper.expandEnvVars(text); } LocalFishLspDocumentVariable.nodeToShellValue = nodeToShellValue; LocalFishLspDocumentVariable.eraseOption = options_1.Option.create('-e', '--erase'); function hasEraseFlag(symbol) { const definitionNode = symbol.focusedNode; const children = (0, set_1.findSetChildren)(symbol.node) .filter(s => s.startIndex < definitionNode.startIndex); return children.some(s => (0, node_types_1.isMatchingOption)(s, LocalFishLspDocumentVariable.eraseOption)); } LocalFishLspDocumentVariable.hasEraseFlag = hasEraseFlag; })(LocalFishLspDocumentVariable || (exports.LocalFishLspDocumentVariable = LocalFishLspDocumentVariable = {})); function isEmptyString(node) { return (0, node_types_1.isString)(node) && node.text.length === 2; } function configDefinitionParser(symbol) { const isDefinition = LocalFishLspDocumentVariable.isConfigVariableDefinition(symbol); const isDefinitionWithErase = LocalFishLspDocumentVariable.isConfigVariableDefinitionWithErase(symbol); const valueNodes = LocalFishLspDocumentVariable.findValueNodes(symbol); const values = valueNodes.map(node => LocalFishLspDocumentVariable.nodeToShellValue(node)); return { isDefinition, isErase: isDefinitionWithErase, valueNodes, values, }; }