| Index: tools/gn/parser.cc
|
| diff --git a/tools/gn/parser.cc b/tools/gn/parser.cc
|
| index e07b45079771f059ff7dd260191e625034a34695..fe17aaceb748afd4b904676de4e5d9d1ea380142 100644
|
| --- a/tools/gn/parser.cc
|
| +++ b/tools/gn/parser.cc
|
| @@ -285,7 +285,7 @@ scoped_ptr<ParseNode> Parser::IdentifierOrCall(scoped_ptr<ParseNode> left,
|
| Token token) {
|
| scoped_ptr<ListNode> list(new ListNode);
|
| list->set_begin_token(token);
|
| - list->set_end_token(token);
|
| + list->set_end(make_scoped_ptr(new EndNode(token)));
|
| scoped_ptr<BlockNode> block;
|
| bool has_arg = false;
|
| if (LookAhead(Token::LEFT_PAREN)) {
|
| @@ -418,7 +418,7 @@ scoped_ptr<ListNode> Parser::ParseList(Token start_token,
|
| *err_ = Err(cur_token(), "Trailing comma");
|
| return scoped_ptr<ListNode>();
|
| }
|
| - list->set_end_token(cur_token());
|
| + list->set_end(make_scoped_ptr(new EndNode(cur_token())));
|
| return list.Pass();
|
| }
|
|
|
| @@ -479,7 +479,7 @@ scoped_ptr<BlockNode> Parser::ParseBlock() {
|
|
|
| for (;;) {
|
| if (LookAhead(Token::RIGHT_BRACE)) {
|
| - block->set_end_token(Consume());
|
| + block->set_end(make_scoped_ptr(new EndNode(Consume())));
|
| break;
|
| }
|
|
|
| @@ -526,6 +526,7 @@ void Parser::TraverseOrder(const ParseNode* root,
|
| ++i) {
|
| TraverseOrder(*i, pre, post);
|
| }
|
| + TraverseOrder(block->End(), pre, post);
|
| } else if (const ConditionNode* condition = root->AsConditionNode()) {
|
| TraverseOrder(condition->condition(), pre, post);
|
| TraverseOrder(condition->if_true(), pre, post);
|
| @@ -542,12 +543,15 @@ void Parser::TraverseOrder(const ParseNode* root,
|
| ++i) {
|
| TraverseOrder(*i, pre, post);
|
| }
|
| + TraverseOrder(list->End(), pre, post);
|
| } else if (root->AsLiteral()) {
|
| // Nothing.
|
| } else if (const UnaryOpNode* unaryop = root->AsUnaryOp()) {
|
| TraverseOrder(unaryop->operand(), pre, post);
|
| } else if (root->AsBlockComment()) {
|
| // Nothing.
|
| + } else if (root->AsEnd()) {
|
| + // Nothing.
|
| } else {
|
| CHECK(false) << "Unhandled case in TraverseOrder.";
|
| }
|
| @@ -592,7 +596,7 @@ void Parser::AssignComments(ParseNode* file) {
|
| ++i) {
|
| // Don't assign suffix comments to the function call or list, but instead
|
| // to the last thing inside.
|
| - if ((*i)->AsFunctionCall() || (*i)->AsList())
|
| + if ((*i)->AsFunctionCall() || (*i)->AsList() || (*i)->AsEnd())
|
| continue;
|
|
|
| const Location& start = (*i)->GetRange().begin();
|
| @@ -620,6 +624,7 @@ void Parser::AssignComments(ParseNode* file) {
|
|
|
| // Suffix comments were assigned in reverse, so if there were multiple on
|
| // the same node, they need to be reversed.
|
| - const_cast<ParseNode*>(*i)->comments_mutable()->ReverseSuffix();
|
| + if ((*i)->comments() && !(*i)->comments()->suffix().empty())
|
| + const_cast<ParseNode*>(*i)->comments_mutable()->ReverseSuffix();
|
| }
|
| }
|
|
|