/** * Parses method nodes * * @param ClassBuilder $classBuilder ClassBuilder object * @param NodeStream $stream NodeStream object */ protected function parseMethod(ClassBuilder $classBuilder, NodeStream $stream) { $builder = new MethodBuilder(); $comments = array(); $methodNodes = array(TokenParser::NODE_PUBLIC_METHOD => 'public', TokenParser::NODE_PROTECTED_METHOD => 'protected', TokenParser::NODE_PRIVATE_METHOD => 'private'); $node = $stream->expect(array_keys($methodNodes)); $builder->setName($node->getValue()); $builder->setVisibility($methodNodes[$node->getType()]); while ($stream->is(TokenParser::NODE_ARGUMENT)) { $argument = array(); $argument[] = $stream->current()->getValue(); $stream->next(); if ($stream->is(TokenParser::NODE_ARGUMENT_TYPE)) { $argument[] = $stream->current()->getValue(); $stream->next(); } else { $argument[] = 'mixed'; } $builder->addArgument($argument); } if ($stream->is(TokenParser::NODE_RETURN_TYPE)) { $builder->setType($stream->current()->getValue()); $stream->next(); } while ($stream->is(TokenParser::NODE_METHOD_COMMENT)) { $comments[] = $stream->current()->getValue(); $stream->next(); } if (count($comments) > 0) { $builder->setComments($comments); } $classBuilder->addMethod($builder); }
/** * Compiles method definition * * @param ClassBuilder $builder * @param StreamWriter $writer */ protected function compileMethodDefinitions(ClassBuilder $builder, StreamWriter $writer) { foreach ($builder->getMethods() as $method) { /* @var MethodBuilder $method */ $writer->indent()->writeLine('/**'); $comments = $method->getComments(); if (count($comments)) { foreach ($comments as $comment) { $comment = trim(ltrim($comment, '>')); $writer->indent()->write(' * ')->writeLine($comment); } $writer->indent()->write(' * ')->writeLine(); } $arguments = $method->getArguments(); $argumentTypeMaxLen = 0; if (count($arguments)) { foreach ($arguments as $argument) { $argumentTypeMaxLen = max($argumentTypeMaxLen, strlen($argument[1])); } } foreach ($arguments as $argument) { $writer->indent()->write(' * @param ' . sprintf('%-' . $argumentTypeMaxLen . 's', $argument[1]))->writeLine(' $' . $argument[0]); } if ($method->getType()) { $writer->indent()->writeLine(' *'); $writer->indent()->writeLine(' * @return ' . $method->getType()); } $writer->indent()->writeLine(' */'); $writer->indent()->write($method->getVisibility())->write(' function ')->write($method->getName())->write('('); $args = array(); foreach ($arguments as $argument) { $type = $this->getType($argument[1]); $item = ''; if ($type['hint']) { $item .= $type['name'] . ' '; } $item .= '$' . $argument[0]; $args[] = $item; } if (count($args)) { $writer->write(implode(', ', $args)); } $writer->writeLine(')')->indent()->writeLine('{')->indent()->indent()->writeLine()->indent()->writeLine('}')->writeLine(); } }