[error messages] Centralize decision logic for showing toolchains in errors
Create a central implementation for determining if a set
of labels need to show their toolchain or not when
creating error messages.
Change-Id: I9015340930e9e0a2e91f7aa9704a141464d60ce7
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/14700
Commit-Queue: Brett Wilson <brettw@chromium.org>
Reviewed-by: Brett Wilson <brettw@chromium.org>
diff --git a/src/gn/settings.cc b/src/gn/settings.cc
index 154e0af..c9a36c9 100644
--- a/src/gn/settings.cc
+++ b/src/gn/settings.cc
@@ -27,3 +27,12 @@
if (!toolchain_output_dir_.is_null())
toolchain_gen_dir_ = SourceDir(toolchain_output_dir_.value() + "gen/");
}
+
+bool Settings::ShouldShowToolchain(
+ std::initializer_list<const Label*> labels) const {
+ for (auto label : labels) {
+ if (label->GetToolchainLabel() != default_toolchain_label_)
+ return true;
+ }
+ return false;
+}
diff --git a/src/gn/settings.h b/src/gn/settings.h
index 9b83b60..79d1904 100644
--- a/src/gn/settings.h
+++ b/src/gn/settings.h
@@ -86,6 +86,11 @@
greedy_target_generation_ = gtg;
}
+ // Returns true if any Label in the list provided is not in the default
+ // toolchain, and therefore any error message that involves this list of
+ // Labels should print the toolchain for each Label.
+ bool ShouldShowToolchain(std::initializer_list<const Label*> labels) const;
+
private:
const BuildSettings* build_settings_;
diff --git a/src/gn/visibility.cc b/src/gn/visibility.cc
index acbb500..61423ff 100644
--- a/src/gn/visibility.cc
+++ b/src/gn/visibility.cc
@@ -92,15 +92,21 @@
const Item* to,
Err* err) {
if (!to->visibility().CanSeeMe(from->label())) {
- bool with_toolchain =
- !from->settings()->is_default() || !to->settings()->is_default();
+ bool with_toolchain = from->settings()->ShouldShowToolchain({
+ &to->label(),
+ &from->label(),
+ });
std::string to_label = to->label().GetUserVisibleName(with_toolchain);
std::string from_label = from->label().GetUserVisibleName(with_toolchain);
*err = Err(from->defined_from(), "Dependency not allowed.",
- "The item " + from_label + "\n"
- "can not depend on " + to_label + "\n"
- "because it is not in " + to_label + "'s visibility list: " +
- to->visibility().Describe(0, true));
+ "The item " + from_label +
+ "\n"
+ "can not depend on " +
+ to_label +
+ "\n"
+ "because it is not in " +
+ to_label +
+ "'s visibility list: " + to->visibility().Describe(0, true));
return false;
}
return true;