Index: runtime/vm/parser.cc |
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc |
index 32c3ff7bb5d4f2cf6d787db2a26e9aa2310f4611..0ab4794097cc27b1c13f368ede8b8f774cffaa8e 100644 |
--- a/runtime/vm/parser.cc |
+++ b/runtime/vm/parser.cc |
@@ -5471,24 +5471,27 @@ void Parser::ParseTypedef(const GrowableObjectArray& pending_classes, |
function_type_alias.set_is_synthesized_class(); |
function_type_alias.set_is_abstract(); |
function_type_alias.set_is_prefinalized(); |
+ // Make sure the function type alias can be recognized as a typedef class by |
+ // setting its signature function. When use_function_type_syntax is true, this |
+ // temporary signature function is replaced while parsing the function type. |
+ Function& signature_function = Function::Handle( |
+ Z, Function::NewSignatureFunction(function_type_alias, |
+ Function::Handle(Z), alias_name_pos)); |
+ function_type_alias.set_signature_function(signature_function); |
library_.AddClass(function_type_alias); |
+ ASSERT(function_type_alias.IsTypedefClass()); |
ASSERT(current_class().IsTopLevel()); |
set_current_class(function_type_alias); |
// Parse the type parameters of the typedef class. |
ParseTypeParameters(true); // Parameterizing current class. |
- Function& signature_function = Function::Handle(Z); |
ASSERT(innermost_function().IsNull()); |
if (use_function_type_syntax) { |
ExpectToken(Token::kASSIGN); |
ASSERT(result_type.IsNull()); // Not parsed yet. |
- // Do not resolve types before the function type alias can be recognized as |
- // a typedef class, so that correct promotion of function types can occur. |
const Type& function_type = Type::Handle( |
Z, ParseFunctionType(result_type, ClassFinalizer::kDoNotResolve)); |
signature_function = function_type.signature(); |
} else { |
- signature_function = Function::NewSignatureFunction( |
- function_type_alias, Function::Handle(Z), alias_name_pos); |
innermost_function_ = signature_function.raw(); |
ParamList params; |
// Parse the formal parameters of the function type. |
@@ -5511,9 +5514,7 @@ void Parser::ParseTypedef(const GrowableObjectArray& pending_classes, |
} |
ExpectSemicolon(); |
ASSERT(innermost_function().IsNull()); |
- |
- // Set the signature function in the function type alias class. |
- function_type_alias.set_signature_function(signature_function); |
+ ASSERT(function_type_alias.signature_function() == signature_function.raw()); |
// At this point, all function type parameters have been parsed and the class |
// function_type_alias is recognized as a typedef, so we can resolve all type |
@@ -13402,6 +13403,12 @@ RawType* Parser::ParseFunctionType( |
¶ms); |
AddFormalParamsToFunction(¶ms, signature_function); |
innermost_function_ = innermost_function_.parent_function(); |
+ if (innermost_function().IsNull() && current_class().IsTypedefClass() && |
+ !IsFunctionTypeSymbol()) { |
+ // The last parsed signature function is the typedef signature function. |
+ // Set it in the typedef class before building the signature type. |
+ current_class().set_signature_function(signature_function); |
+ } |
type = signature_function.SignatureType(); |
} while (IsFunctionTypeSymbol()); |
// At this point, all type parameters have been parsed, resolve the type. |