@eagleoutice/flowr
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
51 lines • 2.64 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.processFunctionParameter = processFunctionParameter;
const processor_1 = require("../../../processor");
const log_1 = require("../../../../util/log");
const identifier_1 = require("../../../environments/identifier");
const define_1 = require("../../../environments/define");
const edge_1 = require("../../../graph/edge");
const r_function_definition_1 = require("../../../../r-bridge/lang-4.x/ast/model/nodes/r-function-definition");
/**
*
*/
function processFunctionParameter(parameter, data) {
const name = (0, processor_1.processDataflowFor)(parameter.name, data);
const defaultValue = parameter.defaultValue === undefined ? undefined : (0, processor_1.processDataflowFor)(parameter.defaultValue, data);
const graph = defaultValue === undefined ? name.graph : name.graph.mergeWith(defaultValue.graph);
const writtenNodes = name.unknownReferences.map(n => ({
...n,
type: identifier_1.ReferenceType.Parameter,
definedAt: parameter.info.id
}));
let environment = name.environment;
for (const writtenNode of writtenNodes) {
const wid = writtenNode.nodeId;
(0, log_1.expensiveTrace)(log_1.log, () => `parameter ${writtenNode.name} (${wid}) is defined at id ${writtenNode.definedAt} with ${defaultValue === undefined ? 'no default value' : ' a default value'}`);
graph.setDefinitionOfVertex(writtenNode, defaultValue?.entryPoint ? [defaultValue?.entryPoint] : []);
environment = (0, define_1.define)(writtenNode, false, environment);
if (defaultValue !== undefined) {
if (r_function_definition_1.RFunctionDefinition.is(parameter.defaultValue)) {
graph.addEdge(wid, parameter.defaultValue.info.id, edge_1.EdgeType.DefinedBy);
}
else {
const definedBy = defaultValue.in.concat(defaultValue.unknownReferences);
for (const node of definedBy) {
graph.addEdge(wid, node.nodeId, edge_1.EdgeType.DefinedBy);
}
}
}
}
return {
unknownReferences: [],
in: defaultValue === undefined ? [] : defaultValue.in.concat(defaultValue.unknownReferences, name.in),
out: (defaultValue?.out ?? []).concat(name.out, name.unknownReferences),
graph: graph,
environment: environment,
entryPoint: parameter.info.id,
exitPoints: [{ nodeId: parameter.info.id, type: 0 /* ExitPointType.Default */, cds: data.cds }],
hooks: []
};
}
//# sourceMappingURL=process-parameter.js.map