@eagleoutice/flowr
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
119 lines • 4.71 kB
JavaScript
;
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