From 7acce0fb451f119fe0487d7a859950744d3b9e23 Mon Sep 17 00:00:00 2001 From: Andreas Stöckel Date: Tue, 17 Feb 2015 18:28:11 +0100 Subject: Fixed issue #78 and added unit test --- src/core/parser/ParserScope.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) (limited to 'src/core/parser/ParserScope.cpp') 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 #include #include +#include #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) { -- cgit v1.2.3