blob: afbed9e6204e32bb1aba209fc7a108d7063a6ffd [file] [log] [blame]
// Copyright (c) 2013 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 "tools/gn/functions.h"
#include "tools/gn/parse_tree.h"
#include "tools/gn/scope.h"
#include "tools/gn/value.h"
Value ExecuteDefineRule(Scope* scope,
const FunctionCallNode* function,
const std::vector<Value>& args,
BlockNode* block,
Err* err) {
// TODO(brettw) determine if the function is built-in and throw an error if
// it is.
if (args.size() != 1) {
*err = Err(function->function(),
"Need exactly one string arg to define_rule.");
return Value();
if (!args[0].VerifyTypeIs(Value::STRING, err))
return Value();
std::string rule_name = args[0].string_value();
const FunctionCallNode* existing_rule = scope->GetRule(rule_name);
if (existing_rule) {
*err = Err(function, "Duplicate rule definition.",
"A rule with this name was already defined.");
err->AppendSubErr(Err(existing_rule->function(), "Previous definition."));
return Value();
scope->AddRule(rule_name, function);
return Value();