From 47dc82931f787164898632492a5531cc44b2ad65 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Thu, 11 Mar 2021 10:56:32 +0100 Subject: [PATCH] Added skipping of forward declarations --- src/cx/cursor.h | 10 ++++++++++ src/uml/class_diagram_visitor.h | 8 ++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/cx/cursor.h b/src/cx/cursor.h index 0fec6790..8ff410ad 100644 --- a/src/cx/cursor.h +++ b/src/cx/cursor.h @@ -130,6 +130,16 @@ public: bool is_declaration() const { return clang_isDeclaration(kind()); } + bool is_forward_declaration() const + { + auto definition = clang_getCursorDefinition(m_cursor); + + if (clang_equalCursors(definition, clang_getNullCursor())) + return true; + + return !clang_equalCursors(m_cursor, definition); + } + bool is_invalid_declaration() const { return clang_isInvalidDeclaration(m_cursor); diff --git a/src/uml/class_diagram_visitor.h b/src/uml/class_diagram_visitor.h index 0b6c364a..56d020b7 100644 --- a/src/uml/class_diagram_visitor.h +++ b/src/uml/class_diagram_visitor.h @@ -572,12 +572,16 @@ static enum CXChildVisitResult translation_unit_visitor( case CXCursor_ClassTemplate: [[fallthrough]]; case CXCursor_ClassDecl: { - spdlog::info("Found class or class template declaration: {}", - cursor_name_str); + spdlog::info( + "Found class or class template declaration: {}", cursor); if (!ctx->config.should_include(cursor.fully_qualified())) { ret = CXChildVisit_Continue; break; } + if (cursor.is_forward_declaration()) { + ret = CXChildVisit_Continue; + break; + } scope = scope_t::kPublic;