Skip to content

Commit 5874a31

Browse files
committed
lib-hdrs, lib-srcs: also expand to data. And rename target-...
Also with `-P` it only emits elements that are physical files.
1 parent 1d64eed commit 5874a31

File tree

7 files changed

+82
-45
lines changed

7 files changed

+82
-45
lines changed

bant/bant.cc

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -131,13 +131,16 @@ Commands (unique prefix sufficient):
131131
→ 2 column table: (target, dependency*)
132132
has-dependent : List cc library targets and the libraries that depend on it
133133
→ 2 column table: (target, dependent*)
134-
lib-hdrs : Print headers provided by cc_library()s matching pattern.
135-
→ 2 column table: (header-filename, cc-library-target)
136-
lib-srcs : Print sources provided by cc_library()s matching pattern.
137-
→ 2 column table: (source-filename, cc-library-target)
138-
lib-headers : like lib-hdrs, but expands all reachable paths due to
139-
includes = [] expansion; so same header can show up
140-
multiple times.
134+
target-hdrs : Print hdrs mentioned in targets (-P: only physical files)
135+
→ 2 column table: (header-filename, target)
136+
target-srcs : Print srcs mentioned in targets (-P: only physical files)
137+
→ 2 column table: (srcs-filename, target)
138+
target-data : Print data mentioned in targets (-P: only physical files)
139+
→ 2 column table: (data-filename, target)
140+
lib-headers : Like target-hdrs, but all reachable paths expanded with all
141+
combinations of includes = [], include_prefix, etc.
142+
So same header can show up multiple times with different
143+
paths. This is the relevant list used by dwyu.
141144
→ 2 column table: (header-filename, cc-library-target)
142145
genrule-outputs: Print generated files by genrule()s matching pattern.
143146
→ 2 column table: (filename, genrule-target)
@@ -211,7 +214,7 @@ int main(int argc, char *argv[]) {
211214
{"json", OutputFormat::kJSON}, {"graphviz", OutputFormat::kGraphviz},
212215
};
213216
int opt;
214-
while ((opt = getopt(argc, argv, "C:qo:vhaEF:ecbf:r::Vkg:iT:")) != -1) {
217+
while ((opt = getopt(argc, argv, "C:qo:vhaEF:ecbf:r::Vkg:iT:P")) != -1) {
215218
switch (opt) {
216219
case 'C': {
217220
std::error_code err;
@@ -277,6 +280,7 @@ int main(int argc, char *argv[]) {
277280
return usage(argv[0], "-T needs a numeric parameter", EXIT_FAILURE);
278281
}
279282
break;
283+
case 'P': flags.only_physical_files = true; break;
280284
case 'v': flags.verbose++; break; // More -v, more detail.
281285
case 'V': return print_version();
282286
default: return usage(argv[0], nullptr, EXIT_SUCCESS);

bant/cli-commands.cc

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,9 @@ enum class Command {
6767
kListTargets,
6868
kListLeafs,
6969
kListWorkkspace,
70-
kLibraryHdrs,
71-
kLibrarySrcs,
70+
kTargetHdrs,
71+
kTargetSrcs,
72+
kTargetData,
7273
kExpandedLibraryHeaders,
7374
kAliasedBy,
7475
kGenruleOutputs,
@@ -212,9 +213,10 @@ CliStatus RunCommand(Session &session, Command cmd,
212213
switch (cmd) {
213214
case Command::kDWYU:
214215
case Command::kParse:
215-
case Command::kLibraryHdrs:
216+
case Command::kTargetHdrs:
217+
case Command::kTargetData:
216218
case Command::kExpandedLibraryHeaders:
217-
case Command::kLibrarySrcs:
219+
case Command::kTargetSrcs:
218220
case Command::kGenruleOutputs:
219221
case Command::kListTargets:
220222
case Command::kListLeafs:
@@ -279,18 +281,29 @@ CliStatus RunCommand(Session &session, Command cmd,
279281
ExtractExpandedHeaderToLibMapping(project, session.info()));
280282
break;
281283

282-
case Command::kLibrarySrcs: //
284+
// TODO: these target srcs/hdrs/data should include target type.
285+
case Command::kTargetSrcs: //
283286
bant::PrintProvidedSources(
284-
session, "source", print_pattern,
285-
ExtractComponentToLibMapping(project, ExtractComponent::kSrcs,
286-
session.info()));
287+
session, "srcs", print_pattern,
288+
ExtractComponentToTargetMapping(project, ExtractComponent::kSrcs,
289+
session.flags().only_physical_files,
290+
session.info()));
287291
break;
288292

289-
case Command::kLibraryHdrs: //
293+
case Command::kTargetHdrs: //
290294
bant::PrintProvidedSources(
291-
session, "header", print_pattern,
292-
ExtractComponentToLibMapping(project, ExtractComponent::kHdrs,
293-
session.info()));
295+
session, "hdrs", print_pattern,
296+
ExtractComponentToTargetMapping(project, ExtractComponent::kHdrs,
297+
session.flags().only_physical_files,
298+
session.info()));
299+
break;
300+
301+
case Command::kTargetData: //
302+
bant::PrintProvidedSources(
303+
session, "data", print_pattern,
304+
ExtractComponentToTargetMapping(project, ExtractComponent::kData,
305+
session.flags().only_physical_files,
306+
session.info()));
294307
break;
295308

296309
case Command::kGenruleOutputs:
@@ -396,8 +409,9 @@ CliStatus RunCliCommand(Session &session, std::span<std::string_view> args) {
396409
{"list-targets", Command::kListTargets},
397410
{"list-leafs", Command::kListLeafs},
398411
{"workspace", Command::kListWorkkspace},
399-
{"lib-hdrs", Command::kLibraryHdrs},
400-
{"lib-srcs", Command::kLibrarySrcs},
412+
{"target-hdrs", Command::kTargetHdrs},
413+
{"target-data", Command::kTargetData},
414+
{"target-srcs", Command::kTargetSrcs},
401415
{"lib-headers", Command::kExpandedLibraryHeaders},
402416
{"aliased-by", Command::kAliasedBy},
403417
{"depends-on", Command::kDependsOn},

bant/explore/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ cc_library(
6767
"//bant:types",
6868
"//bant:types-bazel",
6969
"//bant/frontend:parsed-project",
70+
"//bant/frontend:parser",
71+
"//bant/util:file-utils",
7072
"//bant/util:table-printer",
7173
"@abseil-cpp//absl/container:btree",
7274
"@abseil-cpp//absl/strings",

bant/explore/header-providers.cc

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@
3232
#include "absl/strings/str_cat.h"
3333
#include "bant/explore/aliased-by.h"
3434
#include "bant/explore/query-utils.h"
35+
#include "bant/frontend/ast.h"
3536
#include "bant/frontend/parsed-project.h"
3637
#include "bant/session.h"
3738
#include "bant/types-bazel.h"
3839
#include "bant/types.h"
40+
#include "bant/util/filesystem.h"
3941
#include "bant/util/table-printer.h"
4042

4143
// The header providers maps header filenames to all the libraries that
@@ -336,27 +338,33 @@ ProvidedFromTargetSet ExtractExpandedHeaderToLibMapping(
336338
return result;
337339
}
338340

339-
ProvidedFromTargetSet ExtractComponentToLibMapping(const ParsedProject &project,
340-
ExtractComponent which,
341-
std::ostream &info_out) {
341+
ProvidedFromTargetSet ExtractComponentToTargetMapping(
342+
const ParsedProject &project, ExtractComponent which,
343+
bool only_physical_files, std::ostream &info_out) {
344+
auto &fs = Filesystem::instance();
342345
ProvidedFromTargetSet result;
343346

344347
for (const auto &[_, build_file] : project.ParsedFiles()) {
345348
if (!build_file->ast) continue;
346349

347-
query::FindTargets(
348-
build_file->ast, {"cc_library"}, [&](const query::Result &cc_lib) {
349-
auto cc_library = build_file->package.QualifiedTarget(cc_lib.name);
350-
if (!cc_library.has_value()) return;
351-
352-
auto srcs = query::ExtractStringList((which == ExtractComponent::kSrcs)
353-
? cc_lib.srcs_list
354-
: cc_lib.hdrs_list);
355-
for (const std::string_view src : srcs) {
356-
const std::string src_fqn = build_file->package.QualifiedFile(src);
350+
query::FindTargets(build_file->ast, {}, [&](const query::Result &cc_lib) {
351+
auto cc_library = build_file->package.QualifiedTarget(cc_lib.name);
352+
if (!cc_library.has_value()) return;
353+
354+
List *search_list = nullptr;
355+
switch (which) {
356+
case ExtractComponent::kHdrs: search_list = cc_lib.hdrs_list; break;
357+
case ExtractComponent::kSrcs: search_list = cc_lib.srcs_list; break;
358+
case ExtractComponent::kData: search_list = cc_lib.data_list; break;
359+
}
360+
auto srcs = query::ExtractStringList(search_list);
361+
for (const std::string_view src : srcs) {
362+
const std::string src_fqn = build_file->package.QualifiedFile(src);
363+
if (!only_physical_files || fs.Exists(src_fqn)) {
357364
result[src_fqn].emplace(*cc_library);
358365
}
359-
});
366+
}
367+
});
360368
}
361369

362370
return result;

bant/explore/header-providers.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,17 @@ ProvidedFromTargetSet ExtractExpandedHeaderToLibMapping(
5151
bool suffix_index = false);
5252

5353
// Unlike the Expanded*, this is much simpler, as we don't deal with multiple
54-
// search paths. Just extract the mentioned component.
54+
// search paths. Just extract the mentioned component. If "only_physical_files"
55+
// is on, only emit them if these are files in the filesystem (unlike
56+
// generated files or target names).
5557
enum class ExtractComponent {
5658
kSrcs,
5759
kHdrs,
60+
kData,
5861
};
59-
ProvidedFromTargetSet ExtractComponentToLibMapping(const ParsedProject &project,
60-
ExtractComponent which,
61-
std::ostream &info_out);
62+
ProvidedFromTargetSet ExtractComponentToTargetMapping(
63+
const ParsedProject &project, ExtractComponent which,
64+
bool only_physical_files, std::ostream &info_out);
6265

6366
// Find all the output generated by genrules. Should really only be 1:1.
6467
// If "suffix_index" is set, output is compatible with FinxBySuffix().

bant/explore/header-providers_test.cc

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -110,20 +110,25 @@ TEST(SourceToLibMapping, CCRuleExtraction) {
110110
cc_library(
111111
name = "foo",
112112
srcs = ["foo.cc", "bar.cc"],
113-
hdrs = ["baz.h"]
113+
hdrs = ["baz.h"],
114+
data = ["data.txt"],
114115
)
115116
)");
116117
std::stringstream log_absorb;
117-
auto srcs_map = ExtractComponentToLibMapping(
118-
pp.project(), ExtractComponent::kSrcs, log_absorb);
118+
auto srcs_map = ExtractComponentToTargetMapping(
119+
pp.project(), ExtractComponent::kSrcs, false, log_absorb);
119120
EXPECT_THAT(srcs_map,
120121
Contains(Pair("some/path/foo.cc", Ts("//some/path:foo"))));
121122
EXPECT_THAT(srcs_map,
122123
Contains(Pair("some/path/bar.cc", Ts("//some/path:foo"))));
123-
auto hdrs_map = ExtractComponentToLibMapping(
124-
pp.project(), ExtractComponent::kHdrs, log_absorb);
124+
auto hdrs_map = ExtractComponentToTargetMapping(
125+
pp.project(), ExtractComponent::kHdrs, false, log_absorb);
125126
EXPECT_THAT(hdrs_map,
126127
Contains(Pair("some/path/baz.h", Ts("//some/path:foo"))));
128+
auto data_map = ExtractComponentToTargetMapping(
129+
pp.project(), ExtractComponent::kData, false, log_absorb);
130+
EXPECT_THAT(data_map,
131+
Contains(Pair("some/path/data.txt", Ts("//some/path:foo"))));
127132
}
128133

129134
TEST(HeaderToLibMapping, InludePathsAreRelativePathCanonicalized) {

bant/session.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ struct CommandlineFlags {
5555
bool elaborate = false;
5656
bool builtin_macro_expand = false;
5757
bool ignore_keep_comment = false;
58+
bool only_physical_files = false; // for target-{srcs,hdrs,data}
5859
int recurse_dependency_depth = 0;
5960
OutputFormat output_format = OutputFormat::kNative;
6061
int io_threads = 0; // <= 0: synchronous operation.

0 commit comments

Comments
 (0)