Пример #1
0
 /**
  * Parses the given token reader
  *
  * @param \vc\Data\Signature $signature The signature to use as a source
  * @param \vc\Tokens\Access $access The token access
  * @return \vc\Data\Property
  */
 public function parseProperty(\vc\Data\Signature $signature, \vc\Tokens\Access $access)
 {
     $prop = $signature->buildProperty();
     // Keep looking for modifier tokens until we reach the variable.
     // This isn't as strict as it could be about token order, but it greatly
     // simplifies the method to do it like this.
     do {
         $token = $access->findRequired(array(Token::T_STATIC, Token::T_VAR, Token::T_VARIABLE, Token::T_PUBLIC, Token::T_PROTECTED, Token::T_PRIVATE));
         if ($token->is(array(Token::T_PUBLIC, Token::T_PROTECTED, Token::T_PRIVATE))) {
             $prop->setVisibility(\vc\Data\Visibility::fromToken($token));
         } else {
             if ($token->is(Token::T_STATIC)) {
                 $prop->setStatic(TRUE);
             }
         }
     } while (!$token->is(Token::T_VARIABLE));
     $prop->setName($token->getContent());
     $token = $access->findRequired(array(Token::T_SEMICOLON, Token::T_EQUALS));
     // Look for any default value
     if ($token->is(Token::T_EQUALS)) {
         $prop->setValue($this->value->parseValue($access));
         $access->findRequired(array(Token::T_SEMICOLON));
     }
     return $prop;
 }
Пример #2
0
 /**
  * Parse a class from token reader
  *
  * @param \vc\Tokens\Access $access The token access
  * @return \vc\Data\Routine\Func
  */
 public function parseClass(\vc\Tokens\Access $access)
 {
     $token = $access->findRequired(array(Token::T_CLASS, Token::T_ABSTRACT));
     $class = new \vc\Data\Type\Cls($token->getLine(), $access->getComment());
     // Extract the abstract flag from the class definition
     if ($token->is(Token::T_ABSTRACT)) {
         $class->setAbstract(TRUE);
         $access->findRequired(array(Token::T_CLASS));
     }
     // Searches for the name of the class
     $token = $access->findRequired(array(Token::T_STRING));
     // Set the name of the class
     $class->setName($token->getContent());
     // Look for parent classes and interfaces
     $token = $access->findRequired(array(Token::T_EXTENDS, Token::T_IMPLEMENTS, Token::T_CURLY_OPEN));
     // Add the parent class
     if ($token->is(Token::T_EXTENDS)) {
         $class->setExtends($this->path->parsePath($access));
         // Look for any interfaces
         $token = $access->findRequired(array(Token::T_IMPLEMENTS, Token::T_CURLY_OPEN));
     }
     // Add any interface implementations
     if ($token->is(Token::T_IMPLEMENTS)) {
         $class->setIFaces($this->pathList->parsePathList($access));
         $access->findRequired(array(Token::T_CURLY_OPEN));
     }
     // Finally, parse out the content of the class
     $this->members->parseMembers($class, $access);
     return $class;
 }
Пример #3
0
 /**
  * Parses the given token reader
  *
  * @param \vc\Tokens\Access $access The token access
  * @return \vc\Data\Constant Returns the created constant
  */
 public function parseConstant(\vc\Tokens\Access $access)
 {
     $access->findRequired(array(Token::T_CONST));
     $name = $access->findRequired(array(Token::T_STRING));
     $const = new \vc\Data\Constant($name->getContent());
     $access->findRequired(array(Token::T_EQUALS));
     $const->setValue($this->value->parseValue($access));
     $access->findRequired(array(Token::T_SEMICOLON));
     return $const;
 }
Пример #4
0
 /**
  * Parse an interface from token reader
  *
  * @param \vc\Tokens\Access $access The token access
  * @return \vc\Data\Routine\Func
  */
 public function parseIFace(\vc\Tokens\Access $access)
 {
     $token = $access->findRequired(array(Token::T_INTERFACE));
     $iface = new \vc\Data\Type\IFace($token->getLine(), $access->getComment());
     // Searches for the name of the interface
     $token = $access->findRequired(array(Token::T_STRING));
     $iface->setName($token->getContent());
     // Look for any interfaces that this one extends
     $token = $access->findRequired(array(Token::T_EXTENDS, Token::T_CURLY_OPEN));
     if ($token->is(Token::T_EXTENDS)) {
         $iface->setExtends($this->pathList->parsePathList($access));
         $access->findRequired(array(Token::T_CURLY_OPEN));
     }
     // Finally, parse out the content of the class
     $this->members->parseMembers($iface, $access);
     return $iface;
 }
Пример #5
0
 /**
  * Parses the given token reader
  *
  * @param \vc\Tokens\Access $access The token access
  * @return \vc\Data\Alias Returns the created alias
  */
 public function parseAlias(\vc\Tokens\Access $access)
 {
     $access->findRequired(array(Token::T_USE));
     $alias = new \vc\Data\Alias($this->path->parsePath($access));
     $as = $access->find(array(Token::T_AS));
     if ($as) {
         $alias->setAlias($this->path->parsePath($access));
     }
     $access->findRequired(array(Token::T_SEMICOLON));
     return $alias;
 }
Пример #6
0
 /**
  * Parse a function out of the given token reader
  *
  * @param \vc\Data\Routine $routine The object to fill with data
  * @param \vc\Tokens\Access $access The token access
  * @return NULL
  */
 public function parseRoutine(\vc\Data\Routine $routine, \vc\Tokens\Access $access)
 {
     $access->findRequired(array(Token::T_FUNCTION));
     $token = $access->peekToRequired(array(Token::T_STRING, Token::T_AMPERSAND, Token::T_PARENS_OPEN));
     // Handle routines that return a reference
     if ($token->is(Token::T_AMPERSAND)) {
         $routine->setReturnRef(TRUE);
         $access->popToken();
         $token = $access->peekToRequired(array(Token::T_STRING, Token::T_PARENS_OPEN));
     }
     // Names are optional because of anonymous methods
     if ($token->is(Token::T_STRING)) {
         $access->popToken();
         $routine->setName($token->getContent());
     }
     $routine->setArgs($this->args->parseArgs($access));
     $access->findRequired(array(Token::T_CURLY_OPEN, Token::T_SEMICOLON));
     $this->brackets->parseCurlies($access);
 }
Пример #7
0
 /**
  * Parses a list of method arguments
  *
  * @param \vc\Tokens\Access $access
  * @return Array
  */
 public function parseArgs(\vc\Tokens\Access $access)
 {
     $access->findRequired(array(Token::T_PARENS_OPEN));
     $args = array();
     // Continue parsing until we hit a close parenthesis
     while (TRUE) {
         $type = $access->peekToRequired(array(Token::T_ARRAY, Token::T_STRING, Token::T_NS_SEPARATOR, Token::T_AMPERSAND, Token::T_VARIABLE, Token::T_PARENS_CLOSE));
         if ($type->is(Token::T_PARENS_CLOSE)) {
             break;
         }
         $args[] = $this->parseArg($access);
     }
     $access->popToken();
     return $args;
 }
Пример #8
0
 /**
  * Parses an array
  *
  * @param \vc\Tokens\Access $access
  * @return \vc\Data\Value
  */
 private function parseArray(\vc\Tokens\Access $access)
 {
     $token = $access->findRequired(array(Token::T_PARENS_OPEN));
     return new \vc\Data\Value(sprintf('array(%s)', $this->brackets->parseParens($access)), 'array');
 }