Version 2.10.0-19.0.dev
Merge commit '78250735aafd8a71356995328ffdffdbb1aaf94e' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index 10b2831..78aa0a4 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
"constraint, update this by running tools/generate_package_config.dart."
],
"configVersion": 2,
- "generated": "2020-08-11T10:59:54.661195",
+ "generated": "2020-08-12T09:00:03.727658",
"generator": "tools/generate_package_config.dart",
"packages": [
{
@@ -299,6 +299,11 @@
"packageUri": ".nonexisting/"
},
{
+ "name": "front_end_value_class",
+ "rootUri": "../pkg/front_end/testcases/value_class",
+ "packageUri": ".nonexisting/"
+ },
+ {
"name": "frontend_server",
"rootUri": "../pkg/frontend_server",
"packageUri": "lib/",
diff --git a/DEPS b/DEPS
index 0a1e7ec..2906f58 100644
--- a/DEPS
+++ b/DEPS
@@ -137,7 +137,7 @@
"shelf_static_rev": "v0.2.8",
"shelf_packages_handler_tag": "2.0.0",
"shelf_proxy_tag": "0.1.0+7",
- "shelf_tag": "0.7.3+3",
+ "shelf_rev": "289309adc6c39aab0a63db676d550c517fc1cc2d",
"shelf_web_socket_tag": "0.2.2+3",
"source_map_stack_trace_rev": "1c3026f69d9771acf2f8c176a1ab750463309cce",
"source_maps-0.9.4_rev": "38524",
@@ -394,7 +394,7 @@
Var("dart_root") + "/third_party/pkg/resource":
Var("dart_git") + "resource.git" + "@" + Var("resource_rev"),
Var("dart_root") + "/third_party/pkg/shelf":
- Var("dart_git") + "shelf.git" + "@" + Var("shelf_tag"),
+ Var("dart_git") + "shelf.git" + "@" + Var("shelf_rev"),
Var("dart_root") + "/third_party/pkg/shelf_packages_handler":
Var("dart_git") + "shelf_packages_handler.git"
+ "@" + Var("shelf_packages_handler_tag"),
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
index abe46be..a9fbc91 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
@@ -203,6 +203,10 @@
/// A flag indicating whether local fields should be suggested.
final bool suggestLocalFields;
+ /// A flag indicating whether suggestions are being made inside an `extends`
+ /// clause.
+ bool inExtendsClause = false;
+
/// Only used when [useNewRelevance] is `false`.
int privateMemberRelevance = DART_RELEVANCE_DEFAULT;
@@ -404,7 +408,8 @@
@override
void declaredMixin(MixinDeclaration declaration) {
- if (visibilityTracker._isVisible(declaration.declaredElement) &&
+ if (!inExtendsClause &&
+ visibilityTracker._isVisible(declaration.declaredElement) &&
opType.includeTypeNameSuggestions) {
builder.suggestClass(declaration.declaredElement, kind: _defaultKind);
}
@@ -445,6 +450,12 @@
}
}
+ @override
+ void visitExtendsClause(ExtendsClause node) {
+ inExtendsClause = true;
+ return super.visitExtendsClause(node);
+ }
+
/// Return `true` if the [identifier] is composed of one or more underscore
/// characters and nothing else.
bool _isUnused(String identifier) => RegExp(r'^_+$').hasMatch(identifier);
diff --git a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
index 059880a..27138b1 100644
--- a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
@@ -15,6 +15,8 @@
import 'package:analysis_server/src/services/correction/dart/convert_documentation_into_line.dart';
import 'package:analysis_server/src/services/correction/dart/convert_quotes.dart';
import 'package:analysis_server/src/services/correction/dart/convert_to_contains.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_to_generic_function_syntax.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_to_if_null.dart';
import 'package:analysis_server/src/services/correction/dart/create_method.dart';
import 'package:analysis_server/src/services/correction/dart/make_final.dart';
import 'package:analysis_server/src/services/correction/dart/remove_argument.dart';
@@ -81,8 +83,11 @@
LintNames.prefer_equal_for_default_values:
ReplaceColonWithEquals.newInstance,
LintNames.prefer_final_fields: MakeFinal.newInstance,
+ LintNames.prefer_generic_function_type_aliases:
+ ConvertToGenericFunctionSyntax.newInstance,
LintNames.prefer_if_elements_to_conditional_expressions:
ConvertConditionalExpressionToIfElement.newInstance,
+ LintNames.prefer_if_null_operators: ConvertToIfNull.newInstance,
LintNames.prefer_is_empty: ReplaceWithIsEmpty.newInstance,
LintNames.prefer_is_not_empty: UesIsNotEmpty.newInstance,
LintNames.prefer_single_quotes: ConvertToSingleQuotes.newInstance,
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart b/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart
index 62ff87c..23594f4 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart
@@ -42,13 +42,22 @@
return <TransformSet>[];
}
- /// Return the name that was changed.
+ /// Return the name of the element that was changed.
String get _name {
var node = this.node;
if (node is SimpleIdentifier) {
return node.name;
} else if (node is ConstructorName) {
return node.name.name;
+ } else if (node is NamedType) {
+ return node.name.name;
+ } else if (node is TypeArgumentList) {
+ var parent = node.parent;
+ if (parent is MethodInvocation) {
+ return parent.methodName.name;
+ } else if (parent is ExtensionOverride) {
+ return parent.extensionName.name;
+ }
}
return null;
}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter_change.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter_change.dart
new file mode 100644
index 0000000..edc2312
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter_change.dart
@@ -0,0 +1,178 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/data_driven.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/change.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/value_extractor.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:meta/meta.dart';
+
+/// The data related to a type parameter that was added to either a function or
+/// a type.
+class AddTypeParameterChange extends Change<_Data> {
+ /// The index of the type parameter that was added.
+ final int index;
+
+ /// The name of the type parameter that was added.
+ final String name;
+
+ /// The name of the type that the type parameter extends, or `null` if the
+ /// type parameter doesn't have a bound.
+ final String extendedType;
+
+ /// The value extractor used to compute the value of the type argument.
+ final ValueExtractor value;
+
+ /// Initialize a newly created change to describe adding a type parameter to a
+ /// type or a function.
+ // TODO(brianwilkerson) Support adding multiple type parameters.
+ AddTypeParameterChange(
+ {@required this.index,
+ @required this.name,
+ @required this.value,
+ this.extendedType})
+ : assert(index >= 0),
+ assert(name != null),
+ assert(value != null);
+
+ @override
+ void apply(DartFileEditBuilder builder, DataDrivenFix fix, _Data data) {
+ if (data is _TypeArgumentData) {
+ _applyToTypeArguments(builder, data);
+ } else {
+ _applyToTypeParameters(builder, data as _TypeParameterData);
+ }
+ }
+
+ @override
+ _Data validate(DataDrivenFix fix) {
+ var node = fix.node;
+ if (node is NamedType) {
+ // wrong_number_of_type_arguments
+ // wrong_number_of_type_arguments_constructor
+ var argument = value.from(node, fix.utils);
+ if (argument == null) {
+ return null;
+ }
+ var typeArguments = node.typeArguments;
+ if (_isInvalidIndex(typeArguments?.arguments)) {
+ return null;
+ }
+ return _TypeArgumentData(typeArguments, argument, node.name.end);
+ }
+ var parent = node.parent;
+ if (parent is InvocationExpression) {
+ // wrong_number_of_type_arguments_method
+ var argument = value.from(parent, fix.utils);
+ if (argument == null) {
+ return null;
+ }
+ var typeArguments = parent.typeArguments;
+ if (_isInvalidIndex(typeArguments?.arguments)) {
+ return null;
+ }
+ return _TypeArgumentData(
+ typeArguments, argument, parent.argumentList.offset);
+ } else if (parent is MethodDeclaration) {
+ // invalid_override
+ var typeParameters = parent.typeParameters;
+ if (_isInvalidIndex(typeParameters?.typeParameters)) {
+ return null;
+ }
+ return _TypeParameterData(typeParameters, parent.name.end);
+ } else if (node is TypeArgumentList && parent is ExtensionOverride) {
+ // wrong_number_of_type_arguments_extension
+ var argument = value.from(node, fix.utils);
+ if (argument == null) {
+ return null;
+ }
+ if (_isInvalidIndex(node?.arguments)) {
+ return null;
+ }
+ return _TypeArgumentData(node, argument, parent.extensionName.end);
+ }
+ return null;
+ }
+
+ void _applyToTypeArguments(
+ DartFileEditBuilder builder, _TypeArgumentData data) {
+ var typeArguments = data.typeArguments;
+ var argumentValue = data.argumentValue;
+ if (typeArguments == null) {
+ // Adding the first type argument.
+ builder.addSimpleInsertion(data.newListOffset, '<$argumentValue>');
+ } else {
+ if (index == 0) {
+ // Inserting the type argument at the beginning of the list.
+ builder.addSimpleInsertion(
+ typeArguments.leftBracket.end, '$argumentValue, ');
+ } else {
+ // Inserting the type argument after an existing type argument.
+ var previous = typeArguments.arguments[index - 1];
+ builder.addSimpleInsertion(previous.end, ', $argumentValue');
+ }
+ }
+ }
+
+ void _applyToTypeParameters(
+ DartFileEditBuilder builder, _TypeParameterData data) {
+ var argumentValue =
+ extendedType == null ? name : '$name extends $extendedType';
+ var typeParameters = data.typeParameters;
+ if (typeParameters == null) {
+ // Adding the first type argument.
+ builder.addSimpleInsertion(data.newListOffset, '<$argumentValue>');
+ } else {
+ if (index == 0) {
+ // Inserting the type argument at the beginning of the list.
+ builder.addSimpleInsertion(
+ typeParameters.leftBracket.end, '$argumentValue, ');
+ } else {
+ // Inserting the type argument after an existing type argument.
+ var previous = typeParameters.typeParameters[index - 1];
+ builder.addSimpleInsertion(previous.end, ', $argumentValue');
+ }
+ }
+ }
+
+ bool _isInvalidIndex(List<AstNode> list) {
+ var length = list == null ? 0 : list.length;
+ return index > length;
+ }
+}
+
+/// The data returned when adding a type parameter.
+class _Data {}
+
+/// The data returned when updating a type argument list.
+class _TypeArgumentData extends _Data {
+ /// The list of type arguments to which a new type argument is being added, or
+ /// `null` if the first type argument is being added.
+ final TypeArgumentList typeArguments;
+
+ /// The value of the type argument being added.
+ final String argumentValue;
+
+ /// The offset at which the type argument list should be inserted if
+ /// [typeArguments] is `null`.
+ final int newListOffset;
+
+ /// Initialize newly created data.
+ _TypeArgumentData(this.typeArguments, this.argumentValue, this.newListOffset);
+}
+
+/// The data returned when updating a type parameter list.
+class _TypeParameterData extends _Data {
+ /// The list of type parameters to which a new type paramete is being added,
+ /// or `null` if the first type parameter is being added.
+ final TypeParameterList typeParameters;
+
+ /// The offset at which the type parameter list should be inserted if
+ /// [typeParameters] is `null`.
+ final int newListOffset;
+
+ /// Initialize newly created data.
+ _TypeParameterData(this.typeParameters, this.newListOffset);
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/convert_argument_to_type_argument_change.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/convert_argument_to_type_argument_change.dart
deleted file mode 100644
index 80649d4..0000000
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/convert_argument_to_type_argument_change.dart
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/data_driven.dart';
-import 'package:analysis_server/src/services/correction/fix/data_driven/change.dart';
-import 'package:analysis_server/src/services/correction/fix/data_driven/parameter_reference.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
-import 'package:analyzer_plugin/utilities/range_factory.dart';
-import 'package:meta/meta.dart';
-
-/// The data related to a function for which one of the `Type` valued arguments
-/// has been converted into a type argument.
-class ConvertArgumentToTypeArgumentChange extends Change<_Data> {
- /// The index of the argument that was transformed.
- final ParameterReference parameterReference;
-
- /// The index of the type argument into which the argument was transformed.
- final int typeArgumentIndex;
-
- /// Initialize a newly created transform to describe a conversion of the
- /// argument at the [argumentIndex] to the type parameter at the
- /// [typeArgumentIndex] for the function [element].
- ConvertArgumentToTypeArgumentChange(
- {@required this.parameterReference, @required this.typeArgumentIndex})
- : assert(parameterReference != null),
- assert(typeArgumentIndex >= 0);
-
- @override
- void apply(DartFileEditBuilder builder, DataDrivenFix fix, _Data data) {
- var typeArguments = data.typeArguments;
- var typeName = data.argumentValue;
- if (typeArguments == null) {
- // Adding the first type argument.
- builder.addSimpleInsertion(
- data.argumentList.offset, '<${typeName.name}>');
- } else {
- if (typeArgumentIndex == 0) {
- // Inserting the type argument at the beginning of the list.
- builder.addSimpleInsertion(
- typeArguments.leftBracket.end, '${typeName.name}, ');
- } else {
- // Inserting the type argument after an existing type argument.
- var previous = typeArguments.arguments[typeArgumentIndex - 1];
- builder.addSimpleInsertion(previous.end, ', ${typeName.name}');
- }
- }
- builder.addDeletion(range.nodeInList(data.arguments, data.argument));
- }
-
- @override
- _Data validate(DataDrivenFix fix) {
- var parent = fix.node.parent;
- if (parent is MethodInvocation) {
- var argumentList = parent.argumentList;
- var argument = parameterReference.argumentFrom(argumentList);
- if (argument is! SimpleIdentifier) {
- return null;
- }
- var typeArguments = parent.typeArguments;
- var typeArgumentLength =
- typeArguments == null ? 0 : typeArguments.arguments.length;
- if (typeArgumentIndex > typeArgumentLength) {
- return null;
- }
- return _Data(argumentList, argument, typeArguments);
- }
- return null;
- }
-}
-
-class _Data {
- /// The argument list of the invocation.
- final ArgumentList argumentList;
-
- /// The value of the argument being moved to the list of type arguments.
- final Identifier argumentValue;
-
- /// The list of type arguments for the invocation, or `null` if the invocation
- /// does not have any type arguments.
- final TypeArgumentList typeArguments;
-
- _Data(this.argumentList, this.argumentValue, this.typeArguments);
-
- /// Return the argument being moved to the list of type arguments.
- Expression get argument {
- var parent = argumentValue.parent;
- if (parent is NamedExpression) {
- return parent;
- }
- return argumentValue;
- }
-
- /// The list of invocation arguments.
- NodeList<Expression> get arguments => argumentList.arguments;
-}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_extractor.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_extractor.dart
new file mode 100644
index 0000000..704eae8
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_extractor.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/fix/data_driven/parameter_reference.dart';
+import 'package:analysis_server/src/services/correction/util.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+
+/// A value extractor used to extract a specified argument of an invocation.
+class ArgumentExtractor extends ValueExtractor {
+ /// The parameter that defines the argument to be extracted.
+ final ParameterReference parameter;
+
+ /// Initialize a newly created extractor to extract the argument that
+ /// corresponds to the given [parameter].
+ ArgumentExtractor(this.parameter);
+
+ @override
+ String from(AstNode node, CorrectionUtils utils) {
+ if (node is InvocationExpression) {
+ var expression = parameter.argumentFrom(node.argumentList);
+ if (expression != null) {
+ return utils.getNodeText(expression);
+ }
+ }
+ return null;
+ }
+}
+
+/// A value extractor that returns a pre-computed piece of code.
+class LiteralExtractor extends ValueExtractor {
+ /// The code to be returned.
+ final String code;
+
+ /// Initialize a newly created extractor to return the given [code].
+ LiteralExtractor(this.code);
+
+ @override
+ String from(AstNode node, CorrectionUtils utils) {
+ return code;
+ }
+}
+
+/// An object used to extract an expression from an AST node.
+abstract class ValueExtractor {
+ /// Return code extracted from the given [node], or `null` if no code could be
+ /// extracted.
+ String from(AstNode node, CorrectionUtils utils);
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index ec4ab2e..7489132 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -515,6 +515,9 @@
ImportLibrary.forTopLevelVariable,
ImportLibrary.forType,
],
+ CompileTimeErrorCode.INVALID_OVERRIDE: [
+ DataDriven.newInstance,
+ ],
CompileTimeErrorCode.MIXIN_OF_NON_CLASS: [
ImportLibrary.forType,
],
@@ -572,6 +575,18 @@
CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER: [
ChangeArgumentName.newInstance,
],
+ CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS: [
+ DataDriven.newInstance,
+ ],
+ CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR: [
+ DataDriven.newInstance,
+ ],
+ CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION: [
+ DataDriven.newInstance,
+ ],
+ CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD: [
+ DataDriven.newInstance,
+ ],
HintCode.DEPRECATED_MEMBER_USE: [
DataDriven.newInstance,
],
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_generic_function_syntax_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_generic_function_syntax_test.dart
new file mode 100644
index 0000000..8d55491
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_generic_function_syntax_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/linter/lint_names.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'bulk_fix_processor.dart';
+
+void main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(PreferGenericFunctionTypeAliasesTest);
+ });
+}
+
+@reflectiveTest
+class PreferGenericFunctionTypeAliasesTest extends BulkFixProcessorTest {
+ @override
+ String get lintCode => LintNames.prefer_generic_function_type_aliases;
+
+ Future<void> test_singleFile() async {
+ await resolveTestUnit('''
+typedef String F(int x);
+typedef F2<P, R>(P x);
+''');
+ await assertHasFix('''
+typedef F = String Function(int x);
+typedef F2<P, R> = Function(P x);
+''');
+ }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_if_null_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_if_null_test.dart
new file mode 100644
index 0000000..d587043
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_if_null_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/linter/lint_names.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'bulk_fix_processor.dart';
+
+void main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(ConvertToIfNullTest);
+ });
+}
+
+@reflectiveTest
+class ConvertToIfNullTest extends BulkFixProcessorTest {
+ @override
+ String get lintCode => LintNames.prefer_if_null_operators;
+
+ Future<void> test_singleFile() async {
+ await resolveTestUnit('''
+void f(String s) {
+ print(s == null ? 'default' : s);
+ print(s != null ? s : 'default');
+}
+''');
+ await assertHasFix('''
+void f(String s) {
+ print(s ?? 'default');
+ print(s ?? 'default');
+}
+''');
+ }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
index 456f64d..3524501 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
@@ -9,7 +9,10 @@
import 'convert_documentation_into_line_test.dart'
as convert_documentation_into_line;
import 'convert_to_contains_test.dart' as convert_to_contains;
+import 'convert_to_generic_function_syntax_test.dart'
+ as convert_to_generic_function_syntax;
import 'convert_to_if_element_test.dart' as convert_to_if_element;
+import 'convert_to_if_null_test.dart' as convert_to_if_null;
import 'convert_to_single_quoted_strings_test.dart'
as convert_to_single_quoted_strings;
import 'convert_to_spread_test.dart' as convert_to_spread;
@@ -46,7 +49,9 @@
add_override.main();
convert_documentation_into_line.main();
convert_to_contains.main();
+ convert_to_generic_function_syntax.main();
convert_to_if_element.main();
+ convert_to_if_null.main();
convert_to_single_quoted_strings.main();
convert_to_spread.main();
create_method.main();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/add_type_parameter_change_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/add_type_parameter_change_test.dart
new file mode 100644
index 0000000..9b13ab0
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/add_type_parameter_change_test.dart
@@ -0,0 +1,280 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/fix/data_driven/add_type_parameter_change.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/element_descriptor.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/transform.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/value_extractor.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'data_driven_test_support.dart';
+
+void main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(AddTypeParameterChange_DeprecatedMemberUseTest);
+ defineReflectiveTests(AddTypeParameterChange_InvalidOverrideTest);
+ defineReflectiveTests(
+ AddTypeParameterChange_WrongNumberOfTypeArgumentsTest);
+ });
+}
+
+@reflectiveTest
+class AddTypeParameterChange_DeprecatedMemberUseTest
+ extends _AddTypeParameterChange {
+ Future<void> test_method_first() async {
+ setPackageContent('''
+class C {
+ @deprecated
+ void m<T>() {}
+}
+''');
+ setPackageData(_add(0));
+ await resolveTestUnit('''
+import '$importUri';
+
+void f(C c) {
+ c.m<int>();
+}
+''');
+ await assertHasFix('''
+import '$importUri';
+
+void f(C c) {
+ c.m<String, int>();
+}
+''');
+ }
+
+ Future<void> test_method_last() async {
+ setPackageContent('''
+class C {
+ @deprecated
+ void m<S, T>() {}
+}
+''');
+ setPackageData(_add(2));
+ await resolveTestUnit('''
+import '$importUri';
+
+void f(C c) {
+ c.m<int, double>();
+}
+''');
+ await assertHasFix('''
+import '$importUri';
+
+void f(C c) {
+ c.m<int, double, String>();
+}
+''');
+ }
+
+ Future<void> test_method_middle() async {
+ setPackageContent('''
+class C {
+ @deprecated
+ void m<S, U>() {}
+}
+''');
+ setPackageData(_add(1));
+ await resolveTestUnit('''
+import '$importUri';
+
+void f(C c) {
+ c.m<int, double>();
+}
+''');
+ await assertHasFix('''
+import '$importUri';
+
+void f(C c) {
+ c.m<int, String, double>();
+}
+''');
+ }
+
+ Future<void> test_method_only() async {
+ setPackageContent('''
+class C {
+ @deprecated
+ void m() {}
+}
+''');
+ setPackageData(_add(0));
+ await resolveTestUnit('''
+import '$importUri';
+
+void f(C c) {
+ c.m();
+}
+''');
+ await assertHasFix('''
+import '$importUri';
+
+void f(C c) {
+ c.m<String>();
+}
+''');
+ }
+}
+
+@reflectiveTest
+class AddTypeParameterChange_InvalidOverrideTest
+ extends _AddTypeParameterChange {
+ Future<void> test_method_bound() async {
+ setPackageContent('''
+class C {
+ void m<T extends num>() {}
+}
+''');
+ setPackageData(_add(0, extendedType: 'num'));
+ await resolveTestUnit('''
+import '$importUri';
+
+class D extends C {
+ @override
+ void m() {}
+}
+''');
+ await assertHasFix('''
+import '$importUri';
+
+class D extends C {
+ @override
+ void m<T extends num>() {}
+}
+''');
+ }
+
+ Future<void> test_method_noBound() async {
+ setPackageContent('''
+class C {
+ void m<T>() {}
+}
+''');
+ setPackageData(_add(0));
+ await resolveTestUnit('''
+import '$importUri';
+
+class D extends C {
+ @override
+ void m() {}
+}
+''');
+ await assertHasFix('''
+import '$importUri';
+
+class D extends C {
+ @override
+ void m<T>() {}
+}
+''');
+ }
+}
+
+@reflectiveTest
+class AddTypeParameterChange_WrongNumberOfTypeArgumentsTest
+ extends _AddTypeParameterChange {
+ Future<void> test_class() async {
+ setPackageContent('''
+class C<S, T> {}
+''');
+ setPackageData(_add(0, components: ['C']));
+ await resolveTestUnit('''
+import '$importUri';
+
+void f(C<int> c) {}
+''');
+ await assertHasFix('''
+import '$importUri';
+
+void f(C<String, int> c) {}
+''');
+ }
+
+ Future<void> test_constructor() async {
+ setPackageContent('''
+class C<S, T> {
+ void C() {}
+}
+''');
+ setPackageData(_add(0, components: ['C', 'C']));
+ await resolveTestUnit('''
+import '$importUri';
+
+C f() {
+ return C<int>();
+}
+''');
+ await assertHasFix('''
+import '$importUri';
+
+C f() {
+ return C<String, int>();
+}
+''');
+ }
+
+ Future<void> test_extension() async {
+ setPackageContent('''
+class C {}
+extension E<S, T> on C {
+ void m() {}
+}
+''');
+ setPackageData(_add(0, components: ['E']));
+ await resolveTestUnit('''
+import '$importUri';
+
+void f(C c) {
+ E<int>(c).m();
+}
+''');
+ await assertHasFix('''
+import '$importUri';
+
+void f(C c) {
+ E<String, int>(c).m();
+}
+''');
+ }
+
+ Future<void> test_method() async {
+ setPackageContent('''
+class C {
+ void m<S, T>() {}
+}
+''');
+ setPackageData(_add(0));
+ await resolveTestUnit('''
+import '$importUri';
+
+void f(C c) {
+ c.m<int>();
+}
+''');
+ await assertHasFix('''
+import '$importUri';
+
+void f(C c) {
+ c.m<String, int>();
+}
+''');
+ }
+}
+
+abstract class _AddTypeParameterChange extends DataDrivenFixProcessorTest {
+ Transform _add(int index, {List<String> components, String extendedType}) =>
+ Transform(
+ title: 'title',
+ element: ElementDescriptor(
+ libraryUris: [importUri], components: components ?? ['C', 'm']),
+ changes: [
+ AddTypeParameterChange(
+ extendedType: extendedType,
+ index: index,
+ name: 'T',
+ value: LiteralExtractor('String')),
+ ]);
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/convert_argument_to_type_argument_change_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/convert_argument_to_type_argument_change_test.dart
deleted file mode 100644
index 7b5db56..0000000
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/convert_argument_to_type_argument_change_test.dart
+++ /dev/null
@@ -1,362 +0,0 @@
-// Copyright (c) 2020, 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:analysis_server/src/services/correction/fix.dart';
-import 'package:analysis_server/src/services/correction/fix/data_driven/convert_argument_to_type_argument_change.dart';
-import 'package:analysis_server/src/services/correction/fix/data_driven/element_descriptor.dart';
-import 'package:analysis_server/src/services/correction/fix/data_driven/parameter_reference.dart';
-import 'package:analysis_server/src/services/correction/fix/data_driven/rename_change.dart';
-import 'package:analysis_server/src/services/correction/fix/data_driven/transform.dart';
-import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import 'data_driven_test_support.dart';
-
-void main() {
- defineReflectiveSuite(() {
- defineReflectiveTests(
- ConvertArgumentToTypeArgumentChange_DeprecatedMemberUseTest);
- });
-}
-
-@reflectiveTest
-class ConvertArgumentToTypeArgumentChange_DeprecatedMemberUseTest
- extends DataDrivenFixProcessorTest {
- @override
- FixKind get kind => DartFixKind.DATA_DRIVEN;
-
- Future<void> test_method_named_first_only() async {
- addMetaPackage();
- setPackageContent('''
-import 'package:meta/meta.dart';
-
-class C {
- @deprecated
- int m1({Type t, int x}) {}
- int m2<T>({int x}) {}
-}
-''');
- setPackageData(_convertNamed(['C', 'm1'], 'm2', 't', 0));
- await resolveTestUnit('''
-import '$importUri';
-
-void f(C c) {
- c.m1(t: int, x: 0);
-}
-''');
- await assertHasFix('''
-import '$importUri';
-
-void f(C c) {
- c.m2<int>(x: 0);
-}
-''');
- }
-
- Future<void> test_method_named_last_only() async {
- addMetaPackage();
- setPackageContent('''
-import 'package:meta/meta.dart';
-
-class C {
- @deprecated
- int m1({int x, int y, Type t}) {}
- int m2<T>({int x, int y}) {}
-}
-''');
- setPackageData(_convertNamed(['C', 'm1'], 'm2', 't', 0));
- await resolveTestUnit('''
-import '$importUri';
-
-void f(C c) {
- c.m1(x: 0, y: 1, t: int);
-}
-''');
- await assertHasFix('''
-import '$importUri';
-
-void f(C c) {
- c.m2<int>(x: 0, y: 1);
-}
-''');
- }
-
- Future<void> test_method_named_middle_only() async {
- addMetaPackage();
- setPackageContent('''
-import 'package:meta/meta.dart';
-
-class C {
- @deprecated
- int m1({int x, Type t, int y}) {}
- int m2<T>({int x, int y}) {}
-}
-''');
- setPackageData(_convertNamed(['C', 'm1'], 'm2', 't', 0));
- await resolveTestUnit('''
-import '$importUri';
-
-void f(C c) {
- c.m1(x: 0, t: int, y: 1);
-}
-''');
- await assertHasFix('''
-import '$importUri';
-
-void f(C c) {
- c.m2<int>(x: 0, y: 1);
-}
-''');
- }
-
- Future<void> test_method_named_mixed_only() async {
- addMetaPackage();
- setPackageContent('''
-import 'package:meta/meta.dart';
-
-class C {
- @deprecated
- int m1(int x, {Type t, int y}) {}
- int m2<T>(int x, {int y}) {}
-}
-''');
- setPackageData(_convertNamed(['C', 'm1'], 'm2', 't', 0));
- await resolveTestUnit('''
-import '$importUri';
-
-void f(C c) {
- c.m1(0, t: int, y: 1);
-}
-''');
- await assertHasFix('''
-import '$importUri';
-
-void f(C c) {
- c.m2<int>(0, y: 1);
-}
-''');
- }
-
- Future<void> test_method_positional_first_only() async {
- addMetaPackage();
- setPackageContent('''
-import 'package:meta/meta.dart';
-
-class C {
- @deprecated
- int m1(Type t, int x) {}
- int m2<T>(int x) {}
-}
-''');
- setPackageData(_convertPositional(['C', 'm1'], 'm2', 0, 0));
- await resolveTestUnit('''
-import '$importUri';
-
-void f(C c) {
- c.m1(int, 0);
-}
-''');
- await assertHasFix('''
-import '$importUri';
-
-void f(C c) {
- c.m2<int>(0);
-}
-''');
- }
-
- Future<void> test_method_positional_last_only() async {
- addMetaPackage();
- setPackageContent('''
-import 'package:meta/meta.dart';
-
-class C {
- @deprecated
- int m1(int x, int y, Type t) {}
- int m2<T>(int x, int y) {}
-}
-''');
- setPackageData(_convertPositional(['C', 'm1'], 'm2', 2, 0));
- await resolveTestUnit('''
-import '$importUri';
-
-void f(C c) {
- c.m1(0, 1, int);
-}
-''');
- await assertHasFix('''
-import '$importUri';
-
-void f(C c) {
- c.m2<int>(0, 1);
-}
-''');
- }
-
- Future<void> test_method_positional_middle_only() async {
- addMetaPackage();
- setPackageContent('''
-import 'package:meta/meta.dart';
-
-class C {
- @deprecated
- int m1(int x, Type t, int y) {}
- int m2<T>(int x, int y) {}
-}
-''');
- setPackageData(_convertPositional(['C', 'm1'], 'm2', 1, 0));
- await resolveTestUnit('''
-import '$importUri';
-
-void f(C c) {
- c.m1(0, int, 1);
-}
-''');
- await assertHasFix('''
-import '$importUri';
-
-void f(C c) {
- c.m2<int>(0, 1);
-}
-''');
- }
-
- Future<void> test_method_positional_only_first() async {
- addMetaPackage();
- setPackageContent('''
-import 'package:meta/meta.dart';
-
-class C {
- @deprecated
- int m1<T>(Type t) {}
- int m2<S, T>() {}
-}
-''');
- setPackageData(_convertPositional(['C', 'm1'], 'm2', 0, 0));
- await resolveTestUnit('''
-import '$importUri';
-
-void f(C c) {
- c.m1<int>(String);
-}
-''');
- await assertHasFix('''
-import '$importUri';
-
-void f(C c) {
- c.m2<String, int>();
-}
-''');
- }
-
- Future<void> test_method_positional_only_last() async {
- addMetaPackage();
- setPackageContent('''
-import 'package:meta/meta.dart';
-
-class C {
- @deprecated
- int m1<S, T>(Type t) {}
- int m2<S, T, U>() {}
-}
-''');
- setPackageData(_convertPositional(['C', 'm1'], 'm2', 0, 2));
- await resolveTestUnit('''
-import '$importUri';
-
-void f(C c) {
- c.m1<int, double>(String);
-}
-''');
- await assertHasFix('''
-import '$importUri';
-
-void f(C c) {
- c.m2<int, double, String>();
-}
-''');
- }
-
- Future<void> test_method_positional_only_middle() async {
- addMetaPackage();
- setPackageContent('''
-import 'package:meta/meta.dart';
-
-class C {
- @deprecated
- int m1<S, U>(Type t) {}
- int m2<S, T, U>() {}
-}
-''');
- setPackageData(_convertPositional(['C', 'm1'], 'm2', 0, 1));
- await resolveTestUnit('''
-import '$importUri';
-
-void f(C c) {
- c.m1<int, double>(String);
-}
-''');
- await assertHasFix('''
-import '$importUri';
-
-void f(C c) {
- c.m2<int, String, double>();
-}
-''');
- }
-
- Future<void> test_method_positional_only_only() async {
- addMetaPackage();
- setPackageContent('''
-import 'package:meta/meta.dart';
-
-class C {
- @deprecated
- int m1(Type t) {}
- int m2<T>() {}
-}
-''');
- setPackageData(_convertPositional(['C', 'm1'], 'm2', 0, 0));
- await resolveTestUnit('''
-import '$importUri';
-
-void f(C c) {
- c.m1(int);
-}
-''');
- await assertHasFix('''
-import '$importUri';
-
-void f(C c) {
- c.m2<int>();
-}
-''');
- }
-
- Transform _convertNamed(List<String> components, String newName,
- String parameterName, int typeArgumentIndex) =>
- Transform(
- title: 'title',
- element: ElementDescriptor(
- libraryUris: [importUri], components: components),
- changes: [
- RenameChange(newName: newName),
- ConvertArgumentToTypeArgumentChange(
- parameterReference: NamedParameterReference(parameterName),
- typeArgumentIndex: typeArgumentIndex),
- ]);
-
- Transform _convertPositional(List<String> components, String newName,
- int argumentIndex, int typeArgumentIndex) =>
- Transform(
- title: 'title',
- element: ElementDescriptor(
- libraryUris: [importUri], components: components),
- changes: [
- RenameChange(newName: newName),
- ConvertArgumentToTypeArgumentChange(
- parameterReference: PositionalParameterReference(argumentIndex),
- typeArgumentIndex: typeArgumentIndex),
- ]);
-}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart
index 5198cf1..6aaca00 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart
@@ -3,8 +3,10 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:analysis_server/src/services/correction/dart/data_driven.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analysis_server/src/services/correction/fix/data_driven/transform.dart';
import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
import '../fix_processor.dart';
@@ -14,6 +16,9 @@
/// Return the URI used to import the library created by [setPackageContent].
String get importUri => 'package:p/lib.dart';
+ @override
+ FixKind get kind => DartFixKind.DATA_DRIVEN;
+
/// Set the content of the library that defines the element referenced by the
/// data on which this test is based.
void setPackageContent(String content) {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_change_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_change_test.dart
index 87aec0f..8d628e2 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_change_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_change_test.dart
@@ -2,11 +2,9 @@
// 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:analysis_server/src/services/correction/fix.dart';
import 'package:analysis_server/src/services/correction/fix/data_driven/element_descriptor.dart';
import 'package:analysis_server/src/services/correction/fix/data_driven/rename_change.dart';
import 'package:analysis_server/src/services/correction/fix/data_driven/transform.dart';
-import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'data_driven_test_support.dart';
@@ -19,9 +17,6 @@
@reflectiveTest
class RenameChange_DeprecatedMemberUseTest extends DataDrivenFixProcessorTest {
- @override
- FixKind get kind => DartFixKind.DATA_DRIVEN;
-
Future<void> test_class() async {
addMetaPackage();
setPackageContent('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart
index 522023a..dd6eaea 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart
@@ -4,13 +4,12 @@
import 'package:test_reflective_loader/test_reflective_loader.dart';
-import 'convert_argument_to_type_argument_change_test.dart'
- as convert_argument_to_type_argument_change;
+import 'add_type_parameter_change_test.dart' as add_type_parameter_change;
import 'rename_change_test.dart' as rename_change;
void main() {
defineReflectiveSuite(() {
- convert_argument_to_type_argument_change.main();
+ add_type_parameter_change.main();
rename_change.main();
});
}
diff --git a/pkg/analyzer/lib/src/context/packages.dart b/pkg/analyzer/lib/src/context/packages.dart
index 8ea6b3b..5ef1a56 100644
--- a/pkg/analyzer/lib/src/context/packages.dart
+++ b/pkg/analyzer/lib/src/context/packages.dart
@@ -116,18 +116,22 @@
/// location). OTOH, if the file has the `.packages` format, still look
/// for a `.dart_tool/package_config.json` relative to the specified [file].
Packages parsePackagesFile(ResourceProvider provider, File file) {
- var content = file.readAsStringSync();
- var isJson = content.trimLeft().startsWith('{');
- if (isJson) {
- return parsePackageConfigJsonFile(provider, file);
- } else {
- var relativePackageConfigFile = file.parent
- .getChildAssumingFolder('.dart_tool')
- .getChildAssumingFile('package_config.json');
- if (relativePackageConfigFile.exists) {
- return parsePackageConfigJsonFile(provider, relativePackageConfigFile);
+ try {
+ var content = file.readAsStringSync();
+ var isJson = content.trimLeft().startsWith('{');
+ if (isJson) {
+ return parsePackageConfigJsonFile(provider, file);
+ } else {
+ var relativePackageConfigFile = file.parent
+ .getChildAssumingFolder('.dart_tool')
+ .getChildAssumingFile('package_config.json');
+ if (relativePackageConfigFile.exists) {
+ return parsePackageConfigJsonFile(provider, relativePackageConfigFile);
+ }
+ return parseDotPackagesFile(provider, file);
}
- return parseDotPackagesFile(provider, file);
+ } catch (e) {
+ return Packages.empty;
}
}
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
index d536249..e4c6c31 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
@@ -37,8 +37,14 @@
/// The name of the analysis options file.
static const String ANALYSIS_OPTIONS_NAME = 'analysis_options.yaml';
+ /// The name of the `.dart_tool` directory.
+ static const String DOT_DART_TOOL_NAME = '.dart_tool';
+
/// The name of the packages file.
- static const String PACKAGES_FILE_NAME = '.packages';
+ static const String PACKAGE_CONFIG_JSON_NAME = 'package_config.json';
+
+ /// The name of the packages file.
+ static const String DOT_PACKAGES_NAME = '.packages';
/// The resource provider used to access the file system.
final ResourceProvider resourceProvider;
@@ -371,7 +377,16 @@
/// Return the packages file in the given [folder], or `null` if the folder
/// does not contain a packages file.
- File _getPackagesFile(Folder folder) => _getFile(folder, PACKAGES_FILE_NAME);
+ File _getPackagesFile(Folder folder) {
+ var file = folder
+ .getChildAssumingFolder(DOT_DART_TOOL_NAME)
+ .getChildAssumingFile(PACKAGE_CONFIG_JSON_NAME);
+ if (file.exists) {
+ return file;
+ }
+
+ return _getFile(folder, DOT_PACKAGES_NAME);
+ }
/// Add to the given lists of [folders] and [files] all of the resources in
/// the given list of [paths] that exist and are not contained within one of
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 6b27004..b126f7e 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -3423,7 +3423,7 @@
static const CompileTimeErrorCode FINAL_NOT_INITIALIZED_CONSTRUCTOR_1 =
CompileTimeErrorCodeWithUniqueName(
'FINAL_NOT_INITIALIZED_CONSTRUCTOR',
- 'CompileTimeErrorCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1',
+ 'FINAL_NOT_INITIALIZED_CONSTRUCTOR_1',
"All final variables must be initialized, but '{0}' isn't.",
correction: "Try adding an initializer for the field.",
hasPublishedDocs: true);
@@ -3436,7 +3436,7 @@
static const CompileTimeErrorCode FINAL_NOT_INITIALIZED_CONSTRUCTOR_2 =
CompileTimeErrorCodeWithUniqueName(
'FINAL_NOT_INITIALIZED_CONSTRUCTOR',
- 'CompileTimeErrorCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_2',
+ 'FINAL_NOT_INITIALIZED_CONSTRUCTOR_2',
"All final variables must be initialized, but '{0}' and '{1}' "
"aren't.",
correction: "Try adding initializers for the fields.",
@@ -3451,7 +3451,7 @@
static const CompileTimeErrorCode FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS =
CompileTimeErrorCodeWithUniqueName(
'FINAL_NOT_INITIALIZED_CONSTRUCTOR',
- 'CompileTimeErrorCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_3',
+ 'FINAL_NOT_INITIALIZED_CONSTRUCTOR_3',
"All final variables must be initialized, but '{0}', '{1}', and {2} "
"others aren't.",
correction: "Try adding initializers for the fields.",
@@ -5877,7 +5877,7 @@
NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS =
CompileTimeErrorCodeWithUniqueName(
'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER',
- ' CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS',
+ 'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS',
"Missing concrete implementations of '{0}', '{1}', '{2}', '{3}', and "
"{4} more.",
correction: "Try implementing the missing methods, or make the class "
@@ -5895,7 +5895,7 @@
NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR =
CompileTimeErrorCodeWithUniqueName(
'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER',
- ' CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR',
+ 'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR',
"Missing concrete implementations of '{0}', '{1}', '{2}', and '{3}'.",
correction: "Try implementing the missing methods, or make the class "
"abstract.",
@@ -5968,7 +5968,7 @@
NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE =
CompileTimeErrorCodeWithUniqueName(
'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER',
- ' CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE',
+ 'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE',
"Missing concrete implementation of '{0}'.",
correction: "Try implementing the missing method, or make the class "
"abstract.",
@@ -5984,7 +5984,7 @@
NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE =
CompileTimeErrorCodeWithUniqueName(
'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER',
- 'CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE',
+ 'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE',
"Missing concrete implementations of '{0}', '{1}', and '{2}'.",
correction: "Try implementing the missing methods, or make the class "
"abstract.",
@@ -5999,7 +5999,7 @@
NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO =
CompileTimeErrorCodeWithUniqueName(
'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER',
- 'CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO',
+ 'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO',
"Missing concrete implementations of '{0}' and '{1}'.",
correction: "Try implementing the missing methods, or make the class "
"abstract.",
@@ -8101,7 +8101,7 @@
static const CompileTimeErrorCode RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR =
CompileTimeErrorCodeWithUniqueName(
'RETURN_OF_INVALID_TYPE',
- 'CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR',
+ 'RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR',
"A value of type '{0}' can't be returned from constructor '{2}' "
"because it has a return type of '{1}'.",
hasPublishedDocs: true);
@@ -8143,7 +8143,7 @@
static const CompileTimeErrorCode RETURN_OF_INVALID_TYPE_FROM_FUNCTION =
CompileTimeErrorCodeWithUniqueName(
'RETURN_OF_INVALID_TYPE',
- 'CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION',
+ 'RETURN_OF_INVALID_TYPE_FROM_FUNCTION',
"A value of type '{0}' can't be returned from function '{2}' because "
"it has a return type of '{1}'.",
hasPublishedDocs: true);
@@ -8157,7 +8157,7 @@
static const CompileTimeErrorCode RETURN_OF_INVALID_TYPE_FROM_METHOD =
CompileTimeErrorCodeWithUniqueName(
'RETURN_OF_INVALID_TYPE',
- 'CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_METHOD',
+ 'RETURN_OF_INVALID_TYPE_FROM_METHOD',
"A value of type '{0}' can't be returned from method '{2}' because "
"it has a return type of '{1}'.",
hasPublishedDocs: true);
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 056efeb..e891a3e 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -3604,8 +3604,14 @@
}
var parent = node.parent;
- if (parent is FieldDeclaration && parent.externalKeyword != null) {
- return;
+ if (parent is FieldDeclaration) {
+ if (parent.externalKeyword != null) {
+ return;
+ }
+ } else if (parent is TopLevelVariableDeclaration) {
+ if (parent.externalKeyword != null) {
+ return;
+ }
}
if (node.type == null) {
diff --git a/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart b/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
index 13aee9b..24e1ae5 100644
--- a/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
+++ b/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
@@ -66,7 +66,7 @@
}
File newPackagesFile(String directoryPath) {
- String path = join(directoryPath, ContextLocatorImpl.PACKAGES_FILE_NAME);
+ String path = join(directoryPath, ContextLocatorImpl.DOT_PACKAGES_NAME);
return newFile(path);
}
diff --git a/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart b/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
index 1d80cb1..bed8770 100644
--- a/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
@@ -352,6 +352,42 @@
expect(outerRoot.packagesFile, overridePackagesFile);
}
+ void test_locateRoots_nested_packageConfigJson() {
+ var outerRootFolder = newFolder('/test/outer');
+ var outerOptionsFile = newOptionsFile('/test/outer');
+ var outerPackagesFile = _newPackageConfigFile('/test/outer');
+ var innerRootFolder = newFolder('/test/outer/examples/inner');
+ var innerPackagesFile = _newPackageConfigFile('/test/outer/examples/inner');
+
+ var roots = contextLocator.locateRoots(
+ includedPaths: [outerRootFolder.path],
+ );
+ expect(roots, hasLength(2));
+
+ var outerRoot = findRoot(roots, outerRootFolder);
+ expect(outerRoot.includedPaths, unorderedEquals([outerRootFolder.path]));
+ expect(
+ outerRoot.excludedPaths,
+ unorderedEquals([
+ outerPackagesFile.parent.path,
+ innerRootFolder.path,
+ ]),
+ );
+ expect(outerRoot.optionsFile, outerOptionsFile);
+ expect(outerRoot.packagesFile, outerPackagesFile);
+
+ var innerRoot = findRoot(roots, innerRootFolder);
+ expect(innerRoot.includedPaths, unorderedEquals([innerRootFolder.path]));
+ expect(
+ innerRoot.excludedPaths,
+ unorderedEquals([
+ innerPackagesFile.parent.path,
+ ]),
+ );
+ expect(innerRoot.optionsFile, outerOptionsFile);
+ expect(innerRoot.packagesFile, innerPackagesFile);
+ }
+
void test_locateRoots_nested_packages() {
Folder outerRootFolder = newFolder('/test/outer');
File outerOptionsFile = newOptionsFile('/test/outer');
@@ -529,6 +565,27 @@
expect(package1Root.packagesFile, packagesFile);
}
+ void test_locateRoots_single_dir_prefer_packageConfigJson() {
+ var rootFolder = newFolder('/test');
+ var optionsFile = newOptionsFile('/test');
+ newPackagesFile('/test'); // the file is not used
+ var packageConfigJsonFile = _newPackageConfigFile('/test');
+
+ var roots = contextLocator.locateRoots(includedPaths: [rootFolder.path]);
+ expect(roots, hasLength(1));
+
+ var contentRoot = findRoot(roots, rootFolder);
+ expect(contentRoot.includedPaths, unorderedEquals([rootFolder.path]));
+ expect(
+ contentRoot.excludedPaths,
+ unorderedEquals(
+ [packageConfigJsonFile.parent.path],
+ ),
+ );
+ expect(contentRoot.optionsFile, optionsFile);
+ expect(contentRoot.packagesFile, packageConfigJsonFile);
+ }
+
void test_locateRoots_single_file_inheritedOptions_directPackages() {
File optionsFile = newOptionsFile('/test');
File packagesFile = newPackagesFile('/test/root');
@@ -544,4 +601,13 @@
expect(package1Root.optionsFile, optionsFile);
expect(package1Root.packagesFile, packagesFile);
}
+
+ File _newPackageConfigFile(String directoryPath) {
+ String path = join(
+ directoryPath,
+ ContextLocatorImpl.DOT_DART_TOOL_NAME,
+ ContextLocatorImpl.PACKAGE_CONFIG_JSON_NAME,
+ );
+ return newFile(path);
+ }
}
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index 6022962..fceef52 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -184,8 +184,6 @@
}
}
- /// TODO(scheglov) Replace this with a method that changes a file in
- /// [AnalysisContextCollectionImpl].
AnalysisDriver driverFor(String path) {
var context = contextFor(path) as DriverBasedAnalysisContext;
return context.driver;
@@ -241,6 +239,79 @@
}
}
+class PackageConfigFileBuilder {
+ final List<_PackageDescription> _packages = [];
+
+ void add({
+ @required String name,
+ @required String rootPath,
+ String packageUri = 'lib/',
+ String languageVersion,
+ }) {
+ if (_packages.any((e) => e.name == name)) {
+ throw StateError('Already added: $name');
+ }
+ _packages.add(
+ _PackageDescription(
+ name: name,
+ rootPath: rootPath,
+ packageUri: packageUri,
+ languageVersion: languageVersion,
+ ),
+ );
+ }
+
+ String toContent(String Function(String) toUriStr) {
+ var buffer = StringBuffer();
+
+ buffer.writeln('{');
+
+ var prefix = ' ' * 2;
+ buffer.writeln('$prefix"configVersion": 2,');
+ buffer.writeln('$prefix"packages": [');
+
+ for (var i = 0; i < _packages.length; i++) {
+ var package = _packages[i];
+
+ var prefix = ' ' * 4;
+ buffer.writeln('$prefix{');
+
+ prefix = ' ' * 6;
+ buffer.writeln('$prefix"name": "${package.name}",');
+
+ var rootUri = toUriStr(package.rootPath);
+ buffer.write('$prefix"rootUri": "$rootUri"');
+
+ if (package.packageUri != null) {
+ buffer.writeln(',');
+ buffer.write('$prefix"packageUri": "${package.packageUri}"');
+ }
+
+ if (package.languageVersion != null) {
+ buffer.writeln(',');
+ buffer.write('$prefix"languageVersion": "${package.languageVersion}"');
+ }
+
+ buffer.writeln();
+
+ prefix = ' ' * 4;
+ buffer.write(prefix);
+ buffer.writeln(i < _packages.length - 1 ? '},' : '}');
+ }
+
+ buffer.writeln(' ]');
+ buffer.writeln('}');
+
+ return buffer.toString();
+ }
+
+ PackageConfigFileBuilder _copy() {
+ var copy = PackageConfigFileBuilder();
+ copy._packages.addAll(_packages);
+ return copy;
+ }
+}
+
class PubPackageResolutionTest extends ContextResolutionTest {
AnalysisOptionsImpl get analysisOptions {
var path = convertPath(testPackageRootPath);
@@ -262,7 +333,13 @@
@override
void setUp() {
super.setUp();
- writeTestPackageConfig({});
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ );
+ }
+
+ void writePackageConfig(String path, PackageConfigFileBuilder config) {
+ newFile(path, content: config.toContent(toUriStr));
}
void writeTestPackageAnalysisOptionsFile(AnalysisOptionsFileConfig config) {
@@ -272,39 +349,36 @@
);
}
- void writeTestPackageConfig(Map<String, String> nameToRootPath) {
- nameToRootPath = {'test': testPackageRootPath, ...nameToRootPath};
-
- var packagesFileBuffer = StringBuffer();
- for (var entry in nameToRootPath.entries) {
- var name = entry.key;
- var rootPath = entry.value;
- packagesFileBuffer.writeln(name + ':' + toUriStr('$rootPath/lib'));
- }
- // TODO(scheglov) Use package_config.json
- newFile(
- '$testPackageRootPath/.packages',
- content: '$packagesFileBuffer',
- );
- }
-
- void writeTestPackageConfigWith(
- Map<String, String> nameToRootPath, {
+ void writeTestPackageConfig(
+ PackageConfigFileBuilder config, {
+ bool js = false,
bool meta = false,
}) {
- var metaPath = '/packages/meta';
- MockPackages.addMetaPackageFiles(
- getFolder(metaPath),
- );
+ config = config._copy();
+ config.add(name: 'test', rootPath: testPackageRootPath);
- writeTestPackageConfig({
- if (meta) 'meta': metaPath,
- ...nameToRootPath,
- });
+ if (js) {
+ var jsPath = '/packages/js';
+ MockPackages.addJsPackageFiles(
+ getFolder(jsPath),
+ );
+ config.add(name: 'js', rootPath: jsPath);
+ }
+
+ if (meta) {
+ var metaPath = '/packages/meta';
+ MockPackages.addMetaPackageFiles(
+ getFolder(metaPath),
+ );
+ config.add(name: 'meta', rootPath: metaPath);
+ }
+
+ var path = '$testPackageRootPath/.dart_tool/package_config.json';
+ writePackageConfig(path, config);
}
void writeTestPackageConfigWithMeta() {
- writeTestPackageConfigWith({}, meta: true);
+ writeTestPackageConfig(PackageConfigFileBuilder(), meta: true);
}
void writeTestPackagePubspecYamlFile(PubspecYamlFileConfig config) {
@@ -348,3 +422,17 @@
);
}
}
+
+class _PackageDescription {
+ final String name;
+ final String rootPath;
+ final String packageUri;
+ final String languageVersion;
+
+ _PackageDescription({
+ @required this.name,
+ @required this.rootPath,
+ @required this.packageUri,
+ @required this.languageVersion,
+ });
+}
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
index 0e37307..4833c25 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
@@ -33,9 +33,10 @@
void setUp() {
super.setUp();
- writeTestPackageConfig({
- 'aaa': '$workspaceRootPath/aaa',
- });
+ writeTestPackageConfig(
+ PackageConfigFileBuilder()
+ ..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa'),
+ );
}
test_export() async {
@@ -302,9 +303,10 @@
class DeprecatedMemberUse_PackageBuildWorkspaceTest
extends _PackageBuildWorkspaceBase {
test_generated() async {
- writeTestPackageConfig({
- 'aaa': '$workspaceRootPath/aaa',
- });
+ writeTestPackageConfig(
+ PackageConfigFileBuilder()
+ ..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa'),
+ );
newFile('$testPackageRootPath/pubspec.yaml', content: 'name: test');
_newTestPackageGeneratedFile(
@@ -326,9 +328,10 @@
}
test_lib() async {
- writeTestPackageConfig({
- 'aaa': '$workspaceRootPath/aaa',
- });
+ writeTestPackageConfig(
+ PackageConfigFileBuilder()
+ ..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa'),
+ );
newFile('$workspaceRootPath/aaa/lib/a.dart', content: r'''
@deprecated
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart
index 561b4ca..96eba3d 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart
@@ -3,7 +3,6 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/test_utilities/mock_packages.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../../generated/test_support.dart';
@@ -22,11 +21,6 @@
void setUp() {
super.setUp();
- var metaPath = '/packages/meta';
- MockPackages.addMetaPackageFiles(
- getFolder(metaPath),
- );
-
var angularMetaPath = '/packages/angular_meta';
newFile('$angularMetaPath/lib/angular_meta.dart', content: r'''
library angular.meta;
@@ -38,10 +32,11 @@
}
''');
- writeTestPackageConfig({
- 'meta': metaPath,
- 'angular_meta': angularMetaPath,
- });
+ writeTestPackageConfig(
+ PackageConfigFileBuilder()
+ ..add(name: 'angular_meta', rootPath: angularMetaPath),
+ meta: true,
+ );
}
test_export() async {
diff --git a/pkg/analyzer/test/src/diagnostics/missing_js_lib_annotation_test.dart b/pkg/analyzer/test/src/diagnostics/missing_js_lib_annotation_test.dart
index 1ad8808..82c93cd 100644
--- a/pkg/analyzer/test/src/diagnostics/missing_js_lib_annotation_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/missing_js_lib_annotation_test.dart
@@ -4,7 +4,6 @@
import 'package:analyzer/src/dart/error/hint_codes.dart';
import 'package:analyzer/src/dart/error/syntactic_errors.dart';
-import 'package:analyzer/src/test_utilities/mock_packages.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
@@ -21,11 +20,7 @@
void setUp() {
super.setUp();
- var path = '/packages/js';
- MockPackages.addJsPackageFiles(
- getFolder(path),
- );
- writeTestPackageConfig({'js': path});
+ writeTestPackageConfig(PackageConfigFileBuilder(), js: true);
}
test_class() async {
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_on_sealed_class_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_on_sealed_class_test.dart
index f140857..c12044a 100644
--- a/pkg/analyzer/test/src/diagnostics/mixin_on_sealed_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/mixin_on_sealed_class_test.dart
@@ -22,9 +22,11 @@
}
test_mixinOnSealedClass() async {
- writeTestPackageConfigWith({
- 'foo': '$workspaceRootPath/foo',
- }, meta: true);
+ writeTestPackageConfig(
+ PackageConfigFileBuilder()
+ ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+ meta: true,
+ );
newFile('$workspaceRootPath/foo/lib/foo.dart', content: r'''
import 'package:meta/meta.dart';
diff --git a/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_variable_test.dart b/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_variable_test.dart
index bb1f2d1..9a2b35b 100644
--- a/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_variable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_variable_test.dart
@@ -24,6 +24,12 @@
''');
}
+ test_external_variable_non_nullable() async {
+ await assertNoErrorsInCode('''
+external int x;
+''');
+ }
+
test_staticField_futureOr_questionArgument_none() async {
await assertNoErrorsInCode('''
import 'dart:async';
diff --git a/pkg/analyzer/test/src/diagnostics/subtype_of_sealed_class_test.dart b/pkg/analyzer/test/src/diagnostics/subtype_of_sealed_class_test.dart
index 2f784fb..3b2acfa 100644
--- a/pkg/analyzer/test/src/diagnostics/subtype_of_sealed_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/subtype_of_sealed_class_test.dart
@@ -22,9 +22,11 @@
}
test_extendingSealedClass() async {
- writeTestPackageConfigWith({
- 'foo': '$workspaceRootPath/foo',
- }, meta: true);
+ writeTestPackageConfig(
+ PackageConfigFileBuilder()
+ ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+ meta: true,
+ );
await newFile('$workspaceRootPath/foo/lib/foo.dart', content: r'''
import 'package:meta/meta.dart';
@@ -40,9 +42,11 @@
}
test_implementingSealedClass() async {
- writeTestPackageConfigWith({
- 'foo': '$workspaceRootPath/foo',
- }, meta: true);
+ writeTestPackageConfig(
+ PackageConfigFileBuilder()
+ ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+ meta: true,
+ );
newFile('$workspaceRootPath/foo/lib/foo.dart', content: r'''
import 'package:meta/meta.dart';
@@ -58,9 +62,11 @@
}
test_mixinApplicationOfSealedClass() async {
- writeTestPackageConfigWith({
- 'foo': '$workspaceRootPath/foo',
- }, meta: true);
+ writeTestPackageConfig(
+ PackageConfigFileBuilder()
+ ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+ meta: true,
+ );
newFile('$workspaceRootPath/foo/lib/foo.dart', content: r'''
import 'package:meta/meta.dart';
@@ -77,9 +83,11 @@
}
test_mixinApplicationOfSealedMixin() async {
- writeTestPackageConfigWith({
- 'foo': '$workspaceRootPath/foo',
- }, meta: true);
+ writeTestPackageConfig(
+ PackageConfigFileBuilder()
+ ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+ meta: true,
+ );
newFile('$workspaceRootPath/foo/lib/foo.dart', content: r'''
import 'package:meta/meta.dart';
@@ -96,9 +104,11 @@
}
test_mixingInWithSealedMixin() async {
- writeTestPackageConfigWith({
- 'foo': '$workspaceRootPath/foo',
- }, meta: true);
+ writeTestPackageConfig(
+ PackageConfigFileBuilder()
+ ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+ meta: true,
+ );
newFile('$workspaceRootPath/foo/lib/foo.dart', content: r'''
import 'package:meta/meta.dart';
@@ -114,9 +124,11 @@
}
test_mixinImplementsSealedClass() async {
- writeTestPackageConfigWith({
- 'foo': '$workspaceRootPath/foo',
- }, meta: true);
+ writeTestPackageConfig(
+ PackageConfigFileBuilder()
+ ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+ meta: true,
+ );
newFile('$workspaceRootPath/foo/lib/foo.dart', content: r'''
import 'package:meta/meta.dart';
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
index 06400e6..4dfb712 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
@@ -176,4 +176,20 @@
@reflectiveTest
class UndefinedIdentifierWithNullSafetyTest extends UndefinedIdentifierTest
- with WithNullSafetyMixin {}
+ with WithNullSafetyMixin {
+ test_get_from_external_variable_valid() async {
+ await assertNoErrorsInCode('''
+external int x;
+int f() => x;
+''');
+ }
+
+ test_set_external_variable_valid() async {
+ await assertNoErrorsInCode('''
+external int x;
+void f(int value) {
+ x = value;
+}
+''');
+ }
+}
diff --git a/pkg/analyzer/test/verify_diagnostics_test.dart b/pkg/analyzer/test/verify_diagnostics_test.dart
index 78e3e14..462c895 100644
--- a/pkg/analyzer/test/verify_diagnostics_test.dart
+++ b/pkg/analyzer/test/verify_diagnostics_test.dart
@@ -416,14 +416,14 @@
}
void _createAuxiliaryFiles(Map<String, String> auxiliaryFiles) {
- Map<String, String> packageNameToRootPath = {};
+ var packageConfigBuilder = PackageConfigFileBuilder();
for (String uriStr in auxiliaryFiles.keys) {
if (uriStr.startsWith('package:')) {
Uri uri = Uri.parse(uriStr);
String packageName = uri.pathSegments[0];
String packageRootPath = '/packages/$packageName';
- packageNameToRootPath[packageName] = convertPath(packageRootPath);
+ packageConfigBuilder.add(name: packageName, rootPath: packageRootPath);
String pathInLib = uri.pathSegments.skip(1).join('/');
newFile(
@@ -437,6 +437,6 @@
);
}
}
- writeTestPackageConfigWith(packageNameToRootPath, meta: true);
+ writeTestPackageConfig(packageConfigBuilder, meta: true);
}
}
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 6376960..e46e6ec 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -1448,6 +1448,28 @@
/// A minimal implementation of dart:collection that is sufficient to create an
/// instance of [CoreTypes] and compile program.
const String defaultDartCollectionSource = """
+abstract class LinkedHashMap<K, V> implements Map<K, V> {
+ factory LinkedHashMap(
+ {bool Function(K, K)? equals,
+ int Function(K)? hashCode,
+ bool Function(dynamic)? isValidKey}) => null;
+}
+
+class _InternalLinkedHashMap<K, V> {
+ _InternalLinkedHashMap();
+}
+
+abstract class LinkedHashSet<E> implements Set<E> {
+ factory LinkedHashSet(
+ {bool Function(E, E)? equals,
+ int Function(E)? hashCode,
+ bool Function(dynamic)? isValidKey}) => null;
+}
+
+class _CompactLinkedHashSet<E> {
+ _CompactLinkedHashSet();
+}
+
class _UnmodifiableSet {
final Map _map;
const _UnmodifiableSet(this._map);
diff --git a/pkg/front_end/testcases/general/control_flow_collection.dart.strong.transformed.expect b/pkg/front_end/testcases/general/control_flow_collection.dart.strong.transformed.expect
index 9cdff84..a4cb425 100644
--- a/pkg/front_end/testcases/general/control_flow_collection.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/control_flow_collection.dart.strong.transformed.expect
@@ -35,7 +35,7 @@
#t1.{core::List::add}(i);
} =>#t1;
final core::Set<core::int*>* aSet = block {
- final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t2 = new col::_CompactLinkedHashSet::•<core::int*>();
#t2.{core::Set::add}(1);
if(self::oracle() as{TypeError,ForDynamic} core::bool*)
#t2.{core::Set::add}(2);
diff --git a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.transformed.expect
index d9d87e4..4681ce9 100644
--- a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.transformed.expect
@@ -458,7 +458,7 @@
#t1.{core::List::add}(42);
} =>#t1;
core::Set<core::int*>* set10 = block {
- final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t2 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t2.{core::Set::add}(42);
#t2.{core::Set::add}(null);
@@ -475,7 +475,7 @@
#t4.{core::List::add}(dynVar);
} =>#t4;
core::Set<dynamic>* set11 = block {
- final core::Set<dynamic>* #t5 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t5 = new col::_CompactLinkedHashSet::•<dynamic>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t5.{core::Set::add}(dynVar);
#t5.{core::Set::add}(null);
@@ -492,7 +492,7 @@
#t7.{core::List::add}(<core::int*>[42]);
} =>#t7;
core::Set<core::List<core::int*>*>* set12 = block {
- final core::Set<core::List<core::int*>*>* #t8 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t8 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t8.{core::Set::add}(<core::int*>[42]);
#t8.{core::Set::add}(null);
@@ -514,7 +514,7 @@
}
} =>#t10;
core::Set<core::int*>* set20 = block {
- final core::Set<core::int*>* #t12 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t12 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -546,7 +546,7 @@
}
} =>#t16;
core::Set<dynamic>* set21 = block {
- final core::Set<dynamic>* #t18 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t18 = new col::_CompactLinkedHashSet::•<dynamic>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -578,7 +578,7 @@
}
} =>#t22;
core::Set<core::List<core::int*>*>* set22 = block {
- final core::Set<core::List<core::int*>*>* #t24 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t24 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -611,7 +611,7 @@
}
} =>#t28;
core::Set<core::int*>* set30 = block {
- final core::Set<core::int*>* #t30 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t30 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
@@ -646,7 +646,7 @@
}
} =>#t34;
core::Set<dynamic>* set31 = block {
- final core::Set<dynamic>* #t36 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t36 = new col::_CompactLinkedHashSet::•<dynamic>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
@@ -681,7 +681,7 @@
}
} =>#t40;
core::Set<core::List<core::int*>*>* set33 = block {
- final core::Set<core::List<core::int*>*>* #t42 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t42 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
@@ -715,7 +715,7 @@
}
} =>#t46;
core::Set<core::List<core::int*>*>* set40 = block {
- final core::Set<core::List<core::int*>*>* #t48 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t48 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -731,7 +731,7 @@
core::List<core::List<core::int*>*>* list41 = block {
final core::List<core::List<core::int*>*>* #t50 = <core::List<core::int*>*>[];
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
- core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t51 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t52 = #t51.{core::Set::add}(<core::int*>[]) in #t51).{core::Iterable::iterator};
+ core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t51 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t52 = #t51.{core::Set::add}(<core::int*>[]) in #t51).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
final core::List<core::int*>* #t53 = :sync-for-iterator.{core::Iterator::current};
#t50.{core::List::add}(#t53);
@@ -739,9 +739,9 @@
}
} =>#t50;
core::Set<core::List<core::int*>*>* set41 = block {
- final core::Set<core::List<core::int*>*>* #t54 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t54 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
- core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t55 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t56 = #t55.{core::Set::add}(<core::int*>[]) in #t55).{core::Iterable::iterator};
+ core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t55 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t56 = #t55.{core::Set::add}(<core::int*>[]) in #t55).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
final core::List<core::int*>* #t57 = :sync-for-iterator.{core::Iterator::current};
#t54.{core::Set::add}(#t57);
@@ -761,7 +761,7 @@
}
} =>#t58;
core::Set<core::List<core::int*>*>* set42 = block {
- final core::Set<core::List<core::int*>*>* #t60 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t60 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
@@ -795,7 +795,7 @@
}
} =>#t64;
core::Set<core::int*>* set50 = block {
- final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t66 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -819,7 +819,7 @@
core::List<core::int*>* list51 = block {
final core::List<core::int*>* #t70 = <core::int*>[];
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
- core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t71 = col::LinkedHashSet::•<core::int*>() in #t71).{core::Iterable::iterator};
+ core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t71 = new col::_CompactLinkedHashSet::•<core::int*>() in #t71).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
final core::int* #t72 = :sync-for-iterator.{core::Iterator::current};
#t70.{core::List::add}(#t72);
@@ -827,9 +827,9 @@
}
} =>#t70;
core::Set<core::int*>* set51 = block {
- final core::Set<core::int*>* #t73 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t73 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
- core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t74 = col::LinkedHashSet::•<core::int*>() in #t74).{core::Iterable::iterator};
+ core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t74 = new col::_CompactLinkedHashSet::•<core::int*>() in #t74).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
final core::int* #t75 = :sync-for-iterator.{core::Iterator::current};
#t73.{core::Set::add}(#t75);
@@ -849,7 +849,7 @@
}
} =>#t76;
core::Set<core::int*>* set52 = block {
- final core::Set<core::int*>* #t78 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t78 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
@@ -883,7 +883,7 @@
}
} =>#t82;
core::Set<core::List<core::int*>*>* set60 = block {
- final core::Set<core::List<core::int*>*>* #t84 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t84 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -916,7 +916,7 @@
}
} =>#t88;
core::Set<core::List<core::int*>*>* set61 = block {
- final core::Set<core::List<core::int*>*>* #t90 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t90 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
@@ -945,7 +945,7 @@
#t94.{core::List::add}(<core::int*>[]);
} =>#t94;
core::Set<core::List<core::int*>*>* set70 = block {
- final core::Set<core::List<core::int*>*>* #t95 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t95 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t95.{core::Set::add}(<core::int*>[]);
#t95.{core::Set::add}(null);
@@ -957,7 +957,7 @@
#t96.{core::List::add}(<core::int*>[]);
} =>#t96;
core::Set<core::List<core::int*>*>* set71 = block {
- final core::Set<core::List<core::int*>*>* #t97 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t97 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
#t97.{core::Set::add}(<core::int*>[]);
@@ -971,7 +971,7 @@
#t98.{core::List::add}(3.14);
} =>#t98;
core::Set<core::num*>* set80 = block {
- final core::Set<core::num*>* #t99 = col::LinkedHashSet::•<core::num*>();
+ final core::Set<core::num*>* #t99 = new col::_CompactLinkedHashSet::•<core::num*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t99.{core::Set::add}(42);
else
@@ -1004,7 +1004,7 @@
}
} =>#t101;
core::Set<core::num*>* set81 = block {
- final core::Set<core::num*>* #t104 = col::LinkedHashSet::•<core::num*>();
+ final core::Set<core::num*>* #t104 = new col::_CompactLinkedHashSet::•<core::num*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1057,7 +1057,7 @@
}
} =>#t110;
core::Set<dynamic>* set82 = block {
- final core::Set<dynamic>* #t113 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t113 = new col::_CompactLinkedHashSet::•<dynamic>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1075,7 +1075,7 @@
#t113.{core::Set::add}(null);
} =>#t113;
core::Set<dynamic>* map82 = block {
- final core::Set<dynamic>* #t116 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t116 = new col::_CompactLinkedHashSet::•<dynamic>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t116.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:71:38: Error: Unexpected type 'Map<String, int>' of a spread. Expected 'dynamic' or an Iterable.
- 'Map' is from 'dart:core'.
@@ -1103,7 +1103,7 @@
}
} =>#t118;
core::Set<core::num*>* set83 = block {
- final core::Set<core::num*>* #t120 = col::LinkedHashSet::•<core::num*>();
+ final core::Set<core::num*>* #t120 = new col::_CompactLinkedHashSet::•<core::num*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1134,7 +1134,7 @@
#t124.{core::List::add}(dynVar as{TypeError,ForDynamic} core::int*);
} =>#t124;
core::Set<core::int*>* set90 = block {
- final core::Set<core::int*>* #t125 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t125 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t125.{core::Set::add}(dynVar as{TypeError,ForDynamic} core::int*);
#t125.{core::Set::add}(null);
@@ -1159,7 +1159,7 @@
}
} =>#t127;
core::Set<core::int*>* set91 = block {
- final core::Set<core::int*>* #t130 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t130 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1193,7 +1193,7 @@
#t137.{core::List::add}(42);
} =>#t137;
core::Set<core::int*>* set100 = block {
- final core::Set<core::int*>* #t138 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t138 = new col::_CompactLinkedHashSet::•<core::int*>();
if(dynVar as{TypeError,ForDynamic} core::bool*)
#t138.{core::Set::add}(42);
} =>#t138;
@@ -1212,7 +1212,7 @@
^" in "bar" as{TypeError} core::int*);
} =>#t140;
block {
- final core::Set<core::int*>* #t142 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t142 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t142.{core::Set::add}(let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
<int>{if (oracle(\"foo\")) \"bar\", null};
@@ -1240,7 +1240,7 @@
}
} =>#t146;
block {
- final core::Set<core::int*>* #t149 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t149 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t150 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
<int>{if (oracle(\"foo\")) ...[\"bar\"], null};
@@ -1274,7 +1274,7 @@
^");
} =>#t155;
block {
- final core::Set<core::int*>* #t156 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t156 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t156.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:94:31: Error: Unexpected type 'Map<int, int>' of a spread. Expected 'dynamic' or an Iterable.
- 'Map' is from 'dart:core'.
@@ -1301,7 +1301,7 @@
^" in 3.14 as{TypeError} core::String*);
} =>#t157;
block {
- final core::Set<core::String*>* #t160 = col::LinkedHashSet::•<core::String*>();
+ final core::Set<core::String*>* #t160 = new col::_CompactLinkedHashSet::•<core::String*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t160.{core::Set::add}(let final<BottomType> #t161 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
<String>{if (oracle(\"foo\")) 42 else 3.14, null};
@@ -1335,7 +1335,7 @@
#t166.{core::List::add}(42);
} =>#t166;
block {
- final core::Set<core::int*>* #t167 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t167 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t167.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:100:31: Error: Unexpected type 'Map<int, int>' of a spread. Expected 'dynamic' or an Iterable.
- 'Map' is from 'dart:core'.
@@ -1363,7 +1363,7 @@
^");
} =>#t168;
block {
- final core::Set<core::int*>* #t169 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t169 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t169.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:103:31: Error: Unexpected type 'Map<int, int>' of a spread. Expected 'dynamic' or an Iterable.
- 'Map' is from 'dart:core'.
@@ -1406,7 +1406,7 @@
#t170.{core::List::add}(42);
} =>#t170;
core::Set<core::int*>* set20 = block {
- final core::Set<core::int*>* #t172 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t172 = new col::_CompactLinkedHashSet::•<core::int*>();
if(let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
Set<int> set20 = {if (42) 42};
^" in 42 as{TypeError} core::bool*)
@@ -1431,7 +1431,7 @@
^" in 42 as{TypeError} core::String*);
} =>#t176;
core::Set<core::String*>* set40 = block {
- final core::Set<core::String*>* #t179 = col::LinkedHashSet::•<core::String*>();
+ final core::Set<core::String*>* #t179 = new col::_CompactLinkedHashSet::•<core::String*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t179.{core::Set::add}(let final<BottomType> #t180 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
@@ -1471,7 +1471,7 @@
#t188.{core::List::add}(42);
} =>#t188;
core::Set<core::int*>* set10 = block {
- final core::Set<core::int*>* #t189 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t189 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
#t189.{core::Set::add}(42);
#t189.{core::Set::add}(null);
@@ -1488,7 +1488,7 @@
#t191.{core::List::add}(dynVar);
} =>#t191;
core::Set<dynamic>* set11 = block {
- final core::Set<dynamic>* #t192 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t192 = new col::_CompactLinkedHashSet::•<dynamic>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
#t192.{core::Set::add}(dynVar);
#t192.{core::Set::add}(null);
@@ -1505,7 +1505,7 @@
#t194.{core::List::add}(<core::int*>[42]);
} =>#t194;
core::Set<core::List<core::int*>*>* set12 = block {
- final core::Set<core::List<core::int*>*>* #t195 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t195 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
#t195.{core::Set::add}(<core::int*>[42]);
#t195.{core::Set::add}(null);
@@ -1527,7 +1527,7 @@
}
} =>#t197;
core::Set<core::int*>* set20 = block {
- final core::Set<core::int*>* #t199 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t199 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1559,7 +1559,7 @@
}
} =>#t203;
core::Set<dynamic>* set21 = block {
- final core::Set<dynamic>* #t205 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t205 = new col::_CompactLinkedHashSet::•<dynamic>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1591,7 +1591,7 @@
}
} =>#t209;
core::Set<core::List<core::int*>*>* set22 = block {
- final core::Set<core::List<core::int*>*>* #t211 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t211 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1624,7 +1624,7 @@
}
} =>#t215;
core::Set<core::int*>* set30 = block {
- final core::Set<core::int*>* #t217 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t217 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
@@ -1659,7 +1659,7 @@
}
} =>#t221;
core::Set<dynamic>* set31 = block {
- final core::Set<dynamic>* #t223 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t223 = new col::_CompactLinkedHashSet::•<dynamic>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
@@ -1694,7 +1694,7 @@
}
} =>#t227;
core::Set<core::List<core::int*>*>* set33 = block {
- final core::Set<core::List<core::int*>*>* #t229 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t229 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
@@ -1728,7 +1728,7 @@
}
} =>#t233;
core::Set<core::List<core::int*>*>* set40 = block {
- final core::Set<core::List<core::int*>*>* #t235 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t235 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1752,7 +1752,7 @@
core::List<core::List<core::int*>*>* list41 = block {
final core::List<core::List<core::int*>*>* #t239 = <core::List<core::int*>*>[];
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
- core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t240 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t241 = #t240.{core::Set::add}(<core::int*>[]) in #t240).{core::Iterable::iterator};
+ core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t240 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t241 = #t240.{core::Set::add}(<core::int*>[]) in #t240).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
final core::List<core::int*>* #t242 = :sync-for-iterator.{core::Iterator::current};
#t239.{core::List::add}(#t242);
@@ -1760,9 +1760,9 @@
}
} =>#t239;
core::Set<core::List<core::int*>*>* set41 = block {
- final core::Set<core::List<core::int*>*>* #t243 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t243 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
- core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t244 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t245 = #t244.{core::Set::add}(<core::int*>[]) in #t244).{core::Iterable::iterator};
+ core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t244 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t245 = #t244.{core::Set::add}(<core::int*>[]) in #t244).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
final core::List<core::int*>* #t246 = :sync-for-iterator.{core::Iterator::current};
#t243.{core::Set::add}(#t246);
@@ -1782,7 +1782,7 @@
}
} =>#t247;
core::Set<core::List<core::int*>*>* set42 = block {
- final core::Set<core::List<core::int*>*>* #t249 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t249 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
@@ -1816,7 +1816,7 @@
}
} =>#t253;
core::Set<core::int*>* set50 = block {
- final core::Set<core::int*>* #t255 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t255 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1840,7 +1840,7 @@
core::List<core::int*>* list51 = block {
final core::List<core::int*>* #t259 = <core::int*>[];
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
- core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t260 = col::LinkedHashSet::•<core::int*>() in #t260).{core::Iterable::iterator};
+ core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t260 = new col::_CompactLinkedHashSet::•<core::int*>() in #t260).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
final core::int* #t261 = :sync-for-iterator.{core::Iterator::current};
#t259.{core::List::add}(#t261);
@@ -1848,9 +1848,9 @@
}
} =>#t259;
core::Set<core::int*>* set51 = block {
- final core::Set<core::int*>* #t262 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t262 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
- core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t263 = col::LinkedHashSet::•<core::int*>() in #t263).{core::Iterable::iterator};
+ core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t263 = new col::_CompactLinkedHashSet::•<core::int*>() in #t263).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
final core::int* #t264 = :sync-for-iterator.{core::Iterator::current};
#t262.{core::Set::add}(#t264);
@@ -1870,7 +1870,7 @@
}
} =>#t265;
core::Set<core::int*>* set52 = block {
- final core::Set<core::int*>* #t267 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t267 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
@@ -1892,7 +1892,7 @@
}
} =>#t269;
core::Set<core::List<core::int*>*>* set60 = block {
- final core::Set<core::List<core::int*>*>* #t271 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t271 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1925,7 +1925,7 @@
}
} =>#t275;
core::Set<core::List<core::int*>*>* set61 = block {
- final core::Set<core::List<core::int*>*>* #t277 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t277 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
@@ -1954,7 +1954,7 @@
#t281.{core::List::add}(<core::int*>[]);
} =>#t281;
core::Set<core::List<core::int*>*>* set70 = block {
- final core::Set<core::List<core::int*>*>* #t282 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t282 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
#t282.{core::Set::add}(<core::int*>[]);
#t282.{core::Set::add}(null);
@@ -1972,7 +1972,7 @@
#t284.{core::List::add}(<core::int*>[]);
} =>#t284;
core::Set<core::List<core::int*>*>* set71 = block {
- final core::Set<core::List<core::int*>*>* #t285 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t285 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
#t285.{core::Set::add}(<core::int*>[]);
@@ -1994,7 +1994,7 @@
#t287.{core::List::add}(3.14);
} =>#t287;
core::Set<core::num*>* set80 = block {
- final core::Set<core::num*>* #t288 = col::LinkedHashSet::•<core::num*>();
+ final core::Set<core::num*>* #t288 = new col::_CompactLinkedHashSet::•<core::num*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
#t288.{core::Set::add}(42);
@@ -2030,7 +2030,7 @@
}
} =>#t290;
core::Set<core::num*>* set81 = block {
- final core::Set<core::num*>* #t293 = col::LinkedHashSet::•<core::num*>();
+ final core::Set<core::num*>* #t293 = new col::_CompactLinkedHashSet::•<core::num*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
@@ -2086,7 +2086,7 @@
}
} =>#t299;
core::Set<dynamic>* set82 = block {
- final core::Set<dynamic>* #t302 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t302 = new col::_CompactLinkedHashSet::•<dynamic>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
@@ -2137,7 +2137,7 @@
}
} =>#t308;
core::Set<core::num*>* set83 = block {
- final core::Set<core::num*>* #t310 = col::LinkedHashSet::•<core::num*>();
+ final core::Set<core::num*>* #t310 = new col::_CompactLinkedHashSet::•<core::num*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
@@ -2170,7 +2170,7 @@
#t314.{core::List::add}(dynVar as{TypeError,ForDynamic} core::int*);
} =>#t314;
core::Set<core::int*>* set90 = block {
- final core::Set<core::int*>* #t315 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t315 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
#t315.{core::Set::add}(dynVar as{TypeError,ForDynamic} core::int*);
#t315.{core::Set::add}(null);
@@ -2195,7 +2195,7 @@
}
} =>#t317;
core::Set<core::int*>* set91 = block {
- final core::Set<core::int*>* #t320 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t320 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -2229,7 +2229,7 @@
#t327.{core::List::add}(42);
} =>#t327;
core::Set<core::int*>* set100 = block {
- final core::Set<core::int*>* #t329 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t329 = new col::_CompactLinkedHashSet::•<core::int*>();
for (final core::int* #t330 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
#t329.{core::Set::add}(42);
} =>#t329;
@@ -2249,7 +2249,7 @@
}
} =>#t333;
core::Set<core::int*>* set110 = block {
- final core::Set<core::int*>* #t334 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t334 = new col::_CompactLinkedHashSet::•<core::int*>();
{
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1, 2, 3].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -2281,7 +2281,7 @@
}
} =>#t336;
core::Set<core::int*>* set120 = block {
- final core::Set<core::int*>* #t337 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t337 = new col::_CompactLinkedHashSet::•<core::int*>();
{
core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -2308,7 +2308,7 @@
#t339.{core::List::add}(i);
} =>#t339;
core::Set<core::int*>* set130 = block {
- final core::Set<core::int*>* #t340 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t340 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
#t340.{core::Set::add}(i);
} =>#t340;
@@ -2342,7 +2342,7 @@
^" in "bar" as{TypeError} core::int*);
} =>#t342;
block {
- final core::Set<core::int*>* #t344 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t344 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
#t344.{core::Set::add}(let final<BottomType> #t345 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
<int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\", null};
@@ -2374,7 +2374,7 @@
}
} =>#t350;
block {
- final core::Set<core::int*>* #t353 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t353 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t354 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
<int>{for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"], null};
@@ -2412,7 +2412,7 @@
^");
} =>#t361;
block {
- final core::Set<core::int*>* #t362 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t362 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
#t362.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:217:48: Error: Unexpected type 'Map<int, int>' of a spread. Expected 'dynamic' or an Iterable.
- 'Map' is from 'dart:core'.
@@ -2440,7 +2440,7 @@
^" in 3.14 as{TypeError} core::String*);
} =>#t363;
block {
- final core::Set<core::String*>* #t366 = col::LinkedHashSet::•<core::String*>();
+ final core::Set<core::String*>* #t366 = new col::_CompactLinkedHashSet::•<core::String*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
#t366.{core::Set::add}(let final<BottomType> #t367 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
@@ -2477,7 +2477,7 @@
#t372.{core::List::add}(42);
} =>#t372;
block {
- final core::Set<core::int*>* #t373 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t373 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
#t373.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:223:62: Error: Unexpected type 'Map<int, int>' of a spread. Expected 'dynamic' or an Iterable.
@@ -2507,7 +2507,7 @@
^");
} =>#t374;
block {
- final core::Set<core::int*>* #t375 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t375 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
#t375.{core::Set::add}(42);
@@ -2542,7 +2542,7 @@
}
} =>#t376;
block {
- final core::Set<core::int*>* #t378 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t378 = new col::_CompactLinkedHashSet::•<core::int*>();
{
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -2587,7 +2587,7 @@
}
} =>#t382;
core::Set<dynamic>* set10 = block {
- final core::Set<dynamic>* #t384 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t384 = new col::_CompactLinkedHashSet::•<dynamic>();
{
core::Iterator<dynamic>* :sync-for-iterator = (let final<BottomType> #t385 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:235:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
- 'Iterable' is from 'dart:core'.
@@ -2629,7 +2629,7 @@
}
} =>#t388;
core::Set<core::int*>* set20 = block {
- final core::Set<core::int*>* #t391 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t391 = new col::_CompactLinkedHashSet::•<core::int*>();
{
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t392 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
var set20 = {for (int i in [\"not\", \"int\"]) i, null};
@@ -2685,7 +2685,7 @@
}
}
core::List<dynamic>* list30 = block {} =>#t397;
- final core::Set<dynamic>* #t402 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t402 = new col::_CompactLinkedHashSet::•<dynamic>();
{
asy::Stream<dynamic>* :stream = let final<BottomType> #t403 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:241:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
- 'Stream' is from 'dart:async'.
@@ -2771,7 +2771,7 @@
}
}
core::List<core::int*>* list40 = block {} =>#t412;
- final core::Set<core::int*>* #t418 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t418 = new col::_CompactLinkedHashSet::•<core::int*>();
{
asy::Stream<core::int*> :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t419 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
@@ -2837,7 +2837,7 @@
#t430.{core::List::add}(42);
} =>#t430;
core::Set<core::int*>* set50 = block {
- final core::Set<core::int*>* #t431 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t431 = new col::_CompactLinkedHashSet::•<core::int*>();
for (; ; )
#t431.{core::Set::add}(42);
#t431.{core::Set::add}(null);
@@ -2856,7 +2856,7 @@
#t433.{core::List::add}(42);
} =>#t433;
core::Set<core::int*>* set60 = block {
- final core::Set<core::int*>* #t435 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t435 = new col::_CompactLinkedHashSet::•<core::int*>();
for (; let final<BottomType> #t436 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
var set60 = {for (; \"not bool\";) 42, null};
^" in "not bool" as{TypeError} core::bool*; )
@@ -2891,7 +2891,7 @@
#t439.{core::List::add}(i);
} =>#t439;
block {
- final core::Set<core::int*>* #t440 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t440 = new col::_CompactLinkedHashSet::•<core::int*>();
await for (core::int* i in stream)
#t440.{core::Set::add}(i);
} =>#t440;
@@ -2908,7 +2908,7 @@
#t442.{core::List::add}(a{self::B*}.{self::B::foo});
} =>#t442;
core::Set<core::int*>* set10 = block {
- final core::Set<core::int*>* #t443 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t443 = new col::_CompactLinkedHashSet::•<core::int*>();
if(a is self::B*)
#t443.{core::Set::add}(a{self::B*}.{self::B::foo});
} =>#t443;
diff --git a/pkg/front_end/testcases/general/if_null_in_set_literal.dart.strong.transformed.expect b/pkg/front_end/testcases/general/if_null_in_set_literal.dart.strong.transformed.expect
index 5cba724..ac2c29c 100644
--- a/pkg/front_end/testcases/general/if_null_in_set_literal.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/if_null_in_set_literal.dart.strong.transformed.expect
@@ -6,5 +6,5 @@
static method main() → dynamic {
core::Object* a;
core::Object* b;
- return let final core::Set<core::Object*>* #t1 = col::LinkedHashSet::•<core::Object*>() in let final core::bool #t2 = #t1.{core::Set::add}(let final core::Object* #t3 = a in #t3.{core::Object::==}(null) ?{core::Object*} b : #t3) in #t1;
+ return let final core::Set<core::Object*>* #t1 = new col::_CompactLinkedHashSet::•<core::Object*>() in let final core::bool #t2 = #t1.{core::Set::add}(let final core::Object* #t3 = a in #t3.{core::Object::==}(null) ?{core::Object*} b : #t3) in #t1;
}
diff --git a/pkg/front_end/testcases/general/issue37027.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue37027.dart.strong.transformed.expect
index 9c0061a..df37bc0 100644
--- a/pkg/front_end/testcases/general/issue37027.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue37027.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
final field core::Set<core::int*>* s;
constructor •(core::List<core::int*>* ell) → self::C*
: self::C::s = block {
- final core::Set<core::int*>* #t1 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t1 = new col::_CompactLinkedHashSet::•<core::int*>();
{
core::Iterator<core::int*>* :sync-for-iterator = ell.{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
diff --git a/pkg/front_end/testcases/general/null_aware_spread.dart.strong.transformed.expect b/pkg/front_end/testcases/general/null_aware_spread.dart.strong.transformed.expect
index d895697..9ff4788 100644
--- a/pkg/front_end/testcases/general/null_aware_spread.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/null_aware_spread.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
}
static method nullAwareSetSpread(core::Set<core::String*>* set) → dynamic {
set = block {
- final core::Set<core::String*>* #t4 = col::LinkedHashSet::•<core::String*>();
+ final core::Set<core::String*>* #t4 = new col::_CompactLinkedHashSet::•<core::String*>();
#t4.{core::Set::add}("foo");
final core::Iterable<core::String*>* #t5 = set;
if(!#t5.{core::Object::==}(null)) {
diff --git a/pkg/front_end/testcases/general/spread_collection.dart.strong.transformed.expect b/pkg/front_end/testcases/general/spread_collection.dart.strong.transformed.expect
index fdbefbc..15ed3cf 100644
--- a/pkg/front_end/testcases/general/spread_collection.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/spread_collection.dart.strong.transformed.expect
@@ -51,7 +51,7 @@
}
} =>#t5;
final core::Set<core::int*>* aSet = block {
- final core::Set<core::int*>* #t9 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t9 = new col::_CompactLinkedHashSet::•<core::int*>();
#t9.{core::Set::add}(1);
{
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[2].{core::Iterable::iterator};
diff --git a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect
index e42c97f..477502d 100644
--- a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect
@@ -120,7 +120,7 @@
}
} =>#t1;
core::Set<dynamic>* set10 = block {
- final core::Set<dynamic>* #t3 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t3 = new col::_CompactLinkedHashSet::•<dynamic>();
{
core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -160,7 +160,7 @@
}
} =>#t9;
core::Set<core::int*>* set20 = block {
- final core::Set<core::int*>* #t11 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t11 = new col::_CompactLinkedHashSet::•<core::int*>();
{
core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -171,7 +171,7 @@
#t11.{core::Set::add}(42);
} =>#t11;
core::Set<core::int*>* set20ambiguous = block {
- final core::Set<core::int*>* #t13 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t13 = new col::_CompactLinkedHashSet::•<core::int*>();
{
core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -215,7 +215,7 @@
}
} =>#t20;
core::Set<dynamic>* set21 = block {
- final core::Set<dynamic>* #t22 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t22 = new col::_CompactLinkedHashSet::•<dynamic>();
{
core::Iterator<dynamic>* :sync-for-iterator = ((spread as dynamic) as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -251,7 +251,7 @@
}
} =>#t26;
core::Set<core::int*>* set22 = block {
- final core::Set<core::int*>* #t28 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t28 = new col::_CompactLinkedHashSet::•<core::int*>();
{
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -262,7 +262,7 @@
#t28.{core::Set::add}(42);
} =>#t28;
core::Set<core::int*>* set22ambiguous = block {
- final core::Set<core::int*>* #t30 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t30 = new col::_CompactLinkedHashSet::•<core::int*>();
{
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -295,7 +295,7 @@
}
} =>#t35;
core::Set<core::List<core::int*>*>* set23 = block {
- final core::Set<core::List<core::int*>*>* #t37 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t37 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
{
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -306,7 +306,7 @@
#t37.{core::Set::add}(<core::int*>[42]);
} =>#t37;
core::Set<core::List<core::int*>*>* set23ambiguous = block {
- final core::Set<core::List<core::int*>*>* #t39 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t39 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
{
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -348,7 +348,7 @@
- 'Set' is from 'dart:core'.
int set30 = /*@ typeArgs=int* */ {...spread, 42};
^" in ( block {
- final core::Set<core::int*>* #t48 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t48 = new col::_CompactLinkedHashSet::•<core::int*>();
{
core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -362,7 +362,7 @@
- 'Set' is from 'dart:core'.
{...spread};
^" in ( block {
- final core::Set<core::int*>* #t51 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t51 = new col::_CompactLinkedHashSet::•<core::int*>();
{
core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -404,7 +404,7 @@
core::List<dynamic>* lhs40 = <dynamic>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:111:38: Error: Unexpected type 'int' of a spread. Expected 'dynamic' or an Iterable.
List<dynamic> lhs40 = <dynamic>[...notSpreadInt];
^"];
- core::Set<dynamic>* set40 = let final core::Set<dynamic>* #t60 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t61 = #t60.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:113:37: Error: Unexpected type 'int' of a spread. Expected 'dynamic' or an Iterable.
+ core::Set<dynamic>* set40 = let final core::Set<dynamic>* #t60 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t61 = #t60.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:113:37: Error: Unexpected type 'int' of a spread. Expected 'dynamic' or an Iterable.
Set<dynamic> set40 = <dynamic>{...notSpreadInt};
^") in #t60;
core::Map<dynamic, dynamic>* map40 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:115:55: Error: Unexpected type 'int' of a map spread entry. Expected 'dynamic' or a Map.
@@ -413,7 +413,7 @@
core::List<dynamic>* lhs50 = <dynamic>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:117:38: Error: Unexpected type 'int Function()' of a spread. Expected 'dynamic' or an Iterable.
List<dynamic> lhs50 = <dynamic>[...notSpreadFunction];
^"];
- core::Set<dynamic>* set50 = let final core::Set<dynamic>* #t62 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:119:37: Error: Unexpected type 'int Function()' of a spread. Expected 'dynamic' or an Iterable.
+ core::Set<dynamic>* set50 = let final core::Set<dynamic>* #t62 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:119:37: Error: Unexpected type 'int Function()' of a spread. Expected 'dynamic' or an Iterable.
Set<dynamic> set50 = <dynamic>{...notSpreadFunction};
^") in #t62;
core::Map<dynamic, dynamic>* map50 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:121:55: Error: Unexpected type 'int Function()' of a map spread entry. Expected 'dynamic' or a Map.
@@ -422,7 +422,7 @@
core::List<core::String*>* lhs60 = <core::String*>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:123:36: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
List<String> lhs60 = <String>[...spread];
^"];
- core::Set<core::String*>* set60 = let final core::Set<core::String*>* #t64 = col::LinkedHashSet::•<core::String*>() in let final core::bool #t65 = #t64.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:125:35: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+ core::Set<core::String*>* set60 = let final core::Set<core::String*>* #t64 = new col::_CompactLinkedHashSet::•<core::String*>() in let final core::bool #t65 = #t64.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:125:35: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
Set<String> set60 = <String>{...spread};
^") in #t64;
core::Map<core::int*, core::int*>* map60 = <core::int*, core::int*>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:127:39: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
@@ -434,11 +434,11 @@
core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:131:30: Error: Can't spread a value with static type 'Null'.
List<int> lhs70 = <int>[...null];
^"];
- core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final core::bool #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type 'Null'.
+ core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = new col::_CompactLinkedHashSet::•<core::int*>() in let final core::bool #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type 'Null'.
Set<int> set70 = <int>{...null};
^") in #t66;
core::Set<dynamic>* set71ambiguous = block {
- final core::Set<dynamic>* #t68 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t68 = new col::_CompactLinkedHashSet::•<dynamic>();
#t68.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:137:8: Error: Expected ',' before this.
...null,
^");
@@ -468,7 +468,7 @@
}
} =>#t71;
core::Set<core::int*>* set80 = block {
- final core::Set<core::int*>* #t74 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t74 = new col::_CompactLinkedHashSet::•<core::int*>();
final core::Iterable<core::int*>* #t75 = null;
if(!#t75.{core::Object::==}(null)) {
core::Iterator<core::int*>* :sync-for-iterator = #t75.{core::Iterable::iterator};
@@ -479,7 +479,7 @@
}
} =>#t74;
core::Set<dynamic>* set81ambiguous = block {
- final core::Set<dynamic>* #t77 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t77 = new col::_CompactLinkedHashSet::•<dynamic>();
final core::Iterable<dynamic>* #t78 = null;
if(!#t78.{core::Object::==}(null)) {
core::Iterator<dynamic>* :sync-for-iterator = #t78.{core::Iterable::iterator};
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection.dart.weak.transformed.expect
index 9cdff84..a4cb425 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection.dart.weak.transformed.expect
@@ -35,7 +35,7 @@
#t1.{core::List::add}(i);
} =>#t1;
final core::Set<core::int*>* aSet = block {
- final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t2 = new col::_CompactLinkedHashSet::•<core::int*>();
#t2.{core::Set::add}(1);
if(self::oracle() as{TypeError,ForDynamic} core::bool*)
#t2.{core::Set::add}(2);
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart.weak.transformed.expect
index cc12197..55eecb6 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart.weak.transformed.expect
@@ -458,7 +458,7 @@
#t1.{core::List::add}(42);
} =>#t1;
core::Set<core::int*>* set10 = block {
- final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t2 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t2.{core::Set::add}(42);
#t2.{core::Set::add}(null);
@@ -475,7 +475,7 @@
#t4.{core::List::add}(dynVar);
} =>#t4;
core::Set<dynamic>* set11 = block {
- final core::Set<dynamic>* #t5 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t5 = new col::_CompactLinkedHashSet::•<dynamic>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t5.{core::Set::add}(dynVar);
#t5.{core::Set::add}(null);
@@ -492,7 +492,7 @@
#t7.{core::List::add}(<core::int*>[42]);
} =>#t7;
core::Set<core::List<core::int*>*>* set12 = block {
- final core::Set<core::List<core::int*>*>* #t8 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t8 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t8.{core::Set::add}(<core::int*>[42]);
#t8.{core::Set::add}(null);
@@ -514,7 +514,7 @@
}
} =>#t10;
core::Set<core::int*>* set20 = block {
- final core::Set<core::int*>* #t12 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t12 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -546,7 +546,7 @@
}
} =>#t16;
core::Set<dynamic>* set21 = block {
- final core::Set<dynamic>* #t18 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t18 = new col::_CompactLinkedHashSet::•<dynamic>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -578,7 +578,7 @@
}
} =>#t22;
core::Set<core::List<core::int*>*>* set22 = block {
- final core::Set<core::List<core::int*>*>* #t24 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t24 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -611,7 +611,7 @@
}
} =>#t28;
core::Set<core::int*>* set30 = block {
- final core::Set<core::int*>* #t30 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t30 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
@@ -646,7 +646,7 @@
}
} =>#t34;
core::Set<dynamic>* set31 = block {
- final core::Set<dynamic>* #t36 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t36 = new col::_CompactLinkedHashSet::•<dynamic>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
@@ -681,7 +681,7 @@
}
} =>#t40;
core::Set<core::List<core::int*>*>* set33 = block {
- final core::Set<core::List<core::int*>*>* #t42 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t42 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
@@ -715,7 +715,7 @@
}
} =>#t46;
core::Set<core::List<core::int*>*>* set40 = block {
- final core::Set<core::List<core::int*>*>* #t48 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t48 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -731,7 +731,7 @@
core::List<core::List<core::int*>*>* list41 = block {
final core::List<core::List<core::int*>*>* #t50 = <core::List<core::int*>*>[];
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
- core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t51 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t52 = #t51.{core::Set::add}(<core::int*>[]) in #t51).{core::Iterable::iterator};
+ core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t51 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t52 = #t51.{core::Set::add}(<core::int*>[]) in #t51).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
final core::List<core::int*>* #t53 = :sync-for-iterator.{core::Iterator::current};
#t50.{core::List::add}(#t53);
@@ -739,9 +739,9 @@
}
} =>#t50;
core::Set<core::List<core::int*>*>* set41 = block {
- final core::Set<core::List<core::int*>*>* #t54 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t54 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
- core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t55 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t56 = #t55.{core::Set::add}(<core::int*>[]) in #t55).{core::Iterable::iterator};
+ core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t55 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t56 = #t55.{core::Set::add}(<core::int*>[]) in #t55).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
final core::List<core::int*>* #t57 = :sync-for-iterator.{core::Iterator::current};
#t54.{core::Set::add}(#t57);
@@ -761,7 +761,7 @@
}
} =>#t58;
core::Set<core::List<core::int*>*>* set42 = block {
- final core::Set<core::List<core::int*>*>* #t60 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t60 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
@@ -795,7 +795,7 @@
}
} =>#t64;
core::Set<core::int*>* set50 = block {
- final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t66 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -819,7 +819,7 @@
core::List<core::int*>* list51 = block {
final core::List<core::int*>* #t70 = <core::int*>[];
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
- core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t71 = col::LinkedHashSet::•<core::int*>() in #t71).{core::Iterable::iterator};
+ core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t71 = new col::_CompactLinkedHashSet::•<core::int*>() in #t71).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
final core::int* #t72 = :sync-for-iterator.{core::Iterator::current};
#t70.{core::List::add}(#t72);
@@ -827,9 +827,9 @@
}
} =>#t70;
core::Set<core::int*>* set51 = block {
- final core::Set<core::int*>* #t73 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t73 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
- core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t74 = col::LinkedHashSet::•<core::int*>() in #t74).{core::Iterable::iterator};
+ core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t74 = new col::_CompactLinkedHashSet::•<core::int*>() in #t74).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
final core::int* #t75 = :sync-for-iterator.{core::Iterator::current};
#t73.{core::Set::add}(#t75);
@@ -849,7 +849,7 @@
}
} =>#t76;
core::Set<core::int*>* set52 = block {
- final core::Set<core::int*>* #t78 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t78 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
@@ -883,7 +883,7 @@
}
} =>#t82;
core::Set<core::List<core::int*>*>* set60 = block {
- final core::Set<core::List<core::int*>*>* #t84 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t84 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -916,7 +916,7 @@
}
} =>#t88;
core::Set<core::List<core::int*>*>* set61 = block {
- final core::Set<core::List<core::int*>*>* #t90 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t90 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
@@ -945,7 +945,7 @@
#t94.{core::List::add}(<core::int*>[]);
} =>#t94;
core::Set<core::List<core::int*>*>* set70 = block {
- final core::Set<core::List<core::int*>*>* #t95 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t95 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t95.{core::Set::add}(<core::int*>[]);
#t95.{core::Set::add}(null);
@@ -957,7 +957,7 @@
#t96.{core::List::add}(<core::int*>[]);
} =>#t96;
core::Set<core::List<core::int*>*>* set71 = block {
- final core::Set<core::List<core::int*>*>* #t97 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t97 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
#t97.{core::Set::add}(<core::int*>[]);
@@ -971,7 +971,7 @@
#t98.{core::List::add}(3.14);
} =>#t98;
core::Set<core::num*>* set80 = block {
- final core::Set<core::num*>* #t99 = col::LinkedHashSet::•<core::num*>();
+ final core::Set<core::num*>* #t99 = new col::_CompactLinkedHashSet::•<core::num*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t99.{core::Set::add}(42);
else
@@ -1004,7 +1004,7 @@
}
} =>#t101;
core::Set<core::num*>* set81 = block {
- final core::Set<core::num*>* #t104 = col::LinkedHashSet::•<core::num*>();
+ final core::Set<core::num*>* #t104 = new col::_CompactLinkedHashSet::•<core::num*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1057,7 +1057,7 @@
}
} =>#t110;
core::Set<dynamic>* set82 = block {
- final core::Set<dynamic>* #t113 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t113 = new col::_CompactLinkedHashSet::•<dynamic>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1075,7 +1075,7 @@
#t113.{core::Set::add}(null);
} =>#t113;
core::Set<dynamic>* map82 = block {
- final core::Set<dynamic>* #t116 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t116 = new col::_CompactLinkedHashSet::•<dynamic>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t116.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:73:38: Error: Unexpected type 'Map<String, int>' of a spread. Expected 'dynamic' or an Iterable.
- 'Map' is from 'dart:core'.
@@ -1103,7 +1103,7 @@
}
} =>#t118;
core::Set<core::num*>* set83 = block {
- final core::Set<core::num*>* #t120 = col::LinkedHashSet::•<core::num*>();
+ final core::Set<core::num*>* #t120 = new col::_CompactLinkedHashSet::•<core::num*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1134,7 +1134,7 @@
#t124.{core::List::add}(dynVar as{TypeError,ForDynamic} core::int*);
} =>#t124;
core::Set<core::int*>* set90 = block {
- final core::Set<core::int*>* #t125 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t125 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t125.{core::Set::add}(dynVar as{TypeError,ForDynamic} core::int*);
#t125.{core::Set::add}(null);
@@ -1159,7 +1159,7 @@
}
} =>#t127;
core::Set<core::int*>* set91 = block {
- final core::Set<core::int*>* #t130 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t130 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1193,7 +1193,7 @@
#t137.{core::List::add}(42);
} =>#t137;
core::Set<core::int*>* set100 = block {
- final core::Set<core::int*>* #t138 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t138 = new col::_CompactLinkedHashSet::•<core::int*>();
if(dynVar as{TypeError,ForDynamic} core::bool*)
#t138.{core::Set::add}(42);
} =>#t138;
@@ -1212,7 +1212,7 @@
^" in "bar" as{TypeError} core::int*);
} =>#t140;
block {
- final core::Set<core::int*>* #t142 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t142 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t142.{core::Set::add}(let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:90:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
<int>{if (oracle(\"foo\")) \"bar\", null};
@@ -1240,7 +1240,7 @@
}
} =>#t146;
block {
- final core::Set<core::int*>* #t149 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t149 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t150 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:93:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
<int>{if (oracle(\"foo\")) ...[\"bar\"], null};
@@ -1274,7 +1274,7 @@
^");
} =>#t155;
block {
- final core::Set<core::int*>* #t156 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t156 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t156.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:96:31: Error: Unexpected type 'Map<int, int>' of a spread. Expected 'dynamic' or an Iterable.
- 'Map' is from 'dart:core'.
@@ -1301,7 +1301,7 @@
^" in 3.14 as{TypeError} core::String*);
} =>#t157;
block {
- final core::Set<core::String*>* #t160 = col::LinkedHashSet::•<core::String*>();
+ final core::Set<core::String*>* #t160 = new col::_CompactLinkedHashSet::•<core::String*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t160.{core::Set::add}(let final<BottomType> #t161 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:99:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
<String>{if (oracle(\"foo\")) 42 else 3.14, null};
@@ -1335,7 +1335,7 @@
#t166.{core::List::add}(42);
} =>#t166;
block {
- final core::Set<core::int*>* #t167 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t167 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t167.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:102:31: Error: Unexpected type 'Map<int, int>' of a spread. Expected 'dynamic' or an Iterable.
- 'Map' is from 'dart:core'.
@@ -1363,7 +1363,7 @@
^");
} =>#t168;
block {
- final core::Set<core::int*>* #t169 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t169 = new col::_CompactLinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t169.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:105:31: Error: Unexpected type 'Map<int, int>' of a spread. Expected 'dynamic' or an Iterable.
- 'Map' is from 'dart:core'.
@@ -1406,7 +1406,7 @@
#t170.{core::List::add}(42);
} =>#t170;
core::Set<core::int*>* set20 = block {
- final core::Set<core::int*>* #t172 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t172 = new col::_CompactLinkedHashSet::•<core::int*>();
if(let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:115:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
Set<int> set20 = {if (42) 42};
^" in 42 as{TypeError} core::bool*)
@@ -1431,7 +1431,7 @@
^" in 42 as{TypeError} core::String*);
} =>#t176;
core::Set<core::String*>* set40 = block {
- final core::Set<core::String*>* #t179 = col::LinkedHashSet::•<core::String*>();
+ final core::Set<core::String*>* #t179 = new col::_CompactLinkedHashSet::•<core::String*>();
if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
#t179.{core::Set::add}(let final<BottomType> #t180 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:118:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
@@ -1471,7 +1471,7 @@
#t188.{core::List::add}(42);
} =>#t188;
core::Set<core::int*>* set10 = block {
- final core::Set<core::int*>* #t189 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t189 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
#t189.{core::Set::add}(42);
#t189.{core::Set::add}(null);
@@ -1488,7 +1488,7 @@
#t191.{core::List::add}(dynVar);
} =>#t191;
core::Set<dynamic>* set11 = block {
- final core::Set<dynamic>* #t192 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t192 = new col::_CompactLinkedHashSet::•<dynamic>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
#t192.{core::Set::add}(dynVar);
#t192.{core::Set::add}(null);
@@ -1505,7 +1505,7 @@
#t194.{core::List::add}(<core::int*>[42]);
} =>#t194;
core::Set<core::List<core::int*>*>* set12 = block {
- final core::Set<core::List<core::int*>*>* #t195 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t195 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
#t195.{core::Set::add}(<core::int*>[42]);
#t195.{core::Set::add}(null);
@@ -1527,7 +1527,7 @@
}
} =>#t197;
core::Set<core::int*>* set20 = block {
- final core::Set<core::int*>* #t199 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t199 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1559,7 +1559,7 @@
}
} =>#t203;
core::Set<dynamic>* set21 = block {
- final core::Set<dynamic>* #t205 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t205 = new col::_CompactLinkedHashSet::•<dynamic>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1591,7 +1591,7 @@
}
} =>#t209;
core::Set<core::List<core::int*>*>* set22 = block {
- final core::Set<core::List<core::int*>*>* #t211 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t211 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1624,7 +1624,7 @@
}
} =>#t215;
core::Set<core::int*>* set30 = block {
- final core::Set<core::int*>* #t217 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t217 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
@@ -1659,7 +1659,7 @@
}
} =>#t221;
core::Set<dynamic>* set31 = block {
- final core::Set<dynamic>* #t223 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t223 = new col::_CompactLinkedHashSet::•<dynamic>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
@@ -1694,7 +1694,7 @@
}
} =>#t227;
core::Set<core::List<core::int*>*>* set33 = block {
- final core::Set<core::List<core::int*>*>* #t229 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t229 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
@@ -1728,7 +1728,7 @@
}
} =>#t233;
core::Set<core::List<core::int*>*>* set40 = block {
- final core::Set<core::List<core::int*>*>* #t235 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t235 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1752,7 +1752,7 @@
core::List<core::List<core::int*>*>* list41 = block {
final core::List<core::List<core::int*>*>* #t239 = <core::List<core::int*>*>[];
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
- core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t240 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t241 = #t240.{core::Set::add}(<core::int*>[]) in #t240).{core::Iterable::iterator};
+ core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t240 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t241 = #t240.{core::Set::add}(<core::int*>[]) in #t240).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
final core::List<core::int*>* #t242 = :sync-for-iterator.{core::Iterator::current};
#t239.{core::List::add}(#t242);
@@ -1760,9 +1760,9 @@
}
} =>#t239;
core::Set<core::List<core::int*>*>* set41 = block {
- final core::Set<core::List<core::int*>*>* #t243 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t243 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
- core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t244 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t245 = #t244.{core::Set::add}(<core::int*>[]) in #t244).{core::Iterable::iterator};
+ core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t244 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t245 = #t244.{core::Set::add}(<core::int*>[]) in #t244).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
final core::List<core::int*>* #t246 = :sync-for-iterator.{core::Iterator::current};
#t243.{core::Set::add}(#t246);
@@ -1782,7 +1782,7 @@
}
} =>#t247;
core::Set<core::List<core::int*>*>* set42 = block {
- final core::Set<core::List<core::int*>*>* #t249 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t249 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
@@ -1816,7 +1816,7 @@
}
} =>#t253;
core::Set<core::int*>* set50 = block {
- final core::Set<core::int*>* #t255 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t255 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1840,7 +1840,7 @@
core::List<core::int*>* list51 = block {
final core::List<core::int*>* #t259 = <core::int*>[];
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
- core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t260 = col::LinkedHashSet::•<core::int*>() in #t260).{core::Iterable::iterator};
+ core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t260 = new col::_CompactLinkedHashSet::•<core::int*>() in #t260).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
final core::int* #t261 = :sync-for-iterator.{core::Iterator::current};
#t259.{core::List::add}(#t261);
@@ -1848,9 +1848,9 @@
}
} =>#t259;
core::Set<core::int*>* set51 = block {
- final core::Set<core::int*>* #t262 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t262 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
- core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t263 = col::LinkedHashSet::•<core::int*>() in #t263).{core::Iterable::iterator};
+ core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t263 = new col::_CompactLinkedHashSet::•<core::int*>() in #t263).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
final core::int* #t264 = :sync-for-iterator.{core::Iterator::current};
#t262.{core::Set::add}(#t264);
@@ -1870,7 +1870,7 @@
}
} =>#t265;
core::Set<core::int*>* set52 = block {
- final core::Set<core::int*>* #t267 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t267 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
@@ -1892,7 +1892,7 @@
}
} =>#t269;
core::Set<core::List<core::int*>*>* set60 = block {
- final core::Set<core::List<core::int*>*>* #t271 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t271 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1925,7 +1925,7 @@
}
} =>#t275;
core::Set<core::List<core::int*>*>* set61 = block {
- final core::Set<core::List<core::int*>*>* #t277 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t277 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
@@ -1954,7 +1954,7 @@
#t281.{core::List::add}(<core::int*>[]);
} =>#t281;
core::Set<core::List<core::int*>*>* set70 = block {
- final core::Set<core::List<core::int*>*>* #t282 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t282 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
#t282.{core::Set::add}(<core::int*>[]);
#t282.{core::Set::add}(null);
@@ -1972,7 +1972,7 @@
#t284.{core::List::add}(<core::int*>[]);
} =>#t284;
core::Set<core::List<core::int*>*>* set71 = block {
- final core::Set<core::List<core::int*>*>* #t285 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t285 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
#t285.{core::Set::add}(<core::int*>[]);
@@ -1994,7 +1994,7 @@
#t287.{core::List::add}(3.14);
} =>#t287;
core::Set<core::num*>* set80 = block {
- final core::Set<core::num*>* #t288 = col::LinkedHashSet::•<core::num*>();
+ final core::Set<core::num*>* #t288 = new col::_CompactLinkedHashSet::•<core::num*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
#t288.{core::Set::add}(42);
@@ -2030,7 +2030,7 @@
}
} =>#t290;
core::Set<core::num*>* set81 = block {
- final core::Set<core::num*>* #t293 = col::LinkedHashSet::•<core::num*>();
+ final core::Set<core::num*>* #t293 = new col::_CompactLinkedHashSet::•<core::num*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
@@ -2086,7 +2086,7 @@
}
} =>#t299;
core::Set<dynamic>* set82 = block {
- final core::Set<dynamic>* #t302 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t302 = new col::_CompactLinkedHashSet::•<dynamic>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
@@ -2137,7 +2137,7 @@
}
} =>#t308;
core::Set<core::num*>* set83 = block {
- final core::Set<core::num*>* #t310 = col::LinkedHashSet::•<core::num*>();
+ final core::Set<core::num*>* #t310 = new col::_CompactLinkedHashSet::•<core::num*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
@@ -2170,7 +2170,7 @@
#t314.{core::List::add}(dynVar as{TypeError,ForDynamic} core::int*);
} =>#t314;
core::Set<core::int*>* set90 = block {
- final core::Set<core::int*>* #t315 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t315 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
#t315.{core::Set::add}(dynVar as{TypeError,ForDynamic} core::int*);
#t315.{core::Set::add}(null);
@@ -2195,7 +2195,7 @@
}
} =>#t317;
core::Set<core::int*>* set91 = block {
- final core::Set<core::int*>* #t320 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t320 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -2229,7 +2229,7 @@
#t327.{core::List::add}(42);
} =>#t327;
core::Set<core::int*>* set100 = block {
- final core::Set<core::int*>* #t329 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t329 = new col::_CompactLinkedHashSet::•<core::int*>();
for (final core::int* #t330 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
#t329.{core::Set::add}(42);
} =>#t329;
@@ -2249,7 +2249,7 @@
}
} =>#t333;
core::Set<core::int*>* set110 = block {
- final core::Set<core::int*>* #t334 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t334 = new col::_CompactLinkedHashSet::•<core::int*>();
{
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1, 2, 3].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -2281,7 +2281,7 @@
}
} =>#t336;
core::Set<core::int*>* set120 = block {
- final core::Set<core::int*>* #t337 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t337 = new col::_CompactLinkedHashSet::•<core::int*>();
{
core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -2308,7 +2308,7 @@
#t339.{core::List::add}(i);
} =>#t339;
core::Set<core::int*>* set130 = block {
- final core::Set<core::int*>* #t340 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t340 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
#t340.{core::Set::add}(i);
} =>#t340;
@@ -2342,7 +2342,7 @@
^" in "bar" as{TypeError} core::int*);
} =>#t342;
block {
- final core::Set<core::int*>* #t344 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t344 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
#t344.{core::Set::add}(let final<BottomType> #t345 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:213:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
<int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\", null};
@@ -2374,7 +2374,7 @@
}
} =>#t350;
block {
- final core::Set<core::int*>* #t353 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t353 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t354 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:216:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
<int>{for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"], null};
@@ -2412,7 +2412,7 @@
^");
} =>#t361;
block {
- final core::Set<core::int*>* #t362 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t362 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
#t362.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:219:48: Error: Unexpected type 'Map<int, int>' of a spread. Expected 'dynamic' or an Iterable.
- 'Map' is from 'dart:core'.
@@ -2440,7 +2440,7 @@
^" in 3.14 as{TypeError} core::String*);
} =>#t363;
block {
- final core::Set<core::String*>* #t366 = col::LinkedHashSet::•<core::String*>();
+ final core::Set<core::String*>* #t366 = new col::_CompactLinkedHashSet::•<core::String*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
#t366.{core::Set::add}(let final<BottomType> #t367 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:222:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
@@ -2477,7 +2477,7 @@
#t372.{core::List::add}(42);
} =>#t372;
block {
- final core::Set<core::int*>* #t373 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t373 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
#t373.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:225:62: Error: Unexpected type 'Map<int, int>' of a spread. Expected 'dynamic' or an Iterable.
@@ -2507,7 +2507,7 @@
^");
} =>#t374;
block {
- final core::Set<core::int*>* #t375 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t375 = new col::_CompactLinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
#t375.{core::Set::add}(42);
@@ -2542,7 +2542,7 @@
}
} =>#t376;
block {
- final core::Set<core::int*>* #t378 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t378 = new col::_CompactLinkedHashSet::•<core::int*>();
{
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -2587,7 +2587,7 @@
}
} =>#t382;
core::Set<dynamic>* set10 = block {
- final core::Set<dynamic>* #t384 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t384 = new col::_CompactLinkedHashSet::•<dynamic>();
{
core::Iterator<dynamic>* :sync-for-iterator = (let final<BottomType> #t385 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:237:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
- 'Iterable' is from 'dart:core'.
@@ -2629,7 +2629,7 @@
}
} =>#t388;
core::Set<core::int*>* set20 = block {
- final core::Set<core::int*>* #t391 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t391 = new col::_CompactLinkedHashSet::•<core::int*>();
{
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t392 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:240:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
var set20 = {for (int i in [\"not\", \"int\"]) i, null};
@@ -2685,7 +2685,7 @@
}
}
core::List<dynamic>* list30 = block {} =>#t397;
- final core::Set<dynamic>* #t402 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t402 = new col::_CompactLinkedHashSet::•<dynamic>();
{
asy::Stream<dynamic>* :stream = let final<BottomType> #t403 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:243:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
- 'Stream' is from 'dart:async'.
@@ -2771,7 +2771,7 @@
}
}
core::List<core::int*>* list40 = block {} =>#t412;
- final core::Set<core::int*>* #t418 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t418 = new col::_CompactLinkedHashSet::•<core::int*>();
{
asy::Stream<core::int*> :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t419 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:246:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
@@ -2837,7 +2837,7 @@
#t430.{core::List::add}(42);
} =>#t430;
core::Set<core::int*>* set50 = block {
- final core::Set<core::int*>* #t431 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t431 = new col::_CompactLinkedHashSet::•<core::int*>();
for (; ; )
#t431.{core::Set::add}(42);
#t431.{core::Set::add}(null);
@@ -2856,7 +2856,7 @@
#t433.{core::List::add}(42);
} =>#t433;
core::Set<core::int*>* set60 = block {
- final core::Set<core::int*>* #t435 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t435 = new col::_CompactLinkedHashSet::•<core::int*>();
for (; let final<BottomType> #t436 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:252:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
var set60 = {for (; \"not bool\";) 42, null};
^" in "not bool" as{TypeError} core::bool*; )
@@ -2891,7 +2891,7 @@
#t439.{core::List::add}(i);
} =>#t439;
block {
- final core::Set<core::int*>* #t440 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t440 = new col::_CompactLinkedHashSet::•<core::int*>();
await for (core::int* i in stream)
#t440.{core::Set::add}(i);
} =>#t440;
@@ -2908,7 +2908,7 @@
#t442.{core::List::add}(a{self::B*}.{self::B::foo});
} =>#t442;
core::Set<core::int*>* set10 = block {
- final core::Set<core::int*>* #t443 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t443 = new col::_CompactLinkedHashSet::•<core::int*>();
if(a is self::B*)
#t443.{core::Set::add}(a{self::B*}.{self::B::foo});
} =>#t443;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_set_literal.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_set_literal.dart.weak.transformed.expect
index 5cba724..ac2c29c 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_set_literal.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_set_literal.dart.weak.transformed.expect
@@ -6,5 +6,5 @@
static method main() → dynamic {
core::Object* a;
core::Object* b;
- return let final core::Set<core::Object*>* #t1 = col::LinkedHashSet::•<core::Object*>() in let final core::bool #t2 = #t1.{core::Set::add}(let final core::Object* #t3 = a in #t3.{core::Object::==}(null) ?{core::Object*} b : #t3) in #t1;
+ return let final core::Set<core::Object*>* #t1 = new col::_CompactLinkedHashSet::•<core::Object*>() in let final core::bool #t2 = #t1.{core::Set::add}(let final core::Object* #t3 = a in #t3.{core::Object::==}(null) ?{core::Object*} b : #t3) in #t1;
}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/issue37027.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/issue37027.dart.weak.transformed.expect
index 9c0061a..df37bc0 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/issue37027.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/issue37027.dart.weak.transformed.expect
@@ -7,7 +7,7 @@
final field core::Set<core::int*>* s;
constructor •(core::List<core::int*>* ell) → self::C*
: self::C::s = block {
- final core::Set<core::int*>* #t1 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t1 = new col::_CompactLinkedHashSet::•<core::int*>();
{
core::Iterator<core::int*>* :sync-for-iterator = ell.{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/null_aware_spread.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/null_aware_spread.dart.weak.transformed.expect
index d895697..9ff4788 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/null_aware_spread.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/null_aware_spread.dart.weak.transformed.expect
@@ -19,7 +19,7 @@
}
static method nullAwareSetSpread(core::Set<core::String*>* set) → dynamic {
set = block {
- final core::Set<core::String*>* #t4 = col::LinkedHashSet::•<core::String*>();
+ final core::Set<core::String*>* #t4 = new col::_CompactLinkedHashSet::•<core::String*>();
#t4.{core::Set::add}("foo");
final core::Iterable<core::String*>* #t5 = set;
if(!#t5.{core::Object::==}(null)) {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection.dart.weak.transformed.expect
index d860998..f06f6bc 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection.dart.weak.transformed.expect
@@ -51,7 +51,7 @@
}
} =>#t5;
final core::Set<core::int*>* aSet = block {
- final core::Set<core::int*>* #t9 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t9 = new col::_CompactLinkedHashSet::•<core::int*>();
#t9.{core::Set::add}(1);
{
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[2].{core::Iterable::iterator};
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.transformed.expect
index 6e97878..7a37a6f 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.transformed.expect
@@ -120,7 +120,7 @@
}
} =>#t1;
core::Set<dynamic>* set10 = block {
- final core::Set<dynamic>* #t3 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t3 = new col::_CompactLinkedHashSet::•<dynamic>();
{
core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -160,7 +160,7 @@
}
} =>#t9;
core::Set<core::int*>* set20 = block {
- final core::Set<core::int*>* #t11 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t11 = new col::_CompactLinkedHashSet::•<core::int*>();
{
core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -171,7 +171,7 @@
#t11.{core::Set::add}(42);
} =>#t11;
core::Set<core::int*>* set20ambiguous = block {
- final core::Set<core::int*>* #t13 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t13 = new col::_CompactLinkedHashSet::•<core::int*>();
{
core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -215,7 +215,7 @@
}
} =>#t20;
core::Set<dynamic>* set21 = block {
- final core::Set<dynamic>* #t22 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t22 = new col::_CompactLinkedHashSet::•<dynamic>();
{
core::Iterator<dynamic>* :sync-for-iterator = ((spread as dynamic) as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -251,7 +251,7 @@
}
} =>#t26;
core::Set<core::int*>* set22 = block {
- final core::Set<core::int*>* #t28 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t28 = new col::_CompactLinkedHashSet::•<core::int*>();
{
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -262,7 +262,7 @@
#t28.{core::Set::add}(42);
} =>#t28;
core::Set<core::int*>* set22ambiguous = block {
- final core::Set<core::int*>* #t30 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t30 = new col::_CompactLinkedHashSet::•<core::int*>();
{
core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -295,7 +295,7 @@
}
} =>#t35;
core::Set<core::List<core::int*>*>* set23 = block {
- final core::Set<core::List<core::int*>*>* #t37 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t37 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
{
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -306,7 +306,7 @@
#t37.{core::Set::add}(<core::int*>[42]);
} =>#t37;
core::Set<core::List<core::int*>*>* set23ambiguous = block {
- final core::Set<core::List<core::int*>*>* #t39 = col::LinkedHashSet::•<core::List<core::int*>*>();
+ final core::Set<core::List<core::int*>*>* #t39 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
{
core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -348,7 +348,7 @@
- 'Set' is from 'dart:core'.
int set30 = /*@ typeArgs=int* */ {...spread, 42};
^" in ( block {
- final core::Set<core::int*>* #t48 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t48 = new col::_CompactLinkedHashSet::•<core::int*>();
{
core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -362,7 +362,7 @@
- 'Set' is from 'dart:core'.
{...spread};
^" in ( block {
- final core::Set<core::int*>* #t51 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t51 = new col::_CompactLinkedHashSet::•<core::int*>();
{
core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -404,7 +404,7 @@
core::List<dynamic>* lhs40 = <dynamic>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:113:38: Error: Unexpected type 'int' of a spread. Expected 'dynamic' or an Iterable.
List<dynamic> lhs40 = <dynamic>[...notSpreadInt];
^"];
- core::Set<dynamic>* set40 = let final core::Set<dynamic>* #t60 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t61 = #t60.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:115:37: Error: Unexpected type 'int' of a spread. Expected 'dynamic' or an Iterable.
+ core::Set<dynamic>* set40 = let final core::Set<dynamic>* #t60 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t61 = #t60.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:115:37: Error: Unexpected type 'int' of a spread. Expected 'dynamic' or an Iterable.
Set<dynamic> set40 = <dynamic>{...notSpreadInt};
^") in #t60;
core::Map<dynamic, dynamic>* map40 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:117:55: Error: Unexpected type 'int' of a map spread entry. Expected 'dynamic' or a Map.
@@ -413,7 +413,7 @@
core::List<dynamic>* lhs50 = <dynamic>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:119:38: Error: Unexpected type 'int Function()' of a spread. Expected 'dynamic' or an Iterable.
List<dynamic> lhs50 = <dynamic>[...notSpreadFunction];
^"];
- core::Set<dynamic>* set50 = let final core::Set<dynamic>* #t62 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:121:37: Error: Unexpected type 'int Function()' of a spread. Expected 'dynamic' or an Iterable.
+ core::Set<dynamic>* set50 = let final core::Set<dynamic>* #t62 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:121:37: Error: Unexpected type 'int Function()' of a spread. Expected 'dynamic' or an Iterable.
Set<dynamic> set50 = <dynamic>{...notSpreadFunction};
^") in #t62;
core::Map<dynamic, dynamic>* map50 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:123:55: Error: Unexpected type 'int Function()' of a map spread entry. Expected 'dynamic' or a Map.
@@ -422,7 +422,7 @@
core::List<core::String*>* lhs60 = <core::String*>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:125:36: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
List<String> lhs60 = <String>[...spread];
^"];
- core::Set<core::String*>* set60 = let final core::Set<core::String*>* #t64 = col::LinkedHashSet::•<core::String*>() in let final core::bool #t65 = #t64.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:127:35: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+ core::Set<core::String*>* set60 = let final core::Set<core::String*>* #t64 = new col::_CompactLinkedHashSet::•<core::String*>() in let final core::bool #t65 = #t64.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:127:35: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
Set<String> set60 = <String>{...spread};
^") in #t64;
core::Map<core::int*, core::int*>* map60 = <core::int*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:129:39: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
@@ -434,11 +434,11 @@
core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:133:30: Error: Can't spread a value with static type 'Null'.
List<int> lhs70 = <int>[...null];
^"];
- core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final core::bool #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type 'Null'.
+ core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = new col::_CompactLinkedHashSet::•<core::int*>() in let final core::bool #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type 'Null'.
Set<int> set70 = <int>{...null};
^") in #t66;
core::Set<dynamic>* set71ambiguous = block {
- final core::Set<dynamic>* #t68 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t68 = new col::_CompactLinkedHashSet::•<dynamic>();
#t68.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:139:8: Error: Expected ',' before this.
...null,
^");
@@ -468,7 +468,7 @@
}
} =>#t71;
core::Set<core::int*>* set80 = block {
- final core::Set<core::int*>* #t74 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t74 = new col::_CompactLinkedHashSet::•<core::int*>();
final core::Iterable<core::int*>* #t75 = null;
if(!#t75.{core::Object::==}(null)) {
core::Iterator<core::int*>* :sync-for-iterator = #t75.{core::Iterable::iterator};
@@ -479,7 +479,7 @@
}
} =>#t74;
core::Set<dynamic>* set81ambiguous = block {
- final core::Set<dynamic>* #t77 = col::LinkedHashSet::•<dynamic>();
+ final core::Set<dynamic>* #t77 = new col::_CompactLinkedHashSet::•<dynamic>();
final core::Iterable<dynamic>* #t78 = null;
if(!#t78.{core::Object::==}(null)) {
core::Iterator<dynamic>* :sync-for-iterator = #t78.{core::Iterable::iterator};
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.1.expect
index 29a46f9..4b9609d 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.1.expect
@@ -214,7 +214,7 @@
return result;
}
method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/collection/list.dart */ toSet() → dart.core::Set<dart.core::int*> {
- dart.core::Set<dart.core::int*> result = dart.collection::LinkedHashSet::•<dart.core::int*>();
+ dart.core::Set<dart.core::int*> result = new dart.collection::_CompactLinkedHashSet::•<dart.core::int*>();
for (dart.core::int i = 0; i.{dart.core::num::<}(this.{dart.core::List::length}); i = i.{dart.core::num::+}(1)) {
result.{dart.core::Set::add}(this.{dart.core::List::[]}(i));
}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.2.expect
index 29a46f9..4b9609d 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.2.expect
@@ -214,7 +214,7 @@
return result;
}
method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/collection/list.dart */ toSet() → dart.core::Set<dart.core::int*> {
- dart.core::Set<dart.core::int*> result = dart.collection::LinkedHashSet::•<dart.core::int*>();
+ dart.core::Set<dart.core::int*> result = new dart.collection::_CompactLinkedHashSet::•<dart.core::int*>();
for (dart.core::int i = 0; i.{dart.core::num::<}(this.{dart.core::List::length}); i = i.{dart.core::num::+}(1)) {
result.{dart.core::Set::add}(this.{dart.core::List::[]}(i));
}
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
index 7974856..4599552 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
@@ -137,13 +137,13 @@
- 'Set' is from 'dart:core'.
- 'List' is from 'dart:core'.
c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
- ^" in (let final core::Set<dynamic>* #t5 = col::LinkedHashSet::•<dynamic>() in #t5) as{TypeError} core::List<dynamic>*;
+ ^" in (let final core::Set<dynamic>* #t5 = new col::_CompactLinkedHashSet::•<dynamic>() in #t5) as{TypeError} core::List<dynamic>*;
self::c2 = <dynamic>[];
self::c2 = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
- 'Set' is from 'dart:core'.
- 'List' is from 'dart:core'.
c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
- ^" in (let final core::Set<dynamic>* #t7 = col::LinkedHashSet::•<dynamic>() in #t7) as{TypeError} core::List<dynamic>*;
+ ^" in (let final core::Set<dynamic>* #t7 = new col::_CompactLinkedHashSet::•<dynamic>() in #t7) as{TypeError} core::List<dynamic>*;
self::d = <dynamic, dynamic>{};
self::d = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:36: Error: A value of type 'int' can't be assigned to a variable of type 'Map<dynamic, dynamic>'.
- 'Map' is from 'dart:core'.
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect
index f24f351..97d6ebf 100644
--- a/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect
@@ -124,13 +124,13 @@
}
} =>#t9;
core::Set<Never> s1 = block {
- final core::Set<Never> #t12 = col::LinkedHashSet::•<Never>();
+ final core::Set<Never> #t12 = new col::_CompactLinkedHashSet::•<Never>();
for (final Never #t13 in n1)
#t12.{core::Set::add}(#t13);
#t12.{core::Set::add}(n1);
} =>#t12;
core::Set<Never> s2 = block {
- final core::Set<Never> #t14 = col::LinkedHashSet::•<Never>();
+ final core::Set<Never> #t14 = new col::_CompactLinkedHashSet::•<Never>();
final core::Iterable<Never>? #t15 = n1;
if(!#t15.{core::Object::==}(null)) {
core::Iterator<Never> :sync-for-iterator = #t15{core::Iterable<Never>}.{core::Iterable::iterator};
@@ -141,11 +141,11 @@
}
#t14.{core::Set::add}(n1);
} =>#t14;
- core::Set<dynamic> s3 = let final core::Set<dynamic> #t17 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t18 = #t17.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+ core::Set<dynamic> s3 = let final core::Set<dynamic> #t17 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t18 = #t17.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
var s3 = {...n2, n1};
^") in let final core::bool #t19 = #t17.{core::Set::add}(n1) in #t17;
core::Set<Never> s4 = block {
- final core::Set<Never> #t20 = col::LinkedHashSet::•<Never>();
+ final core::Set<Never> #t20 = new col::_CompactLinkedHashSet::•<Never>();
final core::Iterable<Never>? #t21 = n2;
if(!#t21.{core::Object::==}(null)) {
core::Iterator<Never> :sync-for-iterator = #t21{core::Iterable<Never>}.{core::Iterable::iterator};
@@ -156,11 +156,11 @@
}
#t20.{core::Set::add}(n1);
} =>#t20;
- core::Set<dynamic> s5 = let final core::Set<dynamic> #t23 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t24 = #t23.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+ core::Set<dynamic> s5 = let final core::Set<dynamic> #t23 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t24 = #t23.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
var s5 = {...n3, n1};
^") in let final core::bool #t25 = #t23.{core::Set::add}(n1) in #t23;
core::Set<Never> s6 = block {
- final core::Set<Never> #t26 = col::LinkedHashSet::•<Never>();
+ final core::Set<Never> #t26 = new col::_CompactLinkedHashSet::•<Never>();
final core::Iterable<Never>? #t27 = n3;
if(!#t27.{core::Object::==}(null)) {
core::Iterator<Never> :sync-for-iterator = #t27{core::Iterable<Never>}.{core::Iterable::iterator};
@@ -271,13 +271,13 @@
}
} =>#t48;
core::Set<self::test2::N1> s1 = block {
- final core::Set<self::test2::N1> #t51 = col::LinkedHashSet::•<self::test2::N1>();
+ final core::Set<self::test2::N1> #t51 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
for (final self::test2::N1 #t52 in n1)
#t51.{core::Set::add}(#t52);
#t51.{core::Set::add}(n1);
} =>#t51;
core::Set<self::test2::N1> s2 = block {
- final core::Set<self::test2::N1> #t53 = col::LinkedHashSet::•<self::test2::N1>();
+ final core::Set<self::test2::N1> #t53 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
final core::Iterable<self::test2::N1>? #t54 = n1;
if(!#t54.{core::Object::==}(null)) {
core::Iterator<self::test2::N1> :sync-for-iterator = #t54{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
@@ -288,11 +288,11 @@
}
#t53.{core::Set::add}(n1);
} =>#t53;
- core::Set<dynamic> s3 = let final core::Set<dynamic> #t56 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t57 = #t56.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+ core::Set<dynamic> s3 = let final core::Set<dynamic> #t56 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t57 = #t56.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
var s3 = {...n2, n1};
^") in let final core::bool #t58 = #t56.{core::Set::add}(n1) in #t56;
core::Set<self::test2::N1> s4 = block {
- final core::Set<self::test2::N1> #t59 = col::LinkedHashSet::•<self::test2::N1>();
+ final core::Set<self::test2::N1> #t59 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
final core::Iterable<self::test2::N1>? #t60 = n2;
if(!#t60.{core::Object::==}(null)) {
core::Iterator<self::test2::N1> :sync-for-iterator = #t60{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
@@ -303,11 +303,11 @@
}
#t59.{core::Set::add}(n1);
} =>#t59;
- core::Set<dynamic> s5 = let final core::Set<dynamic> #t62 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+ core::Set<dynamic> s5 = let final core::Set<dynamic> #t62 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
var s5 = {...n3, n1};
^") in let final core::bool #t64 = #t62.{core::Set::add}(n1) in #t62;
core::Set<self::test2::N1> s6 = block {
- final core::Set<self::test2::N1> #t65 = col::LinkedHashSet::•<self::test2::N1>();
+ final core::Set<self::test2::N1> #t65 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
final core::Iterable<self::test2::N1>? #t66 = n3;
if(!#t66.{core::Object::==}(null)) {
core::Iterator<self::test2::N1> :sync-for-iterator = #t66{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect
index f24f351..97d6ebf 100644
--- a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect
@@ -124,13 +124,13 @@
}
} =>#t9;
core::Set<Never> s1 = block {
- final core::Set<Never> #t12 = col::LinkedHashSet::•<Never>();
+ final core::Set<Never> #t12 = new col::_CompactLinkedHashSet::•<Never>();
for (final Never #t13 in n1)
#t12.{core::Set::add}(#t13);
#t12.{core::Set::add}(n1);
} =>#t12;
core::Set<Never> s2 = block {
- final core::Set<Never> #t14 = col::LinkedHashSet::•<Never>();
+ final core::Set<Never> #t14 = new col::_CompactLinkedHashSet::•<Never>();
final core::Iterable<Never>? #t15 = n1;
if(!#t15.{core::Object::==}(null)) {
core::Iterator<Never> :sync-for-iterator = #t15{core::Iterable<Never>}.{core::Iterable::iterator};
@@ -141,11 +141,11 @@
}
#t14.{core::Set::add}(n1);
} =>#t14;
- core::Set<dynamic> s3 = let final core::Set<dynamic> #t17 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t18 = #t17.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+ core::Set<dynamic> s3 = let final core::Set<dynamic> #t17 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t18 = #t17.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
var s3 = {...n2, n1};
^") in let final core::bool #t19 = #t17.{core::Set::add}(n1) in #t17;
core::Set<Never> s4 = block {
- final core::Set<Never> #t20 = col::LinkedHashSet::•<Never>();
+ final core::Set<Never> #t20 = new col::_CompactLinkedHashSet::•<Never>();
final core::Iterable<Never>? #t21 = n2;
if(!#t21.{core::Object::==}(null)) {
core::Iterator<Never> :sync-for-iterator = #t21{core::Iterable<Never>}.{core::Iterable::iterator};
@@ -156,11 +156,11 @@
}
#t20.{core::Set::add}(n1);
} =>#t20;
- core::Set<dynamic> s5 = let final core::Set<dynamic> #t23 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t24 = #t23.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+ core::Set<dynamic> s5 = let final core::Set<dynamic> #t23 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t24 = #t23.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
var s5 = {...n3, n1};
^") in let final core::bool #t25 = #t23.{core::Set::add}(n1) in #t23;
core::Set<Never> s6 = block {
- final core::Set<Never> #t26 = col::LinkedHashSet::•<Never>();
+ final core::Set<Never> #t26 = new col::_CompactLinkedHashSet::•<Never>();
final core::Iterable<Never>? #t27 = n3;
if(!#t27.{core::Object::==}(null)) {
core::Iterator<Never> :sync-for-iterator = #t27{core::Iterable<Never>}.{core::Iterable::iterator};
@@ -271,13 +271,13 @@
}
} =>#t48;
core::Set<self::test2::N1> s1 = block {
- final core::Set<self::test2::N1> #t51 = col::LinkedHashSet::•<self::test2::N1>();
+ final core::Set<self::test2::N1> #t51 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
for (final self::test2::N1 #t52 in n1)
#t51.{core::Set::add}(#t52);
#t51.{core::Set::add}(n1);
} =>#t51;
core::Set<self::test2::N1> s2 = block {
- final core::Set<self::test2::N1> #t53 = col::LinkedHashSet::•<self::test2::N1>();
+ final core::Set<self::test2::N1> #t53 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
final core::Iterable<self::test2::N1>? #t54 = n1;
if(!#t54.{core::Object::==}(null)) {
core::Iterator<self::test2::N1> :sync-for-iterator = #t54{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
@@ -288,11 +288,11 @@
}
#t53.{core::Set::add}(n1);
} =>#t53;
- core::Set<dynamic> s3 = let final core::Set<dynamic> #t56 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t57 = #t56.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+ core::Set<dynamic> s3 = let final core::Set<dynamic> #t56 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t57 = #t56.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
var s3 = {...n2, n1};
^") in let final core::bool #t58 = #t56.{core::Set::add}(n1) in #t56;
core::Set<self::test2::N1> s4 = block {
- final core::Set<self::test2::N1> #t59 = col::LinkedHashSet::•<self::test2::N1>();
+ final core::Set<self::test2::N1> #t59 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
final core::Iterable<self::test2::N1>? #t60 = n2;
if(!#t60.{core::Object::==}(null)) {
core::Iterator<self::test2::N1> :sync-for-iterator = #t60{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
@@ -303,11 +303,11 @@
}
#t59.{core::Set::add}(n1);
} =>#t59;
- core::Set<dynamic> s5 = let final core::Set<dynamic> #t62 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+ core::Set<dynamic> s5 = let final core::Set<dynamic> #t62 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
var s5 = {...n3, n1};
^") in let final core::bool #t64 = #t62.{core::Set::add}(n1) in #t62;
core::Set<self::test2::N1> s6 = block {
- final core::Set<self::test2::N1> #t65 = col::LinkedHashSet::•<self::test2::N1>();
+ final core::Set<self::test2::N1> #t65 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
final core::Iterable<self::test2::N1>? #t66 = n3;
if(!#t66.{core::Object::==}(null)) {
core::Iterator<self::test2::N1> :sync-for-iterator = #t66{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
diff --git a/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.transformed.expect
index 04ff3fd..80f3187 100644
--- a/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.transformed.expect
@@ -85,7 +85,7 @@
} =>#t16;
core::Set<core::int>? set = null;
core::print( block {
- final core::Set<core::int> #t19 = col::LinkedHashSet::•<core::int>();
+ final core::Set<core::int> #t19 = new col::_CompactLinkedHashSet::•<core::int>();
#t19.{core::Set::add}(1);
#t19.{core::Set::add}(2);
final core::Iterable<core::int>? #t20 = set;
@@ -99,7 +99,7 @@
#t19.{core::Set::add}(3);
} =>#t19);
core::print( block {
- final core::Set<core::int> #t22 = col::LinkedHashSet::•<core::int>();
+ final core::Set<core::int> #t22 = new col::_CompactLinkedHashSet::•<core::int>();
#t22.{core::Set::add}(1);
#t22.{core::Set::add}(2);
final core::Iterable<core::int>? #t23 = null;
@@ -113,7 +113,7 @@
#t22.{core::Set::add}(3);
} =>#t22);
core::Set<core::int> set1 = block {
- final core::Set<core::int> #t25 = col::LinkedHashSet::•<core::int>();
+ final core::Set<core::int> #t25 = new col::_CompactLinkedHashSet::•<core::int>();
final core::Iterable<dynamic>? #t26 = set;
if(!#t26.{core::Object::==}(null)) {
core::Iterator<dynamic> :sync-for-iterator = #t26{core::Iterable<dynamic>}.{core::Iterable::iterator};
@@ -127,7 +127,7 @@
}
} =>#t25;
core::Set<core::int> set3 = block {
- final core::Set<core::int> #t29 = col::LinkedHashSet::•<core::int>();
+ final core::Set<core::int> #t29 = new col::_CompactLinkedHashSet::•<core::int>();
#t29.{core::Set::add}(1);
#t29.{core::Set::add}(2);
final core::Iterable<core::int>? #t30 = set;
@@ -141,7 +141,7 @@
#t29.{core::Set::add}(3);
} =>#t29;
core::Set<core::int> set4 = block {
- final core::Set<core::int> #t32 = col::LinkedHashSet::•<core::int>();
+ final core::Set<core::int> #t32 = new col::_CompactLinkedHashSet::•<core::int>();
#t32.{core::Set::add}(1);
#t32.{core::Set::add}(2);
final core::Iterable<core::int>? #t33 = null;
diff --git a/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.transformed.expect
index 04ff3fd..80f3187 100644
--- a/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.transformed.expect
@@ -85,7 +85,7 @@
} =>#t16;
core::Set<core::int>? set = null;
core::print( block {
- final core::Set<core::int> #t19 = col::LinkedHashSet::•<core::int>();
+ final core::Set<core::int> #t19 = new col::_CompactLinkedHashSet::•<core::int>();
#t19.{core::Set::add}(1);
#t19.{core::Set::add}(2);
final core::Iterable<core::int>? #t20 = set;
@@ -99,7 +99,7 @@
#t19.{core::Set::add}(3);
} =>#t19);
core::print( block {
- final core::Set<core::int> #t22 = col::LinkedHashSet::•<core::int>();
+ final core::Set<core::int> #t22 = new col::_CompactLinkedHashSet::•<core::int>();
#t22.{core::Set::add}(1);
#t22.{core::Set::add}(2);
final core::Iterable<core::int>? #t23 = null;
@@ -113,7 +113,7 @@
#t22.{core::Set::add}(3);
} =>#t22);
core::Set<core::int> set1 = block {
- final core::Set<core::int> #t25 = col::LinkedHashSet::•<core::int>();
+ final core::Set<core::int> #t25 = new col::_CompactLinkedHashSet::•<core::int>();
final core::Iterable<dynamic>? #t26 = set;
if(!#t26.{core::Object::==}(null)) {
core::Iterator<dynamic> :sync-for-iterator = #t26{core::Iterable<dynamic>}.{core::Iterable::iterator};
@@ -127,7 +127,7 @@
}
} =>#t25;
core::Set<core::int> set3 = block {
- final core::Set<core::int> #t29 = col::LinkedHashSet::•<core::int>();
+ final core::Set<core::int> #t29 = new col::_CompactLinkedHashSet::•<core::int>();
#t29.{core::Set::add}(1);
#t29.{core::Set::add}(2);
final core::Iterable<core::int>? #t30 = set;
@@ -141,7 +141,7 @@
#t29.{core::Set::add}(3);
} =>#t29;
core::Set<core::int> set4 = block {
- final core::Set<core::int> #t32 = col::LinkedHashSet::•<core::int>();
+ final core::Set<core::int> #t32 = new col::_CompactLinkedHashSet::•<core::int>();
#t32.{core::Set::add}(1);
#t32.{core::Set::add}(2);
final core::Iterable<core::int>? #t33 = null;
diff --git a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect
index f215b88..3d73f1d 100644
--- a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect
@@ -149,7 +149,7 @@
}
} =>#t5;
core::Set<core::String> a = block {
- final core::Set<core::String> #t8 = col::LinkedHashSet::•<core::String>();
+ final core::Set<core::String> #t8 = new col::_CompactLinkedHashSet::•<core::String>();
final core::Iterable<dynamic>? #t9 = l;
if(!#t9.{core::Object::==}(null)) {
core::Iterator<dynamic> :sync-for-iterator = #t9{core::Iterable<dynamic>}.{core::Iterable::iterator};
@@ -163,7 +163,7 @@
}
} =>#t8;
block {
- final core::Set<core::String> #t12 = col::LinkedHashSet::•<core::String>();
+ final core::Set<core::String> #t12 = new col::_CompactLinkedHashSet::•<core::String>();
final core::Iterable<core::String>? #t13 = l;
if(!#t13.{core::Object::==}(null)) {
core::Iterator<core::String> :sync-for-iterator = #t13{core::Iterable<core::String>}.{core::Iterable::iterator};
diff --git a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect
index f215b88..3d73f1d 100644
--- a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect
@@ -149,7 +149,7 @@
}
} =>#t5;
core::Set<core::String> a = block {
- final core::Set<core::String> #t8 = col::LinkedHashSet::•<core::String>();
+ final core::Set<core::String> #t8 = new col::_CompactLinkedHashSet::•<core::String>();
final core::Iterable<dynamic>? #t9 = l;
if(!#t9.{core::Object::==}(null)) {
core::Iterator<dynamic> :sync-for-iterator = #t9{core::Iterable<dynamic>}.{core::Iterable::iterator};
@@ -163,7 +163,7 @@
}
} =>#t8;
block {
- final core::Set<core::String> #t12 = col::LinkedHashSet::•<core::String>();
+ final core::Set<core::String> #t12 = new col::_CompactLinkedHashSet::•<core::String>();
final core::Iterable<core::String>? #t13 = l;
if(!#t13.{core::Object::==}(null)) {
core::Iterator<core::String> :sync-for-iterator = #t13{core::Iterable<core::String>}.{core::Iterable::iterator};
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.expect
deleted file mode 100644
index 2107377..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
- field core::int? numLegs = null;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.transformed.expect
deleted file mode 100644
index 2107377..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
- field core::int? numLegs = null;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.expect
deleted file mode 100644
index 2107377..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
- field core::int? numLegs = null;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.transformed.expect
deleted file mode 100644
index 2107377..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
- field core::int? numLegs = null;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart
deleted file mode 100644
index efe2cdd..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2020, 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.
-
-const String valueClass = "valueClass";
-
-@valueClass
-class Animal {
- final int numLegs = 4;
-}
-
-class Cat extends Animal {}
-
-main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.expect
deleted file mode 100644
index dda377d..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-class Cat extends self::Animal {
- synthetic constructor •() → self::Cat
- : super self::Animal::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.transformed.expect
deleted file mode 100644
index dda377d..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-class Cat extends self::Animal {
- synthetic constructor •() → self::Cat
- : super self::Animal::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.expect
deleted file mode 100644
index dda377d..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-class Cat extends self::Animal {
- synthetic constructor •() → self::Cat
- : super self::Animal::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.transformed.expect
deleted file mode 100644
index dda377d..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.transformed.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-class Cat extends self::Animal {
- synthetic constructor •() → self::Cat
- : super self::Animal::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.expect
deleted file mode 100644
index 756c16c..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-class Cat extends core::Object implements self::Animal {
- field core::int numLegs = 4;
- synthetic constructor •() → self::Cat
- : super core::Object::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.transformed.expect
deleted file mode 100644
index 756c16c..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-class Cat extends core::Object implements self::Animal {
- field core::int numLegs = 4;
- synthetic constructor •() → self::Cat
- : super core::Object::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.expect
deleted file mode 100644
index 756c16c..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-class Cat extends core::Object implements self::Animal {
- field core::int numLegs = 4;
- synthetic constructor •() → self::Cat
- : super core::Object::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.transformed.expect
deleted file mode 100644
index 756c16c..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.transformed.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-class Cat extends core::Object implements self::Animal {
- field core::int numLegs = 4;
- synthetic constructor •() → self::Cat
- : super core::Object::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart
deleted file mode 100644
index 522d957..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright (c) 2020, 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.
-
-const String valueClass = "valueClass";
-
-@valueClass
-class Animal {
- final int numLegs = 4;
-}
-
-main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.expect
deleted file mode 100644
index 264a8f9..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.transformed.expect
deleted file mode 100644
index 264a8f9..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.expect
deleted file mode 100644
index 264a8f9..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.transformed.expect
deleted file mode 100644
index 264a8f9..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.expect
deleted file mode 100644
index c9c2a66..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-@#C1
-class Cat extends core::Object implements self::Animal {
- final field core::int numLegs = 4;
- final field core::int numWhiskers = 4;
- synthetic constructor •() → self::Cat
- : super core::Object::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.transformed.expect
deleted file mode 100644
index c9c2a66..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-@#C1
-class Cat extends core::Object implements self::Animal {
- final field core::int numLegs = 4;
- final field core::int numWhiskers = 4;
- synthetic constructor •() → self::Cat
- : super core::Object::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.expect
deleted file mode 100644
index c9c2a66..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-@#C1
-class Cat extends core::Object implements self::Animal {
- final field core::int numLegs = 4;
- final field core::int numWhiskers = 4;
- synthetic constructor •() → self::Cat
- : super core::Object::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.transformed.expect
deleted file mode 100644
index c9c2a66..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.transformed.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-@#C1
-class Cat extends core::Object implements self::Animal {
- final field core::int numLegs = 4;
- final field core::int numWhiskers = 4;
- synthetic constructor •() → self::Cat
- : super core::Object::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.expect
deleted file mode 100644
index 7e7b833..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-class Animal extends core::Object {
- field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-@#C1
-class Cat extends self::Animal {
- synthetic constructor •() → self::Cat
- : super self::Animal::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.transformed.expect
deleted file mode 100644
index 7e7b833..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-class Animal extends core::Object {
- field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-@#C1
-class Cat extends self::Animal {
- synthetic constructor •() → self::Cat
- : super self::Animal::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.expect
deleted file mode 100644
index 7e7b833..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-class Animal extends core::Object {
- field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-@#C1
-class Cat extends self::Animal {
- synthetic constructor •() → self::Cat
- : super self::Animal::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.transformed.expect
deleted file mode 100644
index 7e7b833..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.transformed.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-class Animal extends core::Object {
- field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-@#C1
-class Cat extends self::Animal {
- synthetic constructor •() → self::Cat
- : super self::Animal::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.transformed.expect
deleted file mode 100644
index 7e25746..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-class Animal extends core::Object {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-@#C1
-class Cat extends self::Animal {
- synthetic constructor •() → self::Cat
- : super self::Animal::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.expect
deleted file mode 100644
index 7e25746..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-class Animal extends core::Object {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-@#C1
-class Cat extends self::Animal {
- synthetic constructor •() → self::Cat
- : super self::Animal::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.transformed.expect
deleted file mode 100644
index 7e25746..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.transformed.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-class Animal extends core::Object {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-@#C1
-class Cat extends self::Animal {
- synthetic constructor •() → self::Cat
- : super self::Animal::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart
deleted file mode 100644
index 2d67798..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2020, 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.
-
-const String valueClass = "valueClass";
-
-class Animal {
- final int numLegs = 4;
-}
-
-@valueClass
-class Cat implements Animal {
- final int numLegs = 4;
-}
-
-main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.expect
deleted file mode 100644
index ba205d4..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-class Animal extends core::Object {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-@#C1
-class Cat extends core::Object implements self::Animal {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Cat
- : super core::Object::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.transformed.expect
deleted file mode 100644
index ba205d4..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-class Animal extends core::Object {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-@#C1
-class Cat extends core::Object implements self::Animal {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Cat
- : super core::Object::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.expect
deleted file mode 100644
index ba205d4..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-class Animal extends core::Object {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-@#C1
-class Cat extends core::Object implements self::Animal {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Cat
- : super core::Object::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.transformed.expect
deleted file mode 100644
index ba205d4..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.transformed.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-class Animal extends core::Object {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Animal
- : super core::Object::•()
- ;
-}
-@#C1
-class Cat extends core::Object implements self::Animal {
- final field core::int numLegs = 4;
- synthetic constructor •() → self::Cat
- : super core::Object::•()
- ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants {
- #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.transformed.expect
index 9a256aa..3fc5a31 100644
--- a/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.transformed.expect
@@ -35,22 +35,22 @@
core::List<core::int*>* local1g = <core::int*>[inf::field7];
core::List<core::int*>* local1h = <core::int*>[inf::field8];
core::List<core::Null?>* local1i = <core::Null?>[null];
- core::Set<inf::C<dynamic>*>* local2a = let final core::Set<inf::C<dynamic>*>* #t1 = col::LinkedHashSet::•<inf::C<dynamic>*>() in let final core::bool #t2 = #t1.{core::Set::add}(inf::field1) in let final core::bool #t3 = #t1.{core::Set::add}(null) in #t1;
- core::Set<inf::C<dynamic>*>* local2b = let final core::Set<inf::C<dynamic>*>* #t4 = col::LinkedHashSet::•<inf::C<dynamic>*>() in let final core::bool #t5 = #t4.{core::Set::add}(inf::field2) in let final core::bool #t6 = #t4.{core::Set::add}(null) in #t4;
- core::Set<inf::C<core::int*>*>* local2c = let final core::Set<inf::C<core::int*>*>* #t7 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t8 = #t7.{core::Set::add}(inf::field3) in let final core::bool #t9 = #t7.{core::Set::add}(null) in #t7;
- core::Set<inf::C<core::int*>*>* local2d = let final core::Set<inf::C<core::int*>*>* #t10 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t11 = #t10.{core::Set::add}(inf::field4) in let final core::bool #t12 = #t10.{core::Set::add}(null) in #t10;
- core::Set<inf::C<core::int*>*>* local2e = let final core::Set<inf::C<core::int*>*>* #t13 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t14 = #t13.{core::Set::add}(inf::field5) in let final core::bool #t15 = #t13.{core::Set::add}(null) in #t13;
- core::Set<inf::C<core::int*>*>* local2f = let final core::Set<inf::C<core::int*>*>* #t16 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t17 = #t16.{core::Set::add}(inf::field6) in let final core::bool #t18 = #t16.{core::Set::add}(null) in #t16;
- core::Set<core::int*>* local2g = let final core::Set<core::int*>* #t19 = col::LinkedHashSet::•<core::int*>() in let final core::bool #t20 = #t19.{core::Set::add}(inf::field7) in let final core::bool #t21 = #t19.{core::Set::add}(null) in #t19;
- core::Set<core::int*>* local2h = let final core::Set<core::int*>* #t22 = col::LinkedHashSet::•<core::int*>() in let final core::bool #t23 = #t22.{core::Set::add}(inf::field8) in let final core::bool #t24 = #t22.{core::Set::add}(null) in #t22;
- core::Set<inf::C<dynamic>*>* local3a = let final core::Set<inf::C<dynamic>*>* #t25 = col::LinkedHashSet::•<inf::C<dynamic>*>() in let final core::bool #t26 = #t25.{core::Set::add}(null) in let final core::bool #t27 = #t25.{core::Set::add}(inf::field1) in #t25;
- core::Set<inf::C<dynamic>*>* local3b = let final core::Set<inf::C<dynamic>*>* #t28 = col::LinkedHashSet::•<inf::C<dynamic>*>() in let final core::bool #t29 = #t28.{core::Set::add}(null) in let final core::bool #t30 = #t28.{core::Set::add}(inf::field2) in #t28;
- core::Set<inf::C<core::int*>*>* local3c = let final core::Set<inf::C<core::int*>*>* #t31 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t32 = #t31.{core::Set::add}(null) in let final core::bool #t33 = #t31.{core::Set::add}(inf::field3) in #t31;
- core::Set<inf::C<core::int*>*>* local3d = let final core::Set<inf::C<core::int*>*>* #t34 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t35 = #t34.{core::Set::add}(null) in let final core::bool #t36 = #t34.{core::Set::add}(inf::field4) in #t34;
- core::Set<inf::C<core::int*>*>* local3e = let final core::Set<inf::C<core::int*>*>* #t37 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t38 = #t37.{core::Set::add}(null) in let final core::bool #t39 = #t37.{core::Set::add}(inf::field5) in #t37;
- core::Set<inf::C<core::int*>*>* local3f = let final core::Set<inf::C<core::int*>*>* #t40 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t41 = #t40.{core::Set::add}(null) in let final core::bool #t42 = #t40.{core::Set::add}(inf::field6) in #t40;
- core::Set<core::int*>* local3g = let final core::Set<core::int*>* #t43 = col::LinkedHashSet::•<core::int*>() in let final core::bool #t44 = #t43.{core::Set::add}(null) in let final core::bool #t45 = #t43.{core::Set::add}(inf::field7) in #t43;
- core::Set<core::int*>* local3h = let final core::Set<core::int*>* #t46 = col::LinkedHashSet::•<core::int*>() in let final core::bool #t47 = #t46.{core::Set::add}(null) in let final core::bool #t48 = #t46.{core::Set::add}(inf::field8) in #t46;
+ core::Set<inf::C<dynamic>*>* local2a = let final core::Set<inf::C<dynamic>*>* #t1 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>*>() in let final core::bool #t2 = #t1.{core::Set::add}(inf::field1) in let final core::bool #t3 = #t1.{core::Set::add}(null) in #t1;
+ core::Set<inf::C<dynamic>*>* local2b = let final core::Set<inf::C<dynamic>*>* #t4 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>*>() in let final core::bool #t5 = #t4.{core::Set::add}(inf::field2) in let final core::bool #t6 = #t4.{core::Set::add}(null) in #t4;
+ core::Set<inf::C<core::int*>*>* local2c = let final core::Set<inf::C<core::int*>*>* #t7 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t8 = #t7.{core::Set::add}(inf::field3) in let final core::bool #t9 = #t7.{core::Set::add}(null) in #t7;
+ core::Set<inf::C<core::int*>*>* local2d = let final core::Set<inf::C<core::int*>*>* #t10 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t11 = #t10.{core::Set::add}(inf::field4) in let final core::bool #t12 = #t10.{core::Set::add}(null) in #t10;
+ core::Set<inf::C<core::int*>*>* local2e = let final core::Set<inf::C<core::int*>*>* #t13 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t14 = #t13.{core::Set::add}(inf::field5) in let final core::bool #t15 = #t13.{core::Set::add}(null) in #t13;
+ core::Set<inf::C<core::int*>*>* local2f = let final core::Set<inf::C<core::int*>*>* #t16 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t17 = #t16.{core::Set::add}(inf::field6) in let final core::bool #t18 = #t16.{core::Set::add}(null) in #t16;
+ core::Set<core::int*>* local2g = let final core::Set<core::int*>* #t19 = new col::_CompactLinkedHashSet::•<core::int*>() in let final core::bool #t20 = #t19.{core::Set::add}(inf::field7) in let final core::bool #t21 = #t19.{core::Set::add}(null) in #t19;
+ core::Set<core::int*>* local2h = let final core::Set<core::int*>* #t22 = new col::_CompactLinkedHashSet::•<core::int*>() in let final core::bool #t23 = #t22.{core::Set::add}(inf::field8) in let final core::bool #t24 = #t22.{core::Set::add}(null) in #t22;
+ core::Set<inf::C<dynamic>*>* local3a = let final core::Set<inf::C<dynamic>*>* #t25 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>*>() in let final core::bool #t26 = #t25.{core::Set::add}(null) in let final core::bool #t27 = #t25.{core::Set::add}(inf::field1) in #t25;
+ core::Set<inf::C<dynamic>*>* local3b = let final core::Set<inf::C<dynamic>*>* #t28 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>*>() in let final core::bool #t29 = #t28.{core::Set::add}(null) in let final core::bool #t30 = #t28.{core::Set::add}(inf::field2) in #t28;
+ core::Set<inf::C<core::int*>*>* local3c = let final core::Set<inf::C<core::int*>*>* #t31 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t32 = #t31.{core::Set::add}(null) in let final core::bool #t33 = #t31.{core::Set::add}(inf::field3) in #t31;
+ core::Set<inf::C<core::int*>*>* local3d = let final core::Set<inf::C<core::int*>*>* #t34 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t35 = #t34.{core::Set::add}(null) in let final core::bool #t36 = #t34.{core::Set::add}(inf::field4) in #t34;
+ core::Set<inf::C<core::int*>*>* local3e = let final core::Set<inf::C<core::int*>*>* #t37 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t38 = #t37.{core::Set::add}(null) in let final core::bool #t39 = #t37.{core::Set::add}(inf::field5) in #t37;
+ core::Set<inf::C<core::int*>*>* local3f = let final core::Set<inf::C<core::int*>*>* #t40 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t41 = #t40.{core::Set::add}(null) in let final core::bool #t42 = #t40.{core::Set::add}(inf::field6) in #t40;
+ core::Set<core::int*>* local3g = let final core::Set<core::int*>* #t43 = new col::_CompactLinkedHashSet::•<core::int*>() in let final core::bool #t44 = #t43.{core::Set::add}(null) in let final core::bool #t45 = #t43.{core::Set::add}(inf::field7) in #t43;
+ core::Set<core::int*>* local3h = let final core::Set<core::int*>* #t46 = new col::_CompactLinkedHashSet::•<core::int*>() in let final core::bool #t47 = #t46.{core::Set::add}(null) in let final core::bool #t48 = #t46.{core::Set::add}(inf::field8) in #t46;
}
library /*isNonNullableByDefault*/;
@@ -101,20 +101,20 @@
core::List<core::int> local1g = <core::int>[inf::field7];
core::List<core::int?> local1h = <core::int?>[inf::field8];
core::List<core::Null?> local1i = <core::Null?>[null];
- core::Set<inf::C<dynamic>?> local2a = let final core::Set<inf::C<dynamic>?> #t49 = col::LinkedHashSet::•<inf::C<dynamic>?>() in let final core::bool #t50 = #t49.{core::Set::add}(inf::field1) in let final core::bool #t51 = #t49.{core::Set::add}(null) in #t49;
- core::Set<inf::C<dynamic>?> local2b = let final core::Set<inf::C<dynamic>?> #t52 = col::LinkedHashSet::•<inf::C<dynamic>?>() in let final core::bool #t53 = #t52.{core::Set::add}(inf::field2) in let final core::bool #t54 = #t52.{core::Set::add}(null) in #t52;
- core::Set<inf::C<core::int>?> local2c = let final core::Set<inf::C<core::int>?> #t55 = col::LinkedHashSet::•<inf::C<core::int>?>() in let final core::bool #t56 = #t55.{core::Set::add}(inf::field3) in let final core::bool #t57 = #t55.{core::Set::add}(null) in #t55;
- core::Set<inf::C<core::int>?> local2d = let final core::Set<inf::C<core::int>?> #t58 = col::LinkedHashSet::•<inf::C<core::int>?>() in let final core::bool #t59 = #t58.{core::Set::add}(inf::field4) in let final core::bool #t60 = #t58.{core::Set::add}(null) in #t58;
- core::Set<inf::C<core::int?>?> local2e = let final core::Set<inf::C<core::int?>?> #t61 = col::LinkedHashSet::•<inf::C<core::int?>?>() in let final core::bool #t62 = #t61.{core::Set::add}(inf::field5) in let final core::bool #t63 = #t61.{core::Set::add}(null) in #t61;
- core::Set<inf::C<core::int?>?> local2f = let final core::Set<inf::C<core::int?>?> #t64 = col::LinkedHashSet::•<inf::C<core::int?>?>() in let final core::bool #t65 = #t64.{core::Set::add}(inf::field6) in let final core::bool #t66 = #t64.{core::Set::add}(null) in #t64;
- core::Set<core::int?> local2g = let final core::Set<core::int?> #t67 = col::LinkedHashSet::•<core::int?>() in let final core::bool #t68 = #t67.{core::Set::add}(inf::field7) in let final core::bool #t69 = #t67.{core::Set::add}(null) in #t67;
- core::Set<core::int?> local2h = let final core::Set<core::int?> #t70 = col::LinkedHashSet::•<core::int?>() in let final core::bool #t71 = #t70.{core::Set::add}(inf::field8) in let final core::bool #t72 = #t70.{core::Set::add}(null) in #t70;
- core::Set<inf::C<dynamic>?> local3a = let final core::Set<inf::C<dynamic>?> #t73 = col::LinkedHashSet::•<inf::C<dynamic>?>() in let final core::bool #t74 = #t73.{core::Set::add}(null) in let final core::bool #t75 = #t73.{core::Set::add}(inf::field1) in #t73;
- core::Set<inf::C<dynamic>?> local3b = let final core::Set<inf::C<dynamic>?> #t76 = col::LinkedHashSet::•<inf::C<dynamic>?>() in let final core::bool #t77 = #t76.{core::Set::add}(null) in let final core::bool #t78 = #t76.{core::Set::add}(inf::field2) in #t76;
- core::Set<inf::C<core::int>?> local3c = let final core::Set<inf::C<core::int>?> #t79 = col::LinkedHashSet::•<inf::C<core::int>?>() in let final core::bool #t80 = #t79.{core::Set::add}(null) in let final core::bool #t81 = #t79.{core::Set::add}(inf::field3) in #t79;
- core::Set<inf::C<core::int>?> local3d = let final core::Set<inf::C<core::int>?> #t82 = col::LinkedHashSet::•<inf::C<core::int>?>() in let final core::bool #t83 = #t82.{core::Set::add}(null) in let final core::bool #t84 = #t82.{core::Set::add}(inf::field4) in #t82;
- core::Set<inf::C<core::int?>?> local3e = let final core::Set<inf::C<core::int?>?> #t85 = col::LinkedHashSet::•<inf::C<core::int?>?>() in let final core::bool #t86 = #t85.{core::Set::add}(null) in let final core::bool #t87 = #t85.{core::Set::add}(inf::field5) in #t85;
- core::Set<inf::C<core::int?>?> local3f = let final core::Set<inf::C<core::int?>?> #t88 = col::LinkedHashSet::•<inf::C<core::int?>?>() in let final core::bool #t89 = #t88.{core::Set::add}(null) in let final core::bool #t90 = #t88.{core::Set::add}(inf::field6) in #t88;
- core::Set<core::int?> local3g = let final core::Set<core::int?> #t91 = col::LinkedHashSet::•<core::int?>() in let final core::bool #t92 = #t91.{core::Set::add}(null) in let final core::bool #t93 = #t91.{core::Set::add}(inf::field7) in #t91;
- core::Set<core::int?> local3h = let final core::Set<core::int?> #t94 = col::LinkedHashSet::•<core::int?>() in let final core::bool #t95 = #t94.{core::Set::add}(null) in let final core::bool #t96 = #t94.{core::Set::add}(inf::field8) in #t94;
+ core::Set<inf::C<dynamic>?> local2a = let final core::Set<inf::C<dynamic>?> #t49 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>?>() in let final core::bool #t50 = #t49.{core::Set::add}(inf::field1) in let final core::bool #t51 = #t49.{core::Set::add}(null) in #t49;
+ core::Set<inf::C<dynamic>?> local2b = let final core::Set<inf::C<dynamic>?> #t52 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>?>() in let final core::bool #t53 = #t52.{core::Set::add}(inf::field2) in let final core::bool #t54 = #t52.{core::Set::add}(null) in #t52;
+ core::Set<inf::C<core::int>?> local2c = let final core::Set<inf::C<core::int>?> #t55 = new col::_CompactLinkedHashSet::•<inf::C<core::int>?>() in let final core::bool #t56 = #t55.{core::Set::add}(inf::field3) in let final core::bool #t57 = #t55.{core::Set::add}(null) in #t55;
+ core::Set<inf::C<core::int>?> local2d = let final core::Set<inf::C<core::int>?> #t58 = new col::_CompactLinkedHashSet::•<inf::C<core::int>?>() in let final core::bool #t59 = #t58.{core::Set::add}(inf::field4) in let final core::bool #t60 = #t58.{core::Set::add}(null) in #t58;
+ core::Set<inf::C<core::int?>?> local2e = let final core::Set<inf::C<core::int?>?> #t61 = new col::_CompactLinkedHashSet::•<inf::C<core::int?>?>() in let final core::bool #t62 = #t61.{core::Set::add}(inf::field5) in let final core::bool #t63 = #t61.{core::Set::add}(null) in #t61;
+ core::Set<inf::C<core::int?>?> local2f = let final core::Set<inf::C<core::int?>?> #t64 = new col::_CompactLinkedHashSet::•<inf::C<core::int?>?>() in let final core::bool #t65 = #t64.{core::Set::add}(inf::field6) in let final core::bool #t66 = #t64.{core::Set::add}(null) in #t64;
+ core::Set<core::int?> local2g = let final core::Set<core::int?> #t67 = new col::_CompactLinkedHashSet::•<core::int?>() in let final core::bool #t68 = #t67.{core::Set::add}(inf::field7) in let final core::bool #t69 = #t67.{core::Set::add}(null) in #t67;
+ core::Set<core::int?> local2h = let final core::Set<core::int?> #t70 = new col::_CompactLinkedHashSet::•<core::int?>() in let final core::bool #t71 = #t70.{core::Set::add}(inf::field8) in let final core::bool #t72 = #t70.{core::Set::add}(null) in #t70;
+ core::Set<inf::C<dynamic>?> local3a = let final core::Set<inf::C<dynamic>?> #t73 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>?>() in let final core::bool #t74 = #t73.{core::Set::add}(null) in let final core::bool #t75 = #t73.{core::Set::add}(inf::field1) in #t73;
+ core::Set<inf::C<dynamic>?> local3b = let final core::Set<inf::C<dynamic>?> #t76 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>?>() in let final core::bool #t77 = #t76.{core::Set::add}(null) in let final core::bool #t78 = #t76.{core::Set::add}(inf::field2) in #t76;
+ core::Set<inf::C<core::int>?> local3c = let final core::Set<inf::C<core::int>?> #t79 = new col::_CompactLinkedHashSet::•<inf::C<core::int>?>() in let final core::bool #t80 = #t79.{core::Set::add}(null) in let final core::bool #t81 = #t79.{core::Set::add}(inf::field3) in #t79;
+ core::Set<inf::C<core::int>?> local3d = let final core::Set<inf::C<core::int>?> #t82 = new col::_CompactLinkedHashSet::•<inf::C<core::int>?>() in let final core::bool #t83 = #t82.{core::Set::add}(null) in let final core::bool #t84 = #t82.{core::Set::add}(inf::field4) in #t82;
+ core::Set<inf::C<core::int?>?> local3e = let final core::Set<inf::C<core::int?>?> #t85 = new col::_CompactLinkedHashSet::•<inf::C<core::int?>?>() in let final core::bool #t86 = #t85.{core::Set::add}(null) in let final core::bool #t87 = #t85.{core::Set::add}(inf::field5) in #t85;
+ core::Set<inf::C<core::int?>?> local3f = let final core::Set<inf::C<core::int?>?> #t88 = new col::_CompactLinkedHashSet::•<inf::C<core::int?>?>() in let final core::bool #t89 = #t88.{core::Set::add}(null) in let final core::bool #t90 = #t88.{core::Set::add}(inf::field6) in #t88;
+ core::Set<core::int?> local3g = let final core::Set<core::int?> #t91 = new col::_CompactLinkedHashSet::•<core::int?>() in let final core::bool #t92 = #t91.{core::Set::add}(null) in let final core::bool #t93 = #t91.{core::Set::add}(inf::field7) in #t91;
+ core::Set<core::int?> local3h = let final core::Set<core::int?> #t94 = new col::_CompactLinkedHashSet::•<core::int?>() in let final core::bool #t95 = #t94.{core::Set::add}(null) in let final core::bool #t96 = #t94.{core::Set::add}(inf::field8) in #t94;
}
diff --git a/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.transformed.expect
index 8546029..8c241d1 100644
--- a/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.transformed.expect
@@ -34,5 +34,5 @@
}
static method main(dynamic args) → dynamic {
if(false)
- new self::Class::•().{self::Class::method}("", let final core::Set<core::String*>* #t6 = col::LinkedHashSet::•<core::String*>() in #t6);
+ new self::Class::•().{self::Class::method}("", let final core::Set<core::String*>* #t6 = new col::_CompactLinkedHashSet::•<core::String*>() in #t6);
}
diff --git a/pkg/front_end/testcases/regress/issue_42423.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_42423.dart.strong.transformed.expect
index f0a9892..68f6106 100644
--- a/pkg/front_end/testcases/regress/issue_42423.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_42423.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
static method test1(dynamic stringList) → dynamic {
core::Set<core::int*>* intSet = block {
- final core::Set<core::int*>* #t1 = col::LinkedHashSet::•<core::int*>();
+ final core::Set<core::int*>* #t1 = new col::_CompactLinkedHashSet::•<core::int*>();
final core::Iterable<dynamic>* #t2 = stringList as{TypeError,ForDynamic} core::Iterable<dynamic>*;
if(!#t2.{core::Object::==}(null)) {
core::Iterator<dynamic>* :sync-for-iterator = #t2.{core::Iterable::iterator};
diff --git a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.transformed.expect b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.transformed.expect
index c55d845..cc7cfa2 100644
--- a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.transformed.expect
@@ -67,14 +67,14 @@
#L1:
{
core::Map<core::int*, core::bool*>* m = <core::int*, core::bool*>{};
- core::Set<core::int*>* s = let final core::Set<core::int*>* #t1 = col::LinkedHashSet::•<core::int*>() in #t1;
- core::Iterable<core::int*>* i = let final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>() in #t2;
+ core::Set<core::int*>* s = let final core::Set<core::int*>* #t1 = new col::_CompactLinkedHashSet::•<core::int*>() in #t1;
+ core::Iterable<core::int*>* i = let final core::Set<core::int*>* #t2 = new col::_CompactLinkedHashSet::•<core::int*>() in #t2;
col::LinkedHashSet<core::int*>* lhs = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:13:28: Error: The set literal type 'Set<dynamic>' isn't of expected type 'LinkedHashSet<int>'.
- 'Set' is from 'dart:core'.
- 'LinkedHashSet' is from 'dart:collection'.
Change the type of the set literal or the context in which it is used.
LinkedHashSet<int> lhs = {};
- ^" in let final core::Set<dynamic>* #t4 = col::LinkedHashSet::•<dynamic>() in #t4;
+ ^" in let final core::Set<dynamic>* #t4 = new col::_CompactLinkedHashSet::•<dynamic>() in #t4;
col::LinkedHashMap<core::int*, core::bool*>* lhm = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:14:34: Error: The map literal type 'Map<dynamic, dynamic>' isn't of expected type 'LinkedHashMap<int, bool>'.
- 'Map' is from 'dart:core'.
- 'LinkedHashMap' is from 'dart:collection'.
@@ -153,7 +153,7 @@
try {
#L3:
{
- :return_value = let final core::Set<core::int*>* #t16 = col::LinkedHashSet::•<core::int*>() in #t16;
+ :return_value = let final core::Set<core::int*>* #t16 = new col::_CompactLinkedHashSet::•<core::int*>() in #t16;
break #L3;
}
asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -180,7 +180,7 @@
try {
#L4:
{
- :return_value = let final core::Set<core::int*>* #t17 = col::LinkedHashSet::•<core::int*>() in #t17;
+ :return_value = let final core::Set<core::int*>* #t17 = new col::_CompactLinkedHashSet::•<core::int*>() in #t17;
break #L4;
}
asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -213,7 +213,7 @@
- 'LinkedHashSet' is from 'dart:collection'.
Change the type of the set literal or the context in which it is used.
Future<LinkedHashSet<int>> lhsfun() async => {};
- ^" in let final core::Set<dynamic>* #t19 = col::LinkedHashSet::•<dynamic>() in #t19;
+ ^" in let final core::Set<dynamic>* #t19 = new col::_CompactLinkedHashSet::•<dynamic>() in #t19;
break #L5;
}
asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -264,15 +264,15 @@
static method mapfun2() → FutureOr<core::Map<core::int*, core::bool*>*>*
return <core::int*, core::bool*>{};
static method setfun2() → FutureOr<core::Set<core::int*>*>*
- return let final core::Set<core::int*>* #t21 = col::LinkedHashSet::•<core::int*>() in #t21;
+ return let final core::Set<core::int*>* #t21 = new col::_CompactLinkedHashSet::•<core::int*>() in #t21;
static method iterablefun2() → FutureOr<core::Iterable<core::int*>*>*
- return let final core::Set<core::int*>* #t22 = col::LinkedHashSet::•<core::int*>() in #t22;
+ return let final core::Set<core::int*>* #t22 = new col::_CompactLinkedHashSet::•<core::int*>() in #t22;
static method lhsfun2() → FutureOr<col::LinkedHashSet<core::int*>*>*
return let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:38:43: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'FutureOr<LinkedHashSet<int>>'.
- 'Set' is from 'dart:core'.
- 'LinkedHashSet' is from 'dart:collection'.
FutureOr<LinkedHashSet<int>> lhsfun2() => {};
- ^" in (let final core::Set<dynamic>* #t24 = col::LinkedHashSet::•<dynamic>() in #t24) as{TypeError} FutureOr<col::LinkedHashSet<core::int*>*>*;
+ ^" in (let final core::Set<dynamic>* #t24 = new col::_CompactLinkedHashSet::•<dynamic>() in #t24) as{TypeError} FutureOr<col::LinkedHashSet<core::int*>*>*;
static method lhmfun2() → FutureOr<col::LinkedHashMap<core::int*, core::bool*>*>*
return let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:39:49: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'FutureOr<LinkedHashMap<int, bool>>'.
- 'Map' is from 'dart:core'.
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index b1ab8a2..5fb1d61 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -252,3 +252,5 @@
runtime_checks_new/mixin_forwarding_stub_getter: TypeCheckError
runtime_checks_new/mixin_forwarding_stub_setter: TypeCheckError
set_literals/disambiguation_rule: RuntimeError
+value_class/simple: RuntimeError # Expected
+value_class/super_type: RuntimeError # Expected
\ No newline at end of file
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index b1c53c0..ef32a53 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -249,3 +249,6 @@
runtime_checks_new/mixin_forwarding_stub_field: TypeCheckError
runtime_checks_new/mixin_forwarding_stub_setter: TypeCheckError
set_literals/disambiguation_rule: RuntimeError
+value_class/simple: RuntimeError # Expected
+value_class/super_type: RuntimeError # Expected
+
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart b/pkg/front_end/testcases/value_class/empty.dart
similarity index 100%
rename from pkg/front_end/testcases/nnbd/value_classes/empty_test.dart
rename to pkg/front_end/testcases/value_class/empty.dart
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.outline.expect b/pkg/front_end/testcases/value_class/empty.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.outline.expect
rename to pkg/front_end/testcases/value_class/empty.dart.outline.expect
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.strong.expect b/pkg/front_end/testcases/value_class/empty.dart.strong.expect
similarity index 100%
rename from pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.strong.expect
rename to pkg/front_end/testcases/value_class/empty.dart.strong.expect
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/empty.dart.strong.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.strong.transformed.expect
rename to pkg/front_end/testcases/value_class/empty.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.weak.expect b/pkg/front_end/testcases/value_class/empty.dart.weak.expect
similarity index 100%
rename from pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.weak.expect
rename to pkg/front_end/testcases/value_class/empty.dart.weak.expect
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/empty.dart.weak.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.weak.transformed.expect
rename to pkg/front_end/testcases/value_class/empty.dart.weak.transformed.expect
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart b/pkg/front_end/testcases/value_class/explicit_mixin.dart
similarity index 71%
rename from pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart
rename to pkg/front_end/testcases/value_class/explicit_mixin.dart
index 2cc85fc..5dadbc8 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart
@@ -4,11 +4,17 @@
const String valueClass = "valueClass";
-class Animal {
- final int numLegs = 4;
-}
+@valueClass
+class A {}
+
+class B {}
+
+class C {}
+
+class D = A with B;
+class E = B with A;
@valueClass
-class Cat extends Animal {}
+class F = B with C;
main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/value_class/explicit_mixin.dart.outline.expect b/pkg/front_end/testcases/value_class/explicit_mixin.dart.outline.expect
new file mode 100644
index 0000000..0299405
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart.outline.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@self::valueClass
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ ;
+}
+class B extends core::Object {
+ synthetic constructor •() → self::B
+ ;
+}
+class C extends core::Object {
+ synthetic constructor •() → self::C
+ ;
+}
+class D = self::A with self::B {
+ synthetic constructor •() → self::D
+ : super self::A::•()
+ ;
+}
+class E = self::B with self::A {
+ synthetic constructor •() → self::E
+ : super self::B::•()
+ ;
+}
+@self::valueClass
+class F = self::B with self::C {
+ synthetic constructor •() → self::F
+ : super self::B::•()
+ ;
+}
+static const field core::String valueClass = "valueClass";
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.expect b/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.expect
new file mode 100644
index 0000000..34ca526
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ : super core::Object::•()
+ ;
+}
+class B extends core::Object {
+ synthetic constructor •() → self::B
+ : super core::Object::•()
+ ;
+}
+class C extends core::Object {
+ synthetic constructor •() → self::C
+ : super core::Object::•()
+ ;
+}
+class D = self::A with self::B {
+ synthetic constructor •() → self::D
+ : super self::A::•()
+ ;
+}
+class E = self::B with self::A {
+ synthetic constructor •() → self::E
+ : super self::B::•()
+ ;
+}
+@#C1
+class F = self::B with self::C {
+ synthetic constructor •() → self::F
+ : super self::B::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.transformed.expect
new file mode 100644
index 0000000..b6394fb
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.transformed.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ : super core::Object::•()
+ ;
+}
+class B extends core::Object {
+ synthetic constructor •() → self::B
+ : super core::Object::•()
+ ;
+}
+class C extends core::Object {
+ synthetic constructor •() → self::C
+ : super core::Object::•()
+ ;
+}
+class D extends self::A implements self::B /*isEliminatedMixin*/ {
+ synthetic constructor •() → self::D
+ : super self::A::•()
+ ;
+}
+class E extends self::B implements self::A /*isEliminatedMixin*/ {
+ synthetic constructor •() → self::E
+ : super self::B::•()
+ ;
+}
+@#C1
+class F extends self::B implements self::C /*isEliminatedMixin*/ {
+ synthetic constructor •() → self::F
+ : super self::B::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.expect b/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.expect
new file mode 100644
index 0000000..34ca526
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ : super core::Object::•()
+ ;
+}
+class B extends core::Object {
+ synthetic constructor •() → self::B
+ : super core::Object::•()
+ ;
+}
+class C extends core::Object {
+ synthetic constructor •() → self::C
+ : super core::Object::•()
+ ;
+}
+class D = self::A with self::B {
+ synthetic constructor •() → self::D
+ : super self::A::•()
+ ;
+}
+class E = self::B with self::A {
+ synthetic constructor •() → self::E
+ : super self::B::•()
+ ;
+}
+@#C1
+class F = self::B with self::C {
+ synthetic constructor •() → self::F
+ : super self::B::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.transformed.expect
new file mode 100644
index 0000000..b6394fb
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.transformed.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ : super core::Object::•()
+ ;
+}
+class B extends core::Object {
+ synthetic constructor •() → self::B
+ : super core::Object::•()
+ ;
+}
+class C extends core::Object {
+ synthetic constructor •() → self::C
+ : super core::Object::•()
+ ;
+}
+class D extends self::A implements self::B /*isEliminatedMixin*/ {
+ synthetic constructor •() → self::D
+ : super self::A::•()
+ ;
+}
+class E extends self::B implements self::A /*isEliminatedMixin*/ {
+ synthetic constructor •() → self::E
+ : super self::B::•()
+ ;
+}
+@#C1
+class F extends self::B implements self::C /*isEliminatedMixin*/ {
+ synthetic constructor •() → self::F
+ : super self::B::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart b/pkg/front_end/testcases/value_class/non_final_field_error.dart
similarity index 94%
rename from pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart
rename to pkg/front_end/testcases/value_class/non_final_field_error.dart
index 6c9da9d..1cb241b 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart
@@ -6,7 +6,7 @@
@valueClass
class Animal {
- int? numLegs;
+ int numLegs;
}
main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.outline.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.outline.expect
similarity index 90%
rename from pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.outline.expect
rename to pkg/front_end/testcases/value_class/non_final_field_error.dart.outline.expect
index 4353f25..0576b95 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart.outline.expect
@@ -4,7 +4,7 @@
@self::valueClass
class Animal extends core::Object {
- field core::int? numLegs;
+ field core::int numLegs;
synthetic constructor •() → self::Animal
;
}
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.expect
new file mode 100644
index 0000000..c424f4f
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_final_field_error.dart:9:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
+// int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.transformed.expect
new file mode 100644
index 0000000..c424f4f
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.transformed.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_final_field_error.dart:9:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
+// int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.expect
new file mode 100644
index 0000000..c424f4f
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_final_field_error.dart:9:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
+// int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.transformed.expect
new file mode 100644
index 0000000..c424f4f
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.transformed.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_final_field_error.dart:9:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
+// int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart
similarity index 93%
rename from pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart
rename to pkg/front_end/testcases/value_class/non_value_extends_value_error.dart
index 79b694c..00d89f6 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart
@@ -4,11 +4,11 @@
const String valueClass = "valueClass";
+@valueClass
class Animal {
- int numLegs = 4;
+ final int numLegs;
}
-@valueClass
class Cat extends Animal {}
main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.outline.expect b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.outline.expect
rename to pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.outline.expect
diff --git a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.expect b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.expect
new file mode 100644
index 0000000..257657f
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_value_extends_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+class Cat extends self::Animal {
+ synthetic constructor •() → self::Cat
+ : super self::Animal::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.transformed.expect
new file mode 100644
index 0000000..257657f
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.transformed.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_value_extends_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+class Cat extends self::Animal {
+ synthetic constructor •() → self::Cat
+ : super self::Animal::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.expect b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.expect
new file mode 100644
index 0000000..257657f
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_value_extends_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+class Cat extends self::Animal {
+ synthetic constructor •() → self::Cat
+ : super self::Animal::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.transformed.expect
new file mode 100644
index 0000000..257657f
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.transformed.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_value_extends_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+class Cat extends self::Animal {
+ synthetic constructor •() → self::Cat
+ : super self::Animal::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart
similarity index 87%
copy from pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart
copy to pkg/front_end/testcases/value_class/non_value_implements_value_error.dart
index 3800fa1..ee4bd91 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart
@@ -6,11 +6,11 @@
@valueClass
class Animal {
- final int numLegs = 4;
+ final int numLegs;
}
class Cat implements Animal {
- int numLegs = 4;
+ final int numLegs;
}
main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.outline.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.outline.expect
similarity index 92%
rename from pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.outline.expect
rename to pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.outline.expect
index 6303c33..1b24fca 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.outline.expect
@@ -9,7 +9,7 @@
;
}
class Cat extends core::Object implements self::Animal {
- field core::int numLegs;
+ final field core::int numLegs;
synthetic constructor •() → self::Cat
;
}
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.expect
new file mode 100644
index 0000000..a2359d2
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+class Cat extends core::Object implements self::Animal {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.transformed.expect
new file mode 100644
index 0000000..a2359d2
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.transformed.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+class Cat extends core::Object implements self::Animal {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.expect
new file mode 100644
index 0000000..a2359d2
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+class Cat extends core::Object implements self::Animal {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.transformed.expect
new file mode 100644
index 0000000..a2359d2
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.transformed.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+class Cat extends core::Object implements self::Animal {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/simple.dart b/pkg/front_end/testcases/value_class/simple.dart
new file mode 100644
index 0000000..e781016
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/simple.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2020, 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.
+
+const String valueClass = "valueClass";
+
+@valueClass
+class Animal {
+ final int numLegs;
+}
+
+main() {
+ Animal firstAnimal = Animal(numLegs: 4);
+ Animal secondAnimal = Animal(numLegs: 4);
+ Animal thirdAnimal = Animal(numLegs: 3);
+
+ expect(true, firstAnimal == secondAnimal);
+ expect(false, firstAnimal == thirdAnimal);
+
+ expect(true, firstAnimal.hashCode == secondAnimal.hashCode);
+ expect(false, firstAnimal.hashCode == thirdAnimal.hashCode);
+}
+
+expect(expected, actual, [expectNull = false]) {
+ if (expectNull) {
+ expected = null;
+ }
+ if (expected != actual) {
+ throw 'Mismatch: expected=$expected, actual=$actual';
+ }
+}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.outline.expect b/pkg/front_end/testcases/value_class/simple.dart.outline.expect
similarity index 77%
rename from pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.outline.expect
rename to pkg/front_end/testcases/value_class/simple.dart.outline.expect
index e16fd84..03509b9 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/simple.dart.outline.expect
@@ -11,3 +11,5 @@
static const field core::String valueClass = "valueClass";
static method main() → dynamic
;
+static method expect(dynamic expected, dynamic actual, [dynamic expectNull]) → dynamic
+ ;
diff --git a/pkg/front_end/testcases/value_class/simple.dart.strong.expect b/pkg/front_end/testcases/value_class/simple.dart.strong.expect
new file mode 100644
index 0000000..09bd934
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/simple.dart.strong.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
+// Animal firstAnimal = Animal(numLegs: 4);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
+// Animal secondAnimal = Animal(numLegs: 4);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
+// Animal thirdAnimal = Animal(numLegs: 3);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {
+ self::Animal firstAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
+ Animal firstAnimal = Animal(numLegs: 4);
+ ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
+ self::Animal secondAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
+ Animal secondAnimal = Animal(numLegs: 4);
+ ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
+ self::Animal thirdAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
+ Animal thirdAnimal = Animal(numLegs: 3);
+ ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
+ self::expect(true, firstAnimal.{core::Object::==}(secondAnimal));
+ self::expect(false, firstAnimal.{core::Object::==}(thirdAnimal));
+ self::expect(true, firstAnimal.{core::Object::hashCode}.{core::num::==}(secondAnimal.{core::Object::hashCode}));
+ self::expect(false, firstAnimal.{core::Object::hashCode}.{core::num::==}(thirdAnimal.{core::Object::hashCode}));
+}
+static method expect(dynamic expected, dynamic actual, [dynamic expectNull = #C2]) → dynamic {
+ if(expectNull as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+ expected = null;
+ }
+ if(!expected.{core::Object::==}(actual)) {
+ throw "Mismatch: expected=${expected}, actual=${actual}";
+ }
+}
+
+constants {
+ #C1 = "valueClass"
+ #C2 = false
+}
diff --git a/pkg/front_end/testcases/value_class/simple.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/simple.dart.strong.transformed.expect
new file mode 100644
index 0000000..535162a
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/simple.dart.strong.transformed.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
+// Animal firstAnimal = Animal(numLegs: 4);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
+// Animal secondAnimal = Animal(numLegs: 4);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
+// Animal thirdAnimal = Animal(numLegs: 3);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {
+ self::Animal firstAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
+ Animal firstAnimal = Animal(numLegs: 4);
+ ^^^^^^^";
+ self::Animal secondAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
+ Animal secondAnimal = Animal(numLegs: 4);
+ ^^^^^^^";
+ self::Animal thirdAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
+ Animal thirdAnimal = Animal(numLegs: 3);
+ ^^^^^^^";
+ self::expect(true, firstAnimal.{core::Object::==}(secondAnimal));
+ self::expect(false, firstAnimal.{core::Object::==}(thirdAnimal));
+ self::expect(true, firstAnimal.{core::Object::hashCode}.{core::num::==}(secondAnimal.{core::Object::hashCode}));
+ self::expect(false, firstAnimal.{core::Object::hashCode}.{core::num::==}(thirdAnimal.{core::Object::hashCode}));
+}
+static method expect(dynamic expected, dynamic actual, [dynamic expectNull = #C2]) → dynamic {
+ if(expectNull as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+ expected = null;
+ }
+ if(!expected.{core::Object::==}(actual)) {
+ throw "Mismatch: expected=${expected}, actual=${actual}";
+ }
+}
+
+constants {
+ #C1 = "valueClass"
+ #C2 = false
+}
diff --git a/pkg/front_end/testcases/value_class/simple.dart.weak.expect b/pkg/front_end/testcases/value_class/simple.dart.weak.expect
new file mode 100644
index 0000000..09bd934
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/simple.dart.weak.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
+// Animal firstAnimal = Animal(numLegs: 4);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
+// Animal secondAnimal = Animal(numLegs: 4);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
+// Animal thirdAnimal = Animal(numLegs: 3);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {
+ self::Animal firstAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
+ Animal firstAnimal = Animal(numLegs: 4);
+ ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
+ self::Animal secondAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
+ Animal secondAnimal = Animal(numLegs: 4);
+ ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
+ self::Animal thirdAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
+ Animal thirdAnimal = Animal(numLegs: 3);
+ ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
+ self::expect(true, firstAnimal.{core::Object::==}(secondAnimal));
+ self::expect(false, firstAnimal.{core::Object::==}(thirdAnimal));
+ self::expect(true, firstAnimal.{core::Object::hashCode}.{core::num::==}(secondAnimal.{core::Object::hashCode}));
+ self::expect(false, firstAnimal.{core::Object::hashCode}.{core::num::==}(thirdAnimal.{core::Object::hashCode}));
+}
+static method expect(dynamic expected, dynamic actual, [dynamic expectNull = #C2]) → dynamic {
+ if(expectNull as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+ expected = null;
+ }
+ if(!expected.{core::Object::==}(actual)) {
+ throw "Mismatch: expected=${expected}, actual=${actual}";
+ }
+}
+
+constants {
+ #C1 = "valueClass"
+ #C2 = false
+}
diff --git a/pkg/front_end/testcases/value_class/simple.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/simple.dart.weak.transformed.expect
new file mode 100644
index 0000000..535162a
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/simple.dart.weak.transformed.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
+// Animal firstAnimal = Animal(numLegs: 4);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
+// Animal secondAnimal = Animal(numLegs: 4);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
+// Animal thirdAnimal = Animal(numLegs: 3);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {
+ self::Animal firstAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
+ Animal firstAnimal = Animal(numLegs: 4);
+ ^^^^^^^";
+ self::Animal secondAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
+ Animal secondAnimal = Animal(numLegs: 4);
+ ^^^^^^^";
+ self::Animal thirdAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
+ Animal thirdAnimal = Animal(numLegs: 3);
+ ^^^^^^^";
+ self::expect(true, firstAnimal.{core::Object::==}(secondAnimal));
+ self::expect(false, firstAnimal.{core::Object::==}(thirdAnimal));
+ self::expect(true, firstAnimal.{core::Object::hashCode}.{core::num::==}(secondAnimal.{core::Object::hashCode}));
+ self::expect(false, firstAnimal.{core::Object::hashCode}.{core::num::==}(thirdAnimal.{core::Object::hashCode}));
+}
+static method expect(dynamic expected, dynamic actual, [dynamic expectNull = #C2]) → dynamic {
+ if(expectNull as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+ expected = null;
+ }
+ if(!expected.{core::Object::==}(actual)) {
+ throw "Mismatch: expected=${expected}, actual=${actual}";
+ }
+}
+
+constants {
+ #C1 = "valueClass"
+ #C2 = false
+}
diff --git a/pkg/front_end/testcases/value_class/super_type.dart b/pkg/front_end/testcases/value_class/super_type.dart
new file mode 100644
index 0000000..4182161
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/super_type.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2020, 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.
+
+const String valueClass = "valueClass";
+
+@valueClass
+class Animal {
+ final int numLegs;
+}
+
+@valueClass
+class Cat implements Animal {
+ final int numLegs;
+ final int numWhiskers;
+}
+
+main() {
+ Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
+ Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
+ Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
+
+ expect(true, firstCat == secondCat);
+ expect(false, firstCat == thirdCat);
+
+ expect(true, firstCat.hashCode == secondCat.hashCode);
+ expect(false, firstCat.hashCode == thirdCat.hashCode);
+}
+
+expect(expected, actual, [expectNull = false]) {
+ if (expectNull) {
+ expected = null;
+ }
+ if (expected != actual) {
+ throw 'Mismatch: expected=$expected, actual=$actual';
+ }
+}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.outline.expect b/pkg/front_end/testcases/value_class/super_type.dart.outline.expect
similarity index 84%
rename from pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.outline.expect
rename to pkg/front_end/testcases/value_class/super_type.dart.outline.expect
index 72f354d..1f378c2 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/super_type.dart.outline.expect
@@ -18,3 +18,5 @@
static const field core::String valueClass = "valueClass";
static method main() → dynamic
;
+static method expect(dynamic expected, dynamic actual, [dynamic expectNull]) → dynamic
+ ;
diff --git a/pkg/front_end/testcases/value_class/super_type.dart.strong.expect b/pkg/front_end/testcases/value_class/super_type.dart.strong.expect
new file mode 100644
index 0000000..ed5ed73
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/super_type.dart.strong.expect
@@ -0,0 +1,87 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
+// Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
+// Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
+// Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:14:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:15:13: Error: Final field 'numWhiskers' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numWhiskers;
+// ^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+ final field core::int numLegs = null;
+ final field core::int numWhiskers = null;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {
+ self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
+ Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
+ ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
+ self::Cat secondCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
+ Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
+ ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
+ self::Cat thirdCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
+ Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
+ ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
+ self::expect(true, firstCat.{core::Object::==}(secondCat));
+ self::expect(false, firstCat.{core::Object::==}(thirdCat));
+ self::expect(true, firstCat.{core::Object::hashCode}.{core::num::==}(secondCat.{core::Object::hashCode}));
+ self::expect(false, firstCat.{core::Object::hashCode}.{core::num::==}(thirdCat.{core::Object::hashCode}));
+}
+static method expect(dynamic expected, dynamic actual, [dynamic expectNull = #C2]) → dynamic {
+ if(expectNull as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+ expected = null;
+ }
+ if(!expected.{core::Object::==}(actual)) {
+ throw "Mismatch: expected=${expected}, actual=${actual}";
+ }
+}
+
+constants {
+ #C1 = "valueClass"
+ #C2 = false
+}
diff --git a/pkg/front_end/testcases/value_class/super_type.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/super_type.dart.strong.transformed.expect
new file mode 100644
index 0000000..b21e4ae
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/super_type.dart.strong.transformed.expect
@@ -0,0 +1,87 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
+// Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
+// Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
+// Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:14:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:15:13: Error: Final field 'numWhiskers' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numWhiskers;
+// ^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+ final field core::int numLegs = null;
+ final field core::int numWhiskers = null;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {
+ self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
+ Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
+ ^^^^^^^";
+ self::Cat secondCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
+ Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
+ ^^^^^^^";
+ self::Cat thirdCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
+ Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
+ ^^^^^^^";
+ self::expect(true, firstCat.{core::Object::==}(secondCat));
+ self::expect(false, firstCat.{core::Object::==}(thirdCat));
+ self::expect(true, firstCat.{core::Object::hashCode}.{core::num::==}(secondCat.{core::Object::hashCode}));
+ self::expect(false, firstCat.{core::Object::hashCode}.{core::num::==}(thirdCat.{core::Object::hashCode}));
+}
+static method expect(dynamic expected, dynamic actual, [dynamic expectNull = #C2]) → dynamic {
+ if(expectNull as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+ expected = null;
+ }
+ if(!expected.{core::Object::==}(actual)) {
+ throw "Mismatch: expected=${expected}, actual=${actual}";
+ }
+}
+
+constants {
+ #C1 = "valueClass"
+ #C2 = false
+}
diff --git a/pkg/front_end/testcases/value_class/super_type.dart.weak.expect b/pkg/front_end/testcases/value_class/super_type.dart.weak.expect
new file mode 100644
index 0000000..ed5ed73
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/super_type.dart.weak.expect
@@ -0,0 +1,87 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
+// Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
+// Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
+// Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:14:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:15:13: Error: Final field 'numWhiskers' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numWhiskers;
+// ^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+ final field core::int numLegs = null;
+ final field core::int numWhiskers = null;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {
+ self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
+ Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
+ ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
+ self::Cat secondCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
+ Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
+ ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
+ self::Cat thirdCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
+ Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
+ ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
+ self::expect(true, firstCat.{core::Object::==}(secondCat));
+ self::expect(false, firstCat.{core::Object::==}(thirdCat));
+ self::expect(true, firstCat.{core::Object::hashCode}.{core::num::==}(secondCat.{core::Object::hashCode}));
+ self::expect(false, firstCat.{core::Object::hashCode}.{core::num::==}(thirdCat.{core::Object::hashCode}));
+}
+static method expect(dynamic expected, dynamic actual, [dynamic expectNull = #C2]) → dynamic {
+ if(expectNull as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+ expected = null;
+ }
+ if(!expected.{core::Object::==}(actual)) {
+ throw "Mismatch: expected=${expected}, actual=${actual}";
+ }
+}
+
+constants {
+ #C1 = "valueClass"
+ #C2 = false
+}
diff --git a/pkg/front_end/testcases/value_class/super_type.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/super_type.dart.weak.transformed.expect
new file mode 100644
index 0000000..b21e4ae
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/super_type.dart.weak.transformed.expect
@@ -0,0 +1,87 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
+// Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
+// Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
+// Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
+// ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+// ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:14:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:15:13: Error: Final field 'numWhiskers' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numWhiskers;
+// ^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+ final field core::int numLegs = null;
+ final field core::int numWhiskers = null;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {
+ self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
+ Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
+ ^^^^^^^";
+ self::Cat secondCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
+ Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
+ ^^^^^^^";
+ self::Cat thirdCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
+ Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
+ ^^^^^^^";
+ self::expect(true, firstCat.{core::Object::==}(secondCat));
+ self::expect(false, firstCat.{core::Object::==}(thirdCat));
+ self::expect(true, firstCat.{core::Object::hashCode}.{core::num::==}(secondCat.{core::Object::hashCode}));
+ self::expect(false, firstCat.{core::Object::hashCode}.{core::num::==}(thirdCat.{core::Object::hashCode}));
+}
+static method expect(dynamic expected, dynamic actual, [dynamic expectNull = #C2]) → dynamic {
+ if(expectNull as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+ expected = null;
+ }
+ if(!expected.{core::Object::==}(actual)) {
+ throw "Mismatch: expected=${expected}, actual=${actual}";
+ }
+}
+
+constants {
+ #C1 = "valueClass"
+ #C2 = false
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/test.options b/pkg/front_end/testcases/value_class/test.options
similarity index 97%
rename from pkg/front_end/testcases/nnbd/value_classes/test.options
rename to pkg/front_end/testcases/value_class/test.options
index 81953a10..65e072c 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/test.options
+++ b/pkg/front_end/testcases/value_class/test.options
@@ -1 +1 @@
---enable-experiment=non-nullable,value-class
+--enable-experiment=non-nullable,value-class
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart b/pkg/front_end/testcases/value_class/value_extends_non_value.dart
similarity index 93%
copy from pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart
copy to pkg/front_end/testcases/value_class/value_extends_non_value.dart
index 79b694c..96bbf65 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart
@@ -5,7 +5,7 @@
const String valueClass = "valueClass";
class Animal {
- int numLegs = 4;
+ final int numLegs;
}
@valueClass
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.outline.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.outline.expect
rename to pkg/front_end/testcases/value_class/value_extends_non_value.dart.outline.expect
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.expect
new file mode 100644
index 0000000..a196b35
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_extends_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends self::Animal {
+ synthetic constructor •() → self::Cat
+ : super self::Animal::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.transformed.expect
new file mode 100644
index 0000000..a196b35
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.transformed.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_extends_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends self::Animal {
+ synthetic constructor •() → self::Cat
+ : super self::Animal::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.expect
new file mode 100644
index 0000000..a196b35
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_extends_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends self::Animal {
+ synthetic constructor •() → self::Cat
+ : super self::Animal::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.transformed.expect
new file mode 100644
index 0000000..a196b35
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.transformed.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_extends_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends self::Animal {
+ synthetic constructor •() → self::Cat
+ : super self::Animal::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart
similarity index 93%
copy from pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart
copy to pkg/front_end/testcases/value_class/value_extends_non_value_error.dart
index 79b694c..bb077de 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart
@@ -5,7 +5,7 @@
const String valueClass = "valueClass";
class Animal {
- int numLegs = 4;
+ int numLegs;
}
@valueClass
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.outline.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.outline.expect
rename to pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.outline.expect
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.expect
similarity index 62%
rename from pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect
rename to pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.expect
index 7e25746..e0188c9 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.expect
@@ -1,9 +1,16 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_extends_non_value_error.dart:8:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
+// int numLegs;
+// ^^^^^^^
+//
import self as self;
import "dart:core" as core;
class Animal extends core::Object {
- final field core::int numLegs = 4;
+ field core::int numLegs = null;
synthetic constructor •() → self::Animal
: super core::Object::•()
;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.transformed.expect
similarity index 62%
copy from pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect
copy to pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.transformed.expect
index 7e25746..e0188c9 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.transformed.expect
@@ -1,9 +1,16 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_extends_non_value_error.dart:8:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
+// int numLegs;
+// ^^^^^^^
+//
import self as self;
import "dart:core" as core;
class Animal extends core::Object {
- final field core::int numLegs = 4;
+ field core::int numLegs = null;
synthetic constructor •() → self::Animal
: super core::Object::•()
;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.expect
similarity index 62%
copy from pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect
copy to pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.expect
index 7e25746..e0188c9 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.expect
@@ -1,9 +1,16 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_extends_non_value_error.dart:8:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
+// int numLegs;
+// ^^^^^^^
+//
import self as self;
import "dart:core" as core;
class Animal extends core::Object {
- final field core::int numLegs = 4;
+ field core::int numLegs = null;
synthetic constructor •() → self::Animal
: super core::Object::•()
;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.transformed.expect
similarity index 62%
copy from pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect
copy to pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.transformed.expect
index 7e25746..e0188c9 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.transformed.expect
@@ -1,9 +1,16 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_extends_non_value_error.dart:8:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
+// int numLegs;
+// ^^^^^^^
+//
import self as self;
import "dart:core" as core;
class Animal extends core::Object {
- final field core::int numLegs = 4;
+ field core::int numLegs = null;
synthetic constructor •() → self::Animal
: super core::Object::•()
;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart b/pkg/front_end/testcases/value_class/value_implements_non_value.dart
similarity index 87%
rename from pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart
rename to pkg/front_end/testcases/value_class/value_implements_non_value.dart
index 3800fa1..cf2c4b0 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart
@@ -4,13 +4,13 @@
const String valueClass = "valueClass";
-@valueClass
class Animal {
- final int numLegs = 4;
+ final int numLegs;
}
+@valueClass
class Cat implements Animal {
- int numLegs = 4;
+ final int numLegs;
}
main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.outline.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.outline.expect
rename to pkg/front_end/testcases/value_class/value_implements_non_value.dart.outline.expect
diff --git a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.expect
new file mode 100644
index 0000000..549053c
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.transformed.expect
new file mode 100644
index 0000000..549053c
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.transformed.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.expect
new file mode 100644
index 0000000..549053c
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.transformed.expect
new file mode 100644
index 0000000..549053c
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.transformed.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int numLegs;
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+ final field core::int numLegs = null;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart b/pkg/front_end/testcases/value_class/value_mixin_error.dart
similarity index 65%
rename from pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart
rename to pkg/front_end/testcases/value_class/value_mixin_error.dart
index d57a05b..22c8a1f 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart
@@ -5,14 +5,11 @@
const String valueClass = "valueClass";
@valueClass
-class Animal {
- final int numLegs = 4;
-}
+class A {}
-@valueClass
-class Cat implements Animal {
- final int numLegs = 4;
- final int numWhiskers = 4;
-}
+class B {}
+
+class C extends B with A {} // error, value class as mixin
+class C extends A with B {} // error, C extends a value class
main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.outline.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.outline.expect
new file mode 100644
index 0000000..a5b1239
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart.outline.expect
@@ -0,0 +1,44 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_mixin_error.dart:13:7: Error: 'C' is already declared in this scope.
+// class C extends A with B {} // error, C extends a value class
+// ^
+// pkg/front_end/testcases/value_class/value_mixin_error.dart:12:7: Context: Previous declaration of 'C'.
+// class C extends B with A {} // error, value class as mixin
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+@self::valueClass
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ ;
+}
+class B extends core::Object {
+ synthetic constructor •() → self::B
+ ;
+}
+abstract class _C&B&A = self::B with self::A /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_C&B&A
+ : super self::B::•()
+ ;
+}
+class C#1 extends self::_C&A&B {
+ synthetic constructor •() → self::C#1
+ ;
+}
+class C extends self::_C&B&A {
+ synthetic constructor •() → self::C
+ ;
+}
+abstract class _C&A&B = self::A with self::B /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_C&A&B
+ : super self::A::•()
+ ;
+}
+static const field core::String valueClass = "valueClass";
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.expect
new file mode 100644
index 0000000..46047b4
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.expect
@@ -0,0 +1,51 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_mixin_error.dart:13:7: Error: 'C' is already declared in this scope.
+// class C extends A with B {} // error, C extends a value class
+// ^
+// pkg/front_end/testcases/value_class/value_mixin_error.dart:12:7: Context: Previous declaration of 'C'.
+// class C extends B with A {} // error, value class as mixin
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ : super core::Object::•()
+ ;
+}
+class B extends core::Object {
+ synthetic constructor •() → self::B
+ : super core::Object::•()
+ ;
+}
+abstract class _C&B&A = self::B with self::A /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_C&B&A
+ : super self::B::•()
+ ;
+}
+class C#1 extends self::_C&A&B {
+ synthetic constructor •() → self::C#1
+ : super self::_C&A&B::•()
+ ;
+}
+class C extends self::_C&B&A {
+ synthetic constructor •() → self::C
+ : super self::_C&B&A::•()
+ ;
+}
+abstract class _C&A&B = self::A with self::B /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_C&A&B
+ : super self::A::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.transformed.expect
new file mode 100644
index 0000000..0a9c8b9
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.transformed.expect
@@ -0,0 +1,51 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_mixin_error.dart:13:7: Error: 'C' is already declared in this scope.
+// class C extends A with B {} // error, C extends a value class
+// ^
+// pkg/front_end/testcases/value_class/value_mixin_error.dart:12:7: Context: Previous declaration of 'C'.
+// class C extends B with A {} // error, value class as mixin
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ : super core::Object::•()
+ ;
+}
+class B extends core::Object {
+ synthetic constructor •() → self::B
+ : super core::Object::•()
+ ;
+}
+abstract class _C&B&A extends self::B implements self::A /*isAnonymousMixin,isEliminatedMixin*/ {
+ synthetic constructor •() → self::_C&B&A
+ : super self::B::•()
+ ;
+}
+class C#1 extends self::_C&A&B {
+ synthetic constructor •() → self::C#1
+ : super self::_C&A&B::•()
+ ;
+}
+class C extends self::_C&B&A {
+ synthetic constructor •() → self::C
+ : super self::_C&B&A::•()
+ ;
+}
+abstract class _C&A&B extends self::A implements self::B /*isAnonymousMixin,isEliminatedMixin*/ {
+ synthetic constructor •() → self::_C&A&B
+ : super self::A::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.expect
new file mode 100644
index 0000000..46047b4
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.expect
@@ -0,0 +1,51 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_mixin_error.dart:13:7: Error: 'C' is already declared in this scope.
+// class C extends A with B {} // error, C extends a value class
+// ^
+// pkg/front_end/testcases/value_class/value_mixin_error.dart:12:7: Context: Previous declaration of 'C'.
+// class C extends B with A {} // error, value class as mixin
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ : super core::Object::•()
+ ;
+}
+class B extends core::Object {
+ synthetic constructor •() → self::B
+ : super core::Object::•()
+ ;
+}
+abstract class _C&B&A = self::B with self::A /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_C&B&A
+ : super self::B::•()
+ ;
+}
+class C#1 extends self::_C&A&B {
+ synthetic constructor •() → self::C#1
+ : super self::_C&A&B::•()
+ ;
+}
+class C extends self::_C&B&A {
+ synthetic constructor •() → self::C
+ : super self::_C&B&A::•()
+ ;
+}
+abstract class _C&A&B = self::A with self::B /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_C&A&B
+ : super self::A::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.transformed.expect
new file mode 100644
index 0000000..0a9c8b9
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.transformed.expect
@@ -0,0 +1,51 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_mixin_error.dart:13:7: Error: 'C' is already declared in this scope.
+// class C extends A with B {} // error, C extends a value class
+// ^
+// pkg/front_end/testcases/value_class/value_mixin_error.dart:12:7: Context: Previous declaration of 'C'.
+// class C extends B with A {} // error, value class as mixin
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ : super core::Object::•()
+ ;
+}
+class B extends core::Object {
+ synthetic constructor •() → self::B
+ : super core::Object::•()
+ ;
+}
+abstract class _C&B&A extends self::B implements self::A /*isAnonymousMixin,isEliminatedMixin*/ {
+ synthetic constructor •() → self::_C&B&A
+ : super self::B::•()
+ ;
+}
+class C#1 extends self::_C&A&B {
+ synthetic constructor •() → self::C#1
+ : super self::_C&A&B::•()
+ ;
+}
+class C extends self::_C&B&A {
+ synthetic constructor •() → self::C
+ : super self::_C&B&A::•()
+ ;
+}
+abstract class _C&A&B extends self::A implements self::B /*isAnonymousMixin,isEliminatedMixin*/ {
+ synthetic constructor •() → self::_C&A&B
+ : super self::A::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index 3526184..8df9de3 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -72,3 +72,6 @@
nnbd_mixed/messages_with_types_opt_in: TypeCheckError
nnbd_mixed/messages_with_types_opt_out: TypeCheckError
nnbd_mixed/never_opt_out: TypeCheckError
+value_class/simple: RuntimeError # Expected
+value_class/super_type: RuntimeError # Expected
+
diff --git a/pkg/test_runner/lib/src/compiler_configuration.dart b/pkg/test_runner/lib/src/compiler_configuration.dart
index e841c9d..4ddeafc 100644
--- a/pkg/test_runner/lib/src/compiler_configuration.dart
+++ b/pkg/test_runner/lib/src/compiler_configuration.dart
@@ -716,7 +716,7 @@
// mode.
if (_configuration.useElf && arguments.last.contains("deferred")) ...[
"--loading-unit-manifest=$tempDir/ignored.json",
- "--use-bare-instructions=false",
+ "--use-table-dispatch=false",
],
if (_isAndroid && _isArm) '--no-sim-use-hardfp',
if (_configuration.isMinified) '--obfuscate',
diff --git a/pkg/vm/lib/transformations/list_factory_specializer.dart b/pkg/vm/lib/transformations/list_factory_specializer.dart
deleted file mode 100644
index 37417ca..0000000
--- a/pkg/vm/lib/transformations/list_factory_specializer.dart
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright (c) 2018, 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 vm.transformations.list_factory_specializer;
-
-import 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart' show CoreTypes;
-
-/// Replaces invocation of List factory constructors with
-/// factories of VM-specific classes.
-///
-/// new List() => new _GrowableList(0)
-/// new List(n) => new _List(n)
-/// new List.filled(n, null, growable: true) => new _GrowableList(n)
-/// new List.filled(n, x, growable: true) => new _GrowableList.filled(n, x)
-/// new List.filled(n, null) => new _List(n)
-/// new List.filled(n, x) => new _List.filled(n, x)
-/// new List.generate(n, y) => new _GrowableList.generate(n, y)
-/// new List.generate(n, y, growable: false) => new _List.generate(n, y)
-///
-class ListFactorySpecializer {
- final Procedure _defaultListFactory;
- final Procedure _listFilledFactory;
- final Procedure _listGenerateFactory;
- final Procedure _growableListFactory;
- final Procedure _growableListFilledFactory;
- final Procedure _growableListGenerateFactory;
- final Procedure _fixedListFactory;
- final Procedure _fixedListFilledFactory;
- final Procedure _fixedListGenerateFactory;
-
- ListFactorySpecializer(CoreTypes coreTypes)
- : _defaultListFactory =
- coreTypes.index.getMember('dart:core', 'List', ''),
- _listFilledFactory =
- coreTypes.index.getMember('dart:core', 'List', 'filled'),
- _listGenerateFactory =
- coreTypes.index.getMember('dart:core', 'List', 'generate'),
- _growableListFactory =
- coreTypes.index.getMember('dart:core', '_GrowableList', ''),
- _growableListFilledFactory =
- coreTypes.index.getMember('dart:core', '_GrowableList', 'filled'),
- _growableListGenerateFactory =
- coreTypes.index.getMember('dart:core', '_GrowableList', 'generate'),
- _fixedListFactory = coreTypes.index.getMember('dart:core', '_List', ''),
- _fixedListFilledFactory =
- coreTypes.index.getMember('dart:core', '_List', 'filled'),
- _fixedListGenerateFactory =
- coreTypes.index.getMember('dart:core', '_List', 'generate') {
- assert(_defaultListFactory.isFactory);
- assert(_listFilledFactory.isFactory);
- assert(_listGenerateFactory.isFactory);
- assert(_growableListFactory.isFactory);
- assert(_growableListFilledFactory.isFactory);
- assert(_growableListGenerateFactory.isFactory);
- assert(_fixedListFactory.isFactory);
- assert(_fixedListFilledFactory.isFactory);
- assert(_fixedListGenerateFactory.isFactory);
- }
-
- TreeNode transformStaticInvocation(StaticInvocation node) {
- final target = node.target;
- if (target == _defaultListFactory) {
- final args = node.arguments;
- if (args.positional.isEmpty) {
- return StaticInvocation(_growableListFactory,
- Arguments([new IntLiteral(0)], types: args.types))
- ..fileOffset = node.fileOffset;
- } else {
- return StaticInvocation(_fixedListFactory, args)
- ..fileOffset = node.fileOffset;
- }
- } else if (target == _listFilledFactory) {
- final args = node.arguments;
- assert(args.positional.length == 2);
- final length = args.positional[0];
- final fill = args.positional[1];
- final fillingWithNull = fill is NullLiteral ||
- (fill is ConstantExpression && fill.constant is NullConstant);
- final bool growable =
- _getConstantOptionalArgument(args, 'growable', false);
- if (growable == null) {
- return node;
- }
- if (growable) {
- if (fillingWithNull) {
- return StaticInvocation(
- _growableListFactory, Arguments([length], types: args.types))
- ..fileOffset = node.fileOffset;
- } else {
- return StaticInvocation(_growableListFilledFactory,
- Arguments([length, fill], types: args.types))
- ..fileOffset = node.fileOffset;
- }
- } else {
- if (fillingWithNull) {
- return StaticInvocation(
- _fixedListFactory, Arguments([length], types: args.types))
- ..fileOffset = node.fileOffset;
- } else {
- return StaticInvocation(_fixedListFilledFactory,
- Arguments([length, fill], types: args.types))
- ..fileOffset = node.fileOffset;
- }
- }
- } else if (target == _listGenerateFactory) {
- final args = node.arguments;
- assert(args.positional.length == 2);
- final length = args.positional[0];
- final generator = args.positional[1];
- final bool growable =
- _getConstantOptionalArgument(args, 'growable', true);
- if (growable == null) {
- return node;
- }
- if (growable) {
- return StaticInvocation(_growableListGenerateFactory,
- Arguments([length, generator], types: args.types))
- ..fileOffset = node.fileOffset;
- } else {
- return StaticInvocation(_fixedListGenerateFactory,
- Arguments([length, generator], types: args.types))
- ..fileOffset = node.fileOffset;
- }
- }
-
- return node;
- }
-
- /// Returns constant value of the only optional argument in [args],
- /// or null if it is not a constant. Returns [defaultValue] if optional
- /// argument is not passed. Argument is asserted to have the given [name].
- bool /*?*/ _getConstantOptionalArgument(
- Arguments args, String name, bool defaultValue) {
- if (args.named.isEmpty) {
- return defaultValue;
- }
- final namedArg = args.named.single;
- assert(namedArg.name == name);
- final value = namedArg.value;
- if (value is BoolLiteral) {
- return value.value;
- } else if (value is ConstantExpression) {
- final constant = value.constant;
- if (constant is BoolConstant) {
- return constant.value;
- }
- }
- return null;
- }
-}
diff --git a/pkg/vm/lib/transformations/lowering.dart b/pkg/vm/lib/transformations/lowering.dart
index 3e3e410..19fee1a 100644
--- a/pkg/vm/lib/transformations/lowering.dart
+++ b/pkg/vm/lib/transformations/lowering.dart
@@ -9,9 +9,8 @@
as typeCastsOptimizer show transformAsExpression;
import 'package:kernel/type_environment.dart'
show StaticTypeContext, TypeEnvironment;
-
+import 'package:vm/transformations/specializer/factory_specializer.dart';
import 'late_var_init_transformer.dart' show LateVarInitTransformer;
-import 'list_factory_specializer.dart' show ListFactorySpecializer;
/// VM-specific lowering transformations and optimizations combined into a
/// single transformation pass.
@@ -27,16 +26,16 @@
class _Lowering extends Transformer {
final TypeEnvironment env;
final bool nullSafety;
- final ListFactorySpecializer listFactorySpecializer;
final LateVarInitTransformer lateVarInitTransformer;
+ final FactorySpecializer factorySpecializer;
Member _currentMember;
StaticTypeContext _cachedStaticTypeContext;
_Lowering(CoreTypes coreTypes, ClassHierarchy hierarchy, this.nullSafety)
: env = TypeEnvironment(coreTypes, hierarchy),
- listFactorySpecializer = ListFactorySpecializer(coreTypes),
- lateVarInitTransformer = LateVarInitTransformer();
+ lateVarInitTransformer = LateVarInitTransformer(),
+ factorySpecializer = FactorySpecializer(coreTypes);
StaticTypeContext get _staticTypeContext =>
_cachedStaticTypeContext ??= StaticTypeContext(_currentMember, env);
@@ -56,7 +55,7 @@
@override
visitStaticInvocation(StaticInvocation node) {
node.transformChildren(this);
- return listFactorySpecializer.transformStaticInvocation(node);
+ return factorySpecializer.transformStaticInvocation(node);
}
@override
diff --git a/pkg/vm/lib/transformations/specializer/factory_specializer.dart b/pkg/vm/lib/transformations/specializer/factory_specializer.dart
new file mode 100644
index 0000000..02a3cfe
--- /dev/null
+++ b/pkg/vm/lib/transformations/specializer/factory_specializer.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2020, 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 vm.transformations.specializer.factory_specializer;
+
+import 'package:kernel/kernel.dart';
+import 'package:kernel/core_types.dart';
+import 'package:vm/transformations/specializer/list_factory_specializer.dart';
+import 'package:vm/transformations/specializer/map_factory_specializer.dart';
+import 'package:vm/transformations/specializer/set_factory_specializer.dart';
+
+typedef SpecializerTransformer = TreeNode Function(StaticInvocation node);
+
+abstract class BaseSpecializer {
+ // Populated in constructors of subclasses.
+ final Map<Member, SpecializerTransformer> transformers = {};
+}
+
+class FactorySpecializer extends BaseSpecializer {
+ final ListFactorySpecializer _listFactorySpecializer;
+ final SetFactorySpecializer _setFactorySpecializer;
+ final MapFactorySpecializer _mapFactorySpecializer;
+
+ FactorySpecializer(CoreTypes coreTypes)
+ : _listFactorySpecializer = ListFactorySpecializer(coreTypes),
+ _setFactorySpecializer = SetFactorySpecializer(coreTypes),
+ _mapFactorySpecializer = MapFactorySpecializer(coreTypes) {
+ transformers.addAll(_listFactorySpecializer.transformers);
+ transformers.addAll(_setFactorySpecializer.transformers);
+ transformers.addAll(_mapFactorySpecializer.transformers);
+ }
+
+ TreeNode transformStaticInvocation(StaticInvocation invocation) {
+ final target = invocation.target;
+ if (target == null) {
+ return invocation;
+ }
+
+ final transformer = transformers[target];
+ if (transformer != null) {
+ return transformer(invocation);
+ }
+ return invocation;
+ }
+}
diff --git a/pkg/vm/lib/transformations/specializer/list_factory_specializer.dart b/pkg/vm/lib/transformations/specializer/list_factory_specializer.dart
new file mode 100644
index 0000000..38e5913
--- /dev/null
+++ b/pkg/vm/lib/transformations/specializer/list_factory_specializer.dart
@@ -0,0 +1,155 @@
+// Copyright (c) 2018, 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 vm.transformations.specializer.list_factory_specializer;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/core_types.dart' show CoreTypes;
+import 'package:vm/transformations/specializer/factory_specializer.dart';
+
+/// Replaces invocation of List factory constructors with
+/// factories of VM-specific classes.
+///
+/// new List() => new _GrowableList(0)
+/// new List(n) => new _List(n)
+/// new List.filled(n, null, growable: true) => new _GrowableList(n)
+/// new List.filled(n, x, growable: true) => new _GrowableList.filled(n, x)
+/// new List.filled(n, null) => new _List(n)
+/// new List.filled(n, x) => new _List.filled(n, x)
+/// new List.generate(n, y) => new _GrowableList.generate(n, y)
+/// new List.generate(n, y, growable: false) => new _List.generate(n, y)
+///
+class ListFactorySpecializer extends BaseSpecializer {
+ final Procedure _defaultListFactory;
+ final Procedure _listFilledFactory;
+ final Procedure _listGenerateFactory;
+ final Procedure _growableListFactory;
+ final Procedure _growableListFilledFactory;
+ final Procedure _growableListGenerateFactory;
+ final Procedure _fixedListFactory;
+ final Procedure _fixedListFilledFactory;
+ final Procedure _fixedListGenerateFactory;
+
+ ListFactorySpecializer(CoreTypes coreTypes)
+ : _defaultListFactory =
+ coreTypes.index.getMember('dart:core', 'List', ''),
+ _listFilledFactory =
+ coreTypes.index.getMember('dart:core', 'List', 'filled'),
+ _listGenerateFactory =
+ coreTypes.index.getMember('dart:core', 'List', 'generate'),
+ _growableListFactory =
+ coreTypes.index.getMember('dart:core', '_GrowableList', ''),
+ _growableListFilledFactory =
+ coreTypes.index.getMember('dart:core', '_GrowableList', 'filled'),
+ _growableListGenerateFactory =
+ coreTypes.index.getMember('dart:core', '_GrowableList', 'generate'),
+ _fixedListFactory = coreTypes.index.getMember('dart:core', '_List', ''),
+ _fixedListFilledFactory =
+ coreTypes.index.getMember('dart:core', '_List', 'filled'),
+ _fixedListGenerateFactory =
+ coreTypes.index.getMember('dart:core', '_List', 'generate') {
+ assert(_defaultListFactory.isFactory);
+ assert(_listFilledFactory.isFactory);
+ assert(_listGenerateFactory.isFactory);
+ assert(_growableListFactory.isFactory);
+ assert(_growableListFilledFactory.isFactory);
+ assert(_growableListGenerateFactory.isFactory);
+ assert(_fixedListFactory.isFactory);
+ assert(_fixedListFilledFactory.isFactory);
+ assert(_fixedListGenerateFactory.isFactory);
+ transformers.addAll({
+ _defaultListFactory: transformDefaultFactory,
+ _listFilledFactory: transformListFilledFactory,
+ _listGenerateFactory: transformListGeneratorFactory,
+ });
+ }
+
+ TreeNode transformDefaultFactory(StaticInvocation node) {
+ final args = node.arguments;
+ if (args.positional.isEmpty) {
+ return StaticInvocation(_growableListFactory,
+ Arguments([new IntLiteral(0)], types: args.types))
+ ..fileOffset = node.fileOffset;
+ } else {
+ return StaticInvocation(_fixedListFactory, args)
+ ..fileOffset = node.fileOffset;
+ }
+ }
+
+ TreeNode transformListFilledFactory(StaticInvocation node) {
+ final args = node.arguments;
+ assert(args.positional.length == 2);
+ final length = args.positional[0];
+ final fill = args.positional[1];
+ final fillingWithNull = fill is NullLiteral ||
+ (fill is ConstantExpression && fill.constant is NullConstant);
+ final bool growable = _getConstantOptionalArgument(args, 'growable', false);
+ if (growable == null) {
+ return node;
+ }
+ if (growable) {
+ if (fillingWithNull) {
+ return StaticInvocation(
+ _growableListFactory, Arguments([length], types: args.types))
+ ..fileOffset = node.fileOffset;
+ } else {
+ return StaticInvocation(_growableListFilledFactory,
+ Arguments([length, fill], types: args.types))
+ ..fileOffset = node.fileOffset;
+ }
+ } else {
+ if (fillingWithNull) {
+ return StaticInvocation(
+ _fixedListFactory, Arguments([length], types: args.types))
+ ..fileOffset = node.fileOffset;
+ } else {
+ return StaticInvocation(_fixedListFilledFactory,
+ Arguments([length, fill], types: args.types))
+ ..fileOffset = node.fileOffset;
+ }
+ }
+ }
+
+ TreeNode transformListGeneratorFactory(StaticInvocation node) {
+ final args = node.arguments;
+ assert(args.positional.length == 2);
+ final length = args.positional[0];
+ final generator = args.positional[1];
+ final bool growable = _getConstantOptionalArgument(args, 'growable', true);
+ if (growable == null) {
+ return node;
+ }
+ if (growable) {
+ return StaticInvocation(_growableListGenerateFactory,
+ Arguments([length, generator], types: args.types))
+ ..fileOffset = node.fileOffset;
+ } else {
+ return StaticInvocation(_fixedListGenerateFactory,
+ Arguments([length, generator], types: args.types))
+ ..fileOffset = node.fileOffset;
+ }
+ }
+
+ /// Returns constant value of the only optional argument in [args],
+ /// or null if it is not a constant. Returns [defaultValue] if optional
+ /// argument is not passed. Argument is asserted to have the given [name].
+ bool /*?*/ _getConstantOptionalArgument(
+ Arguments args, String name, bool defaultValue) {
+ if (args.named.isEmpty) {
+ return defaultValue;
+ }
+ final namedArg = args.named.single;
+ assert(namedArg.name == name);
+ final value = namedArg.value;
+ if (value is BoolLiteral) {
+ return value.value;
+ } else if (value is ConstantExpression) {
+ final constant = value.constant;
+ if (constant is BoolConstant) {
+ return constant.value;
+ }
+ }
+ return null;
+ }
+}
diff --git a/pkg/vm/lib/transformations/specializer/map_factory_specializer.dart b/pkg/vm/lib/transformations/specializer/map_factory_specializer.dart
new file mode 100644
index 0000000..5779807
--- /dev/null
+++ b/pkg/vm/lib/transformations/specializer/map_factory_specializer.dart
@@ -0,0 +1,56 @@
+// Copyright (c) 2020, 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 vm.transformations.specializer.map_factory_specializer;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/core_types.dart';
+import 'dart:core';
+
+import 'package:vm/transformations/specializer/factory_specializer.dart';
+
+/// Replaces invocation of Map factory constructors with
+/// factories of VM-specific classes.
+/// new LinkedHashMap<K, V>() => new _InternalLinkedHashMap<K, V>()
+class MapFactorySpecializer extends BaseSpecializer {
+ final Procedure _linkedHashMapDefaultFactory;
+ final Constructor _internalLinkedHashMapConstructor;
+
+ MapFactorySpecializer(CoreTypes coreTypes)
+ : _linkedHashMapDefaultFactory = assertNotNull(
+ coreTypes.index.getMember(
+ 'dart:collection',
+ 'LinkedHashMap',
+ '',
+ ),
+ ),
+ _internalLinkedHashMapConstructor = assertNotNull(
+ coreTypes.index.getMember(
+ 'dart:collection',
+ '_InternalLinkedHashMap',
+ '',
+ ),
+ ) {
+ transformers.addAll({
+ _linkedHashMapDefaultFactory: transformLinkedHashMap,
+ });
+ }
+
+ static T assertNotNull<T>(T t) {
+ assert(t != null);
+ return t;
+ }
+
+ TreeNode transformLinkedHashMap(StaticInvocation node) {
+ final args = node.arguments;
+ if (args.named.isEmpty) {
+ return ConstructorInvocation(
+ _internalLinkedHashMapConstructor,
+ Arguments([], types: args.types),
+ )..fileOffset = node.fileOffset;
+ }
+
+ return node;
+ }
+}
diff --git a/pkg/vm/lib/transformations/specializer/set_factory_specializer.dart b/pkg/vm/lib/transformations/specializer/set_factory_specializer.dart
new file mode 100644
index 0000000..0e6a855
--- /dev/null
+++ b/pkg/vm/lib/transformations/specializer/set_factory_specializer.dart
@@ -0,0 +1,56 @@
+// Copyright (c) 2020, 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 vm.transformations.specializer.set_factory_specializer;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/core_types.dart' show CoreTypes;
+
+import 'package:kernel/core_types.dart';
+import 'package:vm/transformations/specializer/factory_specializer.dart';
+
+/// Replaces invocation of Set factory constructors with
+/// factories of VM-specific classes.
+/// new LinkedHashSet<E>() => new _CompactLinkedHashSet<E>()
+class SetFactorySpecializer extends BaseSpecializer {
+ final Procedure _linkedHashSetDefaultFactory;
+ final Constructor _compactLinkedHashSetConstructor;
+
+ SetFactorySpecializer(CoreTypes coreTypes)
+ : _linkedHashSetDefaultFactory = assertNotNull(
+ coreTypes.index.getMember(
+ 'dart:collection',
+ 'LinkedHashSet',
+ '',
+ ),
+ ),
+ _compactLinkedHashSetConstructor = assertNotNull(
+ coreTypes.index.getMember(
+ 'dart:collection',
+ '_CompactLinkedHashSet',
+ '',
+ ),
+ ) {
+ transformers.addAll({
+ _linkedHashSetDefaultFactory: transformLinkedHashSet,
+ });
+ }
+
+ static T assertNotNull<T>(T t) {
+ assert(t != null);
+ return t;
+ }
+
+ TreeNode transformLinkedHashSet(StaticInvocation node) {
+ final args = node.arguments;
+ assert(args.positional.isEmpty);
+ if (args.named.isEmpty) {
+ return ConstructorInvocation(
+ _compactLinkedHashSetConstructor,
+ Arguments([], types: args.types),
+ );
+ }
+ return node;
+ }
+}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/set_map_constructor_concrete.dart b/pkg/vm/testcases/transformations/type_flow/transformer/set_map_constructor_concrete.dart
new file mode 100644
index 0000000..ef432be
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/set_map_constructor_concrete.dart
@@ -0,0 +1,41 @@
+import 'dart:collection';
+import 'dart:core';
+
+main() {
+ // Set
+ print(globalSet);
+ print(identitySet);
+ print(linkedSet);
+ print(linkedIdentitySet);
+ print(linkedCustomSet);
+ // Map
+ print(globalMap);
+ print(globalMapLiteral);
+ print(identityMap);
+ print(unmodifiableMap);
+ print(linkedMap);
+ print(linkedIdentityMap);
+ print(linkedCustomMap);
+}
+
+Set globalSet = Set();
+Set identitySet = Set.identity();
+Set<String> linkedSet = new LinkedHashSet<String>();
+Set<String> linkedIdentitySet =
+ new LinkedHashSet<String>(equals: identical, hashCode: identityHashCode);
+Set<String> linkedCustomSet = new LinkedHashSet<String>(
+ equals: (a, b) => a == b,
+ hashCode: (o) => o.hashCode,
+ isValidKey: (o) => true);
+
+Map globalMap = Map();
+Map identityMap = Map.identity();
+Map unmodifiableMap = Map.unmodifiable(identityMap);
+Map globalMapLiteral = {};
+Map<String, String> linkedMap = new LinkedHashMap<String, String>();
+Map<String, String> linkedIdentityMap =
+ new LinkedHashMap(equals: identical, hashCode: identityHashCode);
+Map<String, String> linkedCustomMap = new LinkedHashMap(
+ equals: (a, b) => a == b,
+ hashCode: (o) => o.hashCode,
+ isValidKey: (o) => true);
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/set_map_constructor_concrete.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/set_map_constructor_concrete.dart.expect
new file mode 100644
index 0000000..fa2eda6
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/set_map_constructor_concrete.dart.expect
@@ -0,0 +1,34 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+import "dart:collection";
+import "dart:core";
+
+[@vm.inferred-type.metadata=dart.collection::_CompactLinkedHashSet?<dynamic>]static field core::Set<dynamic>* globalSet = new col::_CompactLinkedHashSet::•<dynamic>();
+[@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashSet?<dynamic>]static field core::Set<dynamic>* identitySet = [@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashSet<dynamic>] col::LinkedHashSet::identity<dynamic>();
+[@vm.inferred-type.metadata=dart.collection::_CompactLinkedHashSet?<dart.core::String*>]static field core::Set<core::String*>* linkedSet = new col::_CompactLinkedHashSet::•<core::String*>();
+static field core::Set<core::String*>* linkedIdentitySet = let (core::Object?, core::Object?) → core::bool #t1 = #C1 in let (core::Object?) → core::int #t2 = #C2 in [@vm.inferred-type.metadata=!] col::LinkedHashSet::•<core::String*>(#t1, #t2);
+static field core::Set<core::String*>* linkedCustomSet = let (core::String*, core::String*) →* core::bool* #t3 = (core::String* a, core::String* b) → core::bool* => a.{core::String::==}(b) in let (core::String*) →* core::int* #t4 = (core::String* o) → core::int* => o.{core::String::hashCode} in let (dynamic) →* core::bool* #t5 = (dynamic o) → core::bool* => true in [@vm.inferred-type.metadata=!] col::LinkedHashSet::•<core::String*>(#t3, #t4, isValidKey: #t5);
+[@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dynamic, dynamic>]static field core::Map<dynamic, dynamic>* globalMap = [@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<dynamic, dynamic>] core::Map::•<dynamic, dynamic>();
+[@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashMap?<dynamic, dynamic>]static field core::Map<dynamic, dynamic>* identityMap = [@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashMap<dynamic, dynamic>] col::LinkedHashMap::identity<dynamic, dynamic>();
+[@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView?<dynamic, dynamic>]static field core::Map<dynamic, dynamic>* unmodifiableMap = [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dynamic, dynamic>] core::Map::unmodifiable<dynamic, dynamic>([@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashMap?<dynamic, dynamic>] self::identityMap);
+[@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dynamic, dynamic>]static field core::Map<dynamic, dynamic>* globalMapLiteral = <dynamic, dynamic>{};
+[@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dart.core::String*, dart.core::String*>]static field core::Map<core::String*, core::String*>* linkedMap = new col::_InternalLinkedHashMap::•<core::String*, core::String*>();
+static field core::Map<core::String*, core::String*>* linkedIdentityMap = let (core::Object?, core::Object?) → core::bool #t6 = #C1 in let (core::Object?) → core::int #t7 = #C2 in [@vm.inferred-type.metadata=!] col::LinkedHashMap::•<core::String*, core::String*>(#t6, #t7);
+static field core::Map<core::String*, core::String*>* linkedCustomMap = let (core::String*, core::String*) →* core::bool* #t8 = (core::String* a, core::String* b) → core::bool* => a.{core::String::==}(b) in let (core::String*) →* core::int* #t9 = (core::String* o) → core::int* => o.{core::String::hashCode} in let (dynamic) →* core::bool* #t10 = (dynamic o) → core::bool* => true in [@vm.inferred-type.metadata=!] col::LinkedHashMap::•<core::String*, core::String*>(#t8, #t9, isValidKey: #t10);
+static method main() → dynamic {
+ core::print([@vm.inferred-type.metadata=dart.collection::_CompactLinkedHashSet?<dynamic>] self::globalSet);
+ core::print([@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashSet?<dynamic>] self::identitySet);
+ core::print([@vm.inferred-type.metadata=dart.collection::_CompactLinkedHashSet?<dart.core::String*>] self::linkedSet);
+ core::print(self::linkedIdentitySet);
+ core::print(self::linkedCustomSet);
+ core::print([@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dynamic, dynamic>] self::globalMap);
+ core::print([@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dynamic, dynamic>] self::globalMapLiteral);
+ core::print([@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashMap?<dynamic, dynamic>] self::identityMap);
+ core::print([@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView?<dynamic, dynamic>] self::unmodifiableMap);
+ core::print([@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dart.core::String*, dart.core::String*>] self::linkedMap);
+ core::print(self::linkedIdentityMap);
+ core::print(self::linkedCustomMap);
+}
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index bbd3d2ca..8eebaed 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -1141,6 +1141,18 @@
DART_EXPORT void Dart_KillIsolate(Dart_Isolate isolate);
/**
+ * Notifies the VM that the embedder expects |size| bytes of memory have become
+ * unreachable. The VM may use this hint to adjust the garbage collector's
+ * growth policy.
+ *
+ * Multiple calls are interpreted as increasing, not replacing, the estimate of
+ * unreachable memory.
+ *
+ * Requires there to be a current isolate.
+ */
+DART_EXPORT void Dart_HintFreed(intptr_t size);
+
+/**
* Notifies the VM that the embedder expects to be idle until |deadline|. The VM
* may use this time to perform garbage collection or other tasks to avoid
* delays during execution of Dart code in the future.
diff --git a/runtime/tests/vm/dart/incompatible_loading_unit_test.dart b/runtime/tests/vm/dart/incompatible_loading_unit_test.dart
index 8231f00..1663e3a 100644
--- a/runtime/tests/vm/dart/incompatible_loading_unit_test.dart
+++ b/runtime/tests/vm/dart/incompatible_loading_unit_test.dart
@@ -60,7 +60,7 @@
// Compile kernel to ELF.
await run(genSnapshot, <String>[
"--snapshot-kind=app-aot-elf",
- "--use-bare-instructions=false",
+ "--use-table-dispatch=false",
"--elf=$snapshot1",
"--loading-unit-manifest=$manifest1",
dill1,
@@ -71,7 +71,7 @@
await run(genSnapshot, <String>[
"--snapshot-kind=app-aot-elf",
- "--use-bare-instructions=false",
+ "--use-table-dispatch=false",
"--elf=$snapshot2",
"--loading-unit-manifest=$manifest2",
dill2,
diff --git a/runtime/tests/vm/dart_2/incompatible_loading_unit_test.dart b/runtime/tests/vm/dart_2/incompatible_loading_unit_test.dart
index 8231f00..1663e3a 100644
--- a/runtime/tests/vm/dart_2/incompatible_loading_unit_test.dart
+++ b/runtime/tests/vm/dart_2/incompatible_loading_unit_test.dart
@@ -60,7 +60,7 @@
// Compile kernel to ELF.
await run(genSnapshot, <String>[
"--snapshot-kind=app-aot-elf",
- "--use-bare-instructions=false",
+ "--use-table-dispatch=false",
"--elf=$snapshot1",
"--loading-unit-manifest=$manifest1",
dill1,
@@ -71,7 +71,7 @@
await run(genSnapshot, <String>[
"--snapshot-kind=app-aot-elf",
- "--use-bare-instructions=false",
+ "--use-table-dispatch=false",
"--elf=$snapshot2",
"--loading-unit-manifest=$manifest2",
dill2,
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 956b5ee..f02d468 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -718,9 +718,9 @@
}
}
- void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
- if (kind == Snapshot::kFullAOT) {
- Function& func = Function::Handle(zone);
+ void PostLoad(Deserializer* d, const Array& refs) {
+ if (d->kind() == Snapshot::kFullAOT) {
+ Function& func = Function::Handle(d->zone());
for (intptr_t i = start_index_; i < stop_index_; i++) {
func ^= refs.At(i);
ASSERT(func.raw()->ptr()->code_->IsCode());
@@ -732,9 +732,9 @@
ASSERT(unchecked_entry_point != 0);
func.raw()->ptr()->unchecked_entry_point_ = unchecked_entry_point;
}
- } else if (kind == Snapshot::kFullJIT) {
- Function& func = Function::Handle(zone);
- Code& code = Code::Handle(zone);
+ } else if (d->kind() == Snapshot::kFullJIT) {
+ Function& func = Function::Handle(d->zone());
+ Code& code = Code::Handle(d->zone());
for (intptr_t i = start_index_; i < stop_index_; i++) {
func ^= refs.At(i);
code = func.CurrentCode();
@@ -746,7 +746,7 @@
}
}
} else {
- Function& func = Function::Handle(zone);
+ Function& func = Function::Handle(d->zone());
for (intptr_t i = start_index_; i < stop_index_; i++) {
func ^= refs.At(i);
func.ClearCode(); // Set code and entrypoint to lazy compile stub.
@@ -1203,8 +1203,8 @@
}
}
- void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
- Field& field = Field::Handle(zone);
+ void PostLoad(Deserializer* d, const Array& refs) {
+ Field& field = Field::Handle(d->zone());
if (!Isolate::Current()->use_field_guards()) {
for (intptr_t i = start_index_; i < stop_index_; i++) {
field ^= refs.At(i);
@@ -1501,9 +1501,9 @@
}
}
- void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
- Array& array = Array::Handle(zone);
- KernelProgramInfo& info = KernelProgramInfo::Handle(zone);
+ void PostLoad(Deserializer* d, const Array& refs) {
+ Array& array = Array::Handle(d->zone());
+ KernelProgramInfo& info = KernelProgramInfo::Handle(d->zone());
for (intptr_t id = start_index_; id < stop_index_; id++) {
info ^= refs.At(id);
array = HashTables::New<UnorderedHashMap<SmiTraits>>(16, Heap::kOld);
@@ -1522,9 +1522,10 @@
void Trace(Serializer* s, ObjectPtr object) {
CodePtr code = Code::RawCast(object);
- objects_.Add(code);
- s->InCurrentLoadingUnit(code, /*record*/ true);
+ if (s->InCurrentLoadingUnit(code, /*record*/ true)) {
+ objects_.Add(code);
+ }
if (!(s->kind() == Snapshot::kFullAOT && FLAG_use_bare_instructions)) {
s->Push(code->ptr()->object_pool_);
@@ -1571,7 +1572,77 @@
#endif
}
+ struct CodeOrderInfo {
+ CodePtr code;
+ intptr_t order;
+ };
+
+ static int CompareCodeOrderInfo(CodeOrderInfo const* a,
+ CodeOrderInfo const* b) {
+ if (a->order < b->order) return -1;
+ if (a->order > b->order) return 1;
+ return 0;
+ }
+
+ static void Insert(GrowableArray<CodeOrderInfo>* order_list,
+ IntMap<intptr_t>* order_map,
+ CodePtr code) {
+ InstructionsPtr instr = code->ptr()->instructions_;
+ intptr_t key = static_cast<intptr_t>(instr);
+ intptr_t order;
+ if (order_map->HasKey(key)) {
+ order = order_map->Lookup(key);
+ } else {
+ order = order_list->length() + 1;
+ order_map->Insert(key, order);
+ }
+ CodeOrderInfo info;
+ info.code = code;
+ info.order = order;
+ order_list->Add(info);
+ }
+
+ static void Sort(GrowableArray<CodePtr>* codes) {
+ GrowableArray<CodeOrderInfo> order_list;
+ IntMap<intptr_t> order_map;
+ for (intptr_t i = 0; i < codes->length(); i++) {
+ Insert(&order_list, &order_map, (*codes)[i]);
+ }
+ order_list.Sort(CompareCodeOrderInfo);
+ ASSERT(order_list.length() == codes->length());
+ for (intptr_t i = 0; i < order_list.length(); i++) {
+ (*codes)[i] = order_list[i].code;
+ }
+ }
+
+ static void Sort(GrowableArray<Code*>* codes) {
+ GrowableArray<CodeOrderInfo> order_list;
+ IntMap<intptr_t> order_map;
+ for (intptr_t i = 0; i < codes->length(); i++) {
+ Insert(&order_list, &order_map, (*codes)[i]->raw());
+ }
+ order_list.Sort(CompareCodeOrderInfo);
+ ASSERT(order_list.length() == codes->length());
+ for (intptr_t i = 0; i < order_list.length(); i++) {
+ *(*codes)[i] = order_list[i].code;
+ }
+ }
+
void WriteAlloc(Serializer* s) {
+ Sort(&objects_);
+ auto loading_units = s->loading_units();
+ if (loading_units != nullptr) {
+ for (intptr_t i = LoadingUnit::kRootId + 1; i < loading_units->length();
+ i++) {
+ auto unit_objects = loading_units->At(i)->deferred_objects();
+ Sort(unit_objects);
+ for (intptr_t j = 0; j < unit_objects->length(); j++) {
+ deferred_objects_.Add(unit_objects->At(j)->raw());
+ }
+ }
+ }
+ s->PrepareInstructions(&objects_);
+
s->WriteCid(kCodeCid);
const intptr_t count = objects_.length();
s->WriteUnsigned(count);
@@ -1579,6 +1650,12 @@
CodePtr code = objects_[i];
s->AssignRef(code);
}
+ const intptr_t deferred_count = deferred_objects_.length();
+ s->WriteUnsigned(deferred_count);
+ for (intptr_t i = 0; i < deferred_count; i++) {
+ CodePtr code = deferred_objects_[i];
+ s->AssignRef(code);
+ }
}
void WriteFill(Serializer* s) {
@@ -1586,82 +1663,94 @@
const intptr_t count = objects_.length();
for (intptr_t i = 0; i < count; i++) {
CodePtr code = objects_[i];
- AutoTraceObjectName(code, MakeDisambiguatedCodeName(s, code));
-
- intptr_t pointer_offsets_length =
- Code::PtrOffBits::decode(code->ptr()->state_bits_);
- if (pointer_offsets_length != 0) {
- FATAL("Cannot serialize code with embedded pointers");
- }
- if (kind == Snapshot::kFullAOT && Code::IsDisabled(code)) {
- // Disabled code is fatal in AOT since we cannot recompile.
- s->UnexpectedObject(code, "Disabled code");
- }
-
- s->WriteInstructions(code->ptr()->instructions_,
- code->ptr()->unchecked_offset_, code, i);
- if (kind == Snapshot::kFullJIT) {
- // TODO(rmacnak): Fix references to disabled code before serializing.
- // For now, we may write the FixCallersTarget or equivalent stub. This
- // will cause a fixup if this code is called.
- const uint32_t active_unchecked_offset =
- code->ptr()->unchecked_entry_point_ - code->ptr()->entry_point_;
- s->WriteInstructions(code->ptr()->active_instructions_,
- active_unchecked_offset, code, i);
- }
-
- // No need to write object pool out if we are producing full AOT
- // snapshot with bare instructions.
- if (!(kind == Snapshot::kFullAOT && FLAG_use_bare_instructions)) {
- WriteField(code, object_pool_);
-#if defined(DART_PRECOMPILER)
- } else if (FLAG_write_v8_snapshot_profile_to != nullptr &&
- code->ptr()->object_pool_ != ObjectPool::null()) {
- // If we are writing V8 snapshot profile then attribute references
- // going through the object pool to the code object itself.
- ObjectPoolPtr pool = code->ptr()->object_pool_;
-
- for (intptr_t i = 0; i < pool->ptr()->length_; i++) {
- uint8_t bits = pool->ptr()->entry_bits()[i];
- if (ObjectPool::TypeBits::decode(bits) ==
- ObjectPool::EntryType::kTaggedObject) {
- s->AttributeElementRef(pool->ptr()->data()[i].raw_obj_, i);
- }
- }
-#endif // defined(DART_PRECOMPILER)
- }
- WriteField(code, owner_);
- WriteField(code, exception_handlers_);
- WriteField(code, pc_descriptors_);
- WriteField(code, catch_entry_);
- if (s->InCurrentLoadingUnit(code->ptr()->compressed_stackmaps_)) {
- WriteField(code, compressed_stackmaps_);
- } else {
- WriteFieldValue(compressed_stackmaps_, CompressedStackMaps::null());
- }
- if (FLAG_precompiled_mode && FLAG_dwarf_stack_traces_mode) {
- WriteFieldValue(inlined_id_to_function_, Array::null());
- WriteFieldValue(code_source_map_, CodeSourceMap::null());
- } else {
- WriteField(code, inlined_id_to_function_);
- if (s->InCurrentLoadingUnit(code->ptr()->code_source_map_)) {
- WriteField(code, code_source_map_);
- } else {
- WriteFieldValue(code_source_map_, CodeSourceMap::null());
- }
- }
- if (kind == Snapshot::kFullJIT) {
- WriteField(code, deopt_info_array_);
- WriteField(code, static_calls_target_table_);
- }
-#if !defined(PRODUCT)
- WriteField(code, return_address_metadata_);
- if (FLAG_code_comments) {
- WriteField(code, comments_);
- }
-#endif
- s->Write<int32_t>(code->ptr()->state_bits_);
+ WriteFill(s, kind, code, false);
}
+ const intptr_t deferred_count = deferred_objects_.length();
+ for (intptr_t i = 0; i < deferred_count; i++) {
+ CodePtr code = deferred_objects_[i];
+ WriteFill(s, kind, code, true);
+ }
+ }
+
+ void WriteFill(Serializer* s,
+ Snapshot::Kind kind,
+ CodePtr code,
+ bool deferred) {
+ AutoTraceObjectName(code, MakeDisambiguatedCodeName(s, code));
+
+ intptr_t pointer_offsets_length =
+ Code::PtrOffBits::decode(code->ptr()->state_bits_);
+ if (pointer_offsets_length != 0) {
+ FATAL("Cannot serialize code with embedded pointers");
+ }
+ if (kind == Snapshot::kFullAOT && Code::IsDisabled(code)) {
+ // Disabled code is fatal in AOT since we cannot recompile.
+ s->UnexpectedObject(code, "Disabled code");
+ }
+
+ s->WriteInstructions(code->ptr()->instructions_,
+ code->ptr()->unchecked_offset_, code, deferred);
+ if (kind == Snapshot::kFullJIT) {
+ // TODO(rmacnak): Fix references to disabled code before serializing.
+ // For now, we may write the FixCallersTarget or equivalent stub. This
+ // will cause a fixup if this code is called.
+ const uint32_t active_unchecked_offset =
+ code->ptr()->unchecked_entry_point_ - code->ptr()->entry_point_;
+ s->WriteInstructions(code->ptr()->active_instructions_,
+ active_unchecked_offset, code, deferred);
+ }
+
+ // No need to write object pool out if we are producing full AOT
+ // snapshot with bare instructions.
+ if (!(kind == Snapshot::kFullAOT && FLAG_use_bare_instructions)) {
+ WriteField(code, object_pool_);
+#if defined(DART_PRECOMPILER)
+ } else if (FLAG_write_v8_snapshot_profile_to != nullptr &&
+ code->ptr()->object_pool_ != ObjectPool::null()) {
+ // If we are writing V8 snapshot profile then attribute references
+ // going through the object pool to the code object itself.
+ ObjectPoolPtr pool = code->ptr()->object_pool_;
+
+ for (intptr_t i = 0; i < pool->ptr()->length_; i++) {
+ uint8_t bits = pool->ptr()->entry_bits()[i];
+ if (ObjectPool::TypeBits::decode(bits) ==
+ ObjectPool::EntryType::kTaggedObject) {
+ s->AttributeElementRef(pool->ptr()->data()[i].raw_obj_, i);
+ }
+ }
+#endif // defined(DART_PRECOMPILER)
+ }
+ WriteField(code, owner_);
+ WriteField(code, exception_handlers_);
+ WriteField(code, pc_descriptors_);
+ WriteField(code, catch_entry_);
+ if (s->InCurrentLoadingUnit(code->ptr()->compressed_stackmaps_)) {
+ WriteField(code, compressed_stackmaps_);
+ } else {
+ WriteFieldValue(compressed_stackmaps_, CompressedStackMaps::null());
+ }
+ if (FLAG_precompiled_mode && FLAG_dwarf_stack_traces_mode) {
+ WriteFieldValue(inlined_id_to_function_, Array::null());
+ WriteFieldValue(code_source_map_, CodeSourceMap::null());
+ } else {
+ WriteField(code, inlined_id_to_function_);
+ if (s->InCurrentLoadingUnit(code->ptr()->code_source_map_)) {
+ WriteField(code, code_source_map_);
+ } else {
+ WriteFieldValue(code_source_map_, CodeSourceMap::null());
+ }
+ }
+ if (kind == Snapshot::kFullJIT) {
+ WriteField(code, deopt_info_array_);
+ WriteField(code, static_calls_target_table_);
+ }
+#if !defined(PRODUCT)
+ WriteField(code, return_address_metadata_);
+ if (FLAG_code_comments) {
+ WriteField(code, comments_);
+ }
+#endif
+ s->Write<int32_t>(code->ptr()->state_bits_);
}
GrowableArray<CodePtr>* discovered_objects() { return &objects_; }
@@ -1699,6 +1788,7 @@
}
GrowableArray<CodePtr> objects_;
+ GrowableArray<CodePtr> deferred_objects_;
};
#endif // !DART_PRECOMPILED_RUNTIME
@@ -1708,68 +1798,54 @@
~CodeDeserializationCluster() {}
void ReadAlloc(Deserializer* d) {
- start_index_ = d->next_index();
PageSpace* old_space = d->heap()->old_space();
+ start_index_ = d->next_index();
const intptr_t count = d->ReadUnsigned();
-
- // Build an array of code objects representing the order in which the
- // [Code]'s instructions will be located in memory.
- const bool build_code_order =
- FLAG_precompiled_mode && FLAG_use_bare_instructions;
- ArrayPtr code_order = nullptr;
- const intptr_t code_order_length = d->code_order_length();
- if (build_code_order) {
- code_order = static_cast<ArrayPtr>(AllocateUninitialized(
- old_space, Array::InstanceSize(code_order_length)));
- Deserializer::InitializeHeader(code_order, kArrayCid,
- Array::InstanceSize(code_order_length),
- /*is_canonical=*/false);
- code_order->ptr()->type_arguments_ = TypeArguments::null();
- code_order->ptr()->length_ = Smi::New(code_order_length);
- }
-
for (intptr_t i = 0; i < count; i++) {
auto code = AllocateUninitialized(old_space, Code::InstanceSize(0));
d->AssignRef(code);
- if (code_order != nullptr && i < code_order_length) {
- code_order->ptr()->data()[i] = code;
- }
}
-
- if (code_order != nullptr) {
- const auto& code_order_table = Array::Handle(code_order);
- d->isolate()->object_store()->set_code_order_table(code_order_table);
- }
-
stop_index_ = d->next_index();
+ deferred_start_index_ = d->next_index();
+ const intptr_t deferred_count = d->ReadUnsigned();
+ for (intptr_t i = 0; i < deferred_count; i++) {
+ auto code = AllocateUninitialized(old_space, Code::InstanceSize(0));
+ d->AssignRef(code);
+ }
+ deferred_stop_index_ = d->next_index();
}
void ReadFill(Deserializer* d) {
for (intptr_t id = start_index_; id < stop_index_; id++) {
- auto const code = static_cast<CodePtr>(d->Ref(id));
- Deserializer::InitializeHeader(code, kCodeCid, Code::InstanceSize(0));
+ ReadFill(d, id, false);
+ }
+ for (intptr_t id = deferred_start_index_; id < deferred_stop_index_; id++) {
+ ReadFill(d, id, true);
+ }
+ }
- d->ReadInstructions(code, id, start_index_);
+ void ReadFill(Deserializer* d, intptr_t id, bool deferred) {
+ auto const code = static_cast<CodePtr>(d->Ref(id));
+ Deserializer::InitializeHeader(code, kCodeCid, Code::InstanceSize(0));
- // There would be a single global pool if this is a full AOT snapshot
- // with bare instructions.
- if (!(d->kind() == Snapshot::kFullAOT && FLAG_use_bare_instructions)) {
- code->ptr()->object_pool_ = static_cast<ObjectPoolPtr>(d->ReadRef());
- } else {
- code->ptr()->object_pool_ = ObjectPool::null();
- }
- code->ptr()->owner_ = d->ReadRef();
- code->ptr()->exception_handlers_ =
- static_cast<ExceptionHandlersPtr>(d->ReadRef());
- code->ptr()->pc_descriptors_ =
- static_cast<PcDescriptorsPtr>(d->ReadRef());
- code->ptr()->catch_entry_ = d->ReadRef();
- code->ptr()->compressed_stackmaps_ =
- static_cast<CompressedStackMapsPtr>(d->ReadRef());
- code->ptr()->inlined_id_to_function_ =
- static_cast<ArrayPtr>(d->ReadRef());
- code->ptr()->code_source_map_ =
- static_cast<CodeSourceMapPtr>(d->ReadRef());
+ d->ReadInstructions(code, deferred);
+
+ // There would be a single global pool if this is a full AOT snapshot
+ // with bare instructions.
+ if (!(d->kind() == Snapshot::kFullAOT && FLAG_use_bare_instructions)) {
+ code->ptr()->object_pool_ = static_cast<ObjectPoolPtr>(d->ReadRef());
+ } else {
+ code->ptr()->object_pool_ = ObjectPool::null();
+ }
+ code->ptr()->owner_ = d->ReadRef();
+ code->ptr()->exception_handlers_ =
+ static_cast<ExceptionHandlersPtr>(d->ReadRef());
+ code->ptr()->pc_descriptors_ = static_cast<PcDescriptorsPtr>(d->ReadRef());
+ code->ptr()->catch_entry_ = d->ReadRef();
+ code->ptr()->compressed_stackmaps_ =
+ static_cast<CompressedStackMapsPtr>(d->ReadRef());
+ code->ptr()->inlined_id_to_function_ = static_cast<ArrayPtr>(d->ReadRef());
+ code->ptr()->code_source_map_ = static_cast<CodeSourceMapPtr>(d->ReadRef());
#if !defined(DART_PRECOMPILED_RUNTIME)
if (d->kind() == Snapshot::kFullJIT) {
@@ -1789,16 +1865,18 @@
#endif
code->ptr()->state_bits_ = d->Read<int32_t>();
- }
}
-#if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
- void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
+ void PostLoad(Deserializer* d, const Array& refs) {
+ d->EndInstructions(refs, start_index_, stop_index_);
+
#if !defined(PRODUCT)
if (!CodeObservers::AreActive() && !FLAG_support_disassembler) return;
#endif
- Code& code = Code::Handle(zone);
- Object& owner = Object::Handle(zone);
+ Code& code = Code::Handle(d->zone());
+#if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
+ Object& owner = Object::Handle(d->zone());
+#endif
for (intptr_t id = start_index_; id < stop_index_; id++) {
code ^= refs.At(id);
#if !defined(DART_PRECOMPILED_RUNTIME) && !defined(PRODUCT)
@@ -1806,6 +1884,7 @@
Code::NotifyCodeObservers(code, code.is_optimized());
}
#endif
+#if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
owner = code.owner();
if (owner.IsFunction()) {
if ((FLAG_disassemble ||
@@ -1817,9 +1896,13 @@
} else if (FLAG_disassemble_stubs) {
Disassembler::DisassembleStub(code.Name(), code);
}
+#endif // !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
}
}
-#endif // !DART_PRECOMPILED_RUNTIME
+
+ private:
+ intptr_t deferred_start_index_;
+ intptr_t deferred_stop_index_;
};
#if !defined(DART_PRECOMPILED_RUNTIME)
@@ -1892,13 +1975,13 @@
}
}
- void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
- Bytecode& bytecode = Bytecode::Handle(zone);
- ExternalTypedData& binary = ExternalTypedData::Handle(zone);
+ void PostLoad(Deserializer* d, const Array& refs) {
+ Bytecode& bytecode = Bytecode::Handle(d->zone());
+ ExternalTypedData& binary = ExternalTypedData::Handle(d->zone());
for (intptr_t i = start_index_; i < stop_index_; i++) {
bytecode ^= refs.At(i);
- binary = bytecode.GetBinary(zone);
+ binary = bytecode.GetBinary(d->zone());
bytecode.set_instructions(reinterpret_cast<uword>(
binary.DataAddr(bytecode.instructions_binary_offset())));
}
@@ -2282,7 +2365,7 @@
// rounding need to be deterministically set for reliable deduplication in
// shared images.
if (object->ptr()->InVMIsolateHeap() ||
- s->isolate()->heap()->old_space()->IsObjectFromImagePages(object)) {
+ s->heap()->old_space()->IsObjectFromImagePages(object)) {
// This object is already read-only.
} else {
Object::FinalizeReadOnlyObject(object);
@@ -2852,8 +2935,8 @@
}
}
- void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
#if defined(DART_PRECOMPILED_RUNTIME)
+ void PostLoad(Deserializer* d, const Array& refs) {
if (FLAG_use_bare_instructions) {
// By default, every megamorphic call site will load the target
// [Function] from the hash table and call indirectly via loading the
@@ -2869,14 +2952,14 @@
// normal switchable calls instead of megamorphic calls. (This is also a
// memory balance beause [MegamorphicCache]s are per-selector while
// [ICData] are per-callsite.)
- auto& cache = MegamorphicCache::Handle(zone);
+ auto& cache = MegamorphicCache::Handle(d->zone());
for (intptr_t i = start_index_; i < stop_index_; ++i) {
cache ^= refs.At(i);
cache.SwitchToBareInstructions();
}
}
-#endif // defined(DART_PRECOMPILED_RUNTIME)
}
+#endif // defined(DART_PRECOMPILED_RUNTIME)
};
#if !defined(DART_PRECOMPILED_RUNTIME)
@@ -3481,11 +3564,11 @@
}
}
- void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
- Type& type = Type::Handle(zone);
- Code& stub = Code::Handle(zone);
+ void PostLoad(Deserializer* d, const Array& refs) {
+ Type& type = Type::Handle(d->zone());
+ Code& stub = Code::Handle(d->zone());
- if (Snapshot::IncludesCode(kind)) {
+ if (Snapshot::IncludesCode(d->kind())) {
for (intptr_t id = canonical_start_index_; id < canonical_stop_index_;
id++) {
type ^= refs.At(id);
@@ -3587,11 +3670,11 @@
}
}
- void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
- TypeRef& type_ref = TypeRef::Handle(zone);
- Code& stub = Code::Handle(zone);
+ void PostLoad(Deserializer* d, const Array& refs) {
+ TypeRef& type_ref = TypeRef::Handle(d->zone());
+ Code& stub = Code::Handle(d->zone());
- if (Snapshot::IncludesCode(kind)) {
+ if (Snapshot::IncludesCode(d->kind())) {
for (intptr_t id = start_index_; id < stop_index_; id++) {
type_ref ^= refs.At(id);
stub = type_ref.type_test_stub();
@@ -3713,11 +3796,11 @@
}
}
- void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
- TypeParameter& type_param = TypeParameter::Handle(zone);
- Code& stub = Code::Handle(zone);
+ void PostLoad(Deserializer* d, const Array& refs) {
+ TypeParameter& type_param = TypeParameter::Handle(d->zone());
+ Code& stub = Code::Handle(d->zone());
- if (Snapshot::IncludesCode(kind)) {
+ if (Snapshot::IncludesCode(d->kind())) {
for (intptr_t id = canonical_start_index_; id < canonical_stop_index_;
id++) {
type_param ^= refs.At(id);
@@ -3901,15 +3984,15 @@
void ReadFill(Deserializer* d) {}
- void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
- const Class& mint_cls =
- Class::Handle(zone, Isolate::Current()->object_store()->mint_class());
+ void PostLoad(Deserializer* d, const Array& refs) {
+ const Class& mint_cls = Class::Handle(
+ d->zone(), Isolate::Current()->object_store()->mint_class());
mint_cls.set_constants(Object::empty_array());
- Object& number = Object::Handle(zone);
+ Object& number = Object::Handle(d->zone());
for (intptr_t i = start_index_; i < stop_index_; i++) {
number = refs.At(i);
if (number.IsMint() && number.IsCanonical()) {
- mint_cls.InsertCanonicalMint(zone, Mint::Cast(number));
+ mint_cls.InsertCanonicalMint(d->zone(), Mint::Cast(number));
}
}
}
@@ -4195,8 +4278,8 @@
}
}
- void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
- auto& view = TypedDataView::Handle(zone);
+ void PostLoad(Deserializer* d, const Array& refs) {
+ auto& view = TypedDataView::Handle(d->zone());
for (intptr_t id = start_index_; id < stop_index_; id++) {
view ^= refs.At(id);
view.RecomputeDataField();
@@ -4886,6 +4969,7 @@
num_base_objects_(0),
num_written_objects_(0),
next_ref_index_(1),
+ previous_text_offset_(0),
field_table_(thread->isolate()->field_table()),
vm_(vm),
profile_writer_(profile_writer)
@@ -5213,7 +5297,7 @@
}
if (unit_id != current_loading_unit_id_) {
if (record) {
- (*loading_units_)[unit_id]->AddDeferredObject(obj);
+ (*loading_units_)[unit_id]->AddDeferredObject(static_cast<CodePtr>(obj));
}
return false;
}
@@ -5221,14 +5305,24 @@
}
#if !defined(DART_PRECOMPILED_RUNTIME)
+void Serializer::PrepareInstructions(GrowableArray<CodePtr>* code_objects) {
+#if defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_IA32)
+ if ((kind() == Snapshot::kFullAOT) && FLAG_use_bare_instructions) {
+ GrowableArray<ImageWriterCommand> writer_commands;
+ RelocateCodeObjects(vm_, code_objects, &writer_commands);
+ image_writer_->PrepareForSerialization(&writer_commands);
+ }
+#endif // defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_IA32)
+}
+
void Serializer::WriteInstructions(InstructionsPtr instr,
uint32_t unchecked_offset,
CodePtr code,
- intptr_t index) {
+ bool deferred) {
ASSERT(code != Code::null());
- if (!InCurrentLoadingUnit(code)) {
- Write<uint32_t>(0);
+ ASSERT(InCurrentLoadingUnit(code) != deferred);
+ if (deferred) {
return;
}
@@ -5247,33 +5341,14 @@
}
if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
- static_assert(
- ImageWriter::kBareInstructionsAlignment > 1,
- "Bare instruction payloads are not aligned on even byte boundaries");
- ASSERT((offset & 0x1) == 0);
- // Since instructions are aligned on even byte boundaries, we can use the
- // low bit as a flag for whether the first uint32_t read is an offset
- // followed by the unchecked_offset + mono entry bit (when 0) or a reference
- // to another code object (when 1).
- if (deduped_instructions_sources_.HasKey(offset)) {
- ASSERT(FLAG_dedup_instructions);
- Write<uint32_t>(deduped_instructions_sources_.LookupValue(offset));
- return;
- }
- Write<uint32_t>(offset);
- // When writing only instruction payloads, we also need to serialize
- // whether there was a single entry. We append this as the low order bit
- // in the unchecked_offset.
- ASSERT(Utils::IsUint(31, unchecked_offset));
+ ASSERT(offset != 0);
+ RELEASE_ASSERT(offset >= previous_text_offset_);
+ const uint32_t delta = offset - previous_text_offset_;
+ WriteUnsigned(delta);
const uint32_t payload_info =
(unchecked_offset << 1) | (Code::HasMonomorphicEntry(code) ? 0x1 : 0x0);
WriteUnsigned(payload_info);
- // Store the index with an added set low bit (e.g., the form it should take
- // if used in serializing later Code objects). This also avoids storing a 0
- // in the IntMap when sharing instructions with the first code object (as
- // that is IntMap's current kNoValue).
- ASSERT(Utils::IsUint(31, index));
- deduped_instructions_sources_.Insert(offset, (index << 1) | 0x1);
+ previous_text_offset_ = offset;
return;
}
#endif
@@ -5454,8 +5529,6 @@
}
}
- intptr_t code_order_length = PrepareCodeOrder();
-
#if defined(DART_PRECOMPILER)
// Before we finalize the count of written objects, pick canonical versions
// of WSR objects that will be serialized and then remove any non-serialized
@@ -5480,7 +5553,6 @@
WriteUnsigned(num_base_objects_);
WriteUnsigned(num_objects);
WriteUnsigned(num_clusters);
- WriteUnsigned(code_order_length);
WriteUnsigned(field_table_->NumFieldIds());
for (intptr_t cid = 1; cid < num_cids_; cid++) {
@@ -5522,48 +5594,6 @@
}
}
}
-
-intptr_t Serializer::PrepareCodeOrder() {
- intptr_t code_order_length = 0;
-#if defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_IA32)
- if ((kind_ == Snapshot::kFullAOT) && FLAG_use_bare_instructions) {
- auto code_objects =
- static_cast<CodeSerializationCluster*>(clusters_by_cid_[kCodeCid])
- ->discovered_objects();
-
- GrowableArray<ImageWriterCommand> writer_commands;
- RelocateCodeObjects(vm_, code_objects, &writer_commands);
- image_writer_->PrepareForSerialization(&writer_commands);
-
- // We permute the code objects in the x[CodeSerializationCluster] so they
- // will arrive in the order in which the [Code]'s instructions will be in
- // memory at AOT runtime.
- GrowableArray<CodePtr> code_order;
- RawCodeSet code_set;
- for (auto& command : writer_commands) {
- if (command.op == ImageWriterCommand::InsertInstructionOfCode) {
- CodePtr code = command.insert_instruction_of_code.code;
- ASSERT(!code_set.HasKey(code));
- code_set.Insert(code);
- code_order.Add(code);
- code_order_length++;
- }
- }
- for (CodePtr code : *code_objects) {
- if (!code_set.HasKey(code)) {
- code_set.Insert(code);
- code_order.Add(code);
- }
- }
- RELEASE_ASSERT(code_order.length() == code_objects->length());
- for (intptr_t i = 0; i < code_objects->length(); ++i) {
- (*code_objects)[i] = code_order[i];
- }
- }
-#endif // defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_IA32)
- return code_order_length;
-}
-
#endif // !defined(DART_PRECOMPILED_RUNTIME)
#if defined(DART_PRECOMPILER) || defined(DART_PRECOMPILED_RUNTIME)
@@ -5978,17 +6008,30 @@
Push(code->ptr()->compressed_stackmaps_);
Push(code->ptr()->code_source_map_);
}
+ {
+ GrowableArray<CodePtr> raw_codes(num_deferred_objects);
+ for (intptr_t i = 0; i < num_deferred_objects; i++) {
+ raw_codes.Add((*unit->deferred_objects())[i]->raw());
+ }
+ PrepareInstructions(&raw_codes);
+ }
Serialize();
- Write(num_deferred_objects);
+ intptr_t start_index = 0;
+ if (num_deferred_objects != 0) {
+ start_index = RefId(unit->deferred_objects()->At(0)->raw());
+ ASSERT(start_index > 0);
+ }
+ WriteUnsigned(start_index);
+ WriteUnsigned(num_deferred_objects);
for (intptr_t i = 0; i < num_deferred_objects; i++) {
const Object* deferred_object = (*unit->deferred_objects())[i];
ASSERT(deferred_object->IsCode());
CodePtr code = static_cast<CodePtr>(deferred_object->raw());
- WriteRootRef(code, "deferred-code");
+ ASSERT(RefId(code) == (start_index + i));
WriteInstructions(code->ptr()->instructions_,
- code->ptr()->unchecked_offset_, code, -1);
+ code->ptr()->unchecked_offset_, code, false);
WriteRootRef(code->ptr()->compressed_stackmaps_, "deferred-code");
WriteRootRef(code->ptr()->code_source_map_, "deferred-code");
}
@@ -6017,6 +6060,7 @@
image_reader_(NULL),
refs_(nullptr),
next_ref_index_(1),
+ previous_text_offset_(0),
clusters_(NULL),
field_table_(thread->isolate()->field_table()) {
if (Snapshot::IncludesCode(kind)) {
@@ -6329,34 +6373,38 @@
return ApiError::New(msg, Heap::kOld);
}
-void Deserializer::ReadInstructions(CodePtr code,
- intptr_t index,
- intptr_t start_index) {
+void Deserializer::ReadInstructions(CodePtr code, bool deferred) {
+ if (deferred) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+ if (FLAG_use_bare_instructions) {
+ uword entry_point = StubCode::NotLoaded().EntryPoint();
+ code->ptr()->entry_point_ = entry_point;
+ code->ptr()->unchecked_entry_point_ = entry_point;
+ code->ptr()->monomorphic_entry_point_ = entry_point;
+ code->ptr()->monomorphic_unchecked_entry_point_ = entry_point;
+ code->ptr()->instructions_length_ = 0;
+ return;
+ }
+#endif
+ InstructionsPtr instr = StubCode::NotLoaded().instructions();
+ uint32_t unchecked_offset = 0;
+ code->ptr()->instructions_ = instr;
+#if defined(DART_PRECOMPILED_RUNTIME)
+ code->ptr()->instructions_length_ = Instructions::Size(instr);
+#else
+ code->ptr()->unchecked_offset_ = unchecked_offset;
+#endif
+ Code::InitializeCachedEntryPointsFrom(code, instr, unchecked_offset);
+ return;
+ }
+
#if defined(DART_PRECOMPILED_RUNTIME)
if (FLAG_use_bare_instructions) {
// There are no serialized RawInstructions objects in this mode.
code->ptr()->instructions_ = Instructions::null();
-
- const uint32_t bare_offset = Read<uint32_t>();
- if ((bare_offset & 0x1) == 0x1) {
- // The low bit being set marks this as a reference to an earlier Code
- // object in the cluster that shared the same deduplicated Instructions
- // object. Thus, retrieve the instructions-related information from there.
- ASSERT((index - start_index) >= code_order_length());
- const uint32_t source_id = (bare_offset >> 1) + start_index;
- auto const source = static_cast<CodePtr>(Ref(source_id));
- code->ptr()->entry_point_ = source->ptr()->entry_point_;
- code->ptr()->unchecked_entry_point_ =
- source->ptr()->unchecked_entry_point_;
- code->ptr()->monomorphic_entry_point_ =
- source->ptr()->monomorphic_entry_point_;
- code->ptr()->monomorphic_unchecked_entry_point_ =
- source->ptr()->monomorphic_unchecked_entry_point_;
- code->ptr()->instructions_length_ = source->ptr()->instructions_length_;
- return;
- }
+ previous_text_offset_ += ReadUnsigned();
const uword payload_start =
- image_reader_->GetBareInstructionsAt(bare_offset);
+ image_reader_->GetBareInstructionsAt(previous_text_offset_);
const uint32_t payload_info = ReadUnsigned();
const uint32_t unchecked_offset = payload_info >> 1;
const bool has_monomorphic_entrypoint = (payload_info & 0x1) == 0x1;
@@ -6377,42 +6425,12 @@
code->ptr()->monomorphic_entry_point_ = monomorphic_entry_point;
code->ptr()->monomorphic_unchecked_entry_point_ =
monomorphic_entry_point + unchecked_offset;
-
- // We don't serialize the length of the instructions payload. Instead, we
- // calculate an approximate length (may include padding) by subtracting the
- // payload start of the next Code object (if any) from the start for this
- // one. Thus, here we patch the instructions length for the previous Code
- // object, if any.
- ASSERT((index - start_index) < code_order_length());
- const uword curr_payload_start = Code::PayloadStartOf(code);
- if (index > start_index) {
- auto const prev = static_cast<CodePtr>(Ref(index - 1));
- const uword prev_payload_start = Code::PayloadStartOf(prev);
- prev->ptr()->instructions_length_ =
- curr_payload_start - prev_payload_start;
- }
- // For the last Code object whose Instructions were written to the
- // instructions image, assume its payload extends to the image's end.
- if ((index - start_index) == code_order_length() - 1) {
- code->ptr()->instructions_length_ =
- image_reader_->GetBareInstructionsEnd() - curr_payload_start;
- }
-
return;
}
#endif
- const uint32_t offset = Read<uint32_t>();
- InstructionsPtr instr;
- uint32_t unchecked_offset;
- if (offset == 0) {
- instr = StubCode::NotLoaded().instructions();
- unchecked_offset = 0;
- } else {
- instr = image_reader_->GetInstructionsAt(offset);
- unchecked_offset = ReadUnsigned();
- }
-
+ InstructionsPtr instr = image_reader_->GetInstructionsAt(Read<uint32_t>());
+ uint32_t unchecked_offset = ReadUnsigned();
code->ptr()->instructions_ = instr;
#if defined(DART_PRECOMPILED_RUNTIME)
code->ptr()->instructions_length_ = Instructions::Size(instr);
@@ -6428,6 +6446,42 @@
Code::InitializeCachedEntryPointsFrom(code, instr, unchecked_offset);
}
+void Deserializer::EndInstructions(const Array& refs,
+ intptr_t start_index,
+ intptr_t stop_index) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+ if (FLAG_use_bare_instructions) {
+ uword previous_end = image_reader_->GetBareInstructionsEnd();
+ for (intptr_t id = stop_index - 1; id >= start_index; id--) {
+ CodePtr code = static_cast<CodePtr>(refs.At(id));
+ uword start = Code::PayloadStartOf(code);
+ ASSERT(start <= previous_end);
+ code->ptr()->instructions_length_ = previous_end - start;
+ previous_end = start;
+ }
+
+ // Build an array of code objects representing the order in which the
+ // [Code]'s instructions will be located in memory.
+ const intptr_t count = stop_index - start_index;
+ const Array& order_table =
+ Array::Handle(zone_, Array::New(count, Heap::kOld));
+ Object& code = Object::Handle(zone_);
+ for (intptr_t i = 0; i < count; i++) {
+ code = refs.At(start_index + i);
+ order_table.SetAt(i, code);
+ }
+ ObjectStore* object_store = Isolate::Current()->object_store();
+ GrowableObjectArray& order_tables =
+ GrowableObjectArray::Handle(zone_, object_store->code_order_tables());
+ if (order_tables.IsNull()) {
+ order_tables = GrowableObjectArray::New(Heap::kOld);
+ object_store->set_code_order_tables(order_tables);
+ }
+ order_tables.Add(order_table, Heap::kOld);
+ }
+#endif
+}
+
ObjectPtr Deserializer::GetObjectAt(uint32_t offset) const {
return image_reader_->GetObjectAt(offset);
}
@@ -6436,7 +6490,6 @@
num_base_objects_ = ReadUnsigned();
num_objects_ = ReadUnsigned();
num_clusters_ = ReadUnsigned();
- code_order_length_ = ReadUnsigned();
const intptr_t field_table_len = ReadUnsigned();
clusters_ = new DeserializationCluster*[num_clusters_];
@@ -6593,12 +6646,12 @@
#endif
for (intptr_t i = 0; i < num_clusters_; i++) {
- clusters_[i]->PostLoad(refs, kind_, zone_);
+ clusters_[i]->PostLoad(this, refs);
}
}
void Deserializer::ReadProgramSnapshot(ObjectStore* object_store) {
- Array& refs = Array::Handle();
+ Array& refs = Array::Handle(zone_);
Prepare();
{
@@ -6642,11 +6695,12 @@
#endif
for (intptr_t i = 0; i < num_clusters_; i++) {
- clusters_[i]->PostLoad(refs, kind_, zone_);
+ clusters_[i]->PostLoad(this, refs);
}
- const Array& units = Array::Handle(isolate->object_store()->loading_units());
+ const Array& units =
+ Array::Handle(zone_, isolate->object_store()->loading_units());
if (!units.IsNull()) {
- LoadingUnit& unit = LoadingUnit::Handle();
+ LoadingUnit& unit = LoadingUnit::Handle(zone_);
unit ^= units.At(LoadingUnit::kRootId);
unit.set_base_objects(refs);
}
@@ -6657,8 +6711,8 @@
}
ApiErrorPtr Deserializer::ReadUnitSnapshot(const LoadingUnit& unit) {
- Array& units =
- Array::Handle(thread()->isolate()->object_store()->loading_units());
+ Array& units = Array::Handle(
+ zone_, thread()->isolate()->object_store()->loading_units());
uint32_t main_program_hash = Smi::Value(Smi::RawCast(units.At(0)));
uint32_t unit_program_hash = Read<uint32_t>();
if (main_program_hash != unit_program_hash) {
@@ -6667,26 +6721,29 @@
"program than the main loading unit")));
}
- Array& refs = Array::Handle();
+ Array& refs = Array::Handle(zone_);
Prepare();
+ intptr_t deferred_start_index;
+ intptr_t deferred_stop_index;
{
NoSafepointScope no_safepoint;
HeapLocker hl(thread(), heap_->old_space());
// N.B.: Skipping index 0 because ref 0 is illegal.
- const Array& base_objects =
- Array::Handle(LoadingUnit::Handle(unit.parent()).base_objects());
+ const Array& base_objects = Array::Handle(
+ zone_, LoadingUnit::Handle(zone_, unit.parent()).base_objects());
for (intptr_t i = 1; i < base_objects.Length(); i++) {
AddBaseObject(base_objects.At(i));
}
Deserialize();
- intptr_t num_deferred = Read<intptr_t>();
- for (intptr_t i = 0; i < num_deferred; i++) {
- CodePtr code = static_cast<CodePtr>(ReadRef());
- ReadInstructions(code, -1, -1);
+ deferred_start_index = ReadUnsigned();
+ deferred_stop_index = deferred_start_index + ReadUnsigned();
+ for (intptr_t id = deferred_start_index; id < deferred_stop_index; id++) {
+ CodePtr code = static_cast<CodePtr>(Ref(id));
+ ReadInstructions(code, false);
if (code->ptr()->owner_->IsFunction()) {
FunctionPtr func = static_cast<FunctionPtr>(code->ptr()->owner_);
uword entry_point = code->ptr()->entry_point_;
@@ -6716,8 +6773,9 @@
isolate->heap()->Verify();
#endif
+ EndInstructions(refs, deferred_start_index, deferred_stop_index);
for (intptr_t i = 0; i < num_clusters_; i++) {
- clusters_[i]->PostLoad(refs, kind_, zone_);
+ clusters_[i]->PostLoad(this, refs);
}
unit.set_base_objects(refs);
diff --git a/runtime/vm/clustered_snapshot.h b/runtime/vm/clustered_snapshot.h
index 252be23..4710372 100644
--- a/runtime/vm/clustered_snapshot.h
+++ b/runtime/vm/clustered_snapshot.h
@@ -60,17 +60,15 @@
LoadingUnitSerializationData* parent() const { return parent_; }
intptr_t num_objects() const { return num_objects_; }
void set_num_objects(intptr_t value) { num_objects_ = value; }
- void AddDeferredObject(ObjectPtr obj) {
- deferred_objects_.Add(&Object::ZoneHandle(obj));
+ void AddDeferredObject(CodePtr obj) {
+ deferred_objects_.Add(&Code::ZoneHandle(obj));
}
- GrowableArray<const Object*>* deferred_objects() {
- return &deferred_objects_;
- }
+ GrowableArray<Code*>* deferred_objects() { return &deferred_objects_; }
private:
intptr_t id_;
LoadingUnitSerializationData* parent_;
- GrowableArray<const Object*> deferred_objects_;
+ GrowableArray<Code*> deferred_objects_;
intptr_t num_objects_;
};
@@ -118,7 +116,7 @@
// Complete any action that requires the full graph to be deserialized, such
// as rehashing.
- virtual void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {}
+ virtual void PostLoad(Deserializer* deserializer, const Array& refs) {}
protected:
// The range of the ref array that belongs to this cluster.
@@ -403,17 +401,19 @@
Write<int32_t>(cid);
}
+ void PrepareInstructions(GrowableArray<CodePtr>* codes);
void WriteInstructions(InstructionsPtr instr,
uint32_t unchecked_offset,
CodePtr code,
- intptr_t index);
+ bool deferred);
uint32_t GetDataOffset(ObjectPtr object) const;
void TraceDataOffset(uint32_t offset);
intptr_t GetDataSize() const;
- intptr_t PrepareCodeOrder();
void WriteDispatchTable(const Array& entries);
+ Heap* heap() const { return heap_; }
+ Zone* zone() const { return zone_; }
Snapshot::Kind kind() const { return kind_; }
intptr_t next_ref_index() const { return next_ref_index_; }
@@ -428,6 +428,9 @@
bool CreateArtificalNodeIfNeeded(ObjectPtr obj);
bool InCurrentLoadingUnit(ObjectPtr obj, bool record = false);
+ GrowableArray<LoadingUnitSerializationData*>* loading_units() {
+ return loading_units_;
+ }
void set_loading_units(GrowableArray<LoadingUnitSerializationData*>* units) {
loading_units_ = units;
}
@@ -491,6 +494,7 @@
intptr_t num_base_objects_;
intptr_t num_written_objects_;
intptr_t next_ref_index_;
+ intptr_t previous_text_offset_;
SmiObjectIdMap smi_ids_;
FieldTable* field_table_;
@@ -687,7 +691,10 @@
return Read<int32_t>();
}
- void ReadInstructions(CodePtr code, intptr_t index, intptr_t start_index);
+ void ReadInstructions(CodePtr code, bool deferred);
+ void EndInstructions(const Array& refs,
+ intptr_t start_index,
+ intptr_t stop_index);
ObjectPtr GetObjectAt(uint32_t offset) const;
void SkipHeader() { stream_.SetPosition(Snapshot::kHeaderSize); }
@@ -701,24 +708,10 @@
intptr_t next_index() const { return next_ref_index_; }
Heap* heap() const { return heap_; }
+ Zone* zone() const { return zone_; }
Snapshot::Kind kind() const { return kind_; }
FieldTable* field_table() const { return field_table_; }
- // The number of code objects which were relocated during AOT snapshot
- // writing.
- //
- // After relocating the instructions in the ".text" segment, the
- // [CodeSerializationCluster] will re-order those code objects that get
- // written out in the cluster. The order will be dictated by the order of
- // the code's instructions in the ".text" segment.
- //
- // The [code_order_length] represents therefore the prefix of code objects in
- // the written out code cluster. (There might be code objects for which no
- // relocation was performed.)
- //
- // This will be used to construct [ObjectStore::code_order_table].
- intptr_t code_order_length() const { return code_order_length_; }
-
private:
Heap* heap_;
Zone* zone_;
@@ -728,9 +721,9 @@
intptr_t num_base_objects_;
intptr_t num_objects_;
intptr_t num_clusters_;
- intptr_t code_order_length_ = 0;
ArrayPtr refs_;
intptr_t next_ref_index_;
+ intptr_t previous_text_offset_;
DeserializationCluster** clusters_;
FieldTable* field_table_;
};
diff --git a/runtime/vm/code_patcher_x64.cc b/runtime/vm/code_patcher_x64.cc
index d9062a4..0077394 100644
--- a/runtime/vm/code_patcher_x64.cc
+++ b/runtime/vm/code_patcher_x64.cc
@@ -397,13 +397,13 @@
CodePtr target() const {
const uword pc = object_pool_.RawValueAt(target_index());
- auto rct = IsolateGroup::Current()->reverse_pc_lookup_cache();
- if (rct->Contains(pc)) {
- return rct->Lookup(pc);
+ CodePtr result = ReversePc::Lookup(IsolateGroup::Current(), pc);
+ if (result != Code::null()) {
+ return result;
}
- rct = Dart::vm_isolate()->group()->reverse_pc_lookup_cache();
- if (rct->Contains(pc)) {
- return rct->Lookup(pc);
+ result = ReversePc::Lookup(Dart::vm_isolate()->group(), pc);
+ if (result != Code::null()) {
+ return result;
}
UNREACHABLE();
}
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index 7d81c2b..f4bacaf 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -2838,6 +2838,53 @@
return;
}
+// The assignment to loading units here must match that in
+// AssignLoadingUnitsCodeVisitor, which runs after compilation is done.
+static intptr_t LoadingUnitOf(Zone* zone, const Function& function) {
+ const Class& cls = Class::Handle(zone, function.Owner());
+ const Library& lib = Library::Handle(zone, cls.library());
+ const LoadingUnit& unit = LoadingUnit::Handle(zone, lib.loading_unit());
+ ASSERT(!unit.IsNull());
+ return unit.id();
+}
+
+static intptr_t LoadingUnitOf(Zone* zone, const Code& code) {
+ // No WeakSerializationReference owners here because those are only
+ // introduced during AOT serialization.
+ if (code.IsStubCode() || code.IsTypeTestStubCode()) {
+ return LoadingUnit::kRootId;
+ } else if (code.IsAllocationStubCode()) {
+ const Class& cls = Class::Cast(Object::Handle(zone, code.owner()));
+ const Library& lib = Library::Handle(zone, cls.library());
+ const LoadingUnit& unit = LoadingUnit::Handle(zone, lib.loading_unit());
+ ASSERT(!unit.IsNull());
+ return unit.id();
+ } else if (code.IsFunctionCode()) {
+ return LoadingUnitOf(zone,
+ Function::Cast(Object::Handle(zone, code.owner())));
+ } else {
+ UNREACHABLE();
+ return LoadingUnit::kIllegalId;
+ }
+}
+
+bool FlowGraphCompiler::CanPcRelativeCall(const Function& target) const {
+ return FLAG_precompiled_mode && FLAG_use_bare_instructions &&
+ (LoadingUnitOf(zone_, function()) == LoadingUnitOf(zone_, target));
+}
+
+bool FlowGraphCompiler::CanPcRelativeCall(const Code& target) const {
+ return FLAG_precompiled_mode && FLAG_use_bare_instructions &&
+ !target.InVMIsolateHeap() &&
+ (LoadingUnitOf(zone_, function()) == LoadingUnitOf(zone_, target));
+}
+
+bool FlowGraphCompiler::CanPcRelativeCall(const AbstractType& target) const {
+ return FLAG_precompiled_mode && FLAG_use_bare_instructions &&
+ !target.InVMIsolateHeap() &&
+ (LoadingUnitOf(zone_, function()) == LoadingUnit::kRootId);
+}
+
#undef __
} // namespace dart
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.h b/runtime/vm/compiler/backend/flow_graph_compiler.h
index 9efcd30..47e9530 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.h
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.h
@@ -1141,6 +1141,10 @@
bool CanCallDart() const { return true; }
#endif
+ bool CanPcRelativeCall(const Function& target) const;
+ bool CanPcRelativeCall(const Code& target) const;
+ bool CanPcRelativeCall(const AbstractType& target) const;
+
// This struct contains either function or code, the other one being NULL.
class StaticCallsStruct : public ZoneAllocated {
public:
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index 65cba11..bfc9b81 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -35,7 +35,7 @@
const auto& stub =
Code::ZoneHandle(object_store->write_barrier_wrappers_stub());
- if (!stub.InVMIsolateHeap()) {
+ if (CanPcRelativeCall(stub)) {
assembler_->generate_invoke_write_barrier_wrapper_ =
[&](Condition condition, Register reg) {
const intptr_t offset_into_target =
@@ -48,7 +48,7 @@
const auto& array_stub =
Code::ZoneHandle(object_store->array_write_barrier_stub());
- if (!array_stub.InVMIsolateHeap()) {
+ if (CanPcRelativeCall(stub)) {
assembler_->generate_invoke_array_write_barrier_ =
[&](Condition condition) {
assembler_->GenerateUnRelocatedPcRelativeCall(condition);
@@ -779,9 +779,8 @@
// If the dst_type is instantiated we know the target TTS stub at
// compile-time and can therefore use a pc-relative call.
- const bool use_pc_relative_call = dst_type.IsInstantiated() &&
- FLAG_precompiled_mode &&
- FLAG_use_bare_instructions;
+ const bool use_pc_relative_call =
+ dst_type.IsInstantiated() && CanPcRelativeCall(dst_type);
const Register kRegToCall =
use_pc_relative_call
@@ -975,8 +974,7 @@
void FlowGraphCompiler::EmitCallToStub(const Code& stub) {
ASSERT(!stub.IsNull());
- if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
- !stub.InVMIsolateHeap()) {
+ if (CanPcRelativeCall(stub)) {
__ GenerateUnRelocatedPcRelativeCall();
AddPcRelativeCallStubTarget(stub);
} else {
@@ -987,8 +985,7 @@
void FlowGraphCompiler::EmitTailCallToStub(const Code& stub) {
ASSERT(!stub.IsNull());
- if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
- !stub.InVMIsolateHeap()) {
+ if (CanPcRelativeCall(stub)) {
__ LeaveDartFrame();
__ GenerateUnRelocatedPcRelativeTailCall();
AddPcRelativeTailCallStubTarget(stub);
@@ -1030,7 +1027,7 @@
const Function& target,
Code::EntryKind entry_kind) {
ASSERT(CanCallDart());
- if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+ if (CanPcRelativeCall(target)) {
__ GenerateUnRelocatedPcRelativeCall();
AddPcRelativeCallTarget(target, entry_kind);
EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index 131308c..b235c33 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -34,7 +34,7 @@
const auto& stub =
Code::ZoneHandle(object_store->write_barrier_wrappers_stub());
- if (!stub.InVMIsolateHeap()) {
+ if (CanPcRelativeCall(stub)) {
assembler_->generate_invoke_write_barrier_wrapper_ = [&](Register reg) {
const intptr_t offset_into_target =
Thread::WriteBarrierWrappersOffsetForRegister(reg);
@@ -45,7 +45,7 @@
const auto& array_stub =
Code::ZoneHandle(object_store->array_write_barrier_stub());
- if (!array_stub.InVMIsolateHeap()) {
+ if (CanPcRelativeCall(stub)) {
assembler_->generate_invoke_array_write_barrier_ = [&]() {
assembler_->GenerateUnRelocatedPcRelativeCall();
AddPcRelativeCallStubTarget(array_stub);
@@ -745,9 +745,8 @@
// If the dst_type is instantiated we know the target TTS stub at
// compile-time and can therefore use a pc-relative call.
- const bool use_pc_relative_call = dst_type.IsInstantiated() &&
- FLAG_precompiled_mode &&
- FLAG_use_bare_instructions;
+ const bool use_pc_relative_call =
+ dst_type.IsInstantiated() && CanPcRelativeCall(dst_type);
const Register kRegToCall =
use_pc_relative_call
@@ -940,8 +939,7 @@
void FlowGraphCompiler::EmitCallToStub(const Code& stub) {
ASSERT(!stub.IsNull());
- if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
- !stub.InVMIsolateHeap()) {
+ if (CanPcRelativeCall(stub)) {
__ GenerateUnRelocatedPcRelativeCall();
AddPcRelativeCallStubTarget(stub);
} else {
@@ -952,8 +950,7 @@
void FlowGraphCompiler::EmitTailCallToStub(const Code& stub) {
ASSERT(!stub.IsNull());
- if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
- !stub.InVMIsolateHeap()) {
+ if (CanPcRelativeCall(stub)) {
__ LeaveDartFrame();
__ GenerateUnRelocatedPcRelativeTailCall();
AddPcRelativeTailCallStubTarget(stub);
@@ -996,7 +993,7 @@
const Function& target,
Code::EntryKind entry_kind) {
ASSERT(CanCallDart());
- if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+ if (CanPcRelativeCall(target)) {
__ GenerateUnRelocatedPcRelativeCall();
AddPcRelativeCallTarget(target, entry_kind);
EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index cf229f3..4b4e217 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -34,7 +34,7 @@
const auto& stub =
Code::ZoneHandle(object_store->write_barrier_wrappers_stub());
- if (!stub.InVMIsolateHeap()) {
+ if (CanPcRelativeCall(stub)) {
assembler_->generate_invoke_write_barrier_wrapper_ = [&](Register reg) {
const intptr_t offset_into_target =
Thread::WriteBarrierWrappersOffsetForRegister(reg);
@@ -45,7 +45,7 @@
const auto& array_stub =
Code::ZoneHandle(object_store->array_write_barrier_stub());
- if (!array_stub.InVMIsolateHeap()) {
+ if (CanPcRelativeCall(stub)) {
assembler_->generate_invoke_array_write_barrier_ = [&]() {
assembler_->GenerateUnRelocatedPcRelativeCall();
AddPcRelativeCallStubTarget(array_stub);
@@ -752,9 +752,8 @@
// If the dst_type is instantiated we know the target TTS stub at
// compile-time and can therefore use a pc-relative call.
- const bool use_pc_relative_call = dst_type.IsInstantiated() &&
- FLAG_precompiled_mode &&
- FLAG_use_bare_instructions;
+ const bool use_pc_relative_call =
+ dst_type.IsInstantiated() && CanPcRelativeCall(dst_type);
const Register kScratchReg =
dst_type.IsTypeParameter() ? RSI : TypeTestABI::kDstTypeReg;
@@ -944,8 +943,7 @@
void FlowGraphCompiler::EmitCallToStub(const Code& stub) {
ASSERT(!stub.IsNull());
- if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
- !stub.InVMIsolateHeap()) {
+ if (CanPcRelativeCall(stub)) {
__ GenerateUnRelocatedPcRelativeCall();
AddPcRelativeCallStubTarget(stub);
} else {
@@ -956,8 +954,7 @@
void FlowGraphCompiler::EmitTailCallToStub(const Code& stub) {
ASSERT(!stub.IsNull());
- if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
- !stub.InVMIsolateHeap()) {
+ if (CanPcRelativeCall(stub)) {
__ LeaveDartFrame();
__ GenerateUnRelocatedPcRelativeTailCall();
AddPcRelativeTailCallStubTarget(stub);
@@ -1000,7 +997,7 @@
Code::EntryKind entry_kind) {
ASSERT(CanCallDart());
ASSERT(is_optimizing());
- if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+ if (CanPcRelativeCall(target)) {
__ GenerateUnRelocatedPcRelativeCall();
AddPcRelativeCallTarget(target, entry_kind);
EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index 2607860..9a09341 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -3773,8 +3773,7 @@
? object_store->stack_overflow_stub_with_fpu_regs_stub()
: object_store->stack_overflow_stub_without_fpu_regs_stub());
const bool using_shared_stub = locs()->call_on_shared_slow_path();
- if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
- using_shared_stub && !stub.InVMIsolateHeap()) {
+ if (using_shared_stub && compiler->CanPcRelativeCall(stub)) {
__ GenerateUnRelocatedPcRelativeCall(LS);
compiler->AddPcRelativeCallStubTarget(stub);
@@ -6576,8 +6575,7 @@
NullErrorSlowPath::GetStub(compiler, exception_type(), live_fpu_regs));
const bool using_shared_stub = locs()->call_on_shared_slow_path();
- if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
- using_shared_stub && !stub.InVMIsolateHeap()) {
+ if (using_shared_stub && compiler->CanPcRelativeCall(stub)) {
__ GenerateUnRelocatedPcRelativeCall(EQUAL);
compiler->AddPcRelativeCallStubTarget(stub);
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 3102576..2a9d946 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -3232,8 +3232,7 @@
? object_store->stack_overflow_stub_with_fpu_regs_stub()
: object_store->stack_overflow_stub_without_fpu_regs_stub());
- if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
- using_shared_stub && !stub.InVMIsolateHeap()) {
+ if (using_shared_stub && compiler->CanPcRelativeCall(stub)) {
__ GenerateUnRelocatedPcRelativeCall();
compiler->AddPcRelativeCallStubTarget(stub);
} else {
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index deb8784..38ac210 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -2121,7 +2121,9 @@
!target::Class::TraceAllocation(cls) &&
target::SizeFitsInSizeTag(instance_size)) {
if (is_cls_parameterized) {
- if (!IsSameObject(NullObject(),
+ // TODO(41974): Assign all allocation stubs to the root loading unit?
+ if (false &&
+ !IsSameObject(NullObject(),
CastHandle<Object>(allocat_object_parametrized))) {
__ GenerateUnRelocatedPcRelativeTailCall();
unresolved_calls->Add(new UnresolvedPcRelativeCall(
@@ -2133,7 +2135,9 @@
allocate_object_parameterized_entry_point_offset()));
}
} else {
- if (!IsSameObject(NullObject(), CastHandle<Object>(allocate_object))) {
+ // TODO(41974): Assign all allocation stubs to the root loading unit?
+ if (false &&
+ !IsSameObject(NullObject(), CastHandle<Object>(allocate_object))) {
__ GenerateUnRelocatedPcRelativeTailCall();
unresolved_calls->Add(new UnresolvedPcRelativeCall(
__ CodeSize(), allocate_object, /*is_tail_call=*/true));
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index db103f75..afc9b10 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -2266,7 +2266,9 @@
!target::Class::TraceAllocation(cls) &&
target::SizeFitsInSizeTag(instance_size)) {
if (is_cls_parameterized) {
- if (!IsSameObject(NullObject(),
+ // TODO(41974): Assign all allocation stubs to the root loading unit?
+ if (false &&
+ !IsSameObject(NullObject(),
CastHandle<Object>(allocat_object_parametrized))) {
__ GenerateUnRelocatedPcRelativeTailCall();
unresolved_calls->Add(new UnresolvedPcRelativeCall(
@@ -2279,7 +2281,9 @@
__ br(R4);
}
} else {
- if (!IsSameObject(NullObject(), CastHandle<Object>(allocate_object))) {
+ // TODO(41974): Assign all allocation stubs to the root loading unit?
+ if (false &&
+ !IsSameObject(NullObject(), CastHandle<Object>(allocate_object))) {
__ GenerateUnRelocatedPcRelativeTailCall();
unresolved_calls->Add(new UnresolvedPcRelativeCall(
__ CodeSize(), allocate_object, /*is_tail_call=*/true));
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index a4a6045..e6566c3 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -2199,7 +2199,9 @@
!target::Class::TraceAllocation(cls) &&
target::SizeFitsInSizeTag(instance_size)) {
if (is_cls_parameterized) {
- if (!IsSameObject(NullObject(),
+ // TODO(41974): Assign all allocation stubs to the root loading unit?
+ if (false &&
+ !IsSameObject(NullObject(),
CastHandle<Object>(allocat_object_parametrized))) {
__ GenerateUnRelocatedPcRelativeTailCall();
unresolved_calls->Add(new UnresolvedPcRelativeCall(
@@ -2210,7 +2212,9 @@
allocate_object_parameterized_entry_point_offset()));
}
} else {
- if (!IsSameObject(NullObject(), CastHandle<Object>(allocate_object))) {
+ // TODO(41974): Assign all allocation stubs to the root loading unit?
+ if (false &&
+ !IsSameObject(NullObject(), CastHandle<Object>(allocate_object))) {
__ GenerateUnRelocatedPcRelativeTailCall();
unresolved_calls->Add(new UnresolvedPcRelativeCall(
__ CodeSize(), allocate_object, /*is_tail_call=*/true));
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index e419af5..0ffe978 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -335,8 +335,6 @@
return Utils::StrDup(error.ToErrorCString());
}
- ReversePcLookupCache::BuildAndAttachToIsolateGroup(vm_isolate_->group());
-
Object::FinishInit(vm_isolate_);
#if defined(SUPPORT_TIMELINE)
if (tbes.enabled()) {
@@ -735,7 +733,6 @@
return error.raw();
}
- ReversePcLookupCache::BuildAndAttachToIsolateGroup(I->group());
I->group()->set_saved_initial_field_table(
std::shared_ptr<FieldTable>(I->field_table()->Clone()));
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index f190dcc..a9dfc83 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1887,6 +1887,17 @@
return Api::NewHandle(T, I->sticky_error());
}
+DART_EXPORT void Dart_HintFreed(intptr_t size) {
+ if (size < 0) {
+ FATAL1("%s requires a non-negative size", CURRENT_FUNC);
+ }
+ Thread* T = Thread::Current();
+ CHECK_ISOLATE(T->isolate());
+ API_TIMELINE_BEGIN_END(T);
+ TransitionNativeToVM transition(T);
+ T->heap()->HintFreed(size);
+}
+
DART_EXPORT void Dart_NotifyIdle(int64_t deadline) {
Thread* T = Thread::Current();
CHECK_ISOLATE(T->isolate());
@@ -6788,9 +6799,9 @@
return Api::NewError(
"This VM was built without support for AOT compilation.");
#else
- if (FLAG_use_bare_instructions) {
+ if (FLAG_use_bare_instructions && FLAG_use_table_dispatch) {
return Api::NewError(
- "Splitting is not compatible with --use_bare_instructions.");
+ "Splitting is not compatible with --use_table_dispatch.");
}
DARTSCOPE(Thread::Current());
@@ -6870,9 +6881,9 @@
return Api::NewError(
"This VM was built without support for AOT compilation.");
#else
- if (FLAG_use_bare_instructions) {
+ if (FLAG_use_bare_instructions && FLAG_use_table_dispatch) {
return Api::NewError(
- "Splitting is not compatible with --use_bare_instructions.");
+ "Splitting is not compatible with --use_table_dispatch.");
}
DARTSCOPE(Thread::Current());
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 84681a8..2c2a4eb 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -8768,7 +8768,39 @@
EXPECT_SUBSTRING("testAsyncEvent", js.ToCString());
}
-void NotifyIdleShortNative(Dart_NativeArguments args) {
+static void HintFreedNative(Dart_NativeArguments args) {
+ int64_t size = 0;
+ EXPECT_VALID(Dart_GetNativeIntegerArgument(args, 0, &size));
+ Dart_HintFreed(size);
+}
+
+static Dart_NativeFunction HintFreed_native_lookup(Dart_Handle name,
+ int argument_count,
+ bool* auto_setup_scope) {
+ return HintFreedNative;
+}
+
+TEST_CASE(DartAPI_HintFreed) {
+ const char* kScriptChars =
+ "void hintFreed(int size) native 'Test_nativeFunc';\n"
+ "void main() {\n"
+ " var v;\n"
+ " for (var i = 0; i < 100; i++) {\n"
+ " var t = [];\n"
+ " for (var j = 0; j < 10000; j++) {\n"
+ " t.add(List.filled(100, null));\n"
+ " }\n"
+ " v = t;\n"
+ " hintFreed(100 * 10000 * 4);\n"
+ " }\n"
+ "}\n";
+ Dart_Handle lib =
+ TestCase::LoadTestScript(kScriptChars, &HintFreed_native_lookup);
+ Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+ EXPECT_VALID(result);
+}
+
+static void NotifyIdleShortNative(Dart_NativeArguments args) {
Dart_NotifyIdle(Dart_TimelineGetMicros() + 10 * kMicrosecondsPerMillisecond);
}
@@ -8776,7 +8808,7 @@
Dart_Handle name,
int argument_count,
bool* auto_setup_scope) {
- return reinterpret_cast<Dart_NativeFunction>(&NotifyIdleShortNative);
+ return NotifyIdleShortNative;
}
TEST_CASE(DartAPI_NotifyIdleShort) {
@@ -8799,7 +8831,7 @@
EXPECT_VALID(result);
}
-void NotifyIdleLongNative(Dart_NativeArguments args) {
+static void NotifyIdleLongNative(Dart_NativeArguments args) {
Dart_NotifyIdle(Dart_TimelineGetMicros() + 100 * kMicrosecondsPerMillisecond);
}
@@ -8807,7 +8839,7 @@
Dart_Handle name,
int argument_count,
bool* auto_setup_scope) {
- return reinterpret_cast<Dart_NativeFunction>(&NotifyIdleLongNative);
+ return NotifyIdleLongNative;
}
TEST_CASE(DartAPI_NotifyIdleLong) {
@@ -8830,7 +8862,7 @@
EXPECT_VALID(result);
}
-void NotifyLowMemoryNative(Dart_NativeArguments args) {
+static void NotifyLowMemoryNative(Dart_NativeArguments args) {
Dart_NotifyLowMemory();
}
@@ -8838,7 +8870,7 @@
Dart_Handle name,
int argument_count,
bool* auto_setup_scope) {
- return reinterpret_cast<Dart_NativeFunction>(&NotifyLowMemoryNative);
+ return NotifyLowMemoryNative;
}
TEST_CASE(DartAPI_NotifyLowMemory) {
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index 8c89691..7e81415 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -405,6 +405,10 @@
ml.NotifyAll();
}
+void Heap::HintFreed(intptr_t size) {
+ old_space_.HintFreed(size);
+}
+
void Heap::NotifyIdle(int64_t deadline) {
Thread* thread = Thread::Current();
// Check if we want to collect new-space first, because if we want to collect
diff --git a/runtime/vm/heap/heap.h b/runtime/vm/heap/heap.h
index bb6652e..fa9d733 100644
--- a/runtime/vm/heap/heap.h
+++ b/runtime/vm/heap/heap.h
@@ -121,6 +121,7 @@
ObjectPtr FindNewObject(FindObjectVisitor* visitor);
ObjectPtr FindObject(FindObjectVisitor* visitor);
+ void HintFreed(intptr_t size);
void NotifyIdle(int64_t deadline);
void NotifyLowMemory();
diff --git a/runtime/vm/heap/pages.cc b/runtime/vm/heap/pages.cc
index b2f4ae4..c0a2597 100644
--- a/runtime/vm/heap/pages.cc
+++ b/runtime/vm/heap/pages.cc
@@ -1709,6 +1709,17 @@
}
}
+void PageSpaceController::HintFreed(intptr_t size) {
+ intptr_t size_in_words = size << kWordSizeLog2;
+ if (size_in_words > idle_gc_threshold_in_words_) {
+ idle_gc_threshold_in_words_ = 0;
+ } else {
+ idle_gc_threshold_in_words_ -= size_in_words;
+ }
+
+ // TODO(rmacnak): Hasten the soft threshold at some discount?
+}
+
void PageSpaceController::MergeFrom(PageSpaceController* donor) {
last_usage_.capacity_in_words += donor->last_usage_.capacity_in_words;
last_usage_.used_in_words += donor->last_usage_.used_in_words;
diff --git a/runtime/vm/heap/pages.h b/runtime/vm/heap/pages.h
index a493190..ef5badf 100644
--- a/runtime/vm/heap/pages.h
+++ b/runtime/vm/heap/pages.h
@@ -228,6 +228,7 @@
int64_t start,
int64_t end);
void EvaluateAfterLoading(SpaceUsage after);
+ void HintFreed(intptr_t size);
void set_last_usage(SpaceUsage current) { last_usage_ = current; }
@@ -318,6 +319,7 @@
void EvaluateAfterLoading() {
page_space_controller_.EvaluateAfterLoading(usage_);
}
+ void HintFreed(intptr_t size) { page_space_controller_.HintFreed(size); }
int64_t UsedInWords() const { return usage_.used_in_words; }
int64_t CapacityInWords() const {
diff --git a/runtime/vm/instructions_arm.cc b/runtime/vm/instructions_arm.cc
index e3a570c..3d6c231 100644
--- a/runtime/vm/instructions_arm.cc
+++ b/runtime/vm/instructions_arm.cc
@@ -315,13 +315,13 @@
CodePtr BareSwitchableCallPattern::target() const {
const uword pc = object_pool_.RawValueAt(target_pool_index_);
- auto rct = IsolateGroup::Current()->reverse_pc_lookup_cache();
- if (rct->Contains(pc)) {
- return rct->Lookup(pc);
+ CodePtr result = ReversePc::Lookup(IsolateGroup::Current(), pc);
+ if (result != Code::null()) {
+ return result;
}
- rct = Dart::vm_isolate()->group()->reverse_pc_lookup_cache();
- if (rct->Contains(pc)) {
- return rct->Lookup(pc);
+ result = ReversePc::Lookup(Dart::vm_isolate()->group(), pc);
+ if (result != Code::null()) {
+ return result;
}
UNREACHABLE();
}
diff --git a/runtime/vm/instructions_arm64.cc b/runtime/vm/instructions_arm64.cc
index 037e777..17b2243 100644
--- a/runtime/vm/instructions_arm64.cc
+++ b/runtime/vm/instructions_arm64.cc
@@ -457,13 +457,13 @@
CodePtr BareSwitchableCallPattern::target() const {
const uword pc = object_pool_.RawValueAt(target_pool_index_);
- auto rct = IsolateGroup::Current()->reverse_pc_lookup_cache();
- if (rct->Contains(pc)) {
- return rct->Lookup(pc);
+ CodePtr result = ReversePc::Lookup(IsolateGroup::Current(), pc);
+ if (result != Code::null()) {
+ return result;
}
- rct = Dart::vm_isolate()->group()->reverse_pc_lookup_cache();
- if (rct->Contains(pc)) {
- return rct->Lookup(pc);
+ result = ReversePc::Lookup(Dart::vm_isolate()->group(), pc);
+ if (result != Code::null()) {
+ return result;
}
UNREACHABLE();
}
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index edeb8db..2ea406b 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -405,9 +405,6 @@
// Ensure we destroy the heap before the other members.
heap_ = nullptr;
ASSERT(marking_stack_ == nullptr);
-
- delete reverse_pc_lookup_cache_;
- reverse_pc_lookup_cache_ = nullptr;
}
void IsolateGroup::RegisterIsolate(Isolate* isolate) {
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index df4b9ab..b8b23a1 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -73,7 +73,6 @@
class ObjectPointerVisitor;
class ObjectStore;
class PersistentHandle;
-class ReversePcLookupCache;
class RwLock;
class SafepointRwLock;
class SafepointHandler;
@@ -582,17 +581,6 @@
ArrayPtr saved_unlinked_calls() const { return saved_unlinked_calls_; }
void set_saved_unlinked_calls(const Array& saved_unlinked_calls);
- // Returns the pc -> code lookup cache object for this isolate.
- ReversePcLookupCache* reverse_pc_lookup_cache() const {
- return reverse_pc_lookup_cache_;
- }
-
- // Sets the pc -> code lookup cache object for this isolate.
- void set_reverse_pc_lookup_cache(ReversePcLookupCache* table) {
- ASSERT(reverse_pc_lookup_cache_ == nullptr);
- reverse_pc_lookup_cache_ = table;
- }
-
FieldTable* saved_initial_field_table() const {
return saved_initial_field_table_.get();
}
@@ -684,7 +672,6 @@
std::unique_ptr<StoreBuffer> store_buffer_;
std::unique_ptr<Heap> heap_;
std::unique_ptr<DispatchTable> dispatch_table_;
- ReversePcLookupCache* reverse_pc_lookup_cache_ = nullptr;
ArrayPtr saved_unlinked_calls_;
std::shared_ptr<FieldTable> saved_initial_field_table_;
uint32_t isolate_group_flags_ = 0;
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 66ccafa..c413708 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -16187,8 +16187,8 @@
}
ObjectPoolPtr Code::GetObjectPool() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
- if (FLAG_use_bare_instructions) {
+#if defined(DART_PRECOMPILER) || defined(DART_PRECOMPILED_RUNTIME)
+ if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
return Isolate::Current()->object_store()->global_object_pool();
}
#endif
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 7be73a4..169161f 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -215,7 +215,7 @@
RW(Code, unreachable_tts_stub) \
RW(Code, slow_tts_stub) \
RW(Array, dispatch_table_code_entries) \
- RW(Array, code_order_table) \
+ RW(GrowableObjectArray, code_order_tables) \
RW(Array, obfuscation_map) \
RW(Class, ffi_pointer_class) \
RW(Class, ffi_native_type_class) \
diff --git a/runtime/vm/program_visitor.cc b/runtime/vm/program_visitor.cc
index 14708e3..13665eb 100644
--- a/runtime/vm/program_visitor.cc
+++ b/runtime/vm/program_visitor.cc
@@ -1402,29 +1402,36 @@
void VisitClass(const Class& cls) {
str_ = cls.Name();
- Hash(str_);
+ VisitInstance(str_);
}
void VisitFunction(const Function& function) {
str_ = function.name();
- Hash(str_);
+ VisitInstance(str_);
}
void VisitCode(const Code& code) {
pool_ = code.object_pool();
- for (intptr_t i = 0; i < pool_.Length(); i++) {
- if (pool_.TypeAt(i) == ObjectPool::EntryType::kTaggedObject) {
- obj_ = pool_.ObjectAt(i);
- if (obj_.IsInstance()) {
- Hash(Instance::Cast(obj_));
- }
- }
- }
+ VisitPool(pool_);
+
instr_ = code.instructions();
hash_ = CombineHashes(hash_, instr_.Hash());
}
- void Hash(const Instance& instance) {
+ void VisitPool(const ObjectPool& pool) {
+ if (pool.IsNull()) return;
+
+ for (intptr_t i = 0; i < pool.Length(); i++) {
+ if (pool.TypeAt(i) == ObjectPool::EntryType::kTaggedObject) {
+ obj_ = pool.ObjectAt(i);
+ if (obj_.IsInstance()) {
+ VisitInstance(Instance::Cast(obj_));
+ }
+ }
+ }
+ }
+
+ void VisitInstance(const Instance& instance) {
hash_ = CombineHashes(hash_, instance.CanonicalizeHash());
}
@@ -1445,6 +1452,8 @@
ProgramHashVisitor visitor(zone);
WalkProgram(zone, thread->isolate(), &visitor);
+ visitor.VisitPool(ObjectPool::Handle(
+ zone, thread->isolate()->object_store()->global_object_pool()));
return visitor.hash();
}
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index b410841..d76ec2f 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -2586,6 +2586,7 @@
friend class Object;
friend class ICData; // For high performance access.
friend class SubtypeTestCache; // For high performance access.
+ friend class ReversePc;
friend class OldPage;
};
@@ -2607,6 +2608,7 @@
ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
friend class SnapshotReader;
+ friend class ReversePc;
};
class LinkedHashMapLayout : public InstanceLayout {
diff --git a/runtime/vm/reverse_pc_lookup_cache.cc b/runtime/vm/reverse_pc_lookup_cache.cc
index e3d45ae..ef62406 100644
--- a/runtime/vm/reverse_pc_lookup_cache.cc
+++ b/runtime/vm/reverse_pc_lookup_cache.cc
@@ -5,52 +5,66 @@
#include "vm/reverse_pc_lookup_cache.h"
#include "vm/isolate.h"
+#include "vm/object.h"
+#include "vm/object_store.h"
namespace dart {
+CodePtr ReversePc::Lookup(IsolateGroup* group,
+ uword pc,
+ bool is_return_address) {
#if defined(DART_PRECOMPILED_RUNTIME)
+ // This can run in the middle of GC and must not allocate handles.
+ NoSafepointScope no_safepoint;
-static uword BeginPcFromCode(const CodePtr code) {
- return Code::PayloadStartOf(code);
-}
+ if (is_return_address) {
+ pc--;
+ }
-static uword EndPcFromCode(const CodePtr code) {
- return Code::PayloadStartOf(code) + Code::PayloadSizeOf(code);
-}
+ // This expected number of tables is low, so we go through them linearly. If
+ // this changes, would could sort the table list during deserialization and
+ // binary search for the table.
+ GrowableObjectArrayPtr tables = group->object_store()->code_order_tables();
+ intptr_t tables_length = Smi::Value(tables->ptr()->length_);
+ for (intptr_t i = 0; i < tables_length; i++) {
+ ArrayPtr table =
+ static_cast<ArrayPtr>(tables->ptr()->data_->ptr()->data()[i]);
+ intptr_t lo = 0;
+ intptr_t hi = Smi::Value(table->ptr()->length_) - 1;
-void ReversePcLookupCache::BuildAndAttachToIsolateGroup(
- IsolateGroup* isolate_group) {
- // This should be called once when the isolate group is created.
- ASSERT(isolate_group->reverse_pc_lookup_cache() == nullptr);
+ // Fast check if pc belongs to this table.
+ if (lo > hi) {
+ continue;
+ }
+ CodePtr first = static_cast<CodePtr>(table->ptr()->data()[lo]);
+ if (pc < Code::PayloadStartOf(first)) {
+ continue;
+ }
+ CodePtr last = static_cast<CodePtr>(table->ptr()->data()[hi]);
+ if (pc >= (Code::PayloadStartOf(last) + Code::PayloadSizeOf(last))) {
+ continue;
+ }
- auto object_store = isolate_group->object_store();
- auto& array = Array::Handle(object_store->code_order_table());
- if (!array.IsNull()) {
- const intptr_t length = array.Length();
- {
- NoSafepointScope no_safepoint_scope;
-
- const uword begin = BeginPcFromCode(static_cast<CodePtr>(array.At(0)));
- const uword end =
- EndPcFromCode(static_cast<CodePtr>(array.At(length - 1)));
-
- auto pc_array = new uint32_t[length];
- for (intptr_t i = 0; i < length; i++) {
- const auto end_pc = EndPcFromCode(static_cast<CodePtr>(array.At(i)));
- pc_array[i] = end_pc - begin;
+ // Binary search within the table for the matching Code.
+ while (lo <= hi) {
+ intptr_t mid = (hi - lo + 1) / 2 + lo;
+ ASSERT(mid >= lo);
+ ASSERT(mid <= hi);
+ CodePtr code = static_cast<CodePtr>(table->ptr()->data()[mid]);
+ uword code_start = Code::PayloadStartOf(code);
+ uword code_end = code_start + Code::PayloadSizeOf(code);
+ if (pc < code_start) {
+ hi = mid - 1;
+ } else if (pc >= code_end) {
+ lo = mid + 1;
+ } else {
+ return code;
}
-#if defined(DEBUG)
- for (intptr_t i = 1; i < length; i++) {
- ASSERT(pc_array[i - 1] <= pc_array[i]);
- }
-#endif // defined(DEBUG)
- auto cache =
- new ReversePcLookupCache(isolate_group, pc_array, length, begin, end);
- isolate_group->set_reverse_pc_lookup_cache(cache);
}
}
-}
-
#endif // defined(DART_PRECOMPILED_RUNTIME)
+ return Code::null();
+}
+
} // namespace dart
diff --git a/runtime/vm/reverse_pc_lookup_cache.h b/runtime/vm/reverse_pc_lookup_cache.h
index d819956..8c45bb1 100644
--- a/runtime/vm/reverse_pc_lookup_cache.h
+++ b/runtime/vm/reverse_pc_lookup_cache.h
@@ -6,135 +6,20 @@
#define RUNTIME_VM_REVERSE_PC_LOOKUP_CACHE_H_
#include "vm/allocation.h"
-#include "vm/growable_array.h"
-#include "vm/object.h"
-#include "vm/object_store.h"
+#include "vm/globals.h"
+#include "vm/tagged_pointer.h"
namespace dart {
-class Isolate;
+class IsolateGroup;
-#if defined(DART_PRECOMPILED_RUNTIME)
-
-// A cache for looking up a Code object based on pc (currently the cache is
-// implemented as a binary-searchable uint32 array)
-//
-// If an AOT snapshot was created with --use_bare_instructions the isolate's
-// object store will contain a `code_order_table` - which is a sorted array
-// of [Code] objects. The order is based on addresses of the code's
-// instructions in memory.
-//
-// For a binary search we would need to touch O(log(array-size)) array entries,
-// code objects and instruction objects.
-//
-// To avoid this we make another uint32 array which is initialized from the end
-// PCs of the instructions (relative to the start pc of the first instruction
-// object).
-//
-// We have the following invariants:
-//
-// BeginPcFromCode(code_array[0]) <= pc_array[0]
-// pc_array[i] == EndPcFromCode(code_array[i])
-// pc_array[i] <= pc_array[i+1]
-//
-// The lookup will then do a binary search in pc_array. The index can then be
-// used in the `code_order_table` of the object store.
-//
-// WARNING: This class cannot do memory allocation or handle allocation!
-class ReversePcLookupCache {
+class ReversePc : public AllStatic {
public:
- ReversePcLookupCache(IsolateGroup* isolate_group,
- uint32_t* pc_array,
- intptr_t length,
- uword first_absolute_pc,
- uword last_absolute_pc)
- : isolate_group_(isolate_group),
- pc_array_(pc_array),
- length_(length),
- first_absolute_pc_(first_absolute_pc),
- last_absolute_pc_(last_absolute_pc) {}
- ~ReversePcLookupCache() { delete[] pc_array_; }
-
- // Builds a [ReversePcLookupCache] and attaches it to the isolate group (if
- // `code_order_table` is non-`null`).
- static void BuildAndAttachToIsolateGroup(IsolateGroup* isolate_group);
-
- // Returns `true` if the given [pc] contains can be mapped to a [Code] object
- // using this cache.
- inline bool Contains(uword pc) {
- return first_absolute_pc_ <= pc && pc <= last_absolute_pc_;
- }
-
- // Looks up the [Code] object from a given [pc].
- //
- // If [is_return_address] is true, then the PC may be immediately after the
- // payload, if the last instruction is a call that is guaranteed not to
- // return. Otherwise, the PC must be within the payload.
- inline CodePtr Lookup(uword pc, bool is_return_address = false) {
- NoSafepointScope no_safepoint_scope;
-
- intptr_t left = 0;
- intptr_t right = length_ - 1;
-
- ASSERT(first_absolute_pc_ <= pc && pc < last_absolute_pc_);
- uint32_t pc_offset = static_cast<uint32_t>(pc - first_absolute_pc_);
-
- while (left < right) {
- intptr_t middle = left + (right - left) / 2;
-
- uword middle_pc = pc_array_[middle];
- if (middle_pc < pc_offset) {
- left = middle + 1;
- } else if (!is_return_address && middle_pc == pc_offset) {
- // This case should only happen if we have bare instruction payloads.
- // Otherwise, the instruction payloads of two RawInstructions objects
- // will never be immediately adjacent in memory due to the header of
- // the second object.
- ASSERT(FLAG_use_bare_instructions);
- left = middle + 1;
- break;
- } else {
- right = middle;
- }
- }
-
- auto code_array = isolate_group_->object_store()->code_order_table();
- auto raw_code = static_cast<CodePtr>(Array::DataOf(code_array)[left]);
-
-#if defined(DEBUG)
- ASSERT(raw_code->GetClassIdMayBeSmi() == kCodeCid);
- ASSERT(Code::ContainsInstructionAt(raw_code, pc));
-#endif
-
- return raw_code;
- }
-
- private:
- IsolateGroup* isolate_group_;
- uint32_t* pc_array_;
- intptr_t length_;
- uword first_absolute_pc_;
- uword last_absolute_pc_;
+ static CodePtr Lookup(IsolateGroup* group,
+ uword pc,
+ bool is_return_address = false);
};
-#else // defined(DART_PRECOMPILED_RUNTIME
-
-class ReversePcLookupCache {
- public:
- ReversePcLookupCache() {}
- ~ReversePcLookupCache() {}
-
- static void BuildAndAttachToIsolateGroup(IsolateGroup* isolate_group) {}
-
- inline bool Contains(uword pc) { return false; }
-
- inline CodePtr Lookup(uword pc, bool is_return_address = false) {
- UNREACHABLE();
- }
-};
-
-#endif // defined(DART_PRECOMPILED_RUNTIME
-
} // namespace dart
#endif // RUNTIME_VM_REVERSE_PC_LOOKUP_CACHE_H_
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 3c5b17b..9c14f6e 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -106,52 +106,47 @@
#endif
}
-IsolateGroup* StackFrame::IsolateGroupOfBareInstructionsFrame() const {
- IsolateGroup* isolate_group = Dart::vm_isolate()->group();
- if (isolate_group->object_store()->code_order_table() != Object::null()) {
- auto rct = isolate_group->reverse_pc_lookup_cache();
- if (rct->Contains(pc())) return isolate_group;
- }
-
- isolate_group = this->isolate_group();
- auto* object_store = isolate_group->object_store();
- if (object_store != nullptr) {
- if (object_store->code_order_table() != Object::null()) {
- auto rct = isolate_group->reverse_pc_lookup_cache();
- if (rct->Contains(pc())) return isolate_group;
- }
- }
-
- return nullptr;
-}
-
bool StackFrame::IsBareInstructionsDartFrame() const {
NoSafepointScope no_safepoint;
- if (auto isolate_group = IsolateGroupOfBareInstructionsFrame()) {
- Code code;
- auto rct = isolate_group->reverse_pc_lookup_cache();
- code = rct->Lookup(pc(), /*is_return_address=*/true);
-
+ Code code;
+ code = ReversePc::Lookup(this->isolate_group(), pc(),
+ /*is_return_address=*/true);
+ if (!code.IsNull()) {
auto const cid = code.OwnerClassId();
ASSERT(cid == kNullCid || cid == kClassCid || cid == kFunctionCid);
return cid == kFunctionCid;
}
+ code = ReversePc::Lookup(Dart::vm_isolate()->group(), pc(),
+ /*is_return_address=*/true);
+ if (!code.IsNull()) {
+ auto const cid = code.OwnerClassId();
+ ASSERT(cid == kNullCid || cid == kClassCid || cid == kFunctionCid);
+ return cid == kFunctionCid;
+ }
+
return false;
}
bool StackFrame::IsBareInstructionsStubFrame() const {
NoSafepointScope no_safepoint;
- if (auto isolate_group = IsolateGroupOfBareInstructionsFrame()) {
- Code code;
- auto rct = isolate_group->reverse_pc_lookup_cache();
- code = rct->Lookup(pc(), /*is_return_address=*/true);
-
+ Code code;
+ code = ReversePc::Lookup(this->isolate_group(), pc(),
+ /*is_return_address=*/true);
+ if (!code.IsNull()) {
auto const cid = code.OwnerClassId();
ASSERT(cid == kNullCid || cid == kClassCid || cid == kFunctionCid);
return cid == kNullCid || cid == kClassCid;
}
+ code = ReversePc::Lookup(Dart::vm_isolate()->group(), pc(),
+ /*is_return_address=*/true);
+ if (!code.IsNull()) {
+ auto const cid = code.OwnerClassId();
+ ASSERT(cid == kNullCid || cid == kClassCid || cid == kFunctionCid);
+ return cid == kNullCid || cid == kClassCid;
+ }
+
return false;
}
@@ -254,9 +249,8 @@
NoSafepointScope no_safepoint;
Code code;
- if (auto isolate_group = IsolateGroupOfBareInstructionsFrame()) {
- auto const rct = isolate_group->reverse_pc_lookup_cache();
- code = rct->Lookup(pc(), /*is_return_address=*/true);
+ if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+ code = GetCodeObject();
} else {
ObjectPtr pc_marker = *(reinterpret_cast<ObjectPtr*>(
fp() + ((is_interpreted() ? kKBCPcMarkerSlotFromFp
@@ -397,11 +391,6 @@
// where Thread::Current() is NULL, so we cannot create a NoSafepointScope.
NoSafepointScope no_safepoint;
#endif
- if (auto isolate_group = IsolateGroupOfBareInstructionsFrame()) {
- auto const rct = isolate_group->reverse_pc_lookup_cache();
- return rct->Lookup(pc(), /*is_return_address=*/true);
- }
-
CodePtr code = GetCodeObject();
if ((code != Code::null()) && Code::OwnerClassIdOf(code) == kFunctionCid) {
return code;
@@ -411,16 +400,28 @@
CodePtr StackFrame::GetCodeObject() const {
ASSERT(!is_interpreted());
- if (auto isolate_group = IsolateGroupOfBareInstructionsFrame()) {
- auto const rct = isolate_group->reverse_pc_lookup_cache();
- return rct->Lookup(pc(), /*is_return_address=*/true);
- } else {
- ObjectPtr pc_marker = *(reinterpret_cast<ObjectPtr*>(
- fp() + runtime_frame_layout.code_from_fp * kWordSize));
- ASSERT((pc_marker == Object::null()) ||
- (pc_marker->GetClassId() == kCodeCid));
- return static_cast<CodePtr>(pc_marker);
+
+#if defined(DART_PRECOMPILED_RUNTIME)
+ if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+ CodePtr code = ReversePc::Lookup(isolate_group(), pc(),
+ /*is_return_address=*/true);
+ if (code != Code::null()) {
+ return code;
+ }
+ code = ReversePc::Lookup(Dart::vm_isolate()->group(), pc(),
+ /*is_return_address=*/true);
+ if (code != Code::null()) {
+ return code;
+ }
+ UNREACHABLE();
}
+#endif // defined(DART_PRECOMPILED_RUNTIME)
+
+ ObjectPtr pc_marker = *(reinterpret_cast<ObjectPtr*>(
+ fp() + runtime_frame_layout.code_from_fp * kWordSize));
+ ASSERT((pc_marker == Object::null()) ||
+ (pc_marker->GetClassId() == kCodeCid));
+ return static_cast<CodePtr>(pc_marker);
}
BytecodePtr StackFrame::LookupDartBytecode() const {
diff --git a/runtime/vm/stack_frame.h b/runtime/vm/stack_frame.h
index 1aeaa66..048ca63 100644
--- a/runtime/vm/stack_frame.h
+++ b/runtime/vm/stack_frame.h
@@ -95,13 +95,6 @@
// Check validity of a frame, used for assertion purposes.
virtual bool IsValid() const;
- // Returns the isolate group containing the bare instructions of the
- // current frame.
- //
- // If the frame does not belong to a bare instructions snapshot, it will
- // return nullptr.
- IsolateGroup* IsolateGroupOfBareInstructionsFrame() const;
-
// Returns true iff the current frame is a bare instructions dart frame.
bool IsBareInstructionsDartFrame() const;
diff --git a/tools/VERSION b/tools/VERSION
index 937cb75..cd9f864 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 10
PATCH 0
-PRERELEASE 18
+PRERELEASE 19
PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/generate_package_config.dart b/tools/generate_package_config.dart
index 0caf03b..c24a655 100755
--- a/tools/generate_package_config.dart
+++ b/tools/generate_package_config.dart
@@ -32,6 +32,7 @@
packageDirectory('pkg/front_end/testcases/nnbd/'),
packageDirectory('pkg/front_end/testcases/nnbd_mixed/'),
packageDirectory('pkg/front_end/testcases/nonfunction_type_aliases/'),
+ packageDirectory('pkg/front_end/testcases/value_class/'),
];
var feAnalyzerSharedPackageDirs = [