| 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 2014 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |