4 #include "typeInfo.h"
\r
6 #include <functional>
\r
10 using opt = std::optional<T>;
\r
12 template<typename T>
\r
13 opt<T> find(const std::vector<T> & ts, std::function<bool(T)> f)
\r
21 opt<Function> findFunction(
\r
23 const std::string & name,
\r
24 const std::vector<std::string> & namespacePrefixes)
\r
26 if (namespacePrefixes.empty())
\r
28 return find<Function>(p.functions, [&](Function f) { return f.name == name; });
\r
31 auto n = find<Namespace>(p.namespaces, [&](Namespace n) { return n.name == namespacePrefixes[0]; });
\r
36 for (int i = 1; i < namespacePrefixes.size(); i++)
\r
38 n = find<Namespace>(n.value().namespaces, [&](Namespace n) { return n.name == namespacePrefixes[i]; });
\r
44 return find<Function>(n.value().functions, [&](Function f) { return f.name == name; });
\r
47 opt<Struct> findStruct(
\r
49 const std::string & name,
\r
50 const std::vector<std::string> & namespacePrefixes)
\r
52 if (namespacePrefixes.empty())
\r
54 return find<Struct>(p.structs, [&](Struct s) { return s.name == name; });
\r
57 auto n = find<Namespace>(p.namespaces, [&](Namespace n) { return n.name == namespacePrefixes[0]; });
\r
62 for (int i = 1; i < namespacePrefixes.size(); i++)
\r
64 n = find<Namespace>(n.value().namespaces, [&](Namespace n) { return n.name == namespacePrefixes[i]; });
\r
69 return find<Struct>(n.value().structs, [&](Struct s) { return s.name == name; });
\r
72 opt<Variable> findVariable(
\r
74 const std::string & name,
\r
75 const std::vector<std::string> & namespacePrefixes)
\r
77 for (auto n : namespacePrefixes)
\r
78 std::cout << n << std::endl;
\r
79 if (namespacePrefixes.empty())
\r
81 return find<Variable>(p.ctx->variables, [&](Variable v) { return v.name == name; });
\r
84 auto n = find<Namespace>(p.namespaces, [&](Namespace n) { return n.name == namespacePrefixes[0]; });
\r
89 for (int i = 1; i < namespacePrefixes.size(); i++)
\r
91 n = find<Namespace>(n.value().namespaces, [&](Namespace n) { return n.name == namespacePrefixes[i]; });
\r
96 return find<Variable>(n.value().ctx->variables, [&](Variable v) { return v.name == name; });
\r
99 opt<Function> findStructMethod(
\r
101 const std::string & name,
\r
106 auto s = findStruct(p, ti.type.name, ti.type.namespacePrefixes);
\r
107 if (!s.has_value())
\r
109 return find<StructMember<Function>>(s.value().methods, [&](Function f) { return f.name == name; });
\r
112 opt<Variable> findStructMember(
\r
115 const std::string & name)
\r
117 auto s = findStruct(p, ti.type.name, ti.type.namespacePrefixes);
\r
118 if (!s.has_value())
\r
120 return find<StructMember<Variable>>(s.value().members, [&](Variable v) { return v.name == name; });
\r