| Index: runtime/vm/parser.cc
|
| ===================================================================
|
| --- runtime/vm/parser.cc (revision 27310)
|
| +++ runtime/vm/parser.cc (working copy)
|
| @@ -1700,7 +1700,7 @@
|
| name = String::Concat(name, String::Handle(core_lib.private_key()));
|
| name = Symbols::New(name);
|
| }
|
| - return core_lib.LookupClass(name, NULL); // No ambiguity error expected.
|
| + return core_lib.LookupClass(name);
|
| }
|
|
|
|
|
| @@ -8452,52 +8452,15 @@
|
| // to resolve it too early to an imported class of the same name.
|
| if (finalization > ClassFinalizer::kResolveTypeParameters) {
|
| // Resolve classname in the scope of the current library.
|
| - Error& error = Error::Handle();
|
| resolved_type_class = ResolveClassInCurrentLibraryScope(
|
| - unresolved_class.token_pos(),
|
| - unresolved_class_name,
|
| - &error);
|
| - if (!error.IsNull()) {
|
| - if ((finalization == ClassFinalizer::kCanonicalizeWellFormed) ||
|
| - FLAG_error_on_bad_type) {
|
| - *type = ClassFinalizer::NewFinalizedMalformedType(
|
| - error,
|
| - scope_class,
|
| - unresolved_class.token_pos(),
|
| - "cannot resolve class '%s'",
|
| - unresolved_class_name.ToCString());
|
| - } else {
|
| - // Map the malformed type to dynamic and ignore type arguments.
|
| - *type = Type::DynamicType();
|
| - }
|
| - return;
|
| - }
|
| + unresolved_class_name);
|
| }
|
| } else {
|
| LibraryPrefix& lib_prefix =
|
| LibraryPrefix::Handle(unresolved_class.library_prefix());
|
| // Resolve class name in the scope of the library prefix.
|
| - Error& error = Error::Handle();
|
| - resolved_type_class = ResolveClassInPrefixScope(
|
| - unresolved_class.token_pos(),
|
| - lib_prefix,
|
| - unresolved_class_name,
|
| - &error);
|
| - if (!error.IsNull()) {
|
| - if ((finalization == ClassFinalizer::kCanonicalizeWellFormed) ||
|
| - FLAG_error_on_bad_type) {
|
| - *type = ClassFinalizer::NewFinalizedMalformedType(
|
| - error,
|
| - scope_class,
|
| - unresolved_class.token_pos(),
|
| - "cannot resolve class '%s'",
|
| - unresolved_class_name.ToCString());
|
| - } else {
|
| - // Map the malformed type to dynamic and ignore type arguments.
|
| - *type = Type::DynamicType();
|
| - }
|
| - return;
|
| - }
|
| + resolved_type_class =
|
| + ResolveClassInPrefixScope(lib_prefix, unresolved_class_name);
|
| }
|
| // At this point, we can only have a parameterized_type.
|
| const Type& parameterized_type = Type::Cast(*type);
|
| @@ -8885,98 +8848,24 @@
|
| }
|
|
|
|
|
| -static RawObject* LookupNameInImport(Isolate* isolate,
|
| - const Namespace& ns,
|
| - const String& name) {
|
| - // If the given name is filtered out by the import, don't look it up, nor its
|
| - // getter and setter names.
|
| - if (ns.HidesName(name)) {
|
| - return Object::null();
|
| - }
|
| - Object& obj = Object::Handle(isolate);
|
| - obj = ns.Lookup(name);
|
| - if (!obj.IsNull()) {
|
| - return obj.raw();
|
| - }
|
| - String& accessor_name = String::Handle(isolate, Field::GetterName(name));
|
| - obj = ns.Lookup(accessor_name);
|
| - if (!obj.IsNull()) {
|
| - return obj.raw();
|
| - }
|
| - accessor_name = Field::SetterName(name);
|
| - obj = ns.Lookup(accessor_name);
|
| - return obj.raw();
|
| -}
|
| -
|
| -
|
| // Resolve a name by checking the global scope of the current
|
| // library. If not found in the current library, then look in the scopes
|
| // of all libraries that are imported without a library prefix.
|
| -// Issue an error if the name is not found in the global scope
|
| -// of the current library, but is defined in more than one imported
|
| -// library, i.e. if the name cannot be resolved unambiguously.
|
| -RawObject* Parser::ResolveNameInCurrentLibraryScope(intptr_t ident_pos,
|
| - const String& name,
|
| - Error* error) {
|
| +RawObject* Parser::ResolveNameInCurrentLibraryScope(const String& name) {
|
| TRACE_PARSER("ResolveNameInCurrentLibraryScope");
|
| HANDLESCOPE(isolate());
|
| Object& obj = Object::Handle(isolate(),
|
| LookupNameInLibrary(isolate(), library_, name));
|
| - if (obj.IsNull()) {
|
| - // Name is not found in current library. Check scope of all
|
| - // imported libraries.
|
| - String& first_lib_url = String::Handle(isolate());
|
| - Namespace& import = Namespace::Handle(isolate());
|
| - intptr_t num_imports = library_.num_imports();
|
| - Object& imported_obj = Object::Handle(isolate());
|
| - Library& lib = Library::Handle(isolate());
|
| - for (int i = 0; i < num_imports; i++) {
|
| - import = library_.ImportAt(i);
|
| - imported_obj = LookupNameInImport(isolate(), import, name);
|
| - if (!imported_obj.IsNull()) {
|
| - lib ^= import.library();
|
| - if (!first_lib_url.IsNull()) {
|
| - // Found duplicate definition.
|
| - Error& ambiguous_ref_error = Error::Handle();
|
| - if (first_lib_url.raw() == lib.url()) {
|
| - ambiguous_ref_error = FormatErrorMsg(
|
| - script_, ident_pos, "Error",
|
| - "ambiguous reference to '%s', "
|
| - "as library '%s' is imported multiple times",
|
| - name.ToCString(),
|
| - first_lib_url.ToCString());
|
| - } else {
|
| - ambiguous_ref_error = FormatErrorMsg(
|
| - script_, ident_pos, "Error",
|
| - "ambiguous reference: "
|
| - "'%s' is defined in library '%s' and also in '%s'",
|
| - name.ToCString(),
|
| - first_lib_url.ToCString(),
|
| - String::Handle(lib.url()).ToCString());
|
| - }
|
| - if (error == NULL) {
|
| - // Report a compile time error since the caller is not interested
|
| - // in the error.
|
| - ErrorMsg(ambiguous_ref_error);
|
| - }
|
| - *error = ambiguous_ref_error.raw();
|
| - return Object::null();
|
| - } else {
|
| - first_lib_url = lib.url();
|
| - obj = imported_obj.raw();
|
| - }
|
| - }
|
| - }
|
| + if (!obj.IsNull()) {
|
| + return obj.raw();
|
| }
|
| - return obj.raw();
|
| + return library_.LookupImportedObject(name);
|
| }
|
|
|
|
|
| -RawClass* Parser::ResolveClassInCurrentLibraryScope(intptr_t ident_pos,
|
| - const String& name,
|
| - Error* error) {
|
| +RawClass* Parser::ResolveClassInCurrentLibraryScope(const String& name) {
|
| const Object& obj =
|
| - Object::Handle(ResolveNameInCurrentLibraryScope(ident_pos, name, error));
|
| + Object::Handle(ResolveNameInCurrentLibraryScope(name));
|
| if (obj.IsClass()) {
|
| return Class::Cast(obj).raw();
|
| }
|
| @@ -8994,7 +8883,7 @@
|
| const String& ident) {
|
| TRACE_PARSER("ResolveIdentInCurrentLibraryScope");
|
| const Object& obj =
|
| - Object::Handle(ResolveNameInCurrentLibraryScope(ident_pos, ident, NULL));
|
| + Object::Handle(ResolveNameInCurrentLibraryScope(ident));
|
| if (obj.IsClass()) {
|
| const Class& cls = Class::Cast(obj);
|
| return new PrimaryNode(ident_pos, Class::ZoneHandle(cls.raw()));
|
| @@ -9023,64 +8912,17 @@
|
| }
|
|
|
|
|
| -RawObject* Parser::ResolveNameInPrefixScope(intptr_t ident_pos,
|
| - const LibraryPrefix& prefix,
|
| - const String& name,
|
| - Error* error) {
|
| - TRACE_PARSER("ResolveNameInPrefixScope");
|
| +RawObject* Parser::ResolveNameInPrefixScope(const LibraryPrefix& prefix,
|
| + const String& name) {
|
| HANDLESCOPE(isolate());
|
| - Namespace& import = Namespace::Handle(isolate());
|
| - String& first_lib_url = String::Handle(isolate());
|
| - Object& obj = Object::Handle(isolate());
|
| - Object& resolved_obj = Object::Handle(isolate());
|
| - const Array& imports = Array::Handle(isolate(), prefix.imports());
|
| - Library& lib = Library::Handle(isolate());
|
| - for (intptr_t i = 0; i < prefix.num_imports(); i++) {
|
| - import ^= imports.At(i);
|
| - resolved_obj = LookupNameInImport(isolate(), import, name);
|
| - if (!resolved_obj.IsNull()) {
|
| - obj = resolved_obj.raw();
|
| - lib = import.library();
|
| - if (first_lib_url.IsNull()) {
|
| - first_lib_url = lib.url();
|
| - } else {
|
| - // Found duplicate definition.
|
| - Error& ambiguous_ref_error = Error::Handle();
|
| - if (first_lib_url.raw() == lib.url()) {
|
| - ambiguous_ref_error = FormatErrorMsg(
|
| - script_, ident_pos, "Error",
|
| - "ambiguous reference: '%s.%s' is imported multiple times",
|
| - String::Handle(prefix.name()).ToCString(),
|
| - name.ToCString());
|
| - } else {
|
| - ambiguous_ref_error = FormatErrorMsg(
|
| - script_, ident_pos, "Error",
|
| - "ambiguous reference: '%s.%s' is defined in '%s' and '%s'",
|
| - String::Handle(prefix.name()).ToCString(),
|
| - name.ToCString(),
|
| - first_lib_url.ToCString(),
|
| - String::Handle(lib.url()).ToCString());
|
| - }
|
| - if (error == NULL) {
|
| - // Report a compile time error since the caller is not interested
|
| - // in the error.
|
| - ErrorMsg(ambiguous_ref_error);
|
| - }
|
| - *error = ambiguous_ref_error.raw();
|
| - return Object::null();
|
| - }
|
| - }
|
| - }
|
| - return obj.raw();
|
| + return prefix.LookupObject(name);
|
| }
|
|
|
|
|
| -RawClass* Parser::ResolveClassInPrefixScope(intptr_t ident_pos,
|
| - const LibraryPrefix& prefix,
|
| - const String& name,
|
| - Error* error) {
|
| +RawClass* Parser::ResolveClassInPrefixScope(const LibraryPrefix& prefix,
|
| + const String& name) {
|
| const Object& obj =
|
| - Object::Handle(ResolveNameInPrefixScope(ident_pos, prefix, name, error));
|
| + Object::Handle(ResolveNameInPrefixScope(prefix, name));
|
| if (obj.IsClass()) {
|
| return Class::Cast(obj).raw();
|
| }
|
| @@ -9096,8 +8938,7 @@
|
| const LibraryPrefix& prefix,
|
| const String& ident) {
|
| TRACE_PARSER("ResolveIdentInPrefixScope");
|
| - Object& obj =
|
| - Object::Handle(ResolveNameInPrefixScope(ident_pos, prefix, ident, NULL));
|
| + Object& obj = Object::Handle(ResolveNameInPrefixScope(prefix, ident));
|
| if (obj.IsNull()) {
|
| // Unresolved prefixed primary identifier.
|
| ErrorMsg(ident_pos, "identifier '%s.%s' cannot be resolved",
|
|
|