Fixed t00007

This commit is contained in:
Bartek Kryza
2022-07-19 23:48:58 +02:00
parent 8a7e89cb63
commit 673b08f027
4 changed files with 57 additions and 32 deletions

View File

@@ -410,7 +410,6 @@ bool translation_unit_visitor::find_relationships(const clang::QualType &type,
clanguml::common::model::relationship_t relationship_hint)
{
bool result = false;
std::string type_name = type.getAsString();
(void)type_name;
@@ -433,12 +432,19 @@ bool translation_unit_visitor::find_relationships(const clang::QualType &type,
find_relationships(type->getAsArrayTypeUnsafe()->getElementType(),
relationships, relationship_t::kAggregation);
}
else if (type->isClassType()) {
else if (type->isRecordType()) {
if(type_name.find("std::shared_ptr") == 0)
relationship_hint = relationship_t::kAssociation;
if(type_name.find("std::weak_ptr") == 0)
relationship_hint = relationship_t::kAssociation;
const auto *type_instantiation_decl =
type->getAs<clang::TemplateSpecializationType>();
if (type_instantiation_decl != nullptr) {
for (const auto &template_argument : *type_instantiation_decl) {
if (template_argument.getKind() ==
clang::TemplateArgument::ArgKind::Type)
result = find_relationships(template_argument.getAsType(),
relationships, relationship_hint);
}
@@ -600,12 +606,12 @@ std::unique_ptr<class_> translation_unit_visitor::build_template_instantiation(
for (const auto &arg : template_type) {
auto argument_kind = arg.getKind();
if (argument_kind == clang::TemplateArgument::ArgKind::Type) {
const auto *argument_record_decl =
arg.getAsType()->getAsRecordDecl();
// const auto *argument_record_decl =
// arg.getAsType()->getAsRecordDecl();
template_parameter argument;
argument.is_template_parameter(false);
argument.set_name(to_string(
arg.getAsType(), argument_record_decl->getASTContext()));
arg.getAsType(), template_record->getASTContext()));
template_instantiation.add_template(std::move(argument));
@@ -630,16 +636,30 @@ void translation_unit_visitor::process_field(
detail::access_specifier_to_access_t(field_declaration.getAccess()),
field_declaration.getNameAsString(), type_name};
if (field.name() == "e") {
LOG_DBG("EEEEEEEEE");
}
process_comment(field_declaration, field);
set_source_location(field_declaration, field);
if (field.skip())
return;
if (field_type->getAs<clang::TemplateSpecializationType>()) {
if (diagram().should_include(type_name)) {
auto template_specialization_ptr = build_template_instantiation(
*field_type->getAs<clang::TemplateSpecializationType>());
relationship r{relationship_t::kAggregation,
template_specialization_ptr->id()};
r.set_label(field_declaration.getNameAsString());
r.set_access(detail::access_specifier_to_access_t(
field_declaration.getAccess()));
diagram().add_class(std::move(template_specialization_ptr));
LOG_DBG("ADDED TEMPLATE SPECIALIZATION TO DIAGRAM");
c.add_relationship(std::move(r));
}
else {
if (!field.skip_relationship()) {
found_relationships_t relationships;
// find relationship for the type
@@ -647,19 +667,24 @@ void translation_unit_visitor::process_field(
relationship_t::kAggregation);
add_relationships(c, relationships,
detail::access_specifier_to_access_t(field_declaration.getAccess()),
detail::access_specifier_to_access_t(
field_declaration.getAccess()),
field_declaration.getNameAsString());
}
}
}
else {
if (!field.skip_relationship()) {
found_relationships_t relationships;
// find relationship for the type
find_relationships(field_declaration.getType(), relationships,
relationship_t::kAggregation);
if (field_type->getAs<clang::TemplateSpecializationType>() &&
diagram().should_include(type_name)) {
auto template_specialization_ptr = build_template_instantiation(
*field_type->getAs<clang::TemplateSpecializationType>());
diagram().add_class(std::move(template_specialization_ptr));
LOG_DBG("ADDED TEMPLATE SPECIALIZATION TO DIAGRAM");
add_relationships(c, relationships,
detail::access_specifier_to_access_t(
field_declaration.getAccess()),
field_declaration.getNameAsString());
}
}
/*

View File

@@ -24,7 +24,7 @@ TEST_CASE("t00007", "[test-case][class]")
REQUIRE(diagram->name == "t00007_class");
auto model = generate_class_diagram(db, diagram);
auto model = generate_class_diagram(*db, diagram);
REQUIRE(model->name() == "t00007_class");

View File

@@ -24,7 +24,7 @@ TEST_CASE("t00008", "[test-case][class]")
REQUIRE(diagram->name == "t00008_class");
auto model = generate_class_diagram(db, diagram);
auto model = generate_class_diagram(*db, diagram);
REQUIRE(model->name() == "t00008_class");

View File

@@ -195,8 +195,8 @@ using namespace clanguml::test::matchers;
#include "t00004/test_case.h"
#include "t00005/test_case.h"
#include "t00006/test_case.h"
//#include "t00007/test_case.h"
//#include "t00008/test_case.h"
#include "t00007/test_case.h"
#include "t00008/test_case.h"
//#include "t00009/test_case.h"
//#include "t00010/test_case.h"
//#include "t00011/test_case.h"