Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(65)

Side by Side Diff: tools/gn/functions.cc

Issue 1025153002: tools/gn: make defined(foo.bar) an error if !defined(foo) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "tools/gn/functions.h" 5 #include "tools/gn/functions.h"
6 6
7 #include <iostream> 7 #include <iostream>
8 8
9 #include "base/environment.h" 9 #include "base/environment.h"
10 #include "base/strings/string_util.h" 10 #include "base/strings/string_util.h"
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 " Returns true if the given argument is defined. This is most useful in\n" 334 " Returns true if the given argument is defined. This is most useful in\n"
335 " templates to assert that the caller set things up properly.\n" 335 " templates to assert that the caller set things up properly.\n"
336 "\n" 336 "\n"
337 " You can pass an identifier:\n" 337 " You can pass an identifier:\n"
338 " defined(foo)\n" 338 " defined(foo)\n"
339 " which will return true or false depending on whether foo is defined in\n" 339 " which will return true or false depending on whether foo is defined in\n"
340 " the current scope.\n" 340 " the current scope.\n"
341 "\n" 341 "\n"
342 " You can also check a named scope:\n" 342 " You can also check a named scope:\n"
343 " defined(foo.bar)\n" 343 " defined(foo.bar)\n"
344 " which returns true if both foo is defined and bar is defined on the\n" 344 " which will return true or false depending on whether bar is defined in\n"
345 " named scope foo. It will throw an error if foo is defined but is not\n" 345 " the named scope foo. It will throw an error if foo is not defined or\n"
346 " a scope.\n" 346 " is not a scope.\n"
347 "\n" 347 "\n"
348 "Example:\n" 348 "Example:\n"
349 "\n" 349 "\n"
350 " template(\"mytemplate\") {\n" 350 " template(\"mytemplate\") {\n"
351 " # To help users call this template properly...\n" 351 " # To help users call this template properly...\n"
352 " assert(defined(invoker.sources), \"Sources must be defined\")\n" 352 " assert(defined(invoker.sources), \"Sources must be defined\")\n"
353 "\n" 353 "\n"
354 " # If we want to accept an optional \"values\" argument, we don't\n" 354 " # If we want to accept an optional \"values\" argument, we don't\n"
355 " # want to dereference something that may not be defined.\n" 355 " # want to dereference something that may not be defined.\n"
356 " if (defined(invoker.values)) {\n" 356 " if (defined(invoker.values)) {\n"
(...skipping 21 matching lines...) Expand all
378 return Value(function, true); 378 return Value(function, true);
379 return Value(function, false); 379 return Value(function, false);
380 } 380 }
381 381
382 const AccessorNode* accessor = args_vector[0]->AsAccessor(); 382 const AccessorNode* accessor = args_vector[0]->AsAccessor();
383 if (accessor) { 383 if (accessor) {
384 // Passed an accessor "defined(foo.bar)". 384 // Passed an accessor "defined(foo.bar)".
385 if (accessor->member()) { 385 if (accessor->member()) {
386 // The base of the accessor must be a scope if it's defined. 386 // The base of the accessor must be a scope if it's defined.
387 const Value* base = scope->GetValue(accessor->base().value()); 387 const Value* base = scope->GetValue(accessor->base().value());
388 if (!base) 388 if (!base) {
389 return Value(function, false); 389 *err = Err(accessor, "Undefined identifier");
390 return Value();
391 }
390 if (!base->VerifyTypeIs(Value::SCOPE, err)) 392 if (!base->VerifyTypeIs(Value::SCOPE, err))
391 return Value(); 393 return Value();
392 394
393 // Check the member inside the scope to see if its defined. 395 // Check the member inside the scope to see if its defined.
394 if (base->scope_value()->GetValue(accessor->member()->value().value())) 396 if (base->scope_value()->GetValue(accessor->member()->value().value()))
395 return Value(function, true); 397 return Value(function, true);
396 return Value(function, false); 398 return Value(function, false);
397 } 399 }
398 } 400 }
399 401
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after
813 } 815 }
814 816
815 // Otherwise it's a no-block function. 817 // Otherwise it's a no-block function.
816 if (!VerifyNoBlockForFunctionCall(function, block, err)) 818 if (!VerifyNoBlockForFunctionCall(function, block, err))
817 return Value(); 819 return Value();
818 return found_function->second.no_block_runner(scope, function, 820 return found_function->second.no_block_runner(scope, function,
819 args.list_value(), err); 821 args.list_value(), err);
820 } 822 }
821 823
822 } // namespace functions 824 } // namespace functions
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698