UNPKG

@specs-feup/clava

Version:

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

55 lines (45 loc) 1.57 kB
import Pass from "@specs-feup/lara/api/lara/pass/Pass.js"; import PassResult from "@specs-feup/lara/api/lara/pass/results/PassResult.js"; import Query from "@specs-feup/lara/api/weaver/Query.js"; import { Joinpoint, ReturnStmt } from "../../Joinpoints.js"; import StatementDecomposer from "../code/StatementDecomposer.js"; // TODO: Refactor to use the SimplePass pattern export default class SimplifyReturnStmts extends Pass { protected _name = "SimplifyReturnStmts"; private statementDecomposer; constructor(statementDecomposer: StatementDecomposer) { super(); this.statementDecomposer = statementDecomposer; } protected _apply_impl($jp: Joinpoint): PassResult { let appliedPass = false; for (const $returnStmt of Query.searchFromInclusive($jp, ReturnStmt)) { const transformed = this.transform($returnStmt); // If any change, mark as applied if (transformed) { appliedPass = true; } } return new PassResult(this, $jp, { appliedPass: appliedPass, insertedLiteralCode: false, }); } /** * * @param $returnStmt - * @returns true if there were changes, false otherwise */ private transform($returnStmt: ReturnStmt): boolean { const decomposeResult = this.statementDecomposer.decompose($returnStmt); if (decomposeResult.length === 0) { return false; } // Returns a list of stmts, replace with current return for (const stmt of decomposeResult) { $returnStmt.insertBefore(stmt); } $returnStmt.detach(); return true; } }