summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2015-01-19 01:25:55 +0100
committerAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2015-01-19 01:25:55 +0100
commit7df42d9e82fe935f9941aa20e2d118188e888573 (patch)
tree9851c390e8b878f1b6e972e07c9564fd69d27828 /src/core
parent5e779c017020a8e0405ee8e43c6ea7d4a9a11ad2 (diff)
XML-Parsing for Typesystem structs works so far
Diffstat (limited to 'src/core')
-rw-r--r--src/core/model/Project.cpp1
-rw-r--r--src/core/parser/Scope.cpp29
-rw-r--r--src/core/parser/Scope.hpp10
3 files changed, 17 insertions, 23 deletions
diff --git a/src/core/model/Project.cpp b/src/core/model/Project.cpp
index c491d4f..fc08660 100644
--- a/src/core/model/Project.cpp
+++ b/src/core/model/Project.cpp
@@ -100,6 +100,7 @@ const Rtti Project = RttiBuilder<model::Project>("Project")
.parent(&Node)
.composedOf(&Document)
.composedOf(&Typesystem)
+ .composedOf(&SystemTypesystem)
.composedOf(&Domain);
}
}
diff --git a/src/core/parser/Scope.cpp b/src/core/parser/Scope.cpp
index 6942b9a..01292df 100644
--- a/src/core/parser/Scope.cpp
+++ b/src/core/parser/Scope.cpp
@@ -119,7 +119,7 @@ Rooted<Node> Scope::getLeaf() { return nodes.back(); }
bool Scope::resolve(const std::vector<std::string> &path, const Rtti &type,
Logger &logger, ResolutionImposterCallback imposterCallback,
ResolutionResultCallback resultCallback,
- const SourceLocation &location)
+ const SourceLocation &location)
{
if (!resolve(path, type, logger, resultCallback, location)) {
resultCallback(imposterCallback(), logger);
@@ -168,22 +168,21 @@ bool Scope::performDeferredResolution(Logger &logger)
}
}
- // Output an error message if there are still deferred elements left that
- // could not be resolved
- if (!deferred.empty()) {
- for (const auto &failed : deferred) {
- logger.error(
- std::string("Could not resolve a reference to \"") +
- Utils::join(failed.path, ".") +
- std::string("\" of type " + failed.type.name),
- failed.location);
- }
+ // We were successful if there are no more deferred resolutions
+ if (deferred.empty()) {
+ return true;
}
- // We were successful if there are no more deferred resolutions
- return deferred.empty();
+ // Output error messages for all elements for which resolution did not
+ // succeed.
+ for (const auto &failed : deferred) {
+ logger.error(std::string("Could not resolve ") + failed.type.name + std::string(" \"") +
+ Utils::join(failed.path, ".") +
+ std::string("\""),
+ failed.location);
+ }
+ deferred.clear();
+ return false;
}
-
-void Scope::purgeDeferredResolutions() { deferred.clear(); }
}
}
diff --git a/src/core/parser/Scope.hpp b/src/core/parser/Scope.hpp
index 1ceac2e..b9b7f80 100644
--- a/src/core/parser/Scope.hpp
+++ b/src/core/parser/Scope.hpp
@@ -467,18 +467,12 @@ public:
}
/**
- * Tries to resolve all currently deferred resolution steps.
+ * Tries to resolve all currently deferred resolution steps. The list of
+ * pending deferred resolutions is cleared after this function has run.
*
* @param logger is the logger instance into which errors should be logged.
*/
bool performDeferredResolution(Logger &logger);
-
- /**
- * Clears the list of currently deferred resolutions. This function may be
- * used to gracefully continue parsing, even after the resolution has
- * failed.
- */
- void purgeDeferredResolutions();
};
}
}