| 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 #include "vm/flags.h" | 6 #include "vm/flags.h" |
| 7 | 7 |
| 8 #ifndef DART_PRECOMPILED_RUNTIME | 8 #ifndef DART_PRECOMPILED_RUNTIME |
| 9 | 9 |
| 10 #include "lib/invocation_mirror.h" | 10 #include "lib/invocation_mirror.h" |
| (...skipping 5453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5464 | 5464 |
| 5465 // Create the function type alias scope class. It will be linked to its | 5465 // Create the function type alias scope class. It will be linked to its |
| 5466 // signature function after it has been parsed. The type parameters, in order | 5466 // signature function after it has been parsed. The type parameters, in order |
| 5467 // to be properly finalized, need to be associated to this scope class as | 5467 // to be properly finalized, need to be associated to this scope class as |
| 5468 // they are parsed. | 5468 // they are parsed. |
| 5469 const Class& function_type_alias = Class::Handle( | 5469 const Class& function_type_alias = Class::Handle( |
| 5470 Z, Class::New(library_, *alias_name, script_, declaration_pos)); | 5470 Z, Class::New(library_, *alias_name, script_, declaration_pos)); |
| 5471 function_type_alias.set_is_synthesized_class(); | 5471 function_type_alias.set_is_synthesized_class(); |
| 5472 function_type_alias.set_is_abstract(); | 5472 function_type_alias.set_is_abstract(); |
| 5473 function_type_alias.set_is_prefinalized(); | 5473 function_type_alias.set_is_prefinalized(); |
| 5474 // Make sure the function type alias can be recognized as a typedef class by |
| 5475 // setting its signature function. When use_function_type_syntax is true, this |
| 5476 // temporary signature function is replaced while parsing the function type. |
| 5477 Function& signature_function = Function::Handle( |
| 5478 Z, Function::NewSignatureFunction(function_type_alias, |
| 5479 Function::Handle(Z), alias_name_pos)); |
| 5480 function_type_alias.set_signature_function(signature_function); |
| 5474 library_.AddClass(function_type_alias); | 5481 library_.AddClass(function_type_alias); |
| 5482 ASSERT(function_type_alias.IsTypedefClass()); |
| 5475 ASSERT(current_class().IsTopLevel()); | 5483 ASSERT(current_class().IsTopLevel()); |
| 5476 set_current_class(function_type_alias); | 5484 set_current_class(function_type_alias); |
| 5477 // Parse the type parameters of the typedef class. | 5485 // Parse the type parameters of the typedef class. |
| 5478 ParseTypeParameters(true); // Parameterizing current class. | 5486 ParseTypeParameters(true); // Parameterizing current class. |
| 5479 Function& signature_function = Function::Handle(Z); | |
| 5480 ASSERT(innermost_function().IsNull()); | 5487 ASSERT(innermost_function().IsNull()); |
| 5481 if (use_function_type_syntax) { | 5488 if (use_function_type_syntax) { |
| 5482 ExpectToken(Token::kASSIGN); | 5489 ExpectToken(Token::kASSIGN); |
| 5483 ASSERT(result_type.IsNull()); // Not parsed yet. | 5490 ASSERT(result_type.IsNull()); // Not parsed yet. |
| 5484 // Do not resolve types before the function type alias can be recognized as | |
| 5485 // a typedef class, so that correct promotion of function types can occur. | |
| 5486 const Type& function_type = Type::Handle( | 5491 const Type& function_type = Type::Handle( |
| 5487 Z, ParseFunctionType(result_type, ClassFinalizer::kDoNotResolve)); | 5492 Z, ParseFunctionType(result_type, ClassFinalizer::kDoNotResolve)); |
| 5488 signature_function = function_type.signature(); | 5493 signature_function = function_type.signature(); |
| 5489 } else { | 5494 } else { |
| 5490 signature_function = Function::NewSignatureFunction( | |
| 5491 function_type_alias, Function::Handle(Z), alias_name_pos); | |
| 5492 innermost_function_ = signature_function.raw(); | 5495 innermost_function_ = signature_function.raw(); |
| 5493 ParamList params; | 5496 ParamList params; |
| 5494 // Parse the formal parameters of the function type. | 5497 // Parse the formal parameters of the function type. |
| 5495 CheckToken(Token::kLPAREN, "formal parameter list expected"); | 5498 CheckToken(Token::kLPAREN, "formal parameter list expected"); |
| 5496 // Add implicit closure object parameter. | 5499 // Add implicit closure object parameter. |
| 5497 params.AddFinalParameter(TokenPos(), &Symbols::ClosureParameter(), | 5500 params.AddFinalParameter(TokenPos(), &Symbols::ClosureParameter(), |
| 5498 &Object::dynamic_type()); | 5501 &Object::dynamic_type()); |
| 5499 const bool allow_explicit_default_values = false; | 5502 const bool allow_explicit_default_values = false; |
| 5500 const bool evaluate_metadata = false; | 5503 const bool evaluate_metadata = false; |
| 5501 ParseFormalParameterList(use_function_type_syntax, | 5504 ParseFormalParameterList(use_function_type_syntax, |
| 5502 allow_explicit_default_values, evaluate_metadata, | 5505 allow_explicit_default_values, evaluate_metadata, |
| 5503 ¶ms); | 5506 ¶ms); |
| 5504 if (result_type.IsNull()) { | 5507 if (result_type.IsNull()) { |
| 5505 result_type = Type::DynamicType(); | 5508 result_type = Type::DynamicType(); |
| 5506 } | 5509 } |
| 5507 signature_function.set_result_type(result_type); | 5510 signature_function.set_result_type(result_type); |
| 5508 AddFormalParamsToFunction(¶ms, signature_function); | 5511 AddFormalParamsToFunction(¶ms, signature_function); |
| 5509 ASSERT(innermost_function().raw() == signature_function.raw()); | 5512 ASSERT(innermost_function().raw() == signature_function.raw()); |
| 5510 innermost_function_ = Function::null(); | 5513 innermost_function_ = Function::null(); |
| 5511 } | 5514 } |
| 5512 ExpectSemicolon(); | 5515 ExpectSemicolon(); |
| 5513 ASSERT(innermost_function().IsNull()); | 5516 ASSERT(innermost_function().IsNull()); |
| 5514 | 5517 ASSERT(function_type_alias.signature_function() == signature_function.raw()); |
| 5515 // Set the signature function in the function type alias class. | |
| 5516 function_type_alias.set_signature_function(signature_function); | |
| 5517 | 5518 |
| 5518 // At this point, all function type parameters have been parsed and the class | 5519 // At this point, all function type parameters have been parsed and the class |
| 5519 // function_type_alias is recognized as a typedef, so we can resolve all type | 5520 // function_type_alias is recognized as a typedef, so we can resolve all type |
| 5520 // parameters in the signature type defined by the typedef. | 5521 // parameters in the signature type defined by the typedef. |
| 5521 AbstractType& function_type = | 5522 AbstractType& function_type = |
| 5522 Type::Handle(Z, signature_function.SignatureType()); | 5523 Type::Handle(Z, signature_function.SignatureType()); |
| 5523 ASSERT(current_class().raw() == function_type_alias.raw()); | 5524 ASSERT(current_class().raw() == function_type_alias.raw()); |
| 5524 ResolveType(&function_type); | 5525 ResolveType(&function_type); |
| 5525 // Resolving does not replace type or signature. | 5526 // Resolving does not replace type or signature. |
| 5526 ASSERT(function_type_alias.signature_function() == | 5527 ASSERT(function_type_alias.signature_function() == |
| (...skipping 7868 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13395 &Object::dynamic_type()); | 13396 &Object::dynamic_type()); |
| 13396 | 13397 |
| 13397 const bool use_function_type_syntax = true; | 13398 const bool use_function_type_syntax = true; |
| 13398 const bool allow_explicit_default_values = false; | 13399 const bool allow_explicit_default_values = false; |
| 13399 const bool evaluate_metadata = false; | 13400 const bool evaluate_metadata = false; |
| 13400 ParseFormalParameterList(use_function_type_syntax, | 13401 ParseFormalParameterList(use_function_type_syntax, |
| 13401 allow_explicit_default_values, evaluate_metadata, | 13402 allow_explicit_default_values, evaluate_metadata, |
| 13402 ¶ms); | 13403 ¶ms); |
| 13403 AddFormalParamsToFunction(¶ms, signature_function); | 13404 AddFormalParamsToFunction(¶ms, signature_function); |
| 13404 innermost_function_ = innermost_function_.parent_function(); | 13405 innermost_function_ = innermost_function_.parent_function(); |
| 13406 if (innermost_function().IsNull() && current_class().IsTypedefClass() && |
| 13407 !IsFunctionTypeSymbol()) { |
| 13408 // The last parsed signature function is the typedef signature function. |
| 13409 // Set it in the typedef class before building the signature type. |
| 13410 current_class().set_signature_function(signature_function); |
| 13411 } |
| 13405 type = signature_function.SignatureType(); | 13412 type = signature_function.SignatureType(); |
| 13406 } while (IsFunctionTypeSymbol()); | 13413 } while (IsFunctionTypeSymbol()); |
| 13407 // At this point, all type parameters have been parsed, resolve the type. | 13414 // At this point, all type parameters have been parsed, resolve the type. |
| 13408 if (finalization == ClassFinalizer::kIgnore) { | 13415 if (finalization == ClassFinalizer::kIgnore) { |
| 13409 return Type::DynamicType(); | 13416 return Type::DynamicType(); |
| 13410 } | 13417 } |
| 13411 if (finalization >= ClassFinalizer::kResolveTypeParameters) { | 13418 if (finalization >= ClassFinalizer::kResolveTypeParameters) { |
| 13412 ResolveType(&type); | 13419 ResolveType(&type); |
| 13413 if (finalization >= ClassFinalizer::kCanonicalize) { | 13420 if (finalization >= ClassFinalizer::kCanonicalize) { |
| 13414 type ^= CanonicalizeType(type); | 13421 type ^= CanonicalizeType(type); |
| (...skipping 1999 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15414 TokenPosition* start, | 15421 TokenPosition* start, |
| 15415 TokenPosition* end) { | 15422 TokenPosition* end) { |
| 15416 UNREACHABLE(); | 15423 UNREACHABLE(); |
| 15417 return false; | 15424 return false; |
| 15418 } | 15425 } |
| 15419 | 15426 |
| 15420 | 15427 |
| 15421 } // namespace dart | 15428 } // namespace dart |
| 15422 | 15429 |
| 15423 #endif // DART_PRECOMPILED_RUNTIME | 15430 #endif // DART_PRECOMPILED_RUNTIME |
| OLD | NEW |