summaryrefslogtreecommitdiff
path: root/src/core/parser/ParserScope.cpp
diff options
context:
space:
mode:
authorAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2015-02-03 02:28:20 +0100
committerAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2015-02-03 02:28:20 +0100
commit4284cda04b3a1b1f4c5d4368cc8663d01b6925c6 (patch)
tree0dc012115a14c232b3ccfd8f998a02e4c4a3fcac /src/core/parser/ParserScope.cpp
parentc9cb8e1a0cda97511742211c8abab89b35493560 (diff)
Some refactoring, added function for extracting current type signature
Diffstat (limited to 'src/core/parser/ParserScope.cpp')
-rw-r--r--src/core/parser/ParserScope.cpp70
1 files changed, 42 insertions, 28 deletions
diff --git a/src/core/parser/ParserScope.cpp b/src/core/parser/ParserScope.cpp
index efd07d1..42225ca 100644
--- a/src/core/parser/ParserScope.cpp
+++ b/src/core/parser/ParserScope.cpp
@@ -61,6 +61,38 @@ Rooted<Node> ParserScopeBase::resolve(const Rtti &type,
return nullptr;
}
+bool ParserScopeBase::isEmpty() const { return nodes.empty(); }
+
+Rooted<Node> ParserScopeBase::getRoot() const { return nodes.front(); }
+
+Rooted<Node> ParserScopeBase::getLeaf() const { return nodes.back(); }
+
+const NodeVector<Node> &ParserScopeBase::getStack() const { return nodes; }
+
+std::vector<Rtti const *> ParserScopeBase::getStackTypeSignature() const
+{
+ std::vector<Rtti const *> res;
+ res.reserve(nodes.size());
+ for (size_t i = 0; i < nodes.size(); i++) {
+ res.push_back(&(nodes[i]->type()));
+ }
+ return res;
+}
+
+Rooted<Node> ParserScopeBase::select(RttiSet types, int maxDepth)
+{
+ ssize_t minDepth = 0;
+ if (maxDepth >= 0) {
+ minDepth = static_cast<ssize_t>(nodes.size()) - (maxDepth + 1);
+ }
+ for (ssize_t i = nodes.size() - 1; i >= minDepth; i--) {
+ if (nodes[i]->type().isOneOf(types)) {
+ return nodes[i];
+ }
+ }
+ return nullptr;
+}
+
/* Class DeferredResolution */
DeferredResolution::DeferredResolution(const NodeVector<Node> &nodes,
@@ -190,24 +222,6 @@ void ParserScope::pop()
NodeVector<Node> ParserScope::getTopLevelNodes() const { return topLevelNodes; }
-Rooted<Node> ParserScope::getRoot() const { return nodes.front(); }
-
-Rooted<Node> ParserScope::getLeaf() const { return nodes.back(); }
-
-Rooted<Node> ParserScope::select(RttiSet types, int maxDepth)
-{
- ssize_t minDepth = 0;
- if (maxDepth >= 0) {
- minDepth = static_cast<ssize_t>(nodes.size()) - (maxDepth + 1);
- }
- for (ssize_t i = nodes.size() - 1; i >= minDepth; i--) {
- if (nodes[i]->type().isOneOf(types)) {
- return nodes[i];
- }
- }
- return nullptr;
-}
-
void ParserScope::setFlag(ParserFlag flag, bool value)
{
// Fetch the current stack depth
@@ -368,17 +382,17 @@ bool ParserScope::resolveTypeWithValue(const std::vector<std::string> &path,
ParserScope scope = fork();
Variant *valuePtr = &value;
- return resolveType(path, owner, logger,
- [=](Handle<Node> resolved, Handle<Node> owner,
- Logger &logger) mutable {
- if (resolved != nullptr) {
- Rooted<Type> type = resolved.cast<Type>();
- scope.resolveValue(*valuePtr, type, owner, logger);
- }
+ return resolveType(
+ path, owner, logger,
+ [=](Handle<Node> resolved, Handle<Node> owner, Logger &logger) mutable {
+ if (resolved != nullptr) {
+ Rooted<Type> type = resolved.cast<Type>();
+ scope.resolveValue(*valuePtr, type, owner, logger);
+ }
- // Call the result callback with the type
- resultCallback(resolved, owner, logger);
- });
+ // Call the result callback with the type
+ resultCallback(resolved, owner, logger);
+ });
}
bool ParserScope::resolveTypeWithValue(const std::string &name,