UNPKG

@specs-feup/clava

Version:

A C/C++ source-to-source compiler written in Typescript

189 lines (166 loc) 5.15 kB
import { LaraJoinPoint } from "@specs-feup/lara/api/LaraJoinPoint.js"; import cytoscape from "@specs-feup/lara/api/libs/cytoscape-3.26.0.js"; import Query from "@specs-feup/lara/api/weaver/Query.js"; import { BinaryOp, Expression, Statement, Vardecl, Varref, } from "../../Joinpoints.js"; export default class LivenessUtils { /** * Checks if the given graph is a Cytoscape graph * @deprecated Typescript type checking should be used instead */ static isCytoscapeGraph(graph: cytoscape.Core): boolean { return ( typeof graph === "object" && "nodes" in graph && "edges" in graph && typeof graph.add === "function" && typeof graph.layout === "function" ); } /** * Computes the union of two sets * @param set1 - * @param set2 - * @returns A set containing the union of elements from both input sets */ static unionSets<T>( set1: Set<T> | undefined, set2: Set<T> | undefined ): Set<T> { if (set1 === undefined && set2 === undefined) { return new Set<T>(); } else if (set1 === undefined) { if (set2 === undefined) { return new Set<T>(); } else { return set2; } } else if (set2 === undefined) { return set1; } return new Set<T>([...set1, ...set2]); } /** * Computes the set difference between two sets * @param set1 - * @param set2 - * @returns A set containing all the elements present in set1 but not in set2 */ static differenceSets<T>( set1: Set<T> | undefined, set2: Set<T> | undefined ): Set<T> { if (set1 === undefined) { return new Set<T>(); } if (set2 === undefined) { return set1; } return new Set<T>([...set1].filter((x) => !set2.has(x))); } /** * Checks if two sets contain the same elements */ static isSameSet<T>( set1: Set<T> | undefined, set2: Set<T> | undefined ): boolean { if (set1 === undefined) { return false; } if (set2 === undefined) { return false; } if (set1.size !== set2.size) { return false; } return [...set1].every((e: T) => set2.has(e), set2); } /** * Returns the children of a node * @param node - * @returns An array containing the children of the given node */ static getChildren(node: cytoscape.NodeSingular): cytoscape.NodeSingular[] { const edges = node.connectedEdges(); const outgoingEdges = edges.filter( (edge) => edge.source() == node ) as cytoscape.EdgeCollection; return outgoingEdges.map((edge) => edge.target()); } /** * Checks if the provided joinpoint refers to an assigned variable. * @param $varref - The varref join point * @deprecated This method assumes that the giver Varref has a BinaryOp parent. Use carefully. */ static isAssignedVar($varref: Varref): boolean { const $parent = $varref.parent; if ($parent === undefined) { return false; } if (!($parent instanceof BinaryOp)) { return false; } return ( $parent !== undefined && $parent.isAssignment && $parent.left.astId === $varref.astId ); } /** * Checks if the given joinpoint is a local variable or parameter * @param $varref - The varref join point */ static isLocalOrParam($varref: Varref): boolean { const $varDecl = $varref.vardecl; return $varDecl !== undefined && !$varDecl.isGlobal; } /** * * @param $jp - The statement join point * @returns A set of variable names declared with initialization in the given joinpoint */ static getVarDeclsWithInit($jp: Statement | Expression): Set<string> { const $varDecls = Query.searchFromInclusive($jp, Vardecl, { hasInit: true, }); const varNames = ([...$varDecls] as Vardecl[]).map(($decl) => $decl.name); return new Set(varNames); } /** * * @param $jp - The statement join point * @returns A set containing the names of the local variables or parameters on the left-hand side (LHS) of each assignment present in the given joinpoint */ static getAssignedVars($jp: Statement | Expression): Set<string> { const $assignments = Query.searchFromInclusive($jp, BinaryOp, { isAssignment: true, left: (left: LaraJoinPoint) => left instanceof Varref, }); const assignedVars = ([...$assignments] as BinaryOp[]) .filter(($assign) => LivenessUtils.isLocalOrParam($assign.left as Varref)) .map(($assign) => ($assign.left as Varref).name); return new Set(assignedVars); } /** * * @param $jp - The statement join point * @returns A set containing the names of local variables or parameters referenced by varref joinpoints, excluding those present on the LHS of assignments. */ static getVarRefs($jp: Statement | Expression): Set<string> { const $varRefs = Query.searchFromInclusive($jp, Varref); const varNames = ([...$varRefs] as Varref[]) .filter( ($ref) => !LivenessUtils.isAssignedVar($ref) && LivenessUtils.isLocalOrParam($ref) ) .map(($ref) => $ref.name); return new Set(varNames); } }