1
0
Fork 0
php-language-server/tests/NodeVisitor/DefinitionCollectorTest.php

78 lines
4.1 KiB
PHP
Raw Normal View History

2016-10-08 12:59:08 +00:00
<?php
declare(strict_types = 1);
namespace LanguageServer\Tests\Server\TextDocument;
use PHPUnit\Framework\TestCase;
use PhpParser\{NodeTraverser, Node};
2016-10-08 12:59:08 +00:00
use PhpParser\NodeVisitor\NameResolver;
use LanguageServer\{LanguageClient, Project, PhpDocument, Parser, DefinitionResolver};
2016-12-08 01:33:48 +00:00
use LanguageServer\ContentRetriever\FileSystemContentRetriever;
use LanguageServer\Protocol\ClientCapabilities;
use LanguageServer\Tests\MockProtocolStream;
2016-10-09 14:03:56 +00:00
use LanguageServer\NodeVisitor\{ReferencesAdder, DefinitionCollector};
use function LanguageServer\pathToUri;
2016-10-08 12:59:08 +00:00
class DefinitionCollectorTest extends TestCase
{
2016-10-09 13:48:08 +00:00
public function testCollectsSymbols()
2016-10-08 12:59:08 +00:00
{
2016-10-31 10:47:21 +00:00
$client = new LanguageClient(new MockProtocolStream, new MockProtocolStream);
2016-12-08 01:33:48 +00:00
$project = new Project($client, new FileSystemContentRetriever);
$parser = new Parser;
$uri = pathToUri(realpath(__DIR__ . '/../../fixtures/symbols.php'));
$document = $project->loadDocument($uri)->wait();
2016-10-08 12:59:08 +00:00
$traverser = new NodeTraverser;
$traverser->addVisitor(new NameResolver);
$traverser->addVisitor(new ReferencesAdder($document));
$definitionCollector = new DefinitionCollector(new DefinitionResolver($project));
2016-10-08 12:59:08 +00:00
$traverser->addVisitor($definitionCollector);
$stmts = $parser->parse(file_get_contents($uri));
2016-10-08 12:59:08 +00:00
$traverser->traverse($stmts);
$defNodes = $definitionCollector->nodes;
2016-10-08 12:59:08 +00:00
$this->assertEquals([
'TestNamespace',
2016-10-08 12:59:08 +00:00
'TestNamespace\\TEST_CONST',
'TestNamespace\\TestClass',
'TestNamespace\\TestClass::TEST_CLASS_CONST',
'TestNamespace\\TestClass::$staticTestProperty',
'TestNamespace\\TestClass->testProperty',
2016-10-08 12:59:08 +00:00
'TestNamespace\\TestClass::staticTestMethod()',
'TestNamespace\\TestClass->testMethod()',
2016-10-08 12:59:08 +00:00
'TestNamespace\\TestTrait',
'TestNamespace\\TestInterface',
'TestNamespace\\test_function()'
], array_keys($defNodes));
$this->assertInstanceOf(Node\Const_::class, $defNodes['TestNamespace\\TEST_CONST']);
$this->assertInstanceOf(Node\Stmt\Class_::class, $defNodes['TestNamespace\\TestClass']);
$this->assertInstanceOf(Node\Const_::class, $defNodes['TestNamespace\\TestClass::TEST_CLASS_CONST']);
$this->assertInstanceOf(Node\Stmt\PropertyProperty::class, $defNodes['TestNamespace\\TestClass::$staticTestProperty']);
$this->assertInstanceOf(Node\Stmt\PropertyProperty::class, $defNodes['TestNamespace\\TestClass->testProperty']);
$this->assertInstanceOf(Node\Stmt\ClassMethod::class, $defNodes['TestNamespace\\TestClass::staticTestMethod()']);
$this->assertInstanceOf(Node\Stmt\ClassMethod::class, $defNodes['TestNamespace\\TestClass->testMethod()']);
$this->assertInstanceOf(Node\Stmt\Trait_::class, $defNodes['TestNamespace\\TestTrait']);
$this->assertInstanceOf(Node\Stmt\Interface_::class, $defNodes['TestNamespace\\TestInterface']);
$this->assertInstanceOf(Node\Stmt\Function_::class, $defNodes['TestNamespace\\test_function()']);
2016-10-08 12:59:08 +00:00
}
2016-10-09 13:48:08 +00:00
public function testDoesNotCollectReferences()
{
2016-10-31 10:47:21 +00:00
$client = new LanguageClient(new MockProtocolStream, new MockProtocolStream);
2016-12-08 01:33:48 +00:00
$project = new Project($client, new FileSystemContentRetriever);
$parser = new Parser;
$uri = pathToUri(realpath(__DIR__ . '/../../fixtures/references.php'));
$document = $project->loadDocument($uri)->wait();
2016-10-09 13:48:08 +00:00
$traverser = new NodeTraverser;
$traverser->addVisitor(new NameResolver);
$traverser->addVisitor(new ReferencesAdder($document));
$definitionCollector = new DefinitionCollector(new DefinitionResolver($project));
2016-10-09 13:48:08 +00:00
$traverser->addVisitor($definitionCollector);
$stmts = $parser->parse(file_get_contents($uri));
2016-10-09 13:48:08 +00:00
$traverser->traverse($stmts);
$defNodes = $definitionCollector->nodes;
$this->assertEquals(['TestNamespace', 'TestNamespace\\whatever()'], array_keys($defNodes));
$this->assertInstanceOf(Node\Stmt\Namespace_::class, $defNodes['TestNamespace']);
$this->assertInstanceOf(Node\Stmt\Function_::class, $defNodes['TestNamespace\\whatever()']);
2016-10-09 13:48:08 +00:00
}
2016-10-08 12:59:08 +00:00
}