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