From 8c7cfd70e9622ac91acf79447eb3a641f9c44a6c Mon Sep 17 00:00:00 2001 From: Marek Pietrzak Date: Fri, 22 Sep 2017 10:06:09 +0100 Subject: [PATCH] Add additional checks to the UseAssembler --- .../CodeGenerator/Assembler/UseAssembler.php | 18 ++++- .../Assembler/UseAssemblerTest.php | 76 +++++++++++++++++++ 2 files changed, 93 insertions(+), 1 deletion(-) diff --git a/src/Phpro/SoapClient/CodeGenerator/Assembler/UseAssembler.php b/src/Phpro/SoapClient/CodeGenerator/Assembler/UseAssembler.php index 630996ca..9dc8d5c5 100644 --- a/src/Phpro/SoapClient/CodeGenerator/Assembler/UseAssembler.php +++ b/src/Phpro/SoapClient/CodeGenerator/Assembler/UseAssembler.php @@ -75,6 +75,22 @@ public function assemble(ContextInterface $context) */ private function usesTheSameNamespace(ClassGenerator $class) { - return $this->useName === $class->getNamespaceName(); + $namespaceName = (string) $class->getNamespaceName(); + + if ($this->usesGlobalNamespace($namespaceName)) { + return true; + } + + return in_array($namespaceName, [$this->useName, $this->getClassUseNamespaceName()]); + } + + private function usesGlobalNamespace(string $namespaceName): bool + { + return '' === $namespaceName && false === strpos($this->useName, '\\'); + } + + private function getClassUseNamespaceName(): string + { + return substr($this->useName, 0, strrpos($this->useName, '\\')); } } diff --git a/test/PhproTest/SoapClient/Unit/CodeGenerator/Assembler/UseAssemblerTest.php b/test/PhproTest/SoapClient/Unit/CodeGenerator/Assembler/UseAssemblerTest.php index 39632439..ca437e9c 100644 --- a/test/PhproTest/SoapClient/Unit/CodeGenerator/Assembler/UseAssemblerTest.php +++ b/test/PhproTest/SoapClient/Unit/CodeGenerator/Assembler/UseAssemblerTest.php @@ -146,6 +146,82 @@ class MyType { +} + +CODE; + + $this->assertEquals($expected, $code); + } + + /** + * @test + */ + function it_does_not_assemble_use_for_the_same_namespace_but_different_class() + { + $assembler = new UseAssembler('MyNamespace\\SomeOtherClass'); + $context = $this->createContext(); + $assembler->assemble($context); + + $code = $context->getClass()->generate(); + $expected = <<assertEquals($expected, $code); + } + + /** + * @test + */ + function it_does_not_assemble_use_for_the_global_namespace() + { + $assembler = new UseAssembler('SomeOtherClass'); + $class = new ClassGenerator('MyType'); + $type = new Type('', 'MyType', []); + $context = new TypeContext($class, $type); + + $assembler->assemble($context); + + $code = $context->getClass()->generate(); + $expected = <<assertEquals($expected, $code); + } + + + /** + * @test + */ + function it_assembles_use_for_the_different_namespace() + { + $assembler = new UseAssembler('DifferentNamespace\\SomeOtherClass'); + $context = $this->createContext(); + $assembler->assemble($context); + + $code = $context->getClass()->generate(); + $expected = <<