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

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

Issue 9285031: Remove support for obsolete syntax of factory methods and default classes. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: '' Created 8 years, 11 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 | Annotate | Revision Log
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 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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698