From 245f50fc5116a2c2d4de32411df2051814bfc5ce Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Fri, 13 Dec 2019 20:07:33 +0100
Subject: [PATCH] factor out qualified auto type parsing

---
 alib2cli/src/parser/Parser.cpp | 39 +++++++++++++++++++---------------
 alib2cli/src/parser/Parser.h   |  4 ++++
 2 files changed, 26 insertions(+), 17 deletions(-)

diff --git a/alib2cli/src/parser/Parser.cpp b/alib2cli/src/parser/Parser.cpp
index 5743399a30..5af3d5e9ba 100644
--- a/alib2cli/src/parser/Parser.cpp
+++ b/alib2cli/src/parser/Parser.cpp
@@ -412,6 +412,26 @@ std::unique_ptr < Expression > Parser::batch_or_expression ( ) {
 	}
 }
 
+std::pair < abstraction::ParamQualifiers::ParamQualifierSet, std::unique_ptr < Arg > > Parser::qualifiedType ( ) {
+	abstraction::ParamQualifiers::ParamQualifierSet paramQualifierSet = abstraction::ParamQualifiers::ParamQualifierSet::NONE;
+	if ( check_nonreserved_kw ( "const" ) ) {
+		match_nonreserved_kw ( "const" );
+		paramQualifierSet = paramQualifierSet | abstraction::ParamQualifiers::ParamQualifierSet::CONST;
+	}
+
+	std::unique_ptr < Arg > type = arg ( );
+
+	if ( check ( cli::Lexer::TokenType::AND_OPERATOR ) ) {
+		match ( cli::Lexer::TokenType::AND_OPERATOR );
+		paramQualifierSet = paramQualifierSet | abstraction::ParamQualifiers::ParamQualifierSet::RREF;
+	} else if ( check ( cli::Lexer::TokenType::AMPERSAND_SIGN ) ) {
+		match ( cli::Lexer::TokenType::AMPERSAND_SIGN );
+		paramQualifierSet = paramQualifierSet | abstraction::ParamQualifiers::ParamQualifierSet::LREF;
+	}
+
+	return std::make_pair ( paramQualifierSet, std::move ( type ) );
+}
+
 std::unique_ptr < Command > Parser::command ( ) {
 	clearCheckOptions ( );
 	if ( check_nonreserved_kw ( "execute" ) ) {
@@ -540,22 +560,7 @@ std::unique_ptr < Command > Parser::command ( ) {
 	} else if ( check_nonreserved_kw ( "declare" ) ) {
 		match_nonreserved_kw ( "declare" );
 
-		abstraction::ParamQualifiers::ParamQualifierSet paramQualifierSet = abstraction::ParamQualifiers::ParamQualifierSet::NONE;
-
-		if ( check_nonreserved_kw ( "const" ) ) {
-			match_nonreserved_kw ( "const" );
-			paramQualifierSet = paramQualifierSet | abstraction::ParamQualifiers::ParamQualifierSet::CONST;
-		}
-
-		match_nonreserved_kw ( "auto" );
-
-		if ( check ( cli::Lexer::TokenType::AND_OPERATOR ) ) {
-			match ( cli::Lexer::TokenType::AND_OPERATOR );
-			paramQualifierSet = paramQualifierSet | abstraction::ParamQualifiers::ParamQualifierSet::RREF;
-		} else if ( check ( cli::Lexer::TokenType::AMPERSAND_SIGN ) ) {
-			match ( cli::Lexer::TokenType::AMPERSAND_SIGN );
-			paramQualifierSet = paramQualifierSet | abstraction::ParamQualifiers::ParamQualifierSet::LREF;
-		}
+		std::pair < abstraction::ParamQualifiers::ParamQualifierSet, std::unique_ptr < Arg > > qualType = qualifiedType ( );
 
 		match ( cli::Lexer::TokenType::DOLAR_SIGN );
 		std::unique_ptr < Arg > name = arg ( );
@@ -564,7 +569,7 @@ std::unique_ptr < Command > Parser::command ( ) {
 
 		std::unique_ptr < Expression > expr = expression ( );
 
-		return std::make_unique < VarDeclareCommand > ( std::move ( name ), paramQualifierSet, std::move ( expr ) );
+		return std::make_unique < VarDeclareCommand > ( std::move ( name ), qualType.first, std::move ( expr ) );
 	} else {
 		throw exception::CommonException ( "Mismatched set " + ext::to_string ( getCheckOptions ( ) ) + " while expanding parse rule. Token is " + ( ( std::string ) m_current ) + "." );
 	}
diff --git a/alib2cli/src/parser/Parser.h b/alib2cli/src/parser/Parser.h
index f40642b172..831e870e9b 100644
--- a/alib2cli/src/parser/Parser.h
+++ b/alib2cli/src/parser/Parser.h
@@ -229,6 +229,10 @@ public:
 
 	std::unique_ptr < Expression > batch_or_expression ( );
 
+	std::pair < abstraction::ParamQualifiers::ParamQualifierSet, std::unique_ptr < Arg > > qualifiedType ( );
+
+	std::pair < abstraction::ParamQualifiers::ParamQualifierSet, std::unique_ptr < Arg > > runnableParam ( );
+
 	std::unique_ptr < Command > command ( );
 
 	std::unique_ptr < Command > semicolon_command ( );
-- 
GitLab