Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(751)

Unified Diff: tools/gn/file_template.h

Issue 429423002: Refactor GN source expansions. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/gn/escape.cc ('k') | tools/gn/file_template.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/gn/file_template.h
diff --git a/tools/gn/file_template.h b/tools/gn/file_template.h
deleted file mode 100644
index 2071336c9f5eda7d9a62c346a421bddc0636f91b..0000000000000000000000000000000000000000
--- a/tools/gn/file_template.h
+++ /dev/null
@@ -1,177 +0,0 @@
-// 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_FILE_TEMPLATE_H_
-#define TOOLS_GN_FILE_TEMPLATE_H_
-
-#include <iosfwd>
-
-#include "base/basictypes.h"
-#include "base/containers/stack_container.h"
-#include "tools/gn/err.h"
-#include "tools/gn/source_dir.h"
-#include "tools/gn/value.h"
-
-struct EscapeOptions;
-class ParseNode;
-class Settings;
-class SourceFile;
-class Target;
-
-extern const char kSourceExpansion_Help[];
-
-// A FileTemplate object implements source expansion for a given "template"
-// (either outputs or args, depending on the target type).
-//
-// There are two ways you can use this. You can make a template and then
-// apply a source to it to get a list of outputs manually. Or you can do the
-// actual substitution in Ninja, writing the arguments in a rule and using
-// variables in build statements to invoke the rule with the right
-// substitutions.
-class FileTemplate {
- public:
- enum OutputStyle {
- OUTPUT_ABSOLUTE, // Dirs will be absolute "//foo/bar".
- OUTPUT_RELATIVE, // Dirs will be relative to a given directory.
- };
-
- struct Subrange {
- // See the help in the .cc file for what these mean.
- enum Type {
- LITERAL = 0,
-
- SOURCE, // {{source}}
- NAME_PART, // {{source_name_part}}
- FILE_PART, // {{source_file_part}}
- SOURCE_DIR, // {{source_dir}}
- ROOT_RELATIVE_DIR, // {{root_relative_dir}}
- SOURCE_GEN_DIR, // {{source_gen_dir}}
- SOURCE_OUT_DIR, // {{source_out_dir}}
-
- NUM_TYPES // Must be last
- };
- Subrange(Type t, const std::string& l = std::string())
- : type(t),
- literal(l) {
- }
-
- Type type;
-
- // When type_ == LITERAL, this specifies the literal.
- std::string literal;
- };
-
- // Constructs a template from the given value. On error, the err will be
- // set. In this case you should not use this object.
- FileTemplate(const Settings* settings,
- const Value& t,
- OutputStyle output_style,
- const SourceDir& relative_to,
- Err* err);
- FileTemplate(const Settings* settings,
- const std::vector<std::string>& t,
- OutputStyle output_style,
- const SourceDir& relative_to);
- FileTemplate(const Settings* settings,
- const std::vector<SourceFile>& t,
- OutputStyle output_style,
- const SourceDir& relative_to);
-
- ~FileTemplate();
-
- // Returns an output template representing the given target's script
- // outputs.
- static FileTemplate GetForTargetOutputs(const Target* target);
-
- // Returns true if the given substitution type is used by this template.
- bool IsTypeUsed(Subrange::Type type) const;
-
- // Returns true if there are any substitutions.
- bool has_substitutions() const { return has_substitutions_; }
-
- // Applies the template to one source file. The results will be *appended* to
- // the output.
- void Apply(const SourceFile& source,
- std::vector<std::string>* output) const;
-
- // Writes a string representing the template with Ninja variables for the
- // substitutions, and the literals escaped for Ninja consumption.
- //
- // For example, if the input is "foo{{source_name_part}}bar" this will write
- // foo${source_name_part}bar. If there are multiple templates (we were
- // constucted with a list of more than one item) then the values will be
- // separated by spaces.
- //
- // If this template is nonempty, we will first print out a space to separate
- // it from the previous command.
- //
- // The names used for the Ninja variables will be the same ones used by
- // WriteNinjaVariablesForSubstitution. You would use this to define the Ninja
- // rule, and then define the variables to substitute for each file using
- // WriteNinjaVariablesForSubstitution.
- void WriteWithNinjaExpansions(std::ostream& out) const;
-
- // Writes to the given stream the variable declarations for extracting the
- // required parts of the given source file string. The results will be
- // indented two spaces.
- //
- // This is used to set up a build statement to invoke a rule where the rule
- // contains a representation of this file template to be expanded by Ninja
- // (see GetWithNinjaExpansions).
- void WriteNinjaVariablesForSubstitution(
- std::ostream& out,
- const SourceFile& source,
- const EscapeOptions& escape_options) const;
-
- // Returns the Ninja variable name used by the above Ninja functions to
- // substitute for the given type.
- static const char* GetNinjaVariableNameForType(Subrange::Type type);
-
- // Extracts the given type of substitution from the given source file.
- // If output_style is OUTPUT_RELATIVE, relative_to indicates the directory
- // that the relative directories should be relative to, otherwise it is
- // ignored.
- static std::string GetSubstitution(const Settings* settings,
- const SourceFile& source,
- Subrange::Type type,
- OutputStyle output_style,
- const SourceDir& relative_to);
-
- // Known template types, these include the "{{ }}".
- // IF YOU ADD NEW ONES: If the expansion expands to something inside the
- // output directory, also update EnsureStringIsInOutputDir.
- static const char kSource[];
- static const char kSourceNamePart[];
- static const char kSourceFilePart[];
- static const char kSourceDir[];
- static const char kRootRelDir[];
- static const char kSourceGenDir[];
- static const char kSourceOutDir[];
-
- private:
- typedef base::StackVector<Subrange, 8> Template;
- typedef base::StackVector<Template, 8> TemplateVector;
-
- void ParseInput(const Value& value, Err* err);
-
- // Parses a template string and adds it to the templates_ list.
- void ParseOneTemplateString(const std::string& str);
-
- const Settings* settings_;
- OutputStyle output_style_;
- SourceDir relative_to_;
-
- TemplateVector templates_;
-
- // The corresponding value is set to true if the given subrange type is
- // required. This allows us to precompute these types whem applying them
- // to a given source file.
- bool types_required_[Subrange::NUM_TYPES];
-
- // Set when any of the types_required_ is true. Otherwise, everythins is a
- // literal (a common case so we can optimize some code paths).
- bool has_substitutions_;
-};
-
-#endif // TOOLS_GN_FILE_TEMPLATE_H_
« no previous file with comments | « tools/gn/escape.cc ('k') | tools/gn/file_template.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698