value_extractors.cc revision d3868032626d59662ff73b372b5d584c1d144c53
1d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// found in the LICENSE file. 4d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 5d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/value_extractors.h" 6d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 7d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/err.h" 8d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/label.h" 9d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/source_dir.h" 10d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/source_file.h" 11d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 12d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochnamespace { 13d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 14d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// This extractor rejects files with system-absolute file paths. If we need 15d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// that in the future, we'll have to add some flag to control this. 16d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochstruct RelativeFileConverter { 17d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch RelativeFileConverter(const SourceDir& current_dir_in) 18d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch : current_dir(current_dir_in) {} 19d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch bool operator()(const Value& v, SourceFile* out, Err* err) const { 20d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (!v.VerifyTypeIs(Value::STRING, err)) 21d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return false; 22d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch *out = current_dir.ResolveRelativeFile(v.string_value()); 23d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (out->is_system_absolute()) { 24d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch *err = Err(v, "System-absolute file path.", 25d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch "You can't list a system-absolute file path here. Please include " 26d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch "only files in\nthe source tree. Maybe you meant to begin with two " 27d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch "slashes to indicate an\nabsolute path in the source tree?"); 28d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return false; 29d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 30d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return true; 31d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 32d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const SourceDir& current_dir; 33d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 34d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 35d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochstruct RelativeDirConverter { 36d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch RelativeDirConverter(const SourceDir& current_dir_in) 37d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch : current_dir(current_dir_in) {} 38d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch bool operator()(const Value& v, SourceDir* out, Err* err) const { 39d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (!v.VerifyTypeIs(Value::STRING, err)) 40d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return false; 41d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch *out = current_dir.ResolveRelativeDir(v.string_value()); 42d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return true; 43d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 44d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const SourceDir& current_dir; 45d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 46d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 47d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochstruct LabelResolver { 48d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch LabelResolver(const SourceDir& current_dir_in, 49d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const Label& current_toolchain_in) 50d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch : current_dir(current_dir_in), 51d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch current_toolchain(current_toolchain_in) {} 52d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch bool operator()(const Value& v, Label* out, Err* err) const { 53d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (!v.VerifyTypeIs(Value::STRING, err)) 54d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return false; 55d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch *out = Label::Resolve(current_dir, current_toolchain, v, err); 56d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return !err->has_error(); 57d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 58d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const SourceDir& current_dir; 59d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const Label& current_toolchain; 60d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 61d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 62d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} // namespace 63d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 64d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochbool ExtractListOfStringValues(const Value& value, 65d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::vector<std::string>* dest, 66d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Err* err) { 67d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (!value.VerifyTypeIs(Value::LIST, err)) 68d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return false; 69d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::vector<Value>& input_list = value.list_value(); 70d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch dest->reserve(input_list.size()); 71d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch for (size_t i = 0; i < input_list.size(); i++) { 72d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (!input_list[i].VerifyTypeIs(Value::STRING, err)) 73d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return false; 74d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch dest->push_back(input_list[i].string_value()); 75d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 76d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return true; 77d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 78d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 79d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochbool ExtractListOfRelativeFiles(const Value& value, 80d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const SourceDir& current_dir, 81d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::vector<SourceFile>* files, 82d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Err* err) { 83d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return ListValueExtractor(value, files, err, 84d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch RelativeFileConverter(current_dir)); 85d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 86d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 87d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochbool ExtractListOfRelativeDirs(const Value& value, 88d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const SourceDir& current_dir, 89d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::vector<SourceDir>* dest, 90d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Err* err) { 91d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return ListValueExtractor(value, dest, err, 92d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch RelativeDirConverter(current_dir)); 93d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 94d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 95d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochbool ExtractListOfLabels(const Value& value, 96d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const SourceDir& current_dir, 97d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const Label& current_toolchain, 98d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::vector<Label>* dest, 99d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Err* err) { 100d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return ListValueExtractor(value, dest, err, 101d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch LabelResolver(current_dir, current_toolchain)); 102d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 103