Index: lib/src/compiler/code_generator.dart |
diff --git a/lib/src/compiler/code_generator.dart b/lib/src/compiler/code_generator.dart |
index 1276c85eaeaeed3e9b6f4a7bbe8d4cff67e002fc..d2a13d04464434ca69d59f648f8cdb74af754860 100644 |
--- a/lib/src/compiler/code_generator.dart |
+++ b/lib/src/compiler/code_generator.dart |
@@ -91,6 +91,8 @@ class CodeGenerator extends GeneralizingAstVisitor |
final _hasDeferredSupertype = new HashSet<ClassElement>(); |
+ final _eagerTopLevelFields = new HashSet<Element>.identity(); |
+ |
/// The type provider from the current Analysis [context]. |
final TypeProvider types; |
@@ -380,15 +382,34 @@ class CodeGenerator extends GeneralizingAstVisitor |
var exportedNames = |
new NamespaceBuilder().createExportNamespaceForDirective(element); |
+ var libraryName = emitLibraryName(currentLibrary); |
+ |
// TODO(jmesserly): we could collect all of the names for bulk re-export, |
// but this is easier to implement for now. |
void emitExport(Element export, {String suffix: ''}) { |
var name = _emitTopLevelName(export, suffix: suffix); |
- _moduleItems.add(js.statement( |
- '#.# = #;', [emitLibraryName(currentLibrary), name.selector, name])); |
+ |
+ if (export is TypeDefiningElement || export is FunctionElement || |
+ _eagerTopLevelFields.contains(export)) { |
+ // classes, typedefs, functions, and eager init fields can be assigned |
+ // directly. |
+ // TODO(jmesserly): we don't know about eager init fields from other |
+ // modules we import, so we will never go down this code path for them. |
+ _moduleItems |
+ .add(js.statement('#.# = #;', [libraryName, name.selector, name])); |
+ } else { |
+ // top-level fields, getters, setters need to copy the property |
+ // descriptor. |
+ _moduleItems.add(js.statement('dart.copyProperty(#, #, #);', |
vsm
2016/05/03 21:59:14
From a readability standpoint, perhaps "exportProp
Jennifer Messerly
2016/05/03 23:37:28
yeah, we used to call it "dart.export". restored t
|
+ [libraryName, name.receiver, name.selector])); |
+ } |
} |
for (var export in exportedNames.definedNames.values) { |
+ if (export is PropertyAccessorElement) { |
+ export = (export as PropertyAccessorElement).variable; |
+ } |
+ |
// Don't allow redefining names from this library. |
if (currentNames.containsKey(export.name)) continue; |
@@ -2770,6 +2791,10 @@ class CodeGenerator extends GeneralizingAstVisitor |
// TODO(jmesserly): we don't track dependencies correctly for these. |
var isJSTopLevel = field.isFinal && _isFinalJSDecl(field); |
if (eagerInit || isJSTopLevel) { |
+ // Remember that we emitted it this way, so re-export can take advantage |
+ // of this fact. |
+ _eagerTopLevelFields.add(element); |
+ |
return annotate( |
js.statement('# = #;', [_emitTopLevelName(element), jsInit]), |
field, |