From 7a1e1ddba4a31138e4ea5ccc0f2714fe6a3a986f Mon Sep 17 00:00:00 2001 From: Krystian Stasiowski Date: Thu, 10 Aug 2023 09:48:47 -0400 Subject: [PATCH] feat: ExtractOptions --- include/mrdox/Config.hpp | 41 +++++++++++++++++++--------------- src/lib/AST/ASTVisitor.cpp | 24 +++++++++++++++----- src/lib/Lib/ConfigImpl.cpp | 4 +--- src/lib/Metadata/Interface.cpp | 4 +++- test-files/adoc/mrdox.yml | 3 ++- 5 files changed, 48 insertions(+), 28 deletions(-) diff --git a/include/mrdox/Config.hpp b/include/mrdox/Config.hpp index 12a9aa09f..f044ef635 100644 --- a/include/mrdox/Config.hpp +++ b/include/mrdox/Config.hpp @@ -61,8 +61,29 @@ class MRDOX_DECL */ Policy referencedDeclarations = Policy::Dependency; + /** Extraction policy for anonymous namespace. + + @li `Policy::Always`: anonymous namespaces and their + members will always be extracted. + + @li `Policy::Dependency`: members of anonymous namespaces will only + be extracted via dependency. + + @li `Policy::Never`: members of anonymous namespace will + never be extracted, regardless of how they are referenced. + */ Policy anonymousNamespaces = Policy::Always; + /** Extraction policy for inaccessible members. + + @li `Policy::Always`: all `private` and `protected` members + will be extracted. + + @li `Policy::Dependency`: `private` and `protected` members will only + be extracted via dependency. + + @li `Policy::Never`: `private` and `protected` will never be extracted. + */ Policy inaccessibleMembers = Policy::Always; Policy inaccessibleBases = Policy::Always; @@ -71,25 +92,9 @@ class MRDOX_DECL struct Settings { - ExtractOptions extractOptions; - - /** `true` if anonymous namespace members should be extracted and displayed. - - In some cases anonymous namespace members will - be listed even if this configuration value is set to - `false`. For example, this may occur for a class derived - from one declared within an anonymous namespace. - */ - bool includeAnonymous = true; - - /** `true` if private members should be extracted and displayed. - - In some cases private members will be listed - even if this configuration value is set to - `false`. For example, when extracting private - virtual functions in a base class. + /** Options controlling when declarations are extracted. */ - bool includePrivate = false; + ExtractOptions extract; /** `true` if output should consist of multiple files. */ diff --git a/src/lib/AST/ASTVisitor.cpp b/src/lib/AST/ASTVisitor.cpp index ba78727d7..164d9e7dd 100644 --- a/src/lib/AST/ASTVisitor.cpp +++ b/src/lib/AST/ASTVisitor.cpp @@ -258,11 +258,11 @@ class ASTVisitor SymbolID id = extractSymbolID(D); Info* info = getInfo(id); - if(config_->extractOptions.referencedDeclarations == + if(config_->extract.referencedDeclarations == Config::ExtractOptions::Policy::Never) return info; - if(config_->extractOptions.referencedDeclarations == + if(config_->extract.referencedDeclarations == Config::ExtractOptions::Policy::Dependency) { // if(currentMode() == ExtractMode::Normal) @@ -2348,9 +2348,23 @@ traverse(NamespaceDecl* D) { if(! shouldExtract(D)) return true; - if(! config_->includeAnonymous && - D->isAnonymousNamespace()) - return true; + + if(D->isAnonymousNamespace() && + config_->extract.anonymousNamespaces != + Config::ExtractOptions::Policy::Always) + { + // always skip anonymous namespaces if so configured + if(config_->extract.anonymousNamespaces == + Config::ExtractOptions::Policy::Never) + return true; + + // otherwise, skip extraction if this isn't a dependency + // KRYSTIAN FIXME: is this correct? a namespace should not + // be extracted as a dependency (until namespace aliases and + // using directives are supported) + if(currentMode() == ExtractMode::Normal) + return true; + } SymbolID id; if(! extractSymbolID(D, id)) diff --git a/src/lib/Lib/ConfigImpl.cpp b/src/lib/Lib/ConfigImpl.cpp index c44d44809..c80410941 100644 --- a/src/lib/Lib/ConfigImpl.cpp +++ b/src/lib/Lib/ConfigImpl.cpp @@ -101,10 +101,8 @@ struct llvm::yaml::MappingTraits< io.mapOptional("defines", cfg.defines); io.mapOptional("ignore-failures", cfg.ignoreFailures); - io.mapOptional("extract-options", cfg.extractOptions); + io.mapOptional("extract", cfg.extract); - io.mapOptional("include-anonymous", cfg.includeAnonymous); - io.mapOptional("include-private", cfg.includePrivate); io.mapOptional("multipage", cfg.multiPage); io.mapOptional("source-root", cfg.sourceRoot); diff --git a/src/lib/Metadata/Interface.cpp b/src/lib/Metadata/Interface.cpp index 85b415018..6497957a4 100644 --- a/src/lib/Metadata/Interface.cpp +++ b/src/lib/Metadata/Interface.cpp @@ -51,7 +51,9 @@ class Interface::Build Corpus const& corpus) noexcept : I_(I) , corpus_(corpus) - , includePrivate_(corpus_.config->includePrivate) + , includePrivate_( + corpus_.config->extract.inaccessibleMembers != + Config::ExtractOptions::Policy::Never) { // treat `Derived` as a public base, append(AccessKind::Public, Derived); diff --git a/test-files/adoc/mrdox.yml b/test-files/adoc/mrdox.yml index c9839ecc4..1bd325dbf 100644 --- a/test-files/adoc/mrdox.yml +++ b/test-files/adoc/mrdox.yml @@ -1,5 +1,6 @@ #ignore-failures: true -with-private: false +extract: + inaccessible-members: never concurrency: 1 source-root: . single-page: true