fish-lsp
Version:
LSP implementation for fish/fish-shell
71 lines (70 loc) • 3.18 kB
JavaScript
;
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,
};
}