bkryza / clang-uml Goto Github PK
View Code? Open in Web Editor NEWCustomizable automatic UML diagram generator for C++ based on Clang.
License: Apache License 2.0
Customizable automatic UML diagram generator for C++ based on Clang.
License: Apache License 2.0
Currently the translation_unit_visitor
for sequence diagram generates nested alt block for each if/else
statement in if
block. Optimally there should only be a single alt
block with a separate lane for each condition.
Example of this can be seen in the main_sequence
diagram in clang-uml
's diagrams...
--compile-database
is ignored when --config
is also provided.
First reported in #68
Currently the order in which the elements are generated in the PlantUML file is unspecified, depending typically on the order in which they are visited.
This leads to suboptimal diagram layouts, for instance where the nodes with no outgoing relationships are at the bottom of the diagram.
The sorting could be added as a strategy to the diagram model, and configurable in the config file.
Currently methods and fields in classes are rendered in diagrams in no particular order.
Preferably they should be ordered based on their access, sorted by name and also:
Public, protected and private methods should be separated using dotted separators:
@startuml
class Foo1 {
Foo()
Foo(Foo&&)
..
operator=()
operator+=()
..
do_sth()
}
@enduml
Add diagram configuration option to generate only inheritance relationships starting from a root (most abstract) class.
Built the version from master as of today. When run on rlottie's repository with this .clang-uml
I get a segmentation fault and no puml file is generated.
compilation_database_dir: .
output_directory: puml
diagrams:
rlottie_class:
type: class
glob:
- ../rlottie/inc/*.h
- ../rlottie/src/lottie/*.h
- ../rlottie/src/vector/*.cpp
- ../rlottie/src/vector/*.h
using_namespace:
- rlottie
include:
namespaces:
- rlottie
- rlottie::internal
# exclude:
# namespaces:
# - std
plantuml:
before:
- 'title clang-uml class diagram model'
The cmake build line is: mkdir build && cd build && cmake ../rlottie/ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
for example, I don't declare a namespace in my code:
// main.cpp
class A {
};
class B : public A {
};
main() {
;
}
🙄 c++ compile very bad.
make clanguml_diagrams
Error while processing /Users/suxb201/gits/clang-uml/src/package_diagram/model/diagram.cc.
In file included from /Users/suxb201/gits/clang-uml/src/package_diagram/visitor/translation_unit_visitor.cc:19:
In file included from /Users/suxb201/gits/clang-uml/src/package_diagram/visitor/translation_unit_visitor.h:20:
In file included from /Users/suxb201/gits/clang-uml/src/common/visitor/translation_unit_visitor.h:20:
In file included from /Users/suxb201/gits/clang-uml/src/common/visitor/comment/comment_visitor.h:20:
In file included from /usr/local/opt/llvm@14/include/clang/AST/Comment.h:16:
In file included from /usr/local/opt/llvm@14/include/clang/AST/CommentCommandTraits.h:18:
In file included from /usr/local/opt/llvm@14/include/clang/Basic/CommentOptions.h:17:
In file included from /usr/local/opt/llvm@14/bin/../include/c++/v1/string:522:
In file included from /usr/local/opt/llvm@14/bin/../include/c++/v1/__debug:14:
In file included from /usr/local/opt/llvm@14/bin/../include/c++/v1/iosfwd:98:
In file included from /usr/local/opt/llvm@14/bin/../include/c++/v1/__mbstate_t.h:29:
In file included from /usr/local/opt/llvm@14/bin/../include/c++/v1/wchar.h:123:
/Library/Developer/CommandLineTools/SDKs/MacOSX13.sdk/usr/include/wchar.h:89:10: fatal error: 'stdarg.h' file not found
#include <stdarg.h>
^~~~~~~~~~
1 error generated.
Error while processing /Users/suxb201/gits/clang-uml/src/package_diagram/visitor/translation_unit_visitor.cc.
clang --version
Homebrew clang version 14.0.6
Target: x86_64-apple-darwin22.1.0
Thread model: posix
InstalledDir: /usr/local/opt/llvm@14/bin
Add at least basic support for generation of Mermaid (https://mermaid-js.github.io) diagrams in addition to PlantUML...
Implement additional diagram type for generating include dependency graph diagram, based on include directives in the selected source files...
Add diagram filter for selecting template specializations or instantiations (similar to subclasses
filter works) ...
Currently configuration files are not validated for correcteness, for instance a typo such as:
exclude:
namespace:
- std
instead of:
exclude:
namespaces:
- std
will not produce any error but simply not apply the exclusion filter...
Hello,
I'm having a large embedded project build upon mbed (https://os.mbed.com/).
I wish I could use clang-uml to reverse some (if not all) parts of it to better understand it.
The project uses the dedicated mbed build system and gcc as its compiler. With the help of bear
I've successfully made a compile_commands.json
which seems fine (the clangd
extension for vscode
use it successfully, as well as codechecker
(https://github.com/Ericsson/codechecker) that uses clang static-analyzer and Clang Tidy)).
When I try to run clang-uml
over my project it exits very early with this error (many times)
.././mbed-os/targets/TARGET_STM/TARGET_STM32L4/STM32Cube_FW/STM32L4xx_HAL_Driver/stm32l4xx_ll_adc.h:6386:31: error: cast from pointer to smaller type 'uint32_t' (aka 'unsigned int') loses information
const __IO uint32_t *preg = __ADC_PTR_REG_OFFSET(ADCx->JDR1, ((Rank & ADC_INJ_JDRX_REGOFFSET_MASK) >> ADC_JDRX_REGOFFSET_POS));
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.././mbed-os/targets/TARGET_STM/TARGET_STM32L4/STM32Cube_FW/STM32L4xx_HAL_Driver/stm32l4xx_ll_adc.h:378:34: note: expanded from macro '__ADC_PTR_REG_OFFSET'
((__IO uint32_t *)((uint32_t) ((uint32_t)(&(__REG__)) + ((__REG_OFFFSET__) << 2UL))))
^~~~~~~~~~~~~~~~~~~~~~
fatal error: too many errors emitted, stopping now [-ferror-limit=]
Erreur de segmentation (core dumped)
As the code is cross-compiled this should not be an issue.
As other clang based tools do not report this problem, I suppose that at some point clang-uml
lost an information that make it fail.
Would you please help me? (either fix or disable the check would be ok)
Currently template methods type parameters are not denoted in any way that they are template parameters, this should be somehow noted, at least by prefixing template methods with e.g. template <Func,Args...> call(Func &&,Args... &&)
When I go and compile the program, I get the following error:
uml/src/class_diagram/visitor/translation_unit_context.cc:21:
/home/yeusepe/Documents/AutoC++/clang-uml/src/cx/util.h:22:10: fatal error: clang-c/CXCompilationDatabase.h: No such file or directory
22 | #include <clang-c/CXCompilationDatabase.h>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[3]: *** [CMakeFiles/clang-umllib.dir/build.make:238: CMakeFiles/clang-umllib.dir/src/class_diagram/visitor/translation_unit_context.cc.o] Error 1
make[3]: *** Waiting for unfinished jobs....
In file included from /home/yeusepe/Documents/AutoC++/clang-uml/src/cx/util.cc:19:
/home/yeusepe/Documents/AutoC++/clang-uml/src/cx/util.h:22:10: fatal error: clang-c/CXCompilationDatabase.h: No such file or directory
22 | #include <clang-c/CXCompilationDatabase.h>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[3]: *** [CMakeFiles/clang-umllib.dir/build.make:446: CMakeFiles/clang-umllib.dir/src/cx/util.cc.o] Error 1
In file included from /home/yeusepe/Documents/AutoC++/clang-uml/src/common/model/diagram_filter.h:26,
from /home/yeusepe/Documents/AutoC++/clang-uml/src/common/model/diagram_filter.cc:19:
/home/yeusepe/Documents/AutoC++/clang-uml/src/cx/util.h:22:10: fatal error: clang-c/CXCompilationDatabase.h: No such file or directory
22 | #include <clang-c/CXCompilationDatabase.h>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[3]: *** [CMakeFiles/clang-umllib.dir/build.make:316: CMakeFiles/clang-umllib.dir/src/common/model/diagram_filter.cc.o] Error 1
In file included from /home/yeusepe/Documents/AutoC++/clang-uml/src/class_diagram/visitor/translation_unit_visitor.cc:19:
/home/yeusepe/Documents/AutoC++/clang-uml/src/class_diagram/visitor/translation_unit_visitor.h:24:10: fatal error: clang-c/CXCompilationDatabase.h: No such file or directory
24 | #include <clang-c/CXCompilationDatabase.h>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /home/yeusepe/Documents/AutoC++/clang-uml/src/common/model/diagram_filter.h:26,
from /home/yeusepe/Documents/AutoC++/clang-uml/src/common/generators/plantuml/generator.h:20,
from /home/yeusepe/Documents/AutoC++/clang-uml/src/include_diagram/generators/plantuml/include_diagram_generator.h:20,
from /home/yeusepe/Documents/AutoC++/clang-uml/src/include_diagram/generators/plantuml/include_diagram_generator.cc:19:
/home/yeusepe/Documents/AutoC++/clang-uml/src/cx/util.h:22:10: fatal error: clang-c/CXCompilationDatabase.h: No such file or directory
22 | #include <clang-c/CXCompilationDatabase.h>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
compilation terminated.
make[3]: *** [CMakeFiles/clang-umllib.dir/build.make:251: CMakeFiles/clang-umllib.dir/src/class_diagram/visitor/translation_unit_visitor.cc.o] Error 1
make[3]: *** [CMakeFiles/clang-umllib.dir/build.make:472: CMakeFiles/clang-umllib.dir/src/include_diagram/generators/plantuml/include_diagram_generator.cc.o] Error 1
In file included from /home/yeusepe/Documents/AutoC++/clang-uml/src/common/model/diagram_filter.h:26,
from /home/yeusepe/Documents/AutoC++/clang-uml/src/common/generators/plantuml/generator.h:20,
from /home/yeusepe/Documents/AutoC++/clang-uml/src/common/generators/plantuml/generator.cc:18:
/home/yeusepe/Documents/AutoC++/clang-uml/src/cx/util.h:22:10: fatal error: clang-c/CXCompilationDatabase.h: No such file or directory
22 | #include <clang-c/CXCompilationDatabase.h>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[3]: *** [CMakeFiles/clang-umllib.dir/build.make:264: CMakeFiles/clang-umllib.dir/src/common/generators/plantuml/generator.cc.o] Error 1
In file included from /home/yeusepe/Documents/AutoC++/clang-uml/src/class_diagram/generators/plantuml/class_diagram_generator.h:23,
from /home/yeusepe/Documents/AutoC++/clang-uml/src/class_diagram/generators/plantuml/class_diagram_generator.cc:19:
/home/yeusepe/Documents/AutoC++/clang-uml/src/class_diagram/visitor/translation_unit_visitor.h:24:10: fatal error: clang-c/CXCompilationDatabase.h: No such file or directory
24 | #include <clang-c/CXCompilationDatabase.h>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[3]: *** [CMakeFiles/clang-umllib.dir/build.make:82: CMakeFiles/clang-umllib.dir/src/class_diagram/generators/plantuml/class_diagram_generator.cc.o] Error 1
In file included from /home/yeusepe/Documents/AutoC++/clang-uml/src/common/model/diagram_filter.h:26,
from /home/yeusepe/Documents/AutoC++/clang-uml/src/common/generators/plantuml/generator.h:20,
from /home/yeusepe/Documents/AutoC++/clang-uml/src/package_diagram/generators/plantuml/package_diagram_generator.h:20,
from /home/yeusepe/Documents/AutoC++/clang-uml/src/package_diagram/generators/plantuml/package_diagram_generator.cc:19:
/home/yeusepe/Documents/AutoC++/clang-uml/src/cx/util.h:22:10: fatal error: clang-c/CXCompilationDatabase.h: No such file or directory
22 | #include <clang-c/CXCompilationDatabase.h>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[3]: *** [CMakeFiles/clang-umllib.dir/build.make:537: CMakeFiles/clang-umllib.dir/src/package_diagram/generators/plantuml/package_diagram_generator.cc.o] Error 1
In file included from /home/yeusepe/Documents/AutoC++/clang-uml/src/common/model/diagram_filter.h:26,
from /home/yeusepe/Documents/AutoC++/clang-uml/src/common/model/diagram.cc:21:
/home/yeusepe/Documents/AutoC++/clang-uml/src/cx/util.h:22:10: fatal error: clang-c/CXCompilationDatabase.h: No such file or directory
22 | #include <clang-c/CXCompilationDatabase.h>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[3]: *** [CMakeFiles/clang-umllib.dir/build.make:290: CMakeFiles/clang-umllib.dir/src/common/model/diagram.cc.o] Error 1
In file included from /home/yeusepe/Documents/AutoC++/clang-uml/src/include_diagram/visitor/translation_unit_context.cc:21:
/home/yeusepe/Documents/AutoC++/clang-uml/src/cx/util.h:22:10: fatal error: clang-c/CXCompilationDatabase.h: No such file or directory
22 | #include <clang-c/CXCompilationDatabase.h>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
/home/yeusepe/Documents/AutoC++/clang-uml/src/sequence_diagram/visitor/translation_unit_context.cc:21:10: fatal error: clang-c/CXCompilationDatabase.h: No such file or directory
21 | #include <clang-c/CXCompilationDatabase.h>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[3]: *** [CMakeFiles/clang-umllib.dir/build.make:511: CMakeFiles/clang-umllib.dir/src/include_diagram/visitor/translation_unit_context.cc.o] Error 1
make[3]: *** [CMakeFiles/clang-umllib.dir/build.make:654: CMakeFiles/clang-umllib.dir/src/sequence_diagram/visitor/translation_unit_context.cc.o] Error 1
In file included from /home/yeusepe/Documents/AutoC++/clang-uml/src/common/model/diagram_filter.h:26,
from /home/yeusepe/Documents/AutoC++/clang-uml/src/common/generators/plantuml/generator.h:20,
from /home/yeusepe/Documents/AutoC++/clang-uml/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.h:20,
from /home/yeusepe/Documents/AutoC++/clang-uml/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc:19:
/home/yeusepe/Documents/AutoC++/clang-uml/src/cx/util.h:22:10: fatal error: clang-c/CXCompilationDatabase.h: No such file or directory
22 | #include <clang-c/CXCompilationDatabase.h>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[3]: *** [CMakeFiles/clang-umllib.dir/build.make:602: CMakeFiles/clang-umllib.dir/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc.o] Error 1
In file included from /home/yeusepe/Documents/AutoC++/clang-uml/src/sequence_diagram/visitor/translation_unit_visitor.cc:22:
/home/yeusepe/Documents/AutoC++/clang-uml/src/cx/util.h:22:10: fatal error: clang-c/CXCompilationDatabase.h: No such file or directory
22 | #include <clang-c/CXCompilationDatabase.h>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[3]: *** [CMakeFiles/clang-umllib.dir/build.make:667: CMakeFiles/clang-umllib.dir/src/sequence_diagram/visitor/translation_unit_visitor.cc.o] Error 1
In file included from /home/yeusepe/Documents/AutoC++/clang-uml/src/package_diagram/visitor/translation_unit_visitor.cc:19:
/home/yeusepe/Documents/AutoC++/clang-uml/src/package_diagram/visitor/translation_unit_visitor.h:24:10: fatal error: clang-c/CXCompilationDatabase.h: No such file or directory
24 | #include <clang-c/CXCompilationDatabase.h>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[3]: *** [CMakeFiles/clang-umllib.dir/build.make:589: CMakeFiles/clang-umllib.dir/src/package_diagram/visitor/translation_unit_visitor.cc.o] Error 1
In file included from /home/yeusepe/Documents/AutoC++/clang-uml/src/package_diagram/visitor/translation_unit_context.cc:21:
/home/yeusepe/Documents/AutoC++/clang-uml/src/cx/util.h:22:10: fatal error: clang-c/CXCompilationDatabase.h: No such file or directory
22 | #include <clang-c/CXCompilationDatabase.h>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[3]: *** [CMakeFiles/clang-umllib.dir/build.make:576: CMakeFiles/clang-umllib.dir/src/package_diagram/visitor/translation_unit_context.cc.o] Error 1
In file included from /home/yeusepe/Documents/AutoC++/clang-uml/src/include_diagram/visitor/translation_unit_visitor.cc:19:
/home/yeusepe/Documents/AutoC++/clang-uml/src/include_diagram/visitor/translation_unit_visitor.h:26:10: fatal error: clang-c/CXCompilationDatabase.h: No such file or directory
26 | #include <clang-c/CXCompilationDatabase.h>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[3]: *** [CMakeFiles/clang-umllib.dir/build.make:524: CMakeFiles/clang-umllib.dir/src/include_diagram/visitor/translation_unit_visitor.cc.o] Error 1
make[3]: Leaving directory '/home/yeusepe/Documents/AutoC++/clang-uml/release'
make[2]: *** [CMakeFiles/Makefile2:238: CMakeFiles/clang-umllib.dir/all] Error 2
make[2]: Leaving directory '/home/yeusepe/Documents/AutoC++/clang-uml/release'
make[1]: *** [Makefile:160: all] Error 2
make[1]: Leaving directory '/home/yeusepe/Documents/AutoC++/clang-uml/release'
make: *** [Makefile:50: release] Error 2
Currently multiline notes extracted from code comments are not rendered properly and cause PlantUML errors. Notes generated from code comments should have the form, e.g.:
note left of C_0000156632990802225029
Some
long
comment.
end note
also the A(ns1::ns2::class1)
should accept full paths, in order to ensure unambiguous element access.
PlantUML allows to attach notes to both methods and class members, which should be possible both through \uml
comment directives as well as through configuration file in the plantuml
section...
Currently return types in function or method calls in sequence diagrams are empty. There should be an option in the config to enable rendering them based on declared or deduced type of function or method.
Currently, template instantiations which are deduced by Clang are not generated in the diagrams, typically this is mostly a problem with method return values declared as auto
or lambda auto
arguments...
The build of master branch from a fresh ubuntu install blocks the machine, while building variable_parser.cpp.o
I have no other message than the one below.
cmake -S . -B release
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
-DCMAKE_BUILD_TYPE=Release
-DLLVM_CONFIG_PATH=
-- Checking for fmt...
-- Checking for spdlog...
-- Checking for yaml-cpp...
-- Checking for libclang...
-- llvm-config executable found: /usr/bin/llvm-config-12
-- Using CMAKE_CXX_FLAGS: -std=c++17 -I/usr/lib/llvm-12/include -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS
-- Installing type_safe via submodule
-- Installing debug_assert via submodule
-- Installing tiny-process-library via submodule
-- Found llvm-config at /usr/bin/llvm-config-12
-- Using LLVM version 12.0.1
-- Found libclang header files at /usr/lib/llvm-12/include
-- Found libclang library at /usr/lib/llvm-12/lib/libclang.so
-- Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR)
-- FOUND GCC STDDEF INCLUDE /usr/lib/gcc/x86_64-linux-gnu/11/include
-- Configuring done
-- Generating done
-- Build files have been written to: /home/nicolas/clang-uml/release
make -C release -j
make[1] : on entre dans le répertoire « /home/nicolas/clang-uml/release »
make[2] : on entre dans le répertoire « /home/nicolas/clang-uml/release »
make[3] : on entre dans le répertoire « /home/nicolas/clang-uml/release »
make[3] : on entre dans le répertoire « /home/nicolas/clang-uml/release »
make[3] : on quitte le répertoire « /home/nicolas/clang-uml/release »
make[3] : on quitte le répertoire « /home/nicolas/clang-uml/release »
[ 1%] Built target _cppast_tiny_process
make[3] : on entre dans le répertoire « /home/nicolas/clang-uml/release »
[ 2%] Building CXX object CMakeFiles/clang-umllib.dir/src/class_diagram/model/class.cc.o
make[3] : on entre dans le répertoire « /home/nicolas/clang-uml/release »
[ 3%] Building CXX object CMakeFiles/clang-umllib.dir/src/class_diagram/generators/plantuml/class_diagram_generator.cc.o
[ 4%] Building CXX object CMakeFiles/clang-umllib.dir/src/class_diagram/model/class_member.cc.o
[ 4%] Building CXX object CMakeFiles/clang-umllib.dir/src/class_diagram/model/class_method.cc.o
[ 4%] Building CXX object CMakeFiles/clang-umllib.dir/src/class_diagram/model/diagram.cc.o
[ 4%] Building CXX object CMakeFiles/clang-umllib.dir/src/class_diagram/model/class_element.cc.o
[ 5%] Building CXX object CMakeFiles/clang-umllib.dir/src/class_diagram/model/class_template.cc.o
make[3] : on quitte le répertoire « /home/nicolas/clang-uml/release »
[ 6%] Building CXX object CMakeFiles/clang-umllib.dir/src/class_diagram/model/enum.cc.o
[ 6%] Building CXX object CMakeFiles/clang-umllib.dir/src/class_diagram/model/method_parameter.cc.o
[ 6%] Building CXX object CMakeFiles/clang-umllib.dir/src/class_diagram/visitor/translation_unit_context.cc.o
make[3] : on entre dans le répertoire « /home/nicolas/clang-uml/release »
[ 7%] Building CXX object CMakeFiles/clang-umllib.dir/src/class_diagram/visitor/element_visitor_context.cc.o
[ 8%] Building CXX object CMakeFiles/clang-umllib.dir/src/class_diagram/visitor/translation_unit_visitor.cc.o
[ 8%] Building CXX object CMakeFiles/clang-umllib.dir/src/common/generators/plantuml/generator.cc.o
[ 8%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_alias_template.cpp.o
[ 9%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/code_generator.cpp.o
[ 10%] Building CXX object CMakeFiles/clang-umllib.dir/src/common/model/decorated_element.cc.o
[ 11%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_attribute.cpp.o
[ 11%] Building CXX object CMakeFiles/clang-umllib.dir/src/common/model/diagram_element.cc.o
[ 12%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_class_template.cpp.o
[ 13%] Building CXX object CMakeFiles/clang-umllib.dir/src/common/model/diagram.cc.o
[ 13%] Building CXX object CMakeFiles/clang-umllib.dir/src/common/model/element.cc.o
[ 14%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_entity.cpp.o
[ 15%] Building CXX object CMakeFiles/clang-umllib.dir/src/common/model/diagram_filter.cc.o
[ 15%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_class.cpp.o
[ 15%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_entity_index.cpp.o
[ 15%] Building CXX object CMakeFiles/clang-umllib.dir/src/common/model/package.cc.o
[ 15%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_enum.cpp.o
[ 16%] Building CXX object CMakeFiles/clang-umllib.dir/src/common/model/namespace.cc.o
[ 17%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_expression.cpp.o
[ 18%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_file.cpp.o
[ 19%] Building CXX object CMakeFiles/clang-umllib.dir/src/common/model/relationship.cc.o
[ 19%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_function.cpp.o
[ 19%] Building CXX object CMakeFiles/clang-umllib.dir/src/config/config.cc.o
[ 19%] Building CXX object CMakeFiles/clang-umllib.dir/src/common/model/source_file.cc.o
[ 19%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_forward_declarable.cpp.o
[ 20%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_friend.cpp.o
[ 21%] Building CXX object CMakeFiles/clang-umllib.dir/src/cx/util.cc.o
[ 21%] Building CXX object CMakeFiles/clang-umllib.dir/src/decorators/decorators.cc.o
[ 22%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_language_linkage.cpp.o
[ 23%] Building CXX object CMakeFiles/clang-umllib.dir/src/include_diagram/generators/plantuml/include_diagram_generator.cc.o
[ 24%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_function_template.cpp.o
[ 25%] Building CXX object CMakeFiles/clang-umllib.dir/src/include_diagram/model/diagram.cc.o
[ 25%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_member_function.cpp.o
[ 26%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_member_variable.cpp.o
[ 27%] Building CXX object CMakeFiles/clang-umllib.dir/src/include_diagram/visitor/element_visitor_context.cc.o
[ 27%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_namespace.cpp.o
[ 28%] Building CXX object CMakeFiles/clang-umllib.dir/src/include_diagram/visitor/translation_unit_visitor.cc.o
[ 28%] Building CXX object CMakeFiles/clang-umllib.dir/src/include_diagram/visitor/translation_unit_context.cc.o
[ 28%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_template_parameter.cpp.o
[ 29%] Building CXX object CMakeFiles/clang-umllib.dir/src/package_diagram/generators/plantuml/package_diagram_generator.cc.o
[ 30%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_static_assert.cpp.o
[ 31%] Building CXX object CMakeFiles/clang-umllib.dir/src/package_diagram/model/diagram.cc.o
[ 32%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_preprocessor.cpp.o
[ 32%] Building CXX object CMakeFiles/clang-umllib.dir/src/package_diagram/visitor/translation_unit_context.cc.o
[ 32%] Building CXX object CMakeFiles/clang-umllib.dir/src/package_diagram/visitor/element_visitor_context.cc.o
[ 32%] Building CXX object CMakeFiles/clang-umllib.dir/src/package_diagram/visitor/translation_unit_visitor.cc.o
[ 33%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_token.cpp.o
[ 34%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_type_alias.cpp.o
[ 34%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_type.cpp.o
[ 35%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_variable.cpp.o
[ 35%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/cpp_variable_template.cpp.o
[ 36%] Building CXX object CMakeFiles/clang-umllib.dir/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc.o
[ 37%] Building CXX object CMakeFiles/clang-umllib.dir/src/sequence_diagram/model/diagram.cc.o
[ 37%] Building CXX object CMakeFiles/clang-umllib.dir/src/sequence_diagram/visitor/translation_unit_context.cc.o
[ 38%] Building CXX object CMakeFiles/clang-umllib.dir/src/sequence_diagram/visitor/translation_unit_visitor.cc.o
[ 39%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/diagnostic_logger.cpp.o
[ 39%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/visitor.cpp.o
[ 40%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/libclang/cxtokenizer.cpp.o
[ 41%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/libclang/class_parser.cpp.o
[ 42%] Building CXX object CMakeFiles/clang-umllib.dir/src/util/util.cc.o
[ 42%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/libclang/debug_helper.cpp.o
[ 42%] Building CXX object CMakeFiles/clang-umllib.dir/src/util/thread_pool_executor.cc.o
[ 42%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/libclang/expression_parser.cpp.o
[ 43%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/libclang/friend_parser.cpp.o
[ 43%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/libclang/function_parser.cpp.o
[ 44%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/libclang/enum_parser.cpp.o
[ 45%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/libclang/libclang_parser.cpp.o
[ 46%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/libclang/language_linkage_parser.cpp.o
[ 47%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/libclang/parse_functions.cpp.o
[ 47%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/libclang/namespace_parser.cpp.o
[ 47%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/libclang/preprocessor.cpp.o
[ 48%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/libclang/type_parser.cpp.o
[ 49%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/libclang/template_parser.cpp.o
[ 49%] Building CXX object thirdparty/cppast/src/CMakeFiles/cppast.dir/libclang/variable_parser.cpp.o
For configuration files with large number of diagrams which rely on Jinja templates, it would be useful to add context
option to the inheritable config option set, which would enable for instance the following use case:
...
context:
author: bkryza
copyright: Copyright (C) 2023
my_condition_1: true
...
diagrams:
my_class_diagram:
type: class
...
plantuml:
after:
- >
note left of {{ alias("ClassA") }}
{{ author }} {{ copyright }}
end note
- >
{% if my_condition_1 %}
note left of {{ alias("ClassB") }}
{{ author }} {{ copyright }}
end note
{% endif %}
There should be also a command line option to override/add any context variable, e.g.:
clang-uml -n my_class_diagram --context "my_condition_1: false"
Since Clang/LLVM provides API for traversing C++20 concepts:
bool TraverseTypeConstraint(const TypeConstraint *C);
bool TraverseConceptRequirement(concepts::Requirement *R);
bool TraverseConceptTypeRequirement(concepts::TypeRequirement *R);
bool TraverseConceptExprRequirement(concepts::ExprRequirement *R);
bool TraverseConceptNestedRequirement(concepts::NestedRequirement *R);
it should be fairly straightforward to add concepts to the UML diagrams generated by clang-uml
.
The question is how to best render concepts in UML, one option would be to render special class templates with stereotype <<concept>>
and whose body contains all the required expressions, e.g.:
@startuml
class "Serializable<T>" as C_0
class C_0 <<concept>> {
(std::ostream& ostr, T x)
----
* {x.serialize()} noexcept;
* ostr << x;
}
class "Protocol<Serializable Msg...>" as C_1
class C_1 {
- m_messageSet : std::tuple<Msg...>
}
C_1 ..> C_0
@enduml
Currently template arguments (e.g. in template instantiations or specializations) which are reported by libclang as unexposed are not parsed to infer any potential relationships.
Example of this is in test case t00038 in commented out TODO...
These errors fails the build:
[ 67%] Building CXX object tests/CMakeFiles/test_cases.dir/t00007/t00007.cc.o
/mnt/c/Users/mattar/source/repos/geodatamod/clang-uml-master/tests/t00003/t00003.cc:52:9: error: private field 'a' is not used [-Werror,-Wunused-private-field]
int a, b, c;
^
/mnt/c/Users/mattar/source/repos/geodatamod/clang-uml-master/tests/t00003/t00003.cc:52:12: error: private field 'b' is not used [-Werror,-Wunused-private-field]
int a, b, c;
^
/mnt/c/Users/mattar/source/repos/geodatamod/clang-uml-master/tests/t00003/t00003.cc:52:15: error: private field 'c' is not used [-Werror,-Wunused-private-field]
int a, b, c;
^
3 errors generated.
make[3]: *** [tests/CMakeFiles/test_cases.dir/build.make:104: tests/CMakeFiles/test_cases.dir/t00003/t00003.cc.o] Error 1
This is a really useful tool and we would like to use it on some of our codebases, but many of them are based on C++20. Are there plans to support this in the future?
test.h:
namespace test1 {
template <typename T>
class TestBase {
public:
TestBase() = delete;
~TestBase() = default;
TestBase(int a_, float b_, T c_) : a(a_), b(b_), c(c_) {};
int a;
float b;
T c;
};
}
test.cc:
#include <test.h>
namespace test1 {
template class TestBase<double *>;
class TestDerive : public TestBase<double *> {
public:
TestDerive(int a_, float b_, double *c_);
};
TestDerive::TestDerive(int a_, float b_, double *c_) : TestBase<double *>(a_, b_, c_) {
a += 1;
b -= 1;
}
}
result test.puml:
@startuml
class "test1::TestBase<double*>" as C_0000000002
class C_0000000002 {
}
class "test1::TestDerive" as C_0000000011
class C_0000000011 {
{static} +TestDerive(int a_, float b_, double* c_) : void
}
class "test1::TestBase<T>" as C_0000000016
class C_0000000016 {
{static} +TestBase() : void
{static} +~TestBase() : void
{static} +TestBase(int a_, float b_, T c_) : void
+a : int
+b : float
+c : T
}
C_0000000002 <|-- C_0000000011
@enduml
An interesting option would be direct generation of UML diagrams in XML XMI format, for interoperability with several GUI UML tools.
PlantUML currently has a beta feature for generating XMI files from it's own format (only for class diagrams), however we could have more control here when generating XMI directly from clang-uml
...
Hi, I have a simple test case that fails, giving the following output:
[info] [tid 114423] [main.cc:104] Loaded clang-uml config from .clang-uml
[info] [tid 114423] [main.cc:106] Loading compilation database from . directory
[info] [tid 114434] [generator.h:373] Generating diagram test.puml
In file included from /workspaces/test/source.cpp:1:
In file included from /workspaces/test/header.h:4:
/usr/include/stdio.h:33:10: fatal error: 'stddef.h' file not found
#include <stddef.h>
^~~~~~~~~~
1 error generated.
Error while processing /workspaces/test/source.cpp.
[error] [tid 114434] [main.cc:189] Diagram test generation failed
Test case:
test@cba5038ac203:/workspaces/test$ cat header.h
#include <stdio.h>
test@cba5038ac203:/workspaces/test$ cat source.cpp
#include "header.h"
test@cba5038ac203:/workspaces/test$ cat compile_commands.json
[
{
"directory": "/workspaces/test/",
"command": "/usr/bin/g++ -o source.cpp.o -c /workspaces/test/source.cpp",
"file": "/workspaces/test/source.cpp"
}
]
test@cba5038ac203:/workspaces/test$ cat .clang-uml
compilation_database_dir: .
output_directory: ./uml-diagrams
diagrams:
test:
type: class
glob:
- source.cpp
using_namespace:
- myproject
include:
namespaces:
- myproject
plantuml:
after:
- 'note left of {{ alias("MyProjectMain") }}: Main class of myproject library.'
I'm using the latest package at ppa:bkryza/clang-uml
:
clang-uml 0.2.2
Copyright (C) 2021-2022 Bartek Kryza <[email protected]>
Built with LLVM version: 14.0.0
Using LLVM version: Ubuntu clang version 14.0.0-1ubuntu1
Distro is Ubuntu 22.04.1 and I have Clang 12 installed if that's relevant.
At the moment it is very inconvenient to determine the exact start_from
value to determine method or function which should be the entry point to a sequence diagram. In all but trivial cases, it is necessary to first generate the diagram with full log verbosity and then find the method signature (as rendered by clang-uml
).
There should be a cli option enabling printing of all valid start_from
function and method signatures (i.e. those which matched all filters) on the output...
The invocation could look like:
clang-uml -n my_sequence_diagram --print-start-from
...
clanguml::sequence_diagram::visitor::translation_unit_visitor::VisitCXXRecordDecl(clang::CXXRecordDecl *)
...
The output preferably should contain only the function signatures, one per line to enable easy filtering using grep
.
Create installable cmake script allowing users to directly invoke clang-uml with required options from CMake.
Hi Bartek,
I've been really impressed with this repository, great work! I think this can be really useful and timesaving.
I have used it on an existing codebase, and ran into a few improvements that might make things even better:
Thanks,
Kind regards,
Bram Veldhoen
PlantUML allows to add http links to generated diagrams, which can be for instance added to SVG diagrams to give clickable links to GitHub or other code repositories.
It should be possible to specify regex patterns for matching entities in the inclusion and exclusion diagram filters, in order to make it easier to define diagrams, currently inclusion and exclusion filters must contain full class and template names...
Extend layout
configuration parameter with support for together
PlantUML directive, which allows enumeration of elements which should be rendered close to each other with respect to other diagram elements...
Currently diagrams are generated sequentially, but it should be easy to parallelize this process as the diagrams are independent.
Currently, type aliases are generated as separate class nodes (but not always), which is confusing. Furthermore, for alias templates not all instantiations are generated. For instance:
template <class T> using AVectorPtr = std::unique_ptr<A<double,T>>;
AVectorPtr<bool> a;
should generate:
A<double,bool>
as a separate class template node.
Currently inja
templates can only use the raw comment string of an entity such as class or method. Since libclang
supports comment introspection and parsing:
https://clang.llvm.org/doxygen/group__CINDEX__COMMENT.html
it should be possible to provide access to individual comment blocks through inja
for instance:
{{ element.comment.brief }}
:clang-uml $ make release
cmake -S . -B release
-DGIT_VERSION=0.3.0-2-g476a787
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_CXX_FLAGS=""
-DCMAKE_EXE_LINKER_FLAGS=""
-DLLVM_VERSION=
-- Checking for LLVM and Clang...
-- Found LLVM 15.0.6
-- Using LLVMConfig.cmake in: /usr/local/Cellar/llvm/15.0.6/lib/cmake/llvm
-- LLVM library dir: /usr/local/Cellar/llvm/15.0.6/lib
-- Checking for yaml-cpp...
-- Using CMAKE_CXX_FLAGS: -Werror -Wall -Wextra -std=c++17 -Wno-unused-parameter -Wno-unused-private-field
t00002/.clang-uml
t00003/.clang-uml
t00004/.clang-uml
t00005/.clang-uml
t00006/.clang-uml
t00007/.clang-uml
t00008/.clang-uml
t00009/.clang-uml
t00010/.clang-uml
t00011/.clang-uml
t00012/.clang-uml
t00013/.clang-uml
t00014/.clang-uml
t00015/.clang-uml
t00016/.clang-uml
t00017/.clang-uml
t00018/.clang-uml
t00019/.clang-uml
t00020/.clang-uml
t00021/.clang-uml
t00022/.clang-uml
t00023/.clang-uml
t00024/.clang-uml
t00025/.clang-uml
t00026/.clang-uml
t00027/.clang-uml
t00028/.clang-uml
t00029/.clang-uml
t00030/.clang-uml
t00031/.clang-uml
t00032/.clang-uml
t00033/.clang-uml
t00034/.clang-uml
t00035/.clang-uml
t00036/.clang-uml
t00037/.clang-uml
t00038/.clang-uml
t00039/.clang-uml
t00040/.clang-uml
t00041/.clang-uml
t00042/.clang-uml
t00043/.clang-uml
t00044/.clang-uml
t00045/.clang-uml
t00046/.clang-uml
t00047/.clang-uml
t00048/.clang-uml
t00049/.clang-uml
t00050/.clang-uml
t20001/.clang-uml
t20002/.clang-uml
t20003/.clang-uml
t20004/.clang-uml
t20005/.clang-uml
t20006/.clang-uml
t20007/.clang-uml
t20008/.clang-uml
t20009/.clang-uml
t20010/.clang-uml
t20011/.clang-uml
t20012/.clang-uml
t20013/.clang-uml
t20014/.clang-uml
t20015/.clang-uml
t20016/.clang-uml
t20017/.clang-uml
t20018/.clang-uml
t20019/.clang-uml
t20020/.clang-uml
t20021/.clang-uml
t20022/.clang-uml
t20023/.clang-uml
t20024/.clang-uml
t20025/.clang-uml
t20026/.clang-uml
t20027/.clang-uml
t20028/.clang-uml
t20029/.clang-uml
t30001/.clang-uml
t30002/.clang-uml
t30003/.clang-uml
t30004/.clang-uml
t30005/.clang-uml
t30006/.clang-uml
t30007/.clang-uml
t30008/.clang-uml
t40001/.clang-uml
t40002/.clang-uml
t40003/.clang-uml
t90000/.clang-uml
test_config_data/filters.yml
test_config_data/includes.yml
test_config_data/includes1.yml
test_config_data/includes2.yml
test_config_data/inherited.yml
test_config_data/layout.yml
test_config_data/simple.yml
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/***/Documents/GitHub/clang-uml/release
make -C release -j4
[ 29%] Built target clang-umllib
[ 29%] Building CXX object tests/CMakeFiles/test_model.dir/test_model.cc.o
[ 30%] Building CXX object tests/CMakeFiles/test_util.dir/test_util.cc.o
[ 31%] Building CXX object tests/CMakeFiles/test_decorator_parser.dir/test_decorator_parser.cc.o
[ 32%] Built target clang-uml
[ 33%] Building CXX object tests/CMakeFiles/test_config.dir/test_config.cc.o
error: unknown warning option '-Wno-aggressive-loop-optimizations' [-Werror,-Wunknown-warning-option]
make[3]: *** [tests/CMakeFiles/test_decorator_parser.dir/test_decorator_parser.cc.o] Error 1
make[2]: *** [tests/CMakeFiles/test_decorator_parser.dir/all] Error 2
make[2]: *** Waiting for unfinished jobs....
error: unknown warning option '-Wno-aggressive-loop-optimizations' [-Werror,-Wunknown-warning-option]
make[3]: *** [tests/CMakeFiles/test_model.dir/test_model.cc.o] Error 1
make[2]: *** [tests/CMakeFiles/test_model.dir/all] Error 2
error: unknown warning option '-Wno-aggressive-loop-optimizations' [-Werror,-Wunknown-warning-option]
make[3]: *** [tests/CMakeFiles/test_util.dir/test_util.cc.o] Error 1
make[2]: *** [tests/CMakeFiles/test_util.dir/all] Error 2
error: unknown warning option '-Wno-aggressive-loop-optimizations' [-Werror,-Wunknown-warning-option]
make[3]: *** [tests/CMakeFiles/test_config.dir/test_config.cc.o] Error 1
make[2]: *** [tests/CMakeFiles/test_config.dir/all] Error 2
make[1]: *** [all] Error 2
make: *** [release] Error 2
While creating a class diagram, the above error is logged to the output. No puml file is generated.
See the last few lines of the verbose log output below:
[debug] [tid 621384] [nested_trait.h:61] Adding nested element Supported at path '(anonymous)'
[debug] [tid 621384] [nested_trait.h:81] Nested element (anonymous) not found in element
[2023-01-08 20:05:53.518] [info] No parent element found at: (anonymous)
[error] [tid 621384] [main.cc:405] No parent element found for (anonymous)
The logs elsewhere in the logfile did not provide any clues. Do you have an indication where I might start looking, or how I could change the config file in order to make this succeed?
Thanks!
Currently sequence diagram test cases involving non-specialized templates fail due to the fact that VisitCallExpr()
is not called in translation_unit_visitor
for some reason...
Sometimes it's useful to group elements in the diagram in rows or columns. This can be easily implemented by adding row
and column
layout hints. In PlantUML they can be rendered using left
or down
hidden links.
Config could look like:
layout:
A:
- row: [AA, AAA] # A, AA and AAA should be in the same row
B:
- row: [BBB, BBB]
C:
- column: [CCC, CCC] # C, CC and CCC should be in the same column
By default, the paths in the diagrams (glob
, paths
filters, etc.) should be relative to the directory where .clang-uml
is located not the $PWD...
First reported in #68
Add inja function allowing to extract comment from class or template and use it somewhere in the diagram (e.g. to create a note next to a class):
plantuml:
after:
- 'note left of {{ alias("MyProjectMain") }}: {{ comment("MyProjectMain") }}.'
Currently sequence diagrams do not support traversing call expressions through template code (methods and functions). This should be possible now after rewrite to LibTooling...
This option will be useful for debugging issues as several of the options are inferred while loading the configuration and can cause difficult to trace errors during runtime...
Currently, dependency relationships are always rendered, even if a more specific relationships already exists between the 2 classes (e.g. containment or extension), which can be due to for instance a dependency to a method parameter.
There should be an option in the class diagram config (with default true value), which will remove such dependencies from the diagram, e.g.:
skip_redundant_dependencies: true
The current code visitors are based on libclang, which seems to have several limitations:
Currently in class diagrams when a class has template instantiated with a lambda, the type name is taken from Clang as-is, and contains a full path to the source file where the lambda is defined.
Optimally, this case should be handled by the make_lambda_name
method from sequence diagram visitor and changed to relative with respect to configurations relative_to
property...
Example:
I have a class MyPos in the root namespace, and a class MyPos3D (and MyPos2D) that inherits (publicly) from MyPos. However, clang-uml skips the inheritance because it does not understand that ::MyPos is identical to MyPos in this case.
If I enclose the class definitions in namespace test, it does work as expected (it would require synthetically modifying hundreds of source files, however).
please tell me if you need more verbose logs
[debug] [tid 12621] [translation_unit_visitor.cc:415] Setting user data for class MyPos, 0x7f188d660260
[debug] [tid 12621] [diagram.cc:117] Adding class: ::MyPos, MyPos
[debug] [tid 12621] [nested_trait.h:63] Adding nested element MyPos at path ''
[debug] [tid 12621] [nested_trait.h:83] Getting nested element at path: MyPos
[debug] [tid 12621] [translation_unit_visitor.cc:138] ========== Visiting 'MyPos' - class
...
[debug] [tid 12621] [translation_unit_visitor.cc:619] Found base class ::MyPos for class MyPos3D
[debug] [tid 12621] [translation_unit_visitor.cc:415] Setting user data for class MyPos3D, 0x7f188c303da0
[debug] [tid 12621] [diagram.cc:117] Adding class: ::MyPos3D, MyPos3D
[debug] [tid 12621] [diagram.cc:149] Class MyPos3D (MyPos3D) already in the model
...
[debug] [tid 12621] [diagram.cc:199] Looking for alias for ::MyPos
[debug] [tid 12621] [class_diagram_generator.cc:326] === Skipping inheritance relation from ::MyPos to MyPos3D due to: Missing alias for ::MyPos
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.