| Index: runtime/vm/class_finalizer.cc
|
| ===================================================================
|
| --- runtime/vm/class_finalizer.cc (revision 25321)
|
| +++ runtime/vm/class_finalizer.cc (working copy)
|
| @@ -261,59 +261,23 @@
|
| const String& class_name = String::Handle(unresolved_class.ident());
|
| Library& lib = Library::Handle();
|
| Class& resolved_class = Class::Handle();
|
| + String& ambiguity_error_msg = String::Handle();
|
| if (unresolved_class.library_prefix() == LibraryPrefix::null()) {
|
| lib = cls.library();
|
| ASSERT(!lib.IsNull());
|
| - // TODO(regis): Call lib.LookupClass(class_name, ambiguity_error) instead
|
| - // once it takes the ambiguity_error parameter.
|
| -
|
| - // First check if name is found in the local scope of the library.
|
| - Object& obj = Object::Handle(lib.LookupLocalObject(class_name));
|
| - if (!obj.IsNull() && obj.IsClass()) {
|
| - return Class::Cast(obj).raw();
|
| - }
|
| - // Now check if class_name is found in any imported libs.
|
| - String& first_lib_url = String::Handle();
|
| - Namespace& import = Namespace::Handle();
|
| - Library& import_lib = Library::Handle();
|
| - for (intptr_t i = 0; i < lib.num_imports(); i++) {
|
| - import ^= lib.ImportAt(i);
|
| - obj = import.Lookup(class_name);
|
| - if (!obj.IsNull()) {
|
| - import_lib = import.library();
|
| - if (!first_lib_url.IsNull()) {
|
| - // Found duplicate definition.
|
| - const Script& script = Script::Handle(cls.script());
|
| - if (first_lib_url.raw() == lib.url()) {
|
| - *ambiguity_error = Parser::FormatErrorMsg(
|
| - script, unresolved_class.token_pos(), "Error",
|
| - "ambiguous reference to '%s', "
|
| - "as library '%s' is imported multiple times",
|
| - class_name.ToCString(),
|
| - first_lib_url.ToCString());
|
| - } else {
|
| - *ambiguity_error = Parser::FormatErrorMsg(
|
| - script, unresolved_class.token_pos(), "Error",
|
| - "ambiguous reference: "
|
| - "'%s' is defined in library '%s' and also in '%s'",
|
| - class_name.ToCString(),
|
| - first_lib_url.ToCString(),
|
| - String::Handle(lib.url()).ToCString());
|
| - }
|
| - return Class::null();
|
| - }
|
| - first_lib_url = lib.url();
|
| - if (obj.IsClass()) {
|
| - resolved_class = Class::Cast(obj).raw();
|
| - }
|
| - }
|
| - }
|
| + resolved_class = lib.LookupClass(class_name, &ambiguity_error_msg);
|
| } else {
|
| LibraryPrefix& lib_prefix = LibraryPrefix::Handle();
|
| lib_prefix = unresolved_class.library_prefix();
|
| ASSERT(!lib_prefix.IsNull());
|
| - resolved_class = lib_prefix.LookupLocalClass(class_name);
|
| + resolved_class = lib_prefix.LookupClass(class_name, &ambiguity_error_msg);
|
| }
|
| + if (resolved_class.IsNull() && !ambiguity_error_msg.IsNull()) {
|
| + const Script& script = Script::Handle(cls.script());
|
| + *ambiguity_error = Parser::FormatErrorMsg(
|
| + script, unresolved_class.token_pos(), "Error",
|
| + "%s", ambiguity_error_msg.ToCString());
|
| + }
|
| return resolved_class.raw();
|
| }
|
|
|
|
|