0.5.4
C++ to UML diagram generator based on Clang
Loading...
Searching...
No Matches
Public Member Functions | Static Public Member Functions | Private Member Functions | Private Attributes | List of all members
clanguml::common::compilation_database Class Reference

Custom compilation database class. More...

Detailed Description

Custom compilation database class.

This class provides custom specialization of Clang's CompilationDatabase, which provides the possibility of adjusting the compilation flags after they have been loaded from the compile_commands.json file.

Definition at line 48 of file compilation_database.h.

#include <compilation_database.h>

Public Member Functions

 compilation_database (std::unique_ptr< clang::tooling::CompilationDatabase > base, const clanguml::config::config &cfg)
 
 ~compilation_database () override=default
 
std::vector< clang::tooling::CompileCommand > getCompileCommands (clang::StringRef FilePath) const override
 
std::vector< std::string > getAllFiles () const override
 
std::vector< clang::tooling::CompileCommand > getAllCompileCommands () const override
 
const clanguml::config::configconfig () const
 
const clang::tooling::CompilationDatabase & base () const
 
std::string guess_language_from_filename (const std::string &filename) const
 
long count_matching_commands (const std::vector< std::string > &files) const
 

Static Public Member Functions

static std::unique_ptr< compilation_databaseauto_detect_from_directory (const clanguml::config::config &cfg)
 

Private Member Functions

void adjust_compilation_database (std::vector< clang::tooling::CompileCommand > &commands) const
 

Private Attributes

std::unique_ptr< clang::tooling::CompilationDatabase > base_
 
const clanguml::config::configconfig_
 

Constructor & Destructor Documentation

◆ compilation_database()

clanguml::common::compilation_database::compilation_database ( std::unique_ptr< clang::tooling::CompilationDatabase >  base,
const clanguml::config::config cfg 
)

Definition at line 39 of file compilation_database.cc.

42 : base_{std::move(base)}
43 , config_{cfg}
44{
45}

◆ ~compilation_database()

clanguml::common::compilation_database::~compilation_database ( )
overridedefault

Member Function Documentation

◆ adjust_compilation_database()

void clanguml::common::compilation_database::adjust_compilation_database ( std::vector< clang::tooling::CompileCommand > &  commands) const
private

Definition at line 110 of file compilation_database.cc.

112{
113#if !defined(_WIN32)
114 if (config().query_driver && !config().query_driver().empty()) {
115 for (auto &compile_command : commands) {
116 auto argv0 = config().query_driver() == "."
117 ? compile_command.CommandLine.at(0)
118 : config().query_driver();
119
120 util::query_driver_output_extractor extractor{
121 argv0, guess_language_from_filename(compile_command.Filename)};
122
123 extractor.execute();
124
125 std::vector<std::string> system_header_args;
126 for (const auto &path : extractor.system_include_paths()) {
127 system_header_args.emplace_back("-isystem");
128 system_header_args.emplace_back(path);
129 }
130
131 compile_command.CommandLine.insert(
132 compile_command.CommandLine.begin() + 1,
133 system_header_args.begin(), system_header_args.end());
134
135 if (!extractor.target().empty()) {
136 compile_command.CommandLine.insert(
137 compile_command.CommandLine.begin() + 1,
138 fmt::format("--target={}", extractor.target()));
139 }
140 }
141 }
142#endif
143
144 if (config().add_compile_flags && !config().add_compile_flags().empty()) {
145 for (auto &compile_command : commands) {
146 compile_command.CommandLine.insert(
147 // Add flags after argv[0]
148 compile_command.CommandLine.begin() + 1,
149 config().add_compile_flags().begin(),
150 config().add_compile_flags().end());
151 }
152 }
153
154 if (config().remove_compile_flags &&
155 !config().remove_compile_flags().empty()) {
156 for (auto &compile_command : commands) {
157 for (const auto &flag : config().remove_compile_flags()) {
158 util::erase_if(compile_command.CommandLine,
159 [&flag](const auto &arg) { return flag == arg; });
160 }
161 }
162 }
163}

◆ auto_detect_from_directory()

std::unique_ptr< compilation_database > clanguml::common::compilation_database::auto_detect_from_directory ( const clanguml::config::config cfg)
static

Loads the compilation database from directory specified on command line or in the configuration file.

Parameters
cfgReference to config instance
Returns
Instance of compilation_database.

Definition at line 26 of file compilation_database.cc.

28{
29 std::string error_message;
30 auto res = clang::tooling::CompilationDatabase::autoDetectFromDirectory(
31 cfg.compilation_database_dir(), error_message);
32
33 if (!error_message.empty())
34 throw error::compilation_database_error(error_message);
35
36 return std::make_unique<compilation_database>(std::move(res), cfg);
37}

◆ base()

const clang::tooling::CompilationDatabase & clanguml::common::compilation_database::base ( ) const

Returns reference to CompilationDatabase as was loaded from file.

Returns
Reference to CompilationDatabase.

Definition at line 52 of file compilation_database.cc.

53{
54 return *base_;
55}

◆ config()

const clanguml::config::config & clanguml::common::compilation_database::config ( ) const

Returns reference to clanguml's config instance.

Returns
Reference to config instance.

Definition at line 47 of file compilation_database.cc.

48{
49 return config_;
50}

◆ count_matching_commands()

long clanguml::common::compilation_database::count_matching_commands ( const std::vector< std::string > &  files) const

Definition at line 91 of file compilation_database.cc.

93{
94 auto result{0L};
95
96 auto commands = base().getAllCompileCommands();
97
98 for (const auto &command : commands) {
99 result += std::count_if(
100 files.begin(), files.end(), [&command](const auto &file) {
101 return (command.Filename == file) ||
102 (std::filesystem::weakly_canonical(command.Filename)
103 .string() == file);
104 });
105 }
106
107 return result;
108}

◆ getAllCompileCommands()

std::vector< clang::tooling::CompileCommand > clanguml::common::compilation_database::getAllCompileCommands ( ) const
override

Retrieves and adjusts all compilation commands from the database.

Returns
List of adjusted compile commands.

Definition at line 73 of file compilation_database.cc.

74{
75 auto commands = base().getAllCompileCommands();
76
78
79 return commands;
80}

◆ getAllFiles()

std::vector< std::string > clanguml::common::compilation_database::getAllFiles ( ) const
override

Returns all files in the database.

Returns
List of all files in compilation database.

Definition at line 57 of file compilation_database.cc.

58{
59 return base().getAllFiles();
60}

◆ getCompileCommands()

std::vector< clang::tooling::CompileCommand > clanguml::common::compilation_database::getCompileCommands ( clang::StringRef  FilePath) const
override

Retrieves and adjusts compilation commands from the database, for a given translation unit.

Returns
List of adjusted compile commands.

Definition at line 63 of file compilation_database.cc.

64{
65 auto commands = base().getCompileCommands(FilePath);
66
68
69 return commands;
70}

◆ guess_language_from_filename()

std::string clanguml::common::compilation_database::guess_language_from_filename ( const std::string &  filename) const

Definition at line 82 of file compilation_database.cc.

84{
85 if (util::ends_with(filename, std::string{".c"}))
86 return "c";
87
88 return "c++";
89}

Member Data Documentation

◆ base_

std::unique_ptr<clang::tooling::CompilationDatabase> clanguml::common::compilation_database::base_
private

Pointer to the Clang's original compilation database.

Actual instance of the compilation database is stored in here. The inheritance is just to keep the interface.

Definition at line 118 of file compilation_database.h.

◆ config_

const clanguml::config::config& clanguml::common::compilation_database::config_
private

Reference to the instance of clanguml config.

Definition at line 123 of file compilation_database.h.


The documentation for this class was generated from the following files: