absyntax_utils/search_var_instance_decl.cc
changeset 217 f5dfadf5de54
parent 202 da1a8186f86f
child 221 c6aed7e5f070
--- a/absyntax_utils/search_var_instance_decl.cc	Wed Nov 18 10:53:15 2009 +0100
+++ b/absyntax_utils/search_var_instance_decl.cc	Sun Nov 29 16:38:11 2009 +0100
@@ -25,7 +25,7 @@
 /* Determine the data type of a specific variable instance, including
  * function block instances.
  * A reference to the relevant variable declaration is returned.
- * The variable instance may NOT be a member of a structure of a memeber
+ * The variable instance may NOT be a member of a structure of a member
  * of a structure of an element of an array of ...
  *
  * example:
@@ -58,12 +58,15 @@
 
 search_var_instance_decl_c::search_var_instance_decl_c(symbol_c *search_scope) {
   this->current_vartype = none_vt;
+  this->current_varqualifier = none_vq;
   this->search_scope = search_scope;
   this->search_name = NULL;
   this->current_type_decl = NULL;
 }
 
 symbol_c *search_var_instance_decl_c::get_decl(symbol_c *variable_instance_name) {
+  this->current_vartype = none_vt;
+  this->current_varqualifier = none_vq;
   this->search_name = variable_instance_name;
   return (symbol_c *)search_scope->accept(*this);
 }
@@ -72,12 +75,16 @@
   return current_vartype;
 }
 
+unsigned int search_var_instance_decl_c::get_varqualifier() {
+  return current_varqualifier;
+}
+
 /***************************/
 /* B 0 - Programming Model */
 /***************************/
 void *search_var_instance_decl_c::visit(library_c *symbol) {
   /* we do not want to search multiple declaration scopes,
-   * so we do not visit all the functions, fucntion blocks, etc...
+   * so we do not visit all the functions, function blocks, etc...
    */
   return NULL;
 }
@@ -85,17 +92,36 @@
 
 
 /******************************************/
-/* B 1.4.3 - Declaration & Initialisation */
+/* B 1.4.3 - Declaration & Initialization */
 /******************************************/
+
+void *search_var_instance_decl_c::visit(constant_option_c *symbol) {
+  current_varqualifier = constant_vq;
+  return NULL;
+}
+
+void *search_var_instance_decl_c::visit(retain_option_c *symbol) {
+  current_varqualifier = retain_vq;
+  return NULL;
+}
+
+void *search_var_instance_decl_c::visit(non_retain_option_c *symbol) {
+  current_varqualifier = non_retain_vq;
+  return NULL;
+}
+
 /* edge -> The F_EDGE or R_EDGE directive */
 // SYM_REF2(edge_declaration_c, edge, var1_list)
 // TODO
 
 void *search_var_instance_decl_c::visit(input_declarations_c *symbol) {
   current_vartype = input_vt;
+  if (symbol->option != NULL)
+    symbol->option->accept(*this);
   void *res = symbol->input_declaration_list->accept(*this);
   if (res == NULL) {
     current_vartype = none_vt;
+    current_varqualifier = none_vq;
   }
   return res;
 }
@@ -104,9 +130,12 @@
 /* option -> may be NULL ! */
 void *search_var_instance_decl_c::visit(output_declarations_c *symbol) {
   current_vartype = output_vt;
+  if (symbol->option != NULL)
+    symbol->option->accept(*this);
   void *res = symbol->var_init_decl_list->accept(*this);
   if (res == NULL) {
     current_vartype = none_vt;
+    current_varqualifier = none_vq;
   }
   return res;
 }
@@ -134,9 +163,12 @@
 /* helper symbol for input_declarations */
 void *search_var_instance_decl_c::visit(var_declarations_c *symbol) {
   current_vartype = private_vt;
+  if (symbol->option != NULL)
+    symbol->option->accept(*this);
   void *res = symbol->var_init_decl_list->accept(*this);
   if (res == NULL) {
     current_vartype = none_vt;
+    current_varqualifier = none_vq;
   }
   return res;
 }
@@ -144,9 +176,11 @@
 /*  VAR RETAIN var_init_decl_list END_VAR */
 void *search_var_instance_decl_c::visit(retentive_var_declarations_c *symbol) {
   current_vartype = private_vt;
+  current_varqualifier = retain_vq;
   void *res = symbol->var_init_decl_list->accept(*this);
   if (res == NULL) {
     current_vartype = none_vt;
+    current_varqualifier = none_vq;
   }
   return res;
 }
@@ -156,9 +190,12 @@
 //SYM_REF2(located_var_declarations_c, option, located_var_decl_list)
 void *search_var_instance_decl_c::visit(located_var_declarations_c *symbol) {
   current_vartype = located_vt;
+  if (symbol->option != NULL)
+    symbol->option->accept(*this);
   void *res = symbol->located_var_decl_list->accept(*this);
   if (res == NULL) {
     current_vartype = none_vt;
+    current_varqualifier = none_vq;
   }
   return res;
 }
@@ -168,9 +205,12 @@
 //SYM_REF2(external_var_declarations_c, option, external_declaration_list)
 void *search_var_instance_decl_c::visit(external_var_declarations_c *symbol) {
   current_vartype = external_vt;
+  if (symbol->option != NULL)
+    symbol->option->accept(*this);
   void *res = symbol->external_declaration_list->accept(*this);
   if (res == NULL) {
     current_vartype = none_vt;
+    current_varqualifier = none_vq;
   }
   return res;
 }
@@ -180,9 +220,12 @@
 //SYM_REF2(global_var_declarations_c, option, global_var_decl_list)
 void *search_var_instance_decl_c::visit(global_var_declarations_c *symbol) {
   current_vartype = global_vt;
+  if (symbol->option != NULL)
+    symbol->option->accept(*this);
   void *res = symbol->global_var_decl_list->accept(*this);
   if (res == NULL) {
     current_vartype = none_vt;
+    current_varqualifier = none_vq;
   }
   return res;
 }