Change "gn check" to report all incorrect include Backport of https://chromium-review.googlesource.com/c/chromium/src/+/1107992 which was landed after fork to standalone repo. Change-Id: I940ab8451758f1ef77e4c66361f956a88fe2e2c4 Reviewed-on: https://gn-review.googlesource.com/1842 Commit-Queue: Scott Graham <scottmg@chromium.org> Reviewed-by: Dirk Pranke <dpranke@chromium.org>
diff --git a/tools/gn/header_checker.cc b/tools/gn/header_checker.cc index a2958d5..03afc46 100644 --- a/tools/gn/header_checker.cc +++ b/tools/gn/header_checker.cc
@@ -180,10 +180,10 @@ } void HeaderChecker::DoWork(const Target* target, const SourceFile& file) { - Err err; - if (!CheckFile(target, file, &err)) { + std::vector<Err> errors; + if (!CheckFile(target, file, &errors)) { std::lock_guard<std::mutex> lock(lock_); - errors_.push_back(err); + errors_.insert(errors_.end(), errors.begin(), errors.end()); } if (!task_count_.Decrement()) { @@ -262,7 +262,7 @@ bool HeaderChecker::CheckFile(const Target* from_target, const SourceFile& file, - Err* err) const { + std::vector<Err>* errors) const { ScopedTrace trace(TraceItem::TRACE_CHECK_HEADER, file.value()); // Sometimes you have generated source files included as sources in another @@ -275,11 +275,11 @@ base::FilePath path = build_settings_->GetFullPath(file); std::string contents; if (!base::ReadFileToString(path, &contents)) { - *err = - Err(from_target->defined_from(), "Source file not found.", - "The target:\n " + from_target->label().GetUserVisibleName(false) + - "\nhas a source file:\n " + file.value() + - "\nwhich was not found."); + errors->emplace_back(from_target->defined_from(), "Source file not found.", + "The target:\n " + + from_target->label().GetUserVisibleName(false) + + "\nhas a source file:\n " + file.value() + + "\nwhich was not found."); return false; } @@ -295,19 +295,23 @@ target_include_dirs.end()); } + bool has_errors = false; CIncludeIterator iter(&input_file); base::StringPiece current_include; LocationRange range; while (iter.GetNextIncludeString(¤t_include, &range)) { + Err err; SourceFile include = SourceFileForInclude(current_include, include_dirs, - input_file, range, err); + input_file, range, &err); if (!include.is_null()) { - if (!CheckInclude(from_target, input_file, include, range, err)) - return false; + if (!CheckInclude(from_target, input_file, include, range, &err)) { + errors->emplace_back(std::move(err)); + has_errors = true; + } } } - return true; + return !has_errors; } // If the file exists:
diff --git a/tools/gn/header_checker.h b/tools/gn/header_checker.h index 9fde97c..ef14729 100644 --- a/tools/gn/header_checker.h +++ b/tools/gn/header_checker.h
@@ -117,7 +117,7 @@ // error messages. bool CheckFile(const Target* from_target, const SourceFile& file, - Err* err) const; + std::vector<Err>* err) const; // Checks that the given file in the given target can include the given // include file. If disallowed, returns false and sets the error. The