From f144ca7c26f495a52a637a1b6ec7eeab04ebf210 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 2 Jun 2017 17:09:01 -0700 Subject: [PATCH] Refactor findVariableDefinitionsInNode to simplify and avoid closure use --- src/CompletionProvider.php | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/CompletionProvider.php b/src/CompletionProvider.php index 2b34d3f..8050a65 100644 --- a/src/CompletionProvider.php +++ b/src/CompletionProvider.php @@ -400,25 +400,17 @@ class CompletionProvider $vars = []; // If the child node is a variable assignment, save it - $isAssignmentToVariable = function ($node) use ($namePrefix) { - return $node instanceof Node\Expression\AssignmentExpression - && $node->leftOperand instanceof Node\Expression\Variable - && (empty($namePrefix) || strpos($node->leftOperand->getName(), $namePrefix) !== false); - }; - $isNotFunctionLike = function ($node) { - return !( - ParserHelpers::isFunctionLike($node) || - $node instanceof Node\Statement\ClassDeclaration || - $node instanceof Node\Statement\InterfaceDeclaration || - $node instanceof Node\Statement\TraitDeclaration - ); + $isAssignmentToVariable = function ($node) { + return $node instanceof Node\Expression\AssignmentExpression; }; - if ($isAssignmentToVariable($node)) { + if ($this->isAssignmentToVariableWithPrefix($node, $namePrefix)) { $vars[] = $node->leftOperand; } else { - foreach ($node->getDescendantNodes($isNotFunctionLike) as $descendantNode) { - if ($isAssignmentToVariable($descendantNode)) { + // Get all descendent variables, then filter to ones that start with $namePrefix. + // Avoiding closure usage in tight loop + foreach ($node->getDescendantNodes($isAssignmentToVariable) as $descendantNode) { + if ($this->isAssignmentToVariableWithPrefix($descendantNode, $namePrefix)) { $vars[] = $descendantNode->leftOperand; } } @@ -426,4 +418,11 @@ class CompletionProvider return $vars; } + + private function isAssignmentToVariableWithPrefix($node, $namePrefix) + { + return $node instanceof Node\Expression\AssignmentExpression + && $node->leftOperand instanceof Node\Expression\Variable + && (empty($namePrefix) || strpos($node->leftOperand->getName(), $namePrefix) !== false); + } }