diff --git a/src/lint/linter/ArcanistXHPASTLinter.php b/src/lint/linter/ArcanistXHPASTLinter.php --- a/src/lint/linter/ArcanistXHPASTLinter.php +++ b/src/lint/linter/ArcanistXHPASTLinter.php @@ -922,11 +922,13 @@ foreach ($blocks as $key => $block) { // Collect all the tokens in this block which aren't at top level. // We want to ignore "break", and "continue" in these blocks. - $lower_level = $block->selectDescendantsOfType('n_WHILE'); - $lower_level->add($block->selectDescendantsOfType('n_DO_WHILE')); - $lower_level->add($block->selectDescendantsOfType('n_FOR')); - $lower_level->add($block->selectDescendantsOfType('n_FOREACH')); - $lower_level->add($block->selectDescendantsOfType('n_SWITCH')); + $lower_level = $block->selectDescendantsOfTypes(array( + 'n_WHILE', + 'n_DO_WHILE', + 'n_FOR', + 'n_FOREACH', + 'n_SWITCH', + )); $lower_level_tokens = array(); foreach ($lower_level as $lower_level_block) { $lower_level_tokens += $lower_level_block->getTokens(); @@ -935,10 +937,14 @@ // Collect all the tokens in this block which aren't in this scope // (because they're inside class, function or interface declarations). // We want to ignore all of these tokens. - $decls = $block->selectDescendantsOfType('n_FUNCTION_DECLARATION'); - $decls->add($block->selectDescendantsOfType('n_CLASS_DECLARATION')); - // For completeness; these can't actually have anything. - $decls->add($block->selectDescendantsOfType('n_INTERFACE_DECLARATION')); + $decls = $block->selectDescendantsOfTypes(array( + 'n_FUNCTION_DECLARATION', + 'n_CLASS_DECLARATION', + + // For completeness; these can't actually have anything. + 'n_INTERFACE_DECLARATION', + )); + $different_scope_tokens = array(); foreach ($decls as $decl) { $different_scope_tokens += $decl->getTokens(); @@ -1323,9 +1329,10 @@ $all_loops = $for_loops->add($foreach_loops); foreach ($all_loops as $loop) { - $child_for_loops = $loop->selectDescendantsOfType('n_FOR'); - $child_foreach_loops = $loop->selectDescendantsOfType('n_FOREACH'); - $child_loops = $child_for_loops->add($child_foreach_loops); + $child_loops = $loop->selectDescendantsOfTypes(array( + 'n_FOR', + 'n_FOREACH', + )); $outer_vars = $used_vars[$loop->getID()]; foreach ($child_loops as $inner_loop) { @@ -1366,10 +1373,10 @@ * */ protected function lintReusedIteratorReferences(XHPASTNode $root) { - - $fdefs = $root->selectDescendantsOfType('n_FUNCTION_DECLARATION'); - $mdefs = $root->selectDescendantsOfType('n_METHOD_DECLARATION'); - $defs = $fdefs->add($mdefs); + $defs = $root->selectDescendantsOfTypes(array( + 'n_FUNCTION_DECLARATION', + 'n_METHOD_DECLARATION', + )); foreach ($defs as $def) { @@ -1576,9 +1583,10 @@ // TODO: Support functions defined inside other functions which is commonly // used with anonymous functions. - $fdefs = $root->selectDescendantsOfType('n_FUNCTION_DECLARATION'); - $mdefs = $root->selectDescendantsOfType('n_METHOD_DECLARATION'); - $defs = $fdefs->add($mdefs); + $defs = $root->selectDescendantsOfTypes(array( + 'n_FUNCTION_DECLARATION', + 'n_METHOD_DECLARATION', + )); foreach ($defs as $def) { @@ -2103,9 +2111,10 @@ true); - $fdefs = $root->selectDescendantsOfType('n_FUNCTION_DECLARATION'); - $mdefs = $root->selectDescendantsOfType('n_METHOD_DECLARATION'); - $defs = $fdefs->add($mdefs); + $defs = $root->selectDescendantsOfTypes(array( + 'n_FUNCTION_DECLARATION', + 'n_METHOD_DECLARATION', + )); foreach ($defs as $def) { $globals = $def->selectDescendantsOfType('n_GLOBAL_DECLARATION_LIST'); @@ -2235,17 +2244,14 @@ } private function lintParenthesesShouldHugExpressions(XHPASTNode $root) { - $calls = $root->selectDescendantsOfType('n_CALL_PARAMETER_LIST'); - $controls = $root->selectDescendantsOfType('n_CONTROL_CONDITION'); - $fors = $root->selectDescendantsOfType('n_FOR_EXPRESSION'); - $foreach = $root->selectDescendantsOfType('n_FOREACH_EXPRESSION'); - $decl = $root->selectDescendantsOfType('n_DECLARATION_PARAMETER_LIST'); - - $all_paren_groups = $calls - ->add($controls) - ->add($fors) - ->add($foreach) - ->add($decl); + $all_paren_groups = $root->selectDescendantsOfTypes(array( + 'n_CALL_PARAMETER_LIST', + 'n_CONTROL_CONDITION', + 'n_FOR_EXPRESSION', + 'n_FOREACH_EXPRESSION', + 'n_DECLARATION_PARAMETER_LIST', + )); + foreach ($all_paren_groups as $group) { $tokens = $group->getTokens(); @@ -2477,20 +2483,18 @@ } private function lintDynamicDefines(XHPASTNode $root) { - $calls = $root->selectDescendantsOfType('n_FUNCTION_CALL'); + $calls = $this->getFunctionCalls($root, array('define')); + foreach ($calls as $call) { - $name = $call->getChildByIndex(0)->getConcreteString(); - if (strtolower($name) === 'define') { - $parameter_list = $call->getChildOfType(1, 'n_CALL_PARAMETER_LIST'); - $defined = $parameter_list->getChildByIndex(0); - if (!$defined->isStaticScalar()) { - $this->raiseLintAtNode( - $defined, - self::LINT_DYNAMIC_DEFINE, - pht( - 'First argument to %s must be a string literal.', - 'define()')); - } + $parameter_list = $call->getChildOfType(1, 'n_CALL_PARAMETER_LIST'); + $defined = $parameter_list->getChildByIndex(0); + if (!$defined->isStaticScalar()) { + $this->raiseLintAtNode( + $defined, + self::LINT_DYNAMIC_DEFINE, + pht( + 'First argument to %s must be a string literal.', + 'define()')); } } } @@ -2549,24 +2553,22 @@ * wrong. */ private function lintPregQuote(XHPASTNode $root) { - $function_calls = $root->selectDescendantsOfType('n_FUNCTION_CALL'); + $function_calls = $this->getFunctionCalls($root, array('preg_quote')); + foreach ($function_calls as $call) { - $name = $call->getChildByIndex(0)->getConcreteString(); - if (strtolower($name) === 'preg_quote') { - $parameter_list = $call->getChildOfType(1, 'n_CALL_PARAMETER_LIST'); - if (count($parameter_list->getChildren()) !== 2) { - $this->raiseLintAtNode( - $call, - self::LINT_PREG_QUOTE_MISUSE, - pht( - 'If you use pattern delimiters that require escaping '. - '(such as `%s`, but not `%s`) then you should pass two '. - 'arguments to %s, so that %s knows which delimiter to escape.', - '//', - '()', - 'preg_quote()', - 'preg_quote()')); - } + $parameter_list = $call->getChildOfType(1, 'n_CALL_PARAMETER_LIST'); + if (count($parameter_list->getChildren()) !== 2) { + $this->raiseLintAtNode( + $call, + self::LINT_PREG_QUOTE_MISUSE, + pht( + 'If you use pattern delimiters that require escaping '. + '(such as `%s`, but not `%s`) then you should pass two '. + 'arguments to %s, so that %s knows which delimiter to escape.', + '//', + '()', + 'preg_quote()', + 'preg_quote()')); } } } @@ -2780,8 +2782,10 @@ } private function lintClosingCallParen(XHPASTNode $root) { - $calls = $root->selectDescendantsOfType('n_FUNCTION_CALL'); - $calls = $calls->add($root->selectDescendantsOfType('n_METHOD_CALL')); + $calls = $root->selectDescendantsOfTypes(array( + 'n_FUNCTION_CALL', + 'n_METHOD_CALL', + )); foreach ($calls as $call) { // If the last parameter of a call is a HEREDOC, don't apply this rule. @@ -2813,8 +2817,10 @@ } private function lintClosingDeclarationParen(XHPASTNode $root) { - $decs = $root->selectDescendantsOfType('n_FUNCTION_DECLARATION'); - $decs = $decs->add($root->selectDescendantsOfType('n_METHOD_DECLARATION')); + $decs = $root->selectDescendantsOfTypes(array( + 'n_FUNCTION_DECLARATION', + 'n_METHOD_DECLARATION', + )); foreach ($decs as $dec) { $params = $dec->getChildOfType(3, 'n_DECLARATION_PARAMETER_LIST');