Improve raw templater error cases

This commit is contained in:
Jan 2022-09-07 19:37:29 +02:00
parent 28636cc4fe
commit b3dbf4a104
2 changed files with 41 additions and 11 deletions

View File

@ -173,8 +173,8 @@ namespace templating
m_skip_pass(false), m_skip_pass(false),
m_write_output_to_file(false) m_write_output_to_file(false)
{ {
fs::path filenamePath(m_filename); const fs::path filenamePath(m_filename);
m_default_output_file = (m_output_directory / filenamePath.replace_extension()).string(); m_default_output_file = (m_output_directory / filenamePath.filename().replace_extension()).string();
} }
bool RunNextPass(std::ostream* buildLogFile) bool RunNextPass(std::ostream* buildLogFile)
@ -217,6 +217,12 @@ namespace templating
if (!m_write_output_to_file) if (!m_write_output_to_file)
{ {
if (!m_active_variations.empty())
{
std::cerr << "Template with variations must specify a filename\n";
return false;
}
if (!OpenOutputStream()) if (!OpenOutputStream())
return false; return false;
@ -266,13 +272,22 @@ namespace templating
{ {
const auto existingVariation = m_active_variations_by_name.find(switchName); const auto existingVariation = m_active_variations_by_name.find(switchName);
if (existingVariation != m_active_variations_by_name.end()) if (existingVariation != m_active_variations_by_name.end())
return existingVariation->second->GetVariationType() == TemplatingVariationType::SWITCH; {
const auto isValidRedefinition = existingVariation->second->GetVariationType() == TemplatingVariationType::SWITCH;
if (!isValidRedefinition)
std::cerr << "Redefinition of \"" << switchName << "\" as switch is invalid\n";
return isValidRedefinition;
}
auto switchVariation = std::make_unique<SwitchVariation>(std::move(switchName)); auto switchVariation = std::make_unique<SwitchVariation>(std::move(switchName));
if (m_current_pass.m_defines_proxy) if (m_current_pass.m_defines_proxy)
switchVariation->Apply(m_current_pass.m_defines_proxy.get()); switchVariation->Apply(m_current_pass.m_defines_proxy.get());
m_active_variations_by_name.emplace(switchVariation->m_name, switchVariation.get()); m_active_variations_by_name.emplace(switchVariation->m_name, switchVariation.get());
m_active_variations.emplace_back(std::move(switchVariation)); m_active_variations.emplace_back(std::move(switchVariation));
return true; return true;
} }
@ -280,13 +295,22 @@ namespace templating
{ {
const auto existingVariation = m_active_variations_by_name.find(optionsName); const auto existingVariation = m_active_variations_by_name.find(optionsName);
if (existingVariation != m_active_variations_by_name.end()) if (existingVariation != m_active_variations_by_name.end())
return existingVariation->second->GetVariationType() == TemplatingVariationType::SWITCH; {
const auto isValidRedefinition = existingVariation->second->GetVariationType() == TemplatingVariationType::OPTIONS;
if (!isValidRedefinition)
std::cerr << "Redefinition of \"" << optionsName << "\" as options is invalid\n";
return isValidRedefinition;
}
auto optionsVariation = std::make_unique<OptionsVariation>(std::move(optionsName), std::move(optionValues)); auto optionsVariation = std::make_unique<OptionsVariation>(std::move(optionsName), std::move(optionValues));
if (m_current_pass.m_defines_proxy) if (m_current_pass.m_defines_proxy)
optionsVariation->Apply(m_current_pass.m_defines_proxy.get()); optionsVariation->Apply(m_current_pass.m_defines_proxy.get());
m_active_variations_by_name.emplace(optionsVariation->m_name, optionsVariation.get()); m_active_variations_by_name.emplace(optionsVariation->m_name, optionsVariation.get());
m_active_variations.emplace_back(std::move(optionsVariation)); m_active_variations.emplace_back(std::move(optionsVariation));
return true; return true;
} }

View File

@ -37,7 +37,9 @@ bool TemplatingStreamProxy::MatchSwitchDirective(const ParserLine& line, const u
auto name = line.m_line.substr(nameStartPosition, currentPosition - nameStartPosition); auto name = line.m_line.substr(nameStartPosition, currentPosition - nameStartPosition);
m_templater_control->AddSwitch(std::move(name)); if (!m_templater_control->AddSwitch(std::move(name)))
throw ParsingException(TokenPos(*line.m_filename, line.m_line_number, 1), "switch directive failed");
return true; return true;
} }
@ -85,7 +87,9 @@ bool TemplatingStreamProxy::MatchOptionsDirective(const ParserLine& line, const
firstArg = false; firstArg = false;
} }
m_templater_control->AddOptions(std::move(name), std::move(options)); if (!m_templater_control->AddOptions(std::move(name), std::move(options)))
throw ParsingException(TokenPos(*line.m_filename, line.m_line_number, 1), "options directive failed");
return true; return true;
} }
@ -118,7 +122,9 @@ bool TemplatingStreamProxy::MatchFilenameDirective(const ParserLine& line, const
if (value.m_type != SimpleExpressionValue::Type::STRING) if (value.m_type != SimpleExpressionValue::Type::STRING)
throw ParsingException(CreatePos(line, currentPosition), "pragma filename expression must evaluate to string"); throw ParsingException(CreatePos(line, currentPosition), "pragma filename expression must evaluate to string");
m_templater_control->SetFileName(*value.m_string_value); if (!m_templater_control->SetFileName(*value.m_string_value))
throw ParsingException(TokenPos(*line.m_filename, line.m_line_number, 1), "filename directive failed");
return true; return true;
} }