removed MethodCallBuilder and PlaceholderExpression
diff --git a/lib/src/codegen/backend/backend.dart b/lib/src/codegen/backend/backend.dart
index 567d43b..29c3791 100644
--- a/lib/src/codegen/backend/backend.dart
+++ b/lib/src/codegen/backend/backend.dart
@@ -9,9 +9,7 @@
 
 abstract class Backend {
   LibraryBuilder libraryBuilder(LibraryElement element);
-  MethodCallBuilder methodCallBuilder();
-
-  JS.Expression buildTypeLiteral(JS.TypeRef typeRef);
+  // JS.Expression buildTypeLiteral(JS.TypeRef typeRef);
 }
 
 abstract class LibraryBuilder {
@@ -82,21 +80,3 @@
   addSetter(MethodElement element, JS.Expression name, JS.Fun body) =>
       setters.putIfAbsent(element, () => {})[name] = body;
 }
-
-enum DartMethodCallType {
-  dsend, dcall, directDispatch, staticDispatch
-}
-
-abstract class MethodCallBuilder {
-  /// Can be this, an expression or null (for global functions).
-  JS.Expression target;
-  JS.Expression memberName;
-  final arguments = <JS.Expression>[];
-  /// Prepare for generic method calls.
-  final typeArguments = <JS.TypeRef>[];
-  /// If true, some dynamic call will be needed (which might involve a reference
-  /// to the signature).
-  DartMethodCallType callType;
-
-  JS.Expression build();
-}
diff --git a/lib/src/codegen/backend/es6_backend.dart b/lib/src/codegen/backend/es6_backend.dart
index b82f089..3a6db97 100644
--- a/lib/src/codegen/backend/es6_backend.dart
+++ b/lib/src/codegen/backend/es6_backend.dart
@@ -7,53 +7,16 @@
 
 import 'backend.dart';
 import '../../js/js_ast.dart' as JS;
-import '../../js/precedence.dart';
-import '../../closure/closure_type.dart';
-
-class FileSystem {}
+import '../module_builder.dart';
+import '../../utils.dart' show FileSystem;
 
 class Es6Backend extends Backend {
+  final ModuleBuilder _moduleBuilder;
   final FileSystem _fileSystem;
-  Es6Backend(this._fileSystem);
+  Es6Backend(this._moduleBuilder, this._fileSystem);
 
   LibraryBuilder libraryBuilder(LibraryElement element) =>
       new Es6LibraryBuilder(this, element);
-
-  MethodCallBuilder methodCallBuilder() => new Es6MethodCallBuilder(this);
-
-  TypeRef buildDartTypeRef(DartType type) {
-    // TODO(ochafik)
-  }
-
-  /// Used for interop (imported Closure libs) and for basic types.
-  /// TODO(ochafik): Merge [ClosureType] in this hierarchy.
-  TypeRef buildClosureTypeRef(ClosureType type) {
-    // TODO(ochafik)
-  }
-
-  /// Similar in mind to [MaybeQualifiedId], but not a JS [Node].
-  /// Note: the same type might be imported multiple times with different prefixes(?),
-  /// so a pass might just walk through the imported refs and coalesce them, maybe respecting
-  /// some of the original prefixes, then outputting modules as it wants / replacing
-  /// those refs as needed.
-  TypeRef buildImportedTypeRef(String library, String originalPrefix, String name) {
-    // TODO(ochafik)
-  }
-  /// Reference to a type parameter defined in a Dart class / method.
-  TypeRef buildTypeParamRef(ClassBuilder owner, String name) {
-    // TODO(ochafik)
-  }
-  TypeRef buildGenericTypeRef(TypeRef rawType, List<TypeRef> typeParams) {
-    // TODO(ochafik)
-  }
-  TypeRef buildOpaqueTypeRef(JS.Expression expression) {
-    // TODO(ochafik)
-  }
-}
-
-/// JavaScript type reference.
-class Es6TypeRef extends TypeRef {
-  int get precedenceLevel => EXPRESSION;
 }
 
 class Es6LibraryBuilder extends LibraryBuilder {
@@ -76,7 +39,7 @@
 
   void buildTypedef(
       FunctionTypeAliasElement element,
-      TypeRef returnType, List<TypeRef> paramTypes) {
+      JS.TypeRef returnType, List<JS.TypeRef> paramTypes) {
     // TODO(ochafik)
   }
 
@@ -95,16 +58,3 @@
     // TODO(ochafik)
   }
 }
-
-enum DartMethodCallType {
-  dsend, dcall, directDispatch, staticDispatch
-}
-
-class Es6MethodCallBuilder extends MethodCallBuilder {
-  final Es6Backend _backend;
-  Es6MethodCallBuilder(this._backend);
-
-  JS.Expression build() {
-    // TODO(ochafik)
-  }
-}
diff --git a/lib/src/js/nodes.dart b/lib/src/js/nodes.dart
index 88ecfc8..563a368 100644
--- a/lib/src/js/nodes.dart
+++ b/lib/src/js/nodes.dart
@@ -233,10 +233,10 @@
   T visitDestructuredVariable(DestructuredVariable node) => visitNode(node);
 
   T visitTypeRef(TypeRef node) => visitNode(node);
+  T visitNamedTypeRef(NamedTypeRef node) => visitTypeRef(node);
   T visitGenericTypeRef(GenericTypeRef node) => visitTypeRef(node);
   T visitOptionalTypeRef(OptionalTypeRef node) => visitTypeRef(node);
   T visitRecordTypeRef(RecordTypeRef node) => visitTypeRef(node);
-  T visitNamedTypeRef(NamedTypeRef node) => visitTypeRef(node);
   T visitUnionTypeRef(UnionTypeRef node) => visitTypeRef(node);
   T visitFunctionTypeRef(FunctionTypeRef node) => visitTypeRef(node);
   T visitJsTypeRef(JsTypeRef node) => visitTypeRef(node);
@@ -707,28 +707,6 @@
           [new VariableInitialization(name, this)]).toStatement();
 }
 
-/// Mutable placeholder expression that provides an entry point for simple
-/// AST transforms / expansions.
-///
-/// The data might not be JS [Node] but may contain JS nodes and be visitable.
-class PlaceholderExpression extends Expression {
-  var data;
-  PlaceholderExpression(this.data);
-
-  int get precedenceLevel =>
-      data is Expression ? (data as Expression).precedenceLevel : EXPRESSION;
-
-  @override
-  accept(NodeVisitor visitor) => visitor.visitPlaceholderExpression(this);
-
-  @override
-  void visitChildren(NodeVisitor visitor) {}
-
-  @override
-  Node _clone() =>
-      new PlaceholderExpression(data is Node ? (data as Node)._clone() : data);
-}
-
 class LiteralExpression extends Expression {
   final String template;
   final List<Expression> inputs;
@@ -821,6 +799,8 @@
   final Identifier name;
   final BindingPattern structure;
   final Expression defaultValue;
+  // TODO(ochafik): How does this work?
+  TypeRef get type => null;
   DestructuredVariable({this.name, this.structure, this.defaultValue}) {
     assert(name != null || structure != null);
   }
@@ -1552,6 +1532,7 @@
 class InterpolatedParameter extends Expression with InterpolatedNode
     implements Identifier {
   final nameOrPosition;
+  TypeRef get type => null;
 
   String get name { throw "InterpolatedParameter.name must not be invoked"; }
   bool get allowRename => false;
@@ -1611,6 +1592,7 @@
 class InterpolatedIdentifier extends Expression with InterpolatedNode
     implements Identifier {
   final nameOrPosition;
+  TypeRef get type => null;
 
   InterpolatedIdentifier(this.nameOrPosition);
 
diff --git a/lib/src/js/printer.dart b/lib/src/js/printer.dart
index 8e28bd3..29625d7 100644
--- a/lib/src/js/printer.dart
+++ b/lib/src/js/printer.dart
@@ -1341,6 +1341,11 @@
   visitFunctionTypeRef(FunctionTypeRef node) =>
       _typePrinter.visitFunctionTypeRef(node);
 
+  visitGenericTypeRef(GenericTypeRef node) =>
+      _typePrinter.visitGenericTypeRef(node);
+
+  visitJsTypeRef(JsTypeRef node) =>
+      _typePrinter.visitJsTypeRef(node);
 }
 
 // Collects all the var declarations in the function.  We need to do this in a
diff --git a/lib/src/js/template.dart b/lib/src/js/template.dart
index 0dea734..a08730b 100644
--- a/lib/src/js/template.dart
+++ b/lib/src/js/template.dart
@@ -827,6 +827,27 @@
   Instantiator visitExportClause(ExportClause node) =>
       throw new UnimplementedError();
 
+  Instantiator visitFunctionTypeRef(FunctionTypeRef node) =>
+      throw new UnimplementedError();
+
+  Instantiator visitGenericTypeRef(GenericTypeRef node) =>
+      throw new UnimplementedError();
+
+  Instantiator visitJsTypeRef(JsTypeRef node) =>
+      throw new UnimplementedError();
+
+  Instantiator visitNamedTypeRef(NamedTypeRef node) =>
+      throw new UnimplementedError();
+
+  Instantiator visitOptionalTypeRef(OptionalTypeRef node) =>
+      throw new UnimplementedError();
+
+  Instantiator visitRecordTypeRef(RecordTypeRef node) =>
+      throw new UnimplementedError();
+
+  Instantiator visitUnionTypeRef(UnionTypeRef node) =>
+      throw new UnimplementedError();
+
   @override
   Instantiator visitDestructuredVariable(DestructuredVariable node) {
     Instantiator makeName = visit(node.name);
diff --git a/lib/src/utils.dart b/lib/src/utils.dart
index b1794f6..fd4292e 100644
--- a/lib/src/utils.dart
+++ b/lib/src/utils.dart
@@ -454,6 +454,13 @@
   return parts[1];
 }
 
+// TODO(ochafik): Drop after transformer CL.
+class FileSystem {
+  void writeAsStringSync(String file, String contents) {
+    new File(file).writeAsStringSync(contents);
+  }
+}
+
 /// Simplistic directed graph.
 class DirectedGraph<V> {
   final _adjacencyList = <V, Set<V>>{};