| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <stddef.h> |
| |
| #include "gn/err.h" |
| #include "gn/filesystem_utils.h" |
| #include "gn/functions.h" |
| #include "gn/parse_tree.h" |
| #include "gn/scope.h" |
| #include "gn/value.h" |
| |
| namespace functions { |
| |
| const char kFilterExclude[] = "filter_exclude"; |
| const char kFilterExclude_HelpShort[] = |
| "filter_exclude: Remove values that match a set of patterns."; |
| const char kFilterExclude_Help[] = |
| R"(filter_exclude: Remove values that match a set of patterns. |
| |
| filter_exclude(values, exclude_patterns) |
| |
| The argument values must be a list of strings. |
| |
| The argument exclude_patterns must be a list of file patterns (see |
| "gn help file_pattern"). Any elements in values matching at least one |
| of those patterns will be excluded. |
| |
| Examples |
| values = [ "foo.cc", "foo.h", "foo.proto" ] |
| result = filter_exclude(values, [ "*.proto" ]) |
| # result will be [ "foo.cc", "foo.h" ] |
| )"; |
| |
| const char kFilterInclude[] = "filter_include"; |
| const char kFilterInclude_HelpShort[] = |
| "filter_include: Remove values that do not match a set of patterns."; |
| const char kFilterInclude_Help[] = |
| R"(filter_include: Remove values that do not match a set of patterns. |
| |
| filter_include(values, include_patterns) |
| |
| The argument values must be a list of strings. |
| |
| The argument include_patterns must be a list of file patterns (see |
| "gn help file_pattern"). Only elements from values matching at least |
| one of the pattern will be included. |
| |
| Examples |
| values = [ "foo.cc", "foo.h", "foo.proto" ] |
| result = filter_include(values, [ "*.proto" ]) |
| # result will be [ "foo.proto" ] |
| )"; |
| |
| namespace { |
| |
| enum FilterSelection { |
| kExcludeFilter, |
| kIncludeFilter, |
| }; |
| |
| Value RunFilter(Scope* scope, |
| const FunctionCallNode* function, |
| const std::vector<Value>& args, |
| FilterSelection selection, |
| Err* err) { |
| if (args.size() != 2) { |
| *err = Err(function, "Expecting exactly two arguments."); |
| return Value(); |
| } |
| |
| // Extract "values". |
| if (args[0].type() != Value::LIST) { |
| *err = Err(args[0], "First argument must be a list of strings."); |
| return Value(); |
| } |
| |
| // Extract "patterns". |
| PatternList patterns; |
| patterns.SetFromValue(args[1], err); |
| if (err->has_error()) |
| return Value(); |
| |
| Value result(function, Value::LIST); |
| for (const auto& value : args[0].list_value()) { |
| if (value.type() != Value::STRING) { |
| *err = Err(args[0], "First argument must be a list of strings."); |
| return Value(); |
| } |
| |
| const bool matches_pattern = patterns.MatchesValue(value); |
| switch (selection) { |
| case kIncludeFilter: |
| if (matches_pattern) |
| result.list_value().push_back(value); |
| break; |
| |
| case kExcludeFilter: |
| if (!matches_pattern) |
| result.list_value().push_back(value); |
| break; |
| } |
| } |
| return result; |
| } |
| |
| } // anonymous namespace |
| |
| Value RunFilterExclude(Scope* scope, |
| const FunctionCallNode* function, |
| const std::vector<Value>& args, |
| Err* err) { |
| return RunFilter(scope, function, args, kExcludeFilter, err); |
| } |
| |
| Value RunFilterInclude(Scope* scope, |
| const FunctionCallNode* function, |
| const std::vector<Value>& args, |
| Err* err) { |
| return RunFilter(scope, function, args, kIncludeFilter, err); |
| } |
| |
| } // namespace functions |