Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(66)

Side by Side Diff: tools/gn/scope.cc

Issue 2940873002: Implement tracking of BUILD.gn files used to define target, toolchain or (Closed)
Patch Set: Fix compilation after rebase. Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « tools/gn/scope.h ('k') | tools/gn/scope_per_file_provider_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "tools/gn/scope.h" 5 #include "tools/gn/scope.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/memory/ptr_util.h" 8 #include "base/memory/ptr_util.h"
9 #include "tools/gn/parse_tree.h" 9 #include "tools/gn/parse_tree.h"
10 #include "tools/gn/source_file.h"
10 #include "tools/gn/template.h" 11 #include "tools/gn/template.h"
11 12
12 namespace { 13 namespace {
13 14
14 // FLags set in the mode_flags_ of a scope. If a bit is set, it applies 15 // FLags set in the mode_flags_ of a scope. If a bit is set, it applies
15 // recursively to all dependent scopes. 16 // recursively to all dependent scopes.
16 const unsigned kProcessingBuildConfigFlag = 1; 17 const unsigned kProcessingBuildConfigFlag = 1;
17 const unsigned kProcessingImportFlag = 2; 18 const unsigned kProcessingImportFlag = 2;
18 19
19 // Returns true if this variable name should be considered private. Private 20 // Returns true if this variable name should be considered private. Private
(...skipping 12 matching lines...) Expand all
32 mark_dest_used(false) { 33 mark_dest_used(false) {
33 } 34 }
34 35
35 Scope::MergeOptions::~MergeOptions() { 36 Scope::MergeOptions::~MergeOptions() {
36 } 37 }
37 38
38 Scope::ProgrammaticProvider::~ProgrammaticProvider() { 39 Scope::ProgrammaticProvider::~ProgrammaticProvider() {
39 scope_->RemoveProvider(this); 40 scope_->RemoveProvider(this);
40 } 41 }
41 42
42 Scope::Scope(const Settings* settings) 43 Scope::Scope(const Settings* settings, const InputFileSet& input_files)
43 : const_containing_(nullptr), 44 : const_containing_(nullptr),
44 mutable_containing_(nullptr), 45 mutable_containing_(nullptr),
45 settings_(settings), 46 settings_(settings),
46 mode_flags_(0), 47 mode_flags_(0),
47 item_collector_(nullptr) { 48 item_collector_(nullptr),
48 } 49 input_files_(input_files) {}
49 50
50 Scope::Scope(Scope* parent) 51 Scope::Scope(Scope* parent)
51 : const_containing_(nullptr), 52 : const_containing_(nullptr),
52 mutable_containing_(parent), 53 mutable_containing_(parent),
53 settings_(parent->settings()), 54 settings_(parent->settings()),
54 mode_flags_(0), 55 mode_flags_(0),
55 item_collector_(nullptr) { 56 item_collector_(nullptr),
56 } 57 input_files_(parent->input_files_) {}
57 58
58 Scope::Scope(const Scope* parent) 59 Scope::Scope(const Scope* parent)
59 : const_containing_(parent), 60 : const_containing_(parent),
60 mutable_containing_(nullptr), 61 mutable_containing_(nullptr),
61 settings_(parent->settings()), 62 settings_(parent->settings()),
62 mode_flags_(0), 63 mode_flags_(0),
63 item_collector_(nullptr) { 64 item_collector_(nullptr),
64 } 65 input_files_(parent->input_files_) {}
65 66
66 Scope::~Scope() { 67 Scope::~Scope() {
67 } 68 }
68 69
69 void Scope::DetachFromContaining() { 70 void Scope::DetachFromContaining() {
70 const_containing_ = nullptr; 71 const_containing_ = nullptr;
71 mutable_containing_ = nullptr; 72 mutable_containing_ = nullptr;
72 } 73 }
73 74
74 bool Scope::HasValues(SearchNested search_nested) const { 75 bool Scope::HasValues(SearchNested search_nested) const {
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 "same target type in your current scope. It's unfortunate that " 343 "same target type in your current scope. It's unfortunate that "
343 "I'm too stupid\nto tell you the location of where the target " 344 "I'm too stupid\nto tell you the location of where the target "
344 "defaults were set. Usually\nthis happens in the BUILDCONFIG.gn " 345 "defaults were set. Usually\nthis happens in the BUILDCONFIG.gn "
345 "file or in a related .gni file.\n"); 346 "file or in a related .gni file.\n");
346 return false; 347 return false;
347 } 348 }
348 } 349 }
349 } 350 }
350 351
351 std::unique_ptr<Scope>& dest_scope = dest->target_defaults_[current_name]; 352 std::unique_ptr<Scope>& dest_scope = dest->target_defaults_[current_name];
352 dest_scope = base::MakeUnique<Scope>(settings_); 353 dest_scope = base::MakeUnique<Scope>(settings_, input_files_);
353 pair.second->NonRecursiveMergeTo(dest_scope.get(), options, node_for_err, 354 pair.second->NonRecursiveMergeTo(dest_scope.get(), options, node_for_err,
354 "<SHOULDN'T HAPPEN>", err); 355 "<SHOULDN'T HAPPEN>", err);
355 } 356 }
356 357
357 // Sources assignment filter. 358 // Sources assignment filter.
358 if (sources_assignment_filter_) { 359 if (sources_assignment_filter_) {
359 if (!options.clobber_existing) { 360 if (!options.clobber_existing) {
360 if (dest->GetSourcesAssignmentFilter()) { 361 if (dest->GetSourcesAssignmentFilter()) {
361 // Sources assignment filter present in both the source and the dest. 362 // Sources assignment filter present in both the source and the dest.
362 std::string desc_string(desc_for_err); 363 std::string desc_string(desc_for_err);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 "Executing " + desc_string + " should not conflict with anything " 401 "Executing " + desc_string + " should not conflict with anything "
401 "in the current\nscope.")); 402 "in the current\nscope."));
402 return false; 403 return false;
403 } 404 }
404 } 405 }
405 406
406 // Be careful to delete any pointer we're about to clobber. 407 // Be careful to delete any pointer we're about to clobber.
407 dest->templates_[current_name] = pair.second; 408 dest->templates_[current_name] = pair.second;
408 } 409 }
409 410
411 // Input files.
412 dest->input_files_.insert(input_files_.begin(), input_files_.end());
413
410 return true; 414 return true;
411 } 415 }
412 416
413 std::unique_ptr<Scope> Scope::MakeClosure() const { 417 std::unique_ptr<Scope> Scope::MakeClosure() const {
414 std::unique_ptr<Scope> result; 418 std::unique_ptr<Scope> result;
415 if (const_containing_) { 419 if (const_containing_) {
416 // We reached the top of the mutable scope stack. The result scope just 420 // We reached the top of the mutable scope stack. The result scope just
417 // references the const scope (which will never change). 421 // references the const scope (which will never change).
418 result.reset(new Scope(const_containing_)); 422 result.reset(new Scope(const_containing_));
419 } else if (mutable_containing_) { 423 } else if (mutable_containing_) {
420 // There are more nested mutable scopes. Recursively go up the stack to 424 // There are more nested mutable scopes. Recursively go up the stack to
421 // get the closure. 425 // get the closure.
422 result = mutable_containing_->MakeClosure(); 426 result = mutable_containing_->MakeClosure();
423 } else { 427 } else {
424 // This is a standalone scope, just copy it. 428 // This is a standalone scope, just copy it.
425 result.reset(new Scope(settings_)); 429 result.reset(new Scope(settings_, input_files_));
426 } 430 }
427 431
428 // Want to clobber since we've flattened some nested scopes, and our parent 432 // Want to clobber since we've flattened some nested scopes, and our parent
429 // scope may have a duplicate value set. 433 // scope may have a duplicate value set.
430 MergeOptions options; 434 MergeOptions options;
431 options.clobber_existing = true; 435 options.clobber_existing = true;
432 436
433 // Add in our variables and we're done. 437 // Add in our variables and we're done.
434 Err err; 438 Err err;
435 NonRecursiveMergeTo(result.get(), options, nullptr, "<SHOULDN'T HAPPEN>", 439 NonRecursiveMergeTo(result.get(), options, nullptr, "<SHOULDN'T HAPPEN>",
436 &err); 440 &err);
437 DCHECK(!err.has_error()); 441 DCHECK(!err.has_error());
438 return result; 442 return result;
439 } 443 }
440 444
441 Scope* Scope::MakeTargetDefaults(const std::string& target_type) { 445 Scope* Scope::MakeTargetDefaults(const std::string& target_type) {
442 std::unique_ptr<Scope>& dest = target_defaults_[target_type]; 446 std::unique_ptr<Scope>& dest = target_defaults_[target_type];
443 dest = base::MakeUnique<Scope>(settings_); 447 dest = base::MakeUnique<Scope>(settings_, input_files_);
444 return dest.get(); 448 return dest.get();
445 } 449 }
446 450
447 const Scope* Scope::GetTargetDefaults(const std::string& target_type) const { 451 const Scope* Scope::GetTargetDefaults(const std::string& target_type) const {
448 NamedScopeMap::const_iterator found = target_defaults_.find(target_type); 452 NamedScopeMap::const_iterator found = target_defaults_.find(target_type);
449 if (found != target_defaults_.end()) 453 if (found != target_defaults_.end())
450 return found->second.get(); 454 return found->second.get();
451 if (containing()) 455 if (containing())
452 return containing()->GetTargetDefaults(target_type); 456 return containing()->GetTargetDefaults(target_type);
453 return nullptr; 457 return nullptr;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 } 502 }
499 503
500 const SourceDir& Scope::GetSourceDir() const { 504 const SourceDir& Scope::GetSourceDir() const {
501 if (!source_dir_.is_null()) 505 if (!source_dir_.is_null())
502 return source_dir_; 506 return source_dir_;
503 if (containing()) 507 if (containing())
504 return containing()->GetSourceDir(); 508 return containing()->GetSourceDir();
505 return source_dir_; 509 return source_dir_;
506 } 510 }
507 511
512 void Scope::AddInputFile(const InputFile* input_file) {
513 input_files_.insert(input_file);
514 }
515
508 Scope::ItemVector* Scope::GetItemCollector() { 516 Scope::ItemVector* Scope::GetItemCollector() {
509 if (item_collector_) 517 if (item_collector_)
510 return item_collector_; 518 return item_collector_;
511 if (mutable_containing()) 519 if (mutable_containing())
512 return mutable_containing()->GetItemCollector(); 520 return mutable_containing()->GetItemCollector();
513 return nullptr; 521 return nullptr;
514 } 522 }
515 523
516 void Scope::SetProperty(const void* key, void* value) { 524 void Scope::SetProperty(const void* key, void* value) {
517 if (!value) { 525 if (!value) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
549 return false; 557 return false;
550 for (const auto& pair : a) { 558 for (const auto& pair : a) {
551 const auto& found_b = b.find(pair.first); 559 const auto& found_b = b.find(pair.first);
552 if (found_b == b.end()) 560 if (found_b == b.end())
553 return false; // Item in 'a' but not 'b'. 561 return false; // Item in 'a' but not 'b'.
554 if (pair.second.value != found_b->second.value) 562 if (pair.second.value != found_b->second.value)
555 return false; // Values for variable in 'a' and 'b' are different. 563 return false; // Values for variable in 'a' and 'b' are different.
556 } 564 }
557 return true; 565 return true;
558 } 566 }
OLDNEW
« no previous file with comments | « tools/gn/scope.h ('k') | tools/gn/scope_per_file_provider_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698