From 79801b2936933daaa9b0a5a9c85612101f05fe98 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Tue, 24 Oct 2023 18:29:04 +0200 Subject: [PATCH] Fix handling of template template arguments which are not expressions (#199) --- src/common/clang_utils.cc | 5 +++++ src/common/clang_utils.h | 2 ++ .../visitor/call_expression_context.cc | 2 +- .../visitor/translation_unit_visitor.cc | 17 +++++++++++++---- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/common/clang_utils.cc b/src/common/clang_utils.cc index cbbaf991..22879a3e 100644 --- a/src/common/clang_utils.cc +++ b/src/common/clang_utils.cc @@ -238,6 +238,11 @@ std::string to_string(const clang::Expr *expr) return result; } +std::string to_string(const clang::ValueDecl *val) +{ + return val->getQualifiedNameAsString(); +} + std::string to_string(const clang::Stmt *stmt) { const clang::LangOptions lang_options; diff --git a/src/common/clang_utils.h b/src/common/clang_utils.h index 7c36e2d3..3dddeeb4 100644 --- a/src/common/clang_utils.h +++ b/src/common/clang_utils.h @@ -111,6 +111,8 @@ std::string to_string( std::string to_string(const clang::Expr *expr); +std::string to_string(const clang::ValueDecl *val); + std::string to_string(const clang::Stmt *stmt); std::string to_string(const clang::FunctionTemplateDecl *decl); diff --git a/src/sequence_diagram/visitor/call_expression_context.cc b/src/sequence_diagram/visitor/call_expression_context.cc index 862ca241..336a2747 100644 --- a/src/sequence_diagram/visitor/call_expression_context.cc +++ b/src/sequence_diagram/visitor/call_expression_context.cc @@ -76,7 +76,7 @@ clang::ASTContext *call_expression_context::get_ast_context() const } if (current_method_decl_ != nullptr) { - return ¤t_function_decl_->getASTContext(); + return ¤t_method_decl_->getASTContext(); } return nullptr; diff --git a/src/sequence_diagram/visitor/translation_unit_visitor.cc b/src/sequence_diagram/visitor/translation_unit_visitor.cc index 549fe504..fbae4dcc 100644 --- a/src/sequence_diagram/visitor/translation_unit_visitor.cc +++ b/src/sequence_diagram/visitor/translation_unit_visitor.cc @@ -1601,11 +1601,20 @@ bool translation_unit_visitor::process_template_parameters( clang::dyn_cast_or_null( parameter); std::optional default_arg; - if (template_template_parameter->hasDefaultArgument()) - default_arg = common::to_string( + if (template_template_parameter->hasDefaultArgument()) { + const auto &def_arg = template_template_parameter->getDefaultArgument() - .getArgument() - .getAsExpr()); + .getArgument(); + if (def_arg.getKind() == + clang::TemplateArgument::ArgKind::Expression) { + default_arg = common::to_string(def_arg.getAsExpr()); + } + else if (def_arg.getKind() == + clang::TemplateArgument::ArgKind::Declaration) { + default_arg = common::to_string(def_arg.getAsDecl()); + } + } + auto ct = template_parameter::make_template_template_type( template_template_parameter->getNameAsString(), default_arg, template_template_parameter->isParameterPack());