| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "tools/gn/value_extractors.h" | 5 #include "tools/gn/value_extractors.h" |
| 6 | 6 |
| 7 #include "tools/gn/build_settings.h" | 7 #include "tools/gn/build_settings.h" |
| 8 #include "tools/gn/err.h" | 8 #include "tools/gn/err.h" |
| 9 #include "tools/gn/label.h" | 9 #include "tools/gn/label.h" |
| 10 #include "tools/gn/source_dir.h" | 10 #include "tools/gn/source_dir.h" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 *err = Err(item, "Duplicate item in list"); | 51 *err = Err(item, "Duplicate item in list"); |
| 52 size_t previous_index = dest->IndexOf(new_one); | 52 size_t previous_index = dest->IndexOf(new_one); |
| 53 err->AppendSubErr(Err(input_list[previous_index], | 53 err->AppendSubErr(Err(input_list[previous_index], |
| 54 "This was the previous definition.")); | 54 "This was the previous definition.")); |
| 55 return false; | 55 return false; |
| 56 } | 56 } |
| 57 } | 57 } |
| 58 return true; | 58 return true; |
| 59 } | 59 } |
| 60 | 60 |
| 61 // This extractor rejects files with system-absolute file paths. If we need | |
| 62 // that in the future, we'll have to add some flag to control this. | |
| 63 struct RelativeFileConverter { | 61 struct RelativeFileConverter { |
| 64 RelativeFileConverter(const BuildSettings* build_settings_in, | 62 RelativeFileConverter(const BuildSettings* build_settings_in, |
| 65 const SourceDir& current_dir_in) | 63 const SourceDir& current_dir_in) |
| 66 : build_settings(build_settings_in), | 64 : build_settings(build_settings_in), |
| 67 current_dir(current_dir_in) { | 65 current_dir(current_dir_in) { |
| 68 } | 66 } |
| 69 bool operator()(const Value& v, SourceFile* out, Err* err) const { | 67 bool operator()(const Value& v, SourceFile* out, Err* err) const { |
| 70 if (!v.VerifyTypeIs(Value::STRING, err)) | 68 if (!v.VerifyTypeIs(Value::STRING, err)) |
| 71 return false; | 69 return false; |
| 72 *out = current_dir.ResolveRelativeFile(v.string_value(), | 70 *out = current_dir.ResolveRelativeFile(v.string_value(), |
| 73 build_settings->root_path_utf8()); | 71 build_settings->root_path()); |
| 74 if (out->is_system_absolute()) { | |
| 75 *err = Err(v, "System-absolute file path.", | |
| 76 "You can't list a system-absolute file path here. Please include " | |
| 77 "only files in\nthe source tree. Maybe you meant to begin with two " | |
| 78 "slashes to indicate an\nabsolute path in the source tree?"); | |
| 79 return false; | |
| 80 } | |
| 81 return true; | 72 return true; |
| 82 } | 73 } |
| 83 const BuildSettings* build_settings; | 74 const BuildSettings* build_settings; |
| 84 const SourceDir& current_dir; | 75 const SourceDir& current_dir; |
| 85 }; | 76 }; |
| 86 | 77 |
| 87 struct RelativeDirConverter { | 78 struct RelativeDirConverter { |
| 88 RelativeDirConverter(const BuildSettings* build_settings_in, | 79 RelativeDirConverter(const BuildSettings* build_settings_in, |
| 89 const SourceDir& current_dir_in) | 80 const SourceDir& current_dir_in) |
| 90 : build_settings(build_settings_in), | 81 : build_settings(build_settings_in), |
| 91 current_dir(current_dir_in) { | 82 current_dir(current_dir_in) { |
| 92 } | 83 } |
| 93 bool operator()(const Value& v, SourceDir* out, Err* err) const { | 84 bool operator()(const Value& v, SourceDir* out, Err* err) const { |
| 94 if (!v.VerifyTypeIs(Value::STRING, err)) | 85 if (!v.VerifyTypeIs(Value::STRING, err)) |
| 95 return false; | 86 return false; |
| 96 *out = current_dir.ResolveRelativeDir(v.string_value(), | 87 *out = current_dir.ResolveRelativeDir(v.string_value(), |
| 97 build_settings->root_path_utf8()); | 88 build_settings->root_path()); |
| 98 return true; | 89 return true; |
| 99 } | 90 } |
| 100 const BuildSettings* build_settings; | 91 const BuildSettings* build_settings; |
| 101 const SourceDir& current_dir; | 92 const SourceDir& current_dir; |
| 102 }; | 93 }; |
| 103 | 94 |
| 104 // Fills in a label. | 95 // Fills in a label. |
| 105 template<typename T> struct LabelResolver { | 96 template<typename T> struct LabelResolver { |
| 106 LabelResolver(const SourceDir& current_dir_in, | 97 LabelResolver(const SourceDir& current_dir_in, |
| 107 const Label& current_toolchain_in) | 98 const Label& current_toolchain_in, |
| 99 const base::FilePath& source_root_in) |
| 108 : current_dir(current_dir_in), | 100 : current_dir(current_dir_in), |
| 109 current_toolchain(current_toolchain_in) {} | 101 current_toolchain(current_toolchain_in), |
| 102 source_root(source_root_in) {} |
| 110 bool operator()(const Value& v, Label* out, Err* err) const { | 103 bool operator()(const Value& v, Label* out, Err* err) const { |
| 111 if (!v.VerifyTypeIs(Value::STRING, err)) | 104 if (!v.VerifyTypeIs(Value::STRING, err)) |
| 112 return false; | 105 return false; |
| 113 *out = Label::Resolve(current_dir, current_toolchain, v, err); | 106 *out = Label::Resolve(current_dir, current_toolchain, v, source_root, err); |
| 114 return !err->has_error(); | 107 return !err->has_error(); |
| 115 } | 108 } |
| 116 const SourceDir& current_dir; | 109 const SourceDir& current_dir; |
| 117 const Label& current_toolchain; | 110 const Label& current_toolchain; |
| 111 const base::FilePath& source_root; |
| 118 }; | 112 }; |
| 119 | 113 |
| 120 // Fills the label part of a LabelPtrPair, leaving the pointer null. | 114 // Fills the label part of a LabelPtrPair, leaving the pointer null. |
| 121 template<typename T> struct LabelPtrResolver { | 115 template<typename T> struct LabelPtrResolver { |
| 122 LabelPtrResolver(const SourceDir& current_dir_in, | 116 LabelPtrResolver(const SourceDir& current_dir_in, |
| 123 const Label& current_toolchain_in) | 117 const Label& current_toolchain_in, |
| 118 const base::FilePath& source_root_in) |
| 124 : current_dir(current_dir_in), | 119 : current_dir(current_dir_in), |
| 125 current_toolchain(current_toolchain_in) {} | 120 current_toolchain(current_toolchain_in), |
| 121 source_root(source_root_in) {} |
| 126 bool operator()(const Value& v, LabelPtrPair<T>* out, Err* err) const { | 122 bool operator()(const Value& v, LabelPtrPair<T>* out, Err* err) const { |
| 127 if (!v.VerifyTypeIs(Value::STRING, err)) | 123 if (!v.VerifyTypeIs(Value::STRING, err)) |
| 128 return false; | 124 return false; |
| 129 out->label = Label::Resolve(current_dir, current_toolchain, v, err); | 125 out->label = Label::Resolve(current_dir, current_toolchain, v, source_root, |
| 126 err); |
| 130 out->origin = v.origin(); | 127 out->origin = v.origin(); |
| 131 return !err->has_error(); | 128 return !err->has_error(); |
| 132 } | 129 } |
| 133 const SourceDir& current_dir; | 130 const SourceDir& current_dir; |
| 134 const Label& current_toolchain; | 131 const Label& current_toolchain; |
| 132 const base::FilePath& source_root; |
| 135 }; | 133 }; |
| 136 | 134 |
| 137 } // namespace | 135 } // namespace |
| 138 | 136 |
| 139 bool ExtractListOfStringValues(const Value& value, | 137 bool ExtractListOfStringValues(const Value& value, |
| 140 std::vector<std::string>* dest, | 138 std::vector<std::string>* dest, |
| 141 Err* err) { | 139 Err* err) { |
| 142 if (!value.VerifyTypeIs(Value::LIST, err)) | 140 if (!value.VerifyTypeIs(Value::LIST, err)) |
| 143 return false; | 141 return false; |
| 144 const std::vector<Value>& input_list = value.list_value(); | 142 const std::vector<Value>& input_list = value.list_value(); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 162 | 160 |
| 163 bool ExtractListOfRelativeDirs(const BuildSettings* build_settings, | 161 bool ExtractListOfRelativeDirs(const BuildSettings* build_settings, |
| 164 const Value& value, | 162 const Value& value, |
| 165 const SourceDir& current_dir, | 163 const SourceDir& current_dir, |
| 166 std::vector<SourceDir>* dest, | 164 std::vector<SourceDir>* dest, |
| 167 Err* err) { | 165 Err* err) { |
| 168 return ListValueExtractor(value, dest, err, | 166 return ListValueExtractor(value, dest, err, |
| 169 RelativeDirConverter(build_settings, current_dir)); | 167 RelativeDirConverter(build_settings, current_dir)); |
| 170 } | 168 } |
| 171 | 169 |
| 172 bool ExtractListOfLabels(const Value& value, | 170 bool ExtractListOfLabels(const BuildSettings* build_settings, |
| 171 const Value& value, |
| 173 const SourceDir& current_dir, | 172 const SourceDir& current_dir, |
| 174 const Label& current_toolchain, | 173 const Label& current_toolchain, |
| 175 LabelTargetVector* dest, | 174 LabelTargetVector* dest, |
| 176 Err* err) { | 175 Err* err) { |
| 177 return ListValueExtractor(value, dest, err, | 176 return ListValueExtractor(value, dest, err, |
| 178 LabelPtrResolver<Target>(current_dir, | 177 LabelPtrResolver<Target>( |
| 179 current_toolchain)); | 178 current_dir, current_toolchain, |
| 179 build_settings->root_path())); |
| 180 } | 180 } |
| 181 | 181 |
| 182 bool ExtractListOfUniqueLabels(const Value& value, | 182 bool ExtractListOfUniqueLabels(const BuildSettings* build_settings, |
| 183 const Value& value, |
| 183 const SourceDir& current_dir, | 184 const SourceDir& current_dir, |
| 184 const Label& current_toolchain, | 185 const Label& current_toolchain, |
| 185 UniqueVector<Label>* dest, | 186 UniqueVector<Label>* dest, |
| 186 Err* err) { | 187 Err* err) { |
| 187 return ListValueUniqueExtractor(value, dest, err, | 188 return ListValueUniqueExtractor(value, dest, err, |
| 188 LabelResolver<Config>(current_dir, | 189 LabelResolver<Config>( |
| 189 current_toolchain)); | 190 current_dir, current_toolchain, |
| 191 build_settings->root_path())); |
| 190 } | 192 } |
| 191 | 193 |
| 192 bool ExtractListOfUniqueLabels(const Value& value, | 194 bool ExtractListOfUniqueLabels(const BuildSettings* build_settings, |
| 195 const Value& value, |
| 193 const SourceDir& current_dir, | 196 const SourceDir& current_dir, |
| 194 const Label& current_toolchain, | 197 const Label& current_toolchain, |
| 195 UniqueVector<LabelConfigPair>* dest, | 198 UniqueVector<LabelConfigPair>* dest, |
| 196 Err* err) { | 199 Err* err) { |
| 197 return ListValueUniqueExtractor(value, dest, err, | 200 return ListValueUniqueExtractor(value, dest, err, |
| 198 LabelPtrResolver<Config>(current_dir, | 201 LabelPtrResolver<Config>( |
| 199 current_toolchain)); | 202 current_dir, current_toolchain, |
| 203 build_settings->root_path())); |
| 200 } | 204 } |
| 201 | 205 |
| 202 bool ExtractListOfUniqueLabels(const Value& value, | 206 bool ExtractListOfUniqueLabels(const BuildSettings* build_settings, |
| 207 const Value& value, |
| 203 const SourceDir& current_dir, | 208 const SourceDir& current_dir, |
| 204 const Label& current_toolchain, | 209 const Label& current_toolchain, |
| 205 UniqueVector<LabelTargetPair>* dest, | 210 UniqueVector<LabelTargetPair>* dest, |
| 206 Err* err) { | 211 Err* err) { |
| 207 return ListValueUniqueExtractor(value, dest, err, | 212 return ListValueUniqueExtractor(value, dest, err, |
| 208 LabelPtrResolver<Target>(current_dir, | 213 LabelPtrResolver<Target>( |
| 209 current_toolchain)); | 214 current_dir, current_toolchain, |
| 215 build_settings->root_path())); |
| 210 } | 216 } |
| 211 | 217 |
| 212 bool ExtractRelativeFile(const BuildSettings* build_settings, | 218 bool ExtractRelativeFile(const BuildSettings* build_settings, |
| 213 const Value& value, | 219 const Value& value, |
| 214 const SourceDir& current_dir, | 220 const SourceDir& current_dir, |
| 215 SourceFile* file, | 221 SourceFile* file, |
| 216 Err* err) { | 222 Err* err) { |
| 217 RelativeFileConverter converter(build_settings, current_dir); | 223 RelativeFileConverter converter(build_settings, current_dir); |
| 218 return converter(value, file, err); | 224 return converter(value, file, err); |
| 219 } | 225 } |
| OLD | NEW |