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
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