X-Git-Url: https://gitweb.ps.run/toc/blobdiff_plain/7f83e1b208e87e3808b268303bb633a8fda203f5..c2ba7425955ae538e220cec79d9124756d1b4c8b:/src/find.h diff --git a/src/find.h b/src/find.h index a969bae..1876a1e 100644 --- a/src/find.h +++ b/src/find.h @@ -33,15 +33,26 @@ opt findFunction( if (!n.has_value()) return nullopt; + std::vector namespaces = { n.value() }; + for (int i = 1; i < namespacePrefixes.size(); i++) { n = find(n.value().namespaces, [&](Namespace n) { return n.name == namespacePrefixes[i]; }); if (!n.has_value()) return nullopt; + + namespaces.push_back(n.value()); + } + + for (int i = namespaces.size()-1; i >= 0; i--) + { + auto f = find(namespaces[i].functions, [&](Function f) { return f.name == name; }); + if (f.has_value()) + return f.value(); } - return find(n.value().functions, [&](Function f) { return f.name == name; }); + return find(p.functions, [&](Function f) { return f.name == name; }); } opt findStruct( @@ -72,28 +83,17 @@ opt findStruct( opt findVariable( const Program & p, const std::string & name, - const std::vector & namespacePrefixes) + std::shared_ptr ctx) { - for (auto n : namespacePrefixes) - std::cout << n << std::endl; - if (namespacePrefixes.empty()) - { - return find(p.ctx->variables, [&](Variable v) { return v.name == name; }); - } - - auto n = find(p.namespaces, [&](Namespace n) { return n.name == namespacePrefixes[0]; }); - - if (!n.has_value()) - return nullopt; - - for (int i = 1; i < namespacePrefixes.size(); i++) + auto it = ctx; + while (it != nullptr) { - n = find(n.value().namespaces, [&](Namespace n) { return n.name == namespacePrefixes[i]; }); - - if (!n.has_value()) - return nullopt; + auto v = find(it->variables, [&](Variable v) { return v.name == name; }); + if (v.has_value()) + return v; + it = it->parent; } - return find(n.value().ctx->variables, [&](Variable v) { return v.name == name; }); + return nullopt; } opt findStructMethod(