mirror of
https://github.com/GothenburgBitFactory/taskwarrior.git
synced 2025-08-07 22:58:34 +02:00
Parser
- Migrated from Boolean to tristate ::collect method.
This commit is contained in:
parent
4447200357
commit
e9f71b152c
2 changed files with 29 additions and 65 deletions
|
@ -338,41 +338,6 @@ void Parser::collect (
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Recursively scan all nodes, depth first, and create a linear list of node
|
|
||||||
// pointers, for simple iteration. This eliminates the need for recursion in
|
|
||||||
// each ::find* method.
|
|
||||||
void Parser::collect (std::vector <Tree*>& nodes, bool all, Tree* tree /* = NULL */) const
|
|
||||||
{
|
|
||||||
if (tree == NULL)
|
|
||||||
tree = _tree;
|
|
||||||
|
|
||||||
std::vector <Tree*>::iterator i;
|
|
||||||
for (i = tree->_branches.begin (); i != tree->_branches.end (); ++i)
|
|
||||||
{
|
|
||||||
if ((*i)->_branches.size ())
|
|
||||||
{
|
|
||||||
collect (nodes, all, *i);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (! all)
|
|
||||||
{
|
|
||||||
// Parser override operator.
|
|
||||||
if ((*i)->hasTag ("TERMINATOR") ||
|
|
||||||
(*i)->hasTag ("TERMINATED"))
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Skip known args.
|
|
||||||
if (! (*i)->hasTag ("?"))
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
nodes.push_back (*i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Locate and tag the binary. It is assumed that the binary is the first
|
// Locate and tag the binary. It is assumed that the binary is the first
|
||||||
// argument, which is valid.
|
// argument, which is valid.
|
||||||
|
@ -417,7 +382,7 @@ void Parser::findTerminator ()
|
||||||
bool action = false;
|
bool action = false;
|
||||||
|
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, true);
|
collect (nodes, collectTerminated);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
{
|
{
|
||||||
|
@ -460,7 +425,7 @@ void Parser::resolveAliases ()
|
||||||
something = false;
|
something = false;
|
||||||
|
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, false);
|
collect (nodes);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
{
|
{
|
||||||
|
@ -493,7 +458,7 @@ void Parser::findCommand ()
|
||||||
{
|
{
|
||||||
context.debug ("Parse::findCommand");
|
context.debug ("Parse::findCommand");
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, false);
|
collect (nodes);
|
||||||
|
|
||||||
// There can be only one.
|
// There can be only one.
|
||||||
// Scan for an existing CMD tag, to short-circuit scanning for another.
|
// Scan for an existing CMD tag, to short-circuit scanning for another.
|
||||||
|
@ -533,7 +498,7 @@ void Parser::findOverrides ()
|
||||||
context.debug ("Parse::findOverrides");
|
context.debug ("Parse::findOverrides");
|
||||||
|
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, false);
|
collect (nodes);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
{
|
{
|
||||||
|
@ -572,7 +537,7 @@ void Parser::getOverrides (
|
||||||
File& rc)
|
File& rc)
|
||||||
{
|
{
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, true);
|
collect (nodes, collectTerminated);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
{
|
{
|
||||||
|
@ -608,7 +573,7 @@ void Parser::getDataLocation (Path& data)
|
||||||
data = location;
|
data = location;
|
||||||
|
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, false);
|
collect (nodes);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
{
|
{
|
||||||
|
@ -632,7 +597,7 @@ void Parser::applyOverrides ()
|
||||||
context.debug ("Parse::applyOverrides");
|
context.debug ("Parse::applyOverrides");
|
||||||
|
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, true);
|
collect (nodes, collectTerminated);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
{
|
{
|
||||||
|
@ -660,7 +625,7 @@ void Parser::injectDefaults ()
|
||||||
bool found_other = false;
|
bool found_other = false;
|
||||||
|
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, true);
|
collect (nodes, collectTerminated);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
{
|
{
|
||||||
|
@ -707,7 +672,7 @@ void Parser::injectDefaults ()
|
||||||
|
|
||||||
std::string combined;
|
std::string combined;
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, false);
|
collect (nodes);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
{
|
{
|
||||||
|
@ -785,7 +750,7 @@ const std::string Parser::getFilterExpression ()
|
||||||
// Construct an efficient ID/UUID clause.
|
// Construct an efficient ID/UUID clause.
|
||||||
std::string sequence = "";
|
std::string sequence = "";
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, true);
|
collect (nodes, collectTerminated);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
{
|
{
|
||||||
|
@ -832,7 +797,7 @@ const std::vector <std::string> Parser::getWords () const
|
||||||
{
|
{
|
||||||
std::vector <std::string> words;
|
std::vector <std::string> words;
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, true);
|
collect (nodes, collectTerminated);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
{
|
{
|
||||||
|
@ -852,7 +817,7 @@ const std::vector <std::string> Parser::getWords () const
|
||||||
std::string Parser::getLimit () const
|
std::string Parser::getLimit () const
|
||||||
{
|
{
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, false);
|
collect (nodes);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
{
|
{
|
||||||
|
@ -870,7 +835,7 @@ std::string Parser::getLimit () const
|
||||||
std::string Parser::getCommand () const
|
std::string Parser::getCommand () const
|
||||||
{
|
{
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, true);
|
collect (nodes, collectTerminated);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
if ((*i)->hasTag ("CMD"))
|
if ((*i)->hasTag ("CMD"))
|
||||||
|
@ -887,7 +852,7 @@ void Parser::findPattern ()
|
||||||
bool action = false;
|
bool action = false;
|
||||||
|
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, false);
|
collect (nodes);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
{
|
{
|
||||||
|
@ -927,7 +892,7 @@ void Parser::findSubstitution ()
|
||||||
bool action = false;
|
bool action = false;
|
||||||
|
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, false);
|
collect (nodes);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
{
|
{
|
||||||
|
@ -970,7 +935,7 @@ void Parser::findTag ()
|
||||||
bool action = false;
|
bool action = false;
|
||||||
|
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, false);
|
collect (nodes);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
{
|
{
|
||||||
|
@ -1015,7 +980,7 @@ void Parser::findAttribute ()
|
||||||
bool action = false;
|
bool action = false;
|
||||||
|
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, false);
|
collect (nodes);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
{
|
{
|
||||||
|
@ -1106,7 +1071,7 @@ void Parser::findAttributeModifier ()
|
||||||
bool action = false;
|
bool action = false;
|
||||||
|
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, false);
|
collect (nodes);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
{
|
{
|
||||||
|
@ -1311,7 +1276,7 @@ void Parser::findIdSequence ()
|
||||||
bool action = false;
|
bool action = false;
|
||||||
|
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, false);
|
collect (nodes);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
{
|
{
|
||||||
|
@ -1470,7 +1435,7 @@ void Parser::findUUIDList ()
|
||||||
bool action = false;
|
bool action = false;
|
||||||
|
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, false);
|
collect (nodes);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
{
|
{
|
||||||
|
@ -1553,7 +1518,7 @@ void Parser::findOperator ()
|
||||||
options.push_back (e->second);
|
options.push_back (e->second);
|
||||||
|
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, false);
|
collect (nodes);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
{
|
{
|
||||||
|
@ -1582,7 +1547,7 @@ void Parser::findFilter ()
|
||||||
bool after_readcmd = false;
|
bool after_readcmd = false;
|
||||||
|
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, true);
|
collect (nodes, collectTerminated);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
{
|
{
|
||||||
|
@ -1632,7 +1597,7 @@ void Parser::findModifications ()
|
||||||
bool after_writecmd = false;
|
bool after_writecmd = false;
|
||||||
|
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, true);
|
collect (nodes, collectAll);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
{
|
{
|
||||||
|
@ -1668,7 +1633,7 @@ void Parser::findStrayModifications ()
|
||||||
command == "log")
|
command == "log")
|
||||||
{
|
{
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, true);
|
collect (nodes, collectAll);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
{
|
{
|
||||||
|
@ -1695,7 +1660,7 @@ void Parser::findPlainArgs ()
|
||||||
bool action = false;
|
bool action = false;
|
||||||
|
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, true);
|
collect (nodes, collectTerminated);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
{
|
{
|
||||||
|
@ -1761,7 +1726,7 @@ void Parser::findMissingOperators ()
|
||||||
bool Parser::insertOr ()
|
bool Parser::insertOr ()
|
||||||
{
|
{
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, true);
|
collect (nodes, collectTerminated);
|
||||||
|
|
||||||
// Subset the nodes to only the FILTER, non-PSEUDO nodes.
|
// Subset the nodes to only the FILTER, non-PSEUDO nodes.
|
||||||
std::vector <Tree*> filterNodes;
|
std::vector <Tree*> filterNodes;
|
||||||
|
@ -1819,7 +1784,7 @@ bool Parser::insertOr ()
|
||||||
bool Parser::insertAnd ()
|
bool Parser::insertAnd ()
|
||||||
{
|
{
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, true);
|
collect (nodes, collectTerminated);
|
||||||
|
|
||||||
// Subset the nodes to only the FILTER, non-PSEUDO nodes.
|
// Subset the nodes to only the FILTER, non-PSEUDO nodes.
|
||||||
std::vector <Tree*> filterNodes;
|
std::vector <Tree*> filterNodes;
|
||||||
|
@ -1868,7 +1833,7 @@ void Parser::validate ()
|
||||||
{
|
{
|
||||||
// Look for any unrecognized original args.
|
// Look for any unrecognized original args.
|
||||||
std::vector <Tree*> nodes;
|
std::vector <Tree*> nodes;
|
||||||
collect (nodes, false);
|
collect (nodes);
|
||||||
std::vector <Tree*>::iterator i;
|
std::vector <Tree*>::iterator i;
|
||||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||||
if ((*i)->hasTag ("?"))
|
if ((*i)->hasTag ("?"))
|
||||||
|
|
|
@ -47,9 +47,8 @@ public:
|
||||||
bool exactMatch (const std::string&, const std::string&) const;
|
bool exactMatch (const std::string&, const std::string&) const;
|
||||||
bool canonicalize (std::string&, const std::string&, const std::string&) const;
|
bool canonicalize (std::string&, const std::string&, const std::string&) const;
|
||||||
|
|
||||||
enum collectType {collectLeaf, collectAll, collectUnterminated};
|
enum collectType {collectLeaf, collectAll, collectTerminated};
|
||||||
void collect (std::vector <Tree*>&, collectType = collectLeaf, Tree* tree = NULL) const;
|
void collect (std::vector <Tree*>&, collectType = collectLeaf, Tree* tree = NULL) const;
|
||||||
void collect (std::vector <Tree*>&, bool, Tree* tree = NULL) const;
|
|
||||||
|
|
||||||
void findBinary ();
|
void findBinary ();
|
||||||
void resolveAliases ();
|
void resolveAliases ();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue