From a77752ee061ed0a73427409decd5f4c11f7848a9 Mon Sep 17 00:00:00 2001 From: Krystian Stasiowski Date: Mon, 27 Nov 2023 08:27:03 -0500 Subject: [PATCH] feat: configurable extraction of inaccessible bases --- .github/workflows/ci.yml | 1 + docs/modules/ROOT/pages/config-file.adoc | 4 ++-- src/lib/AST/ASTVisitor.cpp | 15 +++++++++++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cde5f512c..b8470efa0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -344,6 +344,7 @@ jobs: "generate: %s" \ "multipage: %s" \ "inaccessible-members: never" \ + "inaccessible-bases: never" \ "filters:" \ " symbols:" \ " exclude:" \ diff --git a/docs/modules/ROOT/pages/config-file.adoc b/docs/modules/ROOT/pages/config-file.adoc index a63aa7e8c..6db480690 100644 --- a/docs/modules/ROOT/pages/config-file.adoc +++ b/docs/modules/ROOT/pages/config-file.adoc @@ -84,10 +84,10 @@ when set to `dependency`. |No |inaccessible-members -|Whether to extract inaccessible members. Currently unimplemented. +|Whether to extract private/protected members. `always` or `never`. |No |inaccessible-bases -|Whether to extract inaccessible bases. Currently unimplemented. +|Whether to extract private/protected bases. `always` or `never`. |=== diff --git a/src/lib/AST/ASTVisitor.cpp b/src/lib/AST/ASTVisitor.cpp index f247f3cf4..f51441128 100644 --- a/src/lib/AST/ASTVisitor.cpp +++ b/src/lib/AST/ASTVisitor.cpp @@ -1945,14 +1945,25 @@ class ASTVisitor { for(const CXXBaseSpecifier& B : D->bases()) { + AccessSpecifier access = B.getAccessSpecifier(); + // KRYSTIAN FIXME: we need finer-grained control + // for protected bases, since an inheriting class + // will have access to the bases public members... + if(config_->inaccessibleBases != + ConfigImpl::SettingsImpl::ExtractPolicy::Always) + { + if(access == AccessSpecifier::AS_private || + access == AccessSpecifier::AS_protected) + continue; + } + I.Bases.emplace_back( // the extraction of the base type is // performed in direct dependency mode buildTypeInfo( B.getType(), ExtractMode::DirectDependency), - convertToAccessKind( - B.getAccessSpecifier()), + convertToAccessKind(access), B.isVirtual()); } }