simplify rule matching

master
Daniel Kolesa 2018-04-29 20:27:32 +02:00
parent 11a366f469
commit c61dcb9597
1 changed files with 18 additions and 35 deletions

View File

@ -49,6 +49,9 @@ static string_range match_pattern(
auto rep = ostd::find(toexpand, '%'); auto rep = ostd::find(toexpand, '%');
/* no subst found */ /* no subst found */
if (rep.empty()) { if (rep.empty()) {
if (expanded == toexpand) {
return expanded;
}
return nullptr; return nullptr;
} }
/* get the part before % */ /* get the part before % */
@ -135,42 +138,18 @@ void make::find_rules(string_range target, std::vector<rule_inst> &rlist) {
return; return;
} }
rule_inst *frule = nullptr; rule_inst *frule = nullptr;
bool exact = false;
string_range prev_sub{}; string_range prev_sub{};
for (auto &rule: p_rules) { for (auto &rule: p_rules) {
if (target == string_range{rule.target()}) {
rlist.emplace_back();
rule_inst &sr = rlist.back();
sr.rule = &rule;
sr.deps.reserve(rule.depends().size());
for (auto &d: rule.depends()) {
sr.deps.push_back(d);
}
if (rule.has_body()) {
if (frule && exact) {
throw make_error{"redefinition of rule '%s'", target};
}
if (!frule) {
frule = &rlist.back();
} else {
*frule = rlist.back();
rlist.pop_back();
}
exact = true;
}
continue;
}
if (exact || !rule.has_body()) {
continue;
}
string_range sub = match_pattern(target, rule.target()); string_range sub = match_pattern(target, rule.target());
if (!sub.empty()) { if (!sub.empty()) {
rlist.emplace_back(); rlist.emplace_back();
rule_inst &sr = rlist.back(); rule_inst &sr = rlist.back();
sr.rule = &rule; sr.rule = &rule;
sr.deps.reserve(rule.depends().size()); sr.deps.reserve(rule.depends().size());
bool ematch = (sub.size() == target.size());
for (auto &d: rule.depends()) { for (auto &d: rule.depends()) {
string_range dp = d; string_range dp = d;
if (!ematch) {
auto lp = ostd::find(dp, '%'); auto lp = ostd::find(dp, '%');
if (!lp.empty()) { if (!lp.empty()) {
auto repd = std::string{dp.slice(0, &lp[0] - &dp[0])}; auto repd = std::string{dp.slice(0, &lp[0] - &dp[0])};
@ -178,9 +157,13 @@ void make::find_rules(string_range target, std::vector<rule_inst> &rlist) {
lp.pop_front(); lp.pop_front();
repd.append(lp); repd.append(lp);
sr.deps.push_back(std::move(repd)); sr.deps.push_back(std::move(repd));
} else { continue;
}
}
sr.deps.push_back(d); sr.deps.push_back(d);
} }
if (!rule.has_body() && !ematch) {
throw make_error{"pattern rule '%s' needs a body", target};
} }
if (frule) { if (frule) {
if (sub.size() == prev_sub.size()) { if (sub.size() == prev_sub.size()) {