@akala/core
Version:
48 lines • 1.97 kB
JavaScript
import { ExpressionType } from "../expression-type.js";
import { MemberExpression } from "../member-expression.js";
import { NewExpression } from "../new-expression.js";
import { ExpressionVisitor } from "./expression-visitor.js";
import { ExpressionComparer } from "./expression-comparer.js";
/**
* Simplifies an expression.
* @param {any} expression - The expression to simplify.
* @returns {any} The simplified expression.
*/
export class ExpressionSimplifyer extends ExpressionVisitor {
source;
/**
* Creates a new instance with the provided source expression.
* @param source - The original expression to simplify
*/
constructor(source) {
super();
this.source = source;
// const identifier = new OriginIdentifier();
// identifier.visit(source);
// identifier.origins;
this.contexttualSource = source;
}
contexttualSource;
visitMember(arg0) {
if (arg0.source == undefined) {
if (this.contexttualSource.type == ExpressionType.MemberExpression)
return new MemberExpression(this.contexttualSource, arg0.member, arg0.optional);
if (this.contexttualSource.type == ExpressionType.NewExpression) {
const sub = this.contexttualSource.init.find(e => ExpressionComparer.equals(e.member, arg0.member));
if (sub)
return sub.source;
}
return new MemberExpression(this.contexttualSource, arg0.member, arg0.optional);
}
return super.visitMember(arg0);
}
visitNew(expression) {
// var members: MemberExpression<any, any, any>[] = null;
const members = this.visitArray(expression.init, (exp, i) => { this.contexttualSource = this.source; });
if (members !== expression.init) {
return new NewExpression(...members);
}
return expression;
}
}
//# sourceMappingURL=expression-simplifyer.js.map