diff options
author | Benjamin Paassen <bpaassen@techfak.uni-bielefeld.de> | 2015-02-13 20:18:00 +0100 |
---|---|---|
committer | Benjamin Paassen <bpaassen@techfak.uni-bielefeld.de> | 2015-02-13 20:18:00 +0100 |
commit | 02d8771c4ee9de88fd806e0d85cb50f88abd96b4 (patch) | |
tree | f6239d6b49e0af5f06d1bc64a417da5439b57066 /src/core/model | |
parent | c708de929ea0eca7901ffb7827809ffbb41c6425 (diff) |
improved error messsages in Type::read
Diffstat (limited to 'src/core/model')
-rw-r--r-- | src/core/model/Typesystem.cpp | 15 |
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)) { |