diff --git a/pkg/compiler/lib/src/util/setlet.dart b/pkg/compiler/lib/src/util/setlet.dart
index a2870a4..c7aef0d 100644
--- a/pkg/compiler/lib/src/util/setlet.dart
+++ b/pkg/compiler/lib/src/util/setlet.dart
@@ -2,12 +2,14 @@
 // 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.
 
+// @dart=2.12
+
 library dart2js.util.setlet;
 
 import 'dart:collection' show SetBase;
 
 class Setlet<E> extends SetBase<E> {
-  static const _SetletMarker _MARKER = const _SetletMarker();
+  static const _SetletMarker _MARKER = _SetletMarker();
   static const int CAPACITY = 8;
 
   // The setlet can be in one of four states:
@@ -23,22 +25,24 @@
   var _extra;
 
   Setlet();
+
   Setlet.from(Iterable<E> elements) {
     addAll(elements);
   }
 
-  static Set<R> _newSet<R>() => new Setlet<R>();
+  static Set<R> _newSet<R>() => Setlet<R>();
 
   @override
   Set<R> cast<R>() => Set.castFrom<E, R>(this, newSet: _newSet);
+
   @override
   Iterator<E> get iterator {
     if (_extra == null) {
-      return new _SetletSingleIterator<E>(_contents);
+      return _SetletSingleIterator<E>(_contents);
     } else if (_MARKER == _extra) {
       return _contents.iterator;
     } else {
-      return new _SetletListIterator<E>(_contents, _extra);
+      return _SetletListIterator<E>(_contents, _extra);
     }
   }
 
@@ -65,7 +69,7 @@
   }
 
   @override
-  bool contains(Object element) {
+  bool contains(Object? element) {
     if (_extra == null) {
       return _contents == element;
     } else if (_MARKER == _extra) {
@@ -91,7 +95,7 @@
         // Do nothing.
         return false;
       } else {
-        List list = new List.filled(CAPACITY, null);
+        List<Object?> list = List.filled(CAPACITY, null);
         list[0] = _contents;
         list[1] = element;
         _contents = list;
@@ -103,7 +107,8 @@
     } else {
       int remaining = _extra;
       int index = 0;
-      int copyTo, copyFrom;
+      int copyTo = 0;
+      int copyFrom = 0;
       while (remaining > 0 && index < CAPACITY) {
         var candidate = _contents[index++];
         if (_MARKER == candidate) {
@@ -139,7 +144,7 @@
         // make sure we don't keep extra stuff alive.
         while (copyTo < CAPACITY) _contents[copyTo++] = null;
       } else {
-        _contents = new Set<E>()
+        _contents = Set<E>()
           ..addAll((_contents as List).cast<E>())
           ..add(element);
         _extra = _MARKER;
@@ -154,7 +159,7 @@
   }
 
   @override
-  E lookup(Object element) {
+  E? lookup(Object? element) {
     if (_extra == null) {
       return _contents == element ? _contents : null;
     } else if (_MARKER == _extra) {
@@ -171,7 +176,7 @@
   }
 
   @override
-  bool remove(Object element) {
+  bool remove(Object? element) {
     if (_extra == null) {
       if (_contents == element) {
         _contents = _MARKER;
@@ -197,7 +202,7 @@
   }
 
   @override
-  void removeAll(Iterable<Object> other) {
+  void removeAll(Iterable<Object?> other) {
     other.forEach(remove);
   }
 
@@ -228,7 +233,7 @@
   }
 
   @override
-  void retainAll(Iterable<Object> elements) {
+  void retainAll(Iterable<Object?> elements) {
     Set set = elements is Set ? elements : elements.toSet();
     removeWhere((E element) => !set.contains(element));
   }
@@ -250,8 +255,8 @@
   }
 
   @override
-  bool containsAll(Iterable<Object> other) {
-    for (E e in other) {
+  bool containsAll(Iterable<Object?> other) {
+    for (final e in other) {
       if (!this.contains(e)) return false;
     }
     return true;
@@ -264,19 +269,19 @@
   }
 
   @override
-  Set<E> union(Set<E> other) => new Set<E>.from(this)..addAll(other);
+  Set<E> union(Set<E> other) => Set<E>.from(this)..addAll(other);
 
   @override
-  Setlet<E> intersection(Set<Object> other) =>
-      new Setlet<E>.from(this.where((e) => other.contains(e)));
+  Setlet<E> intersection(Set<Object?> other) =>
+      Setlet<E>.from(this.where((e) => other.contains(e)));
 
   @override
-  Setlet<E> difference(Set<Object> other) =>
-      new Setlet<E>.from(this.where((e) => !other.contains(e)));
+  Setlet<E> difference(Set<Object?> other) =>
+      Setlet<E>.from(this.where((e) => !other.contains(e)));
 
   @override
   Setlet<E> toSet() {
-    Setlet<E> result = new Setlet<E>();
+    Setlet<E> result = Setlet<E>();
     if (_extra == null) {
       result._contents = _contents;
     } else if (_extra == _MARKER) {
@@ -298,11 +303,11 @@
 
 class _SetletSingleIterator<E> implements Iterator<E> {
   var _element;
-  E _current;
+  E? _current;
   _SetletSingleIterator(this._element);
 
   @override
-  E get current => _current;
+  E get current => _current as E;
 
   @override
   bool moveNext() {
@@ -320,11 +325,11 @@
   final List _list;
   int _remaining;
   int _index = 0;
-  E _current;
+  E? _current;
   _SetletListIterator(this._list, this._remaining);
 
   @override
-  E get current => _current;
+  E get current => _current as E;
 
   @override
   bool moveNext() {
diff --git a/tools/VERSION b/tools/VERSION
index 4791dbb5..81f1c04 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 148
+PRERELEASE 149
 PRERELEASE_PATCH 0
\ No newline at end of file
