diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index 326253f..9092f5c 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -177,24 +177,24 @@
     } else {
       kind = invocationMirrorMethodKind;
     }
-    return new ir.StaticInvocation(
+    return ir.StaticInvocation(
         coreTypes.index
             .getTopLevelProcedure('dart:core', '_createInvocationMirror'),
-        new ir.Arguments(<ir.Expression>[
-          new ir.StringLiteral(name)..fileOffset = offset,
-          new ir.ListLiteral(
-              arguments.types.map((t) => new ir.TypeLiteral(t)).toList()),
-          new ir.ListLiteral(arguments.positional)..fileOffset = offset,
-          new ir.MapLiteral(new List<ir.MapLiteralEntry>.from(
+        ir.Arguments(<ir.Expression>[
+          ir.StringLiteral(name)..fileOffset = offset,
+          ir.ListLiteral(
+              arguments.types.map((t) => ir.TypeLiteral(t)).toList()),
+          ir.ListLiteral(arguments.positional)..fileOffset = offset,
+          ir.MapLiteral(List<ir.MapLiteralEntry>.from(
               arguments.named.map((ir.NamedExpression arg) {
-            return new ir.MapLiteralEntry(
-                new ir.StringLiteral(arg.name)..fileOffset = arg.fileOffset,
+            return ir.MapLiteralEntry(
+                ir.StringLiteral(arg.name)..fileOffset = arg.fileOffset,
                 arg.value)
               ..fileOffset = arg.fileOffset;
           })), keyType: coreTypes.stringNonNullableRawType)
             ..isConst = (arguments.named.length == 0)
             ..fileOffset = arguments.fileOffset,
-          new ir.IntLiteral(kind)..fileOffset = offset,
+          ir.IntLiteral(kind)..fileOffset = offset,
         ]))
       ..fileOffset = offset;
   }
@@ -202,18 +202,18 @@
   @override
   ir.Expression instantiateNoSuchMethodError(CoreTypes coreTypes,
       ir.Expression receiver, String name, ir.Arguments arguments, int offset,
-      {bool isMethod: false,
-      bool isGetter: false,
-      bool isSetter: false,
-      bool isField: false,
-      bool isLocalVariable: false,
-      bool isDynamic: false,
-      bool isSuper: false,
-      bool isStatic: false,
-      bool isConstructor: false,
-      bool isTopLevel: false}) {
+      {bool isMethod = false,
+      bool isGetter = false,
+      bool isSetter = false,
+      bool isField = false,
+      bool isLocalVariable = false,
+      bool isDynamic = false,
+      bool isSuper = false,
+      bool isStatic = false,
+      bool isConstructor = false,
+      bool isTopLevel = false}) {
     // TODO(sigmund): implement;
-    return new ir.InvalidExpression(null);
+    return ir.InvalidExpression(null);
   }
 
   @override
@@ -223,7 +223,7 @@
 
 // TODO(sigmund): this "extraRequiredLibraries" needs to be removed...
 // compile-platform should just specify which libraries to compile instead.
-const _requiredLibraries = const <String, List<String>>{
+const _requiredLibraries = <String, List<String>>{
   'dart2js': [
     'dart:_dart2js_runtime_metrics',
     'dart:_foreign_helper',
diff --git a/pkg/compiler/lib/src/kernel/element_map.dart b/pkg/compiler/lib/src/kernel/element_map.dart
index dd59226..e92452a 100644
--- a/pkg/compiler/lib/src/kernel/element_map.dart
+++ b/pkg/compiler/lib/src/kernel/element_map.dart
@@ -106,7 +106,7 @@
   /// Computes the [ConstantValue] for the constant [expression].
   ConstantValue getConstantValue(
       ir.StaticTypeContext staticTypeContext, ir.Expression expression,
-      {bool requireConstant: true, bool implicitNull: false});
+      {bool requireConstant = true, bool implicitNull = false});
 
   /// Return the [ImportEntity] corresponding to [node].
   ImportEntity getImport(ir.LibraryDependency node);
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 08eea71..c2af4c9 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -77,16 +77,16 @@
   ConstantValuefier _constantValuefier;
 
   /// Library environment. Used for fast lookup.
-  KProgramEnv env = new KProgramEnv();
+  KProgramEnv env = KProgramEnv();
 
   final EntityDataEnvMap<IndexedLibrary, KLibraryData, KLibraryEnv> libraries =
-      new EntityDataEnvMap<IndexedLibrary, KLibraryData, KLibraryEnv>();
+      EntityDataEnvMap<IndexedLibrary, KLibraryData, KLibraryEnv>();
   final EntityDataEnvMap<IndexedClass, KClassData, KClassEnv> classes =
-      new EntityDataEnvMap<IndexedClass, KClassData, KClassEnv>();
+      EntityDataEnvMap<IndexedClass, KClassData, KClassEnv>();
   final EntityDataMap<IndexedMember, KMemberData> members =
-      new EntityDataMap<IndexedMember, KMemberData>();
+      EntityDataMap<IndexedMember, KMemberData>();
   final EntityDataMap<IndexedTypeVariable, KTypeVariableData> typeVariables =
-      new EntityDataMap<IndexedTypeVariable, KTypeVariableData>();
+      EntityDataMap<IndexedTypeVariable, KTypeVariableData>();
 
   /// Set to `true` before creating the J-World from the K-World to assert that
   /// no entities are created late.
@@ -115,11 +115,11 @@
 
   KernelToElementMapImpl(
       this.reporter, this._environment, this._frontendStrategy, this.options) {
-    _elementEnvironment = new KernelElementEnvironment(this);
-    _typeConverter = new DartTypeConverter(this);
-    _types = new KernelDartTypes(this, options);
-    _commonElements = new CommonElementsImpl(_types, _elementEnvironment);
-    _constantValuefier = new ConstantValuefier(this);
+    _elementEnvironment = KernelElementEnvironment(this);
+    _typeConverter = DartTypeConverter(this);
+    _types = KernelDartTypes(this, options);
+    _commonElements = CommonElementsImpl(_types, _elementEnvironment);
+    _constantValuefier = ConstantValuefier(this);
   }
 
   @override
@@ -183,7 +183,7 @@
   }
 
   MemberEntity lookupLibraryMember(IndexedLibrary library, String name,
-      {bool setter: false}) {
+      {bool setter = false}) {
     assert(checkFamily(library));
     KLibraryEnv libraryEnv = libraries.getEnv(library);
     ir.Member member = libraryEnv.lookupMember(name, setter: setter);
@@ -238,7 +238,7 @@
   }
 
   MemberEntity lookupClassMember(IndexedClass cls, String name,
-      {bool setter: false}) {
+      {bool setter = false}) {
     assert(checkFamily(cls));
     KClassEnv classEnv = classes.getEnv(cls);
     return classEnv.lookupMember(this, name, setter: setter);
@@ -293,14 +293,13 @@
       } else {
         data.thisType = types.interfaceType(
             cls,
-            new List<DartType>.generate(node.typeParameters.length,
-                (int index) {
+            List<DartType>.generate(node.typeParameters.length, (int index) {
               return types.typeVariableType(
                   getTypeVariableInternal(node.typeParameters[index]));
             }));
         data.rawType = types.interfaceType(
             cls,
-            new List<DartType>.filled(
+            List<DartType>.filled(
                 node.typeParameters.length, types.dynamicType()));
       }
     }
@@ -348,7 +347,7 @@
       ir.Class node = data.node;
 
       if (node.supertype == null) {
-        data.orderedTypeSet = new OrderedTypeSet.singleton(data.thisType);
+        data.orderedTypeSet = OrderedTypeSet.singleton(data.thisType);
         data.isMixinApplication = false;
         data.interfaces = const <InterfaceType>[];
       } else {
@@ -428,7 +427,7 @@
           interfaces.add(processSupertype(supertype));
         });
         OrderedTypeSetBuilder setBuilder =
-            new KernelOrderedTypeSetBuilder(this, cls);
+            KernelOrderedTypeSetBuilder(this, cls);
         data.orderedTypeSet =
             setBuilder.createOrderedTypeSet(canonicalSupertypes);
         data.interfaces = interfaces;
@@ -449,7 +448,7 @@
         return getMethodInternal(node);
       }
     }
-    throw new UnsupportedError("Unexpected member: $node");
+    throw UnsupportedError("Unexpected member: $node");
   }
 
   @override
@@ -549,10 +548,10 @@
     if (node.typeParameters.isNotEmpty) {
       List<DartType> typeParameters = <DartType>[];
       for (ir.TypeParameter typeParameter in node.typeParameters) {
-        typeParameters.add(getDartType(new ir.TypeParameterType(
-            typeParameter, ir.Nullability.nonNullable)));
+        typeParameters.add(getDartType(
+            ir.TypeParameterType(typeParameter, ir.Nullability.nonNullable)));
       }
-      typeVariables = new List<FunctionTypeVariable>.generate(
+      typeVariables = List<FunctionTypeVariable>.generate(
           node.typeParameters.length,
           (int index) => types.functionTypeVariable(index));
 
@@ -721,7 +720,7 @@
   void forEachInjectedClassMember(
       IndexedClass cls, void f(MemberEntity member)) {
     assert(checkFamily(cls));
-    throw new UnsupportedError(
+    throw UnsupportedError(
         'KernelToElementMapBase._forEachInjectedClassMember');
   }
 
@@ -809,11 +808,11 @@
   @override
   ir.StaticTypeContext getStaticTypeContext(MemberEntity member) {
     // TODO(johnniwinther): Cache the static type context.
-    return new ir.StaticTypeContext(getMemberNode(member), typeEnvironment);
+    return ir.StaticTypeContext(getMemberNode(member), typeEnvironment);
   }
 
   Dart2jsConstantEvaluator get constantEvaluator {
-    return _constantEvaluator ??= new Dart2jsConstantEvaluator(typeEnvironment,
+    return _constantEvaluator ??= Dart2jsConstantEvaluator(typeEnvironment,
         (ir.LocatedMessage message, List<ir.LocatedMessage> context) {
       reportLocatedMessage(reporter, message, context);
     },
@@ -825,22 +824,20 @@
 
   @override
   Name getName(ir.Name name) {
-    return new Name(
-        name.text, name.isPrivate ? getLibrary(name.library) : null);
+    return Name(name.text, name.isPrivate ? getLibrary(name.library) : null);
   }
 
   @override
   CallStructure getCallStructure(ir.Arguments arguments) {
     int argumentCount = arguments.positional.length + arguments.named.length;
     List<String> namedArguments = arguments.named.map((e) => e.name).toList();
-    return new CallStructure(
-        argumentCount, namedArguments, arguments.types.length);
+    return CallStructure(argumentCount, namedArguments, arguments.types.length);
   }
 
   ParameterStructure getParameterStructure(ir.FunctionNode node,
       // TODO(johnniwinther): Remove this when type arguments are passed to
       // constructors like calling a generic method.
-      {bool includeTypeParameters: true}) {
+      {bool includeTypeParameters = true}) {
     // TODO(johnniwinther): Cache the computed function type.
     int requiredPositionalParameters = node.requiredParameterCount;
     int positionalParameters = node.positionalParameters.length;
@@ -878,29 +875,29 @@
       kind = SelectorKind.CALL;
     }
 
-    CallStructure callStructure = new CallStructure(
+    CallStructure callStructure = CallStructure(
         positionalArguments + namedArguments.length,
         namedArguments,
         typeArguments);
-    return new Selector(kind, name, callStructure);
+    return Selector(kind, name, callStructure);
   }
 
   Selector getGetterSelector(ir.Name irName) {
-    Name name = new Name(
-        irName.text, irName.isPrivate ? getLibrary(irName.library) : null);
-    return new Selector.getter(name);
+    Name name =
+        Name(irName.text, irName.isPrivate ? getLibrary(irName.library) : null);
+    return Selector.getter(name);
   }
 
   Selector getSetterSelector(ir.Name irName) {
-    Name name = new Name(
-        irName.text, irName.isPrivate ? getLibrary(irName.library) : null);
-    return new Selector.setter(name);
+    Name name =
+        Name(irName.text, irName.isPrivate ? getLibrary(irName.library) : null);
+    return Selector.setter(name);
   }
 
   /// Looks up [typeName] for use in the spec-string of a `JS` call.
   // TODO(johnniwinther): Use this in [NativeBehavior] instead of calling
   // the `ForeignResolver`.
-  TypeLookup typeLookup({bool resolveAsRaw: true}) {
+  TypeLookup typeLookup({bool resolveAsRaw = true}) {
     return resolveAsRaw
         ? (_cachedTypeLookupRaw ??= _typeLookup(resolveAsRaw: true))
         : (_cachedTypeLookupFull ??= _typeLookup(resolveAsRaw: false));
@@ -909,7 +906,7 @@
   TypeLookup _cachedTypeLookupRaw;
   TypeLookup _cachedTypeLookupFull;
 
-  TypeLookup _typeLookup({bool resolveAsRaw: true}) {
+  TypeLookup _typeLookup({bool resolveAsRaw = true}) {
     bool cachedMayLookupInMain;
 
     DartType lookup(String typeName, {bool required}) {
@@ -968,7 +965,7 @@
   }
 
   String _getStringArgument(ir.StaticInvocation node, int index) {
-    return node.arguments.positional[index].accept(new Stringifier());
+    return node.arguments.positional[index].accept(Stringifier());
   }
 
   // TODO(johnniwinther): Cache this for later use.
@@ -978,20 +975,20 @@
         node.arguments.named.isNotEmpty) {
       reporter.reportErrorMessage(
           CURRENT_ELEMENT_SPANNABLE, MessageKind.WRONG_ARGUMENT_FOR_JS);
-      return new NativeBehavior();
+      return NativeBehavior();
     }
     String specString = _getStringArgument(node, 0);
     if (specString == null) {
       reporter.reportErrorMessage(
           CURRENT_ELEMENT_SPANNABLE, MessageKind.WRONG_ARGUMENT_FOR_JS_FIRST);
-      return new NativeBehavior();
+      return NativeBehavior();
     }
 
     String codeString = _getStringArgument(node, 1);
     if (codeString == null) {
       reporter.reportErrorMessage(
           CURRENT_ELEMENT_SPANNABLE, MessageKind.WRONG_ARGUMENT_FOR_JS_SECOND);
-      return new NativeBehavior();
+      return NativeBehavior();
     }
 
     return NativeBehavior.ofJsCall(
@@ -1009,18 +1006,18 @@
     if (node.arguments.positional.length < 1) {
       reporter.internalError(
           CURRENT_ELEMENT_SPANNABLE, "JS builtin expression has no type.");
-      return new NativeBehavior();
+      return NativeBehavior();
     }
     if (node.arguments.positional.length < 2) {
       reporter.internalError(
           CURRENT_ELEMENT_SPANNABLE, "JS builtin is missing name.");
-      return new NativeBehavior();
+      return NativeBehavior();
     }
     String specString = _getStringArgument(node, 0);
     if (specString == null) {
       reporter.internalError(
           CURRENT_ELEMENT_SPANNABLE, "Unexpected first argument.");
-      return new NativeBehavior();
+      return NativeBehavior();
     }
     return NativeBehavior.ofJsBuiltinCall(
         specString,
@@ -1037,24 +1034,24 @@
     if (node.arguments.positional.length < 1) {
       reporter.internalError(CURRENT_ELEMENT_SPANNABLE,
           "JS embedded global expression has no type.");
-      return new NativeBehavior();
+      return NativeBehavior();
     }
     if (node.arguments.positional.length < 2) {
       reporter.internalError(
           CURRENT_ELEMENT_SPANNABLE, "JS embedded global is missing name.");
-      return new NativeBehavior();
+      return NativeBehavior();
     }
     if (node.arguments.positional.length > 2 ||
         node.arguments.named.isNotEmpty) {
       reporter.internalError(CURRENT_ELEMENT_SPANNABLE,
           "JS embedded global has more than 2 arguments.");
-      return new NativeBehavior();
+      return NativeBehavior();
     }
     String specString = _getStringArgument(node, 0);
     if (specString == null) {
       reporter.internalError(
           CURRENT_ELEMENT_SPANNABLE, "Unexpected first argument.");
-      return new NativeBehavior();
+      return NativeBehavior();
     }
     return NativeBehavior.ofJsEmbeddedGlobalCall(
         specString,
@@ -1090,21 +1087,21 @@
   @override
   ConstantValue getConstantValue(
       ir.StaticTypeContext staticTypeContext, ir.Expression node,
-      {bool requireConstant: true,
-      bool implicitNull: false,
-      bool checkCasts: true}) {
+      {bool requireConstant = true,
+      bool implicitNull = false,
+      bool checkCasts = true}) {
     if (node == null) {
       if (!implicitNull) {
         throw failedAt(
             CURRENT_ELEMENT_SPANNABLE, 'No expression for constant.');
       }
-      return new NullConstantValue();
+      return NullConstantValue();
     }
     ir.Constant constant = constantEvaluator.evaluate(staticTypeContext, node,
         requireConstant: requireConstant);
     if (constant == null) {
       if (requireConstant) {
-        throw new UnsupportedError(
+        throw UnsupportedError(
             'No constant for ${DebugPrinter.prettyPrint(node)}');
       }
     } else {
@@ -1185,7 +1182,7 @@
     }
     IndexedLibrary library =
         createLibrary(name, canonicalUri, node.isNonNullableByDefault);
-    return libraries.register(library, new KLibraryData(node),
+    return libraries.register(library, KLibraryData(node),
         libraryEnv ?? env.lookupLibrary(canonicalUri));
   }
 
@@ -1204,7 +1201,7 @@
     }
     IndexedClass cls =
         createClass(library, node.name, isAbstract: node.isAbstract);
-    return classes.register(cls, new KClassDataImpl(node), classEnv);
+    return classes.register(cls, KClassDataImpl(node), classEnv);
   }
 
   TypeVariableEntity getTypeVariableInternal(ir.TypeParameter node) {
@@ -1221,7 +1218,7 @@
       int index = cls.typeParameters.indexOf(node);
       return typeVariables.register(
           createTypeVariable(getClassInternal(cls), node.name, index),
-          new KTypeVariableData(node));
+          KTypeVariableData(node));
     }
     if (node.parent is ir.FunctionNode) {
       ir.FunctionNode func = node.parent;
@@ -1239,18 +1236,18 @@
           return typeVariables.register(
               createTypeVariable(
                   getMethodInternal(procedure), node.name, index),
-              new KTypeVariableData(node));
+              KTypeVariableData(node));
         }
       } else if (func.parent is ir.LocalFunction) {
         // Ensure that local function type variables have been created.
         getLocalFunction(func.parent);
         return typeVariableMap[node];
       } else {
-        throw new UnsupportedError('Unsupported function type parameter parent '
+        throw UnsupportedError('Unsupported function type parameter parent '
             'node ${func.parent}.');
       }
     }
-    throw new UnsupportedError('Unsupported type parameter type node $node.');
+    throw UnsupportedError('Unsupported type parameter type node $node.');
   }
 
   ConstructorEntity getConstructorInternal(ir.Member node) {
@@ -1292,7 +1289,7 @@
           NO_LOCATION_SPANNABLE, "Unexpected constructor node: ${node}.");
     }
     return members.register<IndexedConstructor, KConstructorData>(
-        constructor, new KConstructorDataImpl(node, functionNode));
+        constructor, KConstructorDataImpl(node, functionNode));
   }
 
   FunctionEntity getMethodInternal(ir.Procedure node) {
@@ -1323,7 +1320,7 @@
     AsyncMarker asyncMarker = getAsyncMarker(node.function);
     switch (node.kind) {
       case ir.ProcedureKind.Factory:
-        throw new UnsupportedError("Cannot create method from factory.");
+        throw UnsupportedError("Cannot create method from factory.");
       case ir.ProcedureKind.Getter:
         function = createGetter(library, enclosingClass, name, asyncMarker,
             isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
@@ -1341,7 +1338,7 @@
         break;
     }
     members.register<IndexedFunction, KFunctionData>(
-        function, new KFunctionDataImpl(node, node.function));
+        function, KFunctionDataImpl(node, node.function));
     // We need to register the function before creating the type variables.
     methodMap[node] = function;
     for (ir.TypeParameter typeParameter in node.function.typeParameters) {
@@ -1374,7 +1371,7 @@
         isAssignable: node.hasSetter,
         isConst: node.isConst);
     return members.register<IndexedField, KFieldData>(
-        field, new KFieldDataImpl(node));
+        field, KFieldDataImpl(node));
   }
 
   bool checkFamily(Entity entity) {
@@ -1395,7 +1392,7 @@
   }
 
   BehaviorBuilder get nativeBehaviorBuilder =>
-      _nativeBehaviorBuilder ??= new KernelBehaviorBuilder(elementEnvironment,
+      _nativeBehaviorBuilder ??= KernelBehaviorBuilder(elementEnvironment,
           commonElements, nativeBasicData, reporter, options);
 
   ResolutionImpact computeWorldImpact(KMember member,
@@ -1411,7 +1408,7 @@
       }
       ImpactData impactData = impactBuilderData.impactData;
       memberData.staticTypes = impactBuilderData.cachedStaticTypes;
-      KernelImpactConverter converter = new KernelImpactConverter(
+      KernelImpactConverter converter = KernelImpactConverter(
           this,
           member,
           reporter,
@@ -1419,17 +1416,16 @@
           _constantValuefier,
           // TODO(johnniwinther): Pull the static type context from the cached
           // static types.
-          new ir.StaticTypeContext(node, typeEnvironment));
+          ir.StaticTypeContext(node, typeEnvironment));
       return converter.convert(impactData);
     } else {
-      StaticTypeCacheImpl staticTypeCache = new StaticTypeCacheImpl();
-      KernelImpactBuilder builder = new KernelImpactBuilder(
+      StaticTypeCacheImpl staticTypeCache = StaticTypeCacheImpl();
+      KernelImpactBuilder builder = KernelImpactBuilder(
           this,
           member,
           reporter,
           options,
-          new ir.StaticTypeContext(node, typeEnvironment,
-              cache: staticTypeCache),
+          ir.StaticTypeContext(node, typeEnvironment, cache: staticTypeCache),
           staticTypeCache,
           variableScopeModel,
           annotations,
@@ -1493,12 +1489,12 @@
         function = node.function;
       }
       localFunction = localFunctionMap[node] =
-          new KLocalFunction(name, memberContext, executableContext, node);
+          KLocalFunction(name, memberContext, executableContext, node);
       int index = 0;
       List<KLocalTypeVariable> typeVariables = <KLocalTypeVariable>[];
       for (ir.TypeParameter typeParameter in function.typeParameters) {
         typeVariables.add(typeVariableMap[typeParameter] =
-            new KLocalTypeVariable(localFunction, typeParameter.name, index));
+            KLocalTypeVariable(localFunction, typeParameter.name, index));
         index++;
       }
       index = 0;
@@ -1601,23 +1597,23 @@
 
   IndexedLibrary createLibrary(
       String name, Uri canonicalUri, bool isNonNullableByDefault) {
-    return new KLibrary(name, canonicalUri, isNonNullableByDefault);
+    return KLibrary(name, canonicalUri, isNonNullableByDefault);
   }
 
   IndexedClass createClass(LibraryEntity library, String name,
       {bool isAbstract}) {
-    return new KClass(library, name, isAbstract: isAbstract);
+    return KClass(library, name, isAbstract: isAbstract);
   }
 
   TypeVariableEntity createTypeVariable(
       Entity typeDeclaration, String name, int index) {
-    return new KTypeVariable(typeDeclaration, name, index);
+    return KTypeVariable(typeDeclaration, name, index);
   }
 
   IndexedConstructor createGenerativeConstructor(ClassEntity enclosingClass,
       Name name, ParameterStructure parameterStructure,
       {bool isExternal, bool isConst}) {
-    return new KGenerativeConstructor(enclosingClass, name, parameterStructure,
+    return KGenerativeConstructor(enclosingClass, name, parameterStructure,
         isExternal: isExternal, isConst: isConst);
   }
 
@@ -1626,7 +1622,7 @@
   IndexedConstructor createFactoryConstructor(ClassEntity enclosingClass,
       Name name, ParameterStructure parameterStructure,
       {bool isExternal, bool isConst, bool isFromEnvironmentConstructor}) {
-    return new KFactoryConstructor(enclosingClass, name, parameterStructure,
+    return KFactoryConstructor(enclosingClass, name, parameterStructure,
         isExternal: isExternal,
         isConst: isConst,
         isFromEnvironmentConstructor: isFromEnvironmentConstructor);
@@ -1635,7 +1631,7 @@
   IndexedFunction createGetter(LibraryEntity library,
       ClassEntity enclosingClass, Name name, AsyncMarker asyncMarker,
       {bool isStatic, bool isExternal, bool isAbstract}) {
-    return new KGetter(library, enclosingClass, name, asyncMarker,
+    return KGetter(library, enclosingClass, name, asyncMarker,
         isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
   }
 
@@ -1648,7 +1644,7 @@
       {bool isStatic,
       bool isExternal,
       bool isAbstract}) {
-    return new KMethod(
+    return KMethod(
         library, enclosingClass, name, parameterStructure, asyncMarker,
         isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
   }
@@ -1656,14 +1652,14 @@
   IndexedFunction createSetter(
       LibraryEntity library, ClassEntity enclosingClass, Name name,
       {bool isStatic, bool isExternal, bool isAbstract}) {
-    return new KSetter(library, enclosingClass, name,
+    return KSetter(library, enclosingClass, name,
         isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
   }
 
   IndexedField createField(
       LibraryEntity library, ClassEntity enclosingClass, Name name,
       {bool isStatic, bool isAssignable, bool isConst}) {
-    return new KField(library, enclosingClass, name,
+    return KField(library, enclosingClass, name,
         isStatic: isStatic, isAssignable: isAssignable, isConst: isConst);
   }
 }
@@ -1764,7 +1760,7 @@
 
   @override
   ConstructorEntity lookupConstructor(ClassEntity cls, String name,
-      {bool required: false}) {
+      {bool required = false}) {
     ConstructorEntity constructor = elementMap.lookupConstructor(cls, name);
     if (constructor == null && required) {
       throw failedAt(
@@ -1777,7 +1773,7 @@
 
   @override
   MemberEntity lookupLocalClassMember(ClassEntity cls, String name,
-      {bool setter: false, bool required: false}) {
+      {bool setter = false, bool required = false}) {
     MemberEntity member =
         elementMap.lookupClassMember(cls, name, setter: setter);
     if (member == null && required) {
@@ -1789,7 +1785,7 @@
 
   @override
   ClassEntity getSuperClass(ClassEntity cls,
-      {bool skipUnnamedMixinApplications: false}) {
+      {bool skipUnnamedMixinApplications = false}) {
     assert(elementMap.checkFamily(cls));
     ClassEntity superclass = elementMap.getSuperType(cls)?.element;
     if (skipUnnamedMixinApplications) {
@@ -1836,7 +1832,7 @@
 
   @override
   MemberEntity lookupLibraryMember(LibraryEntity library, String name,
-      {bool setter: false, bool required: false}) {
+      {bool setter = false, bool required = false}) {
     MemberEntity member =
         elementMap.lookupLibraryMember(library, name, setter: setter);
     if (member == null && required) {
@@ -1848,7 +1844,7 @@
 
   @override
   ClassEntity lookupClass(LibraryEntity library, String name,
-      {bool required: false}) {
+      {bool required = false}) {
     ClassEntity cls = elementMap.lookupClass(library, name);
     if (cls == null && required) {
       failedAt(CURRENT_ELEMENT_SPANNABLE,
@@ -1863,7 +1859,7 @@
   }
 
   @override
-  LibraryEntity lookupLibrary(Uri uri, {bool required: false}) {
+  LibraryEntity lookupLibrary(Uri uri, {bool required = false}) {
     LibraryEntity library = elementMap.lookupLibrary(uri);
     if (library == null && required) {
       failedAt(CURRENT_ELEMENT_SPANNABLE, "The library '$uri' was not found.");
@@ -1901,7 +1897,7 @@
 
   @override
   Iterable<ConstantValue> getMemberMetadata(covariant IndexedMember member,
-      {bool includeParameterMetadata: false}) {
+      {bool includeParameterMetadata = false}) {
     // TODO(redemption): Support includeParameterMetadata.
     assert(elementMap.checkFamily(member));
     KMemberData memberData = elementMap.members.getData(member);
@@ -1943,7 +1939,7 @@
 }
 
 class KernelNativeMemberResolver implements NativeMemberResolver {
-  static final RegExp _identifier = new RegExp(r'^[a-zA-Z_$][a-zA-Z0-9_$]*$');
+  static final RegExp _identifier = RegExp(r'^[a-zA-Z_$][a-zA-Z0-9_$]*$');
 
   final KernelToElementMapImpl _elementMap;
   final NativeBasicData _nativeBasicData;
@@ -2169,7 +2165,7 @@
 
 DiagnosticMessage _createDiagnosticMessage(
     DiagnosticReporter reporter, ir.LocatedMessage message) {
-  SourceSpan sourceSpan = new SourceSpan(
+  SourceSpan sourceSpan = SourceSpan(
       message.uri, message.charOffset, message.charOffset + message.length);
   return reporter.createMessage(
       sourceSpan, MessageKind.GENERIC, {'text': message.message});
diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart
index 8b0b096..55f7892 100644
--- a/pkg/compiler/lib/src/kernel/env.dart
+++ b/pkg/compiler/lib/src/kernel/env.dart
@@ -28,7 +28,7 @@
 
 /// Environment for fast lookup of component libraries.
 class KProgramEnv {
-  final Set<ir.Component> _components = new Set<ir.Component>();
+  final Set<ir.Component> _components = Set<ir.Component>();
 
   Map<Uri, KLibraryEnv> _libraryMap;
 
@@ -47,7 +47,7 @@
 
   void _addLibraries(ir.Component component) {
     for (ir.Library library in component.libraries) {
-      _libraryMap[library.importUri] = new KLibraryEnv(library);
+      _libraryMap[library.importUri] = KLibraryEnv(library);
     }
   }
 
@@ -79,7 +79,7 @@
   }
 
   /// Convert this [KProgramEnv] to the corresponding [JProgramEnv].
-  JProgramEnv convert() => new JProgramEnv(_components);
+  JProgramEnv convert() => JProgramEnv(_components);
 }
 
 /// Environment for fast lookup of library classes and members.
@@ -96,7 +96,7 @@
     if (_classMap == null) {
       _classMap = <String, KClassEnv>{};
       for (ir.Class cls in library.classes) {
-        _classMap[cls.name] = new KClassEnvImpl(cls);
+        _classMap[cls.name] = KClassEnvImpl(cls);
       }
     }
   }
@@ -141,7 +141,7 @@
   }
 
   /// Return the [ir.Member] for the member [name] in [library].
-  ir.Member lookupMember(String name, {bool setter: false}) {
+  ir.Member lookupMember(String name, {bool setter = false}) {
     _ensureMemberMaps();
     return setter ? _setterMap[name] : _memberMap[name];
   }
@@ -186,7 +186,7 @@
         }
       });
     }
-    return new JLibraryEnv(library, memberMap, setterMap);
+    return JLibraryEnv(library, memberMap, setterMap);
   }
 }
 
@@ -200,7 +200,7 @@
 
   Iterable<ConstantValue> getMetadata(KernelToElementMapImpl elementMap) {
     return _metadata ??= elementMap.getMetadata(
-        new ir.StaticTypeContext.forAnnotations(
+        ir.StaticTypeContext.forAnnotations(
             library, elementMap.typeEnvironment),
         library.annotations);
   }
@@ -214,7 +214,7 @@
         imports = <ir.LibraryDependency, ImportEntity>{};
         dependencies.forEach((ir.LibraryDependency node) {
           if (node.isExport) return;
-          imports[node] = new ImportEntity(
+          imports[node] = ImportEntity(
               node.isDeferred,
               node.name,
               node.targetLibrary.importUri,
@@ -228,7 +228,7 @@
   /// Convert this [KLibraryData] to the corresponding [JLibraryData].
   // TODO(johnniwinther): Why isn't [imports] ensured to be non-null here?
   JLibraryData convert() {
-    return new JLibraryData(library, imports);
+    return JLibraryData(library, imports);
   }
 }
 
@@ -253,7 +253,7 @@
   /// is `true`, the setter or assignable field corresponding to [name] is
   /// returned.
   MemberEntity lookupMember(IrToElementMap elementMap, String name,
-      {bool setter: false});
+      {bool setter = false});
 
   /// Calls [f] for each member of [cls].
   void forEachMember(IrToElementMap elementMap, void f(MemberEntity member));
@@ -355,7 +355,7 @@
     void addProcedure(ir.Procedure member,
         {bool includeStatic,
         bool includeNoSuchMethodForwarders,
-        bool isFromMixinApplication: false}) {
+        bool isFromMixinApplication = false}) {
       if (memberIsIgnorable(member, cls: cls)) return;
       if (!includeStatic && member.isStatic) return;
       if (member.isNoSuchMethodForwarder) {
@@ -437,7 +437,7 @@
 
   @override
   MemberEntity lookupMember(IrToElementMap elementMap, String name,
-      {bool setter: false}) {
+      {bool setter = false}) {
     _ensureMaps(elementMap);
     ir.Member member = setter ? _setterMap[name] : _memberMap[name];
     return member != null ? elementMap.getMember(member) : null;
@@ -528,7 +528,7 @@
         }
       });
     }
-    return new JClassEnvImpl(cls, constructorMap, memberMap, setterMap, members,
+    return JClassEnvImpl(cls, constructorMap, memberMap, setterMap, members,
         _isMixinApplicationWithMembers ?? false);
   }
 }
@@ -595,7 +595,7 @@
   Iterable<ConstantValue> getMetadata(
       covariant KernelToElementMapImpl elementMap) {
     return _metadata ??= elementMap.getMetadata(
-        new ir.StaticTypeContext.forAnnotations(
+        ir.StaticTypeContext.forAnnotations(
             node.enclosingLibrary, elementMap.typeEnvironment),
         node.annotations);
   }
@@ -606,7 +606,7 @@
 
   @override
   JClassData convert() {
-    return new JClassDataImpl(node, new RegularClassDefinition(node));
+    return JClassDataImpl(node, RegularClassDefinition(node));
   }
 }
 
@@ -640,7 +640,7 @@
   Iterable<ConstantValue> getMetadata(
       covariant KernelToElementMapImpl elementMap) {
     return _metadata ??= elementMap.getMetadata(
-        new ir.StaticTypeContext(node, elementMap.typeEnvironment),
+        ir.StaticTypeContext(node, elementMap.typeEnvironment),
         node.annotations);
   }
 
@@ -684,7 +684,7 @@
           _typeVariables = functionNode.typeParameters
               .map<TypeVariableType>((ir.TypeParameter typeParameter) {
             return elementMap
-                .getDartType(new ir.TypeParameterType(
+                .getDartType(ir.TypeParameterType(
                     typeParameter, ir.Nullability.nonNullable))
                 .withoutNullability;
           }).toList();
@@ -713,7 +713,7 @@
   void forEachParameter(JsToElementMap elementMap,
       void f(DartType type, String name, ConstantValue defaultValue)) {
     void handleParameter(ir.VariableDeclaration parameter,
-        {bool isOptional: true}) {
+        {bool isOptional = true}) {
       DartType type = elementMap.getDartType(parameter.type);
       String name = parameter.name;
       ConstantValue defaultValue;
@@ -722,7 +722,7 @@
           defaultValue =
               elementMap.getConstantValue(node, parameter.initializer);
         } else {
-          defaultValue = new NullConstantValue();
+          defaultValue = NullConstantValue();
         }
       }
       f(type, name, defaultValue);
@@ -739,8 +739,8 @@
 
   @override
   FunctionData convert() {
-    return new FunctionDataImpl(
-        node, functionNode, new RegularMemberDefinition(node), staticTypes);
+    return FunctionDataImpl(
+        node, functionNode, RegularMemberDefinition(node), staticTypes);
   }
 
   @override
@@ -763,12 +763,11 @@
   JConstructorData convert() {
     MemberDefinition definition;
     if (node is ir.Constructor) {
-      definition = new SpecialMemberDefinition(node, MemberKind.constructor);
+      definition = SpecialMemberDefinition(node, MemberKind.constructor);
     } else {
-      definition = new RegularMemberDefinition(node);
+      definition = RegularMemberDefinition(node);
     }
-    return new JConstructorDataImpl(
-        node, functionNode, definition, staticTypes);
+    return JConstructorDataImpl(node, functionNode, definition, staticTypes);
   }
 
   @override
@@ -801,8 +800,7 @@
 
   @override
   JFieldData convert() {
-    return new JFieldDataImpl(
-        node, new RegularMemberDefinition(node), staticTypes);
+    return JFieldDataImpl(node, RegularMemberDefinition(node), staticTypes);
   }
 }
 
@@ -825,6 +823,6 @@
   }
 
   JTypeVariableData copy() {
-    return new JTypeVariableData(node);
+    return JTypeVariableData(node);
   }
 }
diff --git a/pkg/compiler/lib/src/kernel/front_end_adapter.dart b/pkg/compiler/lib/src/kernel/front_end_adapter.dart
index 5076088..9a542a8 100644
--- a/pkg/compiler/lib/src/kernel/front_end_adapter.dart
+++ b/pkg/compiler/lib/src/kernel/front_end_adapter.dart
@@ -24,9 +24,9 @@
   @override
   fe.FileSystemEntity entityForUri(Uri uri) {
     if (uri.scheme == 'data') {
-      return new fe.DataFileSystemEntity(Uri.base.resolveUri(uri));
+      return fe.DataFileSystemEntity(Uri.base.resolveUri(uri));
     } else {
-      return new _CompilerFileSystemEntity(uri, this);
+      return _CompilerFileSystemEntity(uri, this);
     }
   }
 }
@@ -45,9 +45,9 @@
       input = await fs.inputProvider
           .readFromUri(uri, inputKind: api.InputKind.UTF8);
     } catch (e) {
-      throw new fe.FileSystemException(uri, '$e');
+      throw fe.FileSystemException(uri, '$e');
     }
-    if (input == null) throw new fe.FileSystemException(uri, "File not found");
+    if (input == null) throw fe.FileSystemException(uri, "File not found");
     // TODO(sigmund): technically someone could provide dart2js with an input
     // that is not a SourceFile. Note that this assumption is also done in the
     // (non-kernel) ScriptLoader.
@@ -62,9 +62,9 @@
       input = await fs.inputProvider
           .readFromUri(uri, inputKind: api.InputKind.binary);
     } catch (e) {
-      throw new fe.FileSystemException(uri, '$e');
+      throw fe.FileSystemException(uri, '$e');
     }
-    if (input == null) throw new fe.FileSystemException(uri, "File not found");
+    if (input == null) throw fe.FileSystemException(uri, "File not found");
     return input.data;
   }
 
@@ -95,7 +95,7 @@
     int offset = fe.getMessageCharOffset(message);
     int length = fe.getMessageLength(message);
     if (uri != null && offset != -1) {
-      return new SourceSpan(uri, offset, offset + length);
+      return SourceSpan(uri, offset, offset + length);
     } else {
       return NO_LOCATION_SPANNABLE;
     }
@@ -126,6 +126,6 @@
       reporter.reportInfo(mainMessage, infos);
       break;
     default:
-      throw new UnimplementedError('unhandled severity ${message.severity}');
+      throw UnimplementedError('unhandled severity ${message.severity}');
   }
 }
diff --git a/pkg/compiler/lib/src/kernel/kelements.dart b/pkg/compiler/lib/src/kernel/kelements.dart
index 886ccbf..d709a75 100644
--- a/pkg/compiler/lib/src/kernel/kelements.dart
+++ b/pkg/compiler/lib/src/kernel/kelements.dart
@@ -52,7 +52,8 @@
   final Name _name;
   final bool _isStatic;
 
-  KMember(this.library, this.enclosingClass, this._name, {bool isStatic: false})
+  KMember(this.library, this.enclosingClass, this._name,
+      {bool isStatic = false})
       : _isStatic = isStatic;
 
   @override
@@ -112,7 +113,7 @@
 
   KFunction(KLibrary library, KClass enclosingClass, Name name,
       this.parameterStructure, this.asyncMarker,
-      {bool isStatic: false, this.isExternal: false})
+      {bool isStatic = false, this.isExternal = false})
       : super(library, enclosingClass, name, isStatic: isStatic);
 }
 
diff --git a/pkg/compiler/lib/src/kernel/kernel_impact.dart b/pkg/compiler/lib/src/kernel/kernel_impact.dart
index 508b578..f45ec96 100644
--- a/pkg/compiler/lib/src/kernel/kernel_impact.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_impact.dart
@@ -59,7 +59,7 @@
       VariableScopeModel variableScopeModel,
       this._annotations,
       this._constantValuefier)
-      : this.impactBuilder = new ResolutionWorldImpactBuilder(
+      : this.impactBuilder = ResolutionWorldImpactBuilder(
             elementMap.commonElements.dartTypes, currentMember),
         super(staticTypeContext, staticTypeCache, elementMap.classHierarchy,
             variableScopeModel);
@@ -98,7 +98,7 @@
 
   KernelImpactConverter(this.elementMap, this.currentMember, this.reporter,
       this._options, this._constantValuefier, this.staticTypeContext)
-      : this.impactBuilder = new ResolutionWorldImpactBuilder(
+      : this.impactBuilder = ResolutionWorldImpactBuilder(
             elementMap.commonElements.dartTypes, currentMember);
 
   @override
@@ -139,10 +139,10 @@
   Object _computeReceiverConstraint(
       ir.DartType receiverType, ClassRelation relation) {
     if (receiverType is ir.InterfaceType) {
-      return new StrongModeConstraint(commonElements, _nativeBasicData,
+      return StrongModeConstraint(commonElements, _nativeBasicData,
           elementMap.getClass(receiverType.classNode), relation);
     } else if (receiverType is ir.NullType) {
-      return new StrongModeConstraint(
+      return StrongModeConstraint(
           commonElements,
           _nativeBasicData,
           elementMap.getClass(typeEnvironment.coreTypes.deprecatedNullClass),
@@ -155,7 +155,7 @@
   void registerParameterCheck(ir.DartType irType) {
     DartType type = elementMap.getDartType(irType);
     if (type is! DynamicType) {
-      impactBuilder.registerTypeUse(new TypeUse.parameterCheck(type));
+      impactBuilder.registerTypeUse(TypeUse.parameterCheck(type));
     }
   }
 
@@ -214,7 +214,7 @@
   @override
   void registerSyncStar(ir.DartType elementType) {
     impactBuilder.registerFeature(Feature.SYNC_STAR);
-    impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
+    impactBuilder.registerStaticUse(StaticUse.staticInvoke(
         commonElements.syncStarIterableFactory,
         const CallStructure.unnamed(1, 1),
         <DartType>[elementMap.getDartType(elementType)]));
@@ -223,7 +223,7 @@
   @override
   void registerAsync(ir.DartType elementType) {
     impactBuilder.registerFeature(Feature.ASYNC);
-    impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
+    impactBuilder.registerStaticUse(StaticUse.staticInvoke(
         commonElements.asyncAwaitCompleterFactory,
         const CallStructure.unnamed(0, 1),
         <DartType>[elementMap.getDartType(elementType)]));
@@ -232,7 +232,7 @@
   @override
   void registerAsyncStar(ir.DartType elementType) {
     impactBuilder.registerFeature(Feature.ASYNC_STAR);
-    impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
+    impactBuilder.registerStaticUse(StaticUse.staticInvoke(
         commonElements.asyncStarStreamControllerFactory,
         const CallStructure.unnamed(1, 1),
         <DartType>[elementMap.getDartType(elementType)]));
@@ -260,22 +260,22 @@
   @override
   void registerIntLiteral(int value) {
     impactBuilder.registerConstantLiteral(
-        new IntConstantValue(new BigInt.from(value).toUnsigned(64)));
+        IntConstantValue(BigInt.from(value).toUnsigned(64)));
   }
 
   @override
   void registerDoubleLiteral(double value) {
-    impactBuilder.registerConstantLiteral(new DoubleConstantValue(value));
+    impactBuilder.registerConstantLiteral(DoubleConstantValue(value));
   }
 
   @override
   void registerBoolLiteral(bool value) {
-    impactBuilder.registerConstantLiteral(new BoolConstantValue(value));
+    impactBuilder.registerConstantLiteral(BoolConstantValue(value));
   }
 
   @override
   void registerStringLiteral(String value) {
-    impactBuilder.registerConstantLiteral(new StringConstantValue(value));
+    impactBuilder.registerConstantLiteral(StringConstantValue(value));
   }
 
   @override
@@ -285,13 +285,13 @@
 
   @override
   void registerNullLiteral() {
-    impactBuilder.registerConstantLiteral(new NullConstantValue());
+    impactBuilder.registerConstantLiteral(NullConstantValue());
   }
 
   @override
   void registerListLiteral(ir.DartType elementType,
       {bool isConst, bool isEmpty}) {
-    impactBuilder.registerListLiteral(new ListLiteralUse(
+    impactBuilder.registerListLiteral(ListLiteralUse(
         commonElements.listType(elementMap.getDartType(elementType)),
         isConstant: isConst,
         isEmpty: isEmpty));
@@ -300,7 +300,7 @@
   @override
   void registerSetLiteral(ir.DartType elementType,
       {bool isConst, bool isEmpty}) {
-    impactBuilder.registerSetLiteral(new SetLiteralUse(
+    impactBuilder.registerSetLiteral(SetLiteralUse(
         commonElements.setType(elementMap.getDartType(elementType)),
         isConstant: isConst,
         isEmpty: isEmpty));
@@ -309,7 +309,7 @@
   @override
   void registerMapLiteral(ir.DartType keyType, ir.DartType valueType,
       {bool isConst, bool isEmpty}) {
-    impactBuilder.registerMapLiteral(new MapLiteralUse(
+    impactBuilder.registerMapLiteral(MapLiteralUse(
         commonElements.mapType(
             elementMap.getDartType(keyType), elementMap.getDartType(valueType)),
         isConstant: isConst,
@@ -326,15 +326,15 @@
       ir.LibraryDependency import,
       {bool isConst}) {
     ConstructorEntity constructor = elementMap.getConstructor(target);
-    CallStructure callStructure = new CallStructure(
+    CallStructure callStructure = CallStructure(
         positionalArguments + namedArguments.length,
         namedArguments,
         typeArguments.length);
     ImportEntity deferredImport = elementMap.getImport(import);
     impactBuilder.registerStaticUse(isConst
-        ? new StaticUse.constConstructorInvoke(constructor, callStructure,
+        ? StaticUse.constConstructorInvoke(constructor, callStructure,
             elementMap.getDartType(type).withoutNullability, deferredImport)
-        : new StaticUse.typedConstructorInvoke(constructor, callStructure,
+        : StaticUse.typedConstructorInvoke(constructor, callStructure,
             elementMap.getDartType(type).withoutNullability, deferredImport));
     if (type.typeArguments.any((ir.DartType type) => type is! ir.DynamicType)) {
       impactBuilder.registerFeature(Feature.TYPE_VARIABLE_BOUNDS_CHECK);
@@ -355,7 +355,7 @@
     ImportEntity deferredImport = elementMap.getImport(import);
     InterfaceType type = elementMap.createInterfaceType(cls, typeArguments);
     impactBuilder
-        .registerTypeUse(new TypeUse.constInstantiation(type, deferredImport));
+        .registerTypeUse(TypeUse.constInstantiation(type, deferredImport));
   }
 
   @override
@@ -391,9 +391,9 @@
     // ssa-building.
     ConstructorEntity constructor =
         elementMap.getSuperConstructor(source, target);
-    impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke(
+    impactBuilder.registerStaticUse(StaticUse.superConstructorInvoke(
         constructor,
-        new CallStructure(positionalArguments + namedArguments.length,
+        CallStructure(positionalArguments + namedArguments.length,
             namedArguments, typeArguments.length)));
   }
 
@@ -405,7 +405,7 @@
       List<ir.DartType> typeArguments,
       ir.LibraryDependency import) {
     FunctionEntity target = elementMap.getMethod(procedure);
-    CallStructure callStructure = new CallStructure(
+    CallStructure callStructure = CallStructure(
         positionalArguments + namedArguments.length,
         namedArguments,
         typeArguments.length);
@@ -415,7 +415,7 @@
       return;
     } else {
       ImportEntity deferredImport = elementMap.getImport(import);
-      impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
+      impactBuilder.registerStaticUse(StaticUse.staticInvoke(
           target, callStructure, dartTypeArguments, deferredImport));
     }
   }
@@ -439,7 +439,7 @@
         InterfaceType type =
             elementMap.getInterfaceTypeForJsInterceptorCall(node);
         if (type != null) {
-          impactBuilder.registerTypeUse(new TypeUse.instantiation(type));
+          impactBuilder.registerTypeUse(TypeUse.instantiation(type));
         }
         break;
       case ForeignKind.NONE:
@@ -457,7 +457,7 @@
     //   2. There is an invocation of fn with some number of type arguments.
     //
     impactBuilder.registerStaticUse(
-        new StaticUse.staticInvoke(target, callStructure, typeArguments));
+        StaticUse.staticInvoke(target, callStructure, typeArguments));
 
     if (typeArguments.length != 1) return;
     DartType matchedType = dartTypes.eraseLegacy(typeArguments.first);
@@ -467,30 +467,30 @@
     ClassEntity cls = interfaceType.element;
     InterfaceType thisType = elementMap.elementEnvironment.getThisType(cls);
 
-    impactBuilder.registerTypeUse(new TypeUse.isCheck(thisType));
+    impactBuilder.registerTypeUse(TypeUse.isCheck(thisType));
 
-    Selector selector = new Selector.callClosure(
+    Selector selector = Selector.callClosure(
         0, const <String>[], thisType.typeArguments.length);
-    impactBuilder.registerDynamicUse(
-        new DynamicUse(selector, null, thisType.typeArguments));
+    impactBuilder
+        .registerDynamicUse(DynamicUse(selector, null, thisType.typeArguments));
   }
 
   @override
   void registerStaticTearOff(
       ir.Procedure procedure, ir.LibraryDependency import) {
-    impactBuilder.registerStaticUse(new StaticUse.staticTearOff(
+    impactBuilder.registerStaticUse(StaticUse.staticTearOff(
         elementMap.getMethod(procedure), elementMap.getImport(import)));
   }
 
   @override
   void registerStaticGet(ir.Member member, ir.LibraryDependency import) {
-    impactBuilder.registerStaticUse(new StaticUse.staticGet(
+    impactBuilder.registerStaticUse(StaticUse.staticGet(
         elementMap.getMember(member), elementMap.getImport(import)));
   }
 
   @override
   void registerStaticSet(ir.Member member, ir.LibraryDependency import) {
-    impactBuilder.registerStaticUse(new StaticUse.staticSet(
+    impactBuilder.registerStaticUse(StaticUse.staticSet(
         elementMap.getMember(member), elementMap.getImport(import)));
   }
 
@@ -500,15 +500,15 @@
     if (target != null) {
       FunctionEntity method = elementMap.getMember(target);
       List<DartType> dartTypeArguments = _getTypeArguments(typeArguments);
-      impactBuilder.registerStaticUse(new StaticUse.superInvoke(
+      impactBuilder.registerStaticUse(StaticUse.superInvoke(
           method,
-          new CallStructure(positionalArguments + namedArguments.length,
+          CallStructure(positionalArguments + namedArguments.length,
               namedArguments, typeArguments.length),
           dartTypeArguments));
     } else {
       // TODO(johnniwinther): Remove this when the CFE checks for missing
       //  concrete super targets.
-      impactBuilder.registerStaticUse(new StaticUse.superInvoke(
+      impactBuilder.registerStaticUse(StaticUse.superInvoke(
           elementMap.getSuperNoSuchMethod(currentMember.enclosingClass),
           CallStructure.ONE_ARG));
       impactBuilder.registerFeature(Feature.SUPER_NO_SUCH_METHOD);
@@ -520,14 +520,14 @@
     if (target != null) {
       MemberEntity member = elementMap.getMember(target);
       if (member.isFunction) {
-        impactBuilder.registerStaticUse(new StaticUse.superTearOff(member));
+        impactBuilder.registerStaticUse(StaticUse.superTearOff(member));
       } else {
-        impactBuilder.registerStaticUse(new StaticUse.superGet(member));
+        impactBuilder.registerStaticUse(StaticUse.superGet(member));
       }
     } else {
       // TODO(johnniwinther): Remove this when the CFE checks for missing
       //  concrete super targets.
-      impactBuilder.registerStaticUse(new StaticUse.superInvoke(
+      impactBuilder.registerStaticUse(StaticUse.superInvoke(
           elementMap.getSuperNoSuchMethod(currentMember.enclosingClass),
           CallStructure.ONE_ARG));
       impactBuilder.registerFeature(Feature.SUPER_NO_SUCH_METHOD);
@@ -539,14 +539,14 @@
     if (target != null) {
       MemberEntity member = elementMap.getMember(target);
       if (member.isField) {
-        impactBuilder.registerStaticUse(new StaticUse.superFieldSet(member));
+        impactBuilder.registerStaticUse(StaticUse.superFieldSet(member));
       } else {
-        impactBuilder.registerStaticUse(new StaticUse.superSetterSet(member));
+        impactBuilder.registerStaticUse(StaticUse.superSetterSet(member));
       }
     } else {
       // TODO(johnniwinther): Remove this when the CFE checks for missing
       //  concrete super targets.
-      impactBuilder.registerStaticUse(new StaticUse.superInvoke(
+      impactBuilder.registerStaticUse(StaticUse.superInvoke(
           elementMap.getSuperNoSuchMethod(currentMember.enclosingClass),
           CallStructure.ONE_ARG));
       impactBuilder.registerFeature(Feature.SUPER_NO_SUCH_METHOD);
@@ -559,14 +559,14 @@
       int positionalArguments,
       List<String> namedArguments,
       List<ir.DartType> typeArguments) {
-    CallStructure callStructure = new CallStructure(
+    CallStructure callStructure = CallStructure(
         positionalArguments + namedArguments.length,
         namedArguments,
         typeArguments.length);
     List<DartType> dartTypeArguments = _getTypeArguments(typeArguments);
     // Invocation of a local function. No need for dynamic use, but
     // we need to track the type arguments.
-    impactBuilder.registerStaticUse(new StaticUse.closureCall(
+    impactBuilder.registerStaticUse(StaticUse.closureCall(
         elementMap.getLocalFunction(localFunction),
         callStructure,
         dartTypeArguments));
@@ -574,7 +574,7 @@
     // this when kernel adds an `isFunctionCall` flag to
     // [ir.MethodInvocation].
     impactBuilder.registerDynamicUse(
-        new DynamicUse(callStructure.callSelector, null, dartTypeArguments));
+        DynamicUse(callStructure.callSelector, null, dartTypeArguments));
   }
 
   @override
@@ -588,7 +588,7 @@
     Selector selector = elementMap.getInvocationSelector(
         name, positionalArguments, namedArguments, typeArguments.length);
     List<DartType> dartTypeArguments = _getTypeArguments(typeArguments);
-    impactBuilder.registerDynamicUse(new DynamicUse(selector,
+    impactBuilder.registerDynamicUse(DynamicUse(selector,
         _computeReceiverConstraint(receiverType, relation), dartTypeArguments));
   }
 
@@ -598,12 +598,12 @@
       int positionalArguments,
       List<String> namedArguments,
       List<ir.DartType> typeArguments) {
-    CallStructure callStructure = new CallStructure(
+    CallStructure callStructure = CallStructure(
         positionalArguments + namedArguments.length,
         namedArguments,
         typeArguments.length);
     List<DartType> dartTypeArguments = _getTypeArguments(typeArguments);
-    impactBuilder.registerDynamicUse(new DynamicUse(
+    impactBuilder.registerDynamicUse(DynamicUse(
         callStructure.callSelector,
         _computeReceiverConstraint(receiverType, ClassRelation.subtype),
         dartTypeArguments));
@@ -618,7 +618,7 @@
       List<String> namedArguments,
       List<ir.DartType> typeArguments) {
     List<DartType> dartTypeArguments = _getTypeArguments(typeArguments);
-    impactBuilder.registerDynamicUse(new DynamicUse(
+    impactBuilder.registerDynamicUse(DynamicUse(
         elementMap.getInvocationSelector(target.name, positionalArguments,
             namedArguments, typeArguments.length),
         _computeReceiverConstraint(receiverType, relation),
@@ -628,8 +628,8 @@
   @override
   void registerDynamicGet(
       ir.DartType receiverType, ClassRelation relation, ir.Name name) {
-    impactBuilder.registerDynamicUse(new DynamicUse(
-        new Selector.getter(elementMap.getName(name)),
+    impactBuilder.registerDynamicUse(DynamicUse(
+        Selector.getter(elementMap.getName(name)),
         _computeReceiverConstraint(receiverType, relation),
         const <DartType>[]));
   }
@@ -637,8 +637,8 @@
   @override
   void registerInstanceGet(
       ir.DartType receiverType, ClassRelation relation, ir.Member target) {
-    impactBuilder.registerDynamicUse(new DynamicUse(
-        new Selector.getter(elementMap.getName(target.name)),
+    impactBuilder.registerDynamicUse(DynamicUse(
+        Selector.getter(elementMap.getName(target.name)),
         _computeReceiverConstraint(receiverType, relation),
         const <DartType>[]));
   }
@@ -646,8 +646,8 @@
   @override
   void registerDynamicSet(
       ir.DartType receiverType, ClassRelation relation, ir.Name name) {
-    impactBuilder.registerDynamicUse(new DynamicUse(
-        new Selector.setter(elementMap.getName(name)),
+    impactBuilder.registerDynamicUse(DynamicUse(
+        Selector.setter(elementMap.getName(name)),
         _computeReceiverConstraint(receiverType, relation),
         const <DartType>[]));
   }
@@ -655,8 +655,8 @@
   @override
   void registerInstanceSet(
       ir.DartType receiverType, ClassRelation relation, ir.Member target) {
-    impactBuilder.registerDynamicUse(new DynamicUse(
-        new Selector.setter(elementMap.getName(target.name)),
+    impactBuilder.registerDynamicUse(DynamicUse(
+        Selector.setter(elementMap.getName(target.name)),
         _computeReceiverConstraint(receiverType, relation),
         const <DartType>[]));
   }
@@ -684,7 +684,7 @@
       }
     }
     impactBuilder.registerRuntimeTypeUse(
-        new RuntimeTypeUse(kind, receiverDartType, argumentDartType));
+        RuntimeTypeUse(kind, receiverDartType, argumentDartType));
   }
 
   @override
@@ -697,7 +697,7 @@
   void registerGenericInstantiation(
       ir.FunctionType expressionType, List<ir.DartType> typeArguments) {
     // TODO(johnniwinther): Track which arities are used in instantiation.
-    impactBuilder.registerInstantiation(new GenericInstantiation(
+    impactBuilder.registerInstantiation(GenericInstantiation(
         elementMap.getDartType(expressionType).withoutNullability,
         typeArguments.map(elementMap.getDartType).toList()));
   }
@@ -711,7 +711,7 @@
   @override
   void registerLocalFunction(ir.TreeNode node) {
     Local function = elementMap.getLocalFunction(node);
-    impactBuilder.registerStaticUse(new StaticUse.closure(function));
+    impactBuilder.registerStaticUse(StaticUse.closure(function));
   }
 
   @override
@@ -722,19 +722,18 @@
   @override
   void registerIsCheck(ir.DartType type) {
     impactBuilder
-        .registerTypeUse(new TypeUse.isCheck(elementMap.getDartType(type)));
+        .registerTypeUse(TypeUse.isCheck(elementMap.getDartType(type)));
   }
 
   @override
   void registerImplicitCast(ir.DartType type) {
-    impactBuilder.registerTypeUse(
-        new TypeUse.implicitCast(elementMap.getDartType(type)));
+    impactBuilder
+        .registerTypeUse(TypeUse.implicitCast(elementMap.getDartType(type)));
   }
 
   @override
   void registerAsCast(ir.DartType type) {
-    impactBuilder
-        .registerTypeUse(new TypeUse.asCast(elementMap.getDartType(type)));
+    impactBuilder.registerTypeUse(TypeUse.asCast(elementMap.getDartType(type)));
   }
 
   @override
@@ -749,11 +748,11 @@
         _computeReceiverConstraint(iteratorType, iteratorClassRelation);
     impactBuilder.registerFeature(Feature.SYNC_FOR_IN);
     impactBuilder.registerDynamicUse(
-        new DynamicUse(Selectors.iterator, receiverConstraint, const []));
+        DynamicUse(Selectors.iterator, receiverConstraint, const []));
     impactBuilder.registerDynamicUse(
-        new DynamicUse(Selectors.current, receiverConstraint, const []));
+        DynamicUse(Selectors.current, receiverConstraint, const []));
     impactBuilder.registerDynamicUse(
-        new DynamicUse(Selectors.moveNext, receiverConstraint, const []));
+        DynamicUse(Selectors.moveNext, receiverConstraint, const []));
   }
 
   @override
@@ -763,11 +762,11 @@
         _computeReceiverConstraint(iteratorType, iteratorClassRelation);
     impactBuilder.registerFeature(Feature.ASYNC_FOR_IN);
     impactBuilder.registerDynamicUse(
-        new DynamicUse(Selectors.cancel, receiverConstraint, const []));
+        DynamicUse(Selectors.cancel, receiverConstraint, const []));
     impactBuilder.registerDynamicUse(
-        new DynamicUse(Selectors.current, receiverConstraint, const []));
+        DynamicUse(Selectors.current, receiverConstraint, const []));
     impactBuilder.registerDynamicUse(
-        new DynamicUse(Selectors.moveNext, receiverConstraint, const []));
+        DynamicUse(Selectors.moveNext, receiverConstraint, const []));
   }
 
   @override
@@ -783,26 +782,26 @@
   @override
   void registerCatchType(ir.DartType type) {
     impactBuilder
-        .registerTypeUse(new TypeUse.catchType(elementMap.getDartType(type)));
+        .registerTypeUse(TypeUse.catchType(elementMap.getDartType(type)));
   }
 
   @override
   void registerTypeLiteral(ir.DartType type, ir.LibraryDependency import) {
     ImportEntity deferredImport = elementMap.getImport(import);
     impactBuilder.registerTypeUse(
-        new TypeUse.typeLiteral(elementMap.getDartType(type), deferredImport));
+        TypeUse.typeLiteral(elementMap.getDartType(type), deferredImport));
   }
 
   @override
   void registerFieldInitialization(ir.Field node) {
     impactBuilder
-        .registerStaticUse(new StaticUse.fieldInit(elementMap.getField(node)));
+        .registerStaticUse(StaticUse.fieldInit(elementMap.getField(node)));
   }
 
   @override
   void registerFieldConstantInitialization(
       ir.Field node, ConstantReference constant) {
-    impactBuilder.registerStaticUse(new StaticUse.fieldConstantInit(
+    impactBuilder.registerStaticUse(StaticUse.fieldConstantInit(
         elementMap.getField(node),
         _constantValuefier.visitConstant(constant.constant)));
   }
@@ -814,15 +813,15 @@
       List<String> namedArguments,
       List<ir.DartType> typeArguments) {
     ConstructorEntity target = elementMap.getConstructor(constructor);
-    impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke(
+    impactBuilder.registerStaticUse(StaticUse.superConstructorInvoke(
         target,
-        new CallStructure(positionalArguments + namedArguments.length,
+        CallStructure(positionalArguments + namedArguments.length,
             namedArguments, typeArguments.length)));
   }
 
   @override
   void registerLoadLibrary() {
-    impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
+    impactBuilder.registerStaticUse(StaticUse.staticInvoke(
         commonElements.loadDeferredLibrary, CallStructure.ONE_ARG));
     impactBuilder.registerFeature(Feature.LOAD_LIBRARY);
   }
diff --git a/pkg/compiler/lib/src/kernel/kernel_world.dart b/pkg/compiler/lib/src/kernel/kernel_world.dart
index f1d295a..3c7d99a 100644
--- a/pkg/compiler/lib/src/kernel/kernel_world.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_world.dart
@@ -145,7 +145,7 @@
         if (!elementMap.classes
             .getEnv(member.enclosingClass)
             .checkHasMember(elementMap.getMemberNode(member))) {
-          throw new SpannableAssertionFailure(
+          throw SpannableAssertionFailure(
               member,
               "Member $member is in the environment of its enclosing class"
               " ${member.enclosingClass}.");
diff --git a/pkg/compiler/lib/src/kernel/loader.dart b/pkg/compiler/lib/src/kernel/loader.dart
index 37531a5..3278416 100644
--- a/pkg/compiler/lib/src/kernel/loader.dart
+++ b/pkg/compiler/lib/src/kernel/loader.dart
@@ -90,11 +90,11 @@
       }
 
       if (isDill) {
-        component = new ir.Component();
+        component = ir.Component();
         Future<void> read(Uri uri) async {
           api.Input input = await _compilerInput.readFromUri(uri,
               inputKind: api.InputKind.binary);
-          new BinaryBuilder(input.data).readComponent(component);
+          BinaryBuilder(input.data).readComponent(component);
         }
 
         await read(resolvedUri);
@@ -201,9 +201,8 @@
           _reporter.log('Writing dill to ${_options.outputUri}');
           api.BinaryOutputSink dillOutput =
               _compilerOutput.createBinarySink(_options.outputUri);
-          BinaryOutputSinkAdapter irSink =
-              new BinaryOutputSinkAdapter(dillOutput);
-          BinaryPrinter printer = new BinaryPrinter(irSink);
+          BinaryOutputSinkAdapter irSink = BinaryOutputSinkAdapter(dillOutput);
+          BinaryPrinter printer = BinaryPrinter(irSink);
           printer.writeComponentFile(component);
           irSink.close();
         });
@@ -212,8 +211,8 @@
       if (forceSerialization) {
         // TODO(johnniwinther): Remove this when #34942 is fixed.
         List<int> data = serializeComponent(component);
-        component = new ir.Component();
-        new BinaryBuilder(data).readComponent(component);
+        component = ir.Component();
+        BinaryBuilder(data).readComponent(component);
       }
       return _toResult(component, moduleLibraries);
     });
@@ -230,7 +229,7 @@
       // entire SDK libraries, not all of them are used. We include anything
       // that is reachable from `main`. Note that all internal libraries that
       // the compiler relies on are reachable from `dart:core`.
-      var seen = new Set<Library>();
+      var seen = Set<Library>();
       search(ir.Library current) {
         if (!seen.add(current)) return;
         for (ir.LibraryDependency dep in current.dependencies) {
@@ -248,7 +247,7 @@
 
       libraries = libraries.where(seen.contains);
     }
-    return new KernelResult(component, rootLibraryUri,
+    return KernelResult(component, rootLibraryUri,
         libraries.map((lib) => lib.importUri).toList(), moduleLibraries);
   }
 }
diff --git a/pkg/compiler/lib/src/kernel/transformations/clone_mixin_methods_with_super.dart b/pkg/compiler/lib/src/kernel/transformations/clone_mixin_methods_with_super.dart
index dc7ded8..80799f3 100644
--- a/pkg/compiler/lib/src/kernel/transformations/clone_mixin_methods_with_super.dart
+++ b/pkg/compiler/lib/src/kernel/transformations/clone_mixin_methods_with_super.dart
@@ -19,7 +19,7 @@
   /// libraries have already been transformed.
   static void transform(List<Library> libraries) {
     // Clone any mixed in methods that uses super.
-    var processedClasses = new Set<Class>();
+    var processedClasses = Set<Class>();
     for (var library in libraries) {
       for (var cls in library.classes) {
         if (processedClasses.add(cls)) {
