diff options
Diffstat (limited to 'src')
| -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)) {  | 
