From 044c9ced19398f5587dbe95cb6162d16f8329b02 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sat, 20 May 2023 11:40:12 +0200 Subject: [PATCH] Fixed generation of dependent template argument names (#146) --- src/class_diagram/visitor/template_builder.cc | 16 +++++++++------- src/common/clang_utils.cc | 18 ++++++++++++++++++ src/common/clang_utils.h | 2 ++ 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/class_diagram/visitor/template_builder.cc b/src/class_diagram/visitor/template_builder.cc index 0e56f5e9..56cb8b5d 100644 --- a/src/class_diagram/visitor/template_builder.cc +++ b/src/class_diagram/visitor/template_builder.cc @@ -484,10 +484,9 @@ void template_builder::argument_process_dispatch( template_parameter template_builder::process_template_argument( const clang::TemplateArgument &arg) { - LOG_DBG("Processing template argument: {}", common::to_string(arg)); + auto arg_name = common::to_string(arg); - auto arg_name = - arg.getAsTemplate().getAsTemplateDecl()->getQualifiedNameAsString(); + LOG_DBG("Processing template argument: {}", arg_name); return template_parameter::make_template_type(arg_name); } @@ -495,11 +494,14 @@ template_parameter template_builder::process_template_argument( template_parameter template_builder::process_template_expansion( const clang::TemplateArgument &arg) { - LOG_DBG( - "Processing template expansion argument: {}", common::to_string(arg)); + auto arg_name = common::to_string(arg); - auto arg_name = - arg.getAsTemplate().getAsTemplateDecl()->getQualifiedNameAsString(); + LOG_DBG("Processing template expansion argument: {}", arg_name); + + util::apply_if_not_null( + arg.getAsTemplate().getAsTemplateDecl(), [&arg_name](const auto *decl) { + arg_name = decl->getQualifiedNameAsString(); + }); auto param = template_parameter::make_template_type(arg_name); param.is_variadic(true); diff --git a/src/common/clang_utils.cc b/src/common/clang_utils.cc index 8e44133d..d32ffa48 100644 --- a/src/common/clang_utils.cc +++ b/src/common/clang_utils.cc @@ -205,11 +205,29 @@ std::string to_string( return "nullptr"; case clang::TemplateArgument::Integral: return std::to_string(arg.getAsIntegral().getExtValue()); + case clang::TemplateArgument::Template: + return to_string(arg.getAsTemplate()); + case clang::TemplateArgument::TemplateExpansion: + return to_string(arg.getAsTemplateOrTemplatePattern()); default: return ""; } } +std::string to_string(const clang::TemplateName &templ) +{ + if (templ.getAsTemplateDecl() != nullptr) { + return templ.getAsTemplateDecl()->getQualifiedNameAsString(); + } + + std::string result; + const clang::LangOptions lang_options; + llvm::raw_string_ostream ostream(result); + templ.print(ostream, clang::PrintingPolicy(lang_options)); + + return result; +} + std::string to_string(const clang::Expr *expr) { const clang::LangOptions lang_options; diff --git a/src/common/clang_utils.h b/src/common/clang_utils.h index 1aa906a4..5a2ef6b1 100644 --- a/src/common/clang_utils.h +++ b/src/common/clang_utils.h @@ -92,6 +92,8 @@ std::string to_string(const clang::FunctionTemplateDecl *decl); std::string to_string(const clang::TypeConstraint *tc); +std::string to_string(const clang::TemplateName &templ); + std::string get_source_text_raw( clang::SourceRange range, const clang::SourceManager &sm);