Index: tools/gn/builder_record.h |
diff --git a/tools/gn/builder_record.h b/tools/gn/builder_record.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..aadd21e371b33c856f135e3a116bfb8c73560f1c |
--- /dev/null |
+++ b/tools/gn/builder_record.h |
@@ -0,0 +1,112 @@ |
+// 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. |
+ |
+#ifndef TOOLS_GN_BUILDER_RECORD_H_ |
+#define TOOLS_GN_BUILDER_RECORD_H_ |
+ |
+#include <set> |
+ |
+#include "base/basictypes.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "tools/gn/item.h" |
+#include "tools/gn/location.h" |
+ |
+class ParseNode; |
+ |
+// This class is used by the builder to manage the loading of the dependency |
+// tree. It holds a reference to an item and links to other records that the |
+// item depends on, both resolved ones, and unresolved ones. |
+// |
+// If a target depends on another one that hasn't been defined yet, we'll make |
+// a placeholder BuilderRecord with no item, and try to load the buildfile |
+// associated with the new item. The item will get filled in when we encounter |
+// the declaration for the item (or when we're done and realize there are |
+// undefined items). |
+// |
+// You can also have null item pointers when the target is not required for |
+// the current build (should_generate is false). |
+class BuilderRecord { |
+ public: |
+ typedef std::set<BuilderRecord*> BuilderRecordSet; |
+ |
+ enum ItemType { |
+ ITEM_UNKNOWN, |
+ ITEM_TARGET, |
+ ITEM_CONFIG, |
+ ITEM_TOOLCHAIN |
+ }; |
+ |
+ //BuilderRecord(); |
+ BuilderRecord(ItemType type, const Label& label); |
+ ~BuilderRecord(); |
+ |
+ ItemType type() const { return type_; } |
+ const Label& label() const { return label_; } |
+ |
+ // Returns a user-ready name for the given type. e.g. "target". |
+ static const char* GetNameForType(ItemType type); |
+ |
+ // Returns true if the given item is of the given type. |
+ static bool IsItemOfType(const Item* item, ItemType type); |
+ |
+ // Returns the type enum for the given item. |
+ static ItemType TypeOfItem(const Item* item); |
+ |
+ Item* item() { return item_.get(); } |
+ const Item* item() const { return item_.get(); } |
+ void set_item(scoped_ptr<Item> item) { item_ = item.Pass(); } |
+ |
+ // Indicates from where this item was originally referenced from that caused |
+ // it to be loaded. For targets for which we encountered the declaration |
+ // before a reference, this will be the empty range. |
+ const ParseNode* originally_referenced_from() const { |
+ return originally_referenced_from_; |
+ } |
+ void set_originally_referenced_from(const ParseNode* pn) { |
+ originally_referenced_from_ = pn; |
+ } |
+ |
+ bool should_generate() const { return should_generate_; } |
+ void set_should_generate(bool sg) { should_generate_ = sg; } |
+ |
+ bool resolved() const { return resolved_; } |
+ void set_resolved(bool r) { resolved_ = r; } |
+ |
+ bool can_resolve() const { |
+ return item_ && unresolved_deps_.empty(); |
+ } |
+ |
+ // All records this one is depending on. |
+ BuilderRecordSet& all_deps() { return all_deps_; } |
+ const BuilderRecordSet& all_deps() const { return all_deps_; } |
+ |
+ // Unresolved records this one is depending on. A subset of all... above. |
+ BuilderRecordSet& unresolved_deps() { return unresolved_deps_; } |
+ const BuilderRecordSet& unresolved_deps() const { return unresolved_deps_; } |
+ |
+ // Records that are waiting on this one to be resolved. This is the other |
+ // end of the "unresolved deps" arrow. |
+ BuilderRecordSet& waiting_on_resolution() { return waiting_on_resolution_; } |
+ const BuilderRecordSet& waiting_on_resolution() const { |
+ return waiting_on_resolution_; |
+ } |
+ |
+ void AddDep(BuilderRecord* record); |
+ |
+ private: |
+ ItemType type_; |
+ Label label_; |
+ scoped_ptr<Item> item_; |
+ const ParseNode* originally_referenced_from_; |
+ bool should_generate_; |
+ bool resolved_; |
+ |
+ BuilderRecordSet all_deps_; |
+ BuilderRecordSet unresolved_deps_; |
+ BuilderRecordSet waiting_on_resolution_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(BuilderRecord); |
+}; |
+ |
+#endif // TOOLS_GN_BUILDER_RECORD_H_ |