public function __construct() { parent::__construct("lint-uninitialized-vars", "Lint (use of uninitialized vars)"); // super global variables $superGlobals = array('$GLOBALS', '$_REQUEST', '$_GET', '$_POST', '$_FILES', '$_ENV', '$_SERVER', '$_COOKIE', '$_SESSION', '$HTTP_RAW_POST_DATA', '$http_response_header', '$php_errormsg', '$this'); self::$knownSuperglobals = array_fill_keys($superGlobals, true); // global variables self::$knownGlobals = array_merge(array('$argv', '$argc'), XRef::getConfigValue("lint.add-global-var", array())); // some functions take pass-by-reference params but they don't initialize them, // the params must already exist, e.g. bool sort ( array &$array [, int $sort_flags] ) $exceptions = array('array_multisort', 'array_pop', 'array_push', 'array_shift', 'array_splice', 'array_unshift', 'array_walk', 'array_walk_recursive', 'arsort', 'asort', 'call_user_method', 'call_user_method_array', 'current', 'each', 'end', 'extract', 'key', 'krsort', 'ksort', 'mb_convert_variables', 'natcasesort', 'natsort', 'next', 'openssl_csr_new', 'pos', 'prev', 'reset', 'rsort', 'settype', 'shuffle', 'sort', 'uasort', 'uksort', 'usort', 'xml_set_object'); self::$internalFunctionsThatDoesntInitializePassedByReferenceParams = array_fill_keys($exceptions, true); $this->projectDatabase = new XRef_ProjectDatabase(); $this->projectDatabase->finalize(); }
public function testParseDocComments() { // $doc_comment = '/** @var SimpleClass $simple_test */'; $var_list = XRef_Lint_UninitializedVars::parseDocComment($doc_comment); $this->assertEquals(count($var_list), 1); $this->assertEquals($var_list['$simple_test'], 'SimpleClass'); // multi-lint doc comment $doc_comment = '/** * @var SimpleClass $simple_test */'; $var_list = XRef_Lint_UninitializedVars::parseDocComment($doc_comment); $this->assertEquals(count($var_list), 1); $this->assertEquals($var_list['$simple_test'], 'SimpleClass'); // property-like annotation (not a variable annotation) $doc_comment = '/** @var SimpleClass */'; $var_list = XRef_Lint_UninitializedVars::parseDocComment($doc_comment); $this->assertEquals(count($var_list), 0); // long doc comment $doc_comment = '/** Some introductory text * @var $just_var_without_class * @var SimpleClass $simple_test * @var AnotherClass $foo , $bar * @var YetAnotherClass $a,$b,$c */'; $var_list = XRef_Lint_UninitializedVars::parseDocComment($doc_comment); $this->assertEquals(count($var_list), 7); $this->assertEquals($var_list['$simple_test'], 'SimpleClass'); $this->assertEquals($var_list['$foo'], 'AnotherClass'); $this->assertEquals($var_list['$bar'], 'AnotherClass'); $this->assertEquals($var_list['$a'], 'YetAnotherClass'); $this->assertEquals($var_list['$b'], 'YetAnotherClass'); $this->assertEquals($var_list['$c'], 'YetAnotherClass'); $this->assertTrue(array_key_exists('$just_var_without_class', $var_list)); $this->assertTrue(is_null($var_list['$just_var_without_class'])); // namespaced class names $doc_comment = '/** * @var \\Foo\\Bar $foo_bar * @var Baz\\Quxx $baz, $quxx, */'; $var_list = XRef_Lint_UninitializedVars::parseDocComment($doc_comment); $this->assertEquals(count($var_list), 3); $this->assertEquals($var_list['$foo_bar'], '\\Foo\\Bar'); $this->assertEquals($var_list['$baz'], 'Baz\\Quxx'); $this->assertEquals($var_list['$quxx'], 'Baz\\Quxx'); }