|  | // 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 <memory> | 
|  | #include <set> | 
|  | #include <utility> | 
|  |  | 
|  | #include "base/macros.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, | 
|  | ITEM_POOL | 
|  | }; | 
|  |  | 
|  | 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(std::unique_ptr<Item> item) { item_ = std::move(item); } | 
|  |  | 
|  | // 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_; | 
|  | std::unique_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_ |