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