diff --git a/poincare/include/poincare/parametered_expression.h b/poincare/include/poincare/parametered_expression.h index d91c96cb7..991276d65 100644 --- a/poincare/include/poincare/parametered_expression.h +++ b/poincare/include/poincare/parametered_expression.h @@ -13,7 +13,7 @@ class ParameteredExpressionNode : public ExpressionNode { public: // Expression bool isParameteredExpression() const override { return true; } - Expression replaceUnknown(const Symbol & symbol, const Symbol & unknownSymbol) override; + Expression replaceSymbolWithExpression(const SymbolAbstract & symbol, const Expression & expression) override; }; class ParameteredExpression : public Expression { @@ -33,7 +33,7 @@ public: * unknowns: for instance, we want to change f(x)=diff(cos(x),x,x) into * f(X)=diff(cos(x),x,X), X being an unknown. ReplaceUnknownInExpression does * that. */ - Expression replaceUnknown(const Symbol & symbol, const Symbol & unknownSymbol); + Expression replaceSymbolWithExpression(const SymbolAbstract & symbol, const Expression & expression); protected: ParameteredExpression(const ParameteredExpressionNode * node) : Expression(node) {} }; diff --git a/poincare/src/parametered_expression.cpp b/poincare/src/parametered_expression.cpp index 5d533b39f..488b5acb9 100644 --- a/poincare/src/parametered_expression.cpp +++ b/poincare/src/parametered_expression.cpp @@ -5,26 +5,27 @@ namespace Poincare { -Expression ParameteredExpressionNode::replaceUnknown(const Symbol & symbol, const Symbol & unknownSymbol) { - return ParameteredExpression(this).replaceUnknown(symbol, unknownSymbol); +Expression ParameteredExpressionNode::replaceSymbolWithExpression(const SymbolAbstract & symbol, const Expression & expression) { + return ParameteredExpression(this).replaceSymbolWithExpression(symbol, expression); } -Expression ParameteredExpression::replaceUnknown(const Symbol & symbolToReplace, const Symbol & unknownSymbol) { +Expression ParameteredExpression::replaceSymbolWithExpression(const SymbolAbstract & symbol, const Expression & expression) { Expression c = childAtIndex(ParameterChildIndex()); assert(c.type() == ExpressionNode::Type::Symbol); Symbol& parameterChild = static_cast(c); - if (strcmp(parameterChild.name(), symbolToReplace.name()) != 0) { - // If the unknown is not the parameter, replace normally - return defaultReplaceSymbolWithExpression(symbolToReplace, unknownSymbol); + if (symbol.type() != ExpressionNode::Type::Symbol || + strcmp(symbol.name(), parameterChild.name()) != 0) { + // If the symbol is not the parameter, replace normally + return defaultReplaceSymbolWithExpression(symbol, expression); } - /* If the unknown is the parameter, replace the unknown in all children except + /* If the symbol is the parameter, replace it in all children except * in the parameter and the parametered children */ int childrenCount = numberOfChildren(); static_assert(ParameteredChildIndex() == 0 && ParameterChildIndex() == 1, - "ParameteredExpression::replaceUnknown might not be valid"); + "ParameteredExpression::replaceSymbolWithExpression might not be valid"); for (int i = 2; i < childrenCount; i++) { - childAtIndex(i).replaceUnknown(symbolToReplace, unknownSymbol); + childAtIndex(i).replaceSymbolWithExpression(symbol, expression); } return *this; }