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