1d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// found in the LICENSE file.
4d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
5d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#ifndef TOOLS_GN_ITEM_H_
6d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#define TOOLS_GN_ITEM_H_
7d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
8d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include <string>
9d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
10d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/label.h"
11e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "tools/gn/visibility.h"
12d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
13d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass Config;
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ParseNode;
150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)class Settings;
16d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass Target;
17d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass Toolchain;
18d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
19d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// A named item (target, config, etc.) that participates in the dependency
20d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// graph.
21d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass Item {
22d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public:
230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  Item(const Settings* settings, const Label& label);
24d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  virtual ~Item();
25d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  const Settings* settings() const { return settings_; }
270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // This is guaranteed to never change after construction so this can be
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // accessed from any thread with no locking once the item is constructed.
30d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  const Label& label() const { return label_; }
31d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const ParseNode* defined_from() const { return defined_from_; }
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void set_defined_from(const ParseNode* df) { defined_from_ = df; }
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
35e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  Visibility& visibility() { return visibility_; }
36e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  const Visibility& visibility() const { return visibility_; }
37e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
38d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // Manual RTTI.
39d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  virtual Config* AsConfig();
40d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  virtual const Config* AsConfig() const;
41d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  virtual Target* AsTarget();
42d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  virtual const Target* AsTarget() const;
43d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  virtual Toolchain* AsToolchain();
44d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  virtual const Toolchain* AsToolchain() const;
45d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
46d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // Returns a name like "target" or "config" for the type of item this is, to
47d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // be used in logging and error messages.
48d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  std::string GetItemTypeName() const;
49d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
50d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // Called when this item is resolved, meaning it and all of its dependents
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // have no unresolved deps. Returns true on success. Sets the error and
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // returns false on failure.
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual bool OnResolved(Err* err);
54d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
55d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private:
560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  const Settings* settings_;
57d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  Label label_;
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const ParseNode* defined_from_;
59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  Visibility visibility_;
61d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
62d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
63d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#endif  // TOOLS_GN_ITEM_H_
64