/**
  * Checks if the passed value is valid.
  *
  * @param FileDescriptor|ClassDescriptor|InterfaceDescriptor|TraitDescriptor $value      The value that should
  *     be validated.
  * @param Constraint                                                         $constraint The constraint for
  *     the validation.
  *
  * @throws ConstraintDefinitionException if this is not a constraint on a PropertyDescriptor object.
  */
 public function validate($value, Constraint $constraint)
 {
     if (!$value instanceof FileDescriptor && !$value instanceof ClassDescriptor && !$value instanceof InterfaceDescriptor && !$value instanceof TraitDescriptor) {
         throw new ConstraintDefinitionException('The HasPackageWithSubpackageValidator validator may only be used on files, classes, ' . 'interfaces and traits');
     }
     if ($value->getTags()->get('subpackage', new Collection())->count() > 0 && $value->getTags()->get('package', new Collection())->count() < 1) {
         $this->context->addViolationAt('package', $constraint->message, array(), null, null, $constraint->code);
     }
 }
 /**
  * Creates a Descriptor from the provided data.
  *
  * @param FileReflector $data
  *
  * @return FileDescriptor
  */
 public function create($data)
 {
     $fileDescriptor = new FileDescriptor($data->getHash());
     $fileDescriptor->setPackage($this->extractPackageFromDocBlock($data->getDocBlock()) ?: $data->getDefaultPackageName());
     $packages = new Collection();
     $package = $this->extractPackageFromDocBlock($data->getDocBlock());
     if (!$package) {
         $package = $data->getDefaultPackageName();
     }
     $tag = new TagDescriptor('package');
     $tag->setDescription($package);
     $packages->add($tag);
     $fileDescriptor->getTags()->set('package', $packages);
     $fileDescriptor->setName(basename($data->getFilename()));
     $fileDescriptor->setPath($data->getFilename());
     $fileDescriptor->setSource($data->getContents());
     $fileDescriptor->setIncludes(new Collection($data->getIncludes()));
     $fileDescriptor->setNamespaceAliases(new Collection($data->getNamespaceAliases()));
     $this->assembleDocBlock($data->getDocBlock(), $fileDescriptor);
     $this->addMarkers($data->getMarkers(), $fileDescriptor);
     $this->addConstants($data->getConstants(), $fileDescriptor);
     $this->addFunctions($data->getFunctions(), $fileDescriptor);
     $this->addClasses($data->getClasses(), $fileDescriptor);
     $this->addInterfaces($data->getInterfaces(), $fileDescriptor);
     $this->addTraits($data->getTraits(), $fileDescriptor);
     return $fileDescriptor;
 }
 /**
  * Checks if the passed value is valid.
  *
  * @param FileDescriptor|ClassDescriptor|InterfaceDescriptor|TraitDescriptor $value      The value that should
  *     be validated.
  * @param Constraint                                                         $constraint The constraint for
  *     the validation.
  *
  * @throws ConstraintDefinitionException if this is not a constraint on a PropertyDescriptor object.
  */
 public function validate($value, Constraint $constraint)
 {
     if (!$value instanceof FileDescriptor && !$value instanceof ClassDescriptor && !$value instanceof InterfaceDescriptor && !$value instanceof TraitDescriptor) {
         throw new ConstraintDefinitionException('The HasSinglePackage validator may only be used on files, classes, interfaces and traits');
     }
     if ($value->getTags()->get('package', new Collection())->count() > 1) {
         $this->context->addViolationAt('package', $constraint->message);
     }
 }