diff --git a/doc/book/generator/reference.md b/doc/book/generator/reference.md index 473b6586..5b733e04 100644 --- a/doc/book/generator/reference.md +++ b/doc/book/generator/reference.md @@ -104,6 +104,7 @@ class Zend\Code\Generator\ClassGenerator extends Zend\Code\Generator\AbstractGen public function addConstant($property) public function getConstants() public function getConstant($propertyName) + public function removeConstant($constantName) public function setDocblock(Zend\Code\Generator\DocBlockGenerator $docblock) public function getDocblock() public function setName($name) @@ -112,17 +113,26 @@ class Zend\Code\Generator\ClassGenerator extends Zend\Code\Generator\AbstractGen public function isAbstract() public function setExtendedClass($extendedClass) public function getExtendedClass() + public function hasExtentedClass() + public function removeExtentedClass() public function setImplementedInterfaces(Array $implementedInterfaces) public function getImplementedInterfaces() public function addProperties(Array $properties) public function addProperty($property) public function getProperties() public function getProperty($propertyName) + public function removeProperty($propertyName) public function addMethods(Array $methods) public function addMethod($method) public function getMethods() public function getMethod($methodName) public function hasMethod($methodName) + public function hasUse($use) + public function removeUse($use) + public function hasUseAlias($use) + public function removeUseAlias($use) + public function hasImplementedInterface($implementedInterface) + public function removeImplementedInterface($implementedInterface) public function isSourceDirty() public function generate() } diff --git a/src/Generator/ClassGenerator.php b/src/Generator/ClassGenerator.php index 259febf1..2b032129 100644 --- a/src/Generator/ClassGenerator.php +++ b/src/Generator/ClassGenerator.php @@ -78,7 +78,7 @@ class ClassGenerator extends AbstractGenerator * Build a Code Generation Php Object from a Class Reflection * * @param ClassReflection $classReflection - * @return ClassGenerator + * @return self */ public static function fromReflection(ClassReflection $classReflection) { @@ -167,7 +167,7 @@ public static function fromReflection(ClassReflection $classReflection) * * @throws Exception\InvalidArgumentException * @param array $array - * @return ClassGenerator + * @return self */ public static function fromArray(array $array) { @@ -262,7 +262,7 @@ public function __construct( /** * @param string $name - * @return ClassGenerator + * @return self */ public function setName($name) { @@ -286,7 +286,7 @@ public function getName() /** * @param string $namespaceName - * @return ClassGenerator + * @return self */ public function setNamespaceName($namespaceName) { @@ -304,7 +304,7 @@ public function getNamespaceName() /** * @param FileGenerator $fileGenerator - * @return ClassGenerator + * @return self */ public function setContainingFileGenerator(FileGenerator $fileGenerator) { @@ -322,7 +322,7 @@ public function getContainingFileGenerator() /** * @param DocBlockGenerator $docBlock - * @return ClassGenerator + * @return self */ public function setDocBlock(DocBlockGenerator $docBlock) { @@ -340,7 +340,7 @@ public function getDocBlock() /** * @param array|string $flags - * @return ClassGenerator + * @return self */ public function setFlags($flags) { @@ -359,7 +359,7 @@ public function setFlags($flags) /** * @param string $flag - * @return ClassGenerator + * @return self */ public function addFlag($flag) { @@ -369,7 +369,7 @@ public function addFlag($flag) /** * @param string $flag - * @return ClassGenerator + * @return self */ public function removeFlag($flag) { @@ -379,7 +379,7 @@ public function removeFlag($flag) /** * @param bool $isAbstract - * @return ClassGenerator + * @return self */ public function setAbstract($isAbstract) { @@ -396,7 +396,7 @@ public function isAbstract() /** * @param bool $isFinal - * @return ClassGenerator + * @return self */ public function setFinal($isFinal) { @@ -413,7 +413,7 @@ public function isFinal() /** * @param string $extendedClass - * @return ClassGenerator + * @return self */ public function setExtendedClass($extendedClass) { @@ -429,12 +429,33 @@ public function getExtendedClass() return $this->extendedClass; } + /** + * @return bool + */ + public function hasExtentedClass() + { + return !empty($this->extendedClass); + } + + /** + * @return self + */ + public function removeExtentedClass() + { + $this->setExtendedClass(null); + return $this; + } + /** * @param array $implementedInterfaces - * @return ClassGenerator + * @return self */ public function setImplementedInterfaces(array $implementedInterfaces) { + array_map(function ($implementedInterface) { + return (string) TypeGenerator::fromTypeString($implementedInterface); + }, $implementedInterfaces); + $this->implementedInterfaces = $implementedInterfaces; return $this; } @@ -447,9 +468,29 @@ public function getImplementedInterfaces() return $this->implementedInterfaces; } + /** + * @param string $implementedInterface + * @return bool + */ + public function hasImplementedInterface($implementedInterface) + { + $implementedInterface = (string) TypeGenerator::fromTypeString($implementedInterface); + return in_array($implementedInterface, $this->implementedInterfaces); + } + + /** + * @param $implementedInterface + * @return self + */ + public function removeImplementedInterface($implementedInterface) + { + $implementedInterface = (string) TypeGenerator::fromTypeString($implementedInterface); + unset($this->implementedInterfaces[array_search($implementedInterface, $this->implementedInterfaces)]); + return $this; + } + /** * @param string $constantName - * * @return PropertyGenerator|false */ public function getConstant($constantName) @@ -469,6 +510,17 @@ public function getConstants() return $this->constants; } + /** + * @param string $constantName + * @return self + */ + public function removeConstant($constantName) + { + unset($this->constants[$constantName]); + + return $this; + } + /** * @param string $constantName * @return bool @@ -483,7 +535,7 @@ public function hasConstant($constantName) * * @param PropertyGenerator $constant * @throws Exception\InvalidArgumentException - * @return ClassGenerator + * @return self */ public function addConstantFromGenerator(PropertyGenerator $constant) { @@ -516,7 +568,7 @@ public function addConstantFromGenerator(PropertyGenerator $constant) * * @throws Exception\InvalidArgumentException * - * @return ClassGenerator + * @return self */ public function addConstant($name, $value) { @@ -537,7 +589,7 @@ public function addConstant($name, $value) /** * @param PropertyGenerator[]|array[] $constants * - * @return ClassGenerator + * @return self */ public function addConstants(array $constants) { @@ -556,7 +608,7 @@ public function addConstants(array $constants) /** * @param array $properties - * @return ClassGenerator + * @return self */ public function addProperties(array $properties) { @@ -582,7 +634,7 @@ public function addProperties(array $properties) * @param string|array $defaultValue * @param int $flags * @throws Exception\InvalidArgumentException - * @return ClassGenerator + * @return self */ public function addProperty($name, $defaultValue = null, $flags = PropertyGenerator::FLAG_PUBLIC) { @@ -608,7 +660,7 @@ public function addProperty($name, $defaultValue = null, $flags = PropertyGenera * * @param PropertyGenerator $property * @throws Exception\InvalidArgumentException - * @return ClassGenerator + * @return self */ public function addPropertyFromGenerator(PropertyGenerator $property) { @@ -659,7 +711,7 @@ public function getProperty($propertyName) * * @param string $use * @param string|null $useAlias - * @return ClassGenerator + * @return self */ public function addUse($use, $useAlias = null) { @@ -667,6 +719,44 @@ public function addUse($use, $useAlias = null) return $this; } + /** + * @param string $use + * @return self + */ + public function hasUse($use) + { + return $this->traitUsageGenerator->hasUse($use); + } + + /** + * @param string $use + * @return self + */ + public function removeUse($use) + { + $this->traitUsageGenerator->removeUse($use); + return $this; + } + + /** + * @param string $use + * @return bool + */ + public function hasUseAlias($use) + { + return $this->traitUsageGenerator->hasUseAlias($use); + } + + /** + * @param $use + * @return self + */ + public function removeUseAlias($use) + { + $this->traitUsageGenerator->removeUseAlias($use); + return $this; + } + /** * Returns the "use" classes * @@ -677,6 +767,18 @@ public function getUses() return $this->traitUsageGenerator->getUses(); } + + /** + * @param string $propertyName + * @return self + */ + public function removeProperty($propertyName) + { + unset($this->properties[$propertyName]); + + return $this; + } + /** * @param string $propertyName * @return bool @@ -688,7 +790,7 @@ public function hasProperty($propertyName) /** * @param array $methods - * @return ClassGenerator + * @return self */ public function addMethods(array $methods) { @@ -716,7 +818,7 @@ public function addMethods(array $methods) * @param string $body * @param string $docBlock * @throws Exception\InvalidArgumentException - * @return ClassGenerator + * @return self */ public function addMethod( $name = null, @@ -741,7 +843,7 @@ public function addMethod( * * @param MethodGenerator $method * @throws Exception\InvalidArgumentException - * @return ClassGenerator + * @return self */ public function addMethodFromGenerator(MethodGenerator $method) { @@ -777,13 +879,11 @@ public function getMethod($methodName) /** * @param string $methodName - * @return ClassGenerator + * @return self */ public function removeMethod($methodName) { - if ($this->hasMethod($methodName)) { - unset($this->methods[strtolower($methodName)]); - } + unset($this->methods[strtolower($methodName)]); return $this; } diff --git a/src/Generator/TraitUsageGenerator.php b/src/Generator/TraitUsageGenerator.php index 23cf764b..8329d4a0 100644 --- a/src/Generator/TraitUsageGenerator.php +++ b/src/Generator/TraitUsageGenerator.php @@ -48,6 +48,8 @@ public function __construct(ClassGenerator $classGenerator) */ public function addUse($use, $useAlias = null) { + $this->removeUse($use); + if (! empty($useAlias)) { $use .= ' as ' . $useAlias; } @@ -64,6 +66,70 @@ public function getUses() return array_values($this->uses); } + /** + * @param $use + * @return bool + */ + public function hasUse($use) + { + foreach ($this->uses as $key => $value) { + $parts = explode(' ', $value); + if ($parts[0] === $use) { + return true; + } + } + + return false; + } + + /** + * @param $use + * @return bool + */ + public function hasUseAlias($use) + { + foreach ($this->uses as $key => $value) { + $parts = explode(' as ', $value); + if ($parts[0] === $use and count($parts) == 2) { + return true; + } + }; + + return false; + } + + /** + * @param $use + * @return TraitUsageGenerator + */ + public function removeUse($use) + { + foreach ($this->uses as $key => $value) { + $parts = explode(' ', $value); + if ($parts[0] === $use) { + unset($this->uses[$value]); + } + }; + + return $this; + } + + /** + * @param $use + * @return TraitUsageGenerator + */ + public function removeUseAlias($use) + { + foreach ($this->uses as $key => $value) { + $parts = explode(' as ', $value); + if ($parts[0] === $use and count($parts) == 2) { + unset($this->uses[$value]); + } + }; + + return $this; + } + /** * @inherit Zend\Code\Generator\TraitUsageInterface */ diff --git a/test/Generator/ClassGeneratorTest.php b/test/Generator/ClassGeneratorTest.php index c79f4dcb..e92525dd 100644 --- a/test/Generator/ClassGeneratorTest.php +++ b/test/Generator/ClassGeneratorTest.php @@ -59,6 +59,24 @@ public function testExtendedClassAccessors() $this->assertEquals($classGenerator->getExtendedClass(), 'ExtendedClass'); } + public function testHasExtendedClass() + { + $classGenerator = new ClassGenerator(); + $classGenerator->setExtendedClass('ExtendedClass'); + + $this->assertTrue($classGenerator->hasExtentedClass()); + } + + public function testRemoveExtendedClass() + { + $classGenerator = new ClassGenerator(); + $classGenerator->setExtendedClass('ExtendedClass'); + $this->assertTrue($classGenerator->hasExtentedClass()); + + $classGenerator->removeExtentedClass(); + $this->assertFalse($classGenerator->hasExtentedClass()); + } + public function testImplementedInterfacesAccessors() { $classGenerator = new ClassGenerator(); @@ -66,6 +84,26 @@ public function testImplementedInterfacesAccessors() $this->assertEquals($classGenerator->getImplementedInterfaces(), ['Class1', 'Class2']); } + public function testHasImplementedInterface() + { + $classGenerator = new ClassGenerator(); + $classGenerator->setImplementedInterfaces(['Class1', 'Class2']); + + $this->assertTrue($classGenerator->hasImplementedInterface('Class1')); + } + + public function testRemoveImplementedInterface() + { + $classGenerator = new ClassGenerator(); + $classGenerator->setImplementedInterfaces(['Class1', 'Class2']); + + $this->assertTrue($classGenerator->hasImplementedInterface('Class1')); + + $classGenerator->removeImplementedInterface('Class1'); + $this->assertFalse($classGenerator->hasImplementedInterface('Class1')); + $this->assertTrue($classGenerator->hasImplementedInterface('Class2')); + } + public function testPropertyAccessors() { $classGenerator = new ClassGenerator(); @@ -193,6 +231,16 @@ public function testHasProperty() $this->assertTrue($classGenerator->hasProperty('propertyOne')); } + public function testRemoveProperty() + { + $classGenerator = new ClassGenerator(); + $classGenerator->addProperty('propertyOne'); + $this->assertTrue($classGenerator->hasProperty('propertyOne')); + + $classGenerator->removeProperty('propertyOne'); + $this->assertFalse($classGenerator->hasProperty('propertyOne')); + } + public function testToString() { $classGenerator = ClassGenerator::fromArray([ @@ -374,6 +422,48 @@ public function testPassingANamespacedClassnameShouldGenerateAClassnameWithoutIt $this->assertContains('class FunClass', $received, $received); } + public function testHasUse() + { + $classGenerator = new ClassGenerator(); + $classGenerator->addUse('My\First\Use\Class'); + $classGenerator->addUse('My\Second\Use\Class', 'MyAlias'); + + $this->assertTrue($classGenerator->hasUse('My\First\Use\Class')); + $this->assertTrue($classGenerator->hasUse('My\Second\Use\Class')); + } + + public function testRemoveUse() + { + $classGenerator = new ClassGenerator(); + $classGenerator->addUse('My\First\Use\Class'); + $classGenerator->addUse('My\Second\Use\Class', 'MyAlias'); + + $this->assertTrue($classGenerator->hasUse('My\First\Use\Class')); + $this->assertTrue($classGenerator->hasUse('My\Second\Use\Class')); + $classGenerator->removeUse('My\First\Use\Class'); + $classGenerator->removeUse('My\Second\Use\Class'); + $this->assertFalse($classGenerator->hasUse('My\First\Use\Class')); + $this->assertFalse($classGenerator->hasUse('My\Second\Use\Class')); + } + + public function testHasUseAlias() + { + $classGenerator = new ClassGenerator(); + $classGenerator->addUse('My\First\Use\Class'); + $classGenerator->addUse('My\Second\Use\Class', 'MyAlias'); + $this->assertFalse($classGenerator->hasUseAlias('My\First\Use\Class')); + $this->assertTrue($classGenerator->hasUseAlias('My\Second\Use\Class')); + } + + public function testRemoveUseAlias() + { + $classGenerator = new ClassGenerator(); + $classGenerator->addUse('My\First\Use\Class', 'MyAlias'); + $this->assertTrue($classGenerator->hasUseAlias('My\First\Use\Class')); + $classGenerator->removeUseAlias('My\First\Use\Class'); + $this->assertFalse($classGenerator->hasUseAlias('My\First\Use\Class')); + } + /** * @group ZF2-151 */ @@ -642,6 +732,16 @@ public function testAddConstantThrowsExceptionOnDuplicate() $classGenerator->addConstant('x', 'value1'); } + public function testRemoveConstant() + { + $classGenerator = new ClassGenerator(); + $classGenerator->addConstant('constantOne', 'foo'); + $this->assertTrue($classGenerator->hasConstant('constantOne')); + + $classGenerator->removeConstant('constantOne'); + $this->assertFalse($classGenerator->hasConstant('constantOne')); + } + /** * @group 6274 */