summaryrefslogtreecommitdiffstats
path: root/tools/gn/scope.cc
diff options
context:
space:
mode:
Diffstat (limited to 'tools/gn/scope.cc')
-rw-r--r--tools/gn/scope.cc372
1 files changed, 0 insertions, 372 deletions
diff --git a/tools/gn/scope.cc b/tools/gn/scope.cc
deleted file mode 100644
index 72664d7..0000000
--- a/tools/gn/scope.cc
+++ /dev/null
@@ -1,372 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "tools/gn/scope.h"
-
-#include "base/logging.h"
-#include "base/stl_util.h"
-#include "tools/gn/parse_tree.h"
-
-namespace {
-
-// FLags set in the mode_flags_ of a scope. If a bit is set, it applies
-// recursively to all dependent scopes.
-const unsigned kProcessingBuildConfigFlag = 1;
-const unsigned kProcessingDefaultBuildConfigFlag = 2;
-const unsigned kProcessingImportFlag = 4;
-
-} // namespace
-
-Scope::Scope(const Settings* settings)
- : const_containing_(NULL),
- mutable_containing_(NULL),
- settings_(settings),
- mode_flags_(0) {
-}
-
-Scope::Scope(Scope* parent)
- : const_containing_(NULL),
- mutable_containing_(parent),
- settings_(parent->settings()),
- mode_flags_(0) {
-}
-
-Scope::Scope(const Scope* parent)
- : const_containing_(parent),
- mutable_containing_(NULL),
- settings_(parent->settings()),
- mode_flags_(0) {
-}
-
-Scope::~Scope() {
- STLDeleteContainerPairSecondPointers(target_defaults_.begin(),
- target_defaults_.end());
-}
-
-const Value* Scope::GetValue(const base::StringPiece& ident,
- bool counts_as_used) {
- // First check for programatically-provided values.
- for (ProviderSet::const_iterator i = programmatic_providers_.begin();
- i != programmatic_providers_.end(); ++i) {
- const Value* v = (*i)->GetProgrammaticValue(ident);
- if (v)
- return v;
- }
-
- RecordMap::iterator found = values_.find(ident);
- if (found != values_.end()) {
- if (counts_as_used)
- found->second.used = true;
- return &found->second.value;
- }
-
- // Search in the parent scope.
- if (const_containing_)
- return const_containing_->GetValue(ident);
- if (mutable_containing_)
- return mutable_containing_->GetValue(ident, counts_as_used);
- return NULL;
-}
-
-Value* Scope::GetValueForcedToCurrentScope(const base::StringPiece& ident,
- const ParseNode* set_node) {
- RecordMap::iterator found = values_.find(ident);
- if (found != values_.end())
- return &found->second.value; // Already have in the current scope.
-
- // Search in the parent scope.
- if (containing()) {
- const Value* in_containing = containing()->GetValue(ident);
- if (in_containing) {
- // Promote to current scope.
- return SetValue(ident, *in_containing, set_node);
- }
- }
- return NULL;
-}
-
-const Value* Scope::GetValue(const base::StringPiece& ident) const {
- RecordMap::const_iterator found = values_.find(ident);
- if (found != values_.end())
- return &found->second.value;
- if (containing())
- return containing()->GetValue(ident);
- return NULL;
-}
-
-Value* Scope::SetValue(const base::StringPiece& ident,
- const Value& v,
- const ParseNode* set_node) {
- Record& r = values_[ident]; // Clears any existing value.
- r.value = v;
- r.value.set_origin(set_node);
- return &r.value;
-}
-
-bool Scope::AddTemplate(const std::string& name, const FunctionCallNode* decl) {
- if (GetTemplate(name))
- return false;
- templates_[name] = decl;
- return true;
-}
-
-const FunctionCallNode* Scope::GetTemplate(const std::string& name) const {
- TemplateMap::const_iterator found = templates_.find(name);
- if (found != templates_.end())
- return found->second;
- if (containing())
- return containing()->GetTemplate(name);
- return NULL;
-}
-
-void Scope::MarkUsed(const base::StringPiece& ident) {
- RecordMap::iterator found = values_.find(ident);
- if (found == values_.end()) {
- NOTREACHED();
- return;
- }
- found->second.used = true;
-}
-
-void Scope::MarkUnused(const base::StringPiece& ident) {
- RecordMap::iterator found = values_.find(ident);
- if (found == values_.end()) {
- NOTREACHED();
- return;
- }
- found->second.used = false;
-}
-
-bool Scope::IsSetButUnused(const base::StringPiece& ident) const {
- RecordMap::const_iterator found = values_.find(ident);
- if (found != values_.end()) {
- if (!found->second.used) {
- return true;
- }
- }
- return false;
-}
-
-bool Scope::CheckForUnusedVars(Err* err) const {
- for (RecordMap::const_iterator i = values_.begin();
- i != values_.end(); ++i) {
- if (!i->second.used) {
- std::string help = "You set the variable \"" + i->first.as_string() +
- "\" here and it was unused before it went\nout of scope.";
-
- const BinaryOpNode* binary = i->second.value.origin()->AsBinaryOp();
- if (binary) {
- // Make a nicer error message for normal var sets.
- *err = Err(binary->left()->GetRange(), "Assignment had no effect.",
- help);
- } else {
- // This will happen for internally-generated variables.
- *err = Err(i->second.value.origin(), "Assignment had no effect.", help);
- }
- return false;
- }
- }
- return true;
-}
-
-void Scope::GetCurrentScopeValues(KeyValueVector* output) const {
- output->reserve(values_.size());
- for (RecordMap::const_iterator i = values_.begin(); i != values_.end(); ++i) {
- output->push_back(std::make_pair(i->first, i->second.value));
- }
-}
-
-bool Scope::NonRecursiveMergeTo(Scope* dest,
- const ParseNode* node_for_err,
- const char* desc_for_err,
- Err* err) const {
- // Values.
- for (RecordMap::const_iterator i = values_.begin(); i != values_.end(); ++i) {
- const Value* existing_value = dest->GetValue(i->first);
- if (existing_value) {
- // Value present in both the source and the dest.
- std::string desc_string(desc_for_err);
- *err = Err(node_for_err, "Value collision.",
- "This " + desc_string + " contains \"" + i->first.as_string() + "\"");
- err->AppendSubErr(Err(i->second.value, "defined here.",
- "Which would clobber the one in your current scope"));
- err->AppendSubErr(Err(*existing_value, "defined here.",
- "Executing " + desc_string + " should not conflict with anything "
- "in the current\nscope."));
- return false;
- }
- dest->values_[i->first] = i->second;
- }
-
- // Target defaults are owning pointers.
- for (NamedScopeMap::const_iterator i = target_defaults_.begin();
- i != target_defaults_.end(); ++i) {
- if (dest->GetTargetDefaults(i->first)) {
- // TODO(brettw) it would be nice to know the origin of a
- // set_target_defaults so we can give locations for the colliding target
- // defaults.
- std::string desc_string(desc_for_err);
- *err = Err(node_for_err, "Target defaults collision.",
- "This " + desc_string + " contains target defaults for\n"
- "\"" + i->first + "\" which would clobber one for the\n"
- "same target type in your current scope. It's unfortunate that I'm "
- "too stupid\nto tell you the location of where the target defaults "
- "were set. Usually\nthis happens in the BUILDCONFIG.gn file.");
- return false;
- }
-
- Scope* s = new Scope(settings_);
- i->second->NonRecursiveMergeTo(s, node_for_err, "<SHOULDN'T HAPPEN>", err);
- dest->target_defaults_[i->first] = s;
- }
-
- // Sources assignment filter.
- if (sources_assignment_filter_) {
- if (dest->GetSourcesAssignmentFilter()) {
- // Sources assignment filter present in both the source and the dest.
- std::string desc_string(desc_for_err);
- *err = Err(node_for_err, "Assignment filter collision.",
- "The " + desc_string + " contains a sources_assignment_filter which\n"
- "would clobber the one in your current scope.");
- return false;
- }
- dest->sources_assignment_filter_.reset(
- new PatternList(*sources_assignment_filter_));
- }
-
- // Templates.
- for (TemplateMap::const_iterator i = templates_.begin();
- i != templates_.end(); ++i) {
- const FunctionCallNode* existing_template = dest->GetTemplate(i->first);
- if (existing_template) {
- // Rule present in both the source and the dest.
- std::string desc_string(desc_for_err);
- *err = Err(node_for_err, "Template collision.",
- "This " + desc_string + " contains a template \"" + i->first + "\"");
- err->AppendSubErr(Err(i->second->function(), "defined here.",
- "Which would clobber the one in your current scope"));
- err->AppendSubErr(Err(existing_template->function(), "defined here.",
- "Executing " + desc_string + " should not conflict with anything "
- "in the current\nscope."));
- return false;
- }
- dest->templates_.insert(*i);
- }
-
- return true;
-}
-
-Scope* Scope::MakeTargetDefaults(const std::string& target_type) {
- if (GetTargetDefaults(target_type))
- return NULL;
-
- Scope** dest = &target_defaults_[target_type];
- if (*dest) {
- NOTREACHED(); // Already set.
- return *dest;
- }
- *dest = new Scope(settings_);
- return *dest;
-}
-
-const Scope* Scope::GetTargetDefaults(const std::string& target_type) const {
- NamedScopeMap::const_iterator found = target_defaults_.find(target_type);
- if (found != target_defaults_.end())
- return found->second;
- if (containing())
- return containing()->GetTargetDefaults(target_type);
- return NULL;
-}
-
-const PatternList* Scope::GetSourcesAssignmentFilter() const {
- if (sources_assignment_filter_)
- return sources_assignment_filter_.get();
- if (containing())
- return containing()->GetSourcesAssignmentFilter();
- return NULL;
-}
-
-void Scope::SetProcessingBuildConfig() {
- DCHECK((mode_flags_ & kProcessingBuildConfigFlag) == 0);
- mode_flags_ |= kProcessingBuildConfigFlag;
-}
-
-void Scope::ClearProcessingBuildConfig() {
- DCHECK(mode_flags_ & kProcessingBuildConfigFlag);
- mode_flags_ &= ~(kProcessingBuildConfigFlag);
-}
-
-bool Scope::IsProcessingBuildConfig() const {
- if (mode_flags_ & kProcessingBuildConfigFlag)
- return true;
- if (containing())
- return containing()->IsProcessingBuildConfig();
- return false;
-}
-
-void Scope::SetProcessingDefaultBuildConfig() {
- DCHECK((mode_flags_ & kProcessingDefaultBuildConfigFlag) == 0);
- mode_flags_ |= kProcessingDefaultBuildConfigFlag;
-}
-
-void Scope::ClearProcessingDefaultBuildConfig() {
- DCHECK(mode_flags_ & kProcessingDefaultBuildConfigFlag);
- mode_flags_ &= ~(kProcessingDefaultBuildConfigFlag);
-}
-
-bool Scope::IsProcessingDefaultBuildConfig() const {
- if (mode_flags_ & kProcessingDefaultBuildConfigFlag)
- return true;
- if (containing())
- return containing()->IsProcessingDefaultBuildConfig();
- return false;
-}
-
-void Scope::SetProcessingImport() {
- DCHECK((mode_flags_ & kProcessingImportFlag) == 0);
- mode_flags_ |= kProcessingImportFlag;
-}
-
-void Scope::ClearProcessingImport() {
- DCHECK(mode_flags_ & kProcessingImportFlag);
- mode_flags_ &= ~(kProcessingImportFlag);
-}
-
-bool Scope::IsProcessingImport() const {
- if (mode_flags_ & kProcessingImportFlag)
- return true;
- if (containing())
- return containing()->IsProcessingImport();
- return false;
-}
-
-void Scope::SetProperty(const void* key, void* value) {
- if (!value) {
- DCHECK(properties_.find(key) != properties_.end());
- properties_.erase(key);
- } else {
- properties_[key] = value;
- }
-}
-
-void* Scope::GetProperty(const void* key, const Scope** found_on_scope) const {
- PropertyMap::const_iterator found = properties_.find(key);
- if (found != properties_.end()) {
- if (found_on_scope)
- *found_on_scope = this;
- return found->second;
- }
- if (containing())
- return containing()->GetProperty(key, found_on_scope);
- return NULL;
-}
-
-void Scope::AddProvider(ProgrammaticProvider* p) {
- programmatic_providers_.insert(p);
-}
-
-void Scope::RemoveProvider(ProgrammaticProvider* p) {
- DCHECK(programmatic_providers_.find(p) != programmatic_providers_.end());
- programmatic_providers_.erase(p);
-}