| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/parser.h" | 5 #include "vm/parser.h" |
| 6 | 6 |
| 7 #include "vm/bigint_operations.h" | 7 #include "vm/bigint_operations.h" |
| 8 #include "vm/class_finalizer.h" | 8 #include "vm/class_finalizer.h" |
| 9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
| 10 #include "vm/compiler_stats.h" | 10 #include "vm/compiler_stats.h" |
| (...skipping 6872 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6883 *expr = right_node; | 6883 *expr = right_node; |
| 6884 return left_node; | 6884 return left_node; |
| 6885 } | 6885 } |
| 6886 return *expr; | 6886 return *expr; |
| 6887 } | 6887 } |
| 6888 | 6888 |
| 6889 | 6889 |
| 6890 // Ensure that the expression temp is allocated for nodes that may need it. | 6890 // Ensure that the expression temp is allocated for nodes that may need it. |
| 6891 AstNode* Parser::CreateAssignmentNode(AstNode* original, AstNode* rhs) { | 6891 AstNode* Parser::CreateAssignmentNode(AstNode* original, AstNode* rhs) { |
| 6892 AstNode* result = original->MakeAssignmentNode(rhs); | 6892 AstNode* result = original->MakeAssignmentNode(rhs); |
| 6893 if ((result == NULL) && original->IsTypeNode()) { |
| 6894 const String& type_name = String::ZoneHandle( |
| 6895 original->AsTypeNode()->type().ClassName()); |
| 6896 // TODO(tball): determine whether NoSuchMethod should be called instead. |
| 6897 result = ThrowNoSuchMethodError(original->token_pos(), type_name); |
| 6898 } |
| 6893 if ((result != NULL) && | 6899 if ((result != NULL) && |
| 6894 (result->IsStoreIndexedNode() || | 6900 (result->IsStoreIndexedNode() || |
| 6895 result->IsInstanceSetterNode() || | 6901 result->IsInstanceSetterNode() || |
| 6896 result->IsStaticSetterNode() || | 6902 result->IsStaticSetterNode() || |
| 6897 result->IsStoreStaticFieldNode() || | 6903 result->IsStoreStaticFieldNode() || |
| 6898 result->IsStoreLocalNode())) { | 6904 result->IsStoreLocalNode())) { |
| 6899 EnsureExpressionTemp(); | 6905 EnsureExpressionTemp(); |
| 6900 } | 6906 } |
| 6901 return result; | 6907 return result; |
| 6902 } | 6908 } |
| (...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7475 selector = ParseClosureCall(closure); | 7481 selector = ParseClosureCall(closure); |
| 7476 } | 7482 } |
| 7477 } else { | 7483 } else { |
| 7478 // No (more) selectors to parse. | 7484 // No (more) selectors to parse. |
| 7479 left = LoadFieldIfUnresolved(left); | 7485 left = LoadFieldIfUnresolved(left); |
| 7480 if (left->IsPrimaryNode()) { | 7486 if (left->IsPrimaryNode()) { |
| 7481 PrimaryNode* primary = left->AsPrimaryNode(); | 7487 PrimaryNode* primary = left->AsPrimaryNode(); |
| 7482 if (primary->primary().IsFunction()) { | 7488 if (primary->primary().IsFunction()) { |
| 7483 // Treat as implicit closure. | 7489 // Treat as implicit closure. |
| 7484 left = LoadClosure(primary); | 7490 left = LoadClosure(primary); |
| 7485 } else if (left->AsPrimaryNode()->primary().IsClass()) { | 7491 } else if (primary->primary().IsClass()) { |
| 7486 Class& cls = Class::CheckedHandle( | 7492 const Class& type_class = Class::Cast(primary->primary()); |
| 7487 left->AsPrimaryNode()->primary().raw()); | 7493 Type& type = Type::ZoneHandle( |
| 7488 String& cls_name = String::Handle(cls.Name()); | 7494 Type::New(type_class, TypeArguments::Handle(), |
| 7489 ErrorMsg(left->token_pos(), | 7495 primary->token_pos(), Heap::kOld)); |
| 7490 "illegal use of class name '%s'", | 7496 type ^= ClassFinalizer::FinalizeType( |
| 7491 cls_name.ToCString()); | 7497 current_class(), type, ClassFinalizer::kCanonicalize); |
| 7498 left = new TypeNode(primary->token_pos(), type); |
| 7492 } else if (primary->IsSuper()) { | 7499 } else if (primary->IsSuper()) { |
| 7493 // Return "super" to handle unary super operator calls, | 7500 // Return "super" to handle unary super operator calls, |
| 7494 // or to report illegal use of "super" otherwise. | 7501 // or to report illegal use of "super" otherwise. |
| 7495 left = primary; | 7502 left = primary; |
| 7496 } else { | 7503 } else { |
| 7497 UNREACHABLE(); // Internal parser error. | 7504 UNREACHABLE(); // Internal parser error. |
| 7498 } | 7505 } |
| 7499 } | 7506 } |
| 7500 // Done parsing selectors. | 7507 // Done parsing selectors. |
| 7501 return left; | 7508 return left; |
| (...skipping 2198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9700 void Parser::SkipQualIdent() { | 9707 void Parser::SkipQualIdent() { |
| 9701 ASSERT(IsIdentifier()); | 9708 ASSERT(IsIdentifier()); |
| 9702 ConsumeToken(); | 9709 ConsumeToken(); |
| 9703 if (CurrentToken() == Token::kPERIOD) { | 9710 if (CurrentToken() == Token::kPERIOD) { |
| 9704 ConsumeToken(); // Consume the kPERIOD token. | 9711 ConsumeToken(); // Consume the kPERIOD token. |
| 9705 ExpectIdentifier("identifier expected after '.'"); | 9712 ExpectIdentifier("identifier expected after '.'"); |
| 9706 } | 9713 } |
| 9707 } | 9714 } |
| 9708 | 9715 |
| 9709 } // namespace dart | 9716 } // namespace dart |
| OLD | NEW |