diff --git a/src/lint/linter/ArcanistXHPASTLinter.php b/src/lint/linter/ArcanistXHPASTLinter.php index 06b983b1..39be6e50 100644 --- a/src/lint/linter/ArcanistXHPASTLinter.php +++ b/src/lint/linter/ArcanistXHPASTLinter.php @@ -1202,11 +1202,11 @@ final class ArcanistXHPASTLinter extends ArcanistBaseXHPASTLinter { } } - $catches = $body - ->selectDescendantsOfType('n_CATCH') - ->selectDescendantsOfType('n_VARIABLE'); - foreach ($catches as $var) { - $vars[] = $var; + // Include "catch (Exception $ex)", but not variables in the body of the + // catch block. + $catches = $body->selectDescendantsOfType('n_CATCH'); + foreach ($catches as $catch) { + $vars[] = $catch->getChildOfType(1, 'n_VARIABLE'); } $binary = $body->selectDescendantsOfType('n_BINARY_EXPRESSION'); diff --git a/src/lint/linter/__tests__/xhpast/undeclared-variables.lint-test b/src/lint/linter/__tests__/xhpast/undeclared-variables.lint-test index 47516e5b..3fe66f2a 100644 --- a/src/lint/linter/__tests__/xhpast/undeclared-variables.lint-test +++ b/src/lint/linter/__tests__/xhpast/undeclared-variables.lint-test @@ -166,6 +166,14 @@ function strings() { echo "$b"; } +function catchy() { + try { + dangerous(); + } catch (Exception $ex) { + $y->z(); + } +} + ~~~~~~~~~~ disabled:3:1 error:30:3 @@ -185,3 +193,4 @@ error:125:3 Should only warn once in this function. error:146:8 error:152:9 error:166:9 +error:173:5