diff --git a/poincare/include/poincare/expression.h b/poincare/include/poincare/expression.h index de8a4f236..443166bfa 100644 --- a/poincare/include/poincare/expression.h +++ b/poincare/include/poincare/expression.h @@ -135,7 +135,7 @@ public: static void simplifyAndBeautify(Expression ** expressionAddress); Expression * simplify(); // TODO: should be virtual pure - virtual Expression * immediateSimplify() { return this; };// = 0; + virtual Expression * immediateSimplify(); virtual Expression * immediateBeautify() { return this; }; /* Evaluation Engine diff --git a/poincare/src/expression.cpp b/poincare/src/expression.cpp index cbe0dc0c9..6fc4b07b8 100644 --- a/poincare/src/expression.cpp +++ b/poincare/src/expression.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include "expression_parser.hpp" #include "expression_lexer.hpp" @@ -78,6 +79,7 @@ public: } Expression * clone() const override { return nullptr; } Type type() const override { return Expression::Type::Undefined; } + Expression * immediateSimplify() override { return this; } ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { return nullptr; } @@ -112,6 +114,15 @@ void Expression::beautify(Expression ** expressionAddress) { } } +Expression * Expression::immediateSimplify() { + for (int i = 0; i< numberOfOperands(); i++) { + if (operand(i)->type() == Type::Undefined) { + return replaceWith(new Undefined(), true); + } + } + return this; +} + bool Expression::hasAncestor(const Expression * e) const { assert(m_parent != this); if (m_parent == e) { diff --git a/poincare/src/power.cpp b/poincare/src/power.cpp index a25f69cec..8f7384015 100644 --- a/poincare/src/power.cpp +++ b/poincare/src/power.cpp @@ -218,7 +218,7 @@ Expression * Power::immediateSimplify() { Multiplication * m = new Multiplication(multOperands, 2, false); simplifyRationalRationalPower(p1, static_cast((Expression *)p1->operand(0)), static_cast((Expression *)(p1->operand(1)->operand(0)))); replaceWith(m, true); - return immediateSimplify(); + return m->immediateSimplify(); } } return this;