/** * 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; }
/** * 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; }
/** * 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; }
/** * 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; }
/** * 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; }
/** * 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); }
/** * 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; }
/** * 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'); }