| Index: runtime/vm/parser.cc
|
| diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
|
| index bd6eec9734317bf05ff31c53df9acc3f6d5f20bc..af71b1a57d697001f9989b8c1e636820f67747a5 100644
|
| --- a/runtime/vm/parser.cc
|
| +++ b/runtime/vm/parser.cc
|
| @@ -2270,6 +2270,9 @@ void Parser::ParseFormalParameter(bool allow_explicit_default_value,
|
| &func_params);
|
|
|
| signature_function.set_result_type(result_type);
|
| + // The result type may refer to the signature function's type parameters,
|
| + // but was not parsed in the scope of the signature function. Adjust.
|
| + result_type.SetScopeFunction(signature_function);
|
| AddFormalParamsToFunction(&func_params, signature_function);
|
|
|
| ASSERT(innermost_function().raw() == signature_function.raw());
|
| @@ -3675,7 +3678,7 @@ SequenceNode* Parser::ParseFunc(const Function& func, bool check_semicolon) {
|
| if (func.parameter_types() == Object::empty_array().raw()) {
|
| AddFormalParamsToFunction(¶ms, func);
|
| }
|
| - ResolveSignature(func);
|
| + ResolveSignatureTypeParameters(func);
|
| if (!is_top_level_) {
|
| ClassFinalizer::FinalizeSignature(Class::Handle(Z, func.origin()), func);
|
| }
|
| @@ -4272,7 +4275,11 @@ void Parser::ParseMethodOrConstructor(ClassDesc* members, MemberDesc* method) {
|
| func.set_name(*method->name);
|
| func.set_is_abstract(method->has_abstract);
|
| func.set_is_native(method->has_native);
|
| - func.set_result_type(*method->type); // May set parent_function in type.
|
| + func.set_result_type(*method->type);
|
| + // The result type may refer to func's type parameters,
|
| + // but was not parsed in the scope of func. Adjust.
|
| + method->type->SetScopeFunction(func);
|
| +
|
| func.set_end_token_pos(method_end_pos);
|
| func.set_is_redirecting(is_redirecting);
|
| func.set_modifier(async_modifier);
|
| @@ -4305,7 +4312,7 @@ void Parser::ParseMethodOrConstructor(ClassDesc* members, MemberDesc* method) {
|
| AddFormalParamsToFunction(&method->params, func);
|
| ASSERT(innermost_function().raw() == func.raw());
|
| innermost_function_ = Function::null();
|
| - ResolveSignature(func);
|
| + ResolveSignatureTypeParameters(func);
|
| members->AddFunction(func);
|
| }
|
|
|
| @@ -4445,7 +4452,7 @@ void Parser::ParseFieldDefinition(ClassDesc* members, MemberDesc* field) {
|
| getter.set_result_type(*field->type);
|
| getter.set_is_debuggable(false);
|
| AddFormalParamsToFunction(¶ms, getter);
|
| - ResolveSignature(getter);
|
| + ResolveSignatureTypeParameters(getter);
|
| members->AddFunction(getter);
|
| if (!field->has_final) {
|
| // Build a setter accessor for non-const fields.
|
| @@ -4467,7 +4474,7 @@ void Parser::ParseFieldDefinition(ClassDesc* members, MemberDesc* field) {
|
| setter.set_is_reflectable(false);
|
| }
|
| AddFormalParamsToFunction(¶ms, setter);
|
| - ResolveSignature(setter);
|
| + ResolveSignatureTypeParameters(setter);
|
| members->AddFunction(setter);
|
| }
|
| }
|
| @@ -4728,7 +4735,7 @@ void Parser::ParseClassMemberDefinition(ClassDesc* members,
|
| }
|
| if (!member.type->IsResolved()) {
|
| AbstractType& type = AbstractType::ZoneHandle(Z, member.type->raw());
|
| - ResolveType(&type);
|
| + ResolveTypeParameters(&type);
|
| member.type = &type;
|
| }
|
| ParseFieldDefinition(members, &member);
|
| @@ -5084,7 +5091,7 @@ void Parser::ParseEnumDefinition(const Class& cls) {
|
| ParamList params;
|
| params.AddReceiver(&Object::dynamic_type(), cls.token_pos());
|
| AddFormalParamsToFunction(¶ms, getter);
|
| - ResolveSignature(getter);
|
| + ResolveSignatureTypeParameters(getter);
|
| enum_members.AddFunction(getter);
|
|
|
| ASSERT(IsIdentifier());
|
| @@ -5212,7 +5219,7 @@ void Parser::ParseEnumDefinition(const Class& cls) {
|
| ParamList name_params;
|
| name_params.AddReceiver(&Object::dynamic_type(), cls.token_pos());
|
| AddFormalParamsToFunction(&name_params, name_getter);
|
| - ResolveSignature(name_getter);
|
| + ResolveSignatureTypeParameters(name_getter);
|
| enum_members.AddFunction(name_getter);
|
|
|
| // Clone the toString() function from the helper class.
|
| @@ -5263,7 +5270,7 @@ void Parser::AddImplicitConstructor(const Class& cls) {
|
|
|
| AddFormalParamsToFunction(¶ms, ctor);
|
| ctor.set_result_type(Object::dynamic_type());
|
| - ResolveSignature(ctor);
|
| + ResolveSignatureTypeParameters(ctor);
|
| // The body of the constructor cannot modify the type of the constructed
|
| // instance, which is passed in as the receiver.
|
| ctor.set_result_type(*receiver_type);
|
| @@ -5514,6 +5521,9 @@ void Parser::ParseTypedef(const GrowableObjectArray& pending_classes,
|
| result_type = Type::DynamicType();
|
| }
|
| signature_function.set_result_type(result_type);
|
| + // The result type may refer to the signature function's type parameters,
|
| + // but was not parsed in the scope of the signature function. Adjust.
|
| + result_type.SetScopeFunction(signature_function);
|
| AddFormalParamsToFunction(¶ms, signature_function);
|
| ASSERT(innermost_function().raw() == signature_function.raw());
|
| innermost_function_ = Function::null();
|
| @@ -5528,7 +5538,7 @@ void Parser::ParseTypedef(const GrowableObjectArray& pending_classes,
|
| AbstractType& function_type =
|
| Type::Handle(Z, signature_function.SignatureType());
|
| ASSERT(current_class().raw() == function_type_alias.raw());
|
| - ResolveType(&function_type);
|
| + ResolveTypeParameters(&function_type);
|
| // Resolving does not replace type or signature.
|
| ASSERT(function_type_alias.signature_function() ==
|
| Type::Cast(function_type).signature());
|
| @@ -5741,7 +5751,7 @@ void Parser::ParseTypeParameters(bool parameterizing_class) {
|
| for (intptr_t i = 0; i < num_types; i++) {
|
| type_parameter ^= type_parameters.TypeAt(i);
|
| type_parameter_bound = type_parameter.bound();
|
| - ResolveType(&type_parameter_bound);
|
| + ResolveTypeParameters(&type_parameter_bound);
|
| type_parameter.set_bound(type_parameter_bound);
|
| }
|
| }
|
| @@ -6057,6 +6067,9 @@ void Parser::ParseTopLevelFunction(TopLevel* top_level,
|
| ReportError("function block expected");
|
| }
|
| func.set_result_type(result_type);
|
| + // The result type may refer to func's type parameters,
|
| + // but was not parsed in the scope of func. Adjust.
|
| + result_type.SetScopeFunction(func);
|
| func.set_end_token_pos(function_end_pos);
|
| func.set_modifier(func_modifier);
|
| if (library_.is_dart_scheme() && library_.IsPrivate(func_name)) {
|
| @@ -6068,7 +6081,7 @@ void Parser::ParseTopLevelFunction(TopLevel* top_level,
|
| AddFormalParamsToFunction(¶ms, func);
|
| ASSERT(innermost_function().raw() == func.raw());
|
| innermost_function_ = Function::null();
|
| - ResolveSignature(func);
|
| + ResolveSignatureTypeParameters(func);
|
| top_level->AddFunction(func);
|
| if (!is_patch) {
|
| library_.AddObject(func, func_name);
|
| @@ -6213,6 +6226,9 @@ void Parser::ParseTopLevelAccessor(TopLevel* top_level,
|
| /* is_abstract = */ false, is_external, is_native, owner,
|
| decl_begin_pos));
|
| func.set_result_type(result_type);
|
| + // The result type may refer to func's type parameters,
|
| + // but was not parsed in the scope of func. Adjust.
|
| + result_type.SetScopeFunction(func);
|
| func.set_end_token_pos(accessor_end_pos);
|
| func.set_modifier(func_modifier);
|
| if (is_native) {
|
| @@ -6223,7 +6239,7 @@ void Parser::ParseTopLevelAccessor(TopLevel* top_level,
|
| func.set_is_reflectable(false);
|
| }
|
| AddFormalParamsToFunction(¶ms, func);
|
| - ResolveSignature(func);
|
| + ResolveSignatureTypeParameters(func);
|
| top_level->AddFunction(func);
|
| if (!is_patch) {
|
| library_.AddObject(func, accessor_name);
|
| @@ -7077,7 +7093,7 @@ RawFunction* Parser::OpenSyncGeneratorFunction(TokenPosition func_pos) {
|
| if (is_new_closure) {
|
| // Add the parameters to the newly created closure.
|
| AddFormalParamsToFunction(&closure_params, body);
|
| - ResolveSignature(body);
|
| + ResolveSignatureTypeParameters(body);
|
| // Finalize function type.
|
| Type& signature_type = Type::Handle(Z, body.SignatureType());
|
| signature_type ^= CanonicalizeType(signature_type);
|
| @@ -7205,7 +7221,7 @@ RawFunction* Parser::OpenAsyncFunction(TokenPosition async_func_pos) {
|
| if (is_new_closure) {
|
| // Add the parameters to the newly created closure.
|
| AddFormalParamsToFunction(&closure_params, closure);
|
| - ResolveSignature(closure);
|
| + ResolveSignatureTypeParameters(closure);
|
|
|
| // Finalize function type.
|
| Type& signature_type = Type::Handle(Z, closure.SignatureType());
|
| @@ -7343,7 +7359,7 @@ RawFunction* Parser::OpenAsyncGeneratorFunction(TokenPosition async_func_pos) {
|
| if (is_new_closure) {
|
| // Add the parameters to the newly created closure.
|
| AddFormalParamsToFunction(&closure_params, closure);
|
| - ResolveSignature(closure);
|
| + ResolveSignatureTypeParameters(closure);
|
|
|
| // Finalize function type.
|
| Type& signature_type = Type::Handle(Z, closure.SignatureType());
|
| @@ -7784,7 +7800,7 @@ void Parser::FinalizeFormalParameterTypes(const ParamList* params) {
|
| for (int i = 0; i < num_parameters; i++) {
|
| ParamDesc& param_desc = (*params->parameters)[i];
|
| type = param_desc.type->raw();
|
| - ResolveType(&type);
|
| + ResolveTypeParameters(&type);
|
| type = CanonicalizeType(type);
|
| if (type.raw() != param_desc.type->raw()) {
|
| param_desc.type = &AbstractType::ZoneHandle(Z, type.raw());
|
| @@ -8166,6 +8182,9 @@ AstNode* Parser::ParseFunctionStatement(bool is_literal) {
|
| function = Function::NewClosureFunction(*function_name,
|
| innermost_function(), function_pos);
|
| function.set_result_type(result_type);
|
| + // The result type may refer to the function's type parameters,
|
| + // but was not parsed in the scope of the function. Adjust.
|
| + result_type.SetScopeFunction(function);
|
| if (FLAG_enable_mirrors && metadata_pos.IsReal()) {
|
| library_.AddFunctionMetadata(function, metadata_pos);
|
| }
|
| @@ -8231,8 +8250,9 @@ AstNode* Parser::ParseFunctionStatement(bool is_literal) {
|
| // variables of this function's scope that are referenced by the local
|
| // function (and its inner nested functions) will be marked as captured.
|
|
|
| - ResolveType(&result_type); // Parameter types are resolved in ParseFunc.
|
| - function.set_result_type(result_type);
|
| + ResolveTypeParameters(&result_type);
|
| + function.set_result_type(result_type); // Update type without scope change.
|
| + // Type parameters appearing in parameter types are resolved in ParseFunc.
|
| statements = Parser::ParseFunc(function, !is_literal);
|
| INC_STAT(thread(), num_functions_parsed, 1);
|
|
|
| @@ -12556,7 +12576,7 @@ AstNode* Parser::ParsePostfixExpr() {
|
| // Resolve the type parameters that may appear in the given signature from the
|
| // signature function and current class.
|
| // Unresolved type classes get resolved later by the class finalizer.
|
| -void Parser::ResolveSignature(const Function& signature) {
|
| +void Parser::ResolveSignatureTypeParameters(const Function& signature) {
|
| const Function& saved_innermost_function =
|
| Function::Handle(Z, innermost_function().raw());
|
| innermost_function_ = signature.raw();
|
| @@ -12570,19 +12590,19 @@ void Parser::ResolveSignature(const Function& signature) {
|
| for (intptr_t i = 0; i < num_type_params; i++) {
|
| type_param ^= type_params.TypeAt(i);
|
| type = type_param.bound();
|
| - ResolveType(&type);
|
| + ResolveTypeParameters(&type);
|
| type_param.set_bound(type);
|
| }
|
| }
|
| // Resolve result type.
|
| type = signature.result_type();
|
| - ResolveType(&type);
|
| - signature.set_result_type(type);
|
| + ResolveTypeParameters(&type);
|
| + signature.set_result_type(type); // Update type without scope change.
|
| // Resolve formal parameter types.
|
| const intptr_t num_parameters = signature.NumParameters();
|
| for (intptr_t i = 0; i < num_parameters; i++) {
|
| type = signature.ParameterTypeAt(i);
|
| - ResolveType(&type);
|
| + ResolveTypeParameters(&type);
|
| signature.SetParameterTypeAt(i, type);
|
| }
|
| innermost_function_ = saved_innermost_function.raw();
|
| @@ -12592,7 +12612,7 @@ void Parser::ResolveSignature(const Function& signature) {
|
| // Resolve the type parameters that may appear in the given type and in its type
|
| // arguments from the current function and current class.
|
| // Unresolved type classes get resolved later by the class finalizer.
|
| -void Parser::ResolveType(AbstractType* type) {
|
| +void Parser::ResolveTypeParameters(AbstractType* type) {
|
| ASSERT(type != NULL);
|
| if (type->IsResolved()) {
|
| // Some types are resolved by definition, such as a TypeParameter.
|
| @@ -12671,7 +12691,7 @@ void Parser::ResolveType(AbstractType* type) {
|
| AbstractType& type_argument = AbstractType::Handle(Z);
|
| for (intptr_t i = 0; i < num_arguments; i++) {
|
| type_argument = arguments.TypeAt(i);
|
| - ResolveType(&type_argument);
|
| + ResolveTypeParameters(&type_argument);
|
| arguments.SetTypeAt(i, type_argument);
|
| }
|
| }
|
| @@ -12681,9 +12701,9 @@ void Parser::ResolveType(AbstractType* type) {
|
| Function::Handle(Z, Type::Cast(*type).signature());
|
| Type& signature_type = Type::Handle(Z, signature.SignatureType());
|
| if (signature_type.raw() != type->raw()) {
|
| - ResolveType(&signature_type);
|
| + ResolveTypeParameters(&signature_type);
|
| } else {
|
| - ResolveSignature(signature);
|
| + ResolveSignatureTypeParameters(signature);
|
| }
|
| }
|
| }
|
| @@ -13345,7 +13365,7 @@ RawAbstractType* Parser::ParseTypeOrFunctionType(
|
| return Type::DynamicType();
|
| }
|
| if (finalization >= ClassFinalizer::kResolveTypeParameters) {
|
| - ResolveType(&type);
|
| + ResolveTypeParameters(&type);
|
| if (finalization >= ClassFinalizer::kCanonicalize) {
|
| type ^= CanonicalizeType(type);
|
| }
|
| @@ -13384,6 +13404,9 @@ RawType* Parser::ParseFunctionType(
|
| TokenPosition::kNoSource));
|
| innermost_function_ = signature_function.raw();
|
| signature_function.set_result_type(type);
|
| + // The result type may refer to the signature function's type parameters,
|
| + // but was not parsed in the scope of the signature function. Adjust.
|
| + type.SetScopeFunction(signature_function);
|
| // Parse optional type parameters.
|
| if (CurrentToken() == Token::kLT) {
|
| if (!FLAG_generic_method_syntax) {
|
| @@ -13422,7 +13445,7 @@ RawType* Parser::ParseFunctionType(
|
| return Type::DynamicType();
|
| }
|
| if (finalization >= ClassFinalizer::kResolveTypeParameters) {
|
| - ResolveType(&type);
|
| + ResolveTypeParameters(&type);
|
| if (finalization >= ClassFinalizer::kCanonicalize) {
|
| type ^= CanonicalizeType(type);
|
| }
|
| @@ -13538,7 +13561,7 @@ RawAbstractType* Parser::ParseType(
|
| AbstractType& type = AbstractType::Handle(
|
| Z, Type::New(type_class, type_arguments, ident_pos, Heap::kOld));
|
| if (finalization >= ClassFinalizer::kResolveTypeParameters) {
|
| - ResolveType(&type);
|
| + ResolveTypeParameters(&type);
|
| if (finalization >= ClassFinalizer::kCanonicalize) {
|
| type ^= CanonicalizeType(type);
|
| }
|
| @@ -14093,7 +14116,7 @@ RawFunction* Parser::BuildConstructorClosureFunction(const Function& ctr,
|
| // TODO(regis): Verify that the closure cannot be generic.
|
| closure.set_result_type(Object::dynamic_type());
|
| AddFormalParamsToFunction(¶ms, closure);
|
| - ResolveSignature(closure);
|
| + ResolveSignatureTypeParameters(closure);
|
|
|
| // Finalize function type.
|
| Type& signature_type = Type::Handle(Z, closure.SignatureType());
|
|
|