Remove experimental closure support from dartdevc

Change-Id: Id171cbfd220c4b504f13183ffdcad581c44fb41a
Reviewed-on: https://dart-review.googlesource.com/64826
Commit-Queue: Jenny Messerly <jmesserly@google.com>
Reviewed-by: Bob Nystrom <rnystrom@google.com>
diff --git a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
index a0d0b67..c39397d 100644
--- a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
@@ -35,7 +35,6 @@
 import 'package:path/path.dart' as path;
 import 'package:source_span/source_span.dart' show SourceLocation;
 
-import '../closure/closure_annotator.dart' show ClosureAnnotator;
 import '../compiler/js_metalet.dart' as JS;
 import '../compiler/js_names.dart' as JS;
 import '../compiler/js_utils.dart' as JS;
@@ -49,7 +48,6 @@
 import 'error_helpers.dart';
 import 'extension_types.dart' show ExtensionTypeSet;
 import 'js_interop.dart';
-import 'js_typeref_codegen.dart' show JSTypeRefCodegen;
 import 'js_typerep.dart';
 import 'module_compiler.dart' show BuildUnit, CompilerOptions, JSModuleFile;
 import 'nullable_type_inference.dart' show NullableTypeInference;
@@ -74,11 +72,7 @@
 // expressions (which result in JS.Expression) and statements
 // (which result in (JS.Statement).
 class CodeGenerator extends Object
-    with
-        ClosureAnnotator,
-        JSTypeRefCodegen,
-        NullableTypeInference,
-        SharedCompiler<LibraryElement>
+    with NullableTypeInference, SharedCompiler<LibraryElement>
     implements AstVisitor<JS.Node> {
   final AnalysisContext context;
   final SummaryDataStore summaryData;
@@ -871,13 +865,10 @@
       }
     }
 
-    JS.Expression body = closureAnnotate(
-        runtimeCall('typedef(#, () => #)', [
-          js.string(element.name, "'"),
-          _emitFunctionType(type, nameType: false)
-        ]),
-        element,
-        node);
+    JS.Expression body = runtimeCall('typedef(#, () => #)', [
+      js.string(element.name, "'"),
+      _emitFunctionType(type, nameType: false)
+    ]);
 
     if (typeFormals.isNotEmpty) {
       return _defineClassTypeArguments(element, typeFormals,
@@ -1231,19 +1222,6 @@
         .toList(growable: false);
   }
 
-  /// Emits a field declaration for TypeScript & Closure's ES6_TYPED
-  /// (e.g. `class Foo { i: string; }`)
-  JS.VariableDeclarationList _emitTypeScriptField(FieldElement field) {
-    return JS.VariableDeclarationList(field.isStatic ? 'static' : null, [
-      JS.VariableInitialization(
-          JS.Identifier(
-              // TODO(ochafik): use a refactored _emitMemberName instead.
-              field.name,
-              type: emitTypeRef(field.type)),
-          null)
-    ]);
-  }
-
   @override
   JS.Statement visitEnumDeclaration(EnumDeclaration node) {
     return _emitClassDeclaration(node, node.element, []);
@@ -1279,19 +1257,12 @@
       JS.Expression className,
       JS.Expression heritage,
       List<JS.Method> methods) {
-    var typeParams = _emitTypeFormals(classElem.typeParameters);
-
-    var jsFields = options.closure
-        ? classElem.fields.map(_emitTypeScriptField).toList()
-        : null;
     if (classElem.typeParameters.isNotEmpty) {
-      return JS.ClassExpression(className as JS.Identifier, heritage, methods,
-              typeParams: typeParams, fields: jsFields)
+      return JS.ClassExpression(className as JS.Identifier, heritage, methods)
           .toStatement();
     }
-    var classExpr = JS.ClassExpression(
-        JS.TemporaryId(classElem.name), heritage, methods,
-        typeParams: typeParams, fields: jsFields);
+    var classExpr =
+        JS.ClassExpression(JS.TemporaryId(classElem.name), heritage, methods);
     return js.statement('# = #;', [className, classExpr]);
   }
 
@@ -1648,8 +1619,7 @@
           body.add(js.statement(
               'return super.#(#)(#);', [name, typeFormals, jsParams]));
         }
-        var fn = JS.Fun(jsParams, JS.Block(body),
-            typeParams: typeFormals, returnType: emitTypeRef(type.returnType));
+        var fn = JS.Fun(jsParams, JS.Block(body));
         methods.add(JS.Method(name, fn));
       } else {
         throw StateError(
@@ -1664,7 +1634,6 @@
     if (isUnsupportedFactoryConstructor(node)) return null;
 
     var element = node.element;
-    var returnType = emitTypeRef(element.returnType);
     var name = _constructorName(element.name);
     JS.Fun fun;
 
@@ -1687,8 +1656,7 @@
             js.statement('return $newKeyword #(#)',
                 [visitConstructorName(redirect), params])
               ..sourceInformation = _nodeStart(redirect)
-          ]),
-          returnType: returnType);
+          ]));
     } else {
       // Normal factory constructor
       var body = <JS.Statement>[];
@@ -1697,16 +1665,13 @@
       body.add(_visitStatement(node.body));
 
       var params = _emitParameters(node.parameters?.parameters);
-      fun = JS.Fun(params, JS.Block(body), returnType: returnType);
+      fun = JS.Fun(params, JS.Block(body));
     }
 
     _currentFunction = savedFunction;
 
-    return closureAnnotate(
-        JS.Method(name, fun, isStatic: true)
-          ..sourceInformation = _functionEnd(node),
-        element,
-        node);
+    return JS.Method(name, fun, isStatic: true)
+      ..sourceInformation = _functionEnd(node);
   }
 
   /// Given a class C that implements method M from interface I, but does not
@@ -1784,7 +1749,7 @@
     return JS.Method(
         _declareMemberName(method,
             useExtension: _extensionTypes.isNativeClass(type.element)),
-        JS.Fun(fnArgs, fnBlock, typeParams: typeParams),
+        JS.Fun(fnArgs, fnBlock),
         isGetter: method is PropertyAccessorElement && method.isGetter,
         isSetter: method is PropertyAccessorElement && method.isSetter,
         isStatic: false);
@@ -2630,14 +2595,11 @@
       fn = _emitFunction(node.element, node.parameters, node.body);
     }
 
-    return closureAnnotate(
-        JS.Method(_declareMemberName(node.element), fn,
-            isGetter: node.isGetter,
-            isSetter: node.isSetter,
-            isStatic: node.isStatic)
-          ..sourceInformation = _functionEnd(node),
-        node.element,
-        node);
+    return JS.Method(_declareMemberName(node.element), fn,
+        isGetter: node.isGetter,
+        isSetter: node.isSetter,
+        isStatic: node.isStatic)
+      ..sourceInformation = _functionEnd(node);
   }
 
   @override
@@ -2683,8 +2645,7 @@
 
     var element = resolutionMap.elementDeclaredByFunctionDeclaration(node);
     var nameExpr = _emitTopLevelName(element);
-    body.add(
-        closureAnnotate(js.statement('# = #', [nameExpr, fn]), element, node));
+    body.add(js.statement('# = #', [nameExpr, fn]));
     // Function types of top-level/static functions are only needed when
     // dart:mirrors is enabled.
     // TODO(jmesserly): do we even need this for mirrors, since statics are not
@@ -2718,13 +2679,10 @@
 
   JS.Method _emitTopLevelProperty(FunctionDeclaration node) {
     var name = node.name.name;
-    return closureAnnotate(
-        JS.Method(_propertyName(name),
-            _emitFunctionExpression(node.functionExpression),
-            isGetter: node.isGetter, isSetter: node.isSetter)
-          ..sourceInformation = _functionEnd(node),
-        node.element,
-        node);
+    return JS.Method(
+        _propertyName(name), _emitFunctionExpression(node.functionExpression),
+        isGetter: node.isGetter, isSetter: node.isSetter)
+      ..sourceInformation = _functionEnd(node);
   }
 
   bool _executesAtTopLevel(AstNode node) {
@@ -2788,8 +2746,7 @@
 
     // Convert `function(...) { ... }` to `(...) => ...`
     // This is for readability, but it also ensures correct `this` binding.
-    return JS.ArrowFun(f.params, body,
-        typeParams: f.typeParams, returnType: f.returnType);
+    return JS.ArrowFun(f.params, body);
   }
 
   /// Emits a non-arrow FunctionExpression node.
@@ -2824,8 +2781,7 @@
           ]);
 
     code = super.exitFunction(element.name, formals, code);
-    return JS.Fun(formals, code,
-        typeParams: typeFormals, returnType: emitTypeRef(type.returnType));
+    return JS.Fun(formals, code);
   }
 
   JS.Block _emitFunctionBody(ExecutableElement element,
@@ -2897,8 +2853,7 @@
       // TODO(jmesserly): this will emit argument initializers (for default
       // values) inside the generator function body. Is that the best place?
       var jsBody = _emitFunctionBody(element, parameters, body);
-      var genFn = JS.Fun(jsParams, jsBody,
-          isGenerator: true, returnType: emitTypeRef(returnType));
+      var genFn = JS.Fun(jsParams, jsBody, isGenerator: true);
 
       // Name the function if possible, to get better stack traces.
       var name = element.name;
@@ -3132,9 +3087,8 @@
     return JS.PropertyAccess(target, member);
   }
 
-  JS.Identifier _emitVariableDef(SimpleIdentifier id, {JS.TypeRef type}) {
-    return JS.Identifier(id.name, type: type)
-      ..sourceInformation = _nodeStart(id);
+  JS.Identifier _emitVariableDef(SimpleIdentifier id) {
+    return JS.Identifier(id.name)..sourceInformation = _nodeStart(id);
   }
 
   /// Returns `true` if the type name referred to by [node] is used in a
@@ -3175,8 +3129,7 @@
           element, () => JS.TemporaryId(element.name.substring(1)));
     }
 
-    var type = declaration ? emitTypeRef(element.type) : null;
-    return JS.Identifier(element.name, type: type);
+    return JS.Identifier(element.name);
   }
 
   List<Annotation> _parameterMetadata(FormalParameter p) =>
@@ -4272,8 +4225,7 @@
       return null;
     }
 
-    var name =
-        _emitVariableDef(node.name, type: emitTypeRef(node.element.type));
+    var name = _emitVariableDef(node.name);
     return JS.VariableInitialization(
         name, _visitInitializer(node.initializer, node.element));
   }
@@ -4300,13 +4252,10 @@
           _isJSInvocation(init) ||
           init is InstanceCreationExpression &&
               isSdkInternalRuntime(init.staticElement.library)) {
-        moduleItems.add(closureAnnotate(
-            js.statement('# = #;', [
-              _emitTopLevelName(field.element),
-              _visitInitializer(field.initializer, field.element)
-            ]),
-            field.element,
-            field));
+        moduleItems.add(js.statement('# = #;', [
+          _emitTopLevelName(field.element),
+          _visitInitializer(field.initializer, field.element)
+        ]));
       } else {
         lazyFields.add(field);
       }
@@ -4332,41 +4281,24 @@
     for (var node in fields) {
       var element = node.element;
       var access = emitFieldName(element);
-      accessors.add(closureAnnotate(
-          JS.Method(
-              access,
-              js.call('function() { return #; }',
-                  _visitInitializer(node.initializer, element)) as JS.Fun,
-              isGetter: true)
-            ..sourceInformation =
-                _hoverComment(JS.PropertyAccess(objExpr, access), node.name),
-          _findAccessor(element, getter: true),
-          node));
+      accessors.add(JS.Method(
+          access,
+          js.call('function() { return #; }',
+              _visitInitializer(node.initializer, element)) as JS.Fun,
+          isGetter: true)
+        ..sourceInformation =
+            _hoverComment(JS.PropertyAccess(objExpr, access), node.name));
 
       // TODO(jmesserly): currently uses a dummy setter to indicate writable.
       if (!node.isFinal && !node.isConst) {
-        accessors.add(closureAnnotate(
-            JS.Method(access, js.call('function(_) {}') as JS.Fun,
-                isSetter: true),
-            _findAccessor(element, getter: false),
-            node));
+        accessors.add(JS.Method(access, js.call('function(_) {}') as JS.Fun,
+            isSetter: true));
       }
     }
 
     return runtimeStatement('defineLazy(#, { # })', [objExpr, accessors]);
   }
 
-  PropertyAccessorElement _findAccessor(VariableElement element,
-      {bool getter}) {
-    var parent = element.enclosingElement;
-    if (parent is ClassElement) {
-      return getter
-          ? parent.getGetter(element.name)
-          : parent.getSetter(element.name);
-    }
-    return null;
-  }
-
   JS.Expression _emitConstructorName(DartType type, String name) {
     return _emitJSInterop(type.element) ??
         JS.PropertyAccess(_emitConstructorAccess(type), _constructorName(name));
@@ -6219,15 +6151,6 @@
             () => JS.TemporaryId(jsLibraryName(_libraryRoot, library)));
   }
 
-  T closureAnnotate<T extends JS.Node>(
-      T node, Element element, AnnotatedNode original) {
-    if (options.closure) {
-      node.closureAnnotation =
-          closureAnnotationFor(node, original, element, namedArgumentTemp.name);
-    }
-    return node;
-  }
-
   /// Return true if this is one of the methods/properties on all Dart Objects
   /// (toString, hashCode, noSuchMethod, runtimeType).
   ///
diff --git a/pkg/dev_compiler/lib/src/analyzer/js_typeref_codegen.dart b/pkg/dev_compiler/lib/src/analyzer/js_typeref_codegen.dart
deleted file mode 100644
index fd61c5a..0000000
--- a/pkg/dev_compiler/lib/src/analyzer/js_typeref_codegen.dart
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
-
-import '../js_ast/js_ast.dart' as JS;
-import 'module_compiler.dart' show CompilerOptions;
-import 'js_interop.dart';
-
-/// Mixin with logic to generate [TypeRef]s out of [DartType]s.
-abstract class JSTypeRefCodegen {
-  final _resolved = <DartType, JS.TypeRef>{};
-
-  // Mixin dependencies:
-  CompilerOptions get options;
-  TypeProvider get types;
-  LibraryElement get dartJSLibrary;
-  JS.Identifier get namedArgumentTemp;
-  JS.Identifier emitLibraryName(LibraryElement e);
-
-  /// Finds the qualified path to the type.
-  JS.TypeRef _emitTopLevelTypeRef(DartType type) {
-    var e = type.element;
-    return JS.TypeRef.qualified([
-      emitLibraryName(e.library),
-      JS.Identifier(getJSExportName(e) ?? e.name)
-    ]);
-  }
-
-  JS.TypeRef emitTypeRef(DartType type) {
-    if (!options.closure) return null;
-
-    return _resolved.putIfAbsent(type, () {
-      if (type == null) JS.TypeRef.unknown();
-      // TODO(ochafik): Consider calling _loader.declareBeforeUse(type.element).
-      if (type.isBottom || type.isDynamic) JS.TypeRef.any();
-      if (type.isVoid) return JS.TypeRef.void_();
-
-      if (type == types.intType) return JS.TypeRef.number().orNull();
-      if (type == types.numType) return JS.TypeRef.number().orNull();
-      if (type == types.doubleType) return JS.TypeRef.number().orNull();
-      if (type == types.boolType) return JS.TypeRef.boolean().orNull();
-      if (type == types.stringType) return JS.TypeRef.string();
-
-      if (type is TypeParameterType) return JS.TypeRef.named(type.name);
-      if (type is ParameterizedType) {
-        JS.TypeRef rawType;
-        if (type is FunctionType && type.name == null) {
-          var args = <JS.Identifier, JS.TypeRef>{};
-          for (var param in type.parameters) {
-            if (param.isNamed) break;
-            var type = emitTypeRef(param.type);
-            args[JS.Identifier(param.name)] =
-                param.isPositional ? type.toOptional() : type;
-          }
-          var namedParamType = emitNamedParamsArgType(type.parameters);
-          if (namedParamType != null) {
-            args[namedArgumentTemp] = namedParamType.toOptional();
-          }
-
-          rawType = JS.TypeRef.function(emitTypeRef(type.returnType), args);
-        } else {
-          var jsTypeRef = _getDartJsTypeRef(type);
-          if (jsTypeRef != null) return jsTypeRef;
-
-          rawType = _emitTopLevelTypeRef(type);
-        }
-        var typeArgs = _getOwnTypeArguments(type).map(emitTypeRef);
-        return typeArgs.isEmpty
-            ? rawType
-            : JS.TypeRef.generic(rawType, typeArgs);
-      }
-      return JS.TypeRef.unknown();
-    });
-  }
-
-  JS.TypeRef emitNamedParamsArgType(Iterable<ParameterElement> params) {
-    if (!options.closure) return null;
-
-    var namedArgs = <JS.Identifier, JS.TypeRef>{};
-    for (ParameterElement param in params) {
-      if (param.isPositional) continue;
-      namedArgs[JS.Identifier(param.name)] =
-          emitTypeRef(param.type).toOptional();
-    }
-    if (namedArgs.isEmpty) return null;
-    return JS.TypeRef.record(namedArgs);
-  }
-
-  /// Gets the "own" type arguments of [type].
-  ///
-  /// Method argument with adhoc unnamed [FunctionType] inherit any type params
-  /// from their enclosing class:
-  ///
-  ///      class Foo<T> {
-  ///        void method(f()); // f has [T] as type arguments,
-  ///      }                   // but [] as its "own" type arguments.
-  Iterable<DartType> _getOwnTypeArguments(ParameterizedType type) sync* {
-    for (int i = 0, n = type.typeParameters.length; i < n; i++) {
-      if (type.typeParameters[i].enclosingElement == type.element) {
-        yield type.typeArguments[i];
-      }
-    }
-  }
-
-  /// Special treatment of types from dart:js
-  /// TODO(ochafik): Is this the right thing to do? And what about package:js?
-  JS.TypeRef _getDartJsTypeRef(DartType type) {
-    if (type.element.library == dartJSLibrary) {
-      switch (type.name) {
-        case 'JsArray':
-          return JS.TypeRef.array(
-              type is InterfaceType && type.typeArguments.length == 1
-                  ? emitTypeRef(type.typeArguments.single)
-                  : null);
-        case 'JsObject':
-          return JS.TypeRef.object();
-        case 'JsFunction':
-          return JS.TypeRef.function();
-      }
-    }
-    return null;
-  }
-}
diff --git a/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart b/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
index 676b721..74fea79 100644
--- a/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
@@ -6,8 +6,7 @@
 import 'dart:convert' show json;
 import 'dart:io' show File;
 
-import 'package:analyzer/analyzer.dart'
-    show AnalysisError, CompilationUnit, ErrorSeverity;
+import 'package:analyzer/analyzer.dart' show AnalysisError, CompilationUnit;
 import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/dart/element/element.dart'
     show LibraryElement, UriReferencedElement;
@@ -16,7 +15,6 @@
     show PhysicalResourceProvider;
 import 'package:analyzer/src/context/builder.dart' show ContextBuilder;
 import 'package:analyzer/src/context/context.dart' show AnalysisContextImpl;
-import 'package:analyzer/src/error/codes.dart' show StaticTypeWarningCode;
 import 'package:analyzer/src/generated/engine.dart'
     show AnalysisContext, AnalysisEngine;
 import 'package:analyzer/src/generated/sdk.dart' show DartSdkManager;
@@ -129,21 +127,6 @@
     return ModuleCompiler._(context, summaryData);
   }
 
-  bool _isFatalError(AnalysisError e, CompilerOptions options) {
-    if (errorSeverity(context, e) != ErrorSeverity.ERROR) return false;
-
-    // These errors are not fatal in the REPL compile mode as we
-    // allow access to private members across library boundaries
-    // and those accesses will show up as undefined members unless
-    // additional analyzer changes are made to support them.
-    // TODO(jacobr): consider checking that the identifier name
-    // referenced by the error is private.
-    return !options.replCompile ||
-        (e.errorCode != StaticTypeWarningCode.UNDEFINED_GETTER &&
-            e.errorCode != StaticTypeWarningCode.UNDEFINED_SETTER &&
-            e.errorCode != StaticTypeWarningCode.UNDEFINED_METHOD);
-  }
-
   /// Compiles a single Dart build unit into a JavaScript module.
   ///
   /// *Warning* - this may require resolving the entire world.
@@ -263,9 +246,6 @@
   /// to private members across library boundaries.
   final bool replCompile;
 
-  /// Whether to emit Closure Compiler-friendly code.
-  final bool closure;
-
   /// Mapping from absolute file paths to bazel short path to substitute in
   /// source maps.
   final Map<String, String> bazelMapping;
@@ -284,7 +264,6 @@
       this.replCompile = false,
       this.emitMetadata = false,
       this.enableAsserts = true,
-      this.closure = false,
       this.bazelMapping = const {},
       this.summaryOutPath});
 
@@ -298,7 +277,6 @@
         replCompile = args['repl-compile'] as bool,
         emitMetadata = args['emit-metadata'] as bool,
         enableAsserts = args['enable-asserts'] as bool,
-        closure = args['closure-experimental'] as bool,
         bazelMapping =
             _parseBazelMappings(args['bazel-mapping'] as List<String>),
         summaryOutPath = args['summary-out'] as String;
@@ -432,9 +410,7 @@
   JSModuleCode getCode(ModuleFormat format, String jsUrl, String mapUrl,
       {bool singleOutFile = false}) {
     var opts = JS.JavaScriptPrintingOptions(
-        emitTypes: options.closure,
-        allowKeywordsInProperties: true,
-        allowSingleLineIfStatements: true);
+        allowKeywordsInProperties: true, allowSingleLineIfStatements: true);
     JS.SimpleJavaScriptPrintingContext printer;
     SourceMapBuilder sourceMap;
     if (options.sourceMap) {
diff --git a/pkg/dev_compiler/lib/src/closure/closure_annotation.dart b/pkg/dev_compiler/lib/src/closure/closure_annotation.dart
deleted file mode 100644
index 7274d65..0000000
--- a/pkg/dev_compiler/lib/src/closure/closure_annotation.dart
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import '../js_ast/js_ast.dart' as JS show TypeRef, ClosureTypePrinter;
-
-/// Set of closure annotations that can be [toString]ed to a single JsDoc comment.
-/// See https://developers.google.com/closure/compiler/docs/js-for-compiler
-///
-/// TODO(ochafik): Support inclusion of 'normal' comments (including @param comments).
-class ClosureAnnotation {
-  final String comment;
-  final bool isConst;
-  final bool isConstructor;
-  final bool isFinal;
-  final bool isNoCollapse;
-  final bool isNoSideEffects;
-  final bool isOverride;
-  final bool isPrivate;
-  final bool isProtected;
-  final bool isStruct;
-  final bool isTypedef;
-  final JS.TypeRef lendsToType;
-  final JS.TypeRef returnType;
-  final JS.TypeRef superType;
-  final JS.TypeRef thisType;
-  final JS.TypeRef throwsType;
-  final JS.TypeRef type;
-  final List<JS.TypeRef> interfaces;
-  final List<String> templates;
-  final Map<String, JS.TypeRef> paramTypes;
-
-  ClosureAnnotation(
-      {this.comment,
-      this.interfaces = const [],
-      this.isConst = false,
-      this.isConstructor = false,
-      this.isFinal = false,
-      this.isNoCollapse = false,
-      this.isNoSideEffects = false,
-      this.isOverride = false,
-      this.isPrivate = false,
-      this.isProtected = false,
-      this.isStruct = false,
-      this.isTypedef = false,
-      this.lendsToType,
-      this.paramTypes = const {},
-      this.returnType,
-      this.superType,
-      this.templates = const [],
-      this.thisType,
-      this.throwsType,
-      this.type});
-
-  @override
-  int get hashCode => _cachedString.hashCode;
-
-  @override
-  bool operator ==(other) =>
-      other is ClosureAnnotation && _cachedString == other._cachedString;
-
-  @override
-  String toString([String indent = '']) =>
-      _cachedString.replaceAll('\n', '\n$indent');
-
-  String _print(JS.TypeRef t) => (JS.ClosureTypePrinter()..visit(t)).toString();
-
-  String __cachedString;
-  String get _cachedString {
-    if (__cachedString == null) {
-      bool isNonWildcard(JS.TypeRef t) => t != null && !t.isAny && !t.isUnknown;
-
-      var lines = <String>[];
-      if (comment != null) lines.addAll(comment.split('\n'));
-      if (templates != null && templates.isNotEmpty) {
-        lines.add('@template ${templates.join(', ')}');
-      }
-      if (thisType != null) lines.add('@this {${_print(thisType)}}');
-      if (isOverride) lines.add('@override');
-      if (isNoSideEffects) lines.add('@nosideeffects');
-      if (isNoCollapse) lines.add('@nocollapse');
-      if (lendsToType != null) lines.add('@lends {${_print(lendsToType)}}');
-
-      {
-        var typeHolders = <String>[];
-        if (isPrivate) typeHolders.add('@private');
-        if (isProtected) typeHolders.add('@protected');
-        if (isFinal) typeHolders.add('@final');
-        if (isConst) typeHolders.add('@const');
-        if (isTypedef) typeHolders.add('@typedef');
-        if (isNonWildcard(type)) {
-          if (typeHolders.isEmpty) typeHolders.add('@type');
-          typeHolders.add('{${_print(type)}}');
-        }
-        if (!typeHolders.isEmpty) lines.add(typeHolders.join(' '));
-      }
-
-      {
-        List constructorLine = [];
-        if (isConstructor) constructorLine.add('@constructor');
-        if (isStruct) constructorLine.add('@struct');
-        if (isNonWildcard(superType)) {
-          constructorLine.add('@extends {${_print(superType)}}');
-        }
-
-        if (constructorLine.isNotEmpty) lines.add(constructorLine.join(' '));
-      }
-
-      if (interfaces != null) {
-        for (var interface in interfaces) {
-          if (isNonWildcard(interface))
-            lines.add('@implements {${_print(interface)}}');
-        }
-      }
-
-      if (paramTypes != null) {
-        paramTypes.forEach((String paramName, JS.TypeRef paramType) {
-          // Must output params even with wildcard type.
-          lines.add('@param {${_print(paramType)}} $paramName');
-        });
-      }
-      if (isNonWildcard(returnType))
-        lines.add('@return {${_print(returnType)}}');
-      if (isNonWildcard(throwsType))
-        lines.add('@throws {${_print(throwsType)}}');
-
-      if (lines.length == 0) return '';
-      if (lines.length == 1) return '/** ${lines.single} */';
-      __cachedString = '/**\n' + lines.map((l) => ' * $l').join('\n') + '\n */';
-    }
-    return __cachedString;
-  }
-}
diff --git a/pkg/dev_compiler/lib/src/closure/closure_annotator.dart b/pkg/dev_compiler/lib/src/closure/closure_annotator.dart
deleted file mode 100644
index 133aae2..0000000
--- a/pkg/dev_compiler/lib/src/closure/closure_annotator.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
-
-import '../js_ast/js_ast.dart' as JS show Node, TypeRef;
-
-import 'closure_annotation.dart';
-
-/// Mixin that can generate [ClosureAnnotation]s for Dart elements and types.
-abstract class ClosureAnnotator {
-  TypeProvider get types;
-
-  JS.TypeRef emitTypeRef(DartType type);
-
-  // TODO(ochafik): Handle destructured params when Closure supports it.
-  ClosureAnnotation closureAnnotationFor(JS.Node node, AnnotatedNode original,
-      Element e, String namedArgsMapName) {
-    // Note: Dart and Closure privacy are not compatible: don't set `isPrivate: e.isPrivate`.
-    return ClosureAnnotation(
-        comment: original?.documentationComment?.toSource(),
-        // Note: we don't set isConst here because Closure's constness and
-        // Dart's are not really compatible.
-        isFinal: e is VariableElement && (e.isFinal || e.isConst),
-        type: e is VariableElement
-            ? emitTypeRef(e.type /*, forceTypeDefExpansion: true*/)
-            : null,
-        superType: e is ClassElement ? emitTypeRef(e.supertype) : null,
-        interfaces:
-            e is ClassElement ? e.interfaces.map(emitTypeRef).toList() : null,
-        isOverride: e.isOverride,
-        isTypedef: e is FunctionTypeAliasElement);
-  }
-}
diff --git a/pkg/dev_compiler/lib/src/closure/closure_type.dart b/pkg/dev_compiler/lib/src/closure/closure_type.dart
deleted file mode 100644
index bc29be0..0000000
--- a/pkg/dev_compiler/lib/src/closure/closure_type.dart
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Poor-man's representation of a Closure type.
-/// See https://developers.google.com/closure/compiler/docs/js-for-compiler
-///
-/// The goal here is not to completely support Closure's type system, but to
-/// be able to generate just the types needed for DDC's JS output.
-///
-/// TODO(ochafik): Consider convergence with TypeScript, which has no nullability-awareness
-/// (see http://www.typescriptlang.org/Handbook).
-class ClosureType {
-  static const ClosureType _ALL = ClosureType._("*");
-  static const ClosureType _UNKNOWN = ClosureType._("?");
-
-  final String _representation;
-  final bool isNullable;
-
-  const ClosureType._(this._representation, {this.isNullable = true});
-
-  bool get isAll => _representation == "*";
-  bool get isUnknown => _representation == "?";
-
-  @override
-  toString() => _representation;
-
-  factory ClosureType.all() => _ALL;
-  factory ClosureType.unknown() => _UNKNOWN;
-
-  factory ClosureType.record(Map<String, ClosureType> fieldTypes) {
-    var entries = <String>[];
-    fieldTypes.forEach((n, t) => entries.add('$n: $t'));
-    return ClosureType._('{${entries.join(', ')}}');
-  }
-  factory ClosureType.function(
-      [List<ClosureType> paramTypes, ClosureType returnType]) {
-    if (paramTypes == null && returnType == null) {
-      return ClosureType.type("Function");
-    }
-    var suffix = returnType == null ? '' : ':$returnType';
-    return ClosureType._(
-        'function(${paramTypes == null ? '...*' : paramTypes.join(', ')})$suffix');
-  }
-
-  factory ClosureType.map([ClosureType keyType, ClosureType valueType]) =>
-      ClosureType._("Object<${keyType ?? _ALL}, ${valueType ?? _ALL}>");
-
-  factory ClosureType.type([String className = "Object"]) =>
-      ClosureType._(className);
-
-  factory ClosureType.array([ClosureType componentType]) =>
-      ClosureType._("Array<${componentType ?? _ALL}>");
-
-  factory ClosureType.undefined() =>
-      ClosureType._("undefined", isNullable: false);
-  factory ClosureType.number() => ClosureType._("number", isNullable: false);
-  factory ClosureType.boolean() => ClosureType._("boolean", isNullable: false);
-  factory ClosureType.string() => ClosureType._("string");
-
-  ClosureType toOptional() => ClosureType._("$this=");
-
-  ClosureType toNullable() => isNullable
-      ? this
-      : ClosureType._(
-          _representation.startsWith('!')
-              ? _representation.substring(1)
-              : "?$this",
-          isNullable: true);
-
-  ClosureType toNonNullable() => !isNullable
-      ? this
-      : ClosureType._(
-          _representation.startsWith('?')
-              ? _representation.substring(1)
-              : "!$this",
-          isNullable: false);
-
-  /// TODO(ochafik): See which optimizations make sense here (it could be that `(*|undefined)`
-  /// cannot be optimized to `*` when used to model optional record fields).
-  ClosureType or(ClosureType other) => ClosureType._("($this|$other)",
-      isNullable: isNullable || other.isNullable);
-
-  ClosureType orUndefined() => or(ClosureType.undefined());
-}
diff --git a/pkg/dev_compiler/lib/src/compiler/js_utils.dart b/pkg/dev_compiler/lib/src/compiler/js_utils.dart
index 76686c0..a0275c6 100644
--- a/pkg/dev_compiler/lib/src/compiler/js_utils.dart
+++ b/pkg/dev_compiler/lib/src/compiler/js_utils.dart
@@ -17,8 +17,7 @@
           innerFun.params.isEmpty) {
         var body = innerFun.body;
         if (body is Block) {
-          return Fun(fn.params, body,
-              typeParams: fn.typeParams, returnType: fn.returnType);
+          return Fun(fn.params, body);
         }
       }
     }
diff --git a/pkg/dev_compiler/lib/src/js_ast/js_ast.dart b/pkg/dev_compiler/lib/src/js_ast/js_ast.dart
index 21eadd3..ee8289e 100644
--- a/pkg/dev_compiler/lib/src/js_ast/js_ast.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/js_ast.dart
@@ -6,11 +6,8 @@
 
 import 'precedence.dart';
 import 'characters.dart' as charCodes;
-import '../closure/closure_annotation.dart';
 
 part 'nodes.dart';
 part 'builder.dart';
-part 'js_types.dart';
 part 'printer.dart';
 part 'template.dart';
-part 'type_printer.dart';
diff --git a/pkg/dev_compiler/lib/src/js_ast/js_types.dart b/pkg/dev_compiler/lib/src/js_ast/js_types.dart
deleted file mode 100644
index e45c96c..0000000
--- a/pkg/dev_compiler/lib/src/js_ast/js_types.dart
+++ /dev/null
@@ -1,202 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of js_ast;
-
-final _any = AnyTypeRef._();
-final _unknown = UnknownTypeRef._();
-final _null = NullTypeRef();
-
-/// JavaScript type reference, designed to support a subset of the type systems
-/// of the Closure Compiler and TypeScript:
-/// - https://developers.google.com/closure/compiler/docs/js-for-compiler#types
-/// - https://github.com/Microsoft/TypeScript/blob/v1.8.0-beta/doc/spec.md#3
-///
-/// Note that some subtleties like "nullability" or "optionality" are handled
-/// using unions (with a [NullTypeRef] or with an "undefined" named typeref).
-/// Also, primitives aren't modeled differently than named / qualified types,
-/// as it brings little value for now. Primitive-specific type formatting is
-/// handled by the type printers (for instance, the knowledge that
-/// `number|null` is just `number` in TypeScript, and is `number?` in Closure).
-abstract class TypeRef extends Expression {
-  int get precedenceLevel => PRIMARY;
-
-  TypeRef();
-
-  factory TypeRef.any() => _any;
-
-  factory TypeRef.void_() => TypeRef.named('void');
-
-  factory TypeRef.unknown() => _unknown;
-
-  factory TypeRef.generic(TypeRef rawType, Iterable<TypeRef> typeArgs) {
-    if (typeArgs.isEmpty) {
-      throw ArgumentError.value(typeArgs, "typeArgs", "is empty");
-    }
-    return GenericTypeRef(rawType, typeArgs.toList());
-  }
-
-  factory TypeRef.array([TypeRef elementType]) => ArrayTypeRef(elementType);
-
-  factory TypeRef.object([TypeRef keyType, TypeRef valueType]) {
-    // TODO(ochafik): Roll out a dedicated ObjectTypeRef?
-    var rawType = TypeRef.named('Object');
-    return keyType == null && valueType == null
-        ? rawType
-        : GenericTypeRef(rawType, [keyType ?? _any, valueType ?? _any]);
-  }
-
-  factory TypeRef.function(
-          [TypeRef returnType, Map<Identifier, TypeRef> paramTypes]) =>
-      FunctionTypeRef(returnType, paramTypes);
-
-  factory TypeRef.record(Map<Identifier, TypeRef> types) =>
-      RecordTypeRef(types);
-
-  factory TypeRef.string() => TypeRef.named('string');
-
-  factory TypeRef.number() => TypeRef.named('number');
-
-  factory TypeRef.undefined() => TypeRef.named('undefined');
-
-  factory TypeRef.boolean() => TypeRef.named('boolean');
-
-  factory TypeRef.qualified(List<Identifier> path) => QualifiedTypeRef(path);
-
-  factory TypeRef.named(String name) =>
-      TypeRef.qualified(<Identifier>[Identifier(name)]);
-
-  bool get isAny => this is AnyTypeRef;
-  bool get isUnknown => this is UnknownTypeRef;
-  bool get isNull => this is NullTypeRef;
-
-  TypeRef or(TypeRef other) => UnionTypeRef([this, other]);
-
-  TypeRef orUndefined() => or(TypeRef.undefined());
-  TypeRef orNull() => or(_null);
-
-  TypeRef toOptional() => OptionalTypeRef(this);
-}
-
-class AnyTypeRef extends TypeRef {
-  AnyTypeRef._() : super();
-
-  factory AnyTypeRef() => _any;
-  T accept<T>(NodeVisitor<T> visitor) => visitor.visitAnyTypeRef(this);
-  void visitChildren(NodeVisitor visitor) {}
-  _clone() => AnyTypeRef();
-}
-
-class NullTypeRef extends QualifiedTypeRef {
-  NullTypeRef() : super([Identifier("null")]);
-  _clone() => NullTypeRef();
-}
-
-class UnknownTypeRef extends TypeRef {
-  UnknownTypeRef._() : super();
-
-  factory UnknownTypeRef() => _unknown;
-  T accept<T>(NodeVisitor<T> visitor) => visitor.visitUnknownTypeRef(this);
-  void visitChildren(NodeVisitor visitor) {}
-  _clone() => UnknownTypeRef();
-}
-
-class QualifiedTypeRef extends TypeRef {
-  final List<Identifier> path;
-  QualifiedTypeRef(this.path);
-
-  T accept<T>(NodeVisitor<T> visitor) => visitor.visitQualifiedTypeRef(this);
-  void visitChildren(NodeVisitor visitor) =>
-      path.forEach((p) => p.accept(visitor));
-  _clone() => QualifiedTypeRef(path);
-}
-
-class ArrayTypeRef extends TypeRef {
-  final TypeRef elementType;
-  ArrayTypeRef(this.elementType);
-  T accept<T>(NodeVisitor<T> visitor) => visitor.visitArrayTypeRef(this);
-  void visitChildren(NodeVisitor visitor) {
-    elementType.accept(visitor);
-  }
-
-  _clone() => ArrayTypeRef(elementType);
-}
-
-class GenericTypeRef extends TypeRef {
-  final TypeRef rawType;
-  final List<TypeRef> typeArgs;
-  GenericTypeRef(this.rawType, this.typeArgs);
-
-  T accept<T>(NodeVisitor<T> visitor) => visitor.visitGenericTypeRef(this);
-  void visitChildren(NodeVisitor visitor) {
-    rawType.accept(visitor);
-    typeArgs.forEach((p) => p.accept(visitor));
-  }
-
-  _clone() => GenericTypeRef(rawType, typeArgs);
-}
-
-class UnionTypeRef extends TypeRef {
-  final List<TypeRef> types;
-  UnionTypeRef(this.types);
-
-  T accept<T>(NodeVisitor<T> visitor) => visitor.visitUnionTypeRef(this);
-  void visitChildren(NodeVisitor visitor) {
-    types.forEach((p) => p.accept(visitor));
-  }
-
-  _clone() => UnionTypeRef(types);
-
-  @override
-  TypeRef or(TypeRef other) {
-    if (types.contains(other)) return this;
-    return UnionTypeRef([]
-      ..addAll(types)
-      ..add(other));
-  }
-}
-
-class OptionalTypeRef extends TypeRef {
-  final TypeRef type;
-  OptionalTypeRef(this.type);
-
-  T accept<T>(NodeVisitor<T> visitor) => visitor.visitOptionalTypeRef(this);
-  void visitChildren(NodeVisitor visitor) {
-    type.accept(visitor);
-  }
-
-  _clone() => OptionalTypeRef(type);
-
-  @override
-  TypeRef orUndefined() => this;
-}
-
-class RecordTypeRef extends TypeRef {
-  final Map<Identifier, TypeRef> types;
-  RecordTypeRef(this.types);
-
-  T accept<T>(NodeVisitor<T> visitor) => visitor.visitRecordTypeRef(this);
-  void visitChildren(NodeVisitor visitor) {
-    types.values.forEach((p) => p.accept(visitor));
-  }
-
-  _clone() => RecordTypeRef(types);
-}
-
-class FunctionTypeRef extends TypeRef {
-  final TypeRef returnType;
-  final Map<Identifier, TypeRef> paramTypes;
-  FunctionTypeRef(this.returnType, this.paramTypes);
-
-  T accept<T>(NodeVisitor<T> visitor) => visitor.visitFunctionTypeRef(this);
-  void visitChildren(NodeVisitor visitor) {
-    returnType.accept(visitor);
-    paramTypes.forEach((n, t) {
-      n.accept(visitor);
-      t.accept(visitor);
-    });
-  }
-
-  _clone() => FunctionTypeRef(returnType, paramTypes);
-}
diff --git a/pkg/dev_compiler/lib/src/js_ast/nodes.dart b/pkg/dev_compiler/lib/src/js_ast/nodes.dart
index 2af42b1..810bedf 100644
--- a/pkg/dev_compiler/lib/src/js_ast/nodes.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/nodes.dart
@@ -4,7 +4,7 @@
 
 part of js_ast;
 
-abstract class NodeVisitor<T> implements TypeRefVisitor<T> {
+abstract class NodeVisitor<T> {
   T visitProgram(Program node);
 
   T visitBlock(Block node);
@@ -95,18 +95,6 @@
   T visitSimpleBindingPattern(SimpleBindingPattern node);
 }
 
-abstract class TypeRefVisitor<T> {
-  T visitQualifiedTypeRef(QualifiedTypeRef node);
-  T visitGenericTypeRef(GenericTypeRef node);
-  T visitUnionTypeRef(UnionTypeRef node);
-  T visitRecordTypeRef(RecordTypeRef node);
-  T visitOptionalTypeRef(OptionalTypeRef node);
-  T visitFunctionTypeRef(FunctionTypeRef node);
-  T visitAnyTypeRef(AnyTypeRef node);
-  T visitUnknownTypeRef(UnknownTypeRef node);
-  T visitArrayTypeRef(ArrayTypeRef node);
-}
-
 class BaseVisitor<T> implements NodeVisitor<T> {
   T visitNode(Node node) {
     node.visitChildren(this);
@@ -229,17 +217,6 @@
       visitBindingPattern(node);
   T visitDestructuredVariable(DestructuredVariable node) => visitNode(node);
   T visitSimpleBindingPattern(SimpleBindingPattern node) => visitNode(node);
-
-  T visitTypeRef(TypeRef node) => visitNode(node);
-  T visitQualifiedTypeRef(QualifiedTypeRef node) => visitTypeRef(node);
-  T visitGenericTypeRef(GenericTypeRef node) => visitTypeRef(node);
-  T visitOptionalTypeRef(OptionalTypeRef node) => visitTypeRef(node);
-  T visitRecordTypeRef(RecordTypeRef node) => visitTypeRef(node);
-  T visitUnionTypeRef(UnionTypeRef node) => visitTypeRef(node);
-  T visitFunctionTypeRef(FunctionTypeRef node) => visitTypeRef(node);
-  T visitAnyTypeRef(AnyTypeRef node) => visitTypeRef(node);
-  T visitUnknownTypeRef(UnknownTypeRef node) => visitTypeRef(node);
-  T visitArrayTypeRef(ArrayTypeRef node) => visitTypeRef(node);
 }
 
 abstract class Node {
@@ -247,9 +224,6 @@
   /// setting this after construction.
   Object sourceInformation;
 
-  /// Closure annotation of this node.
-  ClosureAnnotation closureAnnotation;
-
   T accept<T>(NodeVisitor<T> visitor);
   void visitChildren(NodeVisitor visitor);
 
@@ -892,13 +866,9 @@
 
   final BindingPattern structure;
   final Expression defaultValue;
-  final TypeRef type;
+
   DestructuredVariable(
-      {this.name,
-      this.property,
-      this.structure,
-      this.defaultValue,
-      this.type}) {
+      {this.name, this.property, this.structure, this.defaultValue}) {
     assert(name != null || structure != null);
   }
 
@@ -1177,16 +1147,13 @@
   int get precedenceLevel => UNARY;
 }
 
-abstract class Parameter implements Expression, VariableBinding {
-  TypeRef get type;
-}
+abstract class Parameter implements Expression, VariableBinding {}
 
 class Identifier extends Expression implements Parameter {
   final String name;
   final bool allowRename;
-  final TypeRef type;
 
-  Identifier(this.name, {this.allowRename = true, this.type}) {
+  Identifier(this.name, {this.allowRename = true}) {
     if (!_identifierRE.hasMatch(name)) {
       throw ArgumentError.value(name, "name", "not a valid identifier");
     }
@@ -1204,7 +1171,6 @@
 // This is an expression for convenience in the AST.
 class RestParameter extends Expression implements Parameter {
   final Identifier parameter;
-  TypeRef get type => null;
 
   RestParameter(this.parameter);
 
@@ -1278,24 +1244,13 @@
 }
 
 abstract class FunctionExpression extends Expression {
+  Node get body; // Expression or block
   List<Parameter> get params;
-
-  get body; // Expression or block
-  /// Type parameters passed to this generic function, if any. `null` otherwise.
-  // TODO(ochafik): Support type bounds.
-  List<Identifier> get typeParams;
-
-  /// Return type of this function, if any. `null` otherwise.
-  TypeRef get returnType;
 }
 
 class Fun extends FunctionExpression {
   final List<Parameter> params;
   final Block body;
-  @override
-  final List<Identifier> typeParams;
-  @override
-  final TypeRef returnType;
 
   /** Whether this is a JS generator (`function*`) that may contain `yield`. */
   final bool isGenerator;
@@ -1304,9 +1259,7 @@
 
   Fun(this.params, this.body,
       {this.isGenerator = false,
-      this.asyncModifier = const AsyncModifier.sync(),
-      this.typeParams,
-      this.returnType});
+      this.asyncModifier = const AsyncModifier.sync()});
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitFun(this);
 
@@ -1324,12 +1277,8 @@
 class ArrowFun extends FunctionExpression {
   final List<Parameter> params;
   final body; // Expression or Block
-  @override
-  final List<Identifier> typeParams;
-  @override
-  final TypeRef returnType;
 
-  ArrowFun(this.params, this.body, {this.typeParams, this.returnType});
+  ArrowFun(this.params, this.body);
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitArrowFun(this);
 
@@ -1627,15 +1576,7 @@
   final Expression heritage; // Can be null.
   final List<Method> methods;
 
-  /// Type parameters of this class, if any. `null` otherwise.
-  // TODO(ochafik): Support type bounds.
-  final List<Identifier> typeParams;
-
-  /// Field declarations of this class (TypeScript / ES6_TYPED).
-  final List<VariableDeclarationList> fields;
-
-  ClassExpression(this.name, this.heritage, this.methods,
-      {this.typeParams, this.fields});
+  ClassExpression(this.name, this.heritage, this.methods);
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitClassExpression(this);
 
@@ -1643,23 +1584,12 @@
     name.accept(visitor);
     if (heritage != null) heritage.accept(visitor);
     for (Method element in methods) element.accept(visitor);
-    if (fields != null) {
-      for (var field in fields) {
-        field.accept(visitor);
-      }
-    }
-    if (typeParams != null) {
-      for (var typeParam in typeParams) {
-        typeParam.accept(visitor);
-      }
-    }
   }
 
   @override
   ClassDeclaration toStatement() => ClassDeclaration(this);
 
-  ClassExpression _clone() => ClassExpression(name, heritage, methods,
-      typeParams: typeParams, fields: fields);
+  ClassExpression _clone() => ClassExpression(name, heritage, methods);
 
   int get precedenceLevel => PRIMARY_LOW_PRECEDENCE;
 }
@@ -1726,7 +1656,6 @@
     with InterpolatedNode
     implements Identifier {
   final nameOrPosition;
-  TypeRef get type => null;
 
   String get name {
     throw "InterpolatedParameter.name must not be invoked";
@@ -1797,7 +1726,6 @@
     with InterpolatedNode
     implements Identifier {
   final nameOrPosition;
-  TypeRef get type => null;
 
   InterpolatedIdentifier(this.nameOrPosition);
 
diff --git a/pkg/dev_compiler/lib/src/js_ast/printer.dart b/pkg/dev_compiler/lib/src/js_ast/printer.dart
index da72745..a85c386 100644
--- a/pkg/dev_compiler/lib/src/js_ast/printer.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/printer.dart
@@ -8,7 +8,6 @@
   final bool shouldCompressOutput;
   final bool minifyLocalVariables;
   final bool preferSemicolonToNewlineInMinifiedOutput;
-  final bool emitTypes;
   final bool allowSingleLineIfStatements;
 
   /// True to allow keywords in properties, such as `obj.var` or `obj.function`
@@ -19,7 +18,6 @@
       {this.shouldCompressOutput = false,
       this.minifyLocalVariables = false,
       this.preferSemicolonToNewlineInMinifiedOutput = false,
-      this.emitTypes = false,
       this.allowKeywordsInProperties = false,
       this.allowSingleLineIfStatements = false});
 }
@@ -58,7 +56,7 @@
 
 // TODO(ochafik): Inline the body of [TypeScriptTypePrinter] here if/when it no
 // longer needs to share utils with [ClosureTypePrinter].
-class Printer extends TypeScriptTypePrinter implements NodeVisitor {
+class Printer implements NodeVisitor {
   final JavaScriptPrintingOptions options;
   final JavaScriptPrintingContext context;
   final bool shouldCompressOutput;
@@ -296,7 +294,6 @@
 
   visitExpressionStatement(ExpressionStatement expressionStatement) {
     indent();
-    outClosureAnnotation(expressionStatement);
     visitNestedExpression(expressionStatement.expression, EXPRESSION,
         newInForInit: false, newAtStatementBegin: true);
     outSemicolonLn();
@@ -558,14 +555,12 @@
           newInForInit: false, newAtStatementBegin: false);
     }
     localNamer.enterScope(fun);
-    outTypeParams(fun.typeParams);
     out("(");
     if (fun.params != null) {
       visitCommaSeparated(fun.params, PRIMARY,
           newInForInit: false, newAtStatementBegin: false);
     }
     out(")");
-    outTypeAnnotation(fun.returnType);
     switch (fun.asyncModifier) {
       case const AsyncModifier.sync():
         break;
@@ -585,7 +580,6 @@
 
   visitFunctionDeclaration(FunctionDeclaration declaration) {
     indent();
-    outClosureAnnotation(declaration);
     var f = declaration.function;
     context.enterNode(f);
     functionOut(f, declaration.name);
@@ -623,7 +617,6 @@
   }
 
   visitVariableDeclarationList(VariableDeclarationList list) {
-    outClosureAnnotation(list);
     // Note: keyword can be null for non-static field declarations.
     if (list.keyword != null) {
       out(list.keyword);
@@ -665,7 +658,6 @@
       }
       visit(structure);
     }
-    outTypeAnnotation(node.type);
     var defaultValue = node.defaultValue;
     if (defaultValue != null) {
       spaceOut();
@@ -695,7 +687,6 @@
   }
 
   visitVariableInitialization(VariableInitialization init) {
-    outClosureAnnotation(init);
     visitNestedExpression(init.declaration, LEFT_HAND_SIDE,
         newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
     if (init.value != null) {
@@ -898,7 +889,6 @@
 
   visitIdentifier(Identifier node) {
     out(localNamer.getName(node));
-    outTypeAnnotation(node.type);
   }
 
   visitRestParameter(RestParameter node) {
@@ -966,9 +956,7 @@
 
   visitArrowFun(ArrowFun fun) {
     localNamer.enterScope(fun);
-    if (fun.params.length == 1 &&
-        fun.params[0] is Identifier &&
-        (!options.emitTypes || fun.params[0].type == null)) {
+    if (fun.params.length == 1 && fun.params[0] is Identifier) {
       visitNestedExpression(fun.params.single, SPREAD,
           newInForInit: false, newAtStatementBegin: false);
     } else {
@@ -977,7 +965,6 @@
           newInForInit: false, newAtStatementBegin: false);
       out(")");
     }
-    outTypeAnnotation(fun.returnType);
     spaceOut();
     out("=>");
     var body = fun.body;
@@ -1116,24 +1103,10 @@
     lineOut();
   }
 
-  void outTypeParams(Iterable<Identifier> typeParams) {
-    if (typeParams != null && options.emitTypes && typeParams.isNotEmpty) {
-      out("<");
-      var first = true;
-      for (var typeParam in typeParams) {
-        if (!first) out(", ");
-        first = false;
-        visit(typeParam);
-      }
-      out(">");
-    }
-  }
-
   visitClassExpression(ClassExpression node) {
     localNamer.enterScope(node);
     out('class ');
     visit(node.name);
-    outTypeParams(node.typeParams);
     if (node.heritage != null) {
       out(' extends ');
       visit(node.heritage);
@@ -1143,14 +1116,6 @@
       out('{');
       lineOut();
       indentMore();
-      if (options.emitTypes && node.fields != null) {
-        for (var field in node.fields) {
-          indent();
-          visit(field);
-          out(";");
-          lineOut();
-        }
-      }
       for (var method in node.methods) {
         indent();
         visit(method);
@@ -1166,7 +1131,6 @@
   }
 
   visitMethod(Method node) {
-    outClosureAnnotation(node);
     if (node.isStatic) {
       out('static ');
     }
@@ -1198,17 +1162,6 @@
     localNamer.leaveScope();
   }
 
-  void outClosureAnnotation(Node node) {
-    if (node != null && node.closureAnnotation != null) {
-      String comment = node.closureAnnotation.toString(indentation);
-      if (comment.isNotEmpty) {
-        out(comment);
-        lineOut();
-        indent();
-      }
-    }
-  }
-
   void propertyNameOut(Expression node,
       {bool inMethod = false, bool inAccess = false}) {
     if (node is LiteralNumber) {
@@ -1404,18 +1357,6 @@
     out("await ");
     visit(node.expression);
   }
-
-  void outTypeAnnotation(TypeRef node) {
-    if (node == null || !options.emitTypes || node.isUnknown) return;
-
-    if (node is OptionalTypeRef) {
-      out("?: ");
-      visit(node.type);
-    } else {
-      out(": ");
-      visit(node);
-    }
-  }
 }
 
 // Collects all the var declarations in the function.  We need to do this in a
diff --git a/pkg/dev_compiler/lib/src/js_ast/template.dart b/pkg/dev_compiler/lib/src/js_ast/template.dart
index 6475446..178b15c 100644
--- a/pkg/dev_compiler/lib/src/js_ast/template.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/template.dart
@@ -598,7 +598,7 @@
 
   Instantiator<ArrowFun> visitArrowFun(ArrowFun node) {
     var paramMakers = node.params.map(visitSplayable).toList();
-    Instantiator makeBody = visit(node.body as Node);
+    Instantiator makeBody = visit(node.body);
     return (a) => ArrowFun(splayNodes(paramMakers, a), makeBody(a));
   }
 
@@ -700,32 +700,6 @@
   Instantiator visitExportClause(ExportClause node) =>
       throw UnimplementedError();
 
-  Instantiator visitAnyTypeRef(AnyTypeRef node) => throw UnimplementedError();
-
-  Instantiator visitUnknownTypeRef(UnknownTypeRef node) =>
-      throw UnimplementedError();
-
-  Instantiator visitArrayTypeRef(ArrayTypeRef node) =>
-      throw UnimplementedError();
-
-  Instantiator visitFunctionTypeRef(FunctionTypeRef node) =>
-      throw UnimplementedError();
-
-  Instantiator visitGenericTypeRef(GenericTypeRef node) =>
-      throw UnimplementedError();
-
-  Instantiator visitQualifiedTypeRef(QualifiedTypeRef node) =>
-      throw UnimplementedError();
-
-  Instantiator visitOptionalTypeRef(OptionalTypeRef node) =>
-      throw UnimplementedError();
-
-  Instantiator visitRecordTypeRef(RecordTypeRef node) =>
-      throw UnimplementedError();
-
-  Instantiator visitUnionTypeRef(UnionTypeRef node) =>
-      throw UnimplementedError();
-
   @override
   Instantiator<DestructuredVariable> visitDestructuredVariable(
       DestructuredVariable node) {
diff --git a/pkg/dev_compiler/lib/src/js_ast/type_printer.dart b/pkg/dev_compiler/lib/src/js_ast/type_printer.dart
deleted file mode 100644
index 5123482..0000000
--- a/pkg/dev_compiler/lib/src/js_ast/type_printer.dart
+++ /dev/null
@@ -1,227 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of js_ast;
-
-abstract class _TypePrinterBase implements TypeRefVisitor {
-  void out(String s);
-  void visit(Node node);
-
-  void outSeparated<T extends Node>(String separator, Iterable<T> items,
-      [action(T item)]) {
-    action ??= visit;
-    var first = true;
-    for (var item in items) {
-      if (first) {
-        first = false;
-      } else {
-        out(separator);
-      }
-      action(item);
-    }
-  }
-
-  void outTypeArg(Iterable<TypeRef> typeArgs) {
-    if (typeArgs.isNotEmpty) {
-      // TODO(ochafik): Double-check precedence issues when we start emitting
-      // type arguments outside type literals (generic method call, etc).
-      out('<');
-      outSeparated(", ", typeArgs);
-      out('>');
-    }
-  }
-
-  @override
-  visitQualifiedTypeRef(QualifiedTypeRef node) {
-    outSeparated(".", node.path);
-  }
-}
-
-abstract class TypeScriptTypePrinter extends _TypePrinterBase {
-  void _outTypeAnnotation(TypeRef type) {
-    if (type is OptionalTypeRef) {
-      out("?: ");
-      visit(type.type);
-    } else {
-      out(": ");
-      visit(type);
-    }
-  }
-
-  @override
-  visitGenericTypeRef(GenericTypeRef node) {
-    if (node.rawType is FunctionTypeRef) {
-      outTypeArg(node.typeArgs);
-      visit(node.rawType);
-    } else {
-      visit(node.rawType);
-      outTypeArg(node.typeArgs);
-    }
-  }
-
-  @override
-  visitArrayTypeRef(ArrayTypeRef node) {
-    if (node.elementType == null) {
-      out("Array");
-    } else {
-      visit(node.elementType);
-      out("[]");
-    }
-  }
-
-  @override
-  visitOptionalTypeRef(OptionalTypeRef node) {
-    visit(node.type);
-  }
-
-  @override
-  visitRecordTypeRef(RecordTypeRef node) {
-    out('{');
-    outSeparated(", ", node.types.keys, (Identifier name) {
-      var type = node.types[name];
-      visit(name);
-      _outTypeAnnotation(type);
-    });
-    out('}');
-  }
-
-  @override
-  visitUnionTypeRef(UnionTypeRef node) {
-    outSeparated("|", node.types.where((t) => !t.isNull));
-  }
-
-  @override
-  visitFunctionTypeRef(FunctionTypeRef node) {
-    if (node.returnType == null) {
-      out('Function');
-    } else {
-      out('(');
-      if (node.paramTypes == null) {
-        out('...any');
-      } else {
-        outSeparated(", ", node.paramTypes.keys, (Identifier name) {
-          var paramType = node.paramTypes[name];
-          visit(name);
-          _outTypeAnnotation(paramType);
-        });
-      }
-      out(') => ');
-      visit(node.returnType);
-    }
-  }
-
-  @override
-  visitAnyTypeRef(AnyTypeRef node) {
-    out("any");
-  }
-
-  @override
-  visitUnknownTypeRef(UnknownTypeRef node) {
-    out("any");
-  }
-}
-
-class ClosureTypePrinter extends _TypePrinterBase implements NodeVisitor {
-  final _buffer = StringBuffer();
-
-  @override
-  void out(String s) => _buffer.write(s);
-
-  @override
-  void visit(Node node) => node.accept(this);
-
-  noSuchMethod(Invocation i) => super.noSuchMethod(i);
-
-  @override
-  visitGenericTypeRef(GenericTypeRef node) {
-    visit(node.rawType);
-    outTypeArg(node.typeArgs);
-  }
-
-  @override
-  visitIdentifier(Identifier node) {
-    //out(localNamer.getName(node));
-    out(node.name);
-  }
-
-  @override
-  visitAccess(PropertyAccess node) {
-    var selector = node.selector;
-    if (selector is LiteralString) {
-      visit(node.receiver);
-      out(".");
-      out(selector.valueWithoutQuotes);
-    } else {
-      assert(false);
-      out("?");
-    }
-  }
-
-  @override
-  toString() => _buffer.toString();
-
-  @override
-  visitArrayTypeRef(ArrayTypeRef node) {
-    out("Array");
-    if (node.elementType != null) {
-      out("<");
-      visit(node.elementType);
-      out(">");
-    }
-  }
-
-  @override
-  visitOptionalTypeRef(OptionalTypeRef node) {
-    visit(node.type);
-    out("=");
-  }
-
-  @override
-  visitRecordTypeRef(RecordTypeRef node) {
-    out('{');
-    outSeparated(", ", node.types.keys, (Identifier name) {
-      var type = node.types[name];
-      visit(name);
-      out(": ");
-      visit(type is OptionalTypeRef ? type.orUndefined() : type);
-    });
-    out('}');
-  }
-
-  @override
-  visitAnyTypeRef(AnyTypeRef node) {
-    out("*");
-  }
-
-  @override
-  visitUnknownTypeRef(UnknownTypeRef node) {
-    out("?");
-  }
-
-  @override
-  visitUnionTypeRef(UnionTypeRef node) {
-    out("(");
-    outSeparated("|", node.types);
-    out(")");
-  }
-
-  @override
-  visitFunctionTypeRef(FunctionTypeRef node) {
-    if (node.returnType == null) {
-      out('Function');
-    } else {
-      out('function(');
-      if (node.paramTypes == null) {
-        out("...*");
-      } else {
-        outSeparated(", ", node.paramTypes.values);
-      }
-      out(')');
-      if (node.returnType != null) {
-        out(":");
-        visit(node.returnType);
-      }
-    }
-  }
-}
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 3d6f202..d7d658e 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -4839,8 +4839,7 @@
 
     // Convert `function(...) { ... }` to `(...) => ...`
     // This is for readability, but it also ensures correct `this` binding.
-    return JS.ArrowFun(f.params, body,
-        typeParams: f.typeParams, returnType: f.returnType);
+    return JS.ArrowFun(f.params, body);
   }
 
   @override
diff --git a/pkg/dev_compiler/test/closure/closure_annotation_test.dart b/pkg/dev_compiler/test/closure/closure_annotation_test.dart
deleted file mode 100644
index e3347c6..0000000
--- a/pkg/dev_compiler/test/closure/closure_annotation_test.dart
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library dev_compiler.test.closure_annotation_test;
-
-import 'package:test/test.dart';
-
-import 'package:dev_compiler/src/closure/closure_annotation.dart';
-import 'package:dev_compiler/src/js_ast/js_ast.dart' show TypeRef, Identifier;
-
-void main() {
-  group('ClosureAnnotation', () {
-    var anyType = TypeRef.any();
-    var unknownType = TypeRef.unknown();
-    var numberType = TypeRef.number();
-    var stringType = TypeRef.string();
-    var booleanType = TypeRef.boolean();
-    var fooType = TypeRef.qualified([Identifier("foo"), Identifier("Foo")]);
-    var barType = TypeRef.named("Bar");
-    var bazType = TypeRef.named("Baz");
-    var bamType = TypeRef.named("Bam");
-    var batType = TypeRef.named("Bat");
-
-    test('gives empty comment when no has no meaningful info', () {
-      expect(ClosureAnnotation().toString(), "");
-      expect(ClosureAnnotation(type: anyType).toString(), "");
-      expect(ClosureAnnotation(type: unknownType).toString(), "");
-    });
-
-    test('gives single line comment when it fits', () {
-      expect(ClosureAnnotation(type: numberType).toString(),
-          "/** @type {number} */");
-      expect(ClosureAnnotation(paramTypes: {'foo': anyType}).toString(),
-          "/** @param {*} foo */");
-      expect(ClosureAnnotation(paramTypes: {'foo': unknownType}).toString(),
-          "/** @param {?} foo */");
-    });
-
-    test('gives multiple line comment when it it does not fit on one line', () {
-      expect(
-          ClosureAnnotation(
-              returnType: stringType,
-              paramTypes: {'foo': numberType}).toString(),
-          "/**\n"
-          " * @param {number} foo\n"
-          " * @return {string}\n"
-          " */");
-    });
-
-    test('inserts indentation', () {
-      expect(
-          ClosureAnnotation(
-              returnType: stringType,
-              paramTypes: {'foo': numberType}).toString("  "),
-          "/**\n" // No indent on first line.
-          "   * @param {number} foo\n"
-          "   * @return {string}\n"
-          "   */");
-    });
-
-    test('compresses @type, @final, @const, @private, @protected, @typedef',
-        () {
-      expect(ClosureAnnotation(type: stringType).toString(),
-          "/** @type {string} */");
-      expect(ClosureAnnotation(type: stringType, isConst: true).toString(),
-          "/** @const {string} */");
-      expect(ClosureAnnotation(type: stringType, isFinal: true).toString(),
-          "/** @final {string} */");
-      expect(ClosureAnnotation(type: stringType, isPrivate: true).toString(),
-          "/** @private {string} */");
-      expect(ClosureAnnotation(type: stringType, isTypedef: true).toString(),
-          "/** @typedef {string} */");
-      expect(ClosureAnnotation(type: stringType, isProtected: true).toString(),
-          "/** @protected {string} */");
-      expect(
-          ClosureAnnotation(
-                  type: stringType,
-                  isPrivate: true,
-                  isConst: true,
-                  isFinal: true,
-                  isProtected: true,
-                  isTypedef: true)
-              .toString(),
-          "/** @private @protected @final @const @typedef {string} */");
-    });
-
-    test('supports a full constructor annotation', () {
-      expect(
-          ClosureAnnotation(
-              returnType: booleanType,
-              throwsType: bamType,
-              thisType: fooType,
-              superType: barType,
-              lendsToType: batType,
-              interfaces: [bazType],
-              isStruct: true,
-              isPrivate: true,
-              isProtected: true,
-              isOverride: true,
-              isFinal: true,
-              isConst: true,
-              isConstructor: true,
-              isNoSideEffects: true,
-              isNoCollapse: true,
-              paramTypes: {'x': stringType, 'y': numberType},
-              templates: ['A', 'B']).toString(),
-          '/**\n'
-          ' * @template A, B\n'
-          ' * @this {foo.Foo}\n'
-          ' * @override\n'
-          ' * @nosideeffects\n'
-          ' * @nocollapse\n'
-          ' * @lends {Bat}\n'
-          ' * @private @protected @final @const\n'
-          ' * @constructor @struct @extends {Bar}\n'
-          ' * @implements {Baz}\n'
-          ' * @param {string} x\n'
-          ' * @param {number} y\n'
-          ' * @return {boolean}\n'
-          ' * @throws {Bam}\n'
-          ' */');
-    });
-  });
-}
diff --git a/pkg/dev_compiler/test/closure/closure_type_test.dart b/pkg/dev_compiler/test/closure/closure_type_test.dart
deleted file mode 100644
index c8b7c62..0000000
--- a/pkg/dev_compiler/test/closure/closure_type_test.dart
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library dev_compiler.test.closure_type_test;
-
-import 'package:test/test.dart';
-
-import 'package:dev_compiler/src/closure/closure_type.dart';
-
-void main() {
-  expectToString(ClosureType t, String s,
-      {String nullable, String nonNullable}) {
-    expect(t.toString(), s);
-    if (nullable != null) {
-      expect(t.toNullable().toString(), nullable);
-    }
-    if (nonNullable != null) {
-      expect(t.toNonNullable().toString(), nonNullable);
-    }
-  }
-
-  group('ClosureType', () {
-    test('supports simple types', () {
-      expectToString(ClosureType.number(), "number",
-          nullable: "?number", nonNullable: "number");
-      expectToString(ClosureType.boolean(), "boolean",
-          nullable: "?boolean", nonNullable: "boolean");
-      expectToString(ClosureType.string(), "string",
-          nullable: "string", nonNullable: "!string");
-      expectToString(ClosureType.type("foo.Bar"), "foo.Bar",
-          nullable: "foo.Bar", nonNullable: "!foo.Bar");
-    });
-
-    test('supports array types', () {
-      expectToString(ClosureType.array(), "Array<*>",
-          nullable: "Array<*>", nonNullable: "!Array<*>");
-      expectToString(ClosureType.array(ClosureType.type("Foo")), "Array<Foo>",
-          nullable: "Array<Foo>", nonNullable: "!Array<Foo>");
-    });
-
-    test('supports map types', () {
-      expectToString(
-          ClosureType.map(ClosureType.type("Foo"), ClosureType.type("Bar")),
-          "Object<Foo, Bar>",
-          nullable: "Object<Foo, Bar>",
-          nonNullable: "!Object<Foo, Bar>");
-      expectToString(ClosureType.map(), "Object<*, *>",
-          nullable: "Object<*, *>", nonNullable: "!Object<*, *>");
-    });
-
-    test('supports function types', () {
-      expectToString(ClosureType.function(), "Function",
-          nullable: "Function", nonNullable: "!Function");
-      expectToString(
-          ClosureType.function([ClosureType.number()]), "function(number)");
-      expectToString(ClosureType.function(null, ClosureType.number()),
-          "function(...*):number");
-      expectToString(
-          ClosureType.function([ClosureType.number(), ClosureType.string()],
-              ClosureType.boolean()),
-          "function(number, string):boolean");
-    });
-
-    test('supports union types', () {
-      expectToString(
-          ClosureType.number().or(ClosureType.boolean()), "(number|boolean)");
-      expectToString(ClosureType.number().orUndefined(), "(number|undefined)");
-    });
-
-    test('supports record types', () {
-      expectToString(
-          ClosureType.record(
-              {'x': ClosureType.number(), 'y': ClosureType.boolean()}),
-          "{x: number, y: boolean}");
-    });
-
-    test('supports optional pseudo-types', () {
-      expectToString(ClosureType.number().toOptional(), "number=");
-    });
-  });
-}