diff options
author | Benjamin Paassen <bpaassen@techfak.uni-bielefeld.de> | 2015-02-12 10:38:16 +0100 |
---|---|---|
committer | Benjamin Paassen <bpaassen@techfak.uni-bielefeld.de> | 2015-02-12 10:38:16 +0100 |
commit | dbf2eebdd88118dca79045ad0524061f8078e668 (patch) | |
tree | c06719655432e59b27b92ce950e131cceb3d6386 /src/core/parser/ParserScope.cpp | |
parent | 339683e64288a85b8d6f9355a10563417b7d2fa7 (diff) |
refactored FieldDescriptor resolution into own function in ParserScope for more cleanliness and less overhead.
Diffstat (limited to 'src/core/parser/ParserScope.cpp')
-rw-r--r-- | src/core/parser/ParserScope.cpp | 48 |
1 files changed, 35 insertions, 13 deletions
diff --git a/src/core/parser/ParserScope.cpp b/src/core/parser/ParserScope.cpp index 5440b9c..3929abf 100644 --- a/src/core/parser/ParserScope.cpp +++ b/src/core/parser/ParserScope.cpp @@ -38,19 +38,6 @@ Rooted<Node> ParserScopeBase::resolve(const Rtti *type, const std::vector<std::string> &path, Logger &logger) { - // if the last element of the path is the default field name, we want to - // resolve the parent descriptor first. - if (type == &RttiTypes::FieldDescriptor && - path.back() == DEFAULT_FIELD_NAME) { - std::vector<std::string> descPath; - descPath.insert(descPath.end(), path.begin(), path.end() - 1); - Rooted<Node> res = resolve(&RttiTypes::Descriptor, descPath, logger); - if (res == nullptr) { - return nullptr; - } - return res.cast<Descriptor>()->getFieldDescriptor(); - } - // Go up the stack and try to resolve the for (auto it = nodes.rbegin(); it != nodes.rend(); it++) { std::vector<ResolutionResult> res = (*it)->resolve(type, path); @@ -486,5 +473,40 @@ bool ParserScope::performDeferredResolution(Logger &logger) deferred.clear(); return false; } + +bool ParserScope::resolveFieldDescriptor( + const std::vector<std::string> &path, Handle<Node> owner, Logger &logger, + ResolutionResultCallback resultCallback) +{ + // if the last element of the path is the default field name, we want to + // resolve the parent descriptor first. + if (path.back() == DEFAULT_FIELD_NAME) { + std::vector<std::string> descPath; + descPath.insert(descPath.end(), path.begin(), path.end() - 1); + return resolve(&RttiTypes::Descriptor, descPath, owner, logger, + [resultCallback](Handle<Node> resolved, + Handle<Node> owner, Logger &logger) { + if (resolved != nullptr) { + resultCallback( + resolved.cast<Descriptor>()->getFieldDescriptor(), owner, + logger); + } else { + resultCallback(nullptr, owner, logger); + } + }); + } + + // If it is not the default field, we can just forward to resolve + return resolve(&RttiTypes::FieldDescriptor, path, owner, logger, + resultCallback); +} + +bool ParserScope::resolveFieldDescriptor( + const std::string &name, Handle<Node> owner, Logger &logger, + ResolutionResultCallback resultCallback) +{ + return resolveFieldDescriptor(Utils::split(name, '.'), owner, logger, + resultCallback); +} } |