addVisitor(new NameResolver); $stmts = $parser->parse($code); $stmts = $traverser->traverse($stmts); $this->assertEquals($expectedCode, $prettyPrinter->prettyPrint($stmts)); } /** * @covers NameResolver */ public function testResolveLocations() { $code = <<<'EOC' addVisitor(new NameResolver); $stmts = $parser->parse($code); $stmts = $traverser->traverse($stmts); $this->assertEquals($expectedCode, $prettyPrinter->prettyPrint($stmts)); } public function testNoResolveSpecialName() { $stmts = array(new Node\Expr\New_(new Name('self'))); $traverser = new PhpParser\NodeTraverser; $traverser->addVisitor(new NameResolver); $this->assertEquals($stmts, $traverser->traverse($stmts)); } protected function createNamespacedAndNonNamespaced(array $stmts) { return array( new Stmt\Namespace_(new Name('NS'), $stmts), new Stmt\Namespace_(null, $stmts), ); } public function testAddNamespacedName() { $stmts = $this->createNamespacedAndNonNamespaced(array( new Stmt\Class_('A'), new Stmt\Interface_('B'), new Stmt\Function_('C'), new Stmt\Const_(array( new Node\Const_('D', new Node\Scalar\String('E')) )), )); $traverser = new PhpParser\NodeTraverser; $traverser->addVisitor(new NameResolver); $stmts = $traverser->traverse($stmts); $this->assertEquals('NS\\A', (string) $stmts[0]->stmts[0]->namespacedName); $this->assertEquals('NS\\B', (string) $stmts[0]->stmts[1]->namespacedName); $this->assertEquals('NS\\C', (string) $stmts[0]->stmts[2]->namespacedName); $this->assertEquals('NS\\D', (string) $stmts[0]->stmts[3]->consts[0]->namespacedName); $this->assertEquals('A', (string) $stmts[1]->stmts[0]->namespacedName); $this->assertEquals('B', (string) $stmts[1]->stmts[1]->namespacedName); $this->assertEquals('C', (string) $stmts[1]->stmts[2]->namespacedName); $this->assertEquals('D', (string) $stmts[1]->stmts[3]->consts[0]->namespacedName); } public function testAddTraitNamespacedName() { $stmts = $this->createNamespacedAndNonNamespaced(array( new Stmt\Trait_('A') )); $traverser = new PhpParser\NodeTraverser; $traverser->addVisitor(new NameResolver); $stmts = $traverser->traverse($stmts); $this->assertEquals('NS\\A', (string) $stmts[0]->stmts[0]->namespacedName); $this->assertEquals('A', (string) $stmts[1]->stmts[0]->namespacedName); } /** * @dataProvider provideTestAlreadyInUseError */ public function testAlreadyInUseError(Stmt\Use_ $use, $errorMsg) { $this->setExpectedException('PhpParser\Error', $errorMsg); $traverser = new PhpParser\NodeTraverser; $traverser->addVisitor(new NameResolver); $traverser->traverse(array($use)); } public function provideTestAlreadyInUseError() { return array( array( new Stmt\Use_(array( new Stmt\UseUse(new Name('A\B'), 'B', array('startLine' => 1)), new Stmt\UseUse(new Name('C\D'), 'B', array('startLine' => 2)), ), Stmt\Use_::TYPE_NORMAL), 'Cannot use C\D as B because the name is already in use on line 2' ), array( new Stmt\Use_(array( new Stmt\UseUse(new Name('a\b'), 'b', array('startLine' => 1)), new Stmt\UseUse(new Name('c\d'), 'B', array('startLine' => 2)), ), Stmt\Use_::TYPE_FUNCTION), 'Cannot use function c\d as B because the name is already in use on line 2' ), array( new Stmt\Use_(array( new Stmt\UseUse(new Name('A\B'), 'B', array('startLine' => 1)), new Stmt\UseUse(new Name('C\D'), 'B', array('startLine' => 2)), ), Stmt\Use_::TYPE_CONSTANT), 'Cannot use const C\D as B because the name is already in use on line 2' ), ); } public function testClassNameIsCaseInsensitive() { $source = <<<'EOC' parse($source); $traverser = new PhpParser\NodeTraverser; $traverser->addVisitor(new NameResolver); $stmts = $traverser->traverse($stmts); $stmt = $stmts[0]; $this->assertEquals(array('Bar', 'Baz'), $stmt->stmts[1]->expr->class->parts); } }