summaryrefslogtreecommitdiff
path: root/src/core/model
diff options
context:
space:
mode:
authorBenjamin Paassen <bpaassen@techfak.uni-bielefeld.de>2015-02-13 20:18:00 +0100
committerBenjamin Paassen <bpaassen@techfak.uni-bielefeld.de>2015-02-13 20:18:00 +0100
commit02d8771c4ee9de88fd806e0d85cb50f88abd96b4 (patch)
treef6239d6b49e0af5f06d1bc64a417da5439b57066 /src/core/model
parentc708de929ea0eca7901ffb7827809ffbb41c6425 (diff)
improved error messsages in Type::read
Diffstat (limited to 'src/core/model')
-rw-r--r--src/core/model/Typesystem.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/core/model/Typesystem.cpp b/src/core/model/Typesystem.cpp
index dad2ec3..b34687e 100644
--- a/src/core/model/Typesystem.cpp
+++ b/src/core/model/Typesystem.cpp
@@ -98,16 +98,27 @@ std::pair<bool, Variant> Type::read(const std::string &str, Logger &logger,
// try all variant types of this type and use the first successful one.
Variant v;
bool success = false;
- for (auto t : getVariantTypes()) {
- auto res = VariantReader::parseTyped(t, str, logger, sourceId, offs);
+ std::vector<LoggerFork> forks;
+ auto vts = getVariantTypes();
+ for (auto vt : vts) {
+ forks.emplace_back(logger.fork());
+ auto res =
+ VariantReader::parseTyped(vt, str, forks.back(), sourceId, offs);
if (res.first) {
v = res.second;
success = true;
+ forks.back().commit();
break;
}
}
if (!success) {
+ logger.error("Could not read data with any of the possible types:");
+ for (size_t t = 0; t < forks.size(); t++) {
+ logger.note(std::string(Variant::getTypeName(vts[t])) + ":",
+ SourceLocation{}, MessageMode::NO_CONTEXT);
+ forks[t].commit();
+ }
return std::make_pair(false, Variant{});
}
if (!build(v, logger)) {