/**
  * Execute the command
  * @param  array  $args Arguments gived to the command
  * @return array Response
  */
 public function execute($args = array())
 {
     $fileExists = false;
     // If we specified a file
     if (count($args) > 0 && ($file = $args[0])) {
         if (file_exists(Config::get('indexClasses'))) {
             $index = json_decode(file_get_contents(Config::get('indexClasses')), true);
             // Invalid json (#24)
             if (false !== $index) {
                 $fileExists = true;
                 $found = false;
                 $fileParser = new FileParser($file);
                 $class = $fileParser->getFullClassName(null, $found);
                 // if (false !== $class = array_search($file, $classMap)) {
                 if ($found) {
                     if (isset($index['mapping'][$class])) {
                         unset($index['mapping'][$class]);
                     }
                     if (false !== ($key = array_search($class, $index['autocomplete']))) {
                         unset($index['autocomplete'][$key]);
                         $index['autocomplete'] = array_values($index['autocomplete']);
                     }
                     if ($value = $this->buildIndexClass($class)) {
                         $index['mapping'][$class] = array('methods' => $value);
                         $index['autocomplete'][] = $class;
                     }
                 }
             }
         }
     }
     // Otherwise, full index
     if (!$fileExists) {
         // Autoload classes
         foreach ($this->getClassMap(true) as $class => $filePath) {
             if ($value = $this->buildIndexClass($class)) {
                 $index['mapping'][$class] = $value;
                 $index['autocomplete'][] = $class;
             }
         }
         // Internal classes
         foreach (get_declared_classes() as $class) {
             $provider = new ClassProvider();
             if ($value = $provider->execute(array($class, true))) {
                 if (!empty($value)) {
                     $index['mapping'][$class] = $value;
                     $index['autocomplete'][] = $class;
                 }
             }
         }
     }
     file_put_contents(Config::get('indexClasses'), json_encode($index));
     return array();
 }
 /**
  * {@inheritDoc}
  */
 public function execute(array $args = [])
 {
     $isSuccessful = true;
     $fileToReindex = array_shift($args);
     if (!$fileToReindex) {
         $index = [];
         foreach (get_declared_classes() as $class) {
             if (mb_strpos($class, 'PhpIntegrator') === 0) {
                 continue;
                 // Don't include our own classes.
             }
             if ($value = $this->fetchClassInfo($class, false)) {
                 $index[$class] = $value;
             }
         }
         foreach ($this->buildClassMap() as $class => $filePath) {
             if ($value = $this->fetchClassInfo($class, true)) {
                 $index[$class] = $value;
             }
         }
     } elseif (file_exists(Config::get('indexClasses'))) {
         $index = json_decode(file_get_contents(Config::get('indexClasses')), true);
         if ($index !== false) {
             $found = false;
             $fileParser = new FileParser($fileToReindex);
             $class = $fileParser->getFullClassName(null, $found);
             if ($found) {
                 if (isset($index[$class])) {
                     unset($index[$class]);
                 }
                 $value = $this->fetchClassInfo($class, true);
                 if ($value) {
                     $index[$class] = $value;
                 } else {
                     $isSuccessful = false;
                 }
             }
         }
     }
     file_put_contents(Config::get('indexClasses'), json_encode($index));
     return ['success' => $isSuccessful, 'result' => null];
 }
 /**
  * Resolves and determiens the full return type (class name) for the return value of the specified item.
  *
  * @param array       $info
  * @param string|null $currentClass The class that contains the method (either through inheritance or directly).
  *
  * @return string|null
  */
 protected function determineFullReturnType(array $info, $currentClass = null)
 {
     if (!isset($info['return']['type']) || empty($info['return']['type'])) {
         return null;
     }
     $returnValue = $info['return']['type'];
     if ($returnValue == '$this' || $returnValue == 'self') {
         return isset($info['declaringClass']['name']) ? $info['declaringClass']['name'] : null;
     } elseif ($returnValue == 'static') {
         return $currentClass ?: null;
     }
     $soleClassName = $this->getSoleClassName($returnValue);
     if (!empty($soleClassName)) {
         if ($soleClassName[0] !== "\\") {
             $filename = isset($info['declaringStructure']['filename']) ? $info['declaringStructure']['filename'] : $info['filename'];
             $parser = new FileParser($filename);
             $completedClassName = $parser->getFullClassName($soleClassName, $useStatementFound);
             return $completedClassName;
         }
         return $soleClassName;
     }
     return $returnValue;
 }
 /**
  * Execute the command.
  *
  * @param  array $args Arguments gived to the command.
  *
  * @return array Response
  */
 public function execute($args = array())
 {
     $class = $args[0];
     $name = $args[1];
     if (strpos($class, '\\') === 0) {
         $class = substr($class, 1);
     }
     $isMethod = false;
     if (strpos($name, '()') !== false) {
         $isMethod = true;
         $name = str_replace('()', '', $name);
     }
     $relevantClass = null;
     $data = $this->getClassMetadata($class);
     if (isset($data['values'][$name])) {
         $memberInfo = $data['values'][$name];
         if (!isset($data['values'][$name]['isMethod'])) {
             foreach ($data['values'][$name] as $value) {
                 if ($value['isMethod'] && $isMethod) {
                     $memberInfo = $value;
                 } elseif (!$value['isMethod'] && !$isMethod) {
                     $memberInfo = $value;
                 }
             }
         }
         $returnValue = $memberInfo['args']['return'];
         if ($returnValue == '$this' || $returnValue == 'static') {
             $relevantClass = $class;
         } elseif ($returnValue === 'self') {
             $relevantClass = $memberInfo['declaringClass']['name'];
         } else {
             $soleClassName = $this->getSoleClassName($returnValue);
             if ($soleClassName) {
                 // At this point, this could either be a class name relative to the current namespace or a full
                 // class name without a leading slash. For example, Foo\Bar could also be relative (e.g.
                 // My\Foo\Bar), in which case its absolute path is determined by the namespace and use statements
                 // of the file containing it.
                 $relevantClass = $soleClassName;
                 if (!empty($soleClassName) && $soleClassName[0] !== "\\") {
                     $parser = new FileParser($memberInfo['declaringStructure']['filename']);
                     $useStatementFound = false;
                     $completedClassName = $parser->getFullClassName($soleClassName, $useStatementFound);
                     if ($useStatementFound) {
                         $relevantClass = $completedClassName;
                     } else {
                         $isRelativeClass = true;
                         // Try instantiating the class, e.g. My\Foo\Bar.
                         try {
                             $reflection = new \ReflectionClass($completedClassName);
                             $relevantClass = $completedClassName;
                         } catch (\Exception $e) {
                             // The class, e.g. My\Foo\Bar, didn't exist. We can only assume its an absolute path,
                             // using a namespace set up in composer.json, without a leading slash.
                         }
                     }
                 }
             }
         }
     }
     // Minor optimization to avoid fetching the same data twice.
     return $relevantClass === $class ? $data : $this->getClassMetadata($relevantClass);
 }