manually merge static-length
diff --git a/lib/src/codegen/js_codegen.dart b/lib/src/codegen/js_codegen.dart
index 98631ae..65c8fe4 100644
--- a/lib/src/codegen/js_codegen.dart
+++ b/lib/src/codegen/js_codegen.dart
@@ -87,6 +87,7 @@
   final _moduleItems = <JS.Statement>[];
   final _temps = new HashMap<Element, JS.TemporaryId>();
   final _qualifiedIds = new List<Tuple2<Element, JS.MaybeQualifiedId>>();
+  final _topLevelExtensionNames = new Set<String>();
 
   /// The name for the library's exports inside itself.
   /// `exports` was chosen as the most similar to ES module patterns.
@@ -170,6 +171,10 @@
     // Flush any unwritten fields/properties.
     _flushLazyFields(_moduleItems);
     _flushLibraryProperties(_moduleItems);
+     if (_topLevelExtensionNames.isNotEmpty) {
+       _moduleItems.add(_emitExtensionNamesDeclaration(
+           _topLevelExtensionNames.map(js.string).toList()));
+     }
 
     // Mark all qualified names as qualified or not, depending on if they need
     // to be loaded lazily or not.
@@ -210,8 +215,10 @@
     // var jsBin = compiler.options.runnerOptions.v8Binary;
     // String scriptTag = null;
     // if (library.library.scriptTag != null) scriptTag = '/usr/bin/env $jsBin';
+    var jsName = compiler.getModuleName(currentLibrary.source.uri);
+    items.insert(0, js.statement("console.log('Loading ' + #)", [js.string(jsName)]));
     return moduleBuilder.build(
-        compiler.getModuleName(currentLibrary.source.uri),
+        jsName,
         _jsModuleValue,
         _exportsVar,
         items);
@@ -694,6 +701,13 @@
     return _statement(body);
   }
 
+  JS.Statement _emitExtensionNamesDeclaration(List<JS.Expression> names) =>
+      js.statement('dart.defineExtensionNames(#)',
+          [new JS.ArrayInitializer(names.toList(), multiline: true)]);
+
+  JS.Expression _emitExtensionName(String name) =>
+      js.call('dartx.#', _propertyName(name));
+
   /// Emit class members that need to come after the class declaration, such
   /// as static fields. See [_emitClassMethods] for things that are emitted
   /// inside the ES6 `class { ... }` node.
@@ -716,8 +730,7 @@
         }
       }
       if (dartxNames.isNotEmpty) {
-        body.add(js.statement('dart.defineExtensionNames(#)',
-            [new JS.ArrayInitializer(dartxNames, multiline: true)]));
+        body.add(_emitExtensionNamesDeclaration(dartxNames));
       }
     }
 
@@ -1515,7 +1528,7 @@
       jsParams = params;
     }
     JS.Expression gen = new JS.Fun(jsParams, _visit(body), isGenerator: true);
-    if (JS.This.foundIn(gen)) {
+    if (JS.This.foundIn(gen) && options.arrowFnBindThisWorkaround) {
       gen = js.call('#.bind(this)', gen);
     }
     _asyncStarController = savedController;
@@ -3424,8 +3437,14 @@
       bool allowExtensions: true}) {
     // Static members skip the rename steps, except for Function properties.
     if (isStatic) {
-      if (name == 'length' || name == 'name') {
-        return js.call('dartx.#', _propertyName(name));
+      if (options.closure) {
+        // Avoid colliding with Function properties, which might be desirable
+        // in general but is critical to work around a Closure ES6->ES5 bug
+        // (https://github.com/google/closure-compiler/issues/1460).
+        if (invalidStaticFieldName(name, closureCompiler: true)) {
+          _topLevelExtensionNames.add(name);
+          return _emitExtensionName(name);
+        }
       }
       return _propertyName(name);
     }
@@ -3455,7 +3474,7 @@
     if (allowExtensions &&
         _extensionTypes.contains(baseType.element) &&
         !_isObjectProperty(name)) {
-      return js.call('dartx.#', _propertyName(name));
+      return _emitExtensionName(name);
     }
 
     return _propertyName(name);
diff --git a/lib/src/codegen/js_names.dart b/lib/src/codegen/js_names.dart
index a07b1f7..19310da 100644
--- a/lib/src/codegen/js_names.dart
+++ b/lib/src/codegen/js_names.dart
@@ -293,12 +293,20 @@
 
 /// Returns true for invalid static field names in strict mode.
 /// In particular, "caller" "callee" and "arguments" cannot be used.
-bool invalidStaticFieldName(String name) {
+///
+/// [closureCompiler] marks some names as invalid for the purpose of ES6->ES5
+/// lowering with the Closure Compiler.
+bool invalidStaticFieldName(String name, {bool closureCompiler : false}) {
   switch (name) {
     case "arguments":
     case "caller":
     case "callee":
       return true;
+    // Workarounds for Closure:
+    // (see https://github.com/google/closure-compiler/issues/1460)
+    case "name":
+    case "length":
+      return closureCompiler;
   }
   return false;
 }