OLD | NEW |
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/operators.h" | 5 #include "tools/gn/operators.h" |
6 | 6 |
7 #include "base/strings/string_number_conversions.h" | 7 #include "base/strings/string_number_conversions.h" |
8 #include "tools/gn/err.h" | 8 #include "tools/gn/err.h" |
9 #include "tools/gn/parse_tree.h" | 9 #include "tools/gn/parse_tree.h" |
10 #include "tools/gn/scope.h" | 10 #include "tools/gn/scope.h" |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 | 286 |
287 // Left-hand-side list. | 287 // Left-hand-side list. |
288 case Value::LIST: | 288 case Value::LIST: |
289 RemoveMatchesFromList(op_node, left, right, err); | 289 RemoveMatchesFromList(op_node, left, right, err); |
290 return; | 290 return; |
291 | 291 |
292 default: | 292 default: |
293 break; | 293 break; |
294 } | 294 } |
295 | 295 |
296 *err = Err(op_node->op(), "Incompatible types to add.", | 296 *err = Err(op_node->op(), "Incompatible types to subtract.", |
297 std::string("I see a ") + Value::DescribeType(left->type()) + " and a " + | 297 std::string("I see a ") + Value::DescribeType(left->type()) + " and a " + |
298 Value::DescribeType(right.type()) + "."); | 298 Value::DescribeType(right.type()) + "."); |
299 } | 299 } |
300 | 300 |
301 Value ExecuteMinusEquals(Scope* scope, | 301 Value ExecuteMinusEquals(Scope* scope, |
302 const BinaryOpNode* op_node, | 302 const BinaryOpNode* op_node, |
303 const Token& left, | 303 const Token& left, |
304 const Value& right, | 304 const Value& right, |
305 Err* err) { | 305 Err* err) { |
306 Value* left_value = | 306 Value* left_value = |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 const ParseNode* right, | 507 const ParseNode* right, |
508 Err* err) { | 508 Err* err) { |
509 const Token& op = op_node->op(); | 509 const Token& op = op_node->op(); |
510 | 510 |
511 // First handle the ones that take an lvalue. | 511 // First handle the ones that take an lvalue. |
512 if (op.type() == Token::EQUAL || | 512 if (op.type() == Token::EQUAL || |
513 op.type() == Token::PLUS_EQUALS || | 513 op.type() == Token::PLUS_EQUALS || |
514 op.type() == Token::MINUS_EQUALS) { | 514 op.type() == Token::MINUS_EQUALS) { |
515 const IdentifierNode* left_id = left->AsIdentifier(); | 515 const IdentifierNode* left_id = left->AsIdentifier(); |
516 if (!left_id) { | 516 if (!left_id) { |
517 *err = Err(op, "Operator requires an lvalue.", | 517 *err = Err(op, "Operator requires a lvalue.", |
518 "This thing on the left is not an idenfitier."); | 518 "This thing on the left is not an identifier."); |
519 err->AppendRange(left->GetRange()); | 519 err->AppendRange(left->GetRange()); |
520 return Value(); | 520 return Value(); |
521 } | 521 } |
522 const Token& dest = left_id->value(); | 522 const Token& dest = left_id->value(); |
523 | 523 |
524 Value right_value = right->Execute(scope, err); | 524 Value right_value = right->Execute(scope, err); |
525 if (err->has_error()) | 525 if (err->has_error()) |
526 return Value(); | 526 return Value(); |
527 if (right_value.type() == Value::NONE) { | 527 if (right_value.type() == Value::NONE) { |
528 *err = Err(op, "Operator requires an rvalue.", | 528 *err = Err(op, "Operator requires a rvalue.", |
529 "This thing on the right does not evaluate to a value."); | 529 "This thing on the right does not evaluate to a value."); |
530 err->AppendRange(right->GetRange()); | 530 err->AppendRange(right->GetRange()); |
531 return Value(); | 531 return Value(); |
532 } | 532 } |
533 | 533 |
534 if (op.type() == Token::EQUAL) | 534 if (op.type() == Token::EQUAL) |
535 return ExecuteEquals(scope, op_node, dest, right_value, err); | 535 return ExecuteEquals(scope, op_node, dest, right_value, err); |
536 if (op.type() == Token::PLUS_EQUALS) | 536 if (op.type() == Token::PLUS_EQUALS) |
537 return ExecutePlusEquals(scope, op_node, dest, right_value, err); | 537 return ExecutePlusEquals(scope, op_node, dest, right_value, err); |
538 if (op.type() == Token::MINUS_EQUALS) | 538 if (op.type() == Token::MINUS_EQUALS) |
539 return ExecuteMinusEquals(scope, op_node, dest, right_value, err); | 539 return ExecuteMinusEquals(scope, op_node, dest, right_value, err); |
540 NOTREACHED(); | 540 NOTREACHED(); |
541 return Value(); | 541 return Value(); |
542 } | 542 } |
543 | 543 |
544 // Left value. | 544 // Left value. |
545 Value left_value = left->Execute(scope, err); | 545 Value left_value = left->Execute(scope, err); |
546 if (err->has_error()) | 546 if (err->has_error()) |
547 return Value(); | 547 return Value(); |
548 if (left_value.type() == Value::NONE) { | 548 if (left_value.type() == Value::NONE) { |
549 *err = Err(op, "Operator requires an value.", | 549 *err = Err(op, "Operator requires a value.", |
550 "This thing on the left does not evaluate to a value."); | 550 "This thing on the left does not evaluate to a value."); |
551 err->AppendRange(left->GetRange()); | 551 err->AppendRange(left->GetRange()); |
552 return Value(); | 552 return Value(); |
553 } | 553 } |
554 | 554 |
555 // Right value. Note: don't move this above to share code with the lvalue | 555 // Right value. Note: don't move this above to share code with the lvalue |
556 // version since in this case we want to execute the left side first. | 556 // version since in this case we want to execute the left side first. |
557 Value right_value = right->Execute(scope, err); | 557 Value right_value = right->Execute(scope, err); |
558 if (err->has_error()) | 558 if (err->has_error()) |
559 return Value(); | 559 return Value(); |
560 if (right_value.type() == Value::NONE) { | 560 if (right_value.type() == Value::NONE) { |
561 *err = Err(op, "Operator requires an value.", | 561 *err = Err(op, "Operator requires a value.", |
562 "This thing on the right does not evaluate to a value."); | 562 "This thing on the right does not evaluate to a value."); |
563 err->AppendRange(right->GetRange()); | 563 err->AppendRange(right->GetRange()); |
564 return Value(); | 564 return Value(); |
565 } | 565 } |
566 | 566 |
567 // +, -. | 567 // +, -. |
568 if (op.type() == Token::MINUS) | 568 if (op.type() == Token::MINUS) |
569 return ExecuteMinus(scope, op_node, left_value, right_value, err); | 569 return ExecuteMinus(scope, op_node, left_value, right_value, err); |
570 if (op.type() == Token::PLUS) | 570 if (op.type() == Token::PLUS) |
571 return ExecutePlus(scope, op_node, left_value, right_value, err); | 571 return ExecutePlus(scope, op_node, left_value, right_value, err); |
(...skipping 13 matching lines...) Expand all Loading... |
585 return ExecuteLess(scope, op_node, left_value, right_value, err); | 585 return ExecuteLess(scope, op_node, left_value, right_value, err); |
586 | 586 |
587 // ||, &&. | 587 // ||, &&. |
588 if (op.type() == Token::BOOLEAN_OR) | 588 if (op.type() == Token::BOOLEAN_OR) |
589 return ExecuteOr(scope, op_node, left_value, right_value, err); | 589 return ExecuteOr(scope, op_node, left_value, right_value, err); |
590 if (op.type() == Token::BOOLEAN_AND) | 590 if (op.type() == Token::BOOLEAN_AND) |
591 return ExecuteAnd(scope, op_node, left_value, right_value, err); | 591 return ExecuteAnd(scope, op_node, left_value, right_value, err); |
592 | 592 |
593 return Value(); | 593 return Value(); |
594 } | 594 } |
OLD | NEW |