| 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 | 6 |
| 7 #include "vm/bigint_operations.h" | 7 #include "vm/bigint_operations.h" |
| 8 #include "vm/class_finalizer.h" | 8 #include "vm/class_finalizer.h" |
| 9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
| 10 #include "vm/compiler_stats.h" | 10 #include "vm/compiler_stats.h" |
| (...skipping 2328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2339 if (CurrentToken() == Token::kPERIOD) { | 2339 if (CurrentToken() == Token::kPERIOD) { |
| 2340 LibraryPrefix& lib_prefix = LibraryPrefix::ZoneHandle(); | 2340 LibraryPrefix& lib_prefix = LibraryPrefix::ZoneHandle(); |
| 2341 lib_prefix = current_class().LookupLibraryPrefix(*member.name); | 2341 lib_prefix = current_class().LookupLibraryPrefix(*member.name); |
| 2342 if (!lib_prefix.IsNull()) { | 2342 if (!lib_prefix.IsNull()) { |
| 2343 // We have a library prefix qualified identifier. | 2343 // We have a library prefix qualified identifier. |
| 2344 ConsumeToken(); // Consume the kPERIOD token. | 2344 ConsumeToken(); // Consume the kPERIOD token. |
| 2345 qualifier ^= member.name->raw(); | 2345 qualifier ^= member.name->raw(); |
| 2346 member.name = ExpectIdentifier("identifier expected"); | 2346 member.name = ExpectIdentifier("identifier expected"); |
| 2347 } | 2347 } |
| 2348 } | 2348 } |
| 2349 // TODO(regis): Remove support for type parameters on factories. | 2349 // TODO(regis): Stop postponing resolution of the factory result type |
| 2350 // Once done, stop postponing resolution of the factory result type until | 2350 // until class finalization. Use TryResolveTypeFromClass. |
| 2351 // class finalization. | 2351 // Factory result type is the same as the type name of the factory. |
| 2352 const UnresolvedClass& unresolved_factory_class = | 2352 const UnresolvedClass& unresolved_factory_class = |
| 2353 UnresolvedClass::Handle(UnresolvedClass::New(member.name_pos, | 2353 UnresolvedClass::Handle(UnresolvedClass::New(member.name_pos, |
| 2354 qualifier, | 2354 qualifier, |
| 2355 *member.name)); | 2355 *member.name)); |
| 2356 const Class& signature_class = Class::Handle( | |
| 2357 Class::New(String::Handle(String::NewSymbol(":factory_signature")), | |
| 2358 script_)); | |
| 2359 signature_class.set_is_finalized(); | |
| 2360 signature_class.set_library(library_); | |
| 2361 unresolved_factory_class.set_factory_signature_class(signature_class); | |
| 2362 // The type arguments of the result type are set during finalization. | 2356 // The type arguments of the result type are set during finalization. |
| 2363 const TypeArguments& args = TypeArguments::Handle(); | |
| 2364 member.type = &Type::ZoneHandle( | 2357 member.type = &Type::ZoneHandle( |
| 2365 Type::NewParameterizedType(unresolved_factory_class, args)); | 2358 Type::NewParameterizedType(unresolved_factory_class, |
| 2366 ParseTypeParameters(signature_class); | 2359 TypeArguments::Handle())); |
| 2367 if (signature_class.NumTypeParameters() > 0) { | |
| 2368 Warning("factory method '%s' should not declare type parameters.\n", | |
| 2369 member.name->ToCString()); | |
| 2370 } else { | |
| 2371 // Remove factory signature class, since no type parameters declared. | |
| 2372 unresolved_factory_class.set_factory_signature_class(Class::Handle()); | |
| 2373 } | |
| 2374 } | 2360 } |
| 2375 // We must be dealing with a constructor or named constructor. | 2361 // We must be dealing with a constructor or named constructor. |
| 2376 member.kind = RawFunction::kConstructor; | 2362 member.kind = RawFunction::kConstructor; |
| 2377 String& ctor_suffix = String::ZoneHandle(String::NewSymbol(".")); | 2363 String& ctor_suffix = String::ZoneHandle(String::NewSymbol(".")); |
| 2378 if (CurrentToken() == Token::kPERIOD) { | 2364 if (CurrentToken() == Token::kPERIOD) { |
| 2379 // Named constructor. | 2365 // Named constructor. |
| 2380 ConsumeToken(); | 2366 ConsumeToken(); |
| 2381 const String* name = ExpectIdentifier("identifier expected"); | 2367 const String* name = ExpectIdentifier("identifier expected"); |
| 2382 ctor_suffix = String::Concat(ctor_suffix, *name); | 2368 ctor_suffix = String::Concat(ctor_suffix, *name); |
| 2383 } | 2369 } |
| (...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2772 set_current_class(interface); | 2758 set_current_class(interface); |
| 2773 ParseTypeParameters(interface); | 2759 ParseTypeParameters(interface); |
| 2774 | 2760 |
| 2775 if (CurrentToken() == Token::kEXTENDS) { | 2761 if (CurrentToken() == Token::kEXTENDS) { |
| 2776 Array& interfaces = Array::Handle(); | 2762 Array& interfaces = Array::Handle(); |
| 2777 const intptr_t interfaces_pos = token_index_; | 2763 const intptr_t interfaces_pos = token_index_; |
| 2778 interfaces = ParseInterfaceList(); | 2764 interfaces = ParseInterfaceList(); |
| 2779 AddInterfaces(interfaces_pos, interface, interfaces); | 2765 AddInterfaces(interfaces_pos, interface, interfaces); |
| 2780 } | 2766 } |
| 2781 | 2767 |
| 2782 // TODO(regis): Remove support for "factory" keyword. | 2768 if (CurrentToken() == Token::kDEFAULT) { |
| 2783 if ((CurrentToken() == Token::kDEFAULT) || | |
| 2784 (CurrentToken() == Token::kFACTORY)) { | |
| 2785 if (CurrentToken() == Token::kFACTORY) { | |
| 2786 Warning("'factory' is obsolete, use 'default' instead."); | |
| 2787 } | |
| 2788 ConsumeToken(); | 2769 ConsumeToken(); |
| 2789 if (CurrentToken() != Token::kIDENT) { | 2770 if (CurrentToken() != Token::kIDENT) { |
| 2790 ErrorMsg("class name expected"); | 2771 ErrorMsg("class name expected"); |
| 2791 } | 2772 } |
| 2792 const intptr_t factory_pos = token_index_; | 2773 const intptr_t factory_pos = token_index_; |
| 2793 QualIdent factory_name; | 2774 QualIdent factory_name; |
| 2794 ParseQualIdent(&factory_name); | 2775 ParseQualIdent(&factory_name); |
| 2795 String& qualifier = String::Handle(); | 2776 String& qualifier = String::Handle(); |
| 2796 if (factory_name.qualifier != NULL) { | 2777 if (factory_name.qualifier != NULL) { |
| 2797 qualifier ^= factory_name.qualifier->raw(); | 2778 qualifier ^= factory_name.qualifier->raw(); |
| 2798 } | 2779 } |
| 2799 const UnresolvedClass& unresolved_factory_class = UnresolvedClass::Handle( | 2780 const UnresolvedClass& unresolved_factory_class = UnresolvedClass::Handle( |
| 2800 UnresolvedClass::New(factory_pos, qualifier, *factory_name.ident)); | 2781 UnresolvedClass::New(factory_pos, qualifier, *factory_name.ident)); |
| 2801 const Class& factory_class = Class::Handle( | 2782 const Class& factory_class = Class::Handle( |
| 2802 Class::New(String::Handle(String::NewSymbol(":factory_signature")), | 2783 Class::New(String::Handle(String::NewSymbol(":factory_signature")), |
| 2803 script_)); | 2784 script_)); |
| 2804 factory_class.set_library(library_); | 2785 factory_class.set_library(library_); |
| 2805 factory_class.set_is_finalized(); | 2786 factory_class.set_is_finalized(); |
| 2806 ParseTypeParameters(factory_class); | 2787 ParseTypeParameters(factory_class); |
| 2807 unresolved_factory_class.set_factory_signature_class(factory_class); | 2788 unresolved_factory_class.set_factory_signature_class(factory_class); |
| 2808 interface.set_factory_class(unresolved_factory_class); | 2789 interface.set_factory_class(unresolved_factory_class); |
| 2809 // Verify that the type parameters of the factory class and of the interface | 2790 // Verify that the type parameters of the factory class and of the interface |
| 2810 // have identical names. | 2791 // have identical names. |
| 2792 String& interface_type_param_name = String::Handle(); |
| 2793 String& factory_type_param_name = String::Handle(); |
| 2794 const Array& interface_type_param_names = |
| 2795 Array::Handle(interface.type_parameters()); |
| 2796 const Array& factory_type_param_names = |
| 2797 Array::Handle(factory_class.type_parameters()); |
| 2811 const intptr_t num_type_params = factory_class.NumTypeParameters(); | 2798 const intptr_t num_type_params = factory_class.NumTypeParameters(); |
| 2812 bool mismatch = interface.NumTypeParameters() != num_type_params; | 2799 bool mismatch = interface.NumTypeParameters() != num_type_params; |
| 2813 if (mismatch && (num_type_params == 0)) { | 2800 for (intptr_t i = 0; !mismatch && (i < num_type_params); i++) { |
| 2814 // TODO(regis): For now, and until the core lib is fixed, we accept a | 2801 interface_type_param_name ^= interface_type_param_names.At(i); |
| 2815 // factory clause with a class missing its list of type parameters. | 2802 factory_type_param_name ^= factory_type_param_names.At(i); |
| 2816 // See bug 5408808. | 2803 if (!interface_type_param_name.Equals(factory_type_param_name)) { |
| 2804 mismatch = true; |
| 2805 } |
| 2806 } |
| 2807 if (mismatch) { |
| 2817 const String& interface_name = String::Handle(interface.Name()); | 2808 const String& interface_name = String::Handle(interface.Name()); |
| 2818 const String& factory_name = String::Handle(factory_class.Name()); | 2809 const String& factory_name = String::Handle(factory_class.Name()); |
| 2819 Warning(factory_pos, | 2810 ErrorMsg(factory_pos, |
| 2820 "class '%s' in default clause of interface '%s' is " | 2811 "mismatch in number or names of type parameters between " |
| 2821 "missing its type parameter list.\n", | 2812 "interface '%s' and default factory class '%s'.\n", |
| 2822 factory_name.ToCString(), | 2813 interface_name.ToCString(), |
| 2823 interface_name.ToCString()); | 2814 factory_name.ToCString()); |
| 2824 } else { | |
| 2825 String& interface_type_param_name = String::Handle(); | |
| 2826 String& factory_type_param_name = String::Handle(); | |
| 2827 const Array& interface_type_param_names = | |
| 2828 Array::Handle(interface.type_parameters()); | |
| 2829 const Array& factory_type_param_names = | |
| 2830 Array::Handle(factory_class.type_parameters()); | |
| 2831 for (intptr_t i = 0; !mismatch && (i < num_type_params); i++) { | |
| 2832 interface_type_param_name ^= interface_type_param_names.At(i); | |
| 2833 factory_type_param_name ^= factory_type_param_names.At(i); | |
| 2834 if (!interface_type_param_name.Equals(factory_type_param_name)) { | |
| 2835 mismatch = true; | |
| 2836 } | |
| 2837 } | |
| 2838 if (mismatch) { | |
| 2839 const String& interface_name = String::Handle(interface.Name()); | |
| 2840 const String& factory_name = String::Handle(factory_class.Name()); | |
| 2841 ErrorMsg(factory_pos, | |
| 2842 "mismatch in number or names of type parameters between " | |
| 2843 "interface '%s' and default factory class '%s'.\n", | |
| 2844 interface_name.ToCString(), | |
| 2845 factory_name.ToCString()); | |
| 2846 } | |
| 2847 } | 2815 } |
| 2848 } | 2816 } |
| 2849 | 2817 |
| 2850 ExpectToken(Token::kLBRACE); | 2818 ExpectToken(Token::kLBRACE); |
| 2851 ClassDesc members(interface, interface_name, true, interface_pos); | 2819 ClassDesc members(interface, interface_name, true, interface_pos); |
| 2852 while (CurrentToken() != Token::kRBRACE) { | 2820 while (CurrentToken() != Token::kRBRACE) { |
| 2853 ParseClassMemberDefinition(&members); | 2821 ParseClassMemberDefinition(&members); |
| 2854 } | 2822 } |
| 2855 ExpectToken(Token::kRBRACE); | 2823 ExpectToken(Token::kRBRACE); |
| 2856 | 2824 |
| (...skipping 3406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6263 } | 6231 } |
| 6264 | 6232 |
| 6265 | 6233 |
| 6266 // If type parameters are currently in scope, return their declaring class, | 6234 // If type parameters are currently in scope, return their declaring class, |
| 6267 // otherwise return null. | 6235 // otherwise return null. |
| 6268 RawClass* Parser::TypeParametersScopeClass() { | 6236 RawClass* Parser::TypeParametersScopeClass() { |
| 6269 // Type parameters cannot be referred to from a static function, except from | 6237 // Type parameters cannot be referred to from a static function, except from |
| 6270 // a constructor or from a factory. | 6238 // a constructor or from a factory. |
| 6271 // A constructor is considered as non-static by the compiler. | 6239 // A constructor is considered as non-static by the compiler. |
| 6272 if (is_top_level_) { | 6240 if (is_top_level_) { |
| 6273 if ((current_member_ != NULL) && current_member_->has_factory) { | 6241 if ((current_member_ == NULL) || |
| 6274 const AbstractType& factory_result_type = *current_member_->type; | 6242 (current_member_->has_factory || !current_member_->has_static)) { |
| 6275 ASSERT(!factory_result_type.IsNull()); | |
| 6276 const UnresolvedClass& unresolved_factory_class = | |
| 6277 UnresolvedClass::Handle(factory_result_type.unresolved_class()); | |
| 6278 // TODO(regis): Remove support for type parameters declared by factory | |
| 6279 // methods. | |
| 6280 if (unresolved_factory_class.factory_signature_class() != Class::null()) { | |
| 6281 return unresolved_factory_class.factory_signature_class(); | |
| 6282 } | |
| 6283 return current_class().raw(); | |
| 6284 } | |
| 6285 if ((current_member_ == NULL) || !current_member_->has_static) { | |
| 6286 return current_class().raw(); | 6243 return current_class().raw(); |
| 6287 } | 6244 } |
| 6288 } else { | 6245 } else { |
| 6289 if (!current_function().IsNull()) { | 6246 if (!current_function().IsNull()) { |
| 6290 Function& outer_function = Function::Handle(current_function().raw()); | 6247 Function& outer_function = Function::Handle(current_function().raw()); |
| 6291 while (outer_function.IsLocalFunction()) { | 6248 while (outer_function.IsLocalFunction()) { |
| 6292 outer_function = outer_function.parent_function(); | 6249 outer_function = outer_function.parent_function(); |
| 6293 } | 6250 } |
| 6294 if (outer_function.IsFactory()) { | 6251 if (outer_function.IsFactory() || !outer_function.is_static()) { |
| 6295 // TODO(regis): Remove support for type parameters declared by factory | |
| 6296 // methods. | |
| 6297 if (outer_function.signature_class() != Class::null()) { | |
| 6298 return outer_function.signature_class(); | |
| 6299 } | |
| 6300 return current_class().raw(); | |
| 6301 } | |
| 6302 if (!outer_function.is_static()) { | |
| 6303 return current_class().raw(); | 6252 return current_class().raw(); |
| 6304 } | 6253 } |
| 6305 } | 6254 } |
| 6306 } | 6255 } |
| 6307 return Class::null(); | 6256 return Class::null(); |
| 6308 } | 6257 } |
| 6309 | 6258 |
| 6310 | 6259 |
| 6311 bool Parser::IsInstantiatorRequired() const { | 6260 bool Parser::IsInstantiatorRequired() const { |
| 6312 ASSERT(!current_function().IsNull()); | 6261 ASSERT(!current_function().IsNull()); |
| 6313 Function& outer_function = Function::Handle(current_function().raw()); | 6262 Function& outer_function = Function::Handle(current_function().raw()); |
| 6314 while (outer_function.IsLocalFunction()) { | 6263 while (outer_function.IsLocalFunction()) { |
| 6315 outer_function = outer_function.parent_function(); | 6264 outer_function = outer_function.parent_function(); |
| 6316 } | 6265 } |
| 6317 if (outer_function.IsFactory()) { | 6266 if (outer_function.IsFactory() || !outer_function.is_static()) { |
| 6318 // TODO(regis): Remove support for type parameters on factories. | |
| 6319 Class& signature_class = Class::Handle(outer_function.signature_class()); | |
| 6320 if (signature_class.IsNull()) { | |
| 6321 return current_class().NumTypeParameters() > 0; | |
| 6322 } | |
| 6323 return signature_class.NumTypeParameters() > 0; | |
| 6324 } | |
| 6325 if (!outer_function.is_static()) { | |
| 6326 return current_class().NumTypeParameters() > 0; | 6267 return current_class().NumTypeParameters() > 0; |
| 6327 } | 6268 } |
| 6328 return false; | 6269 return false; |
| 6329 } | 6270 } |
| 6330 | 6271 |
| 6331 | 6272 |
| 6332 void Parser::RunStaticFieldInitializer(const Field& field) { | 6273 void Parser::RunStaticFieldInitializer(const Field& field) { |
| 6333 ASSERT(field.is_static()); | 6274 ASSERT(field.is_static()); |
| 6334 const Instance& value = Instance::Handle(field.value()); | 6275 const Instance& value = Instance::Handle(field.value()); |
| 6335 if (value.raw() == Object::transition_sentinel()) { | 6276 if (value.raw() == Object::transition_sentinel()) { |
| (...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6731 } | 6672 } |
| 6732 } | 6673 } |
| 6733 return type.raw(); | 6674 return type.raw(); |
| 6734 } | 6675 } |
| 6735 | 6676 |
| 6736 | 6677 |
| 6737 void Parser::CheckConstructorCallTypeArguments( | 6678 void Parser::CheckConstructorCallTypeArguments( |
| 6738 intptr_t pos, Function& constructor, | 6679 intptr_t pos, Function& constructor, |
| 6739 const AbstractTypeArguments& type_arguments) { | 6680 const AbstractTypeArguments& type_arguments) { |
| 6740 if (!type_arguments.IsNull()) { | 6681 if (!type_arguments.IsNull()) { |
| 6741 // TODO(regis): Remove support for type parameters on factories. | 6682 const Class& constructor_class = Class::Handle(constructor.owner()); |
| 6742 Class& signature_class = Class::Handle(); | 6683 ASSERT(!constructor_class.IsNull()); |
| 6743 if (constructor.IsFactory() && | 6684 ASSERT(constructor_class.is_finalized()); |
| 6744 (constructor.signature_class() != Class::null())) { | |
| 6745 signature_class = constructor.signature_class(); | |
| 6746 } else { | |
| 6747 signature_class = constructor.owner(); | |
| 6748 } | |
| 6749 ASSERT(!signature_class.IsNull()); | |
| 6750 ASSERT(signature_class.is_finalized()); | |
| 6751 // Do not report the expected vs. actual number of type arguments, because | 6685 // Do not report the expected vs. actual number of type arguments, because |
| 6752 // the type argument vector is flattened and raw types are allowed. | 6686 // the type argument vector is flattened and raw types are allowed. |
| 6753 if (type_arguments.Length() != signature_class.NumTypeArguments()) { | 6687 if (type_arguments.Length() != constructor_class.NumTypeArguments()) { |
| 6754 ErrorMsg(pos, "wrong number of type arguments passed to constructor"); | 6688 ErrorMsg(pos, "wrong number of type arguments passed to constructor"); |
| 6755 } | 6689 } |
| 6756 } | 6690 } |
| 6757 } | 6691 } |
| 6758 | 6692 |
| 6759 | 6693 |
| 6760 // Parse "[" [ expr { "," expr } ["," ] "]". | 6694 // Parse "[" [ expr { "," expr } ["," ] "]". |
| 6761 // Note: if the list literal is empty and the brackets have no whitespace | 6695 // Note: if the list literal is empty and the brackets have no whitespace |
| 6762 // between them, the scanner recognizes the opening and closing bracket | 6696 // between them, the scanner recognizes the opening and closing bracket |
| 6763 // as one token of type Token::kINDEX. | 6697 // as one token of type Token::kINDEX. |
| (...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7262 if (!constructor.AreValidArguments(arguments_length, arguments->names())) { | 7196 if (!constructor.AreValidArguments(arguments_length, arguments->names())) { |
| 7263 ErrorMsg(new_pos, "invalid arguments passed to constructor '%s' " | 7197 ErrorMsg(new_pos, "invalid arguments passed to constructor '%s' " |
| 7264 "for class '%s'", | 7198 "for class '%s'", |
| 7265 external_constructor_name.ToCString(), | 7199 external_constructor_name.ToCString(), |
| 7266 String::Handle(type_class.Name()).ToCString()); | 7200 String::Handle(type_class.Name()).ToCString()); |
| 7267 } | 7201 } |
| 7268 | 7202 |
| 7269 // Now that the constructor to be called is identified, finalize the type | 7203 // Now that the constructor to be called is identified, finalize the type |
| 7270 // argument vector to be passed. | 7204 // argument vector to be passed. |
| 7271 { | 7205 { |
| 7272 // TODO(regis): Remove support for type parameters on factories. | 7206 ASSERT(constructor.owner() == type_class.raw()); |
| 7273 Class& signature_class = Class::Handle(); | |
| 7274 if (constructor.IsFactory() && | |
| 7275 (constructor.signature_class() != Class::null())) { | |
| 7276 signature_class = constructor.signature_class(); | |
| 7277 } else { | |
| 7278 signature_class = constructor.owner(); | |
| 7279 ASSERT(signature_class.raw() == type_class.raw()); | |
| 7280 } | |
| 7281 // TODO(regis): Temporary type should be allocated in new gen heap. | 7207 // TODO(regis): Temporary type should be allocated in new gen heap. |
| 7282 Type& type = Type::Handle( | 7208 Type& type = Type::Handle( |
| 7283 Type::NewParameterizedType(signature_class, type_arguments)); | 7209 Type::NewParameterizedType(type_class, type_arguments)); |
| 7284 Error& error = Error::Handle(); | 7210 Error& error = Error::Handle(); |
| 7285 type ^= ClassFinalizer::FinalizeAndCanonicalizeType(signature_class, | 7211 type ^= ClassFinalizer::FinalizeAndCanonicalizeType(type_class, |
| 7286 type, | 7212 type, |
| 7287 &error); | 7213 &error); |
| 7288 if (!error.IsNull()) { | 7214 if (!error.IsNull()) { |
| 7289 ErrorMsg(error.ToErrorCString()); | 7215 ErrorMsg(error.ToErrorCString()); |
| 7290 } | 7216 } |
| 7291 // The type argument vector may have been expanded with the type arguments | 7217 // The type argument vector may have been expanded with the type arguments |
| 7292 // of the super type when finalizing the type. | 7218 // of the super type when finalizing the type. |
| 7293 type_arguments = type.arguments(); | 7219 type_arguments = type.arguments(); |
| 7294 } | 7220 } |
| 7295 | 7221 |
| (...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7774 void Parser::SkipQualIdent() { | 7700 void Parser::SkipQualIdent() { |
| 7775 ASSERT(IsIdentifier()); | 7701 ASSERT(IsIdentifier()); |
| 7776 ConsumeToken(); | 7702 ConsumeToken(); |
| 7777 if (CurrentToken() == Token::kPERIOD) { | 7703 if (CurrentToken() == Token::kPERIOD) { |
| 7778 ConsumeToken(); // Consume the kPERIOD token. | 7704 ConsumeToken(); // Consume the kPERIOD token. |
| 7779 ExpectIdentifier("identifier expected after '.'"); | 7705 ExpectIdentifier("identifier expected after '.'"); |
| 7780 } | 7706 } |
| 7781 } | 7707 } |
| 7782 | 7708 |
| 7783 } // namespace dart | 7709 } // namespace dart |
| OLD | NEW |