| // 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/build_settings.h" |
| #include "gn/err.h" |
| #include "gn/functions.h" |
| #include "gn/label_pattern.h" |
| #include "gn/parse_tree.h" |
| #include "gn/scope.h" |
| #include "gn/settings.h" |
| #include "gn/value.h" |
| |
| namespace functions { |
| |
| const char kLabelMatches[] = "label_matches"; |
| const char kLabelMatches_HelpShort[] = |
| "label_matches: Returns whether a label matches any of a list of patterns."; |
| const char kLabelMatches_Help[] = |
| R"(label_matches: Returns true if the label matches any of a set of patterns. |
| |
| label_matches(target_label, patterns) |
| |
| The argument patterns must be a list of label patterns (see |
| "gn help label_pattern"). If the target_label matches any of the patterns, |
| the function returns the value true. |
| |
| Examples |
| result = label_matches("//baz:bar", [ "//foo/bar/*", "//baz:*" ]) |
| # result will be true |
| )"; |
| |
| Value RunLabelMatches(Scope* scope, |
| const FunctionCallNode* function, |
| const std::vector<Value>& args, |
| Err* err) { |
| if (args.size() != 2) { |
| *err = Err(function, "Expecting exactly two arguments."); |
| return Value(); |
| } |
| |
| // Extract "label" |
| if (args[0].type() != Value::STRING) { |
| *err = Err(args[0], "First argument must be a target label."); |
| return Value(); |
| } |
| Label label = |
| Label::Resolve(scope->GetSourceDir(), |
| scope->settings()->build_settings()->root_path_utf8(), |
| ToolchainLabelForScope(scope), args[0], err); |
| if (label.is_null()) { |
| return Value(); |
| } |
| |
| // Extract "patterns". |
| if (args[1].type() != Value::LIST) { |
| *err = Err(args[1], "Second argument must be a list of label patterns."); |
| return Value(); |
| } |
| std::vector<LabelPattern> patterns; |
| patterns.reserve(args[1].list_value().size()); |
| |
| for (const auto& pattern_string : args[1].list_value()) { |
| if (pattern_string.type() != Value::STRING) { |
| *err = Err(pattern_string, |
| "Second argument must be a list of label patterns."); |
| return Value(); |
| } |
| LabelPattern pattern = LabelPattern::GetPattern( |
| scope->GetSourceDir(), |
| scope->settings()->build_settings()->root_path_utf8(), pattern_string, |
| err); |
| if (err->has_error()) { |
| return Value(); |
| } |
| patterns.push_back(std::move(pattern)); |
| } |
| |
| return Value(function, LabelPattern::VectorMatches(patterns, label)); |
| } |
| |
| } // namespace functions |