UNPKG

@eagleoutice/flowr

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

119 lines 4.71 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.resolveIdToArgName = resolveIdToArgName; exports.resolveIdToArgValue = resolveIdToArgValue; exports.resolveIdToArgStringVector = resolveIdToArgStringVector; exports.resolveIdToArgValueSymbolName = resolveIdToArgValueSymbolName; exports.resolveIdToArgVectorLength = resolveIdToArgVectorLength; exports.unquoteArgument = unquoteArgument; exports.unescapeQuotes = unescapeQuotes; exports.unescapeSpecialChars = unescapeSpecialChars; const alias_tracking_1 = require("../../dataflow/eval/resolve/alias-tracking"); const type_1 = require("../../r-bridge/lang-4.x/ast/model/type"); const assert_1 = require("../../util/assert"); const r_value_1 = require("../../util/r-value"); const strings_1 = require("../../util/text/strings"); const identifier_1 = require("../../dataflow/environments/identifier"); /** * Returns the argument name of a function argument */ function resolveIdToArgName(id, info) { const node = resolveIdToArgument(id, info); return unquoteArgument(node?.name?.content); } /** * Resolves the value of a function argument as string, number, boolean, or vector using {@link resolveIdToValue} */ function resolveIdToArgValue(id, info) { const node = resolveIdToArgument(id, info); if (node?.value !== undefined) { const resolvedValue = (0, alias_tracking_1.resolveIdToValue)(node.value, info); const unliftedValue = (0, r_value_1.unliftRValue)(resolvedValue); if (Array.isArray(unliftedValue)) { return (0, r_value_1.unwrapRVector)(unliftedValue); } else { return (0, r_value_1.unwrapRValue)(unliftedValue); } } return undefined; } /** * Resolves the value of a function argument to a string vector using {@link resolveIdToValue} and {@link unwrapRValueToString} */ function resolveIdToArgStringVector(id, info) { const node = resolveIdToArgument(id, info); if (node?.value !== undefined) { const resolvedValue = (0, alias_tracking_1.resolveIdToValue)(node.value, info); const unliftedValue = (0, r_value_1.unliftRValue)(resolvedValue); if (Array.isArray(unliftedValue)) { const array = unliftedValue.map(r_value_1.unwrapRValueToString); return array.every(assert_1.isNotUndefined) ? array : undefined; } else { const result = (0, r_value_1.unwrapRValueToString)(unliftedValue); return result !== undefined ? [result] : undefined; } } return undefined; } /** * Returns the symbol name or string value of the value of a function argument */ function resolveIdToArgValueSymbolName(id, info) { const node = resolveIdToArgument(id, info); if (node?.value?.type === type_1.RType.Symbol) { return unquoteArgument(identifier_1.Identifier.toString(node.value.content)); } else if (node?.value?.type === type_1.RType.String) { return node.value.content.str; } return undefined; } /** * Resolves the vector length of the value of a function argument using {@link resolveIdToValue} */ function resolveIdToArgVectorLength(id, info) { const node = resolveIdToArgument(id, info); if (node?.value !== undefined) { const resolvedValue = (0, alias_tracking_1.resolveIdToValue)(node.value, info); const unliftedValue = (0, r_value_1.unliftRValue)(resolvedValue); if (Array.isArray(unliftedValue)) { return unliftedValue.length; } else if ((0, r_value_1.unwrapRValue)(unliftedValue) !== undefined) { return 1; } } return undefined; } function resolveIdToArgument(id, { graph, idMap }) { idMap ??= graph?.idMap; const node = id === undefined || typeof id === 'object' ? id : idMap?.get(id); if (node?.type === type_1.RType.Argument) { return node; } return undefined; } function unquoteArgument(argument) { if (argument === undefined) { return undefined; } else if ((0, strings_1.startAndEndsWith)(argument, '`') || (0, strings_1.startAndEndsWith)(argument, '"') || (0, strings_1.startAndEndsWith)(argument, '\'')) { return argument.slice(1, -1); } return argument; } function unescapeQuotes(argument) { if (argument === undefined) { return undefined; } return argument.replaceAll('\\\'', '\'').replaceAll('\\"', '"'); } function unescapeSpecialChars(argument) { if (argument === undefined) { return undefined; } return unescapeQuotes(argument).replaceAll('\\r', '\r').replaceAll('\\n', '\n').replaceAll('\\t', '\t').replaceAll('\\\\', '\\'); } //# sourceMappingURL=resolve-args.js.map