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

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

Issue 11232071: Ambiguous references do not necessarily cause compilation errors (issue 5736). (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 1 month 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 2497 matching lines...) Expand 10 before | Expand all | Expand 10 after
2508 Type& redirection_type = Type::Handle(); 2508 Type& redirection_type = Type::Handle();
2509 String& redirection_identifier = String::Handle(); 2509 String& redirection_identifier = String::Handle();
2510 if (method->IsFactory() && (CurrentToken() == Token::kASSIGN)) { 2510 if (method->IsFactory() && (CurrentToken() == Token::kASSIGN)) {
2511 ConsumeToken(); 2511 ConsumeToken();
2512 const intptr_t type_pos = TokenPos(); 2512 const intptr_t type_pos = TokenPos();
2513 const AbstractType& type = AbstractType::Handle( 2513 const AbstractType& type = AbstractType::Handle(
2514 ParseType(ClassFinalizer::kTryResolve)); 2514 ParseType(ClassFinalizer::kTryResolve));
2515 if (type.IsTypeParameter() || type.IsDynamicType()) { 2515 if (type.IsTypeParameter() || type.IsDynamicType()) {
2516 // Replace the type with a malformed type and compile a throw when called. 2516 // Replace the type with a malformed type and compile a throw when called.
2517 redirection_type = ClassFinalizer::NewFinalizedMalformedType( 2517 redirection_type = ClassFinalizer::NewFinalizedMalformedType(
2518 Error::Handle(), // No previous error.
2518 current_class(), 2519 current_class(),
2519 type_pos, 2520 type_pos,
2521 ClassFinalizer::kTryResolve, // No compile-time error.
2520 "factory '%s' may not redirect to %s'%s'", 2522 "factory '%s' may not redirect to %s'%s'",
2521 method->name->ToCString(), 2523 method->name->ToCString(),
2522 type.IsTypeParameter() ? "type parameter " : "", 2524 type.IsTypeParameter() ? "type parameter " : "",
2523 type.IsTypeParameter() ? 2525 type.IsTypeParameter() ?
2524 String::Handle(type.UserVisibleName()).ToCString() : "dynamic"); 2526 String::Handle(type.UserVisibleName()).ToCString() : "dynamic");
2525 } else { 2527 } else {
2526 redirection_type ^= type.raw(); 2528 redirection_type ^= type.raw();
2527 } 2529 }
2528 if (CurrentToken() == Token::kPERIOD) { 2530 if (CurrentToken() == Token::kPERIOD) {
2529 // Named constructor or factory. 2531 // Named constructor or factory.
(...skipping 3909 matching lines...) Expand 10 before | Expand all | Expand 10 after
6439 intptr_t token_pos, 6441 intptr_t token_pos,
6440 const char* message_header, 6442 const char* message_header,
6441 const char* format, 6443 const char* format,
6442 va_list args) { 6444 va_list args) {
6443 const String& msg = String::Handle( 6445 const String& msg = String::Handle(
6444 FormatMessage(script, token_pos, message_header, format, args)); 6446 FormatMessage(script, token_pos, message_header, format, args));
6445 return LanguageError::New(msg); 6447 return LanguageError::New(msg);
6446 } 6448 }
6447 6449
6448 6450
6451 RawError* Parser::FormatErrorMsg(const Script& script,
6452 intptr_t token_pos,
6453 const char* message_header,
6454 const char* format, ...) {
6455 va_list args;
6456 va_start(args, format);
6457 const Error& error = Error::Handle(
6458 FormatError(script, token_pos, message_header, format, args));
6459 va_end(args);
6460 return error.raw();
6461 }
6462
6463
6449 RawString* Parser::FormatMessage(const Script& script, 6464 RawString* Parser::FormatMessage(const Script& script,
6450 intptr_t token_pos, 6465 intptr_t token_pos,
6451 const char* message_header, 6466 const char* message_header,
6452 const char* format, va_list args) { 6467 const char* format, va_list args) {
6453 String& result = String::Handle(); 6468 String& result = String::Handle();
6454 const String& msg = String::Handle(String::NewFormattedV(format, args)); 6469 const String& msg = String::Handle(String::NewFormattedV(format, args));
6455 if (!script.IsNull()) { 6470 if (!script.IsNull()) {
6456 const String& script_url = String::CheckedHandle(script.url()); 6471 const String& script_url = String::CheckedHandle(script.url());
6457 if (token_pos >= 0) { 6472 if (token_pos >= 0) {
6458 intptr_t line, column; 6473 intptr_t line, column;
(...skipping 1171 matching lines...) Expand 10 before | Expand all | Expand 10 after
7630 // First check if the type is a type parameter of the given scope class. 7645 // First check if the type is a type parameter of the given scope class.
7631 const TypeParameter& type_parameter = TypeParameter::Handle( 7646 const TypeParameter& type_parameter = TypeParameter::Handle(
7632 scope_class.LookupTypeParameter(unresolved_class_name, 7647 scope_class.LookupTypeParameter(unresolved_class_name,
7633 type->token_pos())); 7648 type->token_pos()));
7634 if (!type_parameter.IsNull()) { 7649 if (!type_parameter.IsNull()) {
7635 // A type parameter is considered to be a malformed type when 7650 // A type parameter is considered to be a malformed type when
7636 // referenced by a static member. 7651 // referenced by a static member.
7637 if (ParsingStaticMember()) { 7652 if (ParsingStaticMember()) {
7638 ASSERT(scope_class.raw() == current_class().raw()); 7653 ASSERT(scope_class.raw() == current_class().raw());
7639 *type = ClassFinalizer::NewFinalizedMalformedType( 7654 *type = ClassFinalizer::NewFinalizedMalformedType(
7655 Error::Handle(), // No previous error.
7640 scope_class, 7656 scope_class,
7641 type->token_pos(), 7657 type->token_pos(),
7658 finalization,
7642 "type parameter '%s' cannot be referenced " 7659 "type parameter '%s' cannot be referenced "
7643 "from static member", 7660 "from static member",
7644 String::Handle(type_parameter.name()).ToCString()); 7661 String::Handle(type_parameter.name()).ToCString());
7645 return; 7662 return;
7646 } 7663 }
7647 // TODO(regis): Should this be a malformed type as well? 7664 // A type parameter cannot be parameterized, so make the type
7648 // A type parameter cannot be parameterized, so report an error if 7665 // malformed if type arguments have previously been parsed.
hausner 2012/10/23 22:02:24 indentation
regis 2012/10/23 22:30:25 Strange. I do not see this bad indentation in the
7649 // type arguments have previously been parsed.
7650 if (!AbstractTypeArguments::Handle(type->arguments()).IsNull()) { 7666 if (!AbstractTypeArguments::Handle(type->arguments()).IsNull()) {
7651 ErrorMsg(type_parameter.token_pos(), 7667 *type = ClassFinalizer::NewFinalizedMalformedType(
7652 "type parameter '%s' cannot be parameterized", 7668 Error::Handle(), // No previous error.
7653 String::Handle(type_parameter.name()).ToCString()); 7669 scope_class,
7670 type_parameter.token_pos(),
7671 finalization,
7672 "type parameter '%s' cannot be parameterized",
7673 String::Handle(type_parameter.name()).ToCString());
7674 return;
7654 } 7675 }
7655 *type = type_parameter.raw(); 7676 *type = type_parameter.raw();
7656 return; 7677 return;
7657 } 7678 }
7658 } 7679 }
7659 // Resolve classname in the scope of the current library. 7680 // Resolve classname in the scope of the current library.
7681 Error& error = Error::Handle();
7660 resolved_type_class = 7682 resolved_type_class =
7661 ResolveClassInCurrentLibraryScope(unresolved_class.token_pos(), 7683 ResolveClassInCurrentLibraryScope(unresolved_class.token_pos(),
7662 unresolved_class_name); 7684 unresolved_class_name,
7685 &error);
7686 if (!error.IsNull()) {
7687 *type = ClassFinalizer::NewFinalizedMalformedType(
7688 error,
7689 scope_class,
7690 unresolved_class.token_pos(),
7691 finalization,
7692 "cannot resolve class '%s'",
7693 unresolved_class_name.ToCString());
7694 return;
7695 }
7663 } else { 7696 } else {
7664 LibraryPrefix& lib_prefix = 7697 LibraryPrefix& lib_prefix =
7665 LibraryPrefix::Handle(unresolved_class.library_prefix()); 7698 LibraryPrefix::Handle(unresolved_class.library_prefix());
7666 // Resolve class name in the scope of the library prefix. 7699 // Resolve class name in the scope of the library prefix.
7700 Error& error = Error::Handle();
7667 resolved_type_class = 7701 resolved_type_class =
7668 ResolveClassInPrefixScope(unresolved_class.token_pos(), 7702 ResolveClassInPrefixScope(unresolved_class.token_pos(),
7669 lib_prefix, 7703 lib_prefix,
7670 unresolved_class_name); 7704 unresolved_class_name,
7705 &error);
7706 if (!error.IsNull()) {
7707 *type = ClassFinalizer::NewFinalizedMalformedType(
7708 error,
7709 scope_class,
7710 unresolved_class.token_pos(),
7711 finalization,
7712 "cannot resolve class '%s'",
7713 unresolved_class_name.ToCString());
7714 return;
7715 }
7671 } 7716 }
7672 // At this point, we can only have a parameterized_type. 7717 // At this point, we can only have a parameterized_type.
7673 Type& parameterized_type = Type::Handle(); 7718 Type& parameterized_type = Type::Handle();
7674 parameterized_type ^= type->raw(); 7719 parameterized_type ^= type->raw();
7675 if (!resolved_type_class.IsNull()) { 7720 if (!resolved_type_class.IsNull()) {
7676 // Replace unresolved class with resolved type class. 7721 // Replace unresolved class with resolved type class.
7677 parameterized_type.set_type_class(resolved_type_class); 7722 parameterized_type.set_type_class(resolved_type_class);
7678 } else if (finalization >= ClassFinalizer::kCanonicalize) { 7723 } else if (finalization >= ClassFinalizer::kCanonicalize) {
7679 // The type is malformed. 7724 // The type is malformed.
7680 ClassFinalizer::FinalizeMalformedType( 7725 ClassFinalizer::FinalizeMalformedType(
(...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after
8128 } 8173 }
8129 8174
8130 8175
8131 // Resolve a name by checking the global scope of the current 8176 // Resolve a name by checking the global scope of the current
8132 // library. If not found in the current library, then look in the scopes 8177 // library. If not found in the current library, then look in the scopes
8133 // of all libraries that are imported without a library prefix. 8178 // of all libraries that are imported without a library prefix.
8134 // Issue an error if the name is not found in the global scope 8179 // Issue an error if the name is not found in the global scope
8135 // of the current library, but is defined in more than one imported 8180 // of the current library, but is defined in more than one imported
8136 // library, i.e. if the name cannot be resolved unambiguously. 8181 // library, i.e. if the name cannot be resolved unambiguously.
8137 RawObject* Parser::ResolveNameInCurrentLibraryScope(intptr_t ident_pos, 8182 RawObject* Parser::ResolveNameInCurrentLibraryScope(intptr_t ident_pos,
8138 const String& name) { 8183 const String& name,
8184 Error* error) {
8139 TRACE_PARSER("ResolveNameInCurrentLibraryScope"); 8185 TRACE_PARSER("ResolveNameInCurrentLibraryScope");
8140 Object& obj = Object::Handle(LookupNameInLibrary(library_, name)); 8186 Object& obj = Object::Handle(LookupNameInLibrary(library_, name));
8141 if (obj.IsNull()) { 8187 if (obj.IsNull()) {
8142 // Name is not found in current library. Check scope of all 8188 // Name is not found in current library. Check scope of all
8143 // imported libraries. 8189 // imported libraries.
8144 String& first_lib_url = String::Handle(); 8190 String& first_lib_url = String::Handle();
8145 Namespace& import = Namespace::Handle(); 8191 Namespace& import = Namespace::Handle();
8146 intptr_t num_imports = library_.num_imports(); 8192 intptr_t num_imports = library_.num_imports();
8147 Object& imported_obj = Object::Handle(); 8193 Object& imported_obj = Object::Handle();
8148 for (int i = 0; i < num_imports; i++) { 8194 for (int i = 0; i < num_imports; i++) {
8149 import ^= library_.ImportAt(i); 8195 import ^= library_.ImportAt(i);
8150 imported_obj = LookupNameInImport(import, name); 8196 imported_obj = LookupNameInImport(import, name);
8151 if (!imported_obj.IsNull()) { 8197 if (!imported_obj.IsNull()) {
8152 const Library& lib = Library::Handle(import.library()); 8198 const Library& lib = Library::Handle(import.library());
8153 if (!first_lib_url.IsNull()) { 8199 if (!first_lib_url.IsNull()) {
8154 // Found duplicate definition. 8200 // Found duplicate definition.
8201 Error& ambiguous_ref_error = Error::Handle();
8155 if (first_lib_url.raw() == lib.url()) { 8202 if (first_lib_url.raw() == lib.url()) {
8156 ErrorMsg(ident_pos, 8203 ambiguous_ref_error = FormatErrorMsg(
8157 "ambiguous reference: " 8204 script_, ident_pos, "Error",
8158 "'%s' as library '%s' is imported multiple times", 8205 "ambiguous reference: "
8159 name.ToCString(), 8206 "'%s' as library '%s' is imported multiple times",
8160 first_lib_url.ToCString()); 8207 name.ToCString(),
8208 first_lib_url.ToCString());
8161 } else { 8209 } else {
8162 ErrorMsg(ident_pos, 8210 ambiguous_ref_error = FormatErrorMsg(
8163 "ambiguous reference: " 8211 script_, ident_pos, "Error",
8164 "'%s' is defined in library '%s' and also in '%s'", 8212 "ambiguous reference: "
8165 name.ToCString(), 8213 "'%s' is defined in library '%s' and also in '%s'",
8166 first_lib_url.ToCString(), 8214 name.ToCString(),
8167 String::Handle(lib.url()).ToCString()); 8215 first_lib_url.ToCString(),
8216 String::Handle(lib.url()).ToCString());
8168 } 8217 }
8218 if (error == NULL) {
8219 // Report a compile time error since the caller is not interested
8220 // in the error.
8221 ErrorMsg(ambiguous_ref_error);
8222 }
8223 *error = ambiguous_ref_error.raw();
8224 return Object::null();
8169 } else { 8225 } else {
8170 first_lib_url = lib.url(); 8226 first_lib_url = lib.url();
8171 obj = imported_obj.raw(); 8227 obj = imported_obj.raw();
8172 } 8228 }
8173 } 8229 }
8174 } 8230 }
8175 } 8231 }
8176 return obj.raw(); 8232 return obj.raw();
8177 } 8233 }
8178 8234
8179 8235
8180 RawClass* Parser::ResolveClassInCurrentLibraryScope(intptr_t ident_pos, 8236 RawClass* Parser::ResolveClassInCurrentLibraryScope(intptr_t ident_pos,
8181 const String& name) { 8237 const String& name,
8238 Error* error) {
8182 const Object& obj = 8239 const Object& obj =
8183 Object::Handle(ResolveNameInCurrentLibraryScope(ident_pos, name)); 8240 Object::Handle(ResolveNameInCurrentLibraryScope(ident_pos, name, error));
8184 if (obj.IsClass()) { 8241 if (obj.IsClass()) {
8185 return Class::Cast(obj).raw(); 8242 return Class::Cast(obj).raw();
8186 } 8243 }
8187 return Class::null(); 8244 return Class::null();
8188 } 8245 }
8189 8246
8190 8247
8191 // Resolve an identifier by checking the global scope of the current 8248 // Resolve an identifier by checking the global scope of the current
8192 // library. If not found in the current library, then look in the scopes 8249 // library. If not found in the current library, then look in the scopes
8193 // of all libraries that are imported without a library prefix. 8250 // of all libraries that are imported without a library prefix.
8194 // Issue an error if the identifier is not found in the global scope 8251 // Issue an error if the identifier is not found in the global scope
8195 // of the current library, but is defined in more than one imported 8252 // of the current library, but is defined in more than one imported
8196 // library, i.e. if the identifier cannot be resolved unambiguously. 8253 // library, i.e. if the identifier cannot be resolved unambiguously.
8197 AstNode* Parser::ResolveIdentInCurrentLibraryScope(intptr_t ident_pos, 8254 AstNode* Parser::ResolveIdentInCurrentLibraryScope(intptr_t ident_pos,
8198 const String& ident) { 8255 const String& ident) {
8199 TRACE_PARSER("ResolveIdentInCurrentLibraryScope"); 8256 TRACE_PARSER("ResolveIdentInCurrentLibraryScope");
8200 const Object& obj = 8257 const Object& obj =
8201 Object::Handle(ResolveNameInCurrentLibraryScope(ident_pos, ident)); 8258 Object::Handle(ResolveNameInCurrentLibraryScope(ident_pos, ident, NULL));
8202 if (obj.IsClass()) { 8259 if (obj.IsClass()) {
8203 const Class& cls = Class::Cast(obj); 8260 const Class& cls = Class::Cast(obj);
8204 return new PrimaryNode(ident_pos, Class::ZoneHandle(cls.raw())); 8261 return new PrimaryNode(ident_pos, Class::ZoneHandle(cls.raw()));
8205 } else if (obj.IsField()) { 8262 } else if (obj.IsField()) {
8206 const Field& field = Field::Cast(obj); 8263 const Field& field = Field::Cast(obj);
8207 ASSERT(field.is_static()); 8264 ASSERT(field.is_static());
8208 return GenerateStaticFieldLookup(field, ident_pos); 8265 return GenerateStaticFieldLookup(field, ident_pos);
8209 } else if (obj.IsFunction()) { 8266 } else if (obj.IsFunction()) {
8210 const Function& func = Function::Cast(obj); 8267 const Function& func = Function::Cast(obj);
8211 ASSERT(func.is_static()); 8268 ASSERT(func.is_static());
(...skipping 10 matching lines...) Expand all
8222 } else { 8279 } else {
8223 ASSERT(obj.IsNull() || obj.IsLibraryPrefix()); 8280 ASSERT(obj.IsNull() || obj.IsLibraryPrefix());
8224 } 8281 }
8225 // Lexically unresolved primary identifiers are referenced by their name. 8282 // Lexically unresolved primary identifiers are referenced by their name.
8226 return new PrimaryNode(ident_pos, ident); 8283 return new PrimaryNode(ident_pos, ident);
8227 } 8284 }
8228 8285
8229 8286
8230 RawObject* Parser::ResolveNameInPrefixScope(intptr_t ident_pos, 8287 RawObject* Parser::ResolveNameInPrefixScope(intptr_t ident_pos,
8231 const LibraryPrefix& prefix, 8288 const LibraryPrefix& prefix,
8232 const String& name) { 8289 const String& name,
8290 Error* error) {
8233 TRACE_PARSER("ResolveNameInPrefixScope"); 8291 TRACE_PARSER("ResolveNameInPrefixScope");
8234 Namespace& import = Namespace::Handle(); 8292 Namespace& import = Namespace::Handle();
8235 String& first_lib_url = String::Handle(); 8293 String& first_lib_url = String::Handle();
8236 Object& obj = Object::Handle(); 8294 Object& obj = Object::Handle();
8237 Object& resolved_obj = Object::Handle(); 8295 Object& resolved_obj = Object::Handle();
8238 const Array& imports = Array::Handle(prefix.imports()); 8296 const Array& imports = Array::Handle(prefix.imports());
8239 for (intptr_t i = 0; i < prefix.num_imports(); i++) { 8297 for (intptr_t i = 0; i < prefix.num_imports(); i++) {
8240 import ^= imports.At(i); 8298 import ^= imports.At(i);
8241 resolved_obj = LookupNameInImport(import, name); 8299 resolved_obj = LookupNameInImport(import, name);
8242 if (!resolved_obj.IsNull()) { 8300 if (!resolved_obj.IsNull()) {
8243 obj = resolved_obj.raw(); 8301 obj = resolved_obj.raw();
8244 const Library& lib = Library::Handle(import.library()); 8302 const Library& lib = Library::Handle(import.library());
8245 if (first_lib_url.IsNull()) { 8303 if (first_lib_url.IsNull()) {
8246 first_lib_url = lib.url(); 8304 first_lib_url = lib.url();
8247 } else { 8305 } else {
8248 // Found duplicate definition. 8306 // Found duplicate definition.
8307 Error& ambiguous_ref_error = Error::Handle();
8249 if (first_lib_url.raw() == lib.url()) { 8308 if (first_lib_url.raw() == lib.url()) {
8250 ErrorMsg(ident_pos, 8309 ambiguous_ref_error = FormatErrorMsg(
8251 "ambiguous reference: '%s.%s' is imported multiple times", 8310 script_, ident_pos, "Error",
8252 String::Handle(prefix.name()).ToCString(), 8311 "ambiguous reference: '%s.%s' is imported multiple times",
8253 name.ToCString()); 8312 String::Handle(prefix.name()).ToCString(),
8313 name.ToCString());
8254 } else { 8314 } else {
8255 ErrorMsg(ident_pos, 8315 ambiguous_ref_error = FormatErrorMsg(
8256 "ambiguous reference: '%s.%s' is defined in '%s' and '%s'", 8316 script_, ident_pos, "Error",
8257 String::Handle(prefix.name()).ToCString(), 8317 "ambiguous reference: '%s.%s' is defined in '%s' and '%s'",
8258 name.ToCString(), 8318 String::Handle(prefix.name()).ToCString(),
8259 first_lib_url.ToCString(), 8319 name.ToCString(),
8260 String::Handle(lib.url()).ToCString()); 8320 first_lib_url.ToCString(),
8321 String::Handle(lib.url()).ToCString());
8261 } 8322 }
8323 if (error == NULL) {
8324 // Report a compile time error since the caller is not interested
8325 // in the error.
8326 ErrorMsg(ambiguous_ref_error);
8327 }
8328 *error = ambiguous_ref_error.raw();
8329 return Object::null();
8262 } 8330 }
8263 } 8331 }
8264 } 8332 }
8265 return obj.raw(); 8333 return obj.raw();
8266 } 8334 }
8267 8335
8268 8336
8269 RawClass* Parser::ResolveClassInPrefixScope(intptr_t ident_pos, 8337 RawClass* Parser::ResolveClassInPrefixScope(intptr_t ident_pos,
8270 const LibraryPrefix& prefix, 8338 const LibraryPrefix& prefix,
8271 const String& name) { 8339 const String& name,
8340 Error* error) {
8272 const Object& obj = 8341 const Object& obj =
8273 Object::Handle(ResolveNameInPrefixScope(ident_pos, prefix, name)); 8342 Object::Handle(ResolveNameInPrefixScope(ident_pos, prefix, name, error));
8274 if (obj.IsClass()) { 8343 if (obj.IsClass()) {
8275 return Class::Cast(obj).raw(); 8344 return Class::Cast(obj).raw();
8276 } 8345 }
8277 return Class::null(); 8346 return Class::null();
8278 } 8347 }
8279 8348
8280 8349
8281 // Do a lookup for the identifier in the scope of the specified 8350 // Do a lookup for the identifier in the scope of the specified
8282 // library prefix. This means trying to resolve it locally in all of the 8351 // library prefix. This means trying to resolve it locally in all of the
8283 // libraries present in the library prefix. If there are multiple libraries 8352 // libraries present in the library prefix. If there are multiple libraries
8284 // with the name, issue an ambiguous reference error. 8353 // with the name, issue an ambiguous reference error.
8285 AstNode* Parser::ResolveIdentInPrefixScope(intptr_t ident_pos, 8354 AstNode* Parser::ResolveIdentInPrefixScope(intptr_t ident_pos,
8286 const LibraryPrefix& prefix, 8355 const LibraryPrefix& prefix,
8287 const String& ident) { 8356 const String& ident) {
8288 TRACE_PARSER("ResolveIdentInPrefixScope"); 8357 TRACE_PARSER("ResolveIdentInPrefixScope");
8289 Object& obj = 8358 Object& obj =
8290 Object::Handle(ResolveNameInPrefixScope(ident_pos, prefix, ident)); 8359 Object::Handle(ResolveNameInPrefixScope(ident_pos, prefix, ident, NULL));
8291 if (obj.IsNull()) { 8360 if (obj.IsNull()) {
8292 // Unresolved prefixed primary identifier. 8361 // Unresolved prefixed primary identifier.
8293 ErrorMsg(ident_pos, "identifier '%s.%s' cannot be resolved", 8362 ErrorMsg(ident_pos, "identifier '%s.%s' cannot be resolved",
8294 String::Handle(prefix.name()).ToCString(), 8363 String::Handle(prefix.name()).ToCString(),
8295 ident.ToCString()); 8364 ident.ToCString());
8296 } 8365 }
8297 if (obj.IsClass()) { 8366 if (obj.IsClass()) {
8298 const Class& cls = Class::Cast(obj); 8367 const Class& cls = Class::Cast(obj);
8299 return new PrimaryNode(ident_pos, Class::ZoneHandle(cls.raw())); 8368 return new PrimaryNode(ident_pos, Class::ZoneHandle(cls.raw()));
8300 } else if (obj.IsField()) { 8369 } else if (obj.IsField()) {
(...skipping 578 matching lines...) Expand 10 before | Expand all | Expand 10 after
8879 ConsumeToken(); 8948 ConsumeToken();
8880 if (!IsIdentifier()) { 8949 if (!IsIdentifier()) {
8881 ErrorMsg("type name expected"); 8950 ErrorMsg("type name expected");
8882 } 8951 }
8883 intptr_t type_pos = TokenPos(); 8952 intptr_t type_pos = TokenPos();
8884 AbstractType& type = AbstractType::Handle( 8953 AbstractType& type = AbstractType::Handle(
8885 ParseType(ClassFinalizer::kCanonicalizeForCreation)); 8954 ParseType(ClassFinalizer::kCanonicalizeForCreation));
8886 // In case the type is malformed, throw a dynamic type error after finishing 8955 // In case the type is malformed, throw a dynamic type error after finishing
8887 // parsing the instance creation expression. 8956 // parsing the instance creation expression.
8888 if (type.IsTypeParameter() || type.IsDynamicType()) { 8957 if (type.IsTypeParameter() || type.IsDynamicType()) {
8958 ASSERT(!type.IsMalformed());
8889 // Replace the type with a malformed type. 8959 // Replace the type with a malformed type.
8890 type = ClassFinalizer::NewFinalizedMalformedType( 8960 type = ClassFinalizer::NewFinalizedMalformedType(
8961 Error::Handle(), // No previous error.
8891 current_class(), 8962 current_class(),
8892 type_pos, 8963 type_pos,
8964 ClassFinalizer::kTryResolve, // No compile-time error.
8893 "%s'%s' cannot be instantiated", 8965 "%s'%s' cannot be instantiated",
8894 type.IsTypeParameter() ? "type parameter " : "", 8966 type.IsTypeParameter() ? "type parameter " : "",
8895 type.IsTypeParameter() ? 8967 type.IsTypeParameter() ?
8896 String::Handle(type.UserVisibleName()).ToCString() : "dynamic"); 8968 String::Handle(type.UserVisibleName()).ToCString() : "dynamic");
8897 } 8969 }
8898 8970
8899 // The grammar allows for an optional ('.' identifier)? after the type, which 8971 // The grammar allows for an optional ('.' identifier)? after the type, which
8900 // is a named constructor. Note that ParseType(kMustResolve) above will not 8972 // is a named constructor. Note that ParseType(kMustResolve) above will not
8901 // consume it as part of a misinterpreted qualified identifier, because only a 8973 // consume it as part of a misinterpreted qualified identifier, because only a
8902 // valid library prefix is accepted as qualifier. 8974 // valid library prefix is accepted as qualifier.
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
8946 const String& constructor_name = 9018 const String& constructor_name =
8947 BuildConstructorName(type_class_name, named_constructor); 9019 BuildConstructorName(type_class_name, named_constructor);
8948 const String& external_constructor_name = 9020 const String& external_constructor_name =
8949 (named_constructor ? constructor_name : type_class_name); 9021 (named_constructor ? constructor_name : type_class_name);
8950 Function& constructor = Function::ZoneHandle( 9022 Function& constructor = Function::ZoneHandle(
8951 type_class.LookupConstructor(constructor_name)); 9023 type_class.LookupConstructor(constructor_name));
8952 if (constructor.IsNull()) { 9024 if (constructor.IsNull()) {
8953 // Replace the type with a malformed type and compile a throw or report 9025 // Replace the type with a malformed type and compile a throw or report
8954 // a compile-time error if the constructor is const. 9026 // a compile-time error if the constructor is const.
8955 type = ClassFinalizer::NewFinalizedMalformedType( 9027 type = ClassFinalizer::NewFinalizedMalformedType(
9028 Error::Handle(), // No previous error.
8956 current_class(), 9029 current_class(),
8957 call_pos, 9030 call_pos,
9031 ClassFinalizer::kTryResolve, // No compile-time error.
8958 "interface '%s' has no constructor named '%s'", 9032 "interface '%s' has no constructor named '%s'",
8959 type_class_name.ToCString(), 9033 type_class_name.ToCString(),
8960 external_constructor_name.ToCString()); 9034 external_constructor_name.ToCString());
8961 if (is_const) { 9035 if (is_const) {
8962 const Error& error = Error::Handle(type.malformed_error()); 9036 const Error& error = Error::Handle(type.malformed_error());
8963 ErrorMsg(error); 9037 ErrorMsg(error);
8964 } 9038 }
8965 return ThrowNoSuchMethodError(call_pos, external_constructor_name); 9039 return ThrowNoSuchMethodError(call_pos, external_constructor_name);
8966 } 9040 }
8967 String& error_message = String::Handle(); 9041 String& error_message = String::Handle();
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
9014 Function& constructor = Function::ZoneHandle( 9088 Function& constructor = Function::ZoneHandle(
9015 constructor_class.LookupConstructor(constructor_name)); 9089 constructor_class.LookupConstructor(constructor_name));
9016 if (constructor.IsNull()) { 9090 if (constructor.IsNull()) {
9017 constructor = constructor_class.LookupFactory(constructor_name); 9091 constructor = constructor_class.LookupFactory(constructor_name);
9018 if (constructor.IsNull()) { 9092 if (constructor.IsNull()) {
9019 const String& external_constructor_name = 9093 const String& external_constructor_name =
9020 (named_constructor ? constructor_name : constructor_class_name); 9094 (named_constructor ? constructor_name : constructor_class_name);
9021 // Replace the type with a malformed type and compile a throw or report a 9095 // Replace the type with a malformed type and compile a throw or report a
9022 // compile-time error if the constructor is const. 9096 // compile-time error if the constructor is const.
9023 type = ClassFinalizer::NewFinalizedMalformedType( 9097 type = ClassFinalizer::NewFinalizedMalformedType(
9098 Error::Handle(), // No previous error.
9024 current_class(), 9099 current_class(),
9025 call_pos, 9100 call_pos,
9101 ClassFinalizer::kTryResolve, // No compile-time error.
9026 "class '%s' has no constructor or factory named '%s'", 9102 "class '%s' has no constructor or factory named '%s'",
9027 String::Handle(constructor_class.Name()).ToCString(), 9103 String::Handle(constructor_class.Name()).ToCString(),
9028 external_constructor_name.ToCString()); 9104 external_constructor_name.ToCString());
9029 if (is_const) { 9105 if (is_const) {
9030 const Error& error = Error::Handle(type.malformed_error()); 9106 const Error& error = Error::Handle(type.malformed_error());
9031 ErrorMsg(error); 9107 ErrorMsg(error);
9032 } 9108 }
9033 return ThrowNoSuchMethodError(call_pos, external_constructor_name); 9109 return ThrowNoSuchMethodError(call_pos, external_constructor_name);
9034 } else if (constructor.IsRedirectingFactory()) { 9110 } else if (constructor.IsRedirectingFactory()) {
9035 type = constructor.RedirectionType(); 9111 type = constructor.RedirectionType();
(...skipping 728 matching lines...) Expand 10 before | Expand all | Expand 10 after
9764 void Parser::SkipQualIdent() { 9840 void Parser::SkipQualIdent() {
9765 ASSERT(IsIdentifier()); 9841 ASSERT(IsIdentifier());
9766 ConsumeToken(); 9842 ConsumeToken();
9767 if (CurrentToken() == Token::kPERIOD) { 9843 if (CurrentToken() == Token::kPERIOD) {
9768 ConsumeToken(); // Consume the kPERIOD token. 9844 ConsumeToken(); // Consume the kPERIOD token.
9769 ExpectIdentifier("identifier expected after '.'"); 9845 ExpectIdentifier("identifier expected after '.'");
9770 } 9846 }
9771 } 9847 }
9772 9848
9773 } // namespace dart 9849 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698