1
0
Fork 0
mirror of https://we.phorge.it/source/arcanist.git synced 2024-10-23 17:18:50 +02:00

Improve undeclared variables linter rule

Summary: Currently `ArcanistUndeclaredVariableXHPASTLinterRule` does not properly handle anonymous closures.

Test Plan: Added test cases.

Reviewers: epriestley, #blessed_reviewers

Reviewed By: epriestley, #blessed_reviewers

Subscribers: johnny-bit, Korvin

Differential Revision: https://secure.phabricator.com/D13795
This commit is contained in:
Joshua Spence 2015-08-06 06:57:16 +10:00
parent 402899a9c3
commit bf4e7d4ca8
2 changed files with 19 additions and 0 deletions

View file

@ -172,6 +172,13 @@ function catchy() {
}
}
function some_func($x, $y) {
$func = function($z) use ($x) {
echo $x;
echo $y;
echo $z;
};
}
~~~~~~~~~~
error:28:3
error:30:3
@ -191,3 +198,4 @@ error:144:8
error:150:9
error:164:9
error:171:5
error:178:10

View file

@ -164,6 +164,17 @@ final class ArcanistUndeclaredVariableXHPASTLinterRule
$scope_destroyed_at = min($scope_destroyed_at, $call->getOffset());
}
$func_decls = $body->selectDescendantsOfType('n_FUNCTION_DECLARATION');
foreach ($func_decls as $func_decl) {
if ($func_decl->getChildByIndex(2)->getTypeName() != 'n_EMPTY') {
continue;
}
foreach ($func_decl->selectDescendantsOfType('n_VARIABLE') as $var) {
$exclude_tokens[$var->getID()] = true;
}
}
// Now we have every declaration except foreach(), handled below. Build
// two maps, one which just keeps track of which tokens are part of
// declarations ($declaration_tokens) and one which has the first offset