OLD | NEW |
(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 } |
OLD | NEW |