UNPKG

@eagleoutice/flowr

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

73 lines 2.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.bottomTopGuard = bottomTopGuard; exports.valueSetGuard = valueSetGuard; exports.valueFromTsValue = valueFromTsValue; exports.valueFromRNodeConstant = valueFromRNodeConstant; const type_1 = require("../../../r-bridge/lang-4.x/ast/model/type"); const interval_constants_1 = require("./intervals/interval-constants"); const logical_constants_1 = require("./logical/logical-constants"); const r_value_1 = require("./r-value"); const string_constants_1 = require("./string/string-constants"); /** * Takes n potentially lifted ops and returns `Top` or `Bottom` if any is `Top` or `Bottom`. */ function bottomTopGuard(...a) { if (a.some(r_value_1.isBottom)) { return r_value_1.Bottom; } else if (a.some(r_value_1.isTop)) { return r_value_1.Top; } } /** * Returns a value set, if a is not bottom or top, otherwise undefined. * Useful when working with values returned by {@link resolveIdToValue} * * @param a - value set to check * @returns value set if a is not top or bottom */ function valueSetGuard(a) { return ((0, r_value_1.isBottom)(a) || (0, r_value_1.isTop)(a)) ? undefined : a; } /** * Constructs an Abstract Value from a normal TS value * @param a - ts value * @returns abstract value */ function valueFromTsValue(a) { if (a === undefined) { return r_value_1.Bottom; } else if (a === null) { return r_value_1.Top; } else if (typeof a === 'string') { return (0, string_constants_1.stringFrom)(a); } else if (typeof a === 'number') { return (0, interval_constants_1.intervalFrom)(a, a); } else if (typeof a === 'boolean') { return a ? logical_constants_1.ValueLogicalTrue : logical_constants_1.ValueLogicalFalse; } return r_value_1.Top; } /** * Converts a constant from an RNode into an abstract value * @param a - RNode constant * @returns abstract value */ function valueFromRNodeConstant(a) { if (a.type === type_1.RType.String) { return (0, string_constants_1.stringFrom)(a.content.str); } else if (a.type === type_1.RType.Number) { return (0, interval_constants_1.intervalFrom)(a.content.num, a.content.num); } else if (a.type === type_1.RType.Logical) { return a.content.valueOf() ? logical_constants_1.ValueLogicalTrue : logical_constants_1.ValueLogicalFalse; } return r_value_1.Top; } //# sourceMappingURL=general.js.map