Exemplo n.º 1
0
 /**
  * Not used right now
  * TODO: Needs better implementation
  * @param \EBT\ExtensionBuilder\Domain\Model\DomainObject $domainObject
  * @return void
  */
 public function sortMethods($domainObject)
 {
     $objectProperties = $domainObject->getProperties();
     $sortedProperties = array();
     $propertyRelatedMethods = array();
     $customMethods = array();
     // sort all properties and methods according to domainObject sort order
     foreach ($objectProperties as $objectProperty) {
         if ($this->classObject->propertyExists($objectProperty->getName())) {
             $sortedProperties[$objectProperty->getName()] = $this->classObject->getProperty($objectProperty->getName());
             $methodPrefixes = array('get', 'set', 'add', 'remove', 'is');
             foreach ($methodPrefixes as $methodPrefix) {
                 $methodName = self::getMethodName($objectProperty, $methodPrefix);
                 if ($this->classObject->methodExists($methodName)) {
                     $propertyRelatedMethods[$methodName] = $this->classObject->getMethod($methodName);
                 }
             }
         }
     }
     // add the properties that were not in the domainObject
     $classProperties = $this->classObject->getProperties();
     $sortedPropertyNames = array_keys($sortedProperties);
     foreach ($classProperties as $classProperty) {
         if (!in_array($classProperty->getName(), $sortedProperties)) {
             $sortedProperties[$classProperty->getName()] = $classProperty;
         }
     }
     // add custom methods that were manually added to the class
     $classMethods = $this->classObject->getMethods();
     $propertyRelatedMethodNames = array_keys($propertyRelatedMethods);
     foreach ($classMethods as $classMethod) {
         if (!in_array($classMethod->getName(), $propertyRelatedMethodNames)) {
             $customMethods[$classMethod->getName()] = $classMethod;
         }
     }
     $sortedMethods = array_merge($customMethods, $propertyRelatedMethods);
     $this->classObject->setProperties($sortedProperties);
     $this->classObject->setMethods($sortedMethods);
 }
Exemplo n.º 2
0
 /**
  * update means renaming of method name, parameter and replacing
  * parameter names in method body
  *
  * @param \EBT\ExtensionBuilder\Domain\Model\DomainObject\AbstractProperty $oldProperty
  * @param \EBT\ExtensionBuilder\Domain\Model\DomainObject\AbstractProperty $newProperty
  * @param string $methodType get,set,add,remove,is
  *
  * @return void
  */
 protected function updateMethod($oldProperty, $newProperty, $methodType)
 {
     $oldMethodName = ClassBuilder::getMethodName($oldProperty, $methodType);
     // the method to be merged
     $mergedMethod = $this->classObject->getMethod($oldMethodName);
     if (!$mergedMethod) {
         // no previous version of the method exists
         return;
     }
     $newMethodName = ClassBuilder::getMethodName($newProperty, $methodType);
     $this->log('updateMethod:' . $oldMethodName . '=>' . $newMethodName, 'extension_builder');
     if ($oldProperty->getName() != $newProperty->getName()) {
         // rename the method
         $mergedMethod->setName($newMethodName);
         $oldMethodBody = $mergedMethod->getBodyStmts();
         $oldComment = $mergedMethod->getDocComment();
         $newMethodBody = $this->replacePropertyNameInMethodBody($oldProperty->getName(), $newProperty->getName(), $oldMethodBody);
         $mergedMethod->setBodyStmts($newMethodBody);
     }
     // update the method parameters
     $methodParameters = $mergedMethod->getParameters();
     if (!empty($methodParameters)) {
         $parameterTags = $mergedMethod->getTagValues('param');
         foreach ($methodParameters as $methodParameter) {
             $oldParameterName = $methodParameter->getName();
             if ($oldParameterName == ClassBuilder::getParameterName($oldProperty, $methodType)) {
                 $newParameterName = ClassBuilder::getParameterName($newProperty, $methodType);
                 $methodParameter->setName($newParameterName);
                 $newMethodBody = $this->replacePropertyNameInMethodBody($oldParameterName, $newParameterName, $mergedMethod->getBodyStmts());
                 $mergedMethod->setBodyStmts($newMethodBody);
             }
             $typeHint = $methodParameter->getTypeHint();
             if ($typeHint) {
                 if ($oldProperty->isRelation()) {
                     /** @var $oldProperty \EBT\ExtensionBuilder\Domain\Model\DomainObject\Relation\AbstractRelation */
                     if ($typeHint == $oldProperty->getForeignClassName()) {
                         $methodParameter->setTypeHint($this->updateExtensionKey($this->getForeignClassName($newProperty)));
                     }
                 }
             }
             $parameterTags[$methodParameter->getPosition()] = ClassBuilder::getParamTag($newProperty, $methodType);
             $mergedMethod->replaceParameter($methodParameter);
         }
         $mergedMethod->setTag('param', $parameterTags);
     }
     $returnTagValue = $mergedMethod->getTagValue('return');
     if ($returnTagValue != 'void') {
         $mergedMethod->setTag('return', $newProperty->getTypeForComment() . ' ' . $newProperty->getName());
     }
     // replace property names in description
     $mergedMethod->setDescription(str_replace($oldProperty->getName(), $newProperty->getName(), $mergedMethod->getDescription()));
     if ($oldProperty instanceof AbstractRelation && $newProperty instanceof AbstractRelation) {
         $mergedMethod->setDescription(str_replace($oldProperty->getForeignClassName(), $newProperty->getForeignClassName(), $mergedMethod->getDescription()));
     }
     $this->classObject->removeMethod($oldMethodName);
     $this->classObject->addMethod($mergedMethod);
 }