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

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

Issue 610293003: Replace more for loops in GN (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: review Created 6 years, 2 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 | « tools/gn/parse_tree.cc ('k') | tools/gn/path_output.cc » ('j') | 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/parser.h" 5 #include "tools/gn/parser.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "tools/gn/functions.h" 8 #include "tools/gn/functions.h"
9 #include "tools/gn/operators.h" 9 #include "tools/gn/operators.h"
10 #include "tools/gn/token.h" 10 #include "tools/gn/token.h"
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 {&Parser::Name, &Parser::IdentifierOrCall, PRECEDENCE_CALL}, // IDENTIFIER 75 {&Parser::Name, &Parser::IdentifierOrCall, PRECEDENCE_CALL}, // IDENTIFIER
76 {NULL, NULL, -1}, // COMMA 76 {NULL, NULL, -1}, // COMMA
77 {NULL, NULL, -1}, // UNCLASSIFIED_COMMENT 77 {NULL, NULL, -1}, // UNCLASSIFIED_COMMENT
78 {NULL, NULL, -1}, // LINE_COMMENT 78 {NULL, NULL, -1}, // LINE_COMMENT
79 {NULL, NULL, -1}, // SUFFIX_COMMENT 79 {NULL, NULL, -1}, // SUFFIX_COMMENT
80 {&Parser::BlockComment, NULL, -1}, // BLOCK_COMMENT 80 {&Parser::BlockComment, NULL, -1}, // BLOCK_COMMENT
81 }; 81 };
82 82
83 Parser::Parser(const std::vector<Token>& tokens, Err* err) 83 Parser::Parser(const std::vector<Token>& tokens, Err* err)
84 : err_(err), cur_(0) { 84 : err_(err), cur_(0) {
85 for (std::vector<Token>::const_iterator i(tokens.begin()); i != tokens.end(); 85 for (const auto& token : tokens) {
86 ++i) { 86 switch(token.type()) {
87 switch(i->type()) {
88 case Token::LINE_COMMENT: 87 case Token::LINE_COMMENT:
89 line_comment_tokens_.push_back(*i); 88 line_comment_tokens_.push_back(token);
90 break; 89 break;
91 case Token::SUFFIX_COMMENT: 90 case Token::SUFFIX_COMMENT:
92 suffix_comment_tokens_.push_back(*i); 91 suffix_comment_tokens_.push_back(token);
93 break; 92 break;
94 default: 93 default:
95 // Note that BLOCK_COMMENTs (top-level standalone comments) are passed 94 // Note that BLOCK_COMMENTs (top-level standalone comments) are passed
96 // through the real parser. 95 // through the real parser.
97 tokens_.push_back(*i); 96 tokens_.push_back(token);
98 break; 97 break;
99 } 98 }
100 } 99 }
101 } 100 }
102 101
103 Parser::~Parser() { 102 Parser::~Parser() {
104 } 103 }
105 104
106 // static 105 // static
107 scoped_ptr<ParseNode> Parser::Parse(const std::vector<Token>& tokens, 106 scoped_ptr<ParseNode> Parser::Parse(const std::vector<Token>& tokens,
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 if (root) { 512 if (root) {
514 pre->push_back(root); 513 pre->push_back(root);
515 514
516 if (const AccessorNode* accessor = root->AsAccessor()) { 515 if (const AccessorNode* accessor = root->AsAccessor()) {
517 TraverseOrder(accessor->index(), pre, post); 516 TraverseOrder(accessor->index(), pre, post);
518 TraverseOrder(accessor->member(), pre, post); 517 TraverseOrder(accessor->member(), pre, post);
519 } else if (const BinaryOpNode* binop = root->AsBinaryOp()) { 518 } else if (const BinaryOpNode* binop = root->AsBinaryOp()) {
520 TraverseOrder(binop->left(), pre, post); 519 TraverseOrder(binop->left(), pre, post);
521 TraverseOrder(binop->right(), pre, post); 520 TraverseOrder(binop->right(), pre, post);
522 } else if (const BlockNode* block = root->AsBlock()) { 521 } else if (const BlockNode* block = root->AsBlock()) {
523 const std::vector<ParseNode*>& statements = block->statements(); 522 for (const auto& statement : block->statements())
524 for (std::vector<ParseNode*>::const_iterator i(statements.begin()); 523 TraverseOrder(statement, pre, post);
525 i != statements.end();
526 ++i) {
527 TraverseOrder(*i, pre, post);
528 }
529 TraverseOrder(block->End(), pre, post); 524 TraverseOrder(block->End(), pre, post);
530 } else if (const ConditionNode* condition = root->AsConditionNode()) { 525 } else if (const ConditionNode* condition = root->AsConditionNode()) {
531 TraverseOrder(condition->condition(), pre, post); 526 TraverseOrder(condition->condition(), pre, post);
532 TraverseOrder(condition->if_true(), pre, post); 527 TraverseOrder(condition->if_true(), pre, post);
533 TraverseOrder(condition->if_false(), pre, post); 528 TraverseOrder(condition->if_false(), pre, post);
534 } else if (const FunctionCallNode* func_call = root->AsFunctionCall()) { 529 } else if (const FunctionCallNode* func_call = root->AsFunctionCall()) {
535 TraverseOrder(func_call->args(), pre, post); 530 TraverseOrder(func_call->args(), pre, post);
536 TraverseOrder(func_call->block(), pre, post); 531 TraverseOrder(func_call->block(), pre, post);
537 } else if (root->AsIdentifier()) { 532 } else if (root->AsIdentifier()) {
538 // Nothing. 533 // Nothing.
539 } else if (const ListNode* list = root->AsList()) { 534 } else if (const ListNode* list = root->AsList()) {
540 const std::vector<const ParseNode*>& contents = list->contents(); 535 for (const auto& node : list->contents())
541 for (std::vector<const ParseNode*>::const_iterator i(contents.begin()); 536 TraverseOrder(node, pre, post);
542 i != contents.end();
543 ++i) {
544 TraverseOrder(*i, pre, post);
545 }
546 TraverseOrder(list->End(), pre, post); 537 TraverseOrder(list->End(), pre, post);
547 } else if (root->AsLiteral()) { 538 } else if (root->AsLiteral()) {
548 // Nothing. 539 // Nothing.
549 } else if (const UnaryOpNode* unaryop = root->AsUnaryOp()) { 540 } else if (const UnaryOpNode* unaryop = root->AsUnaryOp()) {
550 TraverseOrder(unaryop->operand(), pre, post); 541 TraverseOrder(unaryop->operand(), pre, post);
551 } else if (root->AsBlockComment()) { 542 } else if (root->AsBlockComment()) {
552 // Nothing. 543 // Nothing.
553 } else if (root->AsEnd()) { 544 } else if (root->AsEnd()) {
554 // Nothing. 545 // Nothing.
555 } else { 546 } else {
556 CHECK(false) << "Unhandled case in TraverseOrder."; 547 CHECK(false) << "Unhandled case in TraverseOrder.";
557 } 548 }
558 549
559 post->push_back(root); 550 post->push_back(root);
560 } 551 }
561 } 552 }
562 553
563 void Parser::AssignComments(ParseNode* file) { 554 void Parser::AssignComments(ParseNode* file) {
564 // Start by generating a pre- and post- order traversal of the tree so we 555 // Start by generating a pre- and post- order traversal of the tree so we
565 // can determine what's before and after comments. 556 // can determine what's before and after comments.
566 std::vector<const ParseNode*> pre; 557 std::vector<const ParseNode*> pre;
567 std::vector<const ParseNode*> post; 558 std::vector<const ParseNode*> post;
568 TraverseOrder(file, &pre, &post); 559 TraverseOrder(file, &pre, &post);
569 560
570 // Assign line comments to syntax immediately following. 561 // Assign line comments to syntax immediately following.
571 int cur_comment = 0; 562 int cur_comment = 0;
572 for (std::vector<const ParseNode*>::const_iterator i = pre.begin(); 563 for (const auto& node : pre) {
573 i != pre.end(); 564 const Location& start = node->GetRange().begin();
574 ++i) {
575 const Location& start = (*i)->GetRange().begin();
576 while (cur_comment < static_cast<int>(line_comment_tokens_.size())) { 565 while (cur_comment < static_cast<int>(line_comment_tokens_.size())) {
577 if (start.byte() >= line_comment_tokens_[cur_comment].location().byte()) { 566 if (start.byte() >= line_comment_tokens_[cur_comment].location().byte()) {
578 const_cast<ParseNode*>(*i)->comments_mutable()->append_before( 567 const_cast<ParseNode*>(node)->comments_mutable()->append_before(
579 line_comment_tokens_[cur_comment]); 568 line_comment_tokens_[cur_comment]);
580 ++cur_comment; 569 ++cur_comment;
581 } else { 570 } else {
582 break; 571 break;
583 } 572 }
584 } 573 }
585 } 574 }
586 575
587 // Remaining line comments go at end of file. 576 // Remaining line comments go at end of file.
588 for (; cur_comment < static_cast<int>(line_comment_tokens_.size()); 577 for (; cur_comment < static_cast<int>(line_comment_tokens_.size());
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
621 break; 610 break;
622 } 611 }
623 } 612 }
624 613
625 // Suffix comments were assigned in reverse, so if there were multiple on 614 // Suffix comments were assigned in reverse, so if there were multiple on
626 // the same node, they need to be reversed. 615 // the same node, they need to be reversed.
627 if ((*i)->comments() && !(*i)->comments()->suffix().empty()) 616 if ((*i)->comments() && !(*i)->comments()->suffix().empty())
628 const_cast<ParseNode*>(*i)->comments_mutable()->ReverseSuffix(); 617 const_cast<ParseNode*>(*i)->comments_mutable()->ReverseSuffix();
629 } 618 }
630 } 619 }
OLDNEW
« no previous file with comments | « tools/gn/parse_tree.cc ('k') | tools/gn/path_output.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698