]> gitweb.ps.run Git - toc/blobdiff - src/find.h
function resolution, pre generics
[toc] / src / find.h
index a969baee8b875d3b1b66ab5440698e839bcaedca..1876a1e0a59c0c29459de0b41aea468a746bded6 100644 (file)
@@ -33,15 +33,26 @@ opt<Function> findFunction(
   if (!n.has_value())\r
     return nullopt;\r
 \r
+  std::vector<Namespace> namespaces = { n.value() };\r
+\r
   for (int i = 1; i < namespacePrefixes.size(); i++)\r
   {\r
     n = find<Namespace>(n.value().namespaces, [&](Namespace n) { return n.name == namespacePrefixes[i]; });\r
     \r
     if (!n.has_value())\r
       return nullopt;\r
+\r
+    namespaces.push_back(n.value());\r
+  }\r
+\r
+  for (int i = namespaces.size()-1; i >= 0; i--)\r
+  {\r
+    auto f = find<Function>(namespaces[i].functions, [&](Function f) { return f.name == name; });\r
+    if (f.has_value())\r
+      return f.value();\r
   }\r
 \r
-  return find<Function>(n.value().functions, [&](Function f) { return f.name == name; });\r
+  return find<Function>(p.functions, [&](Function f) { return f.name == name; });\r
 }\r
 \r
 opt<Struct> findStruct(\r
@@ -72,28 +83,17 @@ opt<Struct> findStruct(
 opt<Variable> findVariable(\r
   const Program & p,\r
   const std::string & name,\r
-  const std::vector<std::string> & namespacePrefixes)\r
+  std::shared_ptr<Context> ctx)\r
 {\r
-  for (auto n : namespacePrefixes)\r
-    std::cout << n << std::endl;\r
-  if (namespacePrefixes.empty())\r
-  {\r
-    return find<Variable>(p.ctx->variables, [&](Variable v) { return v.name == name; });\r
-  }\r
-  \r
-  auto n = find<Namespace>(p.namespaces, [&](Namespace n) { return n.name == namespacePrefixes[0]; });\r
-  \r
-  if (!n.has_value())\r
-    return nullopt;\r
-      \r
-  for (int i = 1; i < namespacePrefixes.size(); i++)\r
+  auto it = ctx;\r
+  while (it != nullptr)\r
   {\r
-    n = find<Namespace>(n.value().namespaces, [&](Namespace n) { return n.name == namespacePrefixes[i]; });\r
-    \r
-    if (!n.has_value())\r
-      return nullopt;\r
+    auto v = find<Variable>(it->variables, [&](Variable v) { return v.name == name; });\r
+    if (v.has_value())\r
+      return v;\r
+    it = it->parent;\r
   }\r
-  return find<Variable>(n.value().ctx->variables, [&](Variable v) { return v.name == name; });\r
+  return nullopt;\r
 }\r
 \r
 opt<Function> findStructMethod(\r