From f6188701f117a71567429af851a6f3f553cb3763 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Mon, 21 Aug 2017 19:55:06 +0200 Subject: [PATCH] do not print statements resulting in void --- .../src/ast/statements/ResultPrintStatement.h | 4 ++++ .../abstraction/NaryOperationAbstraction.hpp | 8 ++++++++ .../src/abstraction/PrimitiveRegistrator.cpp | 1 + .../src/abstraction/ValuePrinterAbstraction.hpp | 9 +++++++++ .../src/abstraction/ValuePrinterRegistry.cpp | 17 +++++++++++++++++ .../src/abstraction/ValuePrinterRegistry.hpp | 3 +++ 6 files changed, 42 insertions(+) create mode 100644 alib2common/src/abstraction/ValuePrinterRegistry.cpp diff --git a/alib2cli/src/ast/statements/ResultPrintStatement.h b/alib2cli/src/ast/statements/ResultPrintStatement.h index 187ce67bf5..fe30f6f453 100644 --- a/alib2cli/src/ast/statements/ResultPrintStatement.h +++ b/alib2cli/src/ast/statements/ResultPrintStatement.h @@ -12,6 +12,10 @@ public: virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & ) const override { std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::Registry::getValuePrinterAbstraction ( prev->getReturnType ( ) ); + + if ( res->numberOfParams ( ) == 0 ) + return res; + if ( ! res->attachInput ( prev, 0, false ) ) throw exception::CommonException ( "Can't connect param at 0 of result print statement with result of type " + prev->getReturnType ( ) + "." ); if ( ! res->eval ( ) ) diff --git a/alib2common/src/abstraction/NaryOperationAbstraction.hpp b/alib2common/src/abstraction/NaryOperationAbstraction.hpp index 16e5dbaee3..49bcce1964 100644 --- a/alib2common/src/abstraction/NaryOperationAbstraction.hpp +++ b/alib2common/src/abstraction/NaryOperationAbstraction.hpp @@ -23,6 +23,9 @@ protected: private: virtual bool attachInput ( const std::shared_ptr < OperationAbstraction > & input, unsigned index, bool move ) override { + if ( index >= m_moves.size ( ) ) + throw exception::CommonException ( "Parameter index out of bounds."); + m_moves [ index ] = move; auto attachCallback = [ & ] ( auto & param ) { @@ -37,16 +40,21 @@ private: return false; } }; + return ext::call_on_nth < bool > ( m_params, index, attachCallback ); } virtual bool detachInput ( unsigned index ) override { + if ( index >= m_moves.size ( ) ) + throw exception::CommonException ( "Parameter index out of bounds."); + m_moves [ index ] = false; auto detachCallback = [ & ] ( auto & param ) { param = nullptr; return true; }; + return ext::call_on_nth < bool > ( m_params, index, detachCallback ); } diff --git a/alib2common/src/abstraction/PrimitiveRegistrator.cpp b/alib2common/src/abstraction/PrimitiveRegistrator.cpp index 97974e243b..ad4be3902d 100644 --- a/alib2common/src/abstraction/PrimitiveRegistrator.cpp +++ b/alib2common/src/abstraction/PrimitiveRegistrator.cpp @@ -43,6 +43,7 @@ public: abstraction::ValuePrinterRegistry::registerValuePrinter < int > ( ); abstraction::ValuePrinterRegistry::registerValuePrinter < double > ( ); abstraction::ValuePrinterRegistry::registerValuePrinter < std::string > ( ); + abstraction::ValuePrinterRegistry::registerValuePrinter < void > ( ); abstraction::ImmediateRegistry::registerImmediate < int > ( ); abstraction::ImmediateRegistry::registerImmediate < std::string > ( ); diff --git a/alib2common/src/abstraction/ValuePrinterAbstraction.hpp b/alib2common/src/abstraction/ValuePrinterAbstraction.hpp index e70abb33db..24c0c28300 100644 --- a/alib2common/src/abstraction/ValuePrinterAbstraction.hpp +++ b/alib2common/src/abstraction/ValuePrinterAbstraction.hpp @@ -9,6 +9,7 @@ #define _VALUE_PRINTER_ABSTRACTION_HPP_ #include <abstraction/UnaryOperationAbstraction.hpp> +#include <abstraction/NullaryOperationAbstraction.hpp> #include <tuple> namespace abstraction { @@ -25,6 +26,14 @@ public: } }; +template < > +class ValuePrinterAbstraction < void > : public NullaryOperationAbstraction < void > { +public: + virtual bool run ( ) override { + return true; + } +}; + } /* namespace abstraction */ #endif /* _VALUE_PRINTER_ABSTRACTION_HPP_ */ diff --git a/alib2common/src/abstraction/ValuePrinterRegistry.cpp b/alib2common/src/abstraction/ValuePrinterRegistry.cpp new file mode 100644 index 0000000000..39e39fc579 --- /dev/null +++ b/alib2common/src/abstraction/ValuePrinterRegistry.cpp @@ -0,0 +1,17 @@ +/* + * ValuePrinterRegistry.cpp + * + * Created on: 21. 7. 2017 + * Author: Jan Travnicek + */ + +#include <abstraction/ValuePrinterRegistry.hpp> + +namespace abstraction { + +template < > +std::shared_ptr < abstraction::OperationAbstraction > ValuePrinterRegistry::EntryImpl < void >::getAbstraction ( ) const { + return std::make_shared < abstraction::ValuePrinterAbstraction < void > > ( ); +} + +} /* namespace abstraction */ diff --git a/alib2common/src/abstraction/ValuePrinterRegistry.hpp b/alib2common/src/abstraction/ValuePrinterRegistry.hpp index f1ef0ae91e..92b4f370ad 100644 --- a/alib2common/src/abstraction/ValuePrinterRegistry.hpp +++ b/alib2common/src/abstraction/ValuePrinterRegistry.hpp @@ -69,6 +69,9 @@ std::shared_ptr < abstraction::OperationAbstraction > ValuePrinterRegistry::Entr return std::make_shared < abstraction::ValuePrinterAbstraction < const Param & > > ( ); } +template < > +std::shared_ptr < abstraction::OperationAbstraction > ValuePrinterRegistry::EntryImpl < void >::getAbstraction ( ) const; + } /* namespace abstraction */ #endif /* _VALUE_PRINTER_REGISTRY_HPP_ */ -- GitLab