Author: Johannes M. Schmitt (schmittjoh@gmail.com)
Author: Thomas Gossmann
Inheritance: extends AbstractModel, implements gossi\codegen\model\GenerateableInterface, implements gossi\codegen\model\NamespaceInterface, implements gossi\codegen\model\DocblockInterface, implements gossi\codegen\model\RoutineInterface, use trait gossi\codegen\model\parts\BodyPart, use trait gossi\codegen\model\parts\DocblockPart, use trait gossi\codegen\model\parts\LongDescriptionPart, use trait gossi\codegen\model\parts\ParametersPart, use trait gossi\codegen\model\parts\QualifiedNamePart, use trait gossi\codegen\model\parts\ReferenceReturnPart, use trait gossi\codegen\model\parts\TypeDocblockGeneratorPart, use trait gossi\codegen\model\parts\TypePart
コード例 #1
0
 public function testVisitFunction()
 {
     $writer = new Writer();
     $function = new PhpFunction('foo');
     $function->addParameter(PhpParameter::create('a'))->addParameter(PhpParameter::create('b'))->setBody($writer->writeln('if ($a === $b) {')->indent()->writeln('throw new \\InvalidArgumentException(\'$a is not allowed to be the same as $b.\');')->outdent()->write("}\n\n")->write('return $b;')->getContent());
     $visitor = new DefaultVisitor();
     $visitor->visitFunction($function);
     $this->assertEquals($this->getContent('a_b_function.php'), $visitor->getContent());
 }
コード例 #2
0
 public function testReturnType()
 {
     $expected = "function foo(): int {\n}\n";
     $generator = new ModelGenerator(['generateReturnTypeHints' => true, 'generateDocblock' => false]);
     $method = PhpFunction::create('foo')->setType('int');
     $this->assertEquals($expected, $generator->generate($method));
 }
コード例 #3
0
 public function testStrictTypesDeclaration()
 {
     $expected = "<?php\ndeclare(strict_types=1);\n\nfunction fn(\$a) {\n}\n";
     $fn = PhpFunction::create('fn')->addParameter(PhpParameter::create('a'));
     $codegen = new CodeFileGenerator(['generateDocblock' => false, 'generateEmptyDocblock' => false, 'declareStrictTypes' => true]);
     $code = $codegen->generate($fn);
     $this->assertEquals($expected, $code);
 }
コード例 #4
0
 public function testSimpleDescParameter()
 {
     $function = new PhpFunction();
     $function->addSimpleDescParameter('param1', 'string');
     $this->assertFalse($function->hasParameter('param2'));
     $param1 = $function->getParameter('param1');
     $this->assertEquals('string', $param1->getType());
     $this->assertFalse($param1->hasValue());
     $function->addSimpleDescParameter('param2', 'string', 'desc');
     $this->assertTrue($function->hasParameter('param2'));
     $param2 = $function->getParameter('param2');
     $this->assertEquals('string', $param2->getType());
     $this->assertFalse($param2->hasValue());
     $function->addSimpleDescParameter('param3', 'string', 'desc', null);
     $this->assertTrue($function->hasParameter('param3'));
     $param3 = $function->getParameter('param3');
     $this->assertEquals('string', $param3->getType());
     $this->assertNull($param3->getValue());
 }
コード例 #5
0
    public function testFromReflection()
    {
        $doc = new Docblock('/**
 * Makes foo with bar
 * 
 * @param string $baz
 * @return string
 */');
        $function = new PhpFunction('wurst');
        $function->addParameter(PhpParameter::create('baz')->setDefaultValue(null)->setType('string'))->setBody('return \'wurst\';')->setDocblock($doc)->setDescription($doc->getShortDescription())->setLongDescription($doc->getLongDescription());
        $this->assertEquals($function, PhpFunction::fromReflection(new \ReflectionFunction('wurst')));
    }
コード例 #6
0
 public static function fromReflection(\ReflectionFunction $ref)
 {
     $function = PhpFunction::create($ref->name)->setReferenceReturned($ref->returnsReference())->setBody(ReflectionUtils::getFunctionBody($ref));
     $docblock = new Docblock($ref);
     $function->setDocblock($docblock);
     $function->setDescription($docblock->getShortDescription());
     $function->setLongDescription($docblock->getLongDescription());
     foreach ($ref->getParameters() as $refParam) {
         assert($refParam instanceof \ReflectionParameter);
         // hmm - assert here?
         $param = PhpParameter::fromReflection($refParam);
         $function->addParameter($param);
     }
     return $function;
 }
コード例 #7
0
    public function testObjectParam()
    {
        $expected = '/**
 * @param Request $r
 * @param mixed $a
 * @return Response this method returns a response object
 */';
        $function = PhpFunction::create(self::METHOD)->setType('Response', 'this method returns a response object')->addParameter(PhpParameter::create('r')->setType('Request'))->addParameter(PhpParameter::create('a')->setType('mixed'));
        $function->generateDocblock();
        $this->assertSame($expected, $function->getDocblock()->toString());
    }
コード例 #8
0
 public function visitFunction(PhpFunction $function)
 {
     if ($namespace = $function->getNamespace()) {
         $this->writer->write("namespace {$namespace};\n\n");
     }
     $this->visitDocblock($function->getDocblock());
     $this->writer->write("function {$function->getName()}(");
     $this->writeParameters($function->getParameters());
     $this->writer->write(')');
     $this->writeFunctionReturnType($function->getType());
     $this->writer->write(" {\n")->indent()->writeln(trim($function->getBody()))->outdent()->rtrim()->write('}');
 }