| OLD | NEW | 
|    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  Loading... | 
|   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  Loading... | 
|  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  Loading... | 
|  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  Loading... | 
|  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  Loading... | 
|  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 } | 
| OLD | NEW |