@specs-feup/kadabra
Version:
A Java source-to-source compiler written in Typescript
48 lines (40 loc) • 1.48 kB
text/typescript
import IterativeMutation from "@specs-feup/lara/api/lara/mutation/IterativeMutation.js";
import MutationResult from "@specs-feup/lara/api/lara/mutation/MutationResult.js";
import { debug } from "@specs-feup/lara/api/lara/core/LaraCore.js";
import {
Loop,
Joinpoint,
Ternary,
If,
UnaryExpression,
} from "../../Joinpoints.js";
export default class ConditionalOperatorDeletionMutation extends IterativeMutation {
constructor() {
super("ConditionalOperatorDeletionMutation");
}
isMutationPoint(jp: Joinpoint): boolean {
if (
this.isOfCorrectType(jp) &&
jp.cond instanceof UnaryExpression &&
jp.cond.operator === "!"
) {
return true;
}
return false;
}
isOfCorrectType(jp: Joinpoint) {
return jp instanceof If || jp instanceof Ternary || jp instanceof Loop;
}
*mutate(jp: If | Ternary | Loop) {
if (!this.isMutationPoint(jp)) {
throw new Error("Argument is not a mutation point.");
}
const mutation = jp.copy() as If | Ternary | Loop;
const tempCond = mutation.cond.copy() as UnaryExpression;
mutation.cond.insertReplace(tempCond.operand.copy());
debug("/*--------------------------------------*/");
debug("Mutating operator: " + jp + " to " + mutation);
debug("/*--------------------------------------*/");
yield new MutationResult(mutation);
}
}