| Index: tools/gn/loader.cc
|
| diff --git a/tools/gn/loader.cc b/tools/gn/loader.cc
|
| index 32879ea63d3a3e513d9f0ce8054482da26c3deed..b49ebfda6da625bf63dc756e5f7129b3e8605d83 100644
|
| --- a/tools/gn/loader.cc
|
| +++ b/tools/gn/loader.cc
|
| @@ -19,6 +19,20 @@
|
| #include "tools/gn/source_file.h"
|
| #include "tools/gn/trace.h"
|
|
|
| +namespace {
|
| +
|
| +struct SourceFileAndOrigin {
|
| + SourceFileAndOrigin(const SourceFile& f, const LocationRange& o)
|
| + : file(f),
|
| + origin(o) {
|
| + }
|
| +
|
| + SourceFile file;
|
| + LocationRange origin;
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| // Identifies one time a file is loaded in a given toolchain so we don't load
|
| // it more than once.
|
| struct LoaderImpl::LoadID {
|
| @@ -60,7 +74,7 @@ struct LoaderImpl::ToolchainRecord {
|
| bool is_toolchain_loaded;
|
| bool is_config_loaded;
|
|
|
| - std::vector<SourceFile> waiting_on_me;
|
| + std::vector<SourceFileAndOrigin> waiting_on_me;
|
| };
|
|
|
| // -----------------------------------------------------------------------------
|
| @@ -73,8 +87,8 @@ Loader::Loader() {
|
| Loader::~Loader() {
|
| }
|
|
|
| -void Loader::Load(const Label& label) {
|
| - Load(BuildFileForLabel(label), label.GetToolchainLabel());
|
| +void Loader::Load(const Label& label, const LocationRange& origin) {
|
| + Load(BuildFileForLabel(label), origin, label.GetToolchainLabel());
|
| }
|
|
|
| // static
|
| @@ -96,7 +110,8 @@ LoaderImpl::~LoaderImpl() {
|
| }
|
|
|
| void LoaderImpl::Load(const SourceFile& file,
|
| - const Label& in_toolchain_name) {
|
| + const LocationRange& origin,
|
| + const Label& in_toolchain_name) {
|
| const Label& toolchain_name = in_toolchain_name.is_null()
|
| ? default_toolchain_label_ : in_toolchain_name;
|
| LoadID load_id(file, toolchain_name);
|
| @@ -117,7 +132,7 @@ void LoaderImpl::Load(const SourceFile& file,
|
| // toolchain name is.
|
| record->is_toolchain_loaded = true;
|
|
|
| - record->waiting_on_me.push_back(file);
|
| + record->waiting_on_me.push_back(SourceFileAndOrigin(file, origin));
|
| ScheduleLoadBuildConfig(&record->settings, Scope::KeyValueMap());
|
| return;
|
| }
|
| @@ -137,13 +152,13 @@ void LoaderImpl::Load(const SourceFile& file,
|
| toolchain_records_[toolchain_name] = record;
|
|
|
| // Schedule a load of the toolchain using the default one.
|
| - Load(BuildFileForLabel(toolchain_name), default_toolchain_label_);
|
| + Load(BuildFileForLabel(toolchain_name), origin, default_toolchain_label_);
|
| }
|
|
|
| if (record->is_config_loaded)
|
| - ScheduleLoadFile(&record->settings, file);
|
| + ScheduleLoadFile(&record->settings, origin, file);
|
| else
|
| - record->waiting_on_me.push_back(file);
|
| + record->waiting_on_me.push_back(SourceFileAndOrigin(file, origin));
|
| }
|
|
|
| void LoaderImpl::ToolchainLoaded(const Toolchain* toolchain) {
|
| @@ -188,10 +203,11 @@ const Settings* LoaderImpl::GetToolchainSettings(const Label& label) const {
|
| }
|
|
|
| void LoaderImpl::ScheduleLoadFile(const Settings* settings,
|
| + const LocationRange& origin,
|
| const SourceFile& file) {
|
| Err err;
|
| pending_loads_++;
|
| - if (!AsyncLoadFile(LocationRange(), settings->build_settings(), file,
|
| + if (!AsyncLoadFile(origin, settings->build_settings(), file,
|
| base::Bind(&LoaderImpl::BackgroundLoadFile, this,
|
| settings, file),
|
| &err)) {
|
| @@ -374,8 +390,10 @@ void LoaderImpl::DidLoadBuildConfig(const Label& label) {
|
| record->is_config_loaded = true;
|
|
|
| // Schedule all waiting file loads.
|
| - for (size_t i = 0; i < record->waiting_on_me.size(); i++)
|
| - ScheduleLoadFile(&record->settings, record->waiting_on_me[i]);
|
| + for (size_t i = 0; i < record->waiting_on_me.size(); i++) {
|
| + ScheduleLoadFile(&record->settings, record->waiting_on_me[i].origin,
|
| + record->waiting_on_me[i].file);
|
| + }
|
| record->waiting_on_me.clear();
|
|
|
| DecrementPendingLoads();
|
|
|