Version 2.2.1-dev.0.0

* Cherry-pick 6f8415245d4dd298730facf83e03de69fc29bbd3 to dev
* Cherry-pick e7d263b05f7f66d15f778df60ee60625e9a3c5f4 to dev
* Cherry-pick dc8a56bc0ece296915c7016e0a8241c7068eca18 to dev
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 237f3a3..263f5b5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 2.2.1-dev.0.0
+
+* Cherry-pick 6f8415245d4dd298730facf83e03de69fc29bbd3 to dev
+* Cherry-pick e7d263b05f7f66d15f778df60ee60625e9a3c5f4 to dev
+* Cherry-pick dc8a56bc0ece296915c7016e0a8241c7068eca18 to dev
+
 ## 2.2.0-dev.2.1
 
 * Cherry-pick 765e6338a803ee17472b1fa715ffcfbd4ea46bfb to dev
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index d526ee2..d2dd71e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -447,6 +447,20 @@
     return new JumpTarget(kind, functionNestingLevel, member, charOffset);
   }
 
+  void inferAnnotations(List<Expression> annotations) {
+    if (annotations != null) {
+      _typeInferrer?.inferMetadata(this, annotations);
+      if (transformSetLiterals) {
+        library.loader.setLiteralTransformer ??=
+            new SetLiteralTransformer(library.loader);
+        for (int i = 0; i < annotations.length; i++) {
+          annotations[i] =
+              annotations[i].accept(library.loader.setLiteralTransformer);
+        }
+      }
+    }
+  }
+
   @override
   void beginMetadata(Token token) {
     debugEvent("beginMetadata");
@@ -574,7 +588,7 @@
     }
     List<Expression> annotations = pop();
     if (annotations != null) {
-      _typeInferrer?.inferMetadata(this, annotations);
+      inferAnnotations(annotations);
       Field field = fields.first.target;
       // The first (and often only field) will not get a clone.
       for (int i = 0; i < annotations.length; i++) {
@@ -741,6 +755,11 @@
           realParameter.initializer = initializer..parent = realParameter;
           _typeInferrer?.inferParameterInitializer(
               this, initializer, realParameter.type);
+          if (transformSetLiterals) {
+            library.loader.setLiteralTransformer ??=
+                new SetLiteralTransformer(library.loader);
+            realParameter.accept(library.loader.setLiteralTransformer);
+          }
         }
       }
     }
@@ -751,7 +770,7 @@
     if (transformSetLiterals) {
       library.loader.setLiteralTransformer ??=
           new SetLiteralTransformer(library.loader);
-      body.accept(library.loader.setLiteralTransformer);
+      body?.accept(library.loader.setLiteralTransformer);
     }
 
     // For async, async*, and sync* functions with declared return types, we
@@ -873,7 +892,7 @@
       }
     }
     Member target = builder.target;
-    _typeInferrer?.inferMetadata(this, annotations);
+    inferAnnotations(annotations);
     for (Expression annotation in annotations ?? const []) {
       target.addAnnotation(annotation);
     }
@@ -986,15 +1005,14 @@
 
     if (variablesWithMetadata != null) {
       for (int i = 0; i < variablesWithMetadata.length; i++) {
-        _typeInferrer?.inferMetadata(
-            this, variablesWithMetadata[i].annotations);
+        inferAnnotations(variablesWithMetadata[i].annotations);
       }
     }
     if (multiVariablesWithMetadata != null) {
       for (int i = 0; i < multiVariablesWithMetadata.length; i++) {
         List<VariableDeclaration> variables = multiVariablesWithMetadata[i];
         List<Expression> annotations = variables.first.annotations;
-        _typeInferrer?.inferMetadata(this, annotations);
+        inferAnnotations(annotations);
         for (int i = 1; i < variables.length; i++) {
           cloner ??= new CloneVisitor();
           VariableDeclaration variable = variables[i];
@@ -1009,7 +1027,7 @@
   @override
   List<Expression> finishMetadata(TreeNode parent) {
     List<Expression> expressions = pop();
-    _typeInferrer?.inferMetadata(this, expressions);
+    inferAnnotations(expressions);
 
     // The invocation of [resolveRedirectingFactoryTargets] below may change the
     // root nodes of the annotation expressions.  We need to have a parent of
@@ -1158,6 +1176,14 @@
       constructor.initializers.add(initializer);
     }
     setParents(constructor.initializers, constructor);
+    if (transformSetLiterals) {
+      library.loader.setLiteralTransformer ??=
+          new SetLiteralTransformer(library.loader);
+      for (int i = 0; i < constructor.initializers.length; i++) {
+        constructor.initializers[i]
+            .accept(library.loader.setLiteralTransformer);
+      }
+    }
     if (constructor.function.body == null) {
       /// >If a generative constructor c is not a redirecting constructor
       /// >and no body is provided, then c implicitly has an empty body {}.
@@ -2796,7 +2822,7 @@
     }
     if (annotations != null) {
       if (functionNestingLevel == 0) {
-        _typeInferrer?.inferMetadata(this, annotations);
+        inferAnnotations(annotations);
       }
       for (Expression annotation in annotations) {
         variable.addAnnotation(annotation);
@@ -4396,7 +4422,7 @@
     KernelTypeVariableBuilder variable = new KernelTypeVariableBuilder(
         name.name, library, name.charOffset, null);
     if (annotations != null) {
-      _typeInferrer?.inferMetadata(this, annotations);
+      inferAnnotations(annotations);
       for (Expression annotation in annotations) {
         variable.parameter.addAnnotation(annotation);
       }
diff --git a/tests/language_2/set_literal_in_initializer_test.dart b/tests/language_2/set_literal_in_initializer_test.dart
new file mode 100644
index 0000000..04cc2d8
--- /dev/null
+++ b/tests/language_2/set_literal_in_initializer_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2019, 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.
+
+class Bag {
+  final Set<Object> things;
+  Bag({Set<Object> things}) : this.things = things ?? <Object>{};
+  Bag.full({Set<Object> this.things = const {"cat"}});
+}
+
+main() {
+  new Bag();
+  new Bag(things: {});
+  new Bag.full();
+  new Bag.full(things: {});
+}
diff --git a/tests/language_2/set_literals_in_annotations_test.dart b/tests/language_2/set_literals_in_annotations_test.dart
new file mode 100644
index 0000000..5dca8c3
--- /dev/null
+++ b/tests/language_2/set_literals_in_annotations_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2019, 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.
+
+@Meta({})
+import 'dart:core';
+
+@Meta({})
+void f(@Meta({}) int foo) {}
+
+@Meta({})
+class A<@Meta({}) T> {
+  @Meta({})
+  String x, y;
+
+  @Meta({})
+  A();
+
+  @Meta({})
+  void m() {
+    @Meta({})
+    int z;
+  }
+}
+
+@Meta({})
+enum E {
+  @Meta({})
+  v
+}
+
+class Meta {
+  final Set<int> value;
+
+  const Meta(this.value);
+}
+
+main() {}
diff --git a/tools/VERSION b/tools/VERSION
index 4c8c6f5..0226fc7 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -26,6 +26,6 @@
 CHANNEL dev
 MAJOR 2
 MINOR 2
-PATCH 0
-PRERELEASE 2
-PRERELEASE_PATCH 1
+PATCH 1
+PRERELEASE 0
+PRERELEASE_PATCH 0