file_provider = new \Psalm\Tests\Internal\Provider\FakeFileProvider(); $config = new TestConfig(); $providers = new Providers( $this->file_provider, new \Psalm\Tests\Internal\Provider\ParserInstanceCacheProvider(), null, null, new Provider\FakeFileReferenceCacheProvider() ); $this->project_analyzer = new ProjectAnalyzer( $config, $providers, false, true, ProjectAnalyzer::TYPE_CONSOLE, 1, false ); $this->project_analyzer->setPhpVersion('7.3'); $this->project_analyzer->getCodebase()->store_node_types = true; } /** * @return void */ public function testSimpleSymbolLookup() { $this->addFile( 'somefile.php', 'project_analyzer, 'somefile.php', 'somefile.php'); $codebase = $this->project_analyzer->getCodebase(); $this->analyzeFile('somefile.php', new Context()); $this->assertSame('getSymbolInformation('somefile.php', 'B\A::foo()')); $this->assertSame('getSymbolInformation('somefile.php', 'B\A::$a')); $this->assertSame('getSymbolInformation('somefile.php', 'B\bar()')); $this->assertSame('getSymbolInformation('somefile.php', 'B\A::BANANA')); } /** * @return void */ public function testSimpleSymbolLocation() { $this->addFile( 'somefile.php', 'project_analyzer, 'somefile.php', 'somefile.php'); $codebase = $this->project_analyzer->getCodebase(); $this->analyzeFile('somefile.php', new Context()); $method_symbol_location = $codebase->getSymbolLocation('somefile.php', 'B\A::foo()'); $this->assertNotNull($method_symbol_location); $this->assertSame(10, $method_symbol_location->getLineNumber()); $this->assertSame(37, $method_symbol_location->getColumn()); $property_symbol_location = $codebase->getSymbolLocation('somefile.php', 'B\A::$a'); $this->assertNotNull($property_symbol_location); $this->assertSame(6, $property_symbol_location->getLineNumber()); $this->assertSame(31, $property_symbol_location->getColumn()); $constant_symbol_location = $codebase->getSymbolLocation('somefile.php', 'B\A::BANANA'); $this->assertNotNull($constant_symbol_location); $this->assertSame(8, $constant_symbol_location->getLineNumber()); $this->assertSame(27, $constant_symbol_location->getColumn()); $function_symbol_location = $codebase->getSymbolLocation('somefile.php', 'B\bar()'); $this->assertNotNull($function_symbol_location); $this->assertSame(13, $function_symbol_location->getLineNumber()); $this->assertSame(26, $function_symbol_location->getColumn()); } /** * @return void */ public function testSymbolLookupAfterAlteration() { $codebase = $this->project_analyzer->getCodebase(); $config = $codebase->config; $config->throw_exception = false; $this->addFile( 'somefile.php', 'a; $c = $b; echo $a; } public function bar() : void { $a = 2; echo $a; } }' ); $codebase->file_provider->openFile('somefile.php'); $codebase->scanFiles(); $this->analyzeFile('somefile.php', new Context()); $codebase->addTemporaryFileChanges( 'somefile.php', 'a; $c = $b; echo $a; } public function bar() : void { $a = 2; echo $a; } }' ); $codebase->reloadFiles($this->project_analyzer, ['somefile.php']); $codebase->analyzer->analyzeFiles($this->project_analyzer, 1, false); $symbol_at_position = $codebase->getReferenceAtPosition('somefile.php', new Position(10, 30)); $this->assertNotNull($symbol_at_position); $this->assertSame('type: int|null', $symbol_at_position[0]); $symbol_at_position = $codebase->getReferenceAtPosition('somefile.php', new Position(12, 30)); $this->assertNotNull($symbol_at_position); $this->assertSame('type: int', $symbol_at_position[0]); $symbol_at_position = $codebase->getReferenceAtPosition('somefile.php', new Position(17, 30)); $this->assertNotNull($symbol_at_position); $this->assertSame('type: int', $symbol_at_position[0]); } }