Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(115)

Side by Side Diff: runtime/vm/parser.cc

Issue 2341493002: Fix parsing of generic closure formal parameter (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | tests/language/language.status » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 2014 matching lines...) Expand 10 before | Expand all | Expand 10 after
2025 // a closure/function type parameter. We check this at the end 2025 // a closure/function type parameter. We check this at the end
2026 // of ParseFormalParameter. 2026 // of ParseFormalParameter.
2027 parameter.type = &Object::void_type(); 2027 parameter.type = &Object::void_type();
2028 } 2028 }
2029 if (parameter.type == NULL) { 2029 if (parameter.type == NULL) {
2030 // At this point, we must see an identifier for the type or the 2030 // At this point, we must see an identifier for the type or the
2031 // function parameter. 2031 // function parameter.
2032 if (!IsIdentifier()) { 2032 if (!IsIdentifier()) {
2033 ReportError("parameter name or type expected"); 2033 ReportError("parameter name or type expected");
2034 } 2034 }
2035 // We have not seen a parameter type yet, so we check if the next 2035
2036 // identifier could represent a type before parsing it. 2036 // Lookahead to determine whether the next tokens are a return type
2037 Token::Kind follower = LookaheadToken(1); 2037 // followed by a parameter name.
2038 // We have an identifier followed by a 'follower' token. 2038 bool found_type = false;
2039 // We either parse a type or assume that no type is specified. 2039 {
2040 if ((follower == Token::kLT) || // Parameterized type. 2040 TokenPosScope saved_pos(this);
2041 (follower == Token::kPERIOD) || // Qualified class name of type. 2041 if (TryParseReturnType()) {
2042 Token::IsIdentifier(follower) || // Parameter name following a type. 2042 if (IsIdentifier() || (CurrentToken() == Token::kTHIS)) {
2043 (follower == Token::kTHIS)) { // Field parameter following a type. 2043 found_type = true;
2044 }
2045 }
2046 }
2047 if (found_type) {
2044 // The types of formal parameters are never ignored, even in unchecked 2048 // The types of formal parameters are never ignored, even in unchecked
2045 // mode, because they are part of the function type of closurized 2049 // mode, because they are part of the function type of closurized
2046 // functions appearing in type tests with typedefs. 2050 // functions appearing in type tests with typedefs.
2047 parameter.has_explicit_type = true; 2051 parameter.has_explicit_type = true;
2048 parameter.type = &AbstractType::ZoneHandle(Z, 2052 parameter.type = &AbstractType::ZoneHandle(Z,
2049 ParseType(is_top_level_ ? ClassFinalizer::kResolveTypeParameters : 2053 ParseType(is_top_level_ ? ClassFinalizer::kResolveTypeParameters :
2050 ClassFinalizer::kCanonicalize)); 2054 ClassFinalizer::kCanonicalize));
2051 } else { 2055 } else {
2052 // If this is an initializing formal, its type will be set to the type of 2056 // If this is an initializing formal, its type will be set to the type of
2053 // the respective field when the constructor is fully parsed. 2057 // the respective field when the constructor is fully parsed.
(...skipping 12899 matching lines...) Expand 10 before | Expand all | Expand 10 after
14953 const ArgumentListNode& function_args, 14957 const ArgumentListNode& function_args,
14954 const LocalVariable* temp_for_last_arg, 14958 const LocalVariable* temp_for_last_arg,
14955 bool is_super_invocation) { 14959 bool is_super_invocation) {
14956 UNREACHABLE(); 14960 UNREACHABLE();
14957 return NULL; 14961 return NULL;
14958 } 14962 }
14959 14963
14960 } // namespace dart 14964 } // namespace dart
14961 14965
14962 #endif // DART_PRECOMPILED_RUNTIME 14966 #endif // DART_PRECOMPILED_RUNTIME
OLDNEW
« no previous file with comments | « no previous file | tests/language/language.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698