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