Fix bug in analyze related to sub-configs.
Analyze had a bug where if you modified a build file containing
a config that was only used as a sub-config, analyze wouldn't
thing changes to the file would matter.
This apparently is due to sub-configs not being treated as fully
defined items in the builder (which is sensible), which led to
the analyze code not seeing them directly.
A fix for this is to walk any configs that *are* defined as part
of analyze and explicitly check them for subconfigs that might
be relevant.
Bug: 131
Change-Id: I0323c2340ccda58b341699ed221d2fd54d9d261c
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/11000
Commit-Queue: Dirk Pranke <dpranke@google.com>
Reviewed-by: Brett Wilson <brettw@chromium.org>
diff --git a/src/gn/analyzer.cc b/src/gn/analyzer.cc
index 47b0a6d..a42779a 100644
--- a/src/gn/analyzer.cc
+++ b/src/gn/analyzer.cc
@@ -404,6 +404,13 @@
return true;
}
+ if (const Config* config = item->AsConfig()) {
+ for (const auto& config_pair: config->configs()) {
+ if (ItemRefersToFile(config_pair.ptr, file))
+ return true;
+ }
+ }
+
if (!item->AsTarget())
return false;
diff --git a/src/gn/analyzer_unittest.cc b/src/gn/analyzer_unittest.cc
index 9f7d897..558700e 100644
--- a/src/gn/analyzer_unittest.cc
+++ b/src/gn/analyzer_unittest.cc
@@ -226,6 +226,40 @@
"}");
}
+// Tests that a target is marked as affected if a sub-config is modified.
+//
+// This test uses two levels of sub-configs to ensure the config hierarchy
+// is completely traversed.
+TEST_F(AnalyzerTest, SubConfigIsModified) {
+ std::unique_ptr<Config> ssc = MakeConfig("//dir3", "subsubconfig_name");
+ ssc->build_dependency_files().insert(SourceFile("//dir3/BUILD.gn"));
+
+ std::unique_ptr<Config> sc = MakeConfig("//dir2", "subconfig_name");
+ sc->configs().push_back(LabelConfigPair(ssc->label()));
+
+ std::unique_ptr<Config> c = MakeConfig("//dir", "config_name");
+ c->configs().push_back(LabelConfigPair(sc->label()));
+
+ std::unique_ptr<Target> t = MakeTarget("//dir", "target_name");
+ t->configs().push_back(LabelConfigPair(c.get()));
+
+ builder_.ItemDefined(std::move(ssc));
+ builder_.ItemDefined(std::move(sc));
+ builder_.ItemDefined(std::move(c));
+ builder_.ItemDefined(std::move(t));
+ RunAnalyzerTest(
+ R"({
+ "files": [ "//dir3/BUILD.gn" ],
+ "additional_compile_targets": [],
+ "test_targets": [ "//dir:target_name" ]
+ })",
+ "{"
+ R"("compile_targets":[],)"
+ R"/("status":"Found dependency",)/"
+ R"("test_targets":["//dir:target_name"])"
+ "}");
+}
+
// Tests that a target is marked as affected if its data are modified.
TEST_F(AnalyzerTest, TargetRefersToData) {
std::unique_ptr<Target> t = MakeTarget("//dir", "target_name");