// 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 #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& 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 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