file_provider = new Provider\FakeFileProvider(); $this->project_checker = new \Psalm\Checker\ProjectChecker( new TestConfig(), $this->file_provider, new Provider\FakeParserCacheProvider() ); $this->project_checker->getCodebase()->collect_references = true; } /** * @dataProvider providerFileCheckerValidCodeParse * * @param string $input_code * @param string $symbol * @param array $expected_locations * * @return void */ public function testValidCode($input_code, $symbol, $expected_locations) { $test_name = $this->getName(); if (strpos($test_name, 'PHP7-') !== false) { if (version_compare(PHP_VERSION, '7.0.0dev', '<')) { $this->markTestSkipped('Test case requires PHP 7.'); return; } } elseif (strpos($test_name, 'SKIPPED-') !== false) { $this->markTestSkipped('Skipped due to a bug.'); } $context = new Context(); $file_path = self::$src_dir_path . 'somefile.php'; $this->addFile($file_path, $input_code); $this->analyzeFile($file_path, $context); $found_references = $this->project_checker->getCodebase()->findReferencesToSymbol($symbol); if (!isset($found_references[$file_path])) { throw new \UnexpectedValueException('No file references found in this file'); } $file_references = $found_references[$file_path]; $this->assertSame(count($file_references), count($expected_locations)); foreach ($expected_locations as $i => $expected_location) { $actual_location = $file_references[$i]; $this->assertSame( $expected_location, $actual_location->getLineNumber() . ':' . $actual_location->getColumn() . ':' . $actual_location->getSelectedText() ); } } /** * @return array */ public function providerFileCheckerValidCodeParse() { return [ 'getClassLocation' => [ ' [ 'foo();', 'A::foo', ['6:21:(new A())->foo()'], ], ]; } }