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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 "Enable conditional directives"); | 56 "Enable conditional directives"); |
57 DEFINE_FLAG(bool, generic_method_syntax, true, "Enable generic functions."); | 57 DEFINE_FLAG(bool, generic_method_syntax, true, "Enable generic functions."); |
58 DEFINE_FLAG(bool, | 58 DEFINE_FLAG(bool, |
59 initializing_formal_access, | 59 initializing_formal_access, |
60 true, | 60 true, |
61 "Make initializing formal parameters visible in initializer list."); | 61 "Make initializing formal parameters visible in initializer list."); |
62 DEFINE_FLAG(bool, | 62 DEFINE_FLAG(bool, |
63 warn_super, | 63 warn_super, |
64 false, | 64 false, |
65 "Warning if super initializer not last in initializer list."); | 65 "Warning if super initializer not last in initializer list."); |
66 DEFINE_FLAG(bool, warn_patch, false, "Warn on old-style patch syntax."); | |
67 DEFINE_FLAG( | 66 DEFINE_FLAG( |
68 bool, | 67 bool, |
69 await_is_keyword, | 68 await_is_keyword, |
70 false, | 69 false, |
71 "await and yield are treated as proper keywords in synchronous code."); | 70 "await and yield are treated as proper keywords in synchronous code."); |
72 DEFINE_FLAG(bool, | 71 DEFINE_FLAG(bool, |
73 assert_initializer, | 72 assert_initializer, |
74 false, | 73 false, |
75 "Allow asserts in initializer lists."); | 74 "Allow asserts in initializer lists."); |
76 | 75 |
(...skipping 911 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
988 Thread* thread = Thread::Current(); | 987 Thread* thread = Thread::Current(); |
989 StackZone stack_zone(thread); | 988 StackZone stack_zone(thread); |
990 Zone* zone = stack_zone.GetZone(); | 989 Zone* zone = stack_zone.GetZone(); |
991 const Script& script = Script::Handle(zone, func.script()); | 990 const Script& script = Script::Handle(zone, func.script()); |
992 const Class& owner = Class::Handle(zone, func.Owner()); | 991 const Class& owner = Class::Handle(zone, func.Owner()); |
993 ASSERT(!owner.IsNull()); | 992 ASSERT(!owner.IsNull()); |
994 ParsedFunction* parsed_function = | 993 ParsedFunction* parsed_function = |
995 new ParsedFunction(thread, Function::ZoneHandle(zone, func.raw())); | 994 new ParsedFunction(thread, Function::ZoneHandle(zone, func.raw())); |
996 Parser parser(script, parsed_function, func.token_pos()); | 995 Parser parser(script, parsed_function, func.token_pos()); |
997 parser.SkipFunctionPreamble(); | 996 parser.SkipFunctionPreamble(); |
| 997 const bool use_function_type_syntax = false; |
| 998 const bool allow_explicit_default_values = true; |
| 999 const bool evaluate_metadata = true; |
998 ParamList params; | 1000 ParamList params; |
999 parser.ParseFormalParameterList(true, true, ¶ms); | 1001 parser.ParseFormalParameterList(use_function_type_syntax, |
| 1002 allow_explicit_default_values, |
| 1003 evaluate_metadata, ¶ms); |
1000 ParamDesc* param = params.parameters->data(); | 1004 ParamDesc* param = params.parameters->data(); |
1001 const int param_cnt = | 1005 const int param_cnt = |
1002 params.num_fixed_parameters + params.num_optional_parameters; | 1006 params.num_fixed_parameters + params.num_optional_parameters; |
1003 const Array& param_descriptor = | 1007 const Array& param_descriptor = |
1004 Array::Handle(Array::New(param_cnt * kParameterEntrySize, Heap::kOld)); | 1008 Array::Handle(Array::New(param_cnt * kParameterEntrySize, Heap::kOld)); |
1005 for (int i = 0, j = 0; i < param_cnt; i++, j += kParameterEntrySize) { | 1009 for (int i = 0, j = 0; i < param_cnt; i++, j += kParameterEntrySize) { |
1006 param_descriptor.SetAt(j + kParameterIsFinalOffset, | 1010 param_descriptor.SetAt(j + kParameterIsFinalOffset, |
1007 param[i].is_final ? Bool::True() : Bool::False()); | 1011 param[i].is_final ? Bool::True() : Bool::False()); |
1008 param_descriptor.SetAt(j + kParameterDefaultValueOffset, | 1012 param_descriptor.SetAt(j + kParameterDefaultValueOffset, |
1009 (param[i].default_value == NULL) | 1013 (param[i].default_value == NULL) |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1044 } | 1048 } |
1045 LongJumpScope jump; | 1049 LongJumpScope jump; |
1046 if (setjmp(*jump.Set()) == 0) { | 1050 if (setjmp(*jump.Set()) == 0) { |
1047 const Script& script = Script::Handle(func.script()); | 1051 const Script& script = Script::Handle(func.script()); |
1048 const Class& owner = Class::Handle(func.Owner()); | 1052 const Class& owner = Class::Handle(func.Owner()); |
1049 ASSERT(!owner.IsNull()); | 1053 ASSERT(!owner.IsNull()); |
1050 ParsedFunction* parsed_function = | 1054 ParsedFunction* parsed_function = |
1051 new ParsedFunction(Thread::Current(), Function::ZoneHandle(func.raw())); | 1055 new ParsedFunction(Thread::Current(), Function::ZoneHandle(func.raw())); |
1052 Parser parser(script, parsed_function, func.token_pos()); | 1056 Parser parser(script, parsed_function, func.token_pos()); |
1053 parser.SkipFunctionPreamble(); | 1057 parser.SkipFunctionPreamble(); |
1054 parser.ParseFormalParameterList(true, true, params); | 1058 const bool use_function_type_syntax = false; |
| 1059 const bool allow_explicit_default_values = true; |
| 1060 const bool evaluate_metadata = true; |
| 1061 parser.ParseFormalParameterList(use_function_type_syntax, |
| 1062 allow_explicit_default_values, |
| 1063 evaluate_metadata, params); |
1055 return true; | 1064 return true; |
1056 } else { | 1065 } else { |
1057 Thread::Current()->clear_sticky_error(); | 1066 Thread::Current()->clear_sticky_error(); |
1058 params->Clear(); | 1067 params->Clear(); |
1059 return false; | 1068 return false; |
1060 } | 1069 } |
1061 UNREACHABLE(); | 1070 UNREACHABLE(); |
1062 return false; | 1071 return false; |
1063 } | 1072 } |
1064 | 1073 |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1351 } | 1360 } |
1352 // The instantiator is not required in a static expression. | 1361 // The instantiator is not required in a static expression. |
1353 ASSERT(!parser.IsInstantiatorRequired()); | 1362 ASSERT(!parser.IsInstantiatorRequired()); |
1354 | 1363 |
1355 return parsed_function; | 1364 return parsed_function; |
1356 } | 1365 } |
1357 | 1366 |
1358 | 1367 |
1359 SequenceNode* Parser::ParseStaticFinalGetter(const Function& func) { | 1368 SequenceNode* Parser::ParseStaticFinalGetter(const Function& func) { |
1360 TRACE_PARSER("ParseStaticFinalGetter"); | 1369 TRACE_PARSER("ParseStaticFinalGetter"); |
1361 ParamList params; | |
1362 ASSERT(func.num_fixed_parameters() == 0); // static. | 1370 ASSERT(func.num_fixed_parameters() == 0); // static. |
1363 ASSERT(!func.HasOptionalParameters()); | 1371 ASSERT(!func.HasOptionalParameters()); |
1364 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved()); | 1372 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved()); |
1365 | |
1366 // Build local scope for function and populate with the formal parameters. | |
1367 OpenFunctionBlock(func); | 1373 OpenFunctionBlock(func); |
1368 AddFormalParamsToScope(¶ms, current_block_->scope); | |
1369 | |
1370 TokenPosition ident_pos = TokenPos(); | 1374 TokenPosition ident_pos = TokenPos(); |
1371 const String& field_name = *ExpectIdentifier("field name expected"); | 1375 const String& field_name = *ExpectIdentifier("field name expected"); |
1372 const Class& field_class = Class::Handle(Z, func.Owner()); | 1376 const Class& field_class = Class::Handle(Z, func.Owner()); |
1373 const Field& field = | 1377 const Field& field = |
1374 Field::ZoneHandle(Z, field_class.LookupStaticField(field_name)); | 1378 Field::ZoneHandle(Z, field_class.LookupStaticField(field_name)); |
1375 ASSERT(!field.IsNull()); | 1379 ASSERT(!field.IsNull()); |
1376 | 1380 |
1377 // Static final fields must have an initializer. | 1381 // Static final fields must have an initializer. |
1378 ExpectToken(Token::kASSIGN); | 1382 ExpectToken(Token::kASSIGN); |
1379 | 1383 |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1553 const Function& parent = Function::Handle(func.parent_function()); | 1557 const Function& parent = Function::Handle(func.parent_function()); |
1554 if (parent.IsImplicitSetterFunction()) { | 1558 if (parent.IsImplicitSetterFunction()) { |
1555 const TokenPosition ident_pos = func.token_pos(); | 1559 const TokenPosition ident_pos = func.token_pos(); |
1556 ASSERT(IsIdentifier()); | 1560 ASSERT(IsIdentifier()); |
1557 params.AddFinalParameter(ident_pos, &Symbols::Value(), | 1561 params.AddFinalParameter(ident_pos, &Symbols::Value(), |
1558 &Object::dynamic_type()); | 1562 &Object::dynamic_type()); |
1559 ASSERT(func.num_fixed_parameters() == 2); // closure, value. | 1563 ASSERT(func.num_fixed_parameters() == 2); // closure, value. |
1560 } else if (!parent.IsGetterFunction() && !parent.IsImplicitGetterFunction()) { | 1564 } else if (!parent.IsGetterFunction() && !parent.IsImplicitGetterFunction()) { |
1561 // NOTE: For the `kernel -> flowgraph` we don't use the parser. | 1565 // NOTE: For the `kernel -> flowgraph` we don't use the parser. |
1562 if (parent.kernel_function() == NULL) { | 1566 if (parent.kernel_function() == NULL) { |
| 1567 SkipFunctionPreamble(); |
| 1568 const bool use_function_type_syntax = false; |
1563 const bool allow_explicit_default_values = true; | 1569 const bool allow_explicit_default_values = true; |
1564 SkipFunctionPreamble(); | 1570 const bool evaluate_metadata = false; |
1565 ParseFormalParameterList(allow_explicit_default_values, false, ¶ms); | 1571 ParseFormalParameterList(use_function_type_syntax, |
| 1572 allow_explicit_default_values, evaluate_metadata, |
| 1573 ¶ms); |
| 1574 FinalizeFormalParameterTypes(¶ms); |
1566 SetupDefaultsForOptionalParams(params); | 1575 SetupDefaultsForOptionalParams(params); |
1567 } | 1576 } |
1568 } | 1577 } |
1569 | 1578 |
1570 // Populate function scope with the formal parameters. | 1579 // Populate function scope with the formal parameters. |
1571 LocalScope* scope = current_block_->scope; | 1580 LocalScope* scope = current_block_->scope; |
1572 AddFormalParamsToScope(¶ms, scope); | 1581 AddFormalParamsToScope(¶ms, scope); |
1573 | 1582 |
1574 ArgumentListNode* func_args = new ArgumentListNode(token_pos); | 1583 ArgumentListNode* func_args = new ArgumentListNode(token_pos); |
1575 if (!func.is_static()) { | 1584 if (!func.is_static()) { |
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1930 | 1939 |
1931 // Skips tokens up to and including matching closing parenthesis. | 1940 // Skips tokens up to and including matching closing parenthesis. |
1932 void Parser::SkipToMatchingParenthesis() { | 1941 void Parser::SkipToMatchingParenthesis() { |
1933 ASSERT(CurrentToken() == Token::kLPAREN); | 1942 ASSERT(CurrentToken() == Token::kLPAREN); |
1934 SkipToMatching(); | 1943 SkipToMatching(); |
1935 ASSERT(CurrentToken() == Token::kRPAREN); | 1944 ASSERT(CurrentToken() == Token::kRPAREN); |
1936 ConsumeToken(); | 1945 ConsumeToken(); |
1937 } | 1946 } |
1938 | 1947 |
1939 | 1948 |
| 1949 // Parses a parameter type as defined by the 'parameterTypeList' production. |
| 1950 void Parser::ParseParameterType(ParamList* params) { |
| 1951 TRACE_PARSER("ParseParameterType"); |
| 1952 ParamDesc parameter; |
| 1953 |
| 1954 parameter.has_explicit_type = true; // The type is required by the syntax. |
| 1955 // It is too early to resolve the type here, since it can be a result type |
| 1956 // referring to a not yet declared function type parameter. |
| 1957 parameter.type = &AbstractType::ZoneHandle( |
| 1958 Z, ParseTypeOrFunctionType(false, ClassFinalizer::kDoNotResolve)); |
| 1959 |
| 1960 // At this point, we must see an identifier for the parameter name, unless |
| 1961 // we are using the function type syntax (in which case the name is optional, |
| 1962 // unless we expect optional named parameters). |
| 1963 if (IsIdentifier()) { |
| 1964 parameter.name_pos = TokenPos(); |
| 1965 parameter.name = CurrentLiteral(); |
| 1966 ConsumeToken(); |
| 1967 |
| 1968 if (params->has_optional_named_parameters && |
| 1969 (parameter.name->CharAt(0) == Library::kPrivateIdentifierStart)) { |
| 1970 ReportError(parameter.name_pos, "named parameter must not be private"); |
| 1971 } |
| 1972 |
| 1973 // Check for duplicate formal parameters. |
| 1974 const intptr_t num_existing_parameters = |
| 1975 params->num_fixed_parameters + params->num_optional_parameters; |
| 1976 for (intptr_t i = 0; i < num_existing_parameters; i++) { |
| 1977 ParamDesc& existing_parameter = (*params->parameters)[i]; |
| 1978 if (existing_parameter.name->Equals(*parameter.name)) { |
| 1979 ReportError(parameter.name_pos, "duplicate formal parameter '%s'", |
| 1980 parameter.name->ToCString()); |
| 1981 } |
| 1982 } |
| 1983 } else if (params->has_optional_named_parameters) { |
| 1984 ExpectIdentifier("parameter name expected"); |
| 1985 } else { |
| 1986 parameter.name_pos = TokenPos(); |
| 1987 parameter.name = &Symbols::NotNamed(); |
| 1988 } |
| 1989 |
| 1990 // The function type syntax does not allow the signature type syntax. |
| 1991 // No need to check for IsParameterPart(). |
| 1992 |
| 1993 if ((CurrentToken() == Token::kASSIGN) || (CurrentToken() == Token::kCOLON)) { |
| 1994 ReportError("parameter must not specify a default value"); |
| 1995 } else { |
| 1996 if (params->has_optional_positional_parameters || |
| 1997 params->has_optional_named_parameters) { |
| 1998 // Implicit default value is null. |
| 1999 params->num_optional_parameters++; |
| 2000 parameter.default_value = &Object::null_instance(); |
| 2001 } else { |
| 2002 params->num_fixed_parameters++; |
| 2003 ASSERT(params->num_optional_parameters == 0); |
| 2004 } |
| 2005 } |
| 2006 if (parameter.type->IsVoidType()) { |
| 2007 ReportError("parameter '%s' may not be 'void'", |
| 2008 parameter.name->ToCString()); |
| 2009 } |
| 2010 if (params->implicitly_final) { |
| 2011 parameter.is_final = true; |
| 2012 } |
| 2013 params->parameters->Add(parameter); |
| 2014 if (parameter.is_covariant) { |
| 2015 params->has_covariant = true; |
| 2016 } |
| 2017 } |
| 2018 |
| 2019 |
| 2020 // Parses a formal parameter as defined by the 'formalParameterList' production. |
1940 void Parser::ParseFormalParameter(bool allow_explicit_default_value, | 2021 void Parser::ParseFormalParameter(bool allow_explicit_default_value, |
1941 bool evaluate_metadata, | 2022 bool evaluate_metadata, |
1942 ParamList* params) { | 2023 ParamList* params) { |
1943 TRACE_PARSER("ParseFormalParameter"); | 2024 TRACE_PARSER("ParseFormalParameter"); |
1944 ParamDesc parameter; | 2025 ParamDesc parameter; |
1945 bool var_seen = false; | 2026 bool var_seen = false; |
1946 bool final_seen = false; | 2027 bool final_seen = false; |
1947 bool this_seen = false; | 2028 bool this_seen = false; |
1948 | 2029 |
1949 if (evaluate_metadata && (CurrentToken() == Token::kAT)) { | 2030 if (evaluate_metadata && (CurrentToken() == Token::kAT)) { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1981 } | 2062 } |
1982 if ((parameter.type == NULL) && (CurrentToken() == Token::kVOID)) { | 2063 if ((parameter.type == NULL) && (CurrentToken() == Token::kVOID)) { |
1983 ConsumeToken(); | 2064 ConsumeToken(); |
1984 // This must later be changed to a closure type if we recognize | 2065 // This must later be changed to a closure type if we recognize |
1985 // a closure/function type parameter. We check this at the end | 2066 // a closure/function type parameter. We check this at the end |
1986 // of ParseFormalParameter. | 2067 // of ParseFormalParameter. |
1987 parameter.type = &Object::void_type(); | 2068 parameter.type = &Object::void_type(); |
1988 } | 2069 } |
1989 if (parameter.type == NULL) { | 2070 if (parameter.type == NULL) { |
1990 // At this point, we must see an identifier for the type or the | 2071 // At this point, we must see an identifier for the type or the |
1991 // function parameter. | 2072 // function parameter. The identifier may be 'Function'. |
1992 if (!IsIdentifier()) { | 2073 if (!IsIdentifier()) { |
1993 ReportError("parameter name or type expected"); | 2074 ReportError("parameter name or type expected"); |
1994 } | 2075 } |
1995 | 2076 |
1996 // Lookahead to determine whether the next tokens are a return type | 2077 // Lookahead to determine whether the next tokens are a return type |
1997 // followed by a parameter name. | 2078 // followed by a parameter name. |
1998 bool found_type = false; | 2079 bool found_type = false; |
1999 { | 2080 { |
2000 TokenPosScope saved_pos(this); | 2081 TokenPosScope saved_pos(this); |
2001 if (TryParseReturnType()) { | 2082 if (TryParseType(true)) { |
2002 if (IsIdentifier() || (CurrentToken() == Token::kTHIS)) { | 2083 if (IsIdentifier() || (CurrentToken() == Token::kTHIS)) { |
2003 found_type = true; | 2084 found_type = true; |
2004 } | 2085 } |
2005 } | 2086 } |
2006 } | 2087 } |
2007 if (found_type) { | 2088 if (found_type) { |
2008 // The types of formal parameters are never ignored, even in unchecked | 2089 // The types of formal parameters are never ignored, even in unchecked |
2009 // mode, because they are part of the function type of closurized | 2090 // mode, because they are part of the function type of closurized |
2010 // functions appearing in type tests with typedefs. | 2091 // functions appearing in type tests with typedefs. |
2011 parameter.has_explicit_type = true; | 2092 parameter.has_explicit_type = true; |
2012 // It is too early to resolve the type here, since it can be a result type | 2093 // It is too early to resolve the type here, since it can be a result |
2013 // referring to a not yet declared function type parameter. | 2094 // type referring to a not yet declared function type parameter. |
2014 parameter.type = &AbstractType::ZoneHandle( | 2095 parameter.type = &AbstractType::ZoneHandle( |
2015 Z, ParseType(ClassFinalizer::kDoNotResolve)); | 2096 Z, ParseTypeOrFunctionType(true, ClassFinalizer::kDoNotResolve)); |
2016 } else { | 2097 } else { |
2017 // If this is an initializing formal, its type will be set to the type of | 2098 // If this is an initializing formal, its type will be set to the type |
2018 // the respective field when the constructor is fully parsed. | 2099 // of the respective field when the constructor is fully parsed. |
2019 parameter.type = &Object::dynamic_type(); | 2100 parameter.type = &Object::dynamic_type(); |
2020 } | 2101 } |
2021 } | 2102 } |
2022 if (!this_seen && (CurrentToken() == Token::kTHIS)) { | 2103 if (!this_seen && (CurrentToken() == Token::kTHIS)) { |
2023 ConsumeToken(); | 2104 ConsumeToken(); |
2024 ExpectToken(Token::kPERIOD); | 2105 ExpectToken(Token::kPERIOD); |
2025 this_seen = true; | 2106 this_seen = true; |
2026 parameter.is_field_initializer = true; | 2107 parameter.is_field_initializer = true; |
2027 if (FLAG_initializing_formal_access) { | 2108 if (FLAG_initializing_formal_access) { |
2028 parameter.is_final = true; | 2109 parameter.is_final = true; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2077 innermost_function_ = signature_function.raw(); | 2158 innermost_function_ = signature_function.raw(); |
2078 | 2159 |
2079 // Finish parsing the function type parameter. | 2160 // Finish parsing the function type parameter. |
2080 if (CurrentToken() == Token::kLT) { | 2161 if (CurrentToken() == Token::kLT) { |
2081 if (!FLAG_generic_method_syntax) { | 2162 if (!FLAG_generic_method_syntax) { |
2082 ReportError("generic function types not supported"); | 2163 ReportError("generic function types not supported"); |
2083 } | 2164 } |
2084 ParseTypeParameters(false); // Not parameterizing class, but function. | 2165 ParseTypeParameters(false); // Not parameterizing class, but function. |
2085 } | 2166 } |
2086 | 2167 |
2087 // Now that type parameters are declared, the result type can be resolved. | |
2088 ResolveType(is_top_level_ ? ClassFinalizer::kResolveTypeParameters | |
2089 : ClassFinalizer::kCanonicalize, | |
2090 &result_type); | |
2091 | |
2092 ASSERT(CurrentToken() == Token::kLPAREN); | 2168 ASSERT(CurrentToken() == Token::kLPAREN); |
2093 ParamList func_params; | 2169 ParamList func_params; |
2094 | 2170 |
2095 // Add implicit closure object parameter. | 2171 // Add implicit closure object parameter. |
2096 func_params.AddFinalParameter(TokenPos(), &Symbols::ClosureParameter(), | 2172 func_params.AddFinalParameter(TokenPos(), &Symbols::ClosureParameter(), |
2097 &Object::dynamic_type()); | 2173 &Object::dynamic_type()); |
2098 | 2174 |
2099 const bool no_explicit_default_values = false; | 2175 const bool use_function_type_syntax = false; |
2100 ParseFormalParameterList(no_explicit_default_values, false, &func_params); | 2176 const bool allow_explicit_default_values = false; |
| 2177 const bool evaluate_metadata = false; |
| 2178 ParseFormalParameterList(use_function_type_syntax, |
| 2179 allow_explicit_default_values, evaluate_metadata, |
| 2180 &func_params); |
2101 | 2181 |
2102 signature_function.set_result_type(result_type); | 2182 signature_function.set_result_type(result_type); |
2103 AddFormalParamsToFunction(&func_params, signature_function); | 2183 AddFormalParamsToFunction(&func_params, signature_function); |
2104 | 2184 |
2105 ASSERT(innermost_function().raw() == signature_function.raw()); | 2185 ASSERT(innermost_function().raw() == signature_function.raw()); |
2106 innermost_function_ = signature_function.parent_function(); | 2186 innermost_function_ = signature_function.parent_function(); |
2107 | 2187 |
2108 Type& signature_type = | 2188 Type& signature_type = |
2109 Type::ZoneHandle(Z, signature_function.SignatureType()); | 2189 Type::ZoneHandle(Z, signature_function.SignatureType()); |
2110 if (!is_top_level_) { | 2190 |
2111 signature_type ^= ClassFinalizer::FinalizeType( | |
2112 current_class(), signature_type, ClassFinalizer::kCanonicalize); | |
2113 // Do not refer to signature_function anymore, since it may have been | |
2114 // replaced during canonicalization. | |
2115 signature_function = Function::null(); | |
2116 } | |
2117 ASSERT(is_top_level_ || signature_type.IsFinalized()); | |
2118 // A signature type itself cannot be malformed or malbounded, only its | 2191 // A signature type itself cannot be malformed or malbounded, only its |
2119 // signature function's result type or parameter types may be. | 2192 // signature function's result type or parameter types may be. |
2120 ASSERT(!signature_type.IsMalformed()); | 2193 ASSERT(!signature_type.IsMalformed()); |
2121 ASSERT(!signature_type.IsMalbounded()); | 2194 ASSERT(!signature_type.IsMalbounded()); |
2122 // The type of the parameter is now the signature type. | 2195 // The type of the parameter is now the signature type. |
2123 parameter.type = &signature_type; | 2196 parameter.type = &signature_type; |
2124 } | 2197 } |
2125 } else { | |
2126 if (!parameter.type->IsFinalized()) { | |
2127 AbstractType& type = AbstractType::ZoneHandle(Z, parameter.type->raw()); | |
2128 if (is_top_level_) { | |
2129 ResolveType(ClassFinalizer::kResolveTypeParameters, &type); | |
2130 } else { | |
2131 ResolveType(ClassFinalizer::kCanonicalize, &type); | |
2132 type = ClassFinalizer::FinalizeType(current_class(), type, | |
2133 ClassFinalizer::kCanonicalize); | |
2134 } | |
2135 parameter.type = &type; | |
2136 } | |
2137 } | 2198 } |
2138 | 2199 |
2139 if ((CurrentToken() == Token::kASSIGN) || (CurrentToken() == Token::kCOLON)) { | 2200 if ((CurrentToken() == Token::kASSIGN) || (CurrentToken() == Token::kCOLON)) { |
2140 if ((!params->has_optional_positional_parameters && | 2201 if ((!params->has_optional_positional_parameters && |
2141 !params->has_optional_named_parameters) || | 2202 !params->has_optional_named_parameters) || |
2142 !allow_explicit_default_value) { | 2203 !allow_explicit_default_value) { |
2143 ReportError("parameter must not specify a default value"); | 2204 ReportError("parameter must not specify a default value"); |
2144 } | 2205 } |
2145 if (params->has_optional_positional_parameters) { | 2206 if (params->has_optional_positional_parameters) { |
2146 ExpectToken(Token::kASSIGN); | 2207 ExpectToken(Token::kASSIGN); |
(...skipping 28 matching lines...) Expand all Loading... |
2175 parameter.is_final = true; | 2236 parameter.is_final = true; |
2176 } | 2237 } |
2177 params->parameters->Add(parameter); | 2238 params->parameters->Add(parameter); |
2178 if (parameter.is_covariant) { | 2239 if (parameter.is_covariant) { |
2179 params->has_covariant = true; | 2240 params->has_covariant = true; |
2180 } | 2241 } |
2181 } | 2242 } |
2182 | 2243 |
2183 | 2244 |
2184 // Parses a sequence of normal or optional formal parameters. | 2245 // Parses a sequence of normal or optional formal parameters. |
2185 void Parser::ParseFormalParameters(bool allow_explicit_default_values, | 2246 void Parser::ParseFormalParameters(bool use_function_type_syntax, |
| 2247 bool allow_explicit_default_values, |
2186 bool evaluate_metadata, | 2248 bool evaluate_metadata, |
2187 ParamList* params) { | 2249 ParamList* params) { |
2188 TRACE_PARSER("ParseFormalParameters"); | 2250 TRACE_PARSER("ParseFormalParameters"); |
2189 // Optional parameter lists cannot be empty. | 2251 // Optional parameter lists cannot be empty. |
2190 // The completely empty parameter list is handled before getting here. | 2252 // The completely empty parameter list is handled before getting here. |
2191 bool has_seen_parameter = false; | 2253 bool has_seen_parameter = false; |
2192 do { | 2254 do { |
2193 ConsumeToken(); | 2255 ConsumeToken(); |
2194 if (!params->has_optional_positional_parameters && | 2256 if (!params->has_optional_positional_parameters && |
2195 !params->has_optional_named_parameters && | 2257 !params->has_optional_named_parameters && |
(...skipping 11 matching lines...) Expand all Loading... |
2207 } | 2269 } |
2208 Token::Kind terminator = params->has_optional_positional_parameters | 2270 Token::Kind terminator = params->has_optional_positional_parameters |
2209 ? Token::kRBRACK | 2271 ? Token::kRBRACK |
2210 : params->has_optional_named_parameters | 2272 : params->has_optional_named_parameters |
2211 ? Token::kRBRACE | 2273 ? Token::kRBRACE |
2212 : Token::kRPAREN; | 2274 : Token::kRPAREN; |
2213 if (has_seen_parameter && CurrentToken() == terminator) { | 2275 if (has_seen_parameter && CurrentToken() == terminator) { |
2214 // Allow a trailing comma. | 2276 // Allow a trailing comma. |
2215 break; | 2277 break; |
2216 } | 2278 } |
2217 ParseFormalParameter(allow_explicit_default_values, evaluate_metadata, | 2279 if (use_function_type_syntax) { |
2218 params); | 2280 ASSERT(!allow_explicit_default_values && !evaluate_metadata); |
| 2281 ParseParameterType(params); |
| 2282 } else { |
| 2283 ParseFormalParameter(allow_explicit_default_values, evaluate_metadata, |
| 2284 params); |
| 2285 } |
2219 has_seen_parameter = true; | 2286 has_seen_parameter = true; |
2220 } while (CurrentToken() == Token::kCOMMA); | 2287 } while (CurrentToken() == Token::kCOMMA); |
2221 } | 2288 } |
2222 | 2289 |
2223 | 2290 |
2224 void Parser::ParseFormalParameterList(bool allow_explicit_default_values, | 2291 void Parser::ParseFormalParameterList(bool use_function_type_syntax, |
| 2292 bool allow_explicit_default_values, |
2225 bool evaluate_metadata, | 2293 bool evaluate_metadata, |
2226 ParamList* params) { | 2294 ParamList* params) { |
2227 TRACE_PARSER("ParseFormalParameterList"); | 2295 TRACE_PARSER("ParseFormalParameterList"); |
2228 ASSERT(CurrentToken() == Token::kLPAREN); | 2296 ASSERT(CurrentToken() == Token::kLPAREN); |
2229 | 2297 |
2230 if (LookaheadToken(1) != Token::kRPAREN) { | 2298 if (LookaheadToken(1) != Token::kRPAREN) { |
2231 // Parse fixed parameters. | 2299 // Parse fixed parameters. |
2232 ParseFormalParameters(allow_explicit_default_values, evaluate_metadata, | 2300 ParseFormalParameters(use_function_type_syntax, |
| 2301 allow_explicit_default_values, evaluate_metadata, |
2233 params); | 2302 params); |
2234 if (params->has_optional_positional_parameters || | 2303 if (params->has_optional_positional_parameters || |
2235 params->has_optional_named_parameters) { | 2304 params->has_optional_named_parameters) { |
2236 // Parse optional parameters. | 2305 // Parse optional parameters. |
2237 ParseFormalParameters(allow_explicit_default_values, evaluate_metadata, | 2306 ParseFormalParameters(use_function_type_syntax, |
| 2307 allow_explicit_default_values, evaluate_metadata, |
2238 params); | 2308 params); |
2239 if (params->has_optional_positional_parameters) { | 2309 if (params->has_optional_positional_parameters) { |
2240 CheckToken(Token::kRBRACK, "',' or ']' expected"); | 2310 CheckToken(Token::kRBRACK, "',' or ']' expected"); |
2241 } else { | 2311 } else { |
2242 CheckToken(Token::kRBRACE, "',' or '}' expected"); | 2312 CheckToken(Token::kRBRACE, "',' or '}' expected"); |
2243 } | 2313 } |
2244 ConsumeToken(); // ']' or '}'. | 2314 ConsumeToken(); // ']' or '}'. |
2245 } | 2315 } |
2246 if ((CurrentToken() != Token::kRPAREN) && | 2316 if ((CurrentToken() != Token::kRPAREN) && |
2247 !params->has_optional_positional_parameters && | 2317 !params->has_optional_positional_parameters && |
(...skipping 935 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3183 // The parser adds an implicit default constructor when a class | 3253 // The parser adds an implicit default constructor when a class |
3184 // does not have any explicit constructor or factory (see | 3254 // does not have any explicit constructor or factory (see |
3185 // Parser::AddImplicitConstructor). | 3255 // Parser::AddImplicitConstructor). |
3186 // There is no source text to parse. We just build the | 3256 // There is no source text to parse. We just build the |
3187 // sequence node by hand. | 3257 // sequence node by hand. |
3188 return MakeImplicitConstructor(func); | 3258 return MakeImplicitConstructor(func); |
3189 } | 3259 } |
3190 | 3260 |
3191 OpenFunctionBlock(func); | 3261 OpenFunctionBlock(func); |
3192 ParamList params; | 3262 ParamList params; |
3193 const bool allow_explicit_default_values = true; | |
3194 ASSERT(CurrentToken() == Token::kLPAREN); | 3263 ASSERT(CurrentToken() == Token::kLPAREN); |
3195 | 3264 |
3196 // Add implicit receiver parameter which is passed the allocated | 3265 // Add implicit receiver parameter which is passed the allocated |
3197 // but uninitialized instance to construct. | 3266 // but uninitialized instance to construct. |
3198 ASSERT(current_class().raw() == func.Owner()); | 3267 ASSERT(current_class().raw() == func.Owner()); |
3199 params.AddReceiver(ReceiverType(current_class()), func.token_pos()); | 3268 params.AddReceiver(ReceiverType(current_class()), func.token_pos()); |
3200 | 3269 |
3201 if (func.is_const()) { | 3270 if (func.is_const()) { |
3202 params.SetImplicitlyFinal(); | 3271 params.SetImplicitlyFinal(); |
3203 } | 3272 } |
3204 ParseFormalParameterList(allow_explicit_default_values, false, ¶ms); | 3273 const bool use_function_type_syntax = false; |
| 3274 const bool allow_explicit_default_values = true; |
| 3275 const bool evaluate_metadata = false; |
| 3276 ParseFormalParameterList(use_function_type_syntax, |
| 3277 allow_explicit_default_values, evaluate_metadata, |
| 3278 ¶ms); |
| 3279 FinalizeFormalParameterTypes(¶ms); |
3205 | 3280 |
3206 SetupDefaultsForOptionalParams(params); | 3281 SetupDefaultsForOptionalParams(params); |
3207 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved()); | 3282 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved()); |
3208 ASSERT(func.NumParameters() == params.parameters->length()); | |
3209 | 3283 |
3210 // Now populate function scope with the formal parameters. | 3284 // Now populate function scope with the formal parameters. |
3211 AddFormalParamsToScope(¶ms, current_block_->scope); | 3285 AddFormalParamsToScope(¶ms, current_block_->scope); |
3212 | 3286 |
3213 const bool is_redirecting_constructor = | 3287 const bool is_redirecting_constructor = |
3214 (CurrentToken() == Token::kCOLON) && | 3288 (CurrentToken() == Token::kCOLON) && |
3215 ((LookaheadToken(1) == Token::kTHIS) && | 3289 ((LookaheadToken(1) == Token::kTHIS) && |
3216 ((LookaheadToken(2) == Token::kLPAREN) || | 3290 ((LookaheadToken(2) == Token::kLPAREN) || |
3217 ((LookaheadToken(2) == Token::kPERIOD) && | 3291 ((LookaheadToken(2) == Token::kPERIOD) && |
3218 (LookaheadToken(4) == Token::kLPAREN)))); | 3292 (LookaheadToken(4) == Token::kLPAREN)))); |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3376 // The first parameter of a factory is the TypeArguments vector of | 3450 // The first parameter of a factory is the TypeArguments vector of |
3377 // the type of the instance to be allocated. | 3451 // the type of the instance to be allocated. |
3378 params.AddFinalParameter(TokenPos(), &Symbols::TypeArgumentsParameter(), | 3452 params.AddFinalParameter(TokenPos(), &Symbols::TypeArgumentsParameter(), |
3379 &Object::dynamic_type()); | 3453 &Object::dynamic_type()); |
3380 } | 3454 } |
3381 // Expect the parameter list unless this is a getter function, or the | 3455 // Expect the parameter list unless this is a getter function, or the |
3382 // body closure of an async or generator getter function. | 3456 // body closure of an async or generator getter function. |
3383 ASSERT((CurrentToken() == Token::kLPAREN) || func.IsGetterFunction() || | 3457 ASSERT((CurrentToken() == Token::kLPAREN) || func.IsGetterFunction() || |
3384 (func.is_generated_body() && | 3458 (func.is_generated_body() && |
3385 Function::Handle(func.parent_function()).IsGetterFunction())); | 3459 Function::Handle(func.parent_function()).IsGetterFunction())); |
3386 const bool allow_explicit_default_values = true; | |
3387 if (func.IsGetterFunction()) { | 3460 if (func.IsGetterFunction()) { |
3388 // Populate function scope with the formal parameters. Since in this case | 3461 // Populate function scope with the formal parameters. Since in this case |
3389 // we are compiling a getter this will at most populate the receiver. | 3462 // we are compiling a getter this will at most populate the receiver. |
3390 AddFormalParamsToScope(¶ms, current_block_->scope); | 3463 AddFormalParamsToScope(¶ms, current_block_->scope); |
3391 } else if (func.IsAsyncClosure()) { | 3464 } else if (func.IsAsyncClosure()) { |
3392 AddAsyncClosureParameters(¶ms); | 3465 AddAsyncClosureParameters(¶ms); |
3393 SetupDefaultsForOptionalParams(params); | 3466 SetupDefaultsForOptionalParams(params); |
3394 AddFormalParamsToScope(¶ms, current_block_->scope); | 3467 AddFormalParamsToScope(¶ms, current_block_->scope); |
3395 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved()); | 3468 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved()); |
3396 ASSERT(func.NumParameters() == params.parameters->length()); | 3469 ASSERT(func.NumParameters() == params.parameters->length()); |
(...skipping 20 matching lines...) Expand all Loading... |
3417 AddFormalParamsToScope(¶ms, current_block_->scope); | 3490 AddFormalParamsToScope(¶ms, current_block_->scope); |
3418 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved()); | 3491 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved()); |
3419 ASSERT(func.NumParameters() == params.parameters->length()); | 3492 ASSERT(func.NumParameters() == params.parameters->length()); |
3420 if (!Function::Handle(func.parent_function()).IsGetterFunction()) { | 3493 if (!Function::Handle(func.parent_function()).IsGetterFunction()) { |
3421 // Skip formal parameters. They are accessed as context variables. | 3494 // Skip formal parameters. They are accessed as context variables. |
3422 // Parsing them again (and discarding them) does not work in case of | 3495 // Parsing them again (and discarding them) does not work in case of |
3423 // default values with same name as already parsed formal parameter. | 3496 // default values with same name as already parsed formal parameter. |
3424 SkipToMatchingParenthesis(); | 3497 SkipToMatchingParenthesis(); |
3425 } | 3498 } |
3426 } else { | 3499 } else { |
3427 ParseFormalParameterList(allow_explicit_default_values, false, ¶ms); | 3500 const bool use_function_type_syntax = false; |
| 3501 const bool allow_explicit_default_values = true; |
| 3502 const bool evaluate_metadata = false; |
| 3503 ParseFormalParameterList(use_function_type_syntax, |
| 3504 allow_explicit_default_values, evaluate_metadata, |
| 3505 ¶ms); |
| 3506 if (!is_top_level_) { |
| 3507 FinalizeFormalParameterTypes(¶ms); |
| 3508 } |
3428 | 3509 |
3429 // The number of parameters and their type are not yet set in local | 3510 // The number of parameters and their type are not yet set in local |
3430 // functions, since they are not 'top-level' parsed. | 3511 // functions, since they are not 'top-level' parsed. |
3431 // However, they are already set when the local function is compiled, since | 3512 // However, they are already set when the local function is compiled, since |
3432 // the local function was parsed when its parent was compiled. | 3513 // the local function was parsed when its parent was compiled. |
3433 if (func.parameter_types() == Object::empty_array().raw()) { | 3514 if (func.parameter_types() == Object::empty_array().raw()) { |
3434 AddFormalParamsToFunction(¶ms, func); | 3515 AddFormalParamsToFunction(¶ms, func); |
3435 } | 3516 } |
| 3517 ResolveSignature(ClassFinalizer::kResolveTypeParameters, func); |
| 3518 if (!is_top_level_) { |
| 3519 ClassFinalizer::FinalizeSignature(current_class(), func); |
| 3520 } |
3436 SetupDefaultsForOptionalParams(params); | 3521 SetupDefaultsForOptionalParams(params); |
3437 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved()); | 3522 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved()); |
3438 ASSERT(func.NumParameters() == params.parameters->length()); | |
3439 | 3523 |
3440 // Populate function scope with the formal parameters. | 3524 // Populate function scope with the formal parameters. |
3441 AddFormalParamsToScope(¶ms, current_block_->scope); | 3525 AddFormalParamsToScope(¶ms, current_block_->scope); |
3442 | 3526 |
3443 if (I->type_checks() && (FunctionLevel() > 0)) { | 3527 if (I->type_checks() && (FunctionLevel() > 0)) { |
3444 // We are parsing, but not compiling, a local function. | 3528 // We are parsing, but not compiling, a local function. |
3445 // The instantiator may be required at run time for generic type checks. | 3529 // The instantiator may be required at run time for generic type checks. |
3446 if (IsInstantiatorRequired()) { | 3530 if (IsInstantiatorRequired()) { |
3447 // Make sure that the receiver of the enclosing instance function | 3531 // Make sure that the receiver of the enclosing instance function |
3448 // (or implicit first parameter of an enclosing factory) is marked as | 3532 // (or implicit first parameter of an enclosing factory) is marked as |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3733 if (method->IsFactoryOrConstructor()) { | 3817 if (method->IsFactoryOrConstructor()) { |
3734 ReportError(method->name_pos, "constructor cannot be generic"); | 3818 ReportError(method->name_pos, "constructor cannot be generic"); |
3735 } | 3819 } |
3736 if (method->IsGetter() || method->IsSetter()) { | 3820 if (method->IsGetter() || method->IsSetter()) { |
3737 ReportError(type_param_pos, "%s cannot be generic", | 3821 ReportError(type_param_pos, "%s cannot be generic", |
3738 method->IsGetter() ? "getter" : "setter"); | 3822 method->IsGetter() ? "getter" : "setter"); |
3739 } | 3823 } |
3740 ParseTypeParameters(false); // Not parameterizing class, but function. | 3824 ParseTypeParameters(false); // Not parameterizing class, but function. |
3741 } | 3825 } |
3742 | 3826 |
3743 // Now that type parameters are declared, the result type can be resolved. | |
3744 if (!method->type->IsResolved()) { | |
3745 AbstractType& type = AbstractType::ZoneHandle(Z, method->type->raw()); | |
3746 ResolveType(ClassFinalizer::kResolveTypeParameters, &type); | |
3747 method->type = &type; | |
3748 } | |
3749 | |
3750 // Parse the formal parameters. | 3827 // Parse the formal parameters. |
3751 const bool are_implicitly_final = method->has_const; | |
3752 const bool allow_explicit_default_values = true; | |
3753 const TokenPosition formal_param_pos = TokenPos(); | 3828 const TokenPosition formal_param_pos = TokenPos(); |
3754 method->params.Clear(); | 3829 method->params.Clear(); |
3755 // Static functions do not have a receiver. | 3830 // Static functions do not have a receiver. |
3756 // The first parameter of a factory is the TypeArguments vector of | 3831 // The first parameter of a factory is the TypeArguments vector of |
3757 // the type of the instance to be allocated. | 3832 // the type of the instance to be allocated. |
3758 if (!method->has_static || method->IsConstructor()) { | 3833 if (!method->has_static || method->IsConstructor()) { |
3759 method->params.AddReceiver(ReceiverType(current_class()), formal_param_pos); | 3834 method->params.AddReceiver(ReceiverType(current_class()), formal_param_pos); |
3760 } else if (method->IsFactory()) { | 3835 } else if (method->IsFactory()) { |
3761 method->params.AddFinalParameter(formal_param_pos, | 3836 method->params.AddFinalParameter(formal_param_pos, |
3762 &Symbols::TypeArgumentsParameter(), | 3837 &Symbols::TypeArgumentsParameter(), |
3763 &Object::dynamic_type()); | 3838 &Object::dynamic_type()); |
3764 } | 3839 } |
3765 if (are_implicitly_final) { | 3840 if (method->has_const) { |
3766 method->params.SetImplicitlyFinal(); | 3841 method->params.SetImplicitlyFinal(); |
3767 } | 3842 } |
3768 if (!method->IsGetter()) { | 3843 if (!method->IsGetter()) { |
3769 ParseFormalParameterList(allow_explicit_default_values, false, | 3844 const bool use_function_type_syntax = false; |
| 3845 const bool allow_explicit_default_values = true; |
| 3846 const bool evaluate_metadata = false; |
| 3847 ParseFormalParameterList(use_function_type_syntax, |
| 3848 allow_explicit_default_values, evaluate_metadata, |
3770 &method->params); | 3849 &method->params); |
3771 } | 3850 } |
3772 | 3851 |
3773 // Now that we know the parameter list, we can distinguish between the | 3852 // Now that we know the parameter list, we can distinguish between the |
3774 // unary and binary operator -. | 3853 // unary and binary operator -. |
3775 if (method->has_operator) { | 3854 if (method->has_operator) { |
3776 if ((method->operator_token == Token::kSUB) && | 3855 if ((method->operator_token == Token::kSUB) && |
3777 (method->params.num_fixed_parameters == 1)) { | 3856 (method->params.num_fixed_parameters == 1)) { |
3778 // Patch up name for unary operator - so it does not clash with the | 3857 // Patch up name for unary operator - so it does not clash with the |
3779 // name for binary operator -. | 3858 // name for binary operator -. |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4003 if (method->has_abstract && (async_modifier != RawFunction::kNoModifier)) { | 4082 if (method->has_abstract && (async_modifier != RawFunction::kNoModifier)) { |
4004 ReportError(modifier_pos, | 4083 ReportError(modifier_pos, |
4005 "abstract function '%s' may not be async, async* or sync*", | 4084 "abstract function '%s' may not be async, async* or sync*", |
4006 method->name->ToCString()); | 4085 method->name->ToCString()); |
4007 } | 4086 } |
4008 | 4087 |
4009 // Update function object. | 4088 // Update function object. |
4010 func.set_name(*method->name); | 4089 func.set_name(*method->name); |
4011 func.set_is_abstract(method->has_abstract); | 4090 func.set_is_abstract(method->has_abstract); |
4012 func.set_is_native(method->has_native); | 4091 func.set_is_native(method->has_native); |
4013 func.set_result_type(*method->type); | 4092 func.set_result_type(*method->type); // May set parent_function in type. |
4014 func.set_end_token_pos(method_end_pos); | 4093 func.set_end_token_pos(method_end_pos); |
4015 func.set_is_redirecting(is_redirecting); | 4094 func.set_is_redirecting(is_redirecting); |
4016 func.set_modifier(async_modifier); | 4095 func.set_modifier(async_modifier); |
4017 if (library_.is_dart_scheme() && library_.IsPrivate(*method->name)) { | 4096 if (library_.is_dart_scheme() && library_.IsPrivate(*method->name)) { |
4018 func.set_is_reflectable(false); | 4097 func.set_is_reflectable(false); |
4019 } | 4098 } |
4020 if (is_patch_source() && IsPatchAnnotation(method->metadata_pos)) { | 4099 if (is_patch_source() && IsPatchAnnotation(method->metadata_pos)) { |
4021 // Currently, we just ignore the patch annotation. If the function | 4100 // Currently, we just ignore the patch annotation. If the function |
4022 // name already exists in the patched class, this function will replace | 4101 // name already exists in the patched class, this function will replace |
4023 // the one in the patched class. | 4102 // the one in the patched class. |
4024 method->metadata_pos = TokenPosition::kNoSource; | 4103 method->metadata_pos = TokenPosition::kNoSource; |
4025 } | 4104 } |
4026 if (FLAG_enable_mirrors && (method->metadata_pos.IsReal())) { | 4105 if (FLAG_enable_mirrors && (method->metadata_pos.IsReal())) { |
4027 library_.AddFunctionMetadata(func, method->metadata_pos); | 4106 library_.AddFunctionMetadata(func, method->metadata_pos); |
4028 } | 4107 } |
4029 if (method->has_native) { | 4108 if (method->has_native) { |
4030 func.set_native_name(*native_name); | 4109 func.set_native_name(*native_name); |
4031 } | 4110 } |
4032 | 4111 |
4033 // If this method is a redirecting factory, set the redirection information. | 4112 // If this method is a redirecting factory, set the redirection information. |
4034 if (!redirection_type.IsNull()) { | 4113 if (!redirection_type.IsNull()) { |
4035 ASSERT(func.IsFactory()); | 4114 ASSERT(func.IsFactory()); |
4036 func.SetRedirectionType(redirection_type); | 4115 func.SetRedirectionType(redirection_type); |
4037 if (!redirection_identifier.IsNull()) { | 4116 if (!redirection_identifier.IsNull()) { |
4038 func.SetRedirectionIdentifier(redirection_identifier); | 4117 func.SetRedirectionIdentifier(redirection_identifier); |
4039 } | 4118 } |
4040 } | 4119 } |
4041 | 4120 |
4042 // No need to resolve parameter types yet, or add parameters to local scope. | |
4043 ASSERT(is_top_level_); | 4121 ASSERT(is_top_level_); |
4044 AddFormalParamsToFunction(&method->params, func); | 4122 AddFormalParamsToFunction(&method->params, func); |
4045 ASSERT(innermost_function().raw() == func.raw()); | 4123 ASSERT(innermost_function().raw() == func.raw()); |
4046 innermost_function_ = Function::null(); | 4124 innermost_function_ = Function::null(); |
| 4125 ResolveSignature(ClassFinalizer::kResolveTypeParameters, func); |
4047 members->AddFunction(func); | 4126 members->AddFunction(func); |
4048 } | 4127 } |
4049 | 4128 |
4050 | 4129 |
4051 void Parser::ParseFieldDefinition(ClassDesc* members, MemberDesc* field) { | 4130 void Parser::ParseFieldDefinition(ClassDesc* members, MemberDesc* field) { |
4052 TRACE_PARSER("ParseFieldDefinition"); | 4131 TRACE_PARSER("ParseFieldDefinition"); |
4053 // The parser has read the first field name and is now at the token | 4132 // The parser has read the first field name and is now at the token |
4054 // after the field name. | 4133 // after the field name. |
4055 ASSERT(CurrentToken() == Token::kSEMICOLON || | 4134 ASSERT(CurrentToken() == Token::kSEMICOLON || |
4056 CurrentToken() == Token::kCOMMA || CurrentToken() == Token::kASSIGN); | 4135 CurrentToken() == Token::kCOMMA || CurrentToken() == Token::kASSIGN); |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4176 /* is_abstract = */ false, | 4255 /* is_abstract = */ false, |
4177 /* is_external = */ false, | 4256 /* is_external = */ false, |
4178 /* is_native = */ false, current_class(), | 4257 /* is_native = */ false, current_class(), |
4179 field->name_pos); | 4258 field->name_pos); |
4180 ParamList params; | 4259 ParamList params; |
4181 ASSERT(current_class().raw() == getter.Owner()); | 4260 ASSERT(current_class().raw() == getter.Owner()); |
4182 params.AddReceiver(ReceiverType(current_class()), field->name_pos); | 4261 params.AddReceiver(ReceiverType(current_class()), field->name_pos); |
4183 getter.set_result_type(*field->type); | 4262 getter.set_result_type(*field->type); |
4184 getter.set_is_debuggable(false); | 4263 getter.set_is_debuggable(false); |
4185 AddFormalParamsToFunction(¶ms, getter); | 4264 AddFormalParamsToFunction(¶ms, getter); |
| 4265 ResolveSignature(ClassFinalizer::kResolveTypeParameters, getter); |
4186 members->AddFunction(getter); | 4266 members->AddFunction(getter); |
4187 if (!field->has_final) { | 4267 if (!field->has_final) { |
4188 // Build a setter accessor for non-const fields. | 4268 // Build a setter accessor for non-const fields. |
4189 String& setter_name = | 4269 String& setter_name = |
4190 String::Handle(Z, Field::SetterSymbol(*field->name)); | 4270 String::Handle(Z, Field::SetterSymbol(*field->name)); |
4191 setter = Function::New(setter_name, RawFunction::kImplicitSetter, | 4271 setter = Function::New(setter_name, RawFunction::kImplicitSetter, |
4192 field->has_static, field->has_final, | 4272 field->has_static, field->has_final, |
4193 /* is_abstract = */ false, | 4273 /* is_abstract = */ false, |
4194 /* is_external = */ false, | 4274 /* is_external = */ false, |
4195 /* is_native = */ false, current_class(), | 4275 /* is_native = */ false, current_class(), |
4196 field->name_pos); | 4276 field->name_pos); |
4197 ParamList params; | 4277 ParamList params; |
4198 ASSERT(current_class().raw() == setter.Owner()); | 4278 ASSERT(current_class().raw() == setter.Owner()); |
4199 params.AddReceiver(ReceiverType(current_class()), field->name_pos); | 4279 params.AddReceiver(ReceiverType(current_class()), field->name_pos); |
4200 params.AddFinalParameter(TokenPos(), &Symbols::Value(), field->type); | 4280 params.AddFinalParameter(TokenPos(), &Symbols::Value(), field->type); |
4201 setter.set_result_type(Object::void_type()); | 4281 setter.set_result_type(Object::void_type()); |
4202 setter.set_is_debuggable(false); | 4282 setter.set_is_debuggable(false); |
4203 if (library_.is_dart_scheme() && library_.IsPrivate(*field->name)) { | 4283 if (library_.is_dart_scheme() && library_.IsPrivate(*field->name)) { |
4204 setter.set_is_reflectable(false); | 4284 setter.set_is_reflectable(false); |
4205 } | 4285 } |
4206 AddFormalParamsToFunction(¶ms, setter); | 4286 AddFormalParamsToFunction(¶ms, setter); |
| 4287 ResolveSignature(ClassFinalizer::kResolveTypeParameters, setter); |
4207 members->AddFunction(setter); | 4288 members->AddFunction(setter); |
4208 } | 4289 } |
4209 } | 4290 } |
4210 | 4291 |
4211 if (CurrentToken() != Token::kCOMMA) { | 4292 if (CurrentToken() != Token::kCOMMA) { |
4212 break; | 4293 break; |
4213 } | 4294 } |
4214 ConsumeToken(); | 4295 ConsumeToken(); |
4215 field->name_pos = this->TokenPos(); | 4296 field->name_pos = this->TokenPos(); |
4216 field->name = ExpectIdentifier("field name expected"); | 4297 field->name = ExpectIdentifier("field name expected"); |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4317 ReportError("void not expected"); | 4398 ReportError("void not expected"); |
4318 } | 4399 } |
4319 ConsumeToken(); | 4400 ConsumeToken(); |
4320 ASSERT(member.type == NULL); | 4401 ASSERT(member.type == NULL); |
4321 member.type = &Object::void_type(); | 4402 member.type = &Object::void_type(); |
4322 } else { | 4403 } else { |
4323 bool found_type = false; | 4404 bool found_type = false; |
4324 { | 4405 { |
4325 // Lookahead to determine whether the next tokens are a return type. | 4406 // Lookahead to determine whether the next tokens are a return type. |
4326 TokenPosScope saved_pos(this); | 4407 TokenPosScope saved_pos(this); |
4327 if (TryParseReturnType()) { | 4408 if (TryParseType(true)) { |
4328 if (IsIdentifier() || (CurrentToken() == Token::kGET) || | 4409 if (IsIdentifier() || (CurrentToken() == Token::kGET) || |
4329 (CurrentToken() == Token::kSET) || | 4410 (CurrentToken() == Token::kSET) || |
4330 (CurrentToken() == Token::kOPERATOR)) { | 4411 (CurrentToken() == Token::kOPERATOR)) { |
4331 found_type = true; | 4412 found_type = true; |
4332 } | 4413 } |
4333 } | 4414 } |
4334 } | 4415 } |
4335 if (found_type) { | 4416 if (found_type) { |
4336 // It is too early to resolve the type here, since it can be a result type | 4417 // It is too early to resolve the type here, since it can be a result type |
4337 // referring to a not yet declared function type parameter. | 4418 // referring to a not yet declared function type parameter. |
4338 member.type = &AbstractType::ZoneHandle( | 4419 member.type = &AbstractType::ZoneHandle( |
4339 Z, ParseType(ClassFinalizer::kDoNotResolve)); | 4420 Z, ParseTypeOrFunctionType(false, ClassFinalizer::kDoNotResolve)); |
4340 } | 4421 } |
4341 } | 4422 } |
4342 | 4423 |
4343 // Optionally parse a (possibly named) constructor name or factory. | 4424 // Optionally parse a (possibly named) constructor name or factory. |
4344 if (IsIdentifier() && | 4425 if (IsIdentifier() && |
4345 (CurrentLiteral()->Equals(members->class_name()) || member.has_factory)) { | 4426 (CurrentLiteral()->Equals(members->class_name()) || member.has_factory)) { |
4346 member.name_pos = TokenPos(); | 4427 member.name_pos = TokenPos(); |
4347 member.name = CurrentLiteral(); // Unqualified identifier. | 4428 member.name = CurrentLiteral(); // Unqualified identifier. |
4348 ConsumeToken(); | 4429 ConsumeToken(); |
4349 if (member.has_factory) { | 4430 if (member.has_factory) { |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4442 ReportError("identifier expected"); | 4523 ReportError("identifier expected"); |
4443 } | 4524 } |
4444 | 4525 |
4445 ASSERT(member.name != NULL); | 4526 ASSERT(member.name != NULL); |
4446 if (IsParameterPart() || member.IsGetter()) { | 4527 if (IsParameterPart() || member.IsGetter()) { |
4447 // Constructor or method. | 4528 // Constructor or method. |
4448 if (member.type == NULL) { | 4529 if (member.type == NULL) { |
4449 member.type = &Object::dynamic_type(); | 4530 member.type = &Object::dynamic_type(); |
4450 } | 4531 } |
4451 ASSERT(member.IsFactory() == member.has_factory); | 4532 ASSERT(member.IsFactory() == member.has_factory); |
4452 // Note that member.type may still be unresolved. | 4533 // Note that member.type may still be unresolved and may refer to not yet |
| 4534 // parsed function type parameters. |
4453 ParseMethodOrConstructor(members, &member); | 4535 ParseMethodOrConstructor(members, &member); |
4454 } else if (CurrentToken() == Token::kSEMICOLON || | 4536 } else if (CurrentToken() == Token::kSEMICOLON || |
4455 CurrentToken() == Token::kCOMMA || | 4537 CurrentToken() == Token::kCOMMA || |
4456 CurrentToken() == Token::kASSIGN) { | 4538 CurrentToken() == Token::kASSIGN) { |
4457 // Field definition. | 4539 // Field definition. |
4458 if (member.has_const) { | 4540 if (member.has_const) { |
4459 // const fields are implicitly final. | 4541 // const fields are implicitly final. |
4460 member.has_final = true; | 4542 member.has_final = true; |
4461 } | 4543 } |
4462 if (member.type == NULL) { | 4544 if (member.type == NULL) { |
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4821 /* is_static = */ false, | 4903 /* is_static = */ false, |
4822 /* is_const = */ true, | 4904 /* is_const = */ true, |
4823 /* is_abstract = */ false, | 4905 /* is_abstract = */ false, |
4824 /* is_external = */ false, | 4906 /* is_external = */ false, |
4825 /* is_native = */ false, cls, cls.token_pos()); | 4907 /* is_native = */ false, cls, cls.token_pos()); |
4826 getter.set_result_type(int_type); | 4908 getter.set_result_type(int_type); |
4827 getter.set_is_debuggable(false); | 4909 getter.set_is_debuggable(false); |
4828 ParamList params; | 4910 ParamList params; |
4829 params.AddReceiver(&Object::dynamic_type(), cls.token_pos()); | 4911 params.AddReceiver(&Object::dynamic_type(), cls.token_pos()); |
4830 AddFormalParamsToFunction(¶ms, getter); | 4912 AddFormalParamsToFunction(¶ms, getter); |
| 4913 ResolveSignature(ClassFinalizer::kResolveTypeParameters, getter); |
4831 enum_members.AddFunction(getter); | 4914 enum_members.AddFunction(getter); |
4832 | 4915 |
4833 ASSERT(IsIdentifier()); | 4916 ASSERT(IsIdentifier()); |
4834 ASSERT(CurrentLiteral()->raw() == cls.Name()); | 4917 ASSERT(CurrentLiteral()->raw() == cls.Name()); |
4835 | 4918 |
4836 ConsumeToken(); // Enum type name. | 4919 ConsumeToken(); // Enum type name. |
4837 ExpectToken(Token::kLBRACE); | 4920 ExpectToken(Token::kLBRACE); |
4838 Field& enum_value = Field::Handle(Z); | 4921 Field& enum_value = Field::Handle(Z); |
4839 intptr_t i = 0; | 4922 intptr_t i = 0; |
4840 GrowableArray<String*> declared_names(8); | 4923 GrowableArray<String*> declared_names(8); |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4935 /* is_static = */ false, | 5018 /* is_static = */ false, |
4936 /* is_const = */ true, | 5019 /* is_const = */ true, |
4937 /* is_abstract = */ false, | 5020 /* is_abstract = */ false, |
4938 /* is_external = */ false, | 5021 /* is_external = */ false, |
4939 /* is_native = */ false, cls, cls.token_pos()); | 5022 /* is_native = */ false, cls, cls.token_pos()); |
4940 name_getter.set_result_type(string_type); | 5023 name_getter.set_result_type(string_type); |
4941 name_getter.set_is_debuggable(false); | 5024 name_getter.set_is_debuggable(false); |
4942 ParamList name_params; | 5025 ParamList name_params; |
4943 name_params.AddReceiver(&Object::dynamic_type(), cls.token_pos()); | 5026 name_params.AddReceiver(&Object::dynamic_type(), cls.token_pos()); |
4944 AddFormalParamsToFunction(&name_params, name_getter); | 5027 AddFormalParamsToFunction(&name_params, name_getter); |
| 5028 ResolveSignature(ClassFinalizer::kResolveTypeParameters, name_getter); |
4945 enum_members.AddFunction(name_getter); | 5029 enum_members.AddFunction(name_getter); |
4946 | 5030 |
4947 // Clone the toString() function from the helper class. | 5031 // Clone the toString() function from the helper class. |
4948 Function& to_string_func = Function::Handle( | 5032 Function& to_string_func = Function::Handle( |
4949 Z, helper_class.LookupDynamicFunctionAllowPrivate(Symbols::toString())); | 5033 Z, helper_class.LookupDynamicFunctionAllowPrivate(Symbols::toString())); |
4950 ASSERT(!to_string_func.IsNull()); | 5034 ASSERT(!to_string_func.IsNull()); |
4951 to_string_func = to_string_func.Clone(cls); | 5035 to_string_func = to_string_func.Clone(cls); |
4952 enum_members.AddFunction(to_string_func); | 5036 enum_members.AddFunction(to_string_func); |
4953 | 5037 |
4954 // Clone the hashCode getter function from the helper class. | 5038 // Clone the hashCode getter function from the helper class. |
(...skipping 29 matching lines...) Expand all Loading... |
4984 if (library_.is_dart_scheme() && library_.IsPrivate(ctor_name)) { | 5068 if (library_.is_dart_scheme() && library_.IsPrivate(ctor_name)) { |
4985 ctor.set_is_reflectable(false); | 5069 ctor.set_is_reflectable(false); |
4986 } | 5070 } |
4987 | 5071 |
4988 ParamList params; | 5072 ParamList params; |
4989 // Add implicit 'this' parameter. | 5073 // Add implicit 'this' parameter. |
4990 const AbstractType* receiver_type = ReceiverType(cls); | 5074 const AbstractType* receiver_type = ReceiverType(cls); |
4991 params.AddReceiver(receiver_type, cls.token_pos()); | 5075 params.AddReceiver(receiver_type, cls.token_pos()); |
4992 | 5076 |
4993 AddFormalParamsToFunction(¶ms, ctor); | 5077 AddFormalParamsToFunction(¶ms, ctor); |
| 5078 ctor.set_result_type(Object::dynamic_type()); |
| 5079 ResolveSignature(ClassFinalizer::kResolveTypeParameters, ctor); |
4994 // The body of the constructor cannot modify the type of the constructed | 5080 // The body of the constructor cannot modify the type of the constructed |
4995 // instance, which is passed in as the receiver. | 5081 // instance, which is passed in as the receiver. |
4996 ctor.set_result_type(*receiver_type); | 5082 ctor.set_result_type(*receiver_type); |
4997 cls.AddFunction(ctor); | 5083 cls.AddFunction(ctor); |
4998 } | 5084 } |
4999 | 5085 |
5000 | 5086 |
5001 // Check for cycles in constructor redirection. | 5087 // Check for cycles in constructor redirection. |
5002 void Parser::CheckConstructors(ClassDesc* class_desc) { | 5088 void Parser::CheckConstructors(ClassDesc* class_desc) { |
5003 // Check for cycles in constructor redirection. | 5089 // Check for cycles in constructor redirection. |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5080 ParseInterfaceList(mixin_application); | 5166 ParseInterfaceList(mixin_application); |
5081 } | 5167 } |
5082 ExpectSemicolon(); | 5168 ExpectSemicolon(); |
5083 pending_classes.Add(mixin_application, Heap::kOld); | 5169 pending_classes.Add(mixin_application, Heap::kOld); |
5084 if (FLAG_enable_mirrors && metadata_pos.IsReal()) { | 5170 if (FLAG_enable_mirrors && metadata_pos.IsReal()) { |
5085 library_.AddClassMetadata(mixin_application, tl_owner, metadata_pos); | 5171 library_.AddClassMetadata(mixin_application, tl_owner, metadata_pos); |
5086 } | 5172 } |
5087 } | 5173 } |
5088 | 5174 |
5089 | 5175 |
5090 // Look ahead to detect if we are seeing ident [ TypeParameters ] "(". | 5176 // Look ahead to detect if we are seeing ident [ TypeParameters ] ("(" | "="). |
5091 // We need this lookahead to distinguish between the optional return type | 5177 // We need this lookahead to distinguish between the optional return type |
5092 // and the alias name of a function type alias. | 5178 // and the alias name of a function type alias. |
5093 // Token position remains unchanged. | 5179 // Token position remains unchanged. |
5094 bool Parser::IsFunctionTypeAliasName() { | 5180 bool Parser::IsFunctionTypeAliasName(bool* use_function_type_syntax) { |
5095 if (IsIdentifier() && (LookaheadToken(1) == Token::kLPAREN)) { | 5181 if (IsIdentifier()) { |
5096 return true; | 5182 const Token::Kind ahead = LookaheadToken(1); |
| 5183 if ((ahead == Token::kLPAREN) || (ahead == Token::kASSIGN)) { |
| 5184 *use_function_type_syntax = (ahead == Token::kASSIGN); |
| 5185 return true; |
| 5186 } |
5097 } | 5187 } |
5098 const TokenPosScope saved_pos(this); | 5188 const TokenPosScope saved_pos(this); |
5099 if (IsIdentifier() && (LookaheadToken(1) == Token::kLT)) { | 5189 if (IsIdentifier() && (LookaheadToken(1) == Token::kLT)) { |
5100 ConsumeToken(); | 5190 ConsumeToken(); |
5101 if (TryParseTypeParameters() && (CurrentToken() == Token::kLPAREN)) { | 5191 if (TryParseTypeParameters()) { |
5102 return true; | 5192 const Token::Kind current = CurrentToken(); |
| 5193 if ((current == Token::kLPAREN) || (current == Token::kASSIGN)) { |
| 5194 *use_function_type_syntax = (current == Token::kASSIGN); |
| 5195 return true; |
| 5196 } |
5103 } | 5197 } |
5104 } | 5198 } |
| 5199 *use_function_type_syntax = false; |
5105 return false; | 5200 return false; |
5106 } | 5201 } |
5107 | 5202 |
5108 | 5203 |
5109 void Parser::ParseTypedef(const GrowableObjectArray& pending_classes, | 5204 void Parser::ParseTypedef(const GrowableObjectArray& pending_classes, |
5110 const Object& tl_owner, | 5205 const Object& tl_owner, |
5111 TokenPosition metadata_pos) { | 5206 TokenPosition metadata_pos) { |
5112 TRACE_PARSER("ParseTypedef"); | 5207 TRACE_PARSER("ParseTypedef"); |
5113 TokenPosition declaration_pos = | 5208 TokenPosition declaration_pos = |
5114 metadata_pos.IsReal() ? metadata_pos : TokenPos(); | 5209 metadata_pos.IsReal() ? metadata_pos : TokenPos(); |
5115 ExpectToken(Token::kTYPEDEF); | 5210 ExpectToken(Token::kTYPEDEF); |
5116 | 5211 |
5117 // Parse the result type of the function type. | 5212 // Distinguish between two possible typedef forms: |
5118 AbstractType& result_type = Type::Handle(Z, Type::DynamicType()); | 5213 // 1) returnType? identifier typeParameters? formalParameterList ’;’ |
| 5214 // 2) identifier typeParameters? '=' functionType ’;’ |
| 5215 |
| 5216 bool use_function_type_syntax; // Set to false for form 1, true for form 2. |
| 5217 |
| 5218 // If present, parse the result type of the function type. |
| 5219 AbstractType& result_type = Type::Handle(Z); |
5119 if (CurrentToken() == Token::kVOID) { | 5220 if (CurrentToken() == Token::kVOID) { |
5120 ConsumeToken(); | 5221 ConsumeToken(); |
5121 result_type = Type::VoidType(); | 5222 result_type = Type::VoidType(); |
5122 } else if (!IsFunctionTypeAliasName()) { | 5223 use_function_type_syntax = false; |
| 5224 } else if (!IsFunctionTypeAliasName(&use_function_type_syntax)) { |
5123 // Type annotations in typedef are never ignored, even in production mode. | 5225 // Type annotations in typedef are never ignored, even in production mode. |
5124 // Wait until we have an owner class before resolving the result type. | 5226 // Wait until we have an owner class before resolving the result type. |
5125 result_type = ParseType(ClassFinalizer::kDoNotResolve); | 5227 result_type = ParseType(ClassFinalizer::kDoNotResolve); |
| 5228 ASSERT(!use_function_type_syntax); |
5126 } | 5229 } |
5127 | 5230 |
5128 const TokenPosition alias_name_pos = TokenPos(); | 5231 const TokenPosition alias_name_pos = TokenPos(); |
5129 const String* alias_name = | 5232 const String* alias_name = |
5130 ExpectUserDefinedTypeIdentifier("function alias name expected"); | 5233 ExpectUserDefinedTypeIdentifier("function alias name expected"); |
5131 | 5234 |
5132 // Lookup alias name and report an error if it is already defined in | 5235 // Lookup alias name and report an error if it is already defined in |
5133 // the library scope. | 5236 // the library scope. |
5134 const Object& obj = | 5237 const Object& obj = |
5135 Object::Handle(Z, library_.LookupLocalObject(*alias_name)); | 5238 Object::Handle(Z, library_.LookupLocalObject(*alias_name)); |
5136 if (!obj.IsNull()) { | 5239 if (!obj.IsNull()) { |
5137 ReportError(alias_name_pos, "'%s' is already defined", | 5240 ReportError(alias_name_pos, "'%s' is already defined", |
5138 alias_name->ToCString()); | 5241 alias_name->ToCString()); |
5139 } | 5242 } |
5140 | 5243 |
5141 // Create the function type alias scope class. It will be linked to its | 5244 // Create the function type alias scope class. It will be linked to its |
5142 // signature function after it has been parsed. The type parameters, in order | 5245 // signature function after it has been parsed. The type parameters, in order |
5143 // to be properly finalized, need to be associated to this scope class as | 5246 // to be properly finalized, need to be associated to this scope class as |
5144 // they are parsed. | 5247 // they are parsed. |
5145 const Class& function_type_alias = Class::Handle( | 5248 const Class& function_type_alias = Class::Handle( |
5146 Z, Class::New(library_, *alias_name, script_, declaration_pos)); | 5249 Z, Class::New(library_, *alias_name, script_, declaration_pos)); |
5147 function_type_alias.set_is_synthesized_class(); | 5250 function_type_alias.set_is_synthesized_class(); |
5148 function_type_alias.set_is_abstract(); | 5251 function_type_alias.set_is_abstract(); |
5149 function_type_alias.set_is_prefinalized(); | 5252 function_type_alias.set_is_prefinalized(); |
5150 library_.AddClass(function_type_alias); | 5253 library_.AddClass(function_type_alias); |
| 5254 ASSERT(current_class().IsTopLevel()); |
5151 set_current_class(function_type_alias); | 5255 set_current_class(function_type_alias); |
5152 // Parse the type parameters of the typedef class. | 5256 // Parse the type parameters of the typedef class. |
5153 ParseTypeParameters(true); // Parameterizing current class. | 5257 ParseTypeParameters(true); // Parameterizing current class. |
5154 // At this point, the type parameters have been parsed, so we can resolve the | 5258 Function& signature_function = Function::Handle(Z); |
5155 // result type. | 5259 ASSERT(innermost_function().IsNull()); |
5156 if (!result_type.IsNull()) { | 5260 if (use_function_type_syntax) { |
5157 ResolveType(ClassFinalizer::kResolveTypeParameters, &result_type); | 5261 ExpectToken(Token::kASSIGN); |
| 5262 ASSERT(result_type.IsNull()); // Not parsed yet. |
| 5263 // Do not resolve types before the function type alias can be recognized as |
| 5264 // a typedef class, so that correct promotion of function types can occur. |
| 5265 const Type& function_type = Type::Handle( |
| 5266 Z, ParseFunctionType(result_type, ClassFinalizer::kDoNotResolve)); |
| 5267 signature_function = function_type.signature(); |
| 5268 } else { |
| 5269 signature_function = |
| 5270 Function::NewSignatureFunction(function_type_alias, alias_name_pos); |
| 5271 innermost_function_ = signature_function.raw(); |
| 5272 ParamList params; |
| 5273 // Parse the formal parameters of the function type. |
| 5274 CheckToken(Token::kLPAREN, "formal parameter list expected"); |
| 5275 // Add implicit closure object parameter. |
| 5276 params.AddFinalParameter(TokenPos(), &Symbols::ClosureParameter(), |
| 5277 &Object::dynamic_type()); |
| 5278 const bool allow_explicit_default_values = false; |
| 5279 const bool evaluate_metadata = false; |
| 5280 ParseFormalParameterList(use_function_type_syntax, |
| 5281 allow_explicit_default_values, evaluate_metadata, |
| 5282 ¶ms); |
| 5283 if (result_type.IsNull()) { |
| 5284 result_type = Type::DynamicType(); |
| 5285 } |
| 5286 signature_function.set_result_type(result_type); |
| 5287 AddFormalParamsToFunction(¶ms, signature_function); |
| 5288 ASSERT(innermost_function().raw() == signature_function.raw()); |
| 5289 innermost_function_ = Function::null(); |
5158 } | 5290 } |
5159 // Parse the formal parameters of the function type. | 5291 ExpectSemicolon(); |
5160 CheckToken(Token::kLPAREN, "formal parameter list expected"); | 5292 ASSERT(innermost_function().IsNull()); |
5161 ParamList func_params; | |
5162 | 5293 |
5163 // Add implicit closure object parameter. | |
5164 func_params.AddFinalParameter(TokenPos(), &Symbols::ClosureParameter(), | |
5165 &Object::dynamic_type()); | |
5166 | |
5167 // Mark the current class as a typedef class (by setting its signature | |
5168 // function field to a non-null function) before parsing its formal parameters | |
5169 // so that parsed function types are aware that their owner class is a | |
5170 // typedef class. | |
5171 Function& signature_function = Function::Handle( | |
5172 Z, Function::NewSignatureFunction(function_type_alias, alias_name_pos)); | |
5173 ASSERT(innermost_function().IsNull()); | |
5174 innermost_function_ = signature_function.raw(); | |
5175 // Set the signature function in the function type alias class. | 5294 // Set the signature function in the function type alias class. |
5176 function_type_alias.set_signature_function(signature_function); | 5295 function_type_alias.set_signature_function(signature_function); |
5177 | 5296 |
5178 const bool no_explicit_default_values = false; | 5297 // At this point, all function type parameters have been parsed and the class |
5179 ParseFormalParameterList(no_explicit_default_values, false, &func_params); | 5298 // function_type_alias is recognized as a typedef, so we can resolve all type |
5180 ExpectSemicolon(); | 5299 // parameters in the signature type defined by the typedef. |
5181 signature_function.set_result_type(result_type); | 5300 AbstractType& function_type = |
5182 AddFormalParamsToFunction(&func_params, signature_function); | 5301 Type::Handle(Z, signature_function.SignatureType()); |
5183 | 5302 ASSERT(current_class().raw() == function_type_alias.raw()); |
5184 ASSERT(innermost_function().raw() == signature_function.raw()); | 5303 ResolveType(ClassFinalizer::kResolveTypeParameters, &function_type); |
5185 innermost_function_ = Function::null(); | 5304 // Resolving does not replace type or signature. |
| 5305 ASSERT(function_type_alias.signature_function() == |
| 5306 Type::Cast(function_type).signature()); |
5186 | 5307 |
5187 if (FLAG_trace_parser) { | 5308 if (FLAG_trace_parser) { |
5188 OS::Print("TopLevel parsing function type alias '%s'\n", | 5309 OS::Print("TopLevel parsing function type alias '%s'\n", |
5189 String::Handle(Z, signature_function.Signature()).ToCString()); | 5310 String::Handle(Z, signature_function.Signature()).ToCString()); |
5190 } | 5311 } |
5191 // The alias should not be marked as finalized yet, since it needs to be | 5312 // The alias should not be marked as finalized yet, since it needs to be |
5192 // checked in the class finalizer for illegal self references. | 5313 // checked in the class finalizer for illegal self references. |
5193 ASSERT(!function_type_alias.is_finalized()); | 5314 ASSERT(!function_type_alias.is_finalized()); |
5194 pending_classes.Add(function_type_alias, Heap::kOld); | 5315 pending_classes.Add(function_type_alias, Heap::kOld); |
5195 if (FLAG_enable_mirrors && metadata_pos.IsReal()) { | 5316 if (FLAG_enable_mirrors && metadata_pos.IsReal()) { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5245 } | 5366 } |
5246 } | 5367 } |
5247 return metadata_pos; | 5368 return metadata_pos; |
5248 } | 5369 } |
5249 | 5370 |
5250 | 5371 |
5251 void Parser::SkipTypeArguments() { | 5372 void Parser::SkipTypeArguments() { |
5252 if (CurrentToken() == Token::kLT) { | 5373 if (CurrentToken() == Token::kLT) { |
5253 do { | 5374 do { |
5254 ConsumeToken(); | 5375 ConsumeToken(); |
5255 SkipType(false); | 5376 SkipTypeOrFunctionType(false); |
5256 } while (CurrentToken() == Token::kCOMMA); | 5377 } while (CurrentToken() == Token::kCOMMA); |
5257 Token::Kind token = CurrentToken(); | 5378 Token::Kind token = CurrentToken(); |
5258 if ((token == Token::kGT) || (token == Token::kSHR)) { | 5379 if ((token == Token::kGT) || (token == Token::kSHR)) { |
5259 ConsumeRightAngleBracket(); | 5380 ConsumeRightAngleBracket(); |
5260 } else { | 5381 } else { |
5261 ReportError("right angle bracket expected"); | 5382 ReportError("right angle bracket expected"); |
5262 } | 5383 } |
5263 } | 5384 } |
5264 } | 5385 } |
5265 | 5386 |
5266 | 5387 |
5267 void Parser::SkipType(bool allow_void) { | 5388 void Parser::SkipType(bool allow_void) { |
5268 if (CurrentToken() == Token::kVOID) { | 5389 if (CurrentToken() == Token::kVOID) { |
5269 if (!allow_void) { | 5390 if (!allow_void) { |
5270 ReportError("'void' not allowed here"); | 5391 ReportError("'void' not allowed here"); |
5271 } | 5392 } |
5272 ConsumeToken(); | 5393 ConsumeToken(); |
5273 } else { | 5394 } else { |
5274 ExpectIdentifier("type name expected"); | 5395 ExpectIdentifier("type name expected"); |
5275 if (CurrentToken() == Token::kPERIOD) { | 5396 if (CurrentToken() == Token::kPERIOD) { |
5276 ConsumeToken(); | 5397 ConsumeToken(); |
5277 ExpectIdentifier("name expected"); | 5398 ExpectIdentifier("name expected"); |
5278 } | 5399 } |
5279 SkipTypeArguments(); | 5400 SkipTypeArguments(); |
5280 } | 5401 } |
5281 } | 5402 } |
5282 | 5403 |
5283 | 5404 |
| 5405 void Parser::SkipTypeOrFunctionType(bool allow_void) { |
| 5406 if (CurrentToken() == Token::kVOID) { |
| 5407 TokenPosition void_pos = TokenPos(); |
| 5408 ConsumeToken(); |
| 5409 // 'void' is always allowed as result type of a function type. |
| 5410 if (!allow_void && !IsFunctionTypeSymbol()) { |
| 5411 ReportError(void_pos, "'void' not allowed here"); |
| 5412 } |
| 5413 } else if (!IsFunctionTypeSymbol()) { |
| 5414 // Including 'Function' not followed by '(' or '<'. |
| 5415 SkipType(false); |
| 5416 } |
| 5417 while (IsSymbol(Symbols::Function())) { |
| 5418 ConsumeToken(); |
| 5419 SkipTypeArguments(); |
| 5420 if (CurrentToken() == Token::kLPAREN) { |
| 5421 SkipToMatchingParenthesis(); |
| 5422 } else { |
| 5423 ReportError("'(' expected"); |
| 5424 } |
| 5425 } |
| 5426 } |
| 5427 |
| 5428 |
5284 void Parser::ParseTypeParameters(bool parameterizing_class) { | 5429 void Parser::ParseTypeParameters(bool parameterizing_class) { |
5285 TRACE_PARSER("ParseTypeParameters"); | 5430 TRACE_PARSER("ParseTypeParameters"); |
5286 if (CurrentToken() == Token::kLT) { | 5431 if (CurrentToken() == Token::kLT) { |
5287 GrowableArray<AbstractType*> type_parameters_array(Z, 2); | 5432 GrowableArray<AbstractType*> type_parameters_array(Z, 2); |
5288 intptr_t index = 0; | 5433 intptr_t index = 0; |
5289 TypeParameter& type_parameter = TypeParameter::Handle(Z); | 5434 TypeParameter& type_parameter = TypeParameter::Handle(Z); |
5290 TypeParameter& existing_type_parameter = TypeParameter::Handle(Z); | 5435 TypeParameter& existing_type_parameter = TypeParameter::Handle(Z); |
5291 String& existing_type_parameter_name = String::Handle(Z); | 5436 String& existing_type_parameter_name = String::Handle(Z); |
5292 AbstractType& type_parameter_bound = Type::Handle(Z); | 5437 AbstractType& type_parameter_bound = Type::Handle(Z); |
5293 do { | 5438 do { |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5369 | 5514 |
5370 | 5515 |
5371 RawTypeArguments* Parser::ParseTypeArguments( | 5516 RawTypeArguments* Parser::ParseTypeArguments( |
5372 ClassFinalizer::FinalizationKind finalization) { | 5517 ClassFinalizer::FinalizationKind finalization) { |
5373 TRACE_PARSER("ParseTypeArguments"); | 5518 TRACE_PARSER("ParseTypeArguments"); |
5374 if (CurrentToken() == Token::kLT) { | 5519 if (CurrentToken() == Token::kLT) { |
5375 GrowableArray<AbstractType*> types; | 5520 GrowableArray<AbstractType*> types; |
5376 AbstractType& type = AbstractType::Handle(Z); | 5521 AbstractType& type = AbstractType::Handle(Z); |
5377 do { | 5522 do { |
5378 ConsumeToken(); | 5523 ConsumeToken(); |
5379 type = ParseType(finalization); | 5524 type = ParseTypeOrFunctionType(false, finalization); |
5380 // Map a malformed type argument to dynamic. | 5525 // Map a malformed type argument to dynamic. |
5381 if (type.IsMalformed()) { | 5526 if (type.IsMalformed()) { |
5382 type = Type::DynamicType(); | 5527 type = Type::DynamicType(); |
5383 } | 5528 } |
5384 types.Add(&AbstractType::ZoneHandle(Z, type.raw())); | 5529 types.Add(&AbstractType::ZoneHandle(Z, type.raw())); |
5385 } while (CurrentToken() == Token::kCOMMA); | 5530 } while (CurrentToken() == Token::kCOMMA); |
5386 Token::Kind token = CurrentToken(); | 5531 Token::Kind token = CurrentToken(); |
5387 if ((token == Token::kGT) || (token == Token::kSHR)) { | 5532 if ((token == Token::kGT) || (token == Token::kSHR)) { |
5388 ConsumeRightAngleBracket(); | 5533 ConsumeRightAngleBracket(); |
5389 } else { | 5534 } else { |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5575 AbstractType& result_type = Type::Handle(Z, Type::DynamicType()); | 5720 AbstractType& result_type = Type::Handle(Z, Type::DynamicType()); |
5576 bool is_external = false; | 5721 bool is_external = false; |
5577 bool is_patch = false; | 5722 bool is_patch = false; |
5578 if (is_patch_source() && IsPatchAnnotation(metadata_pos)) { | 5723 if (is_patch_source() && IsPatchAnnotation(metadata_pos)) { |
5579 is_patch = true; | 5724 is_patch = true; |
5580 metadata_pos = TokenPosition::kNoSource; | 5725 metadata_pos = TokenPosition::kNoSource; |
5581 } else if (CurrentToken() == Token::kEXTERNAL) { | 5726 } else if (CurrentToken() == Token::kEXTERNAL) { |
5582 ConsumeToken(); | 5727 ConsumeToken(); |
5583 is_external = true; | 5728 is_external = true; |
5584 } | 5729 } |
5585 if (CurrentToken() == Token::kVOID) { | 5730 // Parse optional result type. |
5586 ConsumeToken(); | 5731 if (IsFunctionReturnType()) { |
5587 result_type = Type::VoidType(); | 5732 // It is too early to resolve the type here, since it can be a result type |
5588 } else { | 5733 // referring to a not yet declared function type parameter. |
5589 // Parse optional type. | 5734 result_type = ParseTypeOrFunctionType(true, ClassFinalizer::kDoNotResolve); |
5590 if (IsFunctionReturnType()) { | |
5591 // It is too early to resolve the type here, since it can be a result type | |
5592 // referring to a not yet declared function type parameter. | |
5593 result_type = ParseType(ClassFinalizer::kDoNotResolve); | |
5594 } | |
5595 } | 5735 } |
5596 const TokenPosition name_pos = TokenPos(); | 5736 const TokenPosition name_pos = TokenPos(); |
5597 const String& func_name = *ExpectIdentifier("function name expected"); | 5737 const String& func_name = *ExpectIdentifier("function name expected"); |
5598 | 5738 |
5599 bool found = library_.LookupLocalObject(func_name) != Object::null(); | 5739 bool found = library_.LookupLocalObject(func_name) != Object::null(); |
5600 if (found && !is_patch) { | 5740 if (found && !is_patch) { |
5601 ReportError(name_pos, "'%s' is already defined", func_name.ToCString()); | 5741 ReportError(name_pos, "'%s' is already defined", func_name.ToCString()); |
5602 } else if (!found && is_patch) { | 5742 } else if (!found && is_patch) { |
5603 ReportError(name_pos, "missing '%s' cannot be patched", | 5743 ReportError(name_pos, "missing '%s' cannot be patched", |
5604 func_name.ToCString()); | 5744 func_name.ToCString()); |
(...skipping 16 matching lines...) Expand all Loading... |
5621 | 5761 |
5622 ASSERT(innermost_function().IsNull()); | 5762 ASSERT(innermost_function().IsNull()); |
5623 innermost_function_ = func.raw(); | 5763 innermost_function_ = func.raw(); |
5624 | 5764 |
5625 if (CurrentToken() == Token::kLT) { | 5765 if (CurrentToken() == Token::kLT) { |
5626 if (!FLAG_generic_method_syntax) { | 5766 if (!FLAG_generic_method_syntax) { |
5627 ReportError("generic functions not supported"); | 5767 ReportError("generic functions not supported"); |
5628 } | 5768 } |
5629 ParseTypeParameters(false); // Not parameterizing class, but function. | 5769 ParseTypeParameters(false); // Not parameterizing class, but function. |
5630 } | 5770 } |
5631 // At this point, the type parameters have been parsed, so we can resolve the | |
5632 // result type. | |
5633 if (!result_type.IsNull()) { | |
5634 ResolveType(ClassFinalizer::kResolveTypeParameters, &result_type); | |
5635 } | |
5636 | 5771 |
5637 CheckToken(Token::kLPAREN); | 5772 CheckToken(Token::kLPAREN); |
5638 const TokenPosition function_pos = TokenPos(); | 5773 const TokenPosition function_pos = TokenPos(); |
5639 ParamList params; | 5774 ParamList params; |
| 5775 const bool use_function_type_syntax = false; |
5640 const bool allow_explicit_default_values = true; | 5776 const bool allow_explicit_default_values = true; |
5641 ParseFormalParameterList(allow_explicit_default_values, false, ¶ms); | 5777 const bool evaluate_metadata = false; |
| 5778 ParseFormalParameterList(use_function_type_syntax, |
| 5779 allow_explicit_default_values, evaluate_metadata, |
| 5780 ¶ms); |
5642 | 5781 |
5643 const TokenPosition modifier_pos = TokenPos(); | 5782 const TokenPosition modifier_pos = TokenPos(); |
5644 RawFunction::AsyncModifier func_modifier = ParseFunctionModifier(); | 5783 RawFunction::AsyncModifier func_modifier = ParseFunctionModifier(); |
5645 | 5784 |
5646 TokenPosition function_end_pos = function_pos; | 5785 TokenPosition function_end_pos = function_pos; |
5647 bool is_native = false; | 5786 bool is_native = false; |
5648 String* native_name = NULL; | 5787 String* native_name = NULL; |
5649 if (is_external) { | 5788 if (is_external) { |
5650 function_end_pos = TokenPos(); | 5789 function_end_pos = TokenPos(); |
5651 ExpectSemicolon(); | 5790 ExpectSemicolon(); |
(...skipping 26 matching lines...) Expand all Loading... |
5678 func.set_modifier(func_modifier); | 5817 func.set_modifier(func_modifier); |
5679 if (library_.is_dart_scheme() && library_.IsPrivate(func_name)) { | 5818 if (library_.is_dart_scheme() && library_.IsPrivate(func_name)) { |
5680 func.set_is_reflectable(false); | 5819 func.set_is_reflectable(false); |
5681 } | 5820 } |
5682 if (is_native) { | 5821 if (is_native) { |
5683 func.set_native_name(*native_name); | 5822 func.set_native_name(*native_name); |
5684 } | 5823 } |
5685 AddFormalParamsToFunction(¶ms, func); | 5824 AddFormalParamsToFunction(¶ms, func); |
5686 ASSERT(innermost_function().raw() == func.raw()); | 5825 ASSERT(innermost_function().raw() == func.raw()); |
5687 innermost_function_ = Function::null(); | 5826 innermost_function_ = Function::null(); |
| 5827 ResolveSignature(ClassFinalizer::kResolveTypeParameters, func); |
5688 top_level->AddFunction(func); | 5828 top_level->AddFunction(func); |
5689 if (!is_patch) { | 5829 if (!is_patch) { |
5690 library_.AddObject(func, func_name); | 5830 library_.AddObject(func, func_name); |
5691 } else { | 5831 } else { |
5692 // Need to remove the previously added function that is being patched. | 5832 // Need to remove the previously added function that is being patched. |
5693 const Class& toplevel_cls = Class::Handle(Z, library_.toplevel_class()); | 5833 const Class& toplevel_cls = Class::Handle(Z, library_.toplevel_class()); |
5694 const Function& replaced_func = | 5834 const Function& replaced_func = |
5695 Function::Handle(Z, toplevel_cls.LookupStaticFunction(func_name)); | 5835 Function::Handle(Z, toplevel_cls.LookupStaticFunction(func_name)); |
5696 ASSERT(!replaced_func.IsNull()); | 5836 ASSERT(!replaced_func.IsNull()); |
5697 toplevel_cls.RemoveFunction(replaced_func); | 5837 toplevel_cls.RemoveFunction(replaced_func); |
(...skipping 19 matching lines...) Expand all Loading... |
5717 metadata_pos = TokenPosition::kNoSource; | 5857 metadata_pos = TokenPosition::kNoSource; |
5718 } else if (CurrentToken() == Token::kEXTERNAL) { | 5858 } else if (CurrentToken() == Token::kEXTERNAL) { |
5719 ConsumeToken(); | 5859 ConsumeToken(); |
5720 is_external = true; | 5860 is_external = true; |
5721 } | 5861 } |
5722 bool is_getter = (CurrentToken() == Token::kGET); | 5862 bool is_getter = (CurrentToken() == Token::kGET); |
5723 if (CurrentToken() == Token::kGET || CurrentToken() == Token::kSET) { | 5863 if (CurrentToken() == Token::kGET || CurrentToken() == Token::kSET) { |
5724 ConsumeToken(); | 5864 ConsumeToken(); |
5725 result_type = Type::DynamicType(); | 5865 result_type = Type::DynamicType(); |
5726 } else { | 5866 } else { |
5727 if (CurrentToken() == Token::kVOID) { | 5867 result_type = |
5728 ConsumeToken(); | 5868 ParseTypeOrFunctionType(true, ClassFinalizer::kResolveTypeParameters); |
5729 result_type = Type::VoidType(); | |
5730 } else { | |
5731 result_type = ParseType(ClassFinalizer::kResolveTypeParameters); | |
5732 } | |
5733 is_getter = (CurrentToken() == Token::kGET); | 5869 is_getter = (CurrentToken() == Token::kGET); |
5734 if (CurrentToken() == Token::kGET || CurrentToken() == Token::kSET) { | 5870 if (CurrentToken() == Token::kGET || CurrentToken() == Token::kSET) { |
5735 ConsumeToken(); | 5871 ConsumeToken(); |
5736 } else { | 5872 } else { |
5737 UnexpectedToken(); | 5873 UnexpectedToken(); |
5738 } | 5874 } |
5739 } | 5875 } |
5740 const TokenPosition name_pos = TokenPos(); | 5876 const TokenPosition name_pos = TokenPos(); |
5741 const String* field_name = ExpectIdentifier("accessor name expected"); | 5877 const String* field_name = ExpectIdentifier("accessor name expected"); |
5742 | 5878 |
5743 const TokenPosition accessor_pos = TokenPos(); | 5879 const TokenPosition accessor_pos = TokenPos(); |
5744 ParamList params; | 5880 ParamList params; |
5745 | 5881 |
5746 if (!is_getter) { | 5882 if (!is_getter) { |
| 5883 const bool use_function_type_syntax = false; |
5747 const bool allow_explicit_default_values = true; | 5884 const bool allow_explicit_default_values = true; |
5748 ParseFormalParameterList(allow_explicit_default_values, false, ¶ms); | 5885 const bool evaluate_metadata = false; |
| 5886 ParseFormalParameterList(use_function_type_syntax, |
| 5887 allow_explicit_default_values, evaluate_metadata, |
| 5888 ¶ms); |
5749 } | 5889 } |
5750 String& accessor_name = String::ZoneHandle(Z); | 5890 String& accessor_name = String::ZoneHandle(Z); |
5751 int expected_num_parameters = -1; | 5891 int expected_num_parameters = -1; |
5752 if (is_getter) { | 5892 if (is_getter) { |
5753 expected_num_parameters = 0; | 5893 expected_num_parameters = 0; |
5754 accessor_name = Field::GetterSymbol(*field_name); | 5894 accessor_name = Field::GetterSymbol(*field_name); |
5755 } else { | 5895 } else { |
5756 expected_num_parameters = 1; | 5896 expected_num_parameters = 1; |
5757 accessor_name = Field::SetterSymbol(*field_name); | 5897 accessor_name = Field::SetterSymbol(*field_name); |
5758 } | 5898 } |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5832 func.set_end_token_pos(accessor_end_pos); | 5972 func.set_end_token_pos(accessor_end_pos); |
5833 func.set_modifier(func_modifier); | 5973 func.set_modifier(func_modifier); |
5834 if (is_native) { | 5974 if (is_native) { |
5835 func.set_is_debuggable(false); | 5975 func.set_is_debuggable(false); |
5836 func.set_native_name(*native_name); | 5976 func.set_native_name(*native_name); |
5837 } | 5977 } |
5838 if (library_.is_dart_scheme() && library_.IsPrivate(accessor_name)) { | 5978 if (library_.is_dart_scheme() && library_.IsPrivate(accessor_name)) { |
5839 func.set_is_reflectable(false); | 5979 func.set_is_reflectable(false); |
5840 } | 5980 } |
5841 AddFormalParamsToFunction(¶ms, func); | 5981 AddFormalParamsToFunction(¶ms, func); |
| 5982 ResolveSignature(ClassFinalizer::kResolveTypeParameters, func); |
5842 top_level->AddFunction(func); | 5983 top_level->AddFunction(func); |
5843 if (!is_patch) { | 5984 if (!is_patch) { |
5844 library_.AddObject(func, accessor_name); | 5985 library_.AddObject(func, accessor_name); |
5845 } else { | 5986 } else { |
5846 // Need to remove the previously added accessor that is being patched. | 5987 // Need to remove the previously added accessor that is being patched. |
5847 const Class& toplevel_cls = Class::Handle( | 5988 const Class& toplevel_cls = Class::Handle( |
5848 Z, owner.IsClass() ? Class::Cast(owner).raw() | 5989 Z, owner.IsClass() ? Class::Cast(owner).raw() |
5849 : PatchClass::Cast(owner).patched_class()); | 5990 : PatchClass::Cast(owner).patched_class()); |
5850 const Function& replaced_func = | 5991 const Function& replaced_func = |
5851 Function::Handle(Z, toplevel_cls.LookupFunction(accessor_name)); | 5992 Function::Handle(Z, toplevel_cls.LookupFunction(accessor_name)); |
(...skipping 830 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6682 body.set_result_type(Object::dynamic_type()); | 6823 body.set_result_type(Object::dynamic_type()); |
6683 is_new_closure = true; | 6824 is_new_closure = true; |
6684 } | 6825 } |
6685 | 6826 |
6686 ParamList closure_params; | 6827 ParamList closure_params; |
6687 AddSyncGenClosureParameters(&closure_params); | 6828 AddSyncGenClosureParameters(&closure_params); |
6688 | 6829 |
6689 if (is_new_closure) { | 6830 if (is_new_closure) { |
6690 // Add the parameters to the newly created closure. | 6831 // Add the parameters to the newly created closure. |
6691 AddFormalParamsToFunction(&closure_params, body); | 6832 AddFormalParamsToFunction(&closure_params, body); |
6692 | 6833 ResolveSignature(ClassFinalizer::kResolveTypeParameters, body); |
6693 // Finalize function type. | 6834 // Finalize function type. |
6694 Type& signature_type = Type::Handle(Z, body.SignatureType()); | 6835 Type& signature_type = Type::Handle(Z, body.SignatureType()); |
6695 signature_type ^= ClassFinalizer::FinalizeType( | 6836 signature_type ^= ClassFinalizer::FinalizeType( |
6696 current_class(), signature_type, ClassFinalizer::kCanonicalize); | 6837 current_class(), signature_type, ClassFinalizer::kCanonicalize); |
6697 body.SetSignatureType(signature_type); | 6838 body.SetSignatureType(signature_type); |
6698 ASSERT(AbstractType::Handle(Z, body.result_type()).IsResolved()); | 6839 ASSERT(AbstractType::Handle(Z, body.result_type()).IsResolved()); |
6699 ASSERT(body.NumParameters() == closure_params.parameters->length()); | 6840 ASSERT(body.NumParameters() == closure_params.parameters->length()); |
6700 } | 6841 } |
6701 | 6842 |
6702 OpenFunctionBlock(body); | 6843 OpenFunctionBlock(body); |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6810 closure.set_is_generated_body(true); | 6951 closure.set_is_generated_body(true); |
6811 closure.set_result_type(Object::dynamic_type()); | 6952 closure.set_result_type(Object::dynamic_type()); |
6812 is_new_closure = true; | 6953 is_new_closure = true; |
6813 } | 6954 } |
6814 // Create the parameter list for the async body closure. | 6955 // Create the parameter list for the async body closure. |
6815 ParamList closure_params; | 6956 ParamList closure_params; |
6816 AddAsyncClosureParameters(&closure_params); | 6957 AddAsyncClosureParameters(&closure_params); |
6817 if (is_new_closure) { | 6958 if (is_new_closure) { |
6818 // Add the parameters to the newly created closure. | 6959 // Add the parameters to the newly created closure. |
6819 AddFormalParamsToFunction(&closure_params, closure); | 6960 AddFormalParamsToFunction(&closure_params, closure); |
| 6961 ResolveSignature(ClassFinalizer::kResolveTypeParameters, closure); |
6820 | 6962 |
6821 // Finalize function type. | 6963 // Finalize function type. |
6822 Type& signature_type = Type::Handle(Z, closure.SignatureType()); | 6964 Type& signature_type = Type::Handle(Z, closure.SignatureType()); |
6823 signature_type ^= ClassFinalizer::FinalizeType( | 6965 signature_type ^= ClassFinalizer::FinalizeType( |
6824 current_class(), signature_type, ClassFinalizer::kCanonicalize); | 6966 current_class(), signature_type, ClassFinalizer::kCanonicalize); |
6825 closure.SetSignatureType(signature_type); | 6967 closure.SetSignatureType(signature_type); |
6826 ASSERT(AbstractType::Handle(Z, closure.result_type()).IsResolved()); | 6968 ASSERT(AbstractType::Handle(Z, closure.result_type()).IsResolved()); |
6827 ASSERT(closure.NumParameters() == closure_params.parameters->length()); | 6969 ASSERT(closure.NumParameters() == closure_params.parameters->length()); |
6828 } | 6970 } |
6829 OpenFunctionBlock(closure); | 6971 OpenFunctionBlock(closure); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6939 closure.set_result_type(Object::dynamic_type()); | 7081 closure.set_result_type(Object::dynamic_type()); |
6940 is_new_closure = true; | 7082 is_new_closure = true; |
6941 } | 7083 } |
6942 | 7084 |
6943 ParamList closure_params; | 7085 ParamList closure_params; |
6944 AddAsyncGenClosureParameters(&closure_params); | 7086 AddAsyncGenClosureParameters(&closure_params); |
6945 | 7087 |
6946 if (is_new_closure) { | 7088 if (is_new_closure) { |
6947 // Add the parameters to the newly created closure. | 7089 // Add the parameters to the newly created closure. |
6948 AddFormalParamsToFunction(&closure_params, closure); | 7090 AddFormalParamsToFunction(&closure_params, closure); |
| 7091 ResolveSignature(ClassFinalizer::kResolveTypeParameters, closure); |
6949 | 7092 |
6950 // Finalize function type. | 7093 // Finalize function type. |
6951 Type& signature_type = Type::Handle(Z, closure.SignatureType()); | 7094 Type& signature_type = Type::Handle(Z, closure.SignatureType()); |
6952 signature_type ^= ClassFinalizer::FinalizeType( | 7095 signature_type ^= ClassFinalizer::FinalizeType( |
6953 current_class(), signature_type, ClassFinalizer::kCanonicalize); | 7096 current_class(), signature_type, ClassFinalizer::kCanonicalize); |
6954 closure.SetSignatureType(signature_type); | 7097 closure.SetSignatureType(signature_type); |
6955 ASSERT(AbstractType::Handle(Z, closure.result_type()).IsResolved()); | 7098 ASSERT(AbstractType::Handle(Z, closure.result_type()).IsResolved()); |
6956 ASSERT(closure.NumParameters() == closure_params.parameters->length()); | 7099 ASSERT(closure.NumParameters() == closure_params.parameters->length()); |
6957 } | 7100 } |
6958 | 7101 |
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7301 for (int i = 0; i < params.num_optional_parameters; i++) { | 7444 for (int i = 0; i < params.num_optional_parameters; i++) { |
7302 const Instance* default_value = | 7445 const Instance* default_value = |
7303 parameters[i + first_opt_param_offset].default_value; | 7446 parameters[i + first_opt_param_offset].default_value; |
7304 default_values->Add(default_value); | 7447 default_values->Add(default_value); |
7305 } | 7448 } |
7306 parsed_function()->set_default_parameter_values(default_values); | 7449 parsed_function()->set_default_parameter_values(default_values); |
7307 } | 7450 } |
7308 } | 7451 } |
7309 | 7452 |
7310 | 7453 |
| 7454 void Parser::FinalizeFormalParameterTypes(const ParamList* params) { |
| 7455 ASSERT((params != NULL) && (params->parameters != NULL)); |
| 7456 const int num_parameters = params->parameters->length(); |
| 7457 AbstractType& type = AbstractType::Handle(Z); |
| 7458 for (int i = 0; i < num_parameters; i++) { |
| 7459 ParamDesc& param_desc = (*params->parameters)[i]; |
| 7460 type = param_desc.type->raw(); |
| 7461 ResolveType(ClassFinalizer::kCanonicalize, &type); |
| 7462 type = ClassFinalizer::FinalizeType(current_class(), type, |
| 7463 ClassFinalizer::kCanonicalize); |
| 7464 if (type.raw() != param_desc.type->raw()) { |
| 7465 param_desc.type = &AbstractType::ZoneHandle(Z, type.raw()); |
| 7466 } |
| 7467 } |
| 7468 } |
| 7469 |
| 7470 |
7311 // Populate the parameter type array and parameter name array of the function | 7471 // Populate the parameter type array and parameter name array of the function |
7312 // with the formal parameter types and names. | 7472 // with the formal parameter types and names. |
7313 void Parser::AddFormalParamsToFunction(const ParamList* params, | 7473 void Parser::AddFormalParamsToFunction(const ParamList* params, |
7314 const Function& func) { | 7474 const Function& func) { |
7315 ASSERT((params != NULL) && (params->parameters != NULL)); | 7475 ASSERT((params != NULL) && (params->parameters != NULL)); |
7316 ASSERT((params->num_optional_parameters > 0) == | 7476 ASSERT((params->num_optional_parameters > 0) == |
7317 (params->has_optional_positional_parameters || | 7477 (params->has_optional_positional_parameters || |
7318 params->has_optional_named_parameters)); | 7478 params->has_optional_named_parameters)); |
7319 if (!Utils::IsInt(16, params->num_fixed_parameters) || | 7479 if (!Utils::IsInt(16, params->num_fixed_parameters) || |
7320 !Utils::IsInt(16, params->num_optional_parameters)) { | 7480 !Utils::IsInt(16, params->num_optional_parameters)) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7355 | 7515 |
7356 | 7516 |
7357 // Populate local scope with the formal parameters. | 7517 // Populate local scope with the formal parameters. |
7358 void Parser::AddFormalParamsToScope(const ParamList* params, | 7518 void Parser::AddFormalParamsToScope(const ParamList* params, |
7359 LocalScope* scope) { | 7519 LocalScope* scope) { |
7360 ASSERT((params != NULL) && (params->parameters != NULL)); | 7520 ASSERT((params != NULL) && (params->parameters != NULL)); |
7361 ASSERT(scope != NULL); | 7521 ASSERT(scope != NULL); |
7362 const int num_parameters = params->parameters->length(); | 7522 const int num_parameters = params->parameters->length(); |
7363 for (int i = 0; i < num_parameters; i++) { | 7523 for (int i = 0; i < num_parameters; i++) { |
7364 ParamDesc& param_desc = (*params->parameters)[i]; | 7524 ParamDesc& param_desc = (*params->parameters)[i]; |
7365 ASSERT(!is_top_level_ || param_desc.type->IsResolved()); | |
7366 const String* name = param_desc.name; | 7525 const String* name = param_desc.name; |
7367 LocalVariable* parameter = new (Z) LocalVariable( | 7526 LocalVariable* parameter = new (Z) LocalVariable( |
7368 param_desc.name_pos, param_desc.name_pos, *name, *param_desc.type); | 7527 param_desc.name_pos, param_desc.name_pos, *name, *param_desc.type); |
7369 if (!scope->InsertParameterAt(i, parameter)) { | 7528 if (!scope->InsertParameterAt(i, parameter)) { |
7370 ReportError(param_desc.name_pos, "name '%s' already exists in scope", | 7529 ReportError(param_desc.name_pos, "name '%s' already exists in scope", |
7371 param_desc.name->ToCString()); | 7530 param_desc.name->ToCString()); |
7372 } | 7531 } |
7373 param_desc.var = parameter; | 7532 param_desc.var = parameter; |
7374 if (param_desc.is_final) { | 7533 if (param_desc.is_final) { |
7375 parameter->set_is_final(); | 7534 parameter->set_is_final(); |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7534 TRACE_PARSER("ParseConstFinalVarOrType"); | 7693 TRACE_PARSER("ParseConstFinalVarOrType"); |
7535 if (CurrentToken() == Token::kVAR) { | 7694 if (CurrentToken() == Token::kVAR) { |
7536 ConsumeToken(); | 7695 ConsumeToken(); |
7537 return Type::DynamicType(); | 7696 return Type::DynamicType(); |
7538 } | 7697 } |
7539 bool type_is_optional = false; | 7698 bool type_is_optional = false; |
7540 if ((CurrentToken() == Token::kFINAL) || (CurrentToken() == Token::kCONST)) { | 7699 if ((CurrentToken() == Token::kFINAL) || (CurrentToken() == Token::kCONST)) { |
7541 ConsumeToken(); | 7700 ConsumeToken(); |
7542 type_is_optional = true; | 7701 type_is_optional = true; |
7543 } | 7702 } |
| 7703 if ((CurrentToken() == Token::kVOID) || IsFunctionTypeSymbol()) { |
| 7704 return ParseFunctionType(AbstractType::Handle(Z), finalization); |
| 7705 } |
7544 if (CurrentToken() != Token::kIDENT) { | 7706 if (CurrentToken() != Token::kIDENT) { |
7545 if (type_is_optional) { | 7707 if (type_is_optional) { |
7546 return Type::DynamicType(); | 7708 return Type::DynamicType(); |
7547 } else { | 7709 } else { |
7548 ReportError("type name expected"); | 7710 ReportError("type name expected"); |
7549 } | 7711 } |
7550 } | 7712 } |
7551 if (type_is_optional) { | 7713 if (type_is_optional) { |
7552 Token::Kind follower = LookaheadToken(1); | 7714 Token::Kind follower = LookaheadToken(1); |
7553 // We have an identifier followed by a 'follower' token. | 7715 // We have an identifier followed by a 'follower' token. |
7554 // We either parse a type or return now. | 7716 // We either parse a type or return now. |
7555 if ((follower != Token::kLT) && // Parameterized type. | 7717 if ((follower != Token::kLT) && // Parameterized type. |
7556 (follower != Token::kPERIOD) && // Qualified class name of type. | 7718 (follower != Token::kPERIOD) && // Qualified class name of type. |
7557 !Token::IsIdentifier(follower) && // Variable name following a type. | 7719 !Token::IsIdentifier(follower) && // Variable name following a type. |
7558 (follower != Token::kTHIS)) { // Field parameter following a type. | 7720 (follower != Token::kTHIS)) { // Field parameter following a type. |
7559 return Type::DynamicType(); | 7721 return Type::DynamicType(); |
7560 } | 7722 } |
7561 } | 7723 } |
7562 return ParseType(finalization); | 7724 return ParseTypeOrFunctionType(false, finalization); |
7563 } | 7725 } |
7564 | 7726 |
7565 | 7727 |
7566 // Returns ast nodes of the variable initialization. Variables without an | 7728 // Returns ast nodes of the variable initialization. Variables without an |
7567 // explicit initializer are initialized to null. If several variables are | 7729 // explicit initializer are initialized to null. If several variables are |
7568 // declared, the individual initializers are collected in a sequence node. | 7730 // declared, the individual initializers are collected in a sequence node. |
7569 AstNode* Parser::ParseVariableDeclarationList() { | 7731 AstNode* Parser::ParseVariableDeclarationList() { |
7570 TRACE_PARSER("ParseVariableDeclarationList"); | 7732 TRACE_PARSER("ParseVariableDeclarationList"); |
7571 SkipMetadata(); | 7733 SkipMetadata(); |
7572 bool is_final = (CurrentToken() == Token::kFINAL); | 7734 bool is_final = (CurrentToken() == Token::kFINAL); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7604 } | 7766 } |
7605 sequence->Add(declaration); | 7767 sequence->Add(declaration); |
7606 initializers = sequence; | 7768 initializers = sequence; |
7607 } | 7769 } |
7608 return initializers; | 7770 return initializers; |
7609 } | 7771 } |
7610 | 7772 |
7611 | 7773 |
7612 AstNode* Parser::ParseFunctionStatement(bool is_literal) { | 7774 AstNode* Parser::ParseFunctionStatement(bool is_literal) { |
7613 TRACE_PARSER("ParseFunctionStatement"); | 7775 TRACE_PARSER("ParseFunctionStatement"); |
7614 AbstractType& result_type = AbstractType::Handle(Z); | 7776 AbstractType& result_type = AbstractType::Handle(Z, Type::DynamicType()); |
7615 const String* function_name = NULL; | 7777 const String* function_name = NULL; |
7616 | |
7617 result_type = Type::DynamicType(); | |
7618 | |
7619 const TokenPosition function_pos = TokenPos(); | 7778 const TokenPosition function_pos = TokenPos(); |
7620 TokenPosition function_name_pos = TokenPosition::kNoSource; | 7779 TokenPosition function_name_pos = TokenPosition::kNoSource; |
7621 TokenPosition metadata_pos = TokenPosition::kNoSource; | 7780 TokenPosition metadata_pos = TokenPosition::kNoSource; |
7622 if (is_literal) { | 7781 if (is_literal) { |
7623 ASSERT(CurrentToken() == Token::kLPAREN || CurrentToken() == Token::kLT); | 7782 ASSERT(CurrentToken() == Token::kLPAREN || CurrentToken() == Token::kLT); |
7624 function_name = &Symbols::AnonymousClosure(); | 7783 function_name = &Symbols::AnonymousClosure(); |
7625 } else { | 7784 } else { |
7626 metadata_pos = SkipMetadata(); | 7785 metadata_pos = SkipMetadata(); |
7627 if (CurrentToken() == Token::kVOID) { | 7786 // Parse optional result type. |
7628 ConsumeToken(); | 7787 if (IsFunctionReturnType()) { |
7629 result_type = Type::VoidType(); | |
7630 } else if (IsFunctionReturnType()) { | |
7631 // It is too early to resolve the type here, since it can be a result type | 7788 // It is too early to resolve the type here, since it can be a result type |
7632 // referring to a not yet declared function type parameter. | 7789 // referring to a not yet declared function type parameter. |
7633 result_type = ParseType(ClassFinalizer::kDoNotResolve); | 7790 result_type = |
| 7791 ParseTypeOrFunctionType(true, ClassFinalizer::kDoNotResolve); |
7634 } | 7792 } |
7635 function_name_pos = TokenPos(); | 7793 function_name_pos = TokenPos(); |
7636 function_name = ExpectIdentifier("function name expected"); | 7794 function_name = ExpectIdentifier("function name expected"); |
7637 | 7795 |
7638 // Check that the function name has not been referenced | 7796 // Check that the function name has not been referenced |
7639 // before this declaration. | 7797 // before this declaration. |
7640 ASSERT(current_block_ != NULL); | 7798 ASSERT(current_block_ != NULL); |
7641 const TokenPosition previous_pos = | 7799 const TokenPosition previous_pos = |
7642 current_block_->scope->PreviousReferencePos(*function_name); | 7800 current_block_->scope->PreviousReferencePos(*function_name); |
7643 if (previous_pos.IsReal()) { | 7801 if (previous_pos.IsReal()) { |
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7993 (CurrentLiteral()->raw() == Symbols::YieldKw().raw()))); | 8151 (CurrentLiteral()->raw() == Symbols::YieldKw().raw()))); |
7994 } | 8152 } |
7995 | 8153 |
7996 | 8154 |
7997 bool Parser::IsSymbol(const String& symbol) { | 8155 bool Parser::IsSymbol(const String& symbol) { |
7998 return (CurrentLiteral()->raw() == symbol.raw()) && | 8156 return (CurrentLiteral()->raw() == symbol.raw()) && |
7999 (CurrentToken() == Token::kIDENT); | 8157 (CurrentToken() == Token::kIDENT); |
8000 } | 8158 } |
8001 | 8159 |
8002 | 8160 |
| 8161 // Returns true if the current token is 'Function' followed by '<' or '('. |
| 8162 // 'Function' not followed by '<' or '(' denotes the Function class. |
| 8163 bool Parser::IsFunctionTypeSymbol() { |
| 8164 return IsSymbol(Symbols::Function()) && |
| 8165 ((LookaheadToken(1) == Token::kLPAREN) || |
| 8166 (LookaheadToken(1) == Token::kLT)); |
| 8167 } |
| 8168 |
| 8169 |
8003 // Returns true if the next tokens can be parsed as a an optionally | 8170 // Returns true if the next tokens can be parsed as a an optionally |
8004 // qualified identifier: [ident '.'] ident. | 8171 // qualified identifier: [ident '.'] ident. |
8005 // Current token position is not restored. | 8172 // Current token position is not restored. |
8006 bool Parser::TryParseQualIdent() { | 8173 bool Parser::TryParseQualIdent() { |
8007 if (CurrentToken() != Token::kIDENT) { | 8174 if (CurrentToken() != Token::kIDENT) { |
8008 return false; | 8175 return false; |
8009 } | 8176 } |
8010 ConsumeToken(); | 8177 ConsumeToken(); |
8011 if (CurrentToken() == Token::kPERIOD) { | 8178 if (CurrentToken() == Token::kPERIOD) { |
8012 ConsumeToken(); | 8179 ConsumeToken(); |
8013 if (CurrentToken() != Token::kIDENT) { | 8180 if (CurrentToken() != Token::kIDENT) { |
8014 return false; | 8181 return false; |
8015 } | 8182 } |
8016 ConsumeToken(); | 8183 ConsumeToken(); |
8017 } | 8184 } |
8018 return true; | 8185 return true; |
8019 } | 8186 } |
8020 | 8187 |
8021 | 8188 |
8022 // Returns true if the next tokens can be parsed as a type with optional | 8189 // Returns true if the next tokens can be parsed as a type with optional |
8023 // type parameters. Current token position is not restored. | 8190 // type parameters. Current token position is not restored. |
8024 bool Parser::TryParseOptionalType() { | 8191 // Allow 'void' as type if 'allow_void' is true. |
8025 if (CurrentToken() == Token::kIDENT) { | 8192 // Note that 'void Function()' is always allowed, since it is a function type |
| 8193 // and not the void type. |
| 8194 bool Parser::TryParseType(bool allow_void) { |
| 8195 bool found = false; |
| 8196 if (CurrentToken() == Token::kVOID) { |
| 8197 ConsumeToken(); |
| 8198 if (allow_void) { |
| 8199 found = true; |
| 8200 } else if (!IsFunctionTypeSymbol()) { |
| 8201 return false; |
| 8202 } |
| 8203 } else if ((CurrentToken() == Token::kIDENT) && !IsFunctionTypeSymbol()) { |
| 8204 // 'Function' not followed by '(' or '<' means the Function class. |
8026 if (!TryParseQualIdent()) { | 8205 if (!TryParseQualIdent()) { |
8027 return false; | 8206 return false; |
8028 } | 8207 } |
8029 if ((CurrentToken() == Token::kLT) && !TryParseTypeParameters()) { | 8208 if ((CurrentToken() == Token::kLT) && !TryParseTypeParameters()) { |
8030 return false; | 8209 return false; |
8031 } | 8210 } |
| 8211 found = true; |
8032 } | 8212 } |
8033 return true; | 8213 while (IsSymbol(Symbols::Function())) { |
| 8214 ConsumeToken(); |
| 8215 if ((CurrentToken() == Token::kLT) && !TryParseTypeParameters()) { |
| 8216 return false; |
| 8217 } |
| 8218 if (CurrentToken() == Token::kLPAREN) { |
| 8219 SkipToMatchingParenthesis(); |
| 8220 } else { |
| 8221 return false; |
| 8222 } |
| 8223 found = true; |
| 8224 } |
| 8225 return found; |
8034 } | 8226 } |
8035 | 8227 |
8036 | 8228 |
8037 // Returns true if the next tokens can be parsed as a type with optional | |
8038 // type parameters, or keyword "void". | |
8039 // Current token position is not restored. | |
8040 bool Parser::TryParseReturnType() { | |
8041 if (CurrentToken() == Token::kVOID) { | |
8042 ConsumeToken(); | |
8043 return true; | |
8044 } else if (CurrentToken() == Token::kIDENT) { | |
8045 return TryParseOptionalType(); | |
8046 } | |
8047 return false; | |
8048 } | |
8049 | |
8050 | |
8051 // Look ahead to detect whether the next tokens should be parsed as | 8229 // Look ahead to detect whether the next tokens should be parsed as |
8052 // a variable declaration. Ignores optional metadata. | 8230 // a variable declaration. Ignores optional metadata. |
8053 // Returns true if we detect the token pattern: | 8231 // Returns true if we detect the token pattern: |
8054 // 'var' | 8232 // 'var' |
8055 // | 'final' | 8233 // | 'final' |
8056 // | const [type] ident (';' | '=' | ',') | 8234 // | const [type] ident (';' | '=' | ',') |
8057 // | type ident (';' | '=' | ',') | 8235 // | type ident (';' | '=' | ',') |
8058 // Token position remains unchanged. | 8236 // Token position remains unchanged. |
8059 bool Parser::IsVariableDeclaration() { | 8237 bool Parser::IsVariableDeclaration() { |
8060 if ((CurrentToken() == Token::kVAR) || (CurrentToken() == Token::kFINAL)) { | 8238 if ((CurrentToken() == Token::kVAR) || (CurrentToken() == Token::kFINAL)) { |
8061 return true; | 8239 return true; |
8062 } | 8240 } |
8063 // Skip optional metadata. | 8241 // Skip optional metadata. |
8064 if (CurrentToken() == Token::kAT) { | 8242 if (CurrentToken() == Token::kAT) { |
8065 const TokenPosition saved_pos = TokenPos(); | 8243 const TokenPosition saved_pos = TokenPos(); |
8066 SkipMetadata(); | 8244 SkipMetadata(); |
8067 const bool is_var_decl = IsVariableDeclaration(); | 8245 const bool is_var_decl = IsVariableDeclaration(); |
8068 SetPosition(saved_pos); | 8246 SetPosition(saved_pos); |
8069 return is_var_decl; | 8247 return is_var_decl; |
8070 } | 8248 } |
8071 if ((CurrentToken() != Token::kIDENT) && (CurrentToken() != Token::kCONST)) { | 8249 if ((CurrentToken() != Token::kIDENT) && (CurrentToken() != Token::kVOID) && |
8072 // Not a legal type identifier or const keyword or metadata. | 8250 (CurrentToken() != Token::kCONST)) { |
| 8251 // Not a legal type identifier or void (result type of function type) |
| 8252 // or const keyword or metadata. |
8073 return false; | 8253 return false; |
8074 } | 8254 } |
8075 const TokenPosition saved_pos = TokenPos(); | 8255 const TokenPosition saved_pos = TokenPos(); |
8076 bool is_var_decl = false; | 8256 bool is_var_decl = false; |
8077 bool have_type = false; | 8257 bool have_type = false; |
8078 if (CurrentToken() == Token::kCONST) { | 8258 if (CurrentToken() == Token::kCONST) { |
8079 ConsumeToken(); | 8259 ConsumeToken(); |
8080 have_type = true; // Type is dynamic. | 8260 have_type = true; // Type is dynamic if 'const' is not followed by a type. |
8081 } | 8261 } |
8082 if (IsIdentifier()) { // Type or variable name. | 8262 if ((CurrentToken() == Token::kVOID) || IsFunctionTypeSymbol()) { |
| 8263 if (TryParseType(false)) { |
| 8264 have_type = true; |
| 8265 } |
| 8266 } else if (IsIdentifier()) { // Type or variable name. |
8083 Token::Kind follower = LookaheadToken(1); | 8267 Token::Kind follower = LookaheadToken(1); |
8084 if ((follower == Token::kLT) || // Parameterized type. | 8268 if ((follower == Token::kLT) || // Parameterized type. |
8085 (follower == Token::kPERIOD) || // Qualified class name of type. | 8269 (follower == Token::kPERIOD) || // Qualified class name of type. |
8086 Token::IsIdentifier(follower)) { // Variable name following a type. | 8270 Token::IsIdentifier(follower)) { // Variable name following a type. |
8087 // We see the beginning of something that could be a type. | 8271 // We see the beginning of something that could be a type. |
8088 const TokenPosition type_pos = TokenPos(); | 8272 const TokenPosition type_pos = TokenPos(); |
8089 if (TryParseOptionalType()) { | 8273 if (TryParseType(false)) { |
8090 have_type = true; | 8274 have_type = true; |
8091 } else { | 8275 } else { |
8092 SetPosition(type_pos); | 8276 SetPosition(type_pos); |
8093 } | 8277 } |
8094 } | 8278 } |
8095 if (have_type && IsIdentifier()) { | 8279 } |
8096 ConsumeToken(); | 8280 if (have_type && IsIdentifier()) { |
8097 if ((CurrentToken() == Token::kSEMICOLON) || | 8281 ConsumeToken(); |
8098 (CurrentToken() == Token::kCOMMA) || | 8282 if ((CurrentToken() == Token::kSEMICOLON) || |
8099 (CurrentToken() == Token::kASSIGN)) { | 8283 (CurrentToken() == Token::kCOMMA) || |
8100 is_var_decl = true; | 8284 (CurrentToken() == Token::kASSIGN)) { |
8101 } | 8285 is_var_decl = true; |
8102 } | 8286 } |
8103 } | 8287 } |
8104 SetPosition(saved_pos); | 8288 SetPosition(saved_pos); |
8105 return is_var_decl; | 8289 return is_var_decl; |
8106 } | 8290 } |
8107 | 8291 |
8108 | 8292 |
8109 // Look ahead to see if the following tokens are a return type followed | 8293 // Look ahead to see if the following tokens are a return type followed |
8110 // by an identifier. | 8294 // by an identifier. |
8111 bool Parser::IsFunctionReturnType() { | 8295 bool Parser::IsFunctionReturnType() { |
8112 TokenPosScope decl_pos(this); | 8296 TokenPosScope decl_pos(this); |
8113 if (TryParseReturnType()) { | 8297 if (TryParseType(true)) { |
8114 if (IsIdentifier()) { | 8298 if (IsIdentifier()) { |
8115 // Return type followed by function name. | 8299 // Return type followed by function name. |
8116 return true; | 8300 return true; |
8117 } | 8301 } |
8118 } | 8302 } |
8119 return false; | 8303 return false; |
8120 } | 8304 } |
8121 | 8305 |
8122 | 8306 |
8123 // Look ahead to detect whether the next tokens should be parsed as | 8307 // Look ahead to detect whether the next tokens should be parsed as |
8124 // a function declaration. Token position remains unchanged. | 8308 // a function declaration. Token position remains unchanged. |
8125 bool Parser::IsFunctionDeclaration() { | 8309 bool Parser::IsFunctionDeclaration() { |
8126 bool is_external = false; | 8310 bool is_external = false; |
8127 TokenPosScope decl_pos(this); | 8311 TokenPosScope decl_pos(this); |
8128 SkipMetadata(); | 8312 SkipMetadata(); |
8129 if ((is_top_level_) && (CurrentToken() == Token::kEXTERNAL)) { | 8313 if ((is_top_level_) && (CurrentToken() == Token::kEXTERNAL)) { |
8130 // Skip over 'external' for top-level function declarations. | 8314 // Skip over 'external' for top-level function declarations. |
8131 is_external = true; | 8315 is_external = true; |
8132 ConsumeToken(); | 8316 ConsumeToken(); |
8133 } | 8317 } |
8134 const TokenPosition type_or_name_pos = TokenPos(); | 8318 const TokenPosition type_or_name_pos = TokenPos(); |
8135 if (TryParseReturnType()) { | 8319 if (TryParseType(true)) { |
8136 if (!IsIdentifier()) { | 8320 if (!IsIdentifier()) { |
8137 SetPosition(type_or_name_pos); | 8321 SetPosition(type_or_name_pos); |
8138 } | 8322 } |
8139 } else { | 8323 } else { |
8140 SetPosition(type_or_name_pos); | 8324 SetPosition(type_or_name_pos); |
8141 } | 8325 } |
8142 // Check for function name followed by optional type parameters. | 8326 // Check for function name followed by optional type parameters. |
8143 if (!IsIdentifier()) { | 8327 if (!IsIdentifier()) { |
8144 return false; | 8328 return false; |
8145 } | 8329 } |
(...skipping 19 matching lines...) Expand all Loading... |
8165 | 8349 |
8166 | 8350 |
8167 bool Parser::IsTopLevelAccessor() { | 8351 bool Parser::IsTopLevelAccessor() { |
8168 const TokenPosScope saved_pos(this); | 8352 const TokenPosScope saved_pos(this); |
8169 if (CurrentToken() == Token::kEXTERNAL) { | 8353 if (CurrentToken() == Token::kEXTERNAL) { |
8170 ConsumeToken(); | 8354 ConsumeToken(); |
8171 } | 8355 } |
8172 if ((CurrentToken() == Token::kGET) || (CurrentToken() == Token::kSET)) { | 8356 if ((CurrentToken() == Token::kGET) || (CurrentToken() == Token::kSET)) { |
8173 return true; | 8357 return true; |
8174 } | 8358 } |
8175 if (TryParseReturnType()) { | 8359 if (TryParseType(true)) { |
8176 if ((CurrentToken() == Token::kGET) || (CurrentToken() == Token::kSET)) { | 8360 if ((CurrentToken() == Token::kGET) || (CurrentToken() == Token::kSET)) { |
8177 if (Token::IsIdentifier(LookaheadToken(1))) { // Accessor name. | 8361 if (Token::IsIdentifier(LookaheadToken(1))) { // Accessor name. |
8178 return true; | 8362 return true; |
8179 } | 8363 } |
8180 } | 8364 } |
8181 } | 8365 } |
8182 return false; | 8366 return false; |
8183 } | 8367 } |
8184 | 8368 |
8185 | 8369 |
(...skipping 28 matching lines...) Expand all Loading... |
8214 // Allow const modifier as well when recognizing a for-in statement | 8398 // Allow const modifier as well when recognizing a for-in statement |
8215 // pattern. We will get an error later if the loop variable is | 8399 // pattern. We will get an error later if the loop variable is |
8216 // declared with const. | 8400 // declared with const. |
8217 if (CurrentToken() == Token::kVAR || CurrentToken() == Token::kFINAL || | 8401 if (CurrentToken() == Token::kVAR || CurrentToken() == Token::kFINAL || |
8218 CurrentToken() == Token::kCONST) { | 8402 CurrentToken() == Token::kCONST) { |
8219 ConsumeToken(); | 8403 ConsumeToken(); |
8220 } | 8404 } |
8221 if (IsIdentifier()) { | 8405 if (IsIdentifier()) { |
8222 if (LookaheadToken(1) == Token::kIN) { | 8406 if (LookaheadToken(1) == Token::kIN) { |
8223 return true; | 8407 return true; |
8224 } else if (TryParseOptionalType()) { | 8408 } else if (TryParseType(false)) { |
8225 if (IsIdentifier()) { | 8409 if (IsIdentifier()) { |
8226 ConsumeToken(); | 8410 ConsumeToken(); |
8227 } | 8411 } |
8228 return CurrentToken() == Token::kIN; | 8412 return CurrentToken() == Token::kIN; |
8229 } | 8413 } |
8230 } | 8414 } |
8231 return false; | 8415 return false; |
8232 } | 8416 } |
8233 | 8417 |
8234 | 8418 |
(...skipping 1278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9513 while ((CurrentToken() == Token::kCATCH) || IsSymbol(Symbols::On())) { | 9697 while ((CurrentToken() == Token::kCATCH) || IsSymbol(Symbols::On())) { |
9514 // Open a block that contains the if or an unconditional body. It's | 9698 // Open a block that contains the if or an unconditional body. It's |
9515 // closed in the loop that builds the if-then-else nest. | 9699 // closed in the loop that builds the if-then-else nest. |
9516 OpenBlock(); | 9700 OpenBlock(); |
9517 const TokenPosition catch_pos = TokenPos(); | 9701 const TokenPosition catch_pos = TokenPos(); |
9518 CatchParamDesc exception_param; | 9702 CatchParamDesc exception_param; |
9519 CatchParamDesc stack_trace_param; | 9703 CatchParamDesc stack_trace_param; |
9520 if (IsSymbol(Symbols::On())) { | 9704 if (IsSymbol(Symbols::On())) { |
9521 ConsumeToken(); | 9705 ConsumeToken(); |
9522 exception_param.type = &AbstractType::ZoneHandle( | 9706 exception_param.type = &AbstractType::ZoneHandle( |
9523 Z, ParseType(ClassFinalizer::kCanonicalize)); | 9707 Z, ParseTypeOrFunctionType(false, ClassFinalizer::kCanonicalize)); |
9524 } else { | 9708 } else { |
9525 exception_param.type = &Object::dynamic_type(); | 9709 exception_param.type = &Object::dynamic_type(); |
9526 } | 9710 } |
9527 if (CurrentToken() == Token::kCATCH) { | 9711 if (CurrentToken() == Token::kCATCH) { |
9528 ConsumeToken(); // Consume the 'catch'. | 9712 ConsumeToken(); // Consume the 'catch'. |
9529 ExpectToken(Token::kLPAREN); | 9713 ExpectToken(Token::kLPAREN); |
9530 exception_param.token_pos = TokenPos(); | 9714 exception_param.token_pos = TokenPos(); |
9531 exception_param.name = ExpectIdentifier("identifier expected"); | 9715 exception_param.name = ExpectIdentifier("identifier expected"); |
9532 if (CurrentToken() == Token::kCOMMA) { | 9716 if (CurrentToken() == Token::kCOMMA) { |
9533 ConsumeToken(); | 9717 ConsumeToken(); |
(...skipping 1085 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10619 if ((op_kind != Token::kIS) && (op_kind != Token::kAS)) { | 10803 if ((op_kind != Token::kIS) && (op_kind != Token::kAS)) { |
10620 right_operand = ParseBinaryExpr(current_preced + 1); | 10804 right_operand = ParseBinaryExpr(current_preced + 1); |
10621 } else { | 10805 } else { |
10622 // For 'is' and 'as' we expect the right operand to be a type. | 10806 // For 'is' and 'as' we expect the right operand to be a type. |
10623 if ((op_kind == Token::kIS) && (CurrentToken() == Token::kNOT)) { | 10807 if ((op_kind == Token::kIS) && (CurrentToken() == Token::kNOT)) { |
10624 ConsumeToken(); | 10808 ConsumeToken(); |
10625 op_kind = Token::kISNOT; | 10809 op_kind = Token::kISNOT; |
10626 } | 10810 } |
10627 const TokenPosition type_pos = TokenPos(); | 10811 const TokenPosition type_pos = TokenPos(); |
10628 const AbstractType& type = AbstractType::ZoneHandle( | 10812 const AbstractType& type = AbstractType::ZoneHandle( |
10629 Z, ParseType(ClassFinalizer::kCanonicalize)); | 10813 Z, ParseTypeOrFunctionType(false, ClassFinalizer::kCanonicalize)); |
10630 if (!type.IsInstantiated() && (FunctionLevel() > 0)) { | 10814 if (!type.IsInstantiated() && (FunctionLevel() > 0)) { |
10631 // Make sure that the instantiator is captured. | 10815 // Make sure that the instantiator is captured. |
10632 CaptureInstantiator(); | 10816 CaptureInstantiator(); |
10633 } | 10817 } |
10634 right_operand = new (Z) TypeNode(type_pos, type); | 10818 right_operand = new (Z) TypeNode(type_pos, type); |
10635 // In production mode, the type may be malformed. | 10819 // In production mode, the type may be malformed. |
10636 // In checked mode, the type may be malformed or malbounded. | 10820 // In checked mode, the type may be malformed or malbounded. |
10637 if (type.IsMalformedOrMalbounded()) { | 10821 if (type.IsMalformedOrMalbounded()) { |
10638 // Note that a type error is thrown in a type test or in | 10822 // Note that a type error is thrown in a type test or in |
10639 // a type cast even if the tested value is null. | 10823 // a type cast even if the tested value is null. |
(...skipping 1308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11948 // The result is a pair of the (side effects of the) store followed by | 12132 // The result is a pair of the (side effects of the) store followed by |
11949 // the (value of the) initial value temp variable load. | 12133 // the (value of the) initial value temp variable load. |
11950 let_expr->AddNode(store); | 12134 let_expr->AddNode(store); |
11951 let_expr->AddNode(new (Z) LoadLocalNode(op_pos, temp)); | 12135 let_expr->AddNode(new (Z) LoadLocalNode(op_pos, temp)); |
11952 return let_expr; | 12136 return let_expr; |
11953 } | 12137 } |
11954 return expr; | 12138 return expr; |
11955 } | 12139 } |
11956 | 12140 |
11957 | 12141 |
| 12142 // Resolve the types of the given signature from the current class according to |
| 12143 // the given type finalization mode. |
| 12144 // Not all involved type classes may get resolved yet, but at least type |
| 12145 // parameters will get resolved, thereby relieving the class |
| 12146 // finalizer from resolving type parameters out of context. |
| 12147 // TODO(regis): Refactor this code which is partially duplicated in the class |
| 12148 // finalizer, paying attention to type parameter resolution and mixin library. |
| 12149 void Parser::ResolveSignature(ClassFinalizer::FinalizationKind finalization, |
| 12150 const Function& signature) { |
| 12151 const Function& saved_innermost_function = |
| 12152 Function::Handle(Z, innermost_function().raw()); |
| 12153 innermost_function_ = signature.raw(); |
| 12154 // TODO(regis): Resolve upper bounds of function type parameters. |
| 12155 AbstractType& type = AbstractType::Handle(signature.result_type()); |
| 12156 ResolveType(finalization, &type); |
| 12157 signature.set_result_type(type); |
| 12158 const intptr_t num_parameters = signature.NumParameters(); |
| 12159 for (intptr_t i = 0; i < num_parameters; i++) { |
| 12160 type = signature.ParameterTypeAt(i); |
| 12161 ResolveType(finalization, &type); |
| 12162 signature.SetParameterTypeAt(i, type); |
| 12163 } |
| 12164 innermost_function_ = saved_innermost_function.raw(); |
| 12165 } |
| 12166 |
| 12167 |
11958 // Resolve the given type and its type arguments from the current function and | 12168 // Resolve the given type and its type arguments from the current function and |
11959 // current class according to the given type finalization mode. | 12169 // current class according to the given type finalization mode. |
11960 // Not all involved type classes may get resolved yet, but at least type | 12170 // Not all involved type classes may get resolved yet, but at least type |
11961 // parameters will get resolved, thereby relieving the class | 12171 // parameters will get resolved, thereby relieving the class |
11962 // finalizer from resolving type parameters out of context. | 12172 // finalizer from resolving type parameters out of context. |
11963 // TODO(regis): Refactor this code which is partially duplicated in the class | 12173 // TODO(regis): Refactor this code which is partially duplicated in the class |
11964 // finalizer, paying attention to type parameter resolution and mixin library. | 12174 // finalizer, paying attention to type parameter resolution and mixin library. |
11965 void Parser::ResolveType(ClassFinalizer::FinalizationKind finalization, | 12175 void Parser::ResolveType(ClassFinalizer::FinalizationKind finalization, |
11966 AbstractType* type) { | 12176 AbstractType* type) { |
11967 ASSERT(finalization >= ClassFinalizer::kResolveTypeParameters); | 12177 ASSERT(finalization >= ClassFinalizer::kResolveTypeParameters); |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12075 arguments.SetTypeAt(i, type_argument); | 12285 arguments.SetTypeAt(i, type_argument); |
12076 } | 12286 } |
12077 } | 12287 } |
12078 if (type->IsFunctionType()) { | 12288 if (type->IsFunctionType()) { |
12079 const Function& signature = | 12289 const Function& signature = |
12080 Function::Handle(Z, Type::Cast(*type).signature()); | 12290 Function::Handle(Z, Type::Cast(*type).signature()); |
12081 Type& signature_type = Type::Handle(Z, signature.SignatureType()); | 12291 Type& signature_type = Type::Handle(Z, signature.SignatureType()); |
12082 if (signature_type.raw() != type->raw()) { | 12292 if (signature_type.raw() != type->raw()) { |
12083 ResolveType(finalization, &signature_type); | 12293 ResolveType(finalization, &signature_type); |
12084 } else { | 12294 } else { |
12085 AbstractType& type = AbstractType::Handle(signature.result_type()); | 12295 ResolveSignature(finalization, signature); |
12086 ResolveType(finalization, &type); | |
12087 signature.set_result_type(type); | |
12088 const intptr_t num_parameters = signature.NumParameters(); | |
12089 for (intptr_t i = 0; i < num_parameters; i++) { | |
12090 type = signature.ParameterTypeAt(i); | |
12091 ResolveType(finalization, &type); | |
12092 signature.SetParameterTypeAt(i, type); | |
12093 } | |
12094 if (signature.IsSignatureFunction()) { | 12296 if (signature.IsSignatureFunction()) { |
12095 // Drop fields that are not necessary anymore after resolution. | 12297 // Drop fields that are not necessary anymore after resolution. |
12096 // The parent function, owner, and token position of a shared | 12298 // The parent function, owner, and token position of a shared |
12097 // canonical function type are meaningless, since the canonical | 12299 // canonical function type are meaningless, since the canonical |
12098 // representent is picked arbitrarily. | 12300 // representent is picked arbitrarily. |
12099 signature.set_parent_function(Function::Handle(Z)); | 12301 signature.set_parent_function(Function::Handle(Z)); |
12100 // TODO(regis): As long as we support metadata in typedef signatures, | 12302 // TODO(regis): As long as we support metadata in typedef signatures, |
12101 // we cannot reset these fields used to reparse a typedef. | 12303 // we cannot reset these fields used to reparse a typedef. |
12102 // Note that the scope class of a typedef function type is always | 12304 // Note that the scope class of a typedef function type is always |
12103 // preserved as the typedef class (not reset to _Closure class), thereby | 12305 // preserved as the typedef class (not reset to _Closure class), thereby |
12104 // preventing sharing of canonical function types between typedefs. | 12306 // preventing sharing of canonical function types between typedefs. |
12105 // Not being shared, these fields are therefore always meaningful for | 12307 // Not being shared, these fields are therefore always meaningful for |
12106 // typedefs. | 12308 // typedefs. |
12107 if (type.HasResolvedTypeClass()) { | 12309 } |
12108 const Class& scope_class = Class::Handle(Z, type.type_class()); | 12310 if (type->HasResolvedTypeClass()) { |
12109 if (!scope_class.IsTypedefClass()) { | 12311 const Class& scope_class = Class::Handle(Z, type->type_class()); |
| 12312 if (!scope_class.IsTypedefClass()) { |
| 12313 if (signature.IsSignatureFunction()) { |
12110 signature.set_owner(Object::Handle(Z)); | 12314 signature.set_owner(Object::Handle(Z)); |
12111 signature.set_token_pos(TokenPosition::kNoSource); | 12315 signature.set_token_pos(TokenPosition::kNoSource); |
12112 } | 12316 } |
| 12317 if ((type->arguments() != TypeArguments::null()) && |
| 12318 signature.HasInstantiatedSignature()) { |
| 12319 ASSERT(scope_class.IsGeneric()); |
| 12320 // Although the scope class of this function type is generic, |
| 12321 // the signature of this function type does not refer to any |
| 12322 // of its type parameters. Reset its scope class to _Closure. |
| 12323 Type::Cast(*type).set_type_class(Class::Handle( |
| 12324 Z, Isolate::Current()->object_store()->closure_class())); |
| 12325 type->set_arguments(Object::null_type_arguments()); |
| 12326 } |
12113 } | 12327 } |
12114 } | 12328 } |
12115 } | 12329 } |
12116 } | 12330 } |
12117 } | 12331 } |
12118 | 12332 |
12119 | 12333 |
12120 LocalVariable* Parser::LookupLocalScope(const String& ident) { | 12334 LocalVariable* Parser::LookupLocalScope(const String& ident) { |
12121 if (current_block_ == NULL) { | 12335 if (current_block_ == NULL) { |
12122 return NULL; | 12336 return NULL; |
(...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12714 | 12928 |
12715 RawAbstractType* Parser::ParseType( | 12929 RawAbstractType* Parser::ParseType( |
12716 ClassFinalizer::FinalizationKind finalization, | 12930 ClassFinalizer::FinalizationKind finalization, |
12717 bool allow_deferred_type, | 12931 bool allow_deferred_type, |
12718 bool consume_unresolved_prefix) { | 12932 bool consume_unresolved_prefix) { |
12719 LibraryPrefix& prefix = LibraryPrefix::Handle(Z); | 12933 LibraryPrefix& prefix = LibraryPrefix::Handle(Z); |
12720 return ParseType(finalization, allow_deferred_type, consume_unresolved_prefix, | 12934 return ParseType(finalization, allow_deferred_type, consume_unresolved_prefix, |
12721 &prefix); | 12935 &prefix); |
12722 } | 12936 } |
12723 | 12937 |
| 12938 |
| 12939 // Parses and returns a type or a function type. |
| 12940 RawAbstractType* Parser::ParseTypeOrFunctionType( |
| 12941 bool allow_void, |
| 12942 ClassFinalizer::FinalizationKind finalization) { |
| 12943 TRACE_PARSER("ParseTypeOrFunctionType"); |
| 12944 AbstractType& type = AbstractType::Handle(Z); |
| 12945 if (CurrentToken() == Token::kVOID) { |
| 12946 TokenPosition void_pos = TokenPos(); |
| 12947 type = Type::VoidType(); |
| 12948 ConsumeToken(); |
| 12949 // 'void' is always allowed as result type of a function type. |
| 12950 if (!allow_void && !IsFunctionTypeSymbol()) { |
| 12951 ReportError(void_pos, "'void' not allowed here"); |
| 12952 } |
| 12953 } else if (!IsFunctionTypeSymbol()) { |
| 12954 // Including 'Function' not followed by '(' or '<'. |
| 12955 // It is too early to resolve the type here, since it can |
| 12956 // refer to a not yet declared function type parameter. |
| 12957 type = ParseType(ClassFinalizer::kDoNotResolve); |
| 12958 } |
| 12959 while (IsSymbol(Symbols::Function())) { |
| 12960 if (type.IsNull()) { |
| 12961 type = Type::DynamicType(); |
| 12962 } |
| 12963 // 'type' is the result type of the function type. |
| 12964 type = ParseFunctionType(type, ClassFinalizer::kDoNotResolve); |
| 12965 } |
| 12966 // At this point, all type parameters have been parsed, resolve the type. |
| 12967 if (finalization == ClassFinalizer::kIgnore) { |
| 12968 return Type::DynamicType(); |
| 12969 } |
| 12970 if (finalization >= ClassFinalizer::kResolveTypeParameters) { |
| 12971 ResolveType(finalization, &type); |
| 12972 if (finalization >= ClassFinalizer::kCanonicalize) { |
| 12973 type ^= ClassFinalizer::FinalizeType(current_class(), type, finalization); |
| 12974 } |
| 12975 } |
| 12976 return type.raw(); |
| 12977 } |
| 12978 |
| 12979 |
| 12980 // Parses and returns a function type. |
| 12981 // If 'result_type' is not null, parsing of the result type is skipped. |
| 12982 RawType* Parser::ParseFunctionType( |
| 12983 const AbstractType& result_type, |
| 12984 ClassFinalizer::FinalizationKind finalization) { |
| 12985 TRACE_PARSER("ParseFunctionType"); |
| 12986 AbstractType& type = AbstractType::Handle(Z, result_type.raw()); |
| 12987 if (type.IsNull()) { |
| 12988 if (CurrentToken() == Token::kVOID) { |
| 12989 ConsumeToken(); |
| 12990 type = Type::VoidType(); |
| 12991 } else if (IsFunctionTypeSymbol()) { |
| 12992 type = Type::DynamicType(); |
| 12993 } else { |
| 12994 // Including 'Function' not followed by '(' or '<'. |
| 12995 // It is too early to resolve the type here, since it can |
| 12996 // refer to a not yet declared function type parameter. |
| 12997 type = ParseType(ClassFinalizer::kDoNotResolve); |
| 12998 } |
| 12999 } |
| 13000 if (!IsSymbol(Symbols::Function())) { |
| 13001 ReportError("'Function' expected"); |
| 13002 } |
| 13003 do { |
| 13004 ConsumeToken(); |
| 13005 const Function& signature_function = |
| 13006 Function::Handle(Z, Function::NewSignatureFunction( |
| 13007 current_class(), TokenPosition::kNoSource)); |
| 13008 signature_function.set_parent_function(innermost_function()); |
| 13009 innermost_function_ = signature_function.raw(); |
| 13010 signature_function.set_result_type(type); |
| 13011 // Parse optional type parameters. |
| 13012 if (CurrentToken() == Token::kLT) { |
| 13013 if (!FLAG_generic_method_syntax) { |
| 13014 ReportError("generic type arguments not supported."); |
| 13015 } |
| 13016 ParseTypeParameters(false); // Not parameterizing class, but function. |
| 13017 } |
| 13018 ParamList params; |
| 13019 // We do not yet allow Function of any arity, so expect parameter list. |
| 13020 CheckToken(Token::kLPAREN, "formal parameter list expected"); |
| 13021 |
| 13022 // Add implicit closure object parameter. Do not specify a token position, |
| 13023 // since it would make no sense after function type canonicalization. |
| 13024 params.AddFinalParameter(TokenPosition::kNoSource, |
| 13025 &Symbols::ClosureParameter(), |
| 13026 &Object::dynamic_type()); |
| 13027 |
| 13028 const bool use_function_type_syntax = true; |
| 13029 const bool allow_explicit_default_values = false; |
| 13030 const bool evaluate_metadata = false; |
| 13031 ParseFormalParameterList(use_function_type_syntax, |
| 13032 allow_explicit_default_values, evaluate_metadata, |
| 13033 ¶ms); |
| 13034 AddFormalParamsToFunction(¶ms, signature_function); |
| 13035 innermost_function_ = innermost_function_.parent_function(); |
| 13036 type = signature_function.SignatureType(); |
| 13037 } while (IsSymbol(Symbols::Function())); |
| 13038 // At this point, all type parameters have been parsed, resolve the type. |
| 13039 if (finalization == ClassFinalizer::kIgnore) { |
| 13040 return Type::DynamicType(); |
| 13041 } |
| 13042 if (finalization >= ClassFinalizer::kResolveTypeParameters) { |
| 13043 ResolveType(finalization, &type); |
| 13044 if (finalization >= ClassFinalizer::kCanonicalize) { |
| 13045 type ^= ClassFinalizer::FinalizeType(current_class(), type, finalization); |
| 13046 } |
| 13047 } |
| 13048 return Type::RawCast(type.raw()); |
| 13049 } |
| 13050 |
| 13051 |
12724 // Parses type = [ident "."] ident ["<" type { "," type } ">"], then resolve and | 13052 // Parses type = [ident "."] ident ["<" type { "," type } ">"], then resolve and |
12725 // finalize it according to the given type finalization mode. Returns prefix. | 13053 // finalize it according to the given type finalization mode. |
| 13054 // Returns type and sets prefix. |
12726 RawAbstractType* Parser::ParseType( | 13055 RawAbstractType* Parser::ParseType( |
12727 ClassFinalizer::FinalizationKind finalization, | 13056 ClassFinalizer::FinalizationKind finalization, |
12728 bool allow_deferred_type, | 13057 bool allow_deferred_type, |
12729 bool consume_unresolved_prefix, | 13058 bool consume_unresolved_prefix, |
12730 LibraryPrefix* prefix) { | 13059 LibraryPrefix* prefix) { |
12731 TRACE_PARSER("ParseType"); | 13060 TRACE_PARSER("ParseType"); |
12732 CheckToken(Token::kIDENT, "type name expected"); | 13061 CheckToken(Token::kIDENT, "type name expected"); |
12733 TokenPosition ident_pos = TokenPos(); | 13062 TokenPosition ident_pos = TokenPos(); |
12734 String& type_name = String::Handle(Z); | 13063 String& type_name = String::Handle(Z); |
12735 | 13064 |
(...skipping 629 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13365 // Replace the types parsed from the constructor. | 13694 // Replace the types parsed from the constructor. |
13366 params.EraseParameterTypes(); | 13695 params.EraseParameterTypes(); |
13367 | 13696 |
13368 closure = Function::NewClosureFunction(closure_name, innermost_function(), | 13697 closure = Function::NewClosureFunction(closure_name, innermost_function(), |
13369 token_pos); | 13698 token_pos); |
13370 closure.set_is_generated_body(true); | 13699 closure.set_is_generated_body(true); |
13371 closure.set_is_debuggable(false); | 13700 closure.set_is_debuggable(false); |
13372 closure.set_is_visible(false); | 13701 closure.set_is_visible(false); |
13373 closure.set_result_type(Object::dynamic_type()); | 13702 closure.set_result_type(Object::dynamic_type()); |
13374 AddFormalParamsToFunction(¶ms, closure); | 13703 AddFormalParamsToFunction(¶ms, closure); |
| 13704 ResolveSignature(ClassFinalizer::kResolveTypeParameters, closure); |
13375 | 13705 |
13376 // Finalize function type. | 13706 // Finalize function type. |
13377 Type& signature_type = Type::Handle(Z, closure.SignatureType()); | 13707 Type& signature_type = Type::Handle(Z, closure.SignatureType()); |
13378 signature_type ^= ClassFinalizer::FinalizeType( | 13708 signature_type ^= ClassFinalizer::FinalizeType( |
13379 current_class(), signature_type, ClassFinalizer::kCanonicalize); | 13709 current_class(), signature_type, ClassFinalizer::kCanonicalize); |
13380 closure.SetSignatureType(signature_type); | 13710 closure.SetSignatureType(signature_type); |
13381 // Finalization would be premature when top-level parsing. | 13711 // Finalization would be premature when top-level parsing. |
13382 ASSERT(!is_top_level_); | 13712 ASSERT(!is_top_level_); |
13383 return closure.raw(); | 13713 return closure.raw(); |
13384 } | 13714 } |
(...skipping 824 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14209 value = TryCanonicalize(value, expr_pos); | 14539 value = TryCanonicalize(value, expr_pos); |
14210 CacheConstantValue(expr_pos, value); | 14540 CacheConstantValue(expr_pos, value); |
14211 return value; | 14541 return value; |
14212 } | 14542 } |
14213 } | 14543 } |
14214 | 14544 |
14215 | 14545 |
14216 void Parser::SkipFunctionLiteral() { | 14546 void Parser::SkipFunctionLiteral() { |
14217 if (IsIdentifier()) { | 14547 if (IsIdentifier()) { |
14218 if (LookaheadToken(1) != Token::kLPAREN) { | 14548 if (LookaheadToken(1) != Token::kLPAREN) { |
14219 SkipType(true); | 14549 SkipTypeOrFunctionType(true); |
14220 } | 14550 } |
14221 ExpectIdentifier("function name expected"); | 14551 ExpectIdentifier("function name expected"); |
14222 } | 14552 } |
14223 if (CurrentToken() == Token::kLPAREN) { | 14553 if (CurrentToken() == Token::kLPAREN) { |
14224 SkipToMatchingParenthesis(); | 14554 SkipToMatchingParenthesis(); |
14225 } | 14555 } |
14226 RawFunction::AsyncModifier async_modifier = ParseFunctionModifier(); | 14556 RawFunction::AsyncModifier async_modifier = ParseFunctionModifier(); |
14227 BoolScope allow_await(&this->await_is_keyword_, | 14557 BoolScope allow_await(&this->await_is_keyword_, |
14228 async_modifier != RawFunction::kNoModifier); | 14558 async_modifier != RawFunction::kNoModifier); |
14229 if (CurrentToken() == Token::kLBRACE) { | 14559 if (CurrentToken() == Token::kLBRACE) { |
14230 SkipBlock(); | 14560 SkipBlock(); |
14231 ExpectToken(Token::kRBRACE); | 14561 ExpectToken(Token::kRBRACE); |
14232 } else if (CurrentToken() == Token::kARROW) { | 14562 } else if (CurrentToken() == Token::kARROW) { |
14233 ConsumeToken(); | 14563 ConsumeToken(); |
14234 SkipExpr(); | 14564 SkipExpr(); |
14235 } | 14565 } |
14236 } | 14566 } |
14237 | 14567 |
14238 | 14568 |
14239 // Skips function/method/constructor/getter/setter preambles until the formal | 14569 // Skips function/method/constructor/getter/setter preambles until the formal |
14240 // parameter list. It is enough to skip the tokens, since we have already | 14570 // parameter list. It is enough to skip the tokens, since we have already |
14241 // previously parsed the function. | 14571 // previously parsed the function. |
14242 void Parser::SkipFunctionPreamble() { | 14572 void Parser::SkipFunctionPreamble() { |
14243 while (true) { | 14573 while (true) { |
14244 const Token::Kind token = CurrentToken(); | 14574 const Token::Kind token = CurrentToken(); |
| 14575 if (IsFunctionTypeSymbol()) { |
| 14576 ConsumeToken(); |
| 14577 SkipTypeArguments(); |
| 14578 SkipToMatchingParenthesis(); |
| 14579 continue; |
| 14580 } |
14245 if (token == Token::kLPAREN) { | 14581 if (token == Token::kLPAREN) { |
14246 return; | 14582 return; |
14247 } | 14583 } |
14248 if (token == Token::kGET) { | 14584 if (token == Token::kGET) { |
14249 if (LookaheadToken(1) == Token::kLPAREN) { | 14585 if (LookaheadToken(1) == Token::kLPAREN) { |
14250 // Case: Function/method named get. | 14586 // Case: Function/method named get. |
14251 ConsumeToken(); // Parse away 'get' (the function's name). | 14587 ConsumeToken(); // Parse away 'get' (the function's name). |
14252 return; | 14588 return; |
14253 } | 14589 } |
14254 // Case: Getter. | 14590 // Case: Getter. |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14509 SkipUnaryExpr(); | 14845 SkipUnaryExpr(); |
14510 const int min_prec = Token::Precedence(Token::kIFNULL); | 14846 const int min_prec = Token::Precedence(Token::kIFNULL); |
14511 const int max_prec = Token::Precedence(Token::kMUL); | 14847 const int max_prec = Token::Precedence(Token::kMUL); |
14512 while (((min_prec <= Token::Precedence(CurrentToken())) && | 14848 while (((min_prec <= Token::Precedence(CurrentToken())) && |
14513 (Token::Precedence(CurrentToken()) <= max_prec))) { | 14849 (Token::Precedence(CurrentToken()) <= max_prec))) { |
14514 if (CurrentToken() == Token::kIS) { | 14850 if (CurrentToken() == Token::kIS) { |
14515 ConsumeToken(); | 14851 ConsumeToken(); |
14516 if (CurrentToken() == Token::kNOT) { | 14852 if (CurrentToken() == Token::kNOT) { |
14517 ConsumeToken(); | 14853 ConsumeToken(); |
14518 } | 14854 } |
14519 SkipType(false); | 14855 SkipTypeOrFunctionType(false); |
14520 } else if (CurrentToken() == Token::kAS) { | 14856 } else if (CurrentToken() == Token::kAS) { |
14521 ConsumeToken(); | 14857 ConsumeToken(); |
14522 SkipType(false); | 14858 SkipTypeOrFunctionType(false); |
14523 } else { | 14859 } else { |
14524 ConsumeToken(); | 14860 ConsumeToken(); |
14525 SkipUnaryExpr(); | 14861 SkipUnaryExpr(); |
14526 } | 14862 } |
14527 } | 14863 } |
14528 } | 14864 } |
14529 | 14865 |
14530 | 14866 |
14531 void Parser::SkipConditionalExpr() { | 14867 void Parser::SkipConditionalExpr() { |
14532 SkipBinaryExpr(); | 14868 SkipBinaryExpr(); |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14668 const ArgumentListNode& function_args, | 15004 const ArgumentListNode& function_args, |
14669 const LocalVariable* temp_for_last_arg, | 15005 const LocalVariable* temp_for_last_arg, |
14670 bool is_super_invocation) { | 15006 bool is_super_invocation) { |
14671 UNREACHABLE(); | 15007 UNREACHABLE(); |
14672 return NULL; | 15008 return NULL; |
14673 } | 15009 } |
14674 | 15010 |
14675 } // namespace dart | 15011 } // namespace dart |
14676 | 15012 |
14677 #endif // DART_PRECOMPILED_RUNTIME | 15013 #endif // DART_PRECOMPILED_RUNTIME |
OLD | NEW |