absyntax_utils/function_param_iterator.cc
changeset 258 d7d92b2f87e9
parent 237 cece842c7417
child 265 4d222f46f8cc
--- a/absyntax_utils/function_param_iterator.cc	Wed Mar 30 19:53:32 2011 +0100
+++ b/absyntax_utils/function_param_iterator.cc	Thu Mar 31 10:45:34 2011 +0100
@@ -159,6 +159,7 @@
   identifier_c *identifier;
  
   param_count = 0;
+  en_eno_param_implicit = false;
   next_param++;
   current_operation = function_param_iterator_c::iterate_op;
   res = f_decl->accept(*this);
@@ -196,6 +197,11 @@
   return current_param_type;
 }
 
+/* Returns if currently referenced parameter is an implicit defined EN/ENO parameter. */
+bool function_param_iterator_c::is_en_eno_param_implicit(void) {
+  return en_eno_param_implicit;
+}
+
 /* Returns the currently referenced parameter's data passing direction.
  * i.e. VAR_INPUT, VAR_OUTPUT or VAR_INOUT
  */
@@ -203,6 +209,11 @@
   return current_param_direction;
 }
 
+void *function_param_iterator_c::visit(implicit_definition_c *symbol) {
+	en_eno_param_implicit = current_operation == function_param_iterator_c::iterate_op;
+	return NULL;
+}
+
 /****************************************/
 /* 1.4.3 - Declaration & Initialisation */
 /****************************************/
@@ -224,6 +235,8 @@
    * variables will get overwritten when we visit the next
    * var1_init_decl_c list!
    */
+  symbol->method->accept(*this);
+
   current_param_default_value = symbol->value;
   current_param_type = symbol->type;
 
@@ -232,11 +245,25 @@
 
 /* var1_list ':' array_spec_init */
 //SYM_REF2(array_var_init_decl_c, var1_list, array_spec_init)
-void *function_param_iterator_c::visit(array_var_init_decl_c *symbol) {TRACE("array_var_init_decl_c"); return symbol->var1_list->accept(*this);}
+void *function_param_iterator_c::visit(array_var_init_decl_c *symbol) {
+  TRACE("array_var_init_decl_c");
+
+  current_param_default_value = spec_init_sperator_c::get_init(symbol->array_spec_init);
+  current_param_type = spec_init_sperator_c::get_spec(symbol->array_spec_init);
+
+  return symbol->var1_list->accept(*this);
+}
 
 /*  var1_list ':' initialized_structure */
 //SYM_REF2(structured_var_init_decl_c, var1_list, initialized_structure)
-void *function_param_iterator_c::visit(structured_var_init_decl_c *symbol) {TRACE("structured_var_init_decl_c"); return symbol->var1_list->accept(*this);}
+void *function_param_iterator_c::visit(structured_var_init_decl_c *symbol) {
+  TRACE("structured_var_init_decl_c");
+
+  current_param_default_value = spec_init_sperator_c::get_init(symbol->initialized_structure);
+  current_param_type = spec_init_sperator_c::get_spec(symbol->initialized_structure);
+
+  return symbol->var1_list->accept(*this);
+}
 
 void *function_param_iterator_c::visit(output_declarations_c *symbol) {
   TRACE("output_declarations_c");
@@ -251,14 +278,12 @@
    * variables will get overwritten when we visit the next
    * var1_init_decl_c list!
    */
+  symbol->method->accept(*this);
+
   current_param_default_value = NULL;
   current_param_type = symbol->type;
 
   return handle_single_param(symbol->name);
-#if 0
-  if (eno_declared) ERROR;
-  return (void *)declare_eno_param();
-#endif
 }
 void *function_param_iterator_c::visit(input_output_declarations_c *symbol) {
   TRACE("input_output_declarations_c");
@@ -269,11 +294,25 @@
 
 /*  var1_list ':' array_specification */
 //SYM_REF2(array_var_declaration_c, var1_list, array_specification)
-void *function_param_iterator_c::visit(array_var_declaration_c *symbol) {TRACE("array_var_declaration_c"); return symbol->var1_list->accept(*this);}
+void *function_param_iterator_c::visit(array_var_declaration_c *symbol) {
+	TRACE("array_var_declaration_c");
+
+	current_param_default_value = NULL;
+	current_param_type = symbol->array_specification;
+
+	return symbol->var1_list->accept(*this);
+}
 
 /*  var1_list ':' structure_type_name */
 //SYM_REF2(structured_var_declaration_c, var1_list, structure_type_name)
-void *function_param_iterator_c::visit(structured_var_declaration_c *symbol) {TRACE("structured_var_declaration_c"); return symbol->var1_list->accept(*this);}
+void *function_param_iterator_c::visit(structured_var_declaration_c *symbol) {
+  TRACE("structured_var_declaration_c");
+
+  current_param_default_value = NULL;
+  current_param_type = symbol->structure_type_name;
+
+  return symbol->var1_list->accept(*this);
+}
 
 /* VAR [CONSTANT] var_init_decl_list END_VAR */
 void *function_param_iterator_c::visit(var_declarations_c *symbol) {TRACE("var_declarations_c"); return NULL;}