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/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 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
282 | 282 |
283 scoped_ptr<ParseNode> Parser::IdentifierOrCall(scoped_ptr<ParseNode> left, | 283 scoped_ptr<ParseNode> Parser::IdentifierOrCall(scoped_ptr<ParseNode> left, |
284 Token token) { | 284 Token token) { |
285 scoped_ptr<ListNode> list(new ListNode); | 285 scoped_ptr<ListNode> list(new ListNode); |
286 list->set_begin_token(token); | 286 list->set_begin_token(token); |
287 list->set_end(make_scoped_ptr(new EndNode(token))); | 287 list->set_end(make_scoped_ptr(new EndNode(token))); |
288 scoped_ptr<BlockNode> block; | 288 scoped_ptr<BlockNode> block; |
289 bool has_arg = false; | 289 bool has_arg = false; |
290 if (LookAhead(Token::LEFT_PAREN)) { | 290 if (LookAhead(Token::LEFT_PAREN)) { |
291 Token start_token = Consume(); | 291 Token start_token = Consume(); |
| 292 list->set_begin_token(start_token); |
292 // Parsing a function call. | 293 // Parsing a function call. |
293 has_arg = true; | 294 has_arg = true; |
294 if (Match(Token::RIGHT_PAREN)) { | 295 if (LookAhead(Token::RIGHT_PAREN)) { |
295 // Nothing, just an empty call. | 296 // Nothing, just an empty call. |
| 297 list->set_end(make_scoped_ptr(new EndNode(Consume()))); |
296 } else { | 298 } else { |
297 list = ParseList(start_token, Token::RIGHT_PAREN, false); | 299 list = ParseList(start_token, Token::RIGHT_PAREN, false); |
298 if (has_error()) | 300 if (has_error()) |
299 return scoped_ptr<ParseNode>(); | 301 return scoped_ptr<ParseNode>(); |
300 Consume(Token::RIGHT_PAREN, "Expected ')' after call"); | 302 list->set_end(make_scoped_ptr( |
| 303 new EndNode(Consume(Token::RIGHT_PAREN, "Expected ')' after call")))); |
301 } | 304 } |
302 // Optionally with a scope. | 305 // Optionally with a scope. |
303 if (LookAhead(Token::LEFT_BRACE)) { | 306 if (LookAhead(Token::LEFT_BRACE)) { |
304 block = ParseBlock(); | 307 block = ParseBlock(); |
305 if (has_error()) | 308 if (has_error()) |
306 return scoped_ptr<ParseNode>(); | 309 return scoped_ptr<ParseNode>(); |
307 } | 310 } |
308 } | 311 } |
309 | 312 |
310 if (!left && !has_arg) { | 313 if (!left && !has_arg) { |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
610 break; | 613 break; |
611 } | 614 } |
612 } | 615 } |
613 | 616 |
614 // Suffix comments were assigned in reverse, so if there were multiple on | 617 // Suffix comments were assigned in reverse, so if there were multiple on |
615 // the same node, they need to be reversed. | 618 // the same node, they need to be reversed. |
616 if ((*i)->comments() && !(*i)->comments()->suffix().empty()) | 619 if ((*i)->comments() && !(*i)->comments()->suffix().empty()) |
617 const_cast<ParseNode*>(*i)->comments_mutable()->ReverseSuffix(); | 620 const_cast<ParseNode*>(*i)->comments_mutable()->ReverseSuffix(); |
618 } | 621 } |
619 } | 622 } |
OLD | NEW |