Merge pull request #525 from antmicro/wsip/revert_expand_dot

revert setting current_struct_elem in expand_dot
diff --git a/systemverilog-plugin/UhdmAst.cc b/systemverilog-plugin/UhdmAst.cc
index ea9ba07..06a50e3 100644
--- a/systemverilog-plugin/UhdmAst.cc
+++ b/systemverilog-plugin/UhdmAst.cc
@@ -174,6 +174,43 @@
     }
 }
 
+static std::string get_parent_name(vpiHandle parent_h)
+{
+    std::string parent_name;
+    if (auto p = vpi_get_str(vpiFullName, parent_h)) {
+        parent_name = p;
+    } else if (auto p = vpi_get_str(vpiName, parent_h)) {
+        parent_name = p;
+    } else if (auto p = vpi_get_str(vpiDefName, parent_h)) {
+        parent_name = p;
+    }
+    return parent_name;
+}
+
+// Warning: Takes ownership of `parent_h` and releases it.
+static void find_ancestor_name(vpiHandle parent_h, std::string &name, std::string &parent_name)
+{
+
+    while (!parent_name.empty()) {
+        parent_name = parent_name + ".";
+        if ((name.rfind(parent_name) != std::string::npos)) {
+            name = name.substr(name.rfind(parent_name) + parent_name.size());
+            break;
+        } else {
+            auto old_parent_h = parent_h;
+            parent_h = vpi_handle(vpiParent, parent_h);
+            vpi_release_handle(old_parent_h);
+
+            if (parent_h) {
+                parent_name = get_parent_name(parent_h);
+            } else {
+                parent_name.clear();
+            }
+        }
+    }
+    vpi_release_handle(parent_h);
+}
+
 static std::string get_name(vpiHandle obj_h, bool prefer_full_name = false)
 {
     auto first_check = prefer_full_name ? vpiFullName : vpiName;
@@ -186,8 +223,29 @@
     } else if (auto s = vpi_get_str(last_check, obj_h)) {
         name = s;
     }
-    if (name.rfind('.') != std::string::npos) {
-        name = name.substr(name.rfind('.') + 1);
+    // We are looking for the ancestor name to use it as a delimeter
+    // when stripping the name of the current node.
+    // We used to strip the name by searching for "." in it, but this
+    // approach didn't work for the names whith "." as an escaped
+    // character.
+    vpiHandle parent_h = vpi_handle(vpiParent, obj_h);
+
+    if (parent_h) {
+        std::string parent_name;
+        parent_name = get_parent_name(parent_h);
+
+        if (parent_name.empty()) {
+            // Nodes of certain types, like param_assign, don't have
+            // a name, so we need to look further for the ancestor.
+            auto old_parent_h = parent_h;
+            parent_h = vpi_handle(vpiParent, parent_h);
+            vpi_release_handle(old_parent_h);
+
+            if (parent_h) {
+                parent_name = get_parent_name(parent_h);
+            }
+        }
+        find_ancestor_name(parent_h, name, parent_name);
     }
     sanitize_symbol_name(name);
     return name;