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 "lib/invocation_mirror.h" | 7 #include "lib/invocation_mirror.h" |
8 #include "platform/utils.h" | 8 #include "platform/utils.h" |
9 #include "vm/bootstrap.h" | 9 #include "vm/bootstrap.h" |
10 #include "vm/class_finalizer.h" | 10 #include "vm/class_finalizer.h" |
(...skipping 8343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8354 left = LoadClosure(left->AsPrimaryNode()); | 8354 left = LoadClosure(left->AsPrimaryNode()); |
8355 } else if (left->AsPrimaryNode()->primary().IsTypeParameter()) { | 8355 } else if (left->AsPrimaryNode()->primary().IsTypeParameter()) { |
8356 if (current_block_->scope->function_level() > 0) { | 8356 if (current_block_->scope->function_level() > 0) { |
8357 // Make sure that the instantiator is captured. | 8357 // Make sure that the instantiator is captured. |
8358 CaptureInstantiator(); | 8358 CaptureInstantiator(); |
8359 } | 8359 } |
8360 TypeParameter& type_parameter = TypeParameter::ZoneHandle(); | 8360 TypeParameter& type_parameter = TypeParameter::ZoneHandle(); |
8361 type_parameter ^= ClassFinalizer::FinalizeType( | 8361 type_parameter ^= ClassFinalizer::FinalizeType( |
8362 current_class(), | 8362 current_class(), |
8363 TypeParameter::Cast(left->AsPrimaryNode()->primary()), | 8363 TypeParameter::Cast(left->AsPrimaryNode()->primary()), |
8364 ClassFinalizer::kFinalize); | 8364 ClassFinalizer::kCanonicalize); |
8365 ASSERT(!type_parameter.IsMalformed()); | 8365 ASSERT(!type_parameter.IsMalformed()); |
8366 left = new TypeNode(primary->token_pos(), type_parameter); | 8366 left = new TypeNode(primary->token_pos(), type_parameter); |
8367 } else { | 8367 } else { |
8368 // Super field access handled in ParseSuperFieldAccess(), | 8368 // Super field access handled in ParseSuperFieldAccess(), |
8369 // super calls handled in ParseSuperCall(). | 8369 // super calls handled in ParseSuperCall(). |
8370 ASSERT(!left->AsPrimaryNode()->IsSuper()); | 8370 ASSERT(!left->AsPrimaryNode()->IsSuper()); |
8371 left = LoadFieldIfUnresolved(left); | 8371 left = LoadFieldIfUnresolved(left); |
8372 } | 8372 } |
8373 } | 8373 } |
8374 const intptr_t ident_pos = TokenPos(); | 8374 const intptr_t ident_pos = TokenPos(); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8431 array = new TypeNode(primary->token_pos(), type); | 8431 array = new TypeNode(primary->token_pos(), type); |
8432 } else if (primary->primary().IsTypeParameter()) { | 8432 } else if (primary->primary().IsTypeParameter()) { |
8433 if (current_block_->scope->function_level() > 0) { | 8433 if (current_block_->scope->function_level() > 0) { |
8434 // Make sure that the instantiator is captured. | 8434 // Make sure that the instantiator is captured. |
8435 CaptureInstantiator(); | 8435 CaptureInstantiator(); |
8436 } | 8436 } |
8437 TypeParameter& type_parameter = TypeParameter::ZoneHandle(); | 8437 TypeParameter& type_parameter = TypeParameter::ZoneHandle(); |
8438 type_parameter ^= ClassFinalizer::FinalizeType( | 8438 type_parameter ^= ClassFinalizer::FinalizeType( |
8439 current_class(), | 8439 current_class(), |
8440 TypeParameter::Cast(primary->primary()), | 8440 TypeParameter::Cast(primary->primary()), |
8441 ClassFinalizer::kFinalize); | 8441 ClassFinalizer::kCanonicalize); |
8442 ASSERT(!type_parameter.IsMalformed()); | 8442 ASSERT(!type_parameter.IsMalformed()); |
8443 array = new TypeNode(primary->token_pos(), type_parameter); | 8443 array = new TypeNode(primary->token_pos(), type_parameter); |
8444 } else { | 8444 } else { |
8445 UNREACHABLE(); // Internal parser error. | 8445 UNREACHABLE(); // Internal parser error. |
8446 } | 8446 } |
8447 } | 8447 } |
8448 selector = new LoadIndexedNode(bracket_pos, | 8448 selector = new LoadIndexedNode(bracket_pos, |
8449 array, | 8449 array, |
8450 index, | 8450 index, |
8451 Class::ZoneHandle()); | 8451 Class::ZoneHandle()); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8496 TypeParameter::Cast(primary->primary()).name()); | 8496 TypeParameter::Cast(primary->primary()).name()); |
8497 selector = ThrowNoSuchMethodError(primary->token_pos(), | 8497 selector = ThrowNoSuchMethodError(primary->token_pos(), |
8498 current_class(), | 8498 current_class(), |
8499 name, | 8499 name, |
8500 NULL, // No arguments. | 8500 NULL, // No arguments. |
8501 InvocationMirror::kStatic, | 8501 InvocationMirror::kStatic, |
8502 InvocationMirror::kMethod, | 8502 InvocationMirror::kMethod, |
8503 NULL); // No existing function. | 8503 NULL); // No existing function. |
8504 } else if (primary->primary().IsClass()) { | 8504 } else if (primary->primary().IsClass()) { |
8505 const Class& type_class = Class::Cast(primary->primary()); | 8505 const Class& type_class = Class::Cast(primary->primary()); |
8506 AbstractType& type = Type::ZoneHandle( | 8506 AbstractType& type = Type::ZoneHandle(Type::New( |
8507 Type::New(type_class, TypeArguments::Handle(), | 8507 type_class, TypeArguments::Handle(), primary->token_pos())); |
8508 primary->token_pos(), Heap::kOld)); | |
8509 type ^= ClassFinalizer::FinalizeType( | 8508 type ^= ClassFinalizer::FinalizeType( |
8510 current_class(), type, ClassFinalizer::kCanonicalize); | 8509 current_class(), type, ClassFinalizer::kCanonicalize); |
8511 // Type may be malbounded, but not malformed. | 8510 // Type may be malbounded, but not malformed. |
8512 ASSERT(!type.IsMalformed()); | 8511 ASSERT(!type.IsMalformed()); |
8513 selector = new TypeNode(primary->token_pos(), type); | 8512 selector = new TypeNode(primary->token_pos(), type); |
8514 } else { | 8513 } else { |
8515 UNREACHABLE(); // Internal parser error. | 8514 UNREACHABLE(); // Internal parser error. |
8516 } | 8515 } |
8517 } else { | 8516 } else { |
8518 // Left is not a primary node; this must be a closure call. | 8517 // Left is not a primary node; this must be a closure call. |
8519 AstNode* closure = left; | 8518 AstNode* closure = left; |
8520 selector = ParseClosureCall(closure); | 8519 selector = ParseClosureCall(closure); |
8521 } | 8520 } |
8522 } else { | 8521 } else { |
8523 // No (more) selectors to parse. | 8522 // No (more) selectors to parse. |
8524 left = LoadFieldIfUnresolved(left); | 8523 left = LoadFieldIfUnresolved(left); |
8525 if (left->IsPrimaryNode()) { | 8524 if (left->IsPrimaryNode()) { |
8526 PrimaryNode* primary = left->AsPrimaryNode(); | 8525 PrimaryNode* primary = left->AsPrimaryNode(); |
8527 if (primary->primary().IsFunction()) { | 8526 if (primary->primary().IsFunction()) { |
8528 // Treat as implicit closure. | 8527 // Treat as implicit closure. |
8529 left = LoadClosure(primary); | 8528 left = LoadClosure(primary); |
8530 } else if (primary->primary().IsClass()) { | 8529 } else if (primary->primary().IsClass()) { |
8531 const Class& type_class = Class::Cast(primary->primary()); | 8530 const Class& type_class = Class::Cast(primary->primary()); |
8532 AbstractType& type = Type::ZoneHandle( | 8531 AbstractType& type = Type::ZoneHandle(Type::New( |
8533 Type::New(type_class, TypeArguments::Handle(), | 8532 type_class, TypeArguments::Handle(), primary->token_pos())); |
8534 primary->token_pos(), Heap::kOld)); | |
8535 type = ClassFinalizer::FinalizeType( | 8533 type = ClassFinalizer::FinalizeType( |
8536 current_class(), type, ClassFinalizer::kCanonicalize); | 8534 current_class(), type, ClassFinalizer::kCanonicalize); |
8537 // Type may be malbounded, but not malformed. | 8535 // Type may be malbounded, but not malformed. |
8538 ASSERT(!type.IsMalformed()); | 8536 ASSERT(!type.IsMalformed()); |
8539 left = new TypeNode(primary->token_pos(), type); | 8537 left = new TypeNode(primary->token_pos(), type); |
8540 } else if (primary->primary().IsTypeParameter()) { | 8538 } else if (primary->primary().IsTypeParameter()) { |
8541 if (current_block_->scope->function_level() > 0) { | 8539 if (current_block_->scope->function_level() > 0) { |
8542 // Make sure that the instantiator is captured. | 8540 // Make sure that the instantiator is captured. |
8543 CaptureInstantiator(); | 8541 CaptureInstantiator(); |
8544 } | 8542 } |
8545 TypeParameter& type_parameter = TypeParameter::ZoneHandle(); | 8543 TypeParameter& type_parameter = TypeParameter::ZoneHandle(); |
8546 type_parameter ^= ClassFinalizer::FinalizeType( | 8544 type_parameter ^= ClassFinalizer::FinalizeType( |
8547 current_class(), | 8545 current_class(), |
8548 TypeParameter::Cast(primary->primary()), | 8546 TypeParameter::Cast(primary->primary()), |
8549 ClassFinalizer::kFinalize); | 8547 ClassFinalizer::kCanonicalize); |
8550 ASSERT(!type_parameter.IsMalformed()); | 8548 ASSERT(!type_parameter.IsMalformed()); |
8551 left = new TypeNode(primary->token_pos(), type_parameter); | 8549 left = new TypeNode(primary->token_pos(), type_parameter); |
8552 } else if (primary->IsSuper()) { | 8550 } else if (primary->IsSuper()) { |
8553 // Return "super" to handle unary super operator calls, | 8551 // Return "super" to handle unary super operator calls, |
8554 // or to report illegal use of "super" otherwise. | 8552 // or to report illegal use of "super" otherwise. |
8555 left = primary; | 8553 left = primary; |
8556 } else { | 8554 } else { |
8557 UNREACHABLE(); // Internal parser error. | 8555 UNREACHABLE(); // Internal parser error. |
8558 } | 8556 } |
8559 } | 8557 } |
(...skipping 653 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9213 // Check whether the identifier is a type parameter. | 9211 // Check whether the identifier is a type parameter. |
9214 if (!current_class().IsNull()) { | 9212 if (!current_class().IsNull()) { |
9215 TypeParameter& type_parameter = TypeParameter::ZoneHandle( | 9213 TypeParameter& type_parameter = TypeParameter::ZoneHandle( |
9216 current_class().LookupTypeParameter(ident)); | 9214 current_class().LookupTypeParameter(ident)); |
9217 if (!type_parameter.IsNull()) { | 9215 if (!type_parameter.IsNull()) { |
9218 if (current_block_->scope->function_level() > 0) { | 9216 if (current_block_->scope->function_level() > 0) { |
9219 // Make sure that the instantiator is captured. | 9217 // Make sure that the instantiator is captured. |
9220 CaptureInstantiator(); | 9218 CaptureInstantiator(); |
9221 } | 9219 } |
9222 type_parameter ^= ClassFinalizer::FinalizeType( | 9220 type_parameter ^= ClassFinalizer::FinalizeType( |
9223 current_class(), type_parameter, ClassFinalizer::kFinalize); | 9221 current_class(), type_parameter, ClassFinalizer::kCanonicalize); |
9224 ASSERT(!type_parameter.IsMalformed()); | 9222 ASSERT(!type_parameter.IsMalformed()); |
9225 return new TypeNode(ident_pos, type_parameter); | 9223 return new TypeNode(ident_pos, type_parameter); |
9226 } | 9224 } |
9227 } | 9225 } |
9228 // Not found in the local scope, and the name is not a type parameter. | 9226 // Not found in the local scope, and the name is not a type parameter. |
9229 // Try finding the variable in the library scope (current library | 9227 // Try finding the variable in the library scope (current library |
9230 // and all libraries imported by it without a library prefix). | 9228 // and all libraries imported by it without a library prefix). |
9231 resolved = ResolveIdentInCurrentLibraryScope(ident_pos, ident); | 9229 resolved = ResolveIdentInCurrentLibraryScope(ident_pos, ident); |
9232 } | 9230 } |
9233 if (resolved->IsPrimaryNode()) { | 9231 if (resolved->IsPrimaryNode()) { |
(...skipping 19 matching lines...) Expand all Loading... |
9253 } else if (primary->primary().IsFunction()) { | 9251 } else if (primary->primary().IsFunction()) { |
9254 if (allow_closure_names) { | 9252 if (allow_closure_names) { |
9255 resolved = LoadClosure(primary); | 9253 resolved = LoadClosure(primary); |
9256 } else { | 9254 } else { |
9257 ErrorMsg(ident_pos, "illegal reference to method '%s'", | 9255 ErrorMsg(ident_pos, "illegal reference to method '%s'", |
9258 ident.ToCString()); | 9256 ident.ToCString()); |
9259 } | 9257 } |
9260 } else if (primary->primary().IsClass()) { | 9258 } else if (primary->primary().IsClass()) { |
9261 const Class& type_class = Class::Cast(primary->primary()); | 9259 const Class& type_class = Class::Cast(primary->primary()); |
9262 AbstractType& type = Type::ZoneHandle( | 9260 AbstractType& type = Type::ZoneHandle( |
9263 Type::New(type_class, TypeArguments::Handle(), | 9261 Type::New(type_class, TypeArguments::Handle(), primary->token_pos())); |
9264 primary->token_pos(), Heap::kOld)); | |
9265 type ^= ClassFinalizer::FinalizeType( | 9262 type ^= ClassFinalizer::FinalizeType( |
9266 current_class(), type, ClassFinalizer::kCanonicalize); | 9263 current_class(), type, ClassFinalizer::kCanonicalize); |
9267 // Type may be malbounded, but not malformed. | 9264 // Type may be malbounded, but not malformed. |
9268 ASSERT(!type.IsMalformed()); | 9265 ASSERT(!type.IsMalformed()); |
9269 resolved = new TypeNode(primary->token_pos(), type); | 9266 resolved = new TypeNode(primary->token_pos(), type); |
9270 } | 9267 } |
9271 } | 9268 } |
9272 return resolved; | 9269 return resolved; |
9273 } | 9270 } |
9274 | 9271 |
(...skipping 1479 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10754 void Parser::SkipQualIdent() { | 10751 void Parser::SkipQualIdent() { |
10755 ASSERT(IsIdentifier()); | 10752 ASSERT(IsIdentifier()); |
10756 ConsumeToken(); | 10753 ConsumeToken(); |
10757 if (CurrentToken() == Token::kPERIOD) { | 10754 if (CurrentToken() == Token::kPERIOD) { |
10758 ConsumeToken(); // Consume the kPERIOD token. | 10755 ConsumeToken(); // Consume the kPERIOD token. |
10759 ExpectIdentifier("identifier expected after '.'"); | 10756 ExpectIdentifier("identifier expected after '.'"); |
10760 } | 10757 } |
10761 } | 10758 } |
10762 | 10759 |
10763 } // namespace dart | 10760 } // namespace dart |
OLD | NEW |