]> gitweb.ps.run Git - toc/blobdiff - src/find.h
structs and functions in ctx
[toc] / src / find.h
index fec540f1eee81853886fb7bf6009cd6403bf8495..ea3ae2227b89169d99e5b74fa039b1ab53a6889a 100644 (file)
@@ -27,202 +27,127 @@ opt<T *> findPtr(const std::vector<T> & ts, std::function<bool(T)> f)
   return nullopt;\r
 }\r
 \r
-opt<Function> findFunction(\r
-  const Program & p,\r
-  const std::string & name,\r
-  const std::vector<std::string> & namespacePrefixes)\r
+bool checkNamespace(std::shared_ptr<Context> ctx, const std::vector<std::string> & namespacePrefix)\r
 {\r
-  if (namespacePrefixes.empty())\r
-  {\r
-    return find<Function>(p.functions, [&](Function f) { return f.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
-  std::vector<Namespace> namespaces = { n.value() };\r
+    bool prefixMatches = true;\r
+\r
+    auto nIt = ctx;\r
+    for (int i = namespacePrefix.size() - 1; i >= 0; i--)\r
+    {\r
+      const std::string & prefix = namespacePrefix[i];\r
+      if (nIt == nullptr || ! nIt->name.has_value() || nIt->name.value() != prefix)\r
+      {\r
+        prefixMatches = false;\r
+        break;\r
+      }\r
+      nIt = nIt->parent;\r
+    }\r
+\r
+    return prefixMatches;\r
+}\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
+opt<Function> findFunction(\r
+  const std::string & name,\r
+  const std::vector<std::string> & namespacePrefix,\r
+  std::shared_ptr<Context> ctx)\r
+{\r
+  for (auto it = ctx; it != nullptr; it = it->parent)\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
+    auto f = find<Function>(it->functions, [&](Function f) { return f.name == name; });\r
+    if (f.has_value() && checkNamespace(it, namespacePrefix))\r
+      return f;\r
   }\r
-\r
-  return find<Function>(p.functions, [&](Function f) { return f.name == name; });\r
+  return nullopt;\r
 }\r
 \r
 opt<Function *> findFunctionPtr(\r
-  const Program & p,\r
   const std::string & name,\r
-  const std::vector<std::string> & namespacePrefixes)\r
+  const std::vector<std::string> & namespacePrefix,\r
+  std::shared_ptr<Context> ctx)\r
 {\r
-  if (namespacePrefixes.empty())\r
+  for (auto it = ctx; it != nullptr; it = it->parent)\r
   {\r
-    return findPtr<Function>(p.functions, [&](Function f) { return f.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
-  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
+    auto f = findPtr<Function>(it->functions, [&](Function f) { return f.name == name; });\r
+    if (f.has_value() && checkNamespace(it, namespacePrefix))\r
+      return f;\r
   }\r
+  return nullopt;\r
+}\r
 \r
-  for (int i = namespaces.size()-1; i >= 0; i--)\r
-  {\r
-    auto f = findPtr<Function>(namespaces[i].functions, [&](Function f) { return f.name == name; });\r
-    if (f.has_value())\r
-      return f.value();\r
-  }\r
 \r
-  return findPtr<Function>(p.functions, [&](Function f) { return f.name == name; });\r
-}\r
 \r
 opt<Struct> findStruct(\r
-  const Program & p,\r
   const std::string & name,\r
-  const std::vector<std::string> & namespacePrefixes)\r
+  const std::vector<std::string> & namespacePrefix,\r
+  std::shared_ptr<Context> ctx)\r
 {\r
-  if (namespacePrefixes.empty())\r
+  for (auto it = ctx; it != nullptr; it = it->parent)\r
   {\r
-    return find<Struct>(p.structs, [&](Struct s) { return s.name == name; });\r
+    auto s = find<Struct>(it->structs, [&](Struct s) { return s.name == name; });\r
+    if (s.has_value() && checkNamespace(it, namespacePrefix))\r
+      return s;\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
-  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<Struct>(namespaces[i].structs, [&](Struct f) { return f.name == name; });\r
-    if (f.has_value())\r
-      return f.value();\r
-  }\r
-\r
-  return find<Struct>(n.value().structs, [&](Struct s) { return s.name == name; });\r
+  return nullopt;\r
 }\r
 \r
 opt<Struct *> findStructPtr(\r
-  const Program & p,\r
   const std::string & name,\r
-  const std::vector<std::string> & namespacePrefixes)\r
+  const std::vector<std::string> & namespacePrefix,\r
+  std::shared_ptr<Context> ctx)\r
 {\r
-  if (namespacePrefixes.empty())\r
-  {\r
-    return findPtr<Struct>(p.structs, [&](Struct s) { return s.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
-  std::vector<Namespace> namespaces = { n.value() };\r
-    \r
-  for (int i = 1; i < namespacePrefixes.size(); i++)\r
+  for (auto it = ctx; it != nullptr; it = it->parent)\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
+    auto s = findPtr<Struct>(it->structs, [&](Struct s) { return s.name == name; });\r
+    if (s.has_value() && checkNamespace(it, namespacePrefix))\r
+      return s;\r
   }\r
+  return nullopt;\r
+}\r
 \r
-  for (int i = namespaces.size()-1; i >= 0; i--)\r
-  {\r
-    auto f = findPtr<Struct>(namespaces[i].structs, [&](Struct f) { return f.name == name; });\r
-    if (f.has_value())\r
-      return f.value();\r
-  }\r
 \r
-  return findPtr<Struct>(n.value().structs, [&](Struct s) { return s.name == name; });\r
-}\r
 \r
 opt<Variable> findVariable(\r
-  const Program & p,\r
   const std::string & name,\r
+  const std::vector<std::string> & namespacePrefix,\r
   std::shared_ptr<Context> ctx)\r
 {\r
-  auto it = ctx;\r
-  while (it != nullptr)\r
+  for (auto it = ctx; it != nullptr; it = it->parent)\r
   {\r
     auto v = find<Variable>(it->variables, [&](Variable v) { return v.name == name; });\r
-    if (v.has_value())\r
+    if (v.has_value() && checkNamespace(it, namespacePrefix))\r
       return v;\r
-    it = it->parent;\r
   }\r
   return nullopt;\r
 }\r
 \r
+\r
+\r
 opt<StructMember<Function>> findStructMethod(\r
-  const Program & p,\r
   const std::string & name,\r
-  TypeInfo ti)\r
+  const Struct & s)\r
 {\r
-  if (!ti.isStruct)\r
-    return nullopt;\r
-  auto s = findStruct(p, ti.type.name, ti.type.namespacePrefixes);\r
-  if (!s.has_value())\r
-    return nullopt;\r
-  return find<StructMember<Function>>(s.value().methods, [&](Function f) { return f.name == name; });\r
+  return find<StructMember<Function>>(s.methods, [&](Function f) { return f.name == name; });\r
 }\r
 opt<StructMember<Function> *> findStructMethodPtr(\r
-  const Program & p,\r
   const std::string & name,\r
-  TypeInfo ti)\r
+  const Struct & s)\r
 {\r
-  if (!ti.isStruct)\r
-    return nullopt;\r
-  auto s = findStruct(p, ti.type.name, ti.type.namespacePrefixes);\r
-  if (!s.has_value())\r
-    return nullopt;\r
-  return findPtr<StructMember<Function>>(s.value().methods, [&](Function f) { return f.name == name; });\r
+  return findPtr<StructMember<Function>>(s.methods, [&](Function f) { return f.name == name; });\r
 }\r
 \r
 opt<StructMember<Variable>> findStructMember(\r
-  const Program & p,\r
-  TypeInfo ti,\r
-  const std::string & name)\r
+  const std::string & name,\r
+  const Struct & s)\r
+{\r
+  return find<StructMember<Variable>>(s.members, [&](Variable v) { return v.name == name; });\r
+}\r
+\r
+opt<StructMember<Variable> *> findStructMemberPtr(\r
+  const std::string & name,\r
+  const Struct & s)\r
 {\r
-  auto s = findStruct(p, ti.type.name, ti.type.namespacePrefixes);\r
-  if (!s.has_value())\r
-    return nullopt;\r
-  return find<StructMember<Variable>>(s.value().members, [&](Variable v) { return v.name == name; });\r
+  return findPtr<StructMember<Variable>>(s.members, [&](Variable v) { return v.name == name; });\r
 }
\ No newline at end of file