diff options
author | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2015-02-17 18:28:11 +0100 |
---|---|---|
committer | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2015-02-17 18:28:11 +0100 |
commit | 7acce0fb451f119fe0487d7a859950744d3b9e23 (patch) | |
tree | ca77bbdb05003038bba0f97dffe8085063cdb2e2 /src/core | |
parent | cc3cfd7db6a535bc193da648b14a51e2824c0d17 (diff) |
Fixed issue #78 and added unit test
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/parser/ParserScope.cpp | 21 | ||||
-rw-r--r-- | src/core/parser/ParserScope.hpp | 4 |
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); }; } |