summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2015-02-17 18:28:11 +0100
committerAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2015-02-17 18:28:11 +0100
commit7acce0fb451f119fe0487d7a859950744d3b9e23 (patch)
treeca77bbdb05003038bba0f97dffe8085063cdb2e2 /src/core
parentcc3cfd7db6a535bc193da648b14a51e2824c0d17 (diff)
Fixed issue #78 and added unit test
Diffstat (limited to 'src/core')
-rw-r--r--src/core/parser/ParserScope.cpp21
-rw-r--r--src/core/parser/ParserScope.hpp4
2 files changed, 21 insertions, 4 deletions
diff --git a/src/core/parser/ParserScope.cpp b/src/core/parser/ParserScope.cpp
index ce3dc94..b0a4945 100644
--- a/src/core/parser/ParserScope.cpp
+++ b/src/core/parser/ParserScope.cpp
@@ -21,6 +21,7 @@
#include <core/common/VariantWriter.hpp>
#include <core/model/Domain.hpp>
#include <core/model/Typesystem.hpp>
+#include <core/model/RootNode.hpp>
#include "ParserScope.hpp"
@@ -233,6 +234,13 @@ void ParserScope::pop()
}
flags.resize(newLen);
+ // Whenever a RootNode is popped from the stack, we have to perform deferred
+ // resolution -- however, postpone issuing error messages
+ if (nodes.back()->isa(&RttiTypes::RootNode)) {
+ Logger logger;
+ performDeferredResolution(logger, true);
+ }
+
// Remove the element from the stack
nodes.pop_back();
}
@@ -424,7 +432,7 @@ bool ParserScope::resolveTypeWithValue(const std::string &name,
resultCallback);
}
-bool ParserScope::performDeferredResolution(Logger &logger)
+bool ParserScope::performDeferredResolution(Logger &logger, bool postpone)
{
// Repeat the resolution process as long as something has changed in the
// last iteration (resolving a node may cause other nodes to be resolvable).
@@ -446,8 +454,9 @@ bool ParserScope::performDeferredResolution(Logger &logger)
// Abort if nothing has changed in the last iteration
if (!hasChange) {
// In a last step, clear the "awaitingResolution" list to allow
- // cyclical dependencies to be resolved
- if (!awaitingResolution.empty()) {
+ // cyclical dependencies to be resolved -- if the postpone flag
+ // is set, do not do this
+ if (!awaitingResolution.empty() && !postpone) {
awaitingResolution.clear();
} else {
break;
@@ -460,6 +469,12 @@ bool ParserScope::performDeferredResolution(Logger &logger)
return true;
}
+ // If the postpone flag is set to true, we'll abort here -- this function
+ // will be called again later
+ if (postpone) {
+ return false;
+ }
+
// Output error messages for all elements for which resolution did not
// succeed.
for (auto &failed : deferred) {
diff --git a/src/core/parser/ParserScope.hpp b/src/core/parser/ParserScope.hpp
index 185b845..24af6b8 100644
--- a/src/core/parser/ParserScope.hpp
+++ b/src/core/parser/ParserScope.hpp
@@ -797,8 +797,10 @@ public:
* pending deferred resolutions is cleared after this function has run.
*
* @param logger is the logger instance into which errors should be logged.
+ * @param postpone if set to true, postpones issuing any error messages and
+ * waits for node resolution.
*/
- bool performDeferredResolution(Logger &logger);
+ bool performDeferredResolution(Logger &logger, bool postpone = false);
};
}