attrmap: extend -remove to allow removing attributes with any value.

Currently, `-remove foo` would only remove an attribute `foo = ""`,
which doesn't work on an attribute like `src` that may have any
value. Extend `-remove` to handle both cases. `-remove foo=""` has
the old behavior, and `-remove foo` will remove the attribute with
whatever value it may have, which is still compatible with the old
behavior.
This commit is contained in:
whitequark 2019-04-22 14:18:15 +00:00
parent c0f9a74b12
commit aeeefc32d8
1 changed files with 3 additions and 1 deletions

View File

@ -111,9 +111,10 @@ struct AttrmapMap : AttrmapAction {
}; };
struct AttrmapRemove : AttrmapAction { struct AttrmapRemove : AttrmapAction {
bool has_value;
string name, value; string name, value;
bool apply(IdString &id, Const &val) YS_OVERRIDE { bool apply(IdString &id, Const &val) YS_OVERRIDE {
return !(match_name(name, id) && match_value(value, val)); return !(match_name(name, id) && (!has_value || match_value(value, val)));
} }
}; };
@ -235,6 +236,7 @@ struct AttrmapPass : public Pass {
} }
auto action = new AttrmapRemove; auto action = new AttrmapRemove;
action->name = arg1; action->name = arg1;
action->has_value = (p != string::npos);
action->value = val1; action->value = val1;
actions.push_back(std::unique_ptr<AttrmapAction>(action)); actions.push_back(std::unique_ptr<AttrmapAction>(action));
continue; continue;