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
|
||||
// argument, which is valid.
|
||||
|
@ -417,7 +382,7 @@ void Parser::findTerminator ()
|
|||
bool action = false;
|
||||
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, true);
|
||||
collect (nodes, collectTerminated);
|
||||
std::vector <Tree*>::iterator i;
|
||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||
{
|
||||
|
@ -460,7 +425,7 @@ void Parser::resolveAliases ()
|
|||
something = false;
|
||||
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, false);
|
||||
collect (nodes);
|
||||
std::vector <Tree*>::iterator i;
|
||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||
{
|
||||
|
@ -493,7 +458,7 @@ void Parser::findCommand ()
|
|||
{
|
||||
context.debug ("Parse::findCommand");
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, false);
|
||||
collect (nodes);
|
||||
|
||||
// There can be only one.
|
||||
// Scan for an existing CMD tag, to short-circuit scanning for another.
|
||||
|
@ -533,7 +498,7 @@ void Parser::findOverrides ()
|
|||
context.debug ("Parse::findOverrides");
|
||||
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, false);
|
||||
collect (nodes);
|
||||
std::vector <Tree*>::iterator i;
|
||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||
{
|
||||
|
@ -572,7 +537,7 @@ void Parser::getOverrides (
|
|||
File& rc)
|
||||
{
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, true);
|
||||
collect (nodes, collectTerminated);
|
||||
std::vector <Tree*>::iterator i;
|
||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||
{
|
||||
|
@ -608,7 +573,7 @@ void Parser::getDataLocation (Path& data)
|
|||
data = location;
|
||||
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, false);
|
||||
collect (nodes);
|
||||
std::vector <Tree*>::iterator i;
|
||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||
{
|
||||
|
@ -632,7 +597,7 @@ void Parser::applyOverrides ()
|
|||
context.debug ("Parse::applyOverrides");
|
||||
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, true);
|
||||
collect (nodes, collectTerminated);
|
||||
std::vector <Tree*>::iterator i;
|
||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||
{
|
||||
|
@ -660,7 +625,7 @@ void Parser::injectDefaults ()
|
|||
bool found_other = false;
|
||||
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, true);
|
||||
collect (nodes, collectTerminated);
|
||||
std::vector <Tree*>::iterator i;
|
||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||
{
|
||||
|
@ -707,7 +672,7 @@ void Parser::injectDefaults ()
|
|||
|
||||
std::string combined;
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, false);
|
||||
collect (nodes);
|
||||
std::vector <Tree*>::iterator i;
|
||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||
{
|
||||
|
@ -785,7 +750,7 @@ const std::string Parser::getFilterExpression ()
|
|||
// Construct an efficient ID/UUID clause.
|
||||
std::string sequence = "";
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, true);
|
||||
collect (nodes, collectTerminated);
|
||||
std::vector <Tree*>::iterator 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 <Tree*> nodes;
|
||||
collect (nodes, true);
|
||||
collect (nodes, collectTerminated);
|
||||
std::vector <Tree*>::iterator 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::vector <Tree*> nodes;
|
||||
collect (nodes, false);
|
||||
collect (nodes);
|
||||
std::vector <Tree*>::iterator i;
|
||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||
{
|
||||
|
@ -870,7 +835,7 @@ std::string Parser::getLimit () const
|
|||
std::string Parser::getCommand () const
|
||||
{
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, true);
|
||||
collect (nodes, collectTerminated);
|
||||
std::vector <Tree*>::iterator i;
|
||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||
if ((*i)->hasTag ("CMD"))
|
||||
|
@ -887,7 +852,7 @@ void Parser::findPattern ()
|
|||
bool action = false;
|
||||
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, false);
|
||||
collect (nodes);
|
||||
std::vector <Tree*>::iterator i;
|
||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||
{
|
||||
|
@ -927,7 +892,7 @@ void Parser::findSubstitution ()
|
|||
bool action = false;
|
||||
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, false);
|
||||
collect (nodes);
|
||||
std::vector <Tree*>::iterator i;
|
||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||
{
|
||||
|
@ -970,7 +935,7 @@ void Parser::findTag ()
|
|||
bool action = false;
|
||||
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, false);
|
||||
collect (nodes);
|
||||
std::vector <Tree*>::iterator i;
|
||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||
{
|
||||
|
@ -1015,7 +980,7 @@ void Parser::findAttribute ()
|
|||
bool action = false;
|
||||
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, false);
|
||||
collect (nodes);
|
||||
std::vector <Tree*>::iterator i;
|
||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||
{
|
||||
|
@ -1106,7 +1071,7 @@ void Parser::findAttributeModifier ()
|
|||
bool action = false;
|
||||
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, false);
|
||||
collect (nodes);
|
||||
std::vector <Tree*>::iterator i;
|
||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||
{
|
||||
|
@ -1311,7 +1276,7 @@ void Parser::findIdSequence ()
|
|||
bool action = false;
|
||||
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, false);
|
||||
collect (nodes);
|
||||
std::vector <Tree*>::iterator i;
|
||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||
{
|
||||
|
@ -1470,7 +1435,7 @@ void Parser::findUUIDList ()
|
|||
bool action = false;
|
||||
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, false);
|
||||
collect (nodes);
|
||||
std::vector <Tree*>::iterator i;
|
||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||
{
|
||||
|
@ -1553,7 +1518,7 @@ void Parser::findOperator ()
|
|||
options.push_back (e->second);
|
||||
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, false);
|
||||
collect (nodes);
|
||||
std::vector <Tree*>::iterator i;
|
||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||
{
|
||||
|
@ -1582,7 +1547,7 @@ void Parser::findFilter ()
|
|||
bool after_readcmd = false;
|
||||
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, true);
|
||||
collect (nodes, collectTerminated);
|
||||
std::vector <Tree*>::iterator i;
|
||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||
{
|
||||
|
@ -1632,7 +1597,7 @@ void Parser::findModifications ()
|
|||
bool after_writecmd = false;
|
||||
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, true);
|
||||
collect (nodes, collectAll);
|
||||
std::vector <Tree*>::iterator i;
|
||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||
{
|
||||
|
@ -1668,7 +1633,7 @@ void Parser::findStrayModifications ()
|
|||
command == "log")
|
||||
{
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, true);
|
||||
collect (nodes, collectAll);
|
||||
std::vector <Tree*>::iterator i;
|
||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||
{
|
||||
|
@ -1695,7 +1660,7 @@ void Parser::findPlainArgs ()
|
|||
bool action = false;
|
||||
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, true);
|
||||
collect (nodes, collectTerminated);
|
||||
std::vector <Tree*>::iterator i;
|
||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||
{
|
||||
|
@ -1761,7 +1726,7 @@ void Parser::findMissingOperators ()
|
|||
bool Parser::insertOr ()
|
||||
{
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, true);
|
||||
collect (nodes, collectTerminated);
|
||||
|
||||
// Subset the nodes to only the FILTER, non-PSEUDO nodes.
|
||||
std::vector <Tree*> filterNodes;
|
||||
|
@ -1819,7 +1784,7 @@ bool Parser::insertOr ()
|
|||
bool Parser::insertAnd ()
|
||||
{
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, true);
|
||||
collect (nodes, collectTerminated);
|
||||
|
||||
// Subset the nodes to only the FILTER, non-PSEUDO nodes.
|
||||
std::vector <Tree*> filterNodes;
|
||||
|
@ -1868,7 +1833,7 @@ void Parser::validate ()
|
|||
{
|
||||
// Look for any unrecognized original args.
|
||||
std::vector <Tree*> nodes;
|
||||
collect (nodes, false);
|
||||
collect (nodes);
|
||||
std::vector <Tree*>::iterator i;
|
||||
for (i = nodes.begin (); i != nodes.end (); ++i)
|
||||
if ((*i)->hasTag ("?"))
|
||||
|
|
|
@ -47,9 +47,8 @@ public:
|
|||
bool exactMatch (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*>&, bool, Tree* tree = NULL) const;
|
||||
|
||||
void findBinary ();
|
||||
void resolveAliases ();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue