Index: runtime/vm/parser.cc |
=================================================================== |
--- runtime/vm/parser.cc (revision 12785) |
+++ runtime/vm/parser.cc (working copy) |
@@ -4087,15 +4087,17 @@ |
} |
} |
// Add the import to the library. |
+ const Namespace& import = Namespace::Handle( |
+ Namespace::New(library, Array::Handle(), Array::Handle())); |
if (prefix.IsNull() || (prefix.Length() == 0)) { |
- library_.AddImport(library); |
+ library_.AddImport(import); |
} else { |
LibraryPrefix& library_prefix = LibraryPrefix::Handle(); |
library_prefix = library_.LookupLocalLibraryPrefix(prefix); |
if (!library_prefix.IsNull()) { |
- library_prefix.AddLibrary(library); |
+ library_prefix.AddImport(import); |
} else { |
- library_prefix = LibraryPrefix::New(prefix, library); |
+ library_prefix = LibraryPrefix::New(prefix, import); |
library_.AddObject(library_prefix, prefix); |
} |
} |
@@ -4137,6 +4139,18 @@ |
} |
+void Parser::ParseIdentList(GrowableObjectArray* names) { |
+ while (IsIdentifier()) { |
+ names->Add(*CurrentLiteral()); |
+ ConsumeToken(); // Identifier. |
+ if (CurrentToken() != Token::kCOMMA) { |
+ return; |
+ } |
+ ConsumeToken(); // Comma. |
+ } |
+} |
+ |
+ |
void Parser::ParseLibraryImportExport() { |
if (IsLiteral("import")) { |
const intptr_t import_pos = TokenPos(); |
@@ -4154,10 +4168,31 @@ |
ConsumeToken(); |
prefix = ExpectIdentifier("prefix expected")->raw(); |
} |
- if (IsLiteral("show")) { |
- ErrorMsg("show combinator not yet supported"); |
- } else if (IsLiteral("hide")) { |
- ErrorMsg("hide combinator not yet supported"); |
+ |
+ Array& show_names = Array::Handle(); |
+ Array& hide_names = Array::Handle(); |
+ if (IsLiteral("show") || IsLiteral("hide")) { |
+ GrowableObjectArray& show_list = |
+ GrowableObjectArray::Handle(GrowableObjectArray::New()); |
+ GrowableObjectArray& hide_list = |
+ GrowableObjectArray::Handle(GrowableObjectArray::New()); |
+ for (;;) { |
+ if (IsLiteral("show")) { |
+ ConsumeToken(); |
+ ParseIdentList(&show_list); |
+ } else if (IsLiteral("hide")) { |
+ ConsumeToken(); |
+ ParseIdentList(&hide_list); |
+ } else { |
+ break; |
+ } |
+ } |
+ if (show_list.Length() > 0) { |
+ show_names = Array::MakeArray(show_list); |
+ } |
+ if (hide_list.Length() > 0) { |
+ hide_names = Array::MakeArray(hide_list); |
+ } |
} |
ExpectSemicolon(); |
@@ -4179,15 +4214,17 @@ |
} |
} |
// Add the import to the library. |
+ const Namespace& import = |
+ Namespace::Handle(Namespace::New(library, show_names, hide_names)); |
if (prefix.IsNull() || (prefix.Length() == 0)) { |
- library_.AddImport(library); |
+ library_.AddImport(import); |
} else { |
LibraryPrefix& library_prefix = LibraryPrefix::Handle(); |
library_prefix = library_.LookupLocalLibraryPrefix(prefix); |
if (!library_prefix.IsNull()) { |
- library_prefix.AddLibrary(library); |
+ library_prefix.AddImport(import); |
} else { |
- library_prefix = LibraryPrefix::New(prefix, library); |
+ library_prefix = LibraryPrefix::New(prefix, import); |
library_.AddObject(library_prefix, prefix); |
} |
} |
@@ -4226,7 +4263,9 @@ |
if (!library_.ImportsCorelib()) { |
Library& core_lib = Library::Handle(Library::CoreLibrary()); |
ASSERT(!core_lib.IsNull()); |
- library_.AddImport(core_lib); |
+ const Namespace& core_ns = Namespace::Handle( |
+ Namespace::New(core_lib, Array::Handle(), Array::Handle())); |
+ library_.AddImport(core_ns); |
} |
return; |
} |
@@ -4254,7 +4293,9 @@ |
if (!library_.ImportsCorelib()) { |
Library& core_lib = Library::Handle(Library::CoreLibrary()); |
ASSERT(!core_lib.IsNull()); |
- library_.AddImport(core_lib); |
+ const Namespace& core_ns = Namespace::Handle( |
+ Namespace::New(core_lib, Array::Handle(), Array::Handle())); |
+ library_.AddImport(core_ns); |
} |
while (IsLiteral("part")) { |
ParseLibraryPart(); |
@@ -7984,6 +8025,28 @@ |
} |
+static RawObject* LookupNameInImport(const Namespace& ns, const String& name) { |
+ Object& obj = Object::Handle(); |
+ obj = ns.Lookup(name); |
+ if (!obj.IsNull()) { |
+ return obj.raw(); |
+ } |
+ // If the given name is filtered out by the import, don't look up the |
+ // getter and setter names. |
+ if (ns.HidesName(name)) { |
+ return Object::null(); |
+ } |
+ String& accessor_name = String::Handle(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. |
@@ -7998,13 +8061,14 @@ |
// Name is not found in current library. Check scope of all |
// imported libraries. |
String& first_lib_url = String::Handle(); |
- Library& lib = Library::Handle(); |
+ Namespace& import = Namespace::Handle(); |
intptr_t num_imports = library_.num_imports(); |
- Object& resolved_obj = Object::Handle(); |
+ Object& imported_obj = Object::Handle(); |
for (int i = 0; i < num_imports; i++) { |
- lib ^= library_.ImportAt(i); |
- resolved_obj = LookupNameInLibrary(lib, name); |
- if (!resolved_obj.IsNull()) { |
+ import ^= library_.ImportAt(i); |
+ imported_obj = LookupNameInImport(import, name); |
+ if (!imported_obj.IsNull()) { |
+ const Library& lib = Library::Handle(import.library()); |
if (!first_lib_url.IsNull()) { |
// Found duplicate definition. |
if (first_lib_url.raw() == lib.url()) { |
@@ -8023,7 +8087,7 @@ |
} |
} else { |
first_lib_url = lib.url(); |
- obj = resolved_obj.raw(); |
+ obj = imported_obj.raw(); |
} |
} |
} |
@@ -8086,16 +8150,17 @@ |
const LibraryPrefix& prefix, |
const String& name) { |
TRACE_PARSER("ResolveNameInPrefixScope"); |
- Library& lib = Library::Handle(); |
+ Namespace& import = Namespace::Handle(); |
String& first_lib_url = String::Handle(); |
Object& obj = Object::Handle(); |
Object& resolved_obj = Object::Handle(); |
- for (intptr_t i = 0; i < prefix.num_libs(); i++) { |
- lib = prefix.GetLibrary(i); |
- ASSERT(!lib.IsNull()); |
- resolved_obj = LookupNameInLibrary(lib, name); |
+ const Array& imports = Array::Handle(prefix.imports()); |
+ for (intptr_t i = 0; i < prefix.num_imports(); i++) { |
+ import ^= imports.At(i); |
+ resolved_obj = LookupNameInImport(import, name); |
if (!resolved_obj.IsNull()) { |
obj = resolved_obj.raw(); |
+ const Library& lib = Library::Handle(import.library()); |
if (first_lib_url.IsNull()) { |
first_lib_url = lib.url(); |
} else { |