| // 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_ |