| // Copyright 2014 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_TEMPLATE_H_ |
| #define TOOLS_GN_TEMPLATE_H_ |
| |
| #include <memory> |
| #include <vector> |
| |
| #include "base/memory/ref_counted.h" |
| |
| class BlockNode; |
| class Err; |
| class FunctionCallNode; |
| class LocationRange; |
| class Scope; |
| class Value; |
| |
| // Represents the information associated with a template() call in GN, which |
| // includes a closure and the code to run when the template is invoked. |
| // |
| // This class is immutable so we can reference it from multiple threads without |
| // locking. Normally, this will be associated with a .gni file and then a |
| // reference will be taken by each .gn file that imports it. These files might |
| // execute the template in parallel. |
| class Template : public base::RefCountedThreadSafe<Template> { |
| public: |
| // Makes a new closure based on the given scope. |
| Template(const Scope* scope, const FunctionCallNode* def); |
| |
| // Takes ownership of a previously-constructed closure. |
| Template(std::unique_ptr<Scope> closure, const FunctionCallNode* def); |
| |
| // Invoke the template. The values correspond to the state of the code |
| // invoking the template. The template name needs to be supplied since the |
| // template object itself doesn't know what name the calling code is using |
| // to refer to it (this is used to set defaults). |
| Value Invoke(Scope* scope, |
| const FunctionCallNode* invocation, |
| const std::string& template_name, |
| const std::vector<Value>& args, |
| BlockNode* block, |
| Err* err) const; |
| |
| // Returns the location range where this template was defined. |
| LocationRange GetDefinitionRange() const; |
| |
| private: |
| friend class base::RefCountedThreadSafe<Template>; |
| |
| Template(); |
| ~Template(); |
| |
| // It's important that this Scope is const. A template can be referenced by |
| // the root BUILDCONFIG file and then duplicated to all threads. Therefore, |
| // this scope must be usable from multiple threads at the same time. |
| // |
| // When executing a template, a new scope will be created as a child of this |
| // one, which will reference it as mutable or not according to the mutability |
| // of this value. |
| std::unique_ptr<const Scope> closure_; |
| |
| const FunctionCallNode* definition_; |
| }; |
| |
| #endif // TOOLS_GN_TEMPLATE_H_ |