MontealegreLuis / phuml

phUML is a UML diagram generator. It takes arbitrary object oriented PHP code and creates fully blown class diagrams of it.
BSD 3-Clause "New" or "Revised" License
100 stars 19 forks source link

Is phuml working with Nullable Types? #1

Closed baloo42 closed 3 years ago

baloo42 commented 6 years ago

I get some errors with this code:

 /**
  * @var \DateTime|null
  */
 protected $lastUpdate;
phuml phuml:statistics -r ./app/ test.txt
[|] Running... (This may take some time)
[|] Parsing codebase structure
PHP Fatal error:  Uncaught TypeError: Argument 1 passed to PhUml\Code\Variables\TypeDeclaration::from() must be of the type string or null, object given, called in /phuml/vendor/phuml/phuml/src/Parser/Code/Builders/Members/MethodsBuilder.php on line 68 and defined in /phuml/vendor/phuml/phuml/src/Code/Variables/TypeDeclaration.php:35
Stack trace:
#0 /phuml/vendor/phuml/phuml/src/Parser/Code/Builders/Members/MethodsBuilder.php(68): PhUml\Code\Variables\TypeDeclaration::from(Object(PhpParser\Node\NullableType))
#1 [internal function]: PhUml\Parser\Code\Builders\Members\MethodsBuilder->PhUml\Parser\Code\Builders\Members\{closure}(Object(PhpParser\Node\Param))
#2 /phuml/vendor/phuml/phuml/src/Parser/Code/Builders/Members/MethodsBuilder.php(73): array_map(Object(Closure), Array)
#3 /home/ubuntu/git/project in /phuml/vendor/phuml/phuml/src/Code/Variables/TypeDeclaration.php on line 35

PHP Version: 7.2.4

MontealegreLuis commented 6 years ago

Hi @balux phuml does not support nullable types yet. I'm working on the last feature I have planned for 1.x Show namespace information

Diagram preview

Then I'll start working on v2 which will include nullable types.

baloo42 commented 6 years ago

Really like this project. We want to use it to get more insights on bigger projects. Grouping the classes with their namespaces sounds good for that use case too.

Do you have more plans on v2? Is it worth to work on Nullable Types on the actual code?

MontealegreLuis commented 6 years ago

I think it's safe to work on nullable types. I started coding that new feature and I think I'll be able to isolate the changes to the PhUml\Graphviz package and the resources\templates directory.

You'd be working on the PhUml\Parser\Code\Builders\Member package and the class Variable to show the ? for nullable types in the diagram.

I've pushed my current progress to 1.8. If you want to start working on nullable types you could base off your branch from 1.8. I'll create 2.0 once you finish.

The main changes for 2.0.0 are support for PHP 7 and changes to the options names/values for the commands.

dingo-d commented 5 years ago

The same thing happened to me when trying to run

phuml phuml:diagram -r -a -o -p neato . test.png
Error thrown: ```sh [|] Running... (This may take some time) [|] Parsing codebase structure PHP Fatal error: Uncaught TypeError: Argument 1 passed to PhUml\Code\Variables\TypeDeclaration::from() must be of the type string or null, object given, called in phar:///usr/local/bin/phuml/src/Parser/Code/Builders/Members/MethodsBuilder.php on line 68 and defined in phar:///usr/local/bin/phuml/src/Code/Variables/TypeDeclaration.php:35 Stack trace: #0 phar:///usr/local/bin/phuml/src/Parser/Code/Builders/Members/MethodsBuilder.php(68): PhUml\Code\Variables\TypeDeclaration::from(Object(PhpParser\Node\NullableType)) #1 [internal function]: PhUml\Parser\Code\Builders\Members\MethodsBuilder->PhUml\Parser\Code\Builders\Members\{closure}(Object(PhpParser\Node\Param)) #2 phar:///usr/local/bin/phuml/src/Parser/Code/Builders/Members/MethodsBuilder.php(73): array_map(Object(Closure), Array) #3 phar:///usr/local/bin/phuml/src/Parser/Code/Builders/Members/MethodsBuilder.php(47): PhUml\Parser\Code\Builders\Members\MethodsBuilder->buildParameters(Array, '/**\n * Error ...') #4 phar:///usr/local/bin/phuml/src/Parser/Code/Builders/Members/ in phar:///usr/local/bin/phuml/src/Code/Variables/TypeDeclaration.php on line 35 Fatal error: Uncaught TypeError: Argument 1 passed to PhUml\Code\Variables\TypeDeclaration::from() must be of the type string or null, object given, called in phar:///usr/local/bin/phuml/src/Parser/Code/Builders/Members/MethodsBuilder.php on line 68 and defined in phar:///usr/local/bin/phuml/src/Code/Variables/TypeDeclaration.php on line 35 TypeError: Argument 1 passed to PhUml\Code\Variables\TypeDeclaration::from() must be of the type string or null, object given, called in phar:///usr/local/bin/phuml/src/Parser/Code/Builders/Members/MethodsBuilder.php on line 68 in phar:///usr/local/bin/phuml/src/Code/Variables/TypeDeclaration.php on line 35 Call Stack: 0.0003 392472 1. {main}() /usr/local/bin/phuml:0 0.0034 805984 2. require('phar:///usr/local/bin/phuml/bin/phuml') /usr/local/bin/phuml:11 0.0185 2287152 3. PhUml\Console\PhUmlApplication->run() phar:///usr/local/bin/phuml/bin/phuml:40 0.0244 2291472 4. PhUml\Console\PhUmlApplication->doRun() phar:///usr/local/bin/phuml/vendor/symfony/console/Application.php:143 0.0245 2291472 5. PhUml\Console\PhUmlApplication->doRunCommand() phar:///usr/local/bin/phuml/vendor/symfony/console/Application.php:241 0.0246 2291472 6. PhUml\Console\Commands\GenerateClassDiagramCommand->run() phar:///usr/local/bin/phuml/vendor/symfony/console/Application.php:865 0.0253 2296624 7. PhUml\Console\Commands\GenerateClassDiagramCommand->execute() phar:///usr/local/bin/phuml/vendor/symfony/console/Command/Command.php:252 2.1348 29591920 8. PhUml\Generators\ClassDiagramGenerator->generate() phar:///usr/local/bin/phuml/src/Console/Commands/GenerateClassDiagramCommand.php:87 2.1351 29591976 9. PhUml\Generators\ClassDiagramGenerator->parseCode() phar:///usr/local/bin/phuml/src/Generators/ClassDiagramGenerator.php:48 2.1352 29591976 10. PhUml\Parser\CodeParser->parse() phar:///usr/local/bin/phuml/src/Generators/Generator.php:55 2.1352 29591976 11. PhUml\Parser\Code\Php5Parser->parse() phar:///usr/local/bin/phuml/src/Parser/CodeParser.php:47 2.4021 31383320 12. PhUml\Parser\Code\Php5Traverser->traverse() phar:///usr/local/bin/phuml/src/Parser/Code/PhpParser.php:31 2.4021 31383320 13. PhpParser\NodeTraverser->traverse() phar:///usr/local/bin/phuml/src/Parser/Code/PhpTraverser.php:38 2.4021 31383320 14. PhpParser\NodeTraverser->traverseArray() phar:///usr/local/bin/phuml/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:85 2.4022 31383912 15. PhpParser\NodeTraverser->traverseNode() phar:///usr/local/bin/phuml/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:171 2.4022 31384008 16. PhpParser\NodeTraverser->traverseArray() phar:///usr/local/bin/phuml/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:101 2.4097 31419768 17. PhUml\Parser\Code\Visitors\TraitVisitor->leaveNode() phar:///usr/local/bin/phuml/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:178 2.4097 31419768 18. PhUml\Parser\Code\Builders\TraitDefinitionBuilder->build() phar:///usr/local/bin/phuml/src/Parser/Code/Visitors/TraitVisitor.php:36 2.4099 31423376 19. PhUml\Parser\Code\Builders\MembersBuilder->methods() phar:///usr/local/bin/phuml/src/Parser/Code/Builders/TraitDefinitionBuilder.php:37 2.4099 31423376 20. PhUml\Parser\Code\Builders\Members\MethodsBuilder->build() phar:///usr/local/bin/phuml/src/Parser/Code/Builders/MembersBuilder.php:66 2.4099 31424048 21. array_map() phar:///usr/local/bin/phuml/src/Parser/Code/Builders/Members/MethodsBuilder.php:38 2.4099 31424104 22. PhUml\Parser\Code\Builders\Members\MethodsBuilder->PhUml\Parser\Code\Builders\Members\{closure}() phar:///usr/local/bin/phuml/src/Parser/Code/Builders/Members/MethodsBuilder.php:38 2.4099 31424104 23. PhUml\Parser\Code\Builders\Members\MethodsBuilder->buildMethod() phar:///usr/local/bin/phuml/src/Parser/Code/Builders/Members/MethodsBuilder.php:37 2.4100 31424136 24. PhUml\Parser\Code\Builders\Members\MethodsBuilder->buildParameters() phar:///usr/local/bin/phuml/src/Parser/Code/Builders/Members/MethodsBuilder.php:47 2.4100 31424832 25. array_map() phar:///usr/local/bin/phuml/src/Parser/Code/Builders/Members/MethodsBuilder.php:73 2.4100 31425384 26. PhUml\Parser\Code\Builders\Members\MethodsBuilder->PhUml\Parser\Code\Builders\Members\{closure}() phar:///usr/local/bin/phuml/src/Parser/Code/Builders/Members/MethodsBuilder.php:73 2.4100 31425376 27. PhUml\Code\Variables\TypeDeclaration::from() phar:///usr/local/bin/phuml/src/Parser/Code/Builders/Members/MethodsBuilder.php:68 ```

Any news when this could be fixed? I have nullable type in my docblocks but I removed them and the same thing happened. I'm also using type hinting, interfaces and namespacing in my project. Not sure if this all is supported. If there is any branch that is working on this I'll like to test it 🙂
TBoileau commented 5 years ago

@dingo-d You can edit buildParameters this in src/Parser/Code/Builders/Members/MethodsBuilder.php :

    private function buildParameters(array $parameters, ?string $docBlock): array
    {
        return array_map(function (Param $parameter) use ($docBlock) {
            $name = "\${$parameter->name}";
            $type = $parameter->type;
            if ($type !== null) {
        if($type instanceof \PhpParser\Node\NullableType) {
            $type = $type->type;
        }
                $typeDeclaration = TypeDeclaration::from($type);
            } else {
                $typeDeclaration = MethodDocBlock::from($docBlock)->typeOfParameter($name);
            }
            return Variable::declaredWith($name, $typeDeclaration);
        }, $parameters);
    }
dingo-d commented 5 years ago

This works, thanks!

MontealegreLuis commented 3 years ago

This should work now

docker pull montealegreluis/phuml:2.0.0
# or
composer require phuml/phuml:2.0.0

Please let me know if you run into issues