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

Side by Side Diff: tools/gn/value_extractors.cc

Issue 21114002: Add initial prototype for the GN meta-buildsystem. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add owners and readme Created 7 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « tools/gn/value_extractors.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "tools/gn/value_extractors.h"
6
7 #include "tools/gn/err.h"
8 #include "tools/gn/label.h"
9 #include "tools/gn/source_dir.h"
10 #include "tools/gn/source_file.h"
11
12 namespace {
13
14 // This extractor rejects files with system-absolute file paths. If we need
15 // that in the future, we'll have to add some flag to control this.
16 struct RelativeFileConverter {
17 RelativeFileConverter(const SourceDir& current_dir_in)
18 : current_dir(current_dir_in) {}
19 bool operator()(const Value& v, SourceFile* out, Err* err) const {
20 if (!v.VerifyTypeIs(Value::STRING, err))
21 return false;
22 *out = current_dir.ResolveRelativeFile(v.string_value());
23 if (out->is_system_absolute()) {
24 *err = Err(v, "System-absolute file path.",
25 "You can't list a system-absolute file path here. Please include "
26 "only files in\nthe source tree. Maybe you meant to begin with two "
27 "slashes to indicate an\nabsolute path in the source tree?");
28 return false;
29 }
30 return true;
31 }
32 const SourceDir& current_dir;
33 };
34
35 struct RelativeDirConverter {
36 RelativeDirConverter(const SourceDir& current_dir_in)
37 : current_dir(current_dir_in) {}
38 bool operator()(const Value& v, SourceDir* out, Err* err) const {
39 if (!v.VerifyTypeIs(Value::STRING, err))
40 return false;
41 *out = current_dir.ResolveRelativeDir(v.string_value());
42 return true;
43 }
44 const SourceDir& current_dir;
45 };
46
47 struct LabelResolver {
48 LabelResolver(const SourceDir& current_dir_in,
49 const Label& current_toolchain_in)
50 : current_dir(current_dir_in),
51 current_toolchain(current_toolchain_in) {}
52 bool operator()(const Value& v, Label* out, Err* err) const {
53 if (!v.VerifyTypeIs(Value::STRING, err))
54 return false;
55 *out = Label::Resolve(current_dir, current_toolchain, v, err);
56 return !err->has_error();
57 }
58 const SourceDir& current_dir;
59 const Label& current_toolchain;
60 };
61
62 } // namespace
63
64 bool ExtractListOfStringValues(const Value& value,
65 std::vector<std::string>* dest,
66 Err* err) {
67 if (!value.VerifyTypeIs(Value::LIST, err))
68 return false;
69 const std::vector<Value>& input_list = value.list_value();
70 dest->reserve(input_list.size());
71 for (size_t i = 0; i < input_list.size(); i++) {
72 if (!input_list[i].VerifyTypeIs(Value::STRING, err))
73 return false;
74 dest->push_back(input_list[i].string_value());
75 }
76 return true;
77 }
78
79 bool ExtractListOfRelativeFiles(const Value& value,
80 const SourceDir& current_dir,
81 std::vector<SourceFile>* files,
82 Err* err) {
83 return ListValueExtractor(value, files, err,
84 RelativeFileConverter(current_dir));
85 }
86
87 bool ExtractListOfRelativeDirs(const Value& value,
88 const SourceDir& current_dir,
89 std::vector<SourceDir>* dest,
90 Err* err) {
91 return ListValueExtractor(value, dest, err,
92 RelativeDirConverter(current_dir));
93 }
94
95 bool ExtractListOfLabels(const Value& value,
96 const SourceDir& current_dir,
97 const Label& current_toolchain,
98 std::vector<Label>* dest,
99 Err* err) {
100 return ListValueExtractor(value, dest, err,
101 LabelResolver(current_dir, current_toolchain));
102 }
OLDNEW
« no previous file with comments | « tools/gn/value_extractors.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698