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 std::vector<Namespace> namespaces = { n.value() };
\r
38 for (int i = 1; i < namespacePrefixes.size(); i++)
\r
40 n = find<Namespace>(n.value().namespaces, [&](Namespace n) { return n.name == namespacePrefixes[i]; });
\r
45 namespaces.push_back(n.value());
\r
48 for (int i = namespaces.size()-1; i >= 0; i--)
\r
50 auto f = find<Function>(namespaces[i].functions, [&](Function f) { return f.name == name; });
\r
55 return find<Function>(p.functions, [&](Function f) { return f.name == name; });
\r
58 opt<Struct> findStruct(
\r
60 const std::string & name,
\r
61 const std::vector<std::string> & namespacePrefixes)
\r
63 if (namespacePrefixes.empty())
\r
65 return find<Struct>(p.structs, [&](Struct s) { return s.name == name; });
\r
68 auto n = find<Namespace>(p.namespaces, [&](Namespace n) { return n.name == namespacePrefixes[0]; });
\r
73 for (int i = 1; i < namespacePrefixes.size(); i++)
\r
75 n = find<Namespace>(n.value().namespaces, [&](Namespace n) { return n.name == namespacePrefixes[i]; });
\r
80 return find<Struct>(n.value().structs, [&](Struct s) { return s.name == name; });
\r
83 opt<Variable> findVariable(
\r
85 const std::string & name,
\r
86 std::shared_ptr<Context> ctx)
\r
89 while (it != nullptr)
\r
91 auto v = find<Variable>(it->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