Version 2.11.0-182.0.dev
Merge commit '68fd2a9d52802bdcc2db31d9b31a2e128b392f30' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7ecc7c3..e6e8fc7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,11 +2,16 @@
### Core libraries
+#### `dart:io`
+
+* `HttpRequest` will now correctly follow HTTP 308 redirects
+ (`HttpStatus.permanentRedirect`).
+
### Dart VM
### Dart2JS
-* Removed `--no-defer-class-types` and `--no-new-deferred-split'.
+* Removed `--no-defer-class-types` and `--no-new-deferred-split`.
### Tools
@@ -18,8 +23,13 @@
#### Linter
-Updated the Linter to `0.1.119`, which includes:
+Updated the Linter to `0.1.120`, which includes:
+* New lint: `cast_nullable_to_non_nullable`.
+* New lint: `null_check_on_nullable_type_parameter`.
+* New lint: `tighten_type_of_initializing_formals`.
+* Updates to `public_member_apis` to check generic type aliases.
+* (Internal): updates to adopt new analyzer APIs.
* Fixed `close_sinks` to handle `this`-prefixed property accesses.
* New lint: `unnecessary_null_checks`.
* Fixed `unawaited_futures` to handle `Future` subtypes.
@@ -157,9 +167,14 @@
* [Abstract Unix Domain Socket][] is supported on Linux/Android now. Using an
`InternetAddress` with `address` starting with '@' and type being
`InternetAddressType.Unix` will create an abstract Unix Domain Socket.
+* On Windows, file APIs can now handle files and directories identified by
+ long paths (greater than 260 characters). It complies with all restrictions
+ from [Long Path on Windows][]. Note that `Directory.current` does not work
+ with long path.
[#42006]: https://github.com/dart-lang/sdk/issues/42006
[Abstract Unix Domain Socket]: http://man7.org/linux/man-pages/man7/unix.7.html
+[Long Path on Windows]: https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#maximum-path-length-limitation
#### `dart:html`
diff --git a/DEPS b/DEPS
index fbc3992..d0e3e35 100644
--- a/DEPS
+++ b/DEPS
@@ -113,7 +113,7 @@
"intl_tag": "0.16.1",
"jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
"json_rpc_2_rev": "8f189db8f0c299187a0e8fa959dba7e9b0254be5",
- "linter_tag": "0.1.119",
+ "linter_tag": "0.1.120",
"logging_rev": "1590ba0b648a51e7eb3895c612e4b72f72623b6f",
"markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
"markdown_rev": "dbeafd47759e7dd0a167602153bb9c49fb5e5fe7",
diff --git a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
index 7959ff9..037629d 100644
--- a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
@@ -1050,7 +1050,8 @@
@override
bool isUnassigned(Variable variable) {
- return _wrap('isUnassigned($variable)', () => _wrapped.isAssigned(variable),
+ return _wrap(
+ 'isUnassigned($variable)', () => _wrapped.isUnassigned(variable),
isQuery: true);
}
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index 1269bc4..0dc5805 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -1111,17 +1111,17 @@
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const MessageCode messageConstConstructorLateFinalFieldCause =
const MessageCode("ConstConstructorLateFinalFieldCause",
- severity: Severity.context,
- message: r"""Field is late, but constructor is 'const'.""");
+ severity: Severity.context, message: r"""This constructor is const.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeConstConstructorLateFinalFieldError =
messageConstConstructorLateFinalFieldError;
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageConstConstructorLateFinalFieldError =
- const MessageCode("ConstConstructorLateFinalFieldError",
- message: r"""Constructor is marked 'const' so fields can't be late.""");
+const MessageCode messageConstConstructorLateFinalFieldError = const MessageCode(
+ "ConstConstructorLateFinalFieldError",
+ message:
+ r"""Can't have a late final field in a class with a const constructor.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeConstConstructorNonFinalField =
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/definite_unassignment/data/late_initializer.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/definite_unassignment/data/late_initializer.dart
index 794b455..3b9c964 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/definite_unassignment/data/late_initializer.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/definite_unassignment/data/late_initializer.dart
@@ -6,6 +6,8 @@
// doesn't execute immediately, so it may refer to other late variables that
// aren't assigned yet.
+void use(Object? x) {}
+
eagerInitializerRefersToLateVar() {
late int x;
int y = /*unassigned*/ x;
@@ -17,3 +19,9 @@
late int y = x;
x = 0;
}
+
+lateInitializerIsAssignment() {
+ late int y;
+ late int z1 = y = 3;
+ use(y);
+}
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/initialization.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/initialization.dart
index 35f2d63..3d890e8 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/initialization.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/initialization.dart
@@ -55,18 +55,6 @@
x;
}
-localVariable_initialized_nonNull() {
- num? x = 0;
- /*num*/ x;
- x = null;
- x;
-}
-
-localVariable_initialized_nonNull_final() {
- final num? x = 0;
- x;
-}
-
localVariable_initialized_promoted_type_var<T>(T t) {
if (t is num) {
var x = /*T & num*/ t;
@@ -106,13 +94,13 @@
localVariable_initialized_promoted_type_var_typed<T>(T t) {
if (t is num) {
- // This should promote to `T & Object`, because that's the non-nullable
- // version of T, but it shouldn't promote to `T & num`.
+ // TODO(paulberry): This should promote to `T & Object`, because that's the
+ // non-nullable version of T, but it shouldn't promote to `T & num`.
T x = /*T & num*/ t;
- /*T & Object*/ x;
+ x;
// Check that `T & Object` is a type of interest by promoting and then
// writing to it
- if (/*T & Object*/ x is int) {
+ if (x is int) {
/*T & int*/ x;
x = /*T & num*/ t;
/*T & Object*/ x;
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 9e583cc..dc26a16 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
@@ -70,12 +70,13 @@
/// A fix producer that produces changes to fix multiple diagnostics.
class BulkFixProcessor {
/// A map from the name of a lint rule to a list of generators used to create
- /// the correction producer used to build a fix for that diagnostic. Most
- /// entries will have only one generator. In cases where there is more than
- /// one, they will be applied in series and the expectation is that only one
- /// will produce a change for a given fix. If more than one change is produced
- /// the result will almost certainly be invalid code. The generators used for
- /// non-lint diagnostics are in the [nonLintProducerMap].
+ /// the correction producer used to build a fix for that diagnostic. The
+ /// generators used for non-lint diagnostics are in the [nonLintProducerMap].
+ ///
+ /// Most entries will have only one generator. In cases where there is more
+ /// than one, they will be applied in series and the expectation is that only
+ /// one will produce a change for a given fix. If more than one change is
+ /// produced the result will almost certainly be invalid code.
static const Map<String, List<ProducerGenerator>> lintProducerMap = {
LintNames.annotate_overrides: [
AddOverride.newInstance,
@@ -241,9 +242,13 @@
],
};
- /// A map from error codes to a list of generators used to create multiple
+ /// A map from an error code to a list of generators used to create multiple
/// correction producers used to build fixes for those diagnostics. The
/// generators used for lint rules are in the [lintMultiProducerMap].
+ ///
+ /// The expectation is that only one of the correction producers will produce
+ /// a change for a given fix. If more than one change is produced the result
+ /// will almost certainly be invalid code.
static const Map<ErrorCode, List<MultiProducerGenerator>>
nonLintMultiProducerMap = {
CompileTimeErrorCode.EXTENDS_NON_CLASS: [
@@ -304,14 +309,12 @@
CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD: [
DataDriven.newInstance,
],
- // TODO(brianwilkerson) Uncomment the entries below as we add tests for
- // them.
- // HintCode.DEPRECATED_MEMBER_USE: [
- // DataDriven.newInstance,
- // ],
- // HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE: [
- // DataDriven.newInstance,
- // ],
+ HintCode.DEPRECATED_MEMBER_USE: [
+ DataDriven.newInstance,
+ ],
+ HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE: [
+ DataDriven.newInstance,
+ ],
HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD: [
DataDriven.newInstance,
],
@@ -322,16 +325,22 @@
/// lint rules are in the [lintProducerMap].
static const Map<ErrorCode, ProducerGenerator> nonLintProducerMap = {};
+ /// Information about the workspace containing the libraries in which changes
+ /// will be produced.
final DartChangeWorkspace workspace;
/// The change builder used to build the changes required to fix the
/// diagnostics.
ChangeBuilder builder;
+ /// Initialize a newly created processor to create fixes for diagnostics in
+ /// libraries in the [workspace].
BulkFixProcessor(this.workspace) {
builder = ChangeBuilder(workspace: workspace);
}
+ /// Return a change builder that has been used to create fixes for the
+ /// diagnostics in the libraries at the given [libraryPaths].
Future<ChangeBuilder> fixErrorsInLibraries(List<String> libraryPaths) async {
for (var path in libraryPaths) {
var session = workspace.getSession(path);
@@ -344,8 +353,10 @@
return builder;
}
- Future<void> _fixErrorsInLibrary(ResolvedLibraryResult libraryResult) async {
- for (var unitResult in libraryResult.units) {
+ /// Use the change [builder] to create fixes for the diagnostics in the
+ /// library associated with the analysis [result].
+ Future<void> _fixErrorsInLibrary(ResolvedLibraryResult result) async {
+ for (var unitResult in result.units) {
final fixContext = DartFixContextImpl(
workspace,
unitResult,
@@ -358,14 +369,17 @@
}
}
+ /// Use the change [builder] and the [fixContext] to create a fix for the
+ /// given [diagnostic] in the compilation unit associated with the analysis
+ /// [result].
Future<void> _fixSingleError(DartFixContext fixContext,
- ResolvedUnitResult unitResult, AnalysisError error) async {
+ ResolvedUnitResult result, AnalysisError diagnostic) async {
var context = CorrectionProducerContext(
dartFixContext: fixContext,
- diagnostic: error,
- resolvedResult: unitResult,
- selectionOffset: error.offset,
- selectionLength: error.length,
+ diagnostic: diagnostic,
+ resolvedResult: result,
+ selectionOffset: diagnostic.offset,
+ selectionLength: diagnostic.length,
workspace: workspace,
);
@@ -379,7 +393,7 @@
await producer.compute(builder);
}
- var errorCode = error.errorCode;
+ var errorCode = diagnostic.errorCode;
if (errorCode is LintCode) {
var generators = lintProducerMap[errorCode.name];
if (generators != null) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_comparison.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_comparison.dart
new file mode 100644
index 0000000..080bc4f9
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_comparison.dart
@@ -0,0 +1,103 @@
+// 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/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/source/source_range.dart';
+import 'package:analyzer/src/dart/error/hint_codes.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class RemoveComparison extends CorrectionProducer {
+ @override
+ FixKind get fixKind => DartFixKind.REMOVE_COMPARISON;
+
+ /// Return `true` if the null comparison will always return `false`.
+ bool get _conditionIsFalse =>
+ (diagnostic as AnalysisError).errorCode ==
+ HintCode.UNNECESSARY_NULL_COMPARISON_FALSE;
+
+ /// Return `true` if the null comparison will always return `true`.
+ bool get _conditionIsTrue =>
+ (diagnostic as AnalysisError).errorCode ==
+ HintCode.UNNECESSARY_NULL_COMPARISON_TRUE;
+
+ @override
+ Future<void> compute(ChangeBuilder builder) async {
+ if (node is! BinaryExpression) {
+ return;
+ }
+ var binaryExpression = node as BinaryExpression;
+ var parent = binaryExpression.parent;
+ if (parent is AssertInitializer && _conditionIsTrue) {
+ var constructor = parent.parent as ConstructorDeclaration;
+ var list = constructor.initializers;
+ if (list.length == 1) {
+ await builder.addDartFileEdit(file, (builder) {
+ builder.addDeletion(range.endEnd(constructor.parameters, parent));
+ });
+ } else {
+ await builder.addDartFileEdit(file, (builder) {
+ builder.addDeletion(range.nodeInList(list, parent));
+ });
+ }
+ } else if (parent is AssertStatement && _conditionIsTrue) {
+ await builder.addDartFileEdit(file, (builder) {
+ builder.addDeletion(utils.getLinesRange(range.node(parent)));
+ });
+ } else if (parent is BinaryExpression) {
+ if (parent.operator.type == TokenType.AMPERSAND_AMPERSAND &&
+ _conditionIsTrue) {
+ await _removeOperatorAndOperand(builder, parent, node);
+ } else if (parent.operator.type == TokenType.BAR_BAR &&
+ _conditionIsFalse) {
+ await _removeOperatorAndOperand(builder, parent, node);
+ }
+ } else if (parent is IfStatement) {
+ if (parent.elseStatement == null && _conditionIsTrue) {
+ var body = _extractBody(parent);
+ body = utils.indentSourceLeftRight(body);
+ await builder.addDartFileEdit(file, (builder) {
+ builder.addSimpleReplacement(
+ range.startOffsetEndOffset(
+ parent.offset, utils.getLineContentEnd(parent.end)),
+ body);
+ });
+ }
+ }
+ }
+
+ String _extractBody(IfStatement statement) {
+ var body = statement.thenStatement;
+ if (body is Block) {
+ var statements = body.statements;
+ return utils.getRangeText(range.startOffsetEndOffset(
+ statements.first.offset,
+ utils.getLineContentEnd(statements.last.end)));
+ }
+ return utils.getNodeText(body);
+ }
+
+ /// Use the [builder] to add an edit to delete the operator and given
+ /// [operand] from the [binary] expression.
+ Future<void> _removeOperatorAndOperand(ChangeBuilder builder,
+ BinaryExpression binary, Expression operand) async {
+ SourceRange operatorAndOperand;
+ if (binary.leftOperand == node) {
+ operatorAndOperand = range.startStart(node, binary.rightOperand);
+ } else {
+ operatorAndOperand = range.endEnd(binary.leftOperand, node);
+ }
+ await builder.addDartFileEdit(file, (builder) {
+ builder.addDeletion(operatorAndOperand);
+ });
+ }
+
+ /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+ static RemoveComparison newInstance() => RemoveComparison();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 7dd5825..534d910 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -335,6 +335,8 @@
FixKind('dart.fix.remove.argument', 50, 'Remove argument');
static const REMOVE_AWAIT =
FixKind('dart.fix.remove.await', 50, 'Remove await');
+ static const REMOVE_COMPARISON =
+ FixKind('dart.fix.remove.comparison', 50, 'Remove comparison');
static const REMOVE_CONST =
FixKind('dart.fix.remove.const', 50, 'Remove const');
static const REMOVE_DEAD_CODE =
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
index d283e88..e36d5e5 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
@@ -65,6 +65,7 @@
static const String _transformsKey = 'transforms';
static const String _typedefKey = 'typedef';
static const String _urisKey = 'uris';
+ static const String _variableKey = 'variable';
static const String _variablesKey = 'variables';
static const String _versionKey = 'version';
@@ -499,7 +500,8 @@
_methodKey,
_mixinKey,
_setterKey,
- _typedefKey
+ _typedefKey,
+ _variableKey
]);
if (elementKey == null) {
// The error has already been reported.
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 5e44eee..e506f30 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -87,6 +87,7 @@
import 'package:analysis_server/src/services/correction/dart/remove_annotation.dart';
import 'package:analysis_server/src/services/correction/dart/remove_argument.dart';
import 'package:analysis_server/src/services/correction/dart/remove_await.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_comparison.dart';
import 'package:analysis_server/src/services/correction/dart/remove_const.dart';
import 'package:analysis_server/src/services/correction/dart/remove_dead_code.dart';
import 'package:analysis_server/src/services/correction/dart/remove_dead_if_null.dart';
@@ -1012,12 +1013,21 @@
HintCode.UNNECESSARY_CAST: [
RemoveUnnecessaryCast.newInstance,
],
- // TODO(brianwilkerson) Add a fix to remove the method.
-// HintCode.UNNECESSARY_NO_SUCH_METHOD: [],
- // TODO(brianwilkerson) Add a fix to remove the type check.
-// HintCode.UNNECESSARY_TYPE_CHECK_FALSE: [],
- // TODO(brianwilkerson) Add a fix to remove the type check.
-// HintCode.UNNECESSARY_TYPE_CHECK_TRUE: [],
+// HintCode.UNNECESSARY_NO_SUCH_METHOD: [
+// TODO(brianwilkerson) Add a fix to remove the method.
+// ],
+ HintCode.UNNECESSARY_NULL_COMPARISON_FALSE: [
+ RemoveComparison.newInstance,
+ ],
+ HintCode.UNNECESSARY_NULL_COMPARISON_TRUE: [
+ RemoveComparison.newInstance,
+ ],
+// HintCode.UNNECESSARY_TYPE_CHECK_FALSE: [
+// TODO(brianwilkerson) Add a fix to remove the type check.
+// ],
+// HintCode.UNNECESSARY_TYPE_CHECK_TRUE: [
+// TODO(brianwilkerson) Add a fix to remove the type check.
+// ],
HintCode.UNUSED_CATCH_CLAUSE: [
RemoveUnusedCatchClause.newInstance,
],
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/data_driven_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/data_driven_test.dart
index cc14f37..67caf6c 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/data_driven_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/data_driven_test.dart
@@ -33,7 +33,37 @@
@reflectiveTest
class ExtendsNonClassTest extends _DataDrivenTest {
- Future<void> test_rename() async {
+ Future<void> test_rename_deprecated() async {
+ setPackageContent('''
+@deprecated
+class Old {}
+class New {}
+''');
+ addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Rename to New'
+ date: 2020-09-01
+ element:
+ uris: ['$importUri']
+ class: 'Old'
+ changes:
+ - kind: 'rename'
+ newName: 'New'
+''');
+ await resolveTestUnit('''
+import '$importUri';
+class A extends Old {}
+class B extends Old {}
+''');
+ await assertHasFix('''
+import '$importUri';
+class A extends New {}
+class B extends New {}
+''');
+ }
+
+ Future<void> test_rename_removed() async {
setPackageContent('''
class New {}
''');
@@ -66,9 +96,10 @@
class ExtraPositionalArgumentsCouldBeNamedTest extends _DataDrivenTest {
@failingTest
Future<void> test_replaceParameter() async {
- // This fails because we grab the argument from the outer invocation before
- // we modify it, but then we add the edits to modify it, which causes the
- // wrong code to be put in the wrong places.
+ // This fails for two reasons. First, we grab the argument from the outer
+ // invocation before we modify it, which causes the unmodified version of
+ // the argument to be used for the added named parameter. Second, we produce
+ // overlapping edits.
setPackageContent('''
int f(int x, {int y = 0}) => x;
''');
@@ -148,7 +179,37 @@
@reflectiveTest
class ImplementsNonClassTest extends _DataDrivenTest {
- Future<void> test_rename() async {
+ Future<void> test_rename_deprecated() async {
+ setPackageContent('''
+@deprecated
+class Old {}
+class New {}
+''');
+ addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Rename to New'
+ date: 2020-09-01
+ element:
+ uris: ['$importUri']
+ class: 'Old'
+ changes:
+ - kind: 'rename'
+ newName: 'New'
+''');
+ await resolveTestUnit('''
+import '$importUri';
+class A implements Old {}
+class B implements Old {}
+''');
+ await assertHasFix('''
+import '$importUri';
+class A implements New {}
+class B implements New {}
+''');
+ }
+
+ Future<void> test_rename_removed() async {
setPackageContent('''
class New {}
''');
@@ -277,7 +338,37 @@
@reflectiveTest
class MixinOfNonClassTest extends _DataDrivenTest {
- Future<void> test_rename() async {
+ Future<void> test_rename_deprecated() async {
+ setPackageContent('''
+@deprecated
+class Old {}
+class New {}
+''');
+ addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Rename to New'
+ date: 2020-09-01
+ element:
+ uris: ['$importUri']
+ class: 'Old'
+ changes:
+ - kind: 'rename'
+ newName: 'New'
+''');
+ await resolveTestUnit('''
+import '$importUri';
+class A with Old {}
+class B with Old {}
+''');
+ await assertHasFix('''
+import '$importUri';
+class A with New {}
+class B with New {}
+''');
+ }
+
+ Future<void> test_rename_removed() async {
setPackageContent('''
class New {}
''');
@@ -308,7 +399,38 @@
@reflectiveTest
class NewWithUndefinedConstructorDefaultTest extends _DataDrivenTest {
- Future<void> test_rename() async {
+ Future<void> test_rename_deprecated() async {
+ setPackageContent('''
+class C {
+ @deprecated
+ C([C c]);
+ C.new([C c]);
+}
+''');
+ addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Rename to new'
+ date: 2020-09-01
+ element:
+ uris: ['$importUri']
+ constructor: ''
+ inClass: 'C'
+ changes:
+ - kind: 'rename'
+ newName: 'new'
+''');
+ await resolveTestUnit('''
+import '$importUri';
+C c() => C(C());
+''');
+ await assertHasFix('''
+import '$importUri';
+C c() => C.new(C.new());
+''');
+ }
+
+ Future<void> test_rename_removed() async {
setPackageContent('''
class C {
C.new([C c]);
@@ -340,7 +462,7 @@
@reflectiveTest
class NotEnoughPositionalArgumentsTest extends _DataDrivenTest {
- Future<void> test_removeParameter() async {
+ Future<void> test_addParameter() async {
setPackageContent('''
int f(int x, int y) => x + y;
''');
@@ -423,7 +545,35 @@
@reflectiveTest
class UndefinedClassTest extends _DataDrivenTest {
- Future<void> test_rename() async {
+ Future<void> test_rename_deprecated() async {
+ setPackageContent('''
+@deprecated
+class Old {}
+class New {}
+''');
+ addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Rename to New'
+ date: 2020-09-01
+ element:
+ uris: ['$importUri']
+ class: 'Old'
+ changes:
+ - kind: 'rename'
+ newName: 'New'
+''');
+ await resolveTestUnit('''
+import '$importUri';
+void f(Old a, Old b) {}
+''');
+ await assertHasFix('''
+import '$importUri';
+void f(New a, New b) {}
+''');
+ }
+
+ Future<void> test_rename_removed() async {
setPackageContent('''
class New {}
''');
@@ -452,7 +602,39 @@
@reflectiveTest
class UndefinedFunctionTest extends _DataDrivenTest {
- Future<void> test_rename() async {
+ Future<void> test_rename_deprecated() async {
+ setPackageContent('''
+@deprecated
+int old(int x) => x + 1;
+int new(int x) => x + 1;
+''');
+ addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Rename to new'
+ date: 2020-09-01
+ element:
+ uris: ['$importUri']
+ function: 'old'
+ changes:
+ - kind: 'rename'
+ newName: 'new'
+''');
+ await resolveTestUnit('''
+import '$importUri';
+void f() {
+ old(old(0));
+}
+''');
+ await assertHasFix('''
+import '$importUri';
+void f() {
+ new(new(0));
+}
+''');
+ }
+
+ Future<void> test_rename_removed() async {
setPackageContent('''
int new(int x) => x + 1;
''');
@@ -485,7 +667,42 @@
@reflectiveTest
class UndefinedGetterTest extends _DataDrivenTest {
- Future<void> test_rename() async {
+ Future<void> test_rename_deprecated() async {
+ setPackageContent('''
+class C {
+ @deprecated
+ int get old => 0;
+ int get new => 0;
+}
+''');
+ addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Rename to new'
+ date: 2020-09-01
+ element:
+ uris: ['$importUri']
+ getter: 'old'
+ inClass: 'C'
+ changes:
+ - kind: 'rename'
+ newName: 'new'
+''');
+ await resolveTestUnit('''
+import '$importUri';
+void f(C a, C b) {
+ a.old + b.old;
+}
+''');
+ await assertHasFix('''
+import '$importUri';
+void f(C a, C b) {
+ a.new + b.new;
+}
+''');
+ }
+
+ Future<void> test_rename_removed() async {
setPackageContent('''
class C {
int get new => 0;
@@ -521,7 +738,39 @@
@reflectiveTest
class UndefinedIdentifierTest extends _DataDrivenTest {
- Future<void> test_rename_topLevelVariable() async {
+ Future<void> test_rename_topLevelVariable_deprecated() async {
+ setPackageContent('''
+@deprecated
+int old = 0;
+int new = 0;
+''');
+ addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Rename to new'
+ date: 2020-09-01
+ element:
+ uris: ['$importUri']
+ variable: 'old'
+ changes:
+ - kind: 'rename'
+ newName: 'new'
+''');
+ await resolveTestUnit('''
+import '$importUri';
+void f() {
+ old + old;
+}
+''');
+ await assertHasFix('''
+import '$importUri';
+void f() {
+ new + new;
+}
+''');
+ }
+
+ Future<void> test_rename_topLevelVariable_removed() async {
setPackageContent('''
int new = 0;
''');
@@ -532,7 +781,7 @@
date: 2020-09-01
element:
uris: ['$importUri']
- function: 'old'
+ variable: 'old'
changes:
- kind: 'rename'
newName: 'new'
@@ -554,7 +803,42 @@
@reflectiveTest
class UndefinedMethodTest extends _DataDrivenTest {
- Future<void> test_rename() async {
+ Future<void> test_rename_deprecated() async {
+ setPackageContent('''
+class C {
+ @deprecated
+ int old(int x) => x + 1;
+ int new(int x) => x + 1;
+}
+''');
+ addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Rename to new'
+ date: 2020-09-01
+ element:
+ uris: ['$importUri']
+ method: 'old'
+ inClass: 'C'
+ changes:
+ - kind: 'rename'
+ newName: 'new'
+''');
+ await resolveTestUnit('''
+import '$importUri';
+void f(C a, C b) {
+ a.old(b.old(0));
+}
+''');
+ await assertHasFix('''
+import '$importUri';
+void f(C a, C b) {
+ a.new(b.new(0));
+}
+''');
+ }
+
+ Future<void> test_rename_removed() async {
setPackageContent('''
class C {
int new(int x) => x + 1;
@@ -590,7 +874,42 @@
@reflectiveTest
class UndefinedSetterTest extends _DataDrivenTest {
- Future<void> test_rename() async {
+ Future<void> test_rename_deprecated() async {
+ setPackageContent('''
+class C {
+ @deprecated
+ set new(int x) {}
+ set new(int x) {}
+}
+''');
+ addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Rename to new'
+ date: 2020-09-01
+ element:
+ uris: ['$importUri']
+ setter: 'old'
+ inClass: 'C'
+ changes:
+ - kind: 'rename'
+ newName: 'new'
+''');
+ await resolveTestUnit('''
+import '$importUri';
+void f(C a, C b) {
+ a.old = b.old = 1;
+}
+''');
+ await assertHasFix('''
+import '$importUri';
+void f(C a, C b) {
+ a.new = b.new = 1;
+}
+''');
+ }
+
+ Future<void> test_rename_removed() async {
setPackageContent('''
class C {
set new(int x) {}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
index 45e1702..2be023e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
@@ -426,6 +426,24 @@
expect(transform.changes, isEmpty);
}
+ void test_element_variable() {
+ parse('''
+version: 1
+transforms:
+- title: 'Rename v'
+ date: 2020-10-01
+ element:
+ uris: ['test.dart']
+ variable: 'v'
+ changes: []
+''');
+ var transforms = result.transformsFor('v', uris);
+ expect(transforms, hasLength(1));
+ var transform = transforms[0];
+ expect(transform.title, 'Rename v');
+ expect(transform.changes, isEmpty);
+ }
+
void test_incomplete() {
parse('''
version: 1
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_comparison_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_comparison_test.dart
new file mode 100644
index 0000000..67590ce
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_comparison_test.dart
@@ -0,0 +1,166 @@
+// 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.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+void main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(RemoveComparisonTest);
+ });
+}
+
+@reflectiveTest
+class RemoveComparisonTest extends FixProcessorTest {
+ @override
+ List<String> get experiments => [EnableString.non_nullable];
+
+ @override
+ FixKind get kind => DartFixKind.REMOVE_COMPARISON;
+
+ Future<void> test_assertInitializer_first() async {
+ await resolveTestUnit('''
+class C {
+ String t;
+ C(String s) : assert(s != null), t = s;
+}
+''');
+ await assertHasFix('''
+class C {
+ String t;
+ C(String s) : t = s;
+}
+''');
+ }
+
+ Future<void> test_assertInitializer_last() async {
+ await resolveTestUnit('''
+class C {
+ String t;
+ C(String s) : t = s, assert(s != null);
+}
+''');
+ await assertHasFix('''
+class C {
+ String t;
+ C(String s) : t = s;
+}
+''');
+ }
+
+ Future<void> test_assertInitializer_middle() async {
+ await resolveTestUnit('''
+class C {
+ String t;
+ String u;
+ C(String s) : t = s, assert(s != null), u = s;
+}
+''');
+ await assertHasFix('''
+class C {
+ String t;
+ String u;
+ C(String s) : t = s, u = s;
+}
+''');
+ }
+
+ Future<void> test_assertInitializer_only() async {
+ await resolveTestUnit('''
+class C {
+ C(String s) : assert(s != null);
+}
+''');
+ await assertHasFix('''
+class C {
+ C(String s);
+}
+''');
+ }
+
+ Future<void> test_assertStatement() async {
+ await resolveTestUnit('''
+void f(String s) {
+ assert(s != null);
+ print(s);
+}
+''');
+ await assertHasFix('''
+void f(String s) {
+ print(s);
+}
+''');
+ }
+
+ Future<void> test_binaryExpression_and_left() async {
+ await resolveTestUnit('''
+void f(String s) {
+ print(s != null && s.isNotEmpty);
+}
+''');
+ await assertHasFix('''
+void f(String s) {
+ print(s.isNotEmpty);
+}
+''');
+ }
+
+ Future<void> test_binaryExpression_and_right() async {
+ await resolveTestUnit('''
+void f(String s) {
+ print(s.isNotEmpty && s != null);
+}
+''');
+ await assertHasFix('''
+void f(String s) {
+ print(s.isNotEmpty);
+}
+''');
+ }
+
+ Future<void> test_binaryExpression_or_left() async {
+ await resolveTestUnit('''
+void f(String s) {
+ print(s == null || s.isEmpty);
+}
+''');
+ await assertHasFix('''
+void f(String s) {
+ print(s.isEmpty);
+}
+''');
+ }
+
+ Future<void> test_binaryExpression_or_right() async {
+ await resolveTestUnit('''
+void f(String s) {
+ print(s.isEmpty || s == null);
+}
+''');
+ await assertHasFix('''
+void f(String s) {
+ print(s.isEmpty);
+}
+''');
+ }
+
+ Future<void> test_ifStatement() async {
+ await resolveTestUnit('''
+void f(String s) {
+ if (s != null) {
+ print(s);
+ }
+}
+''');
+ await assertHasFix('''
+void f(String s) {
+ print(s);
+}
+''');
+ }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
index 7fcd197..d795e61 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
@@ -101,6 +101,7 @@
import 'remove_annotation_test.dart' as remove_annotation;
import 'remove_argument_test.dart' as remove_argument;
import 'remove_await_test.dart' as remove_await;
+import 'remove_comparison_test.dart' as remove_comparison;
import 'remove_const_test.dart' as remove_const;
import 'remove_dead_code_test.dart' as remove_dead_code;
import 'remove_duplicate_case_test.dart' as remove_duplicate_case;
@@ -257,6 +258,7 @@
remove_annotation.main();
remove_argument.main();
remove_await.main();
+ remove_comparison.main();
remove_const.main();
remove_dead_code.main();
remove_duplicate_case.main();
diff --git a/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart b/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
index d6dd68a..f778aef 100644
--- a/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
+++ b/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
@@ -479,6 +479,9 @@
types[i] = _typeSystem.nonNullifyLegacy(types[i]);
}
}
+ for (var i = 0; i < types.length; i++) {
+ types[i] = _typeSystem.demoteType(types[i]);
+ }
}
/// If in a legacy library, return the legacy version of the [type].
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 7082a55..696581e 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -304,6 +304,16 @@
}
@override
+ void visitAssertInitializer(AssertInitializer node) {
+ _isInConstructorInitializer = true;
+ try {
+ super.visitAssertInitializer(node);
+ } finally {
+ _isInConstructorInitializer = false;
+ }
+ }
+
+ @override
void visitAssignmentExpression(AssignmentExpression node) {
TokenType operatorType = node.operator.type;
Expression lhs = node.leftHandSide;
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index be96aee..558ee7d 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1994,17 +1994,12 @@
}
var initializer = node.initializer;
- var parent = node.parent as VariableDeclarationList;
- TypeAnnotation declaredType = parent.type;
- if (initializer != null) {
+ var parent = node.parent;
+ TypeAnnotation declaredType = (parent as VariableDeclarationList).type;
+ if (declaredType == null && initializer != null) {
var initializerStaticType = initializer.staticType;
- if (declaredType == null) {
- if (initializerStaticType is TypeParameterType) {
- _flowAnalysis?.flow?.promote(declaredElement, initializerStaticType);
- }
- } else if (!parent.isFinal) {
- _flowAnalysis?.flow?.write(declaredElement, initializerStaticType,
- viaInitializer: true);
+ if (initializerStaticType is TypeParameterType) {
+ _flowAnalysis?.flow?.promote(declaredElement, initializerStaticType);
}
}
}
diff --git a/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart b/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart
index 970191b..428784d 100644
--- a/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart
+++ b/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart
@@ -192,6 +192,27 @@
);
}
+ /// https://github.com/dart-lang/language/issues/1182#issuecomment-702272641
+ void test_demoteType() {
+ // <T>(T x) -> void
+ var T = typeParameter('T');
+ var rawType = functionTypeNone(
+ typeFormals: [T],
+ parameters: [
+ requiredParameter(type: typeParameterTypeNone(T)),
+ ],
+ returnType: voidNone,
+ );
+
+ var S = typeParameter('S');
+ var S_and_int = typeParameterTypeNone(S, promotedBound: intNone);
+
+ var inferredTypes = _inferCall(rawType, [S_and_int]);
+ var inferredType = inferredTypes[0] as TypeParameterTypeImpl;
+ expect(inferredType.element, S);
+ expect(inferredType.promotedBound, isNull);
+ }
+
void test_fromLegacy_nonNullableBound() {
typeSystem = analysisContext.typeSystemLegacy;
diff --git a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
index d9eda13..be98561 100644
--- a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
@@ -2,6 +2,7 @@
// 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:analyzer/dart/element/type.dart';
import 'package:analyzer/src/error/codes.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -9,12 +10,40 @@
main() {
defineReflectiveSuite(() {
- defineReflectiveTests(InstanceCreationDriverResolutionTest);
+ defineReflectiveTests(InstanceCreationTest);
+ defineReflectiveTests(InstanceCreationWithNullSafetyTest);
});
}
@reflectiveTest
-class InstanceCreationDriverResolutionTest extends PubPackageResolutionTest {
+class InstanceCreationTest extends PubPackageResolutionTest
+ with InstanceCreationTestCases {}
+
+mixin InstanceCreationTestCases on PubPackageResolutionTest {
+ test_demoteType() async {
+ await assertNoErrorsInCode(r'''
+class A<T> {
+ A(T t);
+}
+
+void f<S>(S s) {
+ if (s is int) {
+ A(s);
+ }
+}
+
+''');
+
+ var creation = findNode.instanceCreation('A(s)');
+ var creationType = creation.staticType as InterfaceType;
+
+ assertTypeParameterType(
+ creationType.typeArguments[0],
+ element: findElement.typeParameter('S'),
+ promotedBound: null,
+ );
+ }
+
test_error_newWithInvalidTypeParameters_implicitNew_inference_top() async {
await assertErrorsInCode(r'''
final foo = Map<int>();
@@ -147,3 +176,7 @@
);
}
}
+
+@reflectiveTest
+class InstanceCreationWithNullSafetyTest extends PubPackageResolutionTest
+ with WithNullSafetyMixin, InstanceCreationTestCases {}
diff --git a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
index d83065c..5c49601 100644
--- a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
@@ -393,6 +393,25 @@
expectedType: 'String');
}
+ test_demoteType() async {
+ await assertNoErrorsInCode(r'''
+void test<T>(T t) {}
+
+void f<S>(S s) {
+ if (s is int) {
+ test(s);
+ }
+}
+
+''');
+
+ assertTypeParameterType(
+ findNode.methodInvocation('test(s)').typeArgumentTypes[0],
+ element: findElement.typeParameter('S'),
+ promotedBound: null,
+ );
+ }
+
test_error_ambiguousImport_topFunction() async {
newFile('$testPackageLibPath/a.dart', content: r'''
void foo(int _) {}
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 49dd0da..011e60f 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -703,7 +703,9 @@
void assertType(Object typeOrNode, String expected) {
DartType actual;
- if (typeOrNode is DartType) {
+ if (typeOrNode == null) {
+ actual = typeOrNode;
+ } else if (typeOrNode is DartType) {
actual = typeOrNode;
} else if (typeOrNode is Expression) {
actual = typeOrNode.staticType;
@@ -774,6 +776,15 @@
expect(node.staticType, isNull);
}
+ void assertTypeParameterType(
+ TypeParameterTypeImpl type, {
+ @required TypeParameterElement element,
+ @required String promotedBound,
+ }) {
+ assertElement(type.element, element);
+ assertType(type.promotedBound, promotedBound);
+ }
+
Matcher elementMatcher(
Element declaration, {
bool isLegacy = false,
diff --git a/pkg/analyzer/test/src/diagnostics/implicit_this_reference_in_initializer_test.dart b/pkg/analyzer/test/src/diagnostics/implicit_this_reference_in_initializer_test.dart
index 3b81868..45493d4 100644
--- a/pkg/analyzer/test/src/diagnostics/implicit_this_reference_in_initializer_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/implicit_this_reference_in_initializer_test.dart
@@ -36,6 +36,43 @@
''');
}
+ test_constructorInitializer_assert_superClass() async {
+ await assertErrorsInCode(r'''
+class A {
+ int get f => 0;
+}
+
+class B extends A {
+ B() : assert(f != 0);
+}
+''', [
+ error(CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, 66, 1),
+ ]);
+ }
+
+ test_constructorInitializer_assert_thisClass() async {
+ await assertErrorsInCode(r'''
+class A {
+ A() : assert(f != 0);
+ int get f => 0;
+}
+''', [
+ error(CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, 25, 1),
+ ]);
+ }
+
+ test_constructorInitializer_field() async {
+ await assertErrorsInCode(r'''
+class A {
+ var v;
+ A() : v = f;
+ var f;
+}
+''', [
+ error(CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, 31, 1),
+ ]);
+ }
+
test_constructorName() async {
await assertNoErrorsInCode(r'''
class A {
@@ -48,18 +85,6 @@
''');
}
- test_field() async {
- await assertErrorsInCode(r'''
-class A {
- var v;
- A() : v = f;
- var f;
-}
-''', [
- error(CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, 31, 1),
- ]);
- }
-
test_field2() async {
await assertErrorsInCode(r'''
class A {
diff --git a/pkg/build_integration/lib/file_system/single_root.dart b/pkg/build_integration/lib/file_system/single_root.dart
index 175379d..03c73df 100644
--- a/pkg/build_integration/lib/file_system/single_root.dart
+++ b/pkg/build_integration/lib/file_system/single_root.dart
@@ -2,8 +2,6 @@
// 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 'dart:async';
-
import 'package:front_end/src/api_unstable/build_integration.dart';
/// A [FileSystem] that resolves custom URIs to entities under a specified root
diff --git a/pkg/build_integration/pubspec.yaml b/pkg/build_integration/pubspec.yaml
index 7d5fb5db..7bef2ba 100644
--- a/pkg/build_integration/pubspec.yaml
+++ b/pkg/build_integration/pubspec.yaml
@@ -6,7 +6,7 @@
publish_to: none
environment:
- sdk: '>=2.0.0 <3.0.0'
+ sdk: '>=2.1.0 <3.0.0'
dependencies:
front_end: ^0.1.0
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
index 4bcc834..b240200 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
@@ -1590,7 +1590,7 @@
@override
TypeInformation visitLogicalExpression(ir.LogicalExpression node) {
- if (node.operator == '&&') {
+ if (node.operatorEnum == ir.LogicalExpressionOperator.AND) {
LocalState stateBefore = _state;
_state = new LocalState.childPath(stateBefore);
TypeInformation leftInfo = handleCondition(node.left);
@@ -1615,7 +1615,7 @@
}
// TODO(sra): Add a selector/mux node to improve precision.
return _types.boolType;
- } else if (node.operator == '||') {
+ } else if (node.operatorEnum == ir.LogicalExpressionOperator.OR) {
LocalState stateBefore = _state;
_state = new LocalState.childPath(stateBefore);
TypeInformation leftInfo = handleCondition(node.left);
@@ -1642,7 +1642,7 @@
return _types.boolType;
}
failedAt(CURRENT_ELEMENT_SPANNABLE,
- "Unexpected logical operator '${node.operator}'.");
+ "Unexpected logical operator '${node.operatorEnum}'.");
return null;
}
diff --git a/pkg/compiler/lib/src/ir/constants.dart b/pkg/compiler/lib/src/ir/constants.dart
index a905b0c..d1ddfd7 100644
--- a/pkg/compiler/lib/src/ir/constants.dart
+++ b/pkg/compiler/lib/src/ir/constants.dart
@@ -49,13 +49,16 @@
@override
ir.Constant evaluate(
ir.StaticTypeContext staticTypeContext, ir.Expression node,
- {bool requireConstant: true, bool replaceImplicitConstant: true}) {
+ {ir.TreeNode contextNode,
+ bool requireConstant: true,
+ bool replaceImplicitConstant: true}) {
errorReporter.requiresConstant = requireConstant;
if (node is ir.ConstantExpression) {
ir.Constant constant = node.constant;
if (constant is ir.UnevaluatedConstant) {
- ir.Constant result =
- super.evaluate(staticTypeContext, constant.expression);
+ ir.Constant result = super.evaluate(
+ staticTypeContext, constant.expression,
+ contextNode: contextNode);
assert(
result is ir.UnevaluatedConstant ||
!result.accept(const UnevaluatedConstantFinder()),
@@ -68,10 +71,11 @@
return constant;
}
if (requireConstant) {
- return super.evaluate(staticTypeContext, node);
+ return super.evaluate(staticTypeContext, node, contextNode: contextNode);
} else {
try {
- ir.Constant constant = super.evaluate(staticTypeContext, node);
+ ir.Constant constant =
+ super.evaluate(staticTypeContext, node, contextNode: contextNode);
if (constant is ir.UnevaluatedConstant &&
constant.expression is ir.InvalidExpression) {
return null;
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index 9180994..bcc2bf3 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -879,7 +879,7 @@
@override
ir.DartType visitLogicalExpression(ir.LogicalExpression node) {
- if (node.operator == '&&') {
+ if (node.operatorEnum == ir.LogicalExpressionOperator.AND) {
visitNode(node.left);
TypeMap afterLeftWhenTrue = typeMapWhenTrue;
TypeMap afterLeftWhenFalse = typeMapWhenFalse;
diff --git a/pkg/compiler/lib/src/js_backend/impact_transformer.dart b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
index ed37f59..474f127 100644
--- a/pkg/compiler/lib/src/js_backend/impact_transformer.dart
+++ b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
@@ -18,6 +18,7 @@
import '../js_emitter/native_emitter.dart';
import '../native/enqueue.dart';
import '../native/behavior.dart';
+import '../universe/call_structure.dart';
import '../universe/feature.dart';
import '../universe/selector.dart';
import '../universe/use.dart';
@@ -411,6 +412,14 @@
for (ConstantUse constantUse in impact.constantUses) {
switch (constantUse.value.kind) {
+ case ConstantValueKind.SET:
+ case ConstantValueKind.MAP:
+ case ConstantValueKind.CONSTRUCTED:
+ case ConstantValueKind.INSTANTIATION:
+ case ConstantValueKind.LIST:
+ transformed.registerStaticUse(StaticUse.staticInvoke(
+ _closedWorld.commonElements.findType, CallStructure.ONE_ARG));
+ break;
case ConstantValueKind.DEFERRED_GLOBAL:
_closedWorld.outputUnitData
.registerConstantDeferredUse(constantUse.value);
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index b169612..d80c190 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -3010,12 +3010,8 @@
@override
void visitLogicalExpression(ir.LogicalExpression node) {
SsaBranchBuilder brancher = new SsaBranchBuilder(this);
- String operator = node.operator;
- // ir.LogicalExpression claims to allow '??' as an operator but currently
- // that is expanded into a let-tree.
- assert(operator == '&&' || operator == '||');
_handleLogicalExpression(node.left, () => node.right.accept(this), brancher,
- operator, _sourceInformationBuilder.buildBinary(node));
+ node.operatorEnum, _sourceInformationBuilder.buildBinary(node));
}
/// Optimizes logical binary expression where the left has the same logical
@@ -3031,22 +3027,22 @@
ir.Expression left,
void visitRight(),
SsaBranchBuilder brancher,
- String operator,
+ ir.LogicalExpressionOperator operatorEnum,
SourceInformation sourceInformation) {
- if (left is ir.LogicalExpression && left.operator == operator) {
+ if (left is ir.LogicalExpression && left.operatorEnum == operatorEnum) {
ir.Expression innerLeft = left.left;
ir.Expression middle = left.right;
_handleLogicalExpression(
innerLeft,
- () => _handleLogicalExpression(middle, visitRight, brancher, operator,
- _sourceInformationBuilder.buildBinary(middle)),
+ () => _handleLogicalExpression(middle, visitRight, brancher,
+ operatorEnum, _sourceInformationBuilder.buildBinary(middle)),
brancher,
- operator,
+ operatorEnum,
sourceInformation);
} else {
brancher.handleLogicalBinary(
() => left.accept(this), visitRight, sourceInformation,
- isAnd: operator == '&&');
+ isAnd: operatorEnum == ir.LogicalExpressionOperator.AND);
}
}
diff --git a/pkg/dds/CHANGELOG.md b/pkg/dds/CHANGELOG.md
index dcacb48..f959b95 100644
--- a/pkg/dds/CHANGELOG.md
+++ b/pkg/dds/CHANGELOG.md
@@ -1,3 +1,8 @@
+# 1.4.1
+- Fixed issue where `evaluate` and `evaluateInFrame` requests were not being
+ forwarded to the VM service properly when no external compilation service
+ was registered.
+
# 1.4.0
- Added `done` property to `DartDevelopmentService`.
- Throw `DartDeveloperServiceException` when shutdown occurs during startup.
diff --git a/pkg/dds/lib/src/expression_evaluator.dart b/pkg/dds/lib/src/expression_evaluator.dart
index d514d60..348d8f4 100644
--- a/pkg/dds/lib/src/expression_evaluator.dart
+++ b/pkg/dds/lib/src/expression_evaluator.dart
@@ -11,6 +11,18 @@
_ExpressionEvaluator(this.dds);
Future<Map<String, dynamic>> execute(json_rpc.Parameters parameters) async {
+ _DartDevelopmentServiceClient externalClient =
+ dds.clientManager.findFirstClientThatHandlesService(
+ 'compileExpression',
+ );
+ // If no compilation service is registered, just forward to the VM service.
+ if (externalClient == null) {
+ return await dds._vmServiceClient.sendRequest(
+ parameters.method,
+ parameters.value,
+ );
+ }
+
final isolateId = parameters['isolateId'].asString;
final expression = parameters['expression'].asString;
Map<String, dynamic> buildScopeResponse;
@@ -56,6 +68,11 @@
dds.clientManager.findFirstClientThatHandlesService(
'compileExpression',
);
+ if (externalClient == null) {
+ throw _RpcErrorCodes.buildRpcException(
+ _RpcErrorCodes.kExpressionCompilationError,
+ data: 'compileExpression service disappeared.');
+ }
final compileParams = <String, dynamic>{
'isolateId': isolateId,
@@ -70,20 +87,11 @@
if (klass != null) {
compileParams['klass'] = klass;
}
- // TODO(bkonyi): handle service disappeared case?
try {
- if (externalClient != null) {
- return (await externalClient.sendRequest(
- 'compileExpression',
- compileParams,
- ))['kernelBytes'];
- } else {
- // Fallback to compiling using the kernel service.
- return (await dds._vmServiceClient.sendRequest(
- '_compileExpression',
- compileParams,
- ))['kernelBytes'];
- }
+ return (await externalClient.sendRequest(
+ 'compileExpression',
+ compileParams,
+ ))['kernelBytes'];
} on json_rpc.RpcException catch (e) {
throw _RpcErrorCodes.buildRpcException(
_RpcErrorCodes.kExpressionCompilationError,
diff --git a/pkg/dds/pubspec.yaml b/pkg/dds/pubspec.yaml
index 1874281..a7ae669 100644
--- a/pkg/dds/pubspec.yaml
+++ b/pkg/dds/pubspec.yaml
@@ -3,7 +3,7 @@
A library used to spawn the Dart Developer Service, used to communicate with
a Dart VM Service instance.
-version: 1.4.0
+version: 1.4.1
homepage: https://github.com/dart-lang/sdk/tree/master/pkg/dds
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index f4d1611..9c2d399 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -964,6 +964,11 @@
js_ast.ClassExpression(
_emitTemporaryId(mixinName), baseClass, forwardingMethodStubs)
]));
+ // Emit a deferred superclass statement for virtual mixin classes since
+ // dart.mixinOn requires the virtual object to have a valid prototype.
+ var virtualSupertype = baseClass ?? emitDeferredType(supertype);
+ body.add(
+ runtimeStatement('setBaseClass(#, #)', [mixinId, virtualSupertype]));
emitMixinConstructors(mixinId, mixinType);
hasUnnamedSuper = hasUnnamedSuper || _hasUnnamedConstructor(mixinClass);
@@ -3429,9 +3434,9 @@
return js.call(code, [_visitTest(node.left), _visitTest(node.right)]);
}
- var op = node.operator;
- if (op == '&&') return shortCircuit('# && #');
- if (op == '||') return shortCircuit('# || #');
+ var op = node.operatorEnum;
+ if (op == LogicalExpressionOperator.AND) return shortCircuit('# && #');
+ if (op == LogicalExpressionOperator.OR) return shortCircuit('# || #');
}
if (node is AsExpression && node.isTypeError) {
diff --git a/pkg/front_end/analysis_options.yaml b/pkg/front_end/analysis_options.yaml
index 9021253..21d20ef 100644
--- a/pkg/front_end/analysis_options.yaml
+++ b/pkg/front_end/analysis_options.yaml
@@ -17,4 +17,5 @@
- valid_regexps
- package_api_docs
- lines_longer_than_80_chars
+ - unrelated_type_equality_checks
# - always_specify_types
diff --git a/pkg/front_end/lib/src/api_prototype/language_version.dart b/pkg/front_end/lib/src/api_prototype/language_version.dart
index 2ce4a67..a77b716 100644
--- a/pkg/front_end/lib/src/api_prototype/language_version.dart
+++ b/pkg/front_end/lib/src/api_prototype/language_version.dart
@@ -7,7 +7,7 @@
import 'package:_fe_analyzer_shared/src/scanner/scanner.dart'
show LanguageVersionToken, Scanner, ScannerConfiguration, scan;
-import 'package:kernel/ast.dart' show Version, defaultLanguageVersion;
+import 'package:kernel/ast.dart' show Version;
export 'package:kernel/ast.dart' show Version;
import 'package:package_config/package_config.dart'
@@ -23,6 +23,8 @@
import 'compiler_options.dart' show CompilerOptions;
+import 'experimental_flags.dart'
+ show ExperimentalFlag, experimentReleasedVersion;
import 'file_system.dart' show FileSystem, FileSystemException;
/// Gets the language version for a specific URI.
@@ -125,11 +127,13 @@
});
}
+/// Returns `true` if the language version of [uri] does not support null
+/// safety.
Future<bool> uriUsesLegacyLanguageVersion(
Uri uri, CompilerOptions options) async {
// This method is here in order to use the opt out hack here for test
// sources.
if (SourceLibraryBuilder.isOptOutTest(uri)) return true;
Version uriVersion = await languageVersionForUri(uri, options);
- return (uriVersion < defaultLanguageVersion);
+ return (uriVersion < experimentReleasedVersion[ExperimentalFlag.nonNullable]);
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index de52a7e..563ab17 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1773,6 +1773,7 @@
}
}
+ /// Handle `a && b` and `a || b`.
void doLogicalExpression(Token token) {
Expression argument = popForValue();
Expression receiver = pop();
@@ -2407,11 +2408,12 @@
assert(assignmentOperator.stringValue == "=");
AssignedVariablesNodeInfo<VariableDeclaration> assignedVariablesInfo;
bool isLate = (currentLocalVariableModifiers & lateMask) != 0;
+ Expression initializer = popForValue();
if (isLate) {
assignedVariablesInfo = typeInferrer?.assignedVariables
?.deferNode(isClosureOrLateVariableInitializer: true);
}
- pushNewLocalVariable(popForValue(), equalsToken: assignmentOperator);
+ pushNewLocalVariable(initializer, equalsToken: assignmentOperator);
if (isLate) {
VariableDeclaration node = peek();
// This is matched by the call to [beginNode] in
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index a9808d6..ea3518e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -727,9 +727,8 @@
return constantEvaluator.evaluate(_staticTypeContext, node);
}
- return constantEvaluator.runInsideContext(treeContext, () {
- return constantEvaluator.evaluate(_staticTypeContext, node);
- });
+ return constantEvaluator.evaluate(_staticTypeContext, node,
+ contextNode: treeContext);
}
Expression makeConstantExpression(Constant constant, Expression node) {
@@ -780,8 +779,6 @@
final BoolConstant trueConstant = new BoolConstant(true);
final BoolConstant falseConstant = new BoolConstant(false);
- final List<TreeNode> contextChain = [];
-
InstanceBuilder instanceBuilder;
EvaluationEnvironment env;
Set<Expression> replacementNodes = new Set<Expression>.identity();
@@ -882,7 +879,8 @@
/// Returns UnevaluatedConstant if the constant could not be evaluated.
/// If the expression in the UnevaluatedConstant is an InvalidExpression,
/// an error occurred during constant evaluation.
- Constant evaluate(StaticTypeContext context, Expression node) {
+ Constant evaluate(StaticTypeContext context, Expression node,
+ {TreeNode contextNode}) {
_staticTypeContext = context;
seenUnevaluatedChild = false;
lazyDepth = 0;
@@ -898,10 +896,9 @@
locatedMessageActualError
];
if (result.context != null) contextMessages.addAll(result.context);
- for (final TreeNode node in contextChain) {
- if (node == result.node) continue;
- final Uri uri = getFileUri(node);
- final int fileOffset = getFileOffset(uri, node);
+ if (contextNode != null && contextNode != result.node) {
+ final Uri uri = getFileUri(contextNode);
+ final int fileOffset = getFileOffset(uri, contextNode);
contextMessages.add(
messageConstEvalContext.withLocation(uri, fileOffset, noLength));
}
@@ -1060,32 +1057,6 @@
return _evaluateSubexpression(node);
}
- T runInsideContext<T>(TreeNode node, T fun()) {
- try {
- pushContext(node);
- return fun();
- } finally {
- popContext(node);
- }
- }
-
- T runInsideContextIfNoContext<T>(TreeNode node, T fun()) {
- if (contextChain.isEmpty) {
- return runInsideContext(node, fun);
- } else {
- return fun();
- }
- }
-
- void pushContext(TreeNode contextNode) {
- contextChain.add(contextNode);
- }
-
- void popContext(TreeNode contextNode) {
- assert(contextChain.last == contextNode);
- contextChain.length = contextChain.length - 1;
- }
-
@override
Constant defaultTreeNode(Node node) {
// Only a subset of the expression language is valid for constant
@@ -1142,9 +1113,7 @@
Constant constant = node.constant;
Constant result = constant;
if (constant is UnevaluatedConstant) {
- result = runInsideContext(constant.expression, () {
- return _evaluateSubexpression(constant.expression);
- });
+ result = _evaluateSubexpression(constant.expression);
if (result is AbortConstant) return result;
}
// If there were already constants in the AST then we make sure we
@@ -1313,25 +1282,23 @@
// Start building a new instance.
return withNewInstanceBuilder(klass, typeArguments, () {
- return runInsideContextIfNoContext(node, () {
- // "Run" the constructor (and any super constructor calls), which will
- // initialize the fields of the new instance.
- if (shouldBeUnevaluated) {
- enterLazy();
- AbortConstant error = handleConstructorInvocation(
- constructor, typeArguments, positionals, named);
- if (error != null) return error;
- leaveLazy();
- return unevaluated(node, instanceBuilder.buildUnevaluatedInstance());
- }
+ // "Run" the constructor (and any super constructor calls), which will
+ // initialize the fields of the new instance.
+ if (shouldBeUnevaluated) {
+ enterLazy();
AbortConstant error = handleConstructorInvocation(
constructor, typeArguments, positionals, named);
if (error != null) return error;
- if (shouldBeUnevaluated) {
- return unevaluated(node, instanceBuilder.buildUnevaluatedInstance());
- }
- return canonicalize(instanceBuilder.buildInstance());
- });
+ leaveLazy();
+ return unevaluated(node, instanceBuilder.buildUnevaluatedInstance());
+ }
+ AbortConstant error = handleConstructorInvocation(
+ constructor, typeArguments, positionals, named);
+ if (error != null) return error;
+ if (shouldBeUnevaluated) {
+ return unevaluated(node, instanceBuilder.buildUnevaluatedInstance());
+ }
+ return canonicalize(instanceBuilder.buildInstance());
});
}
@@ -1524,140 +1491,136 @@
List<DartType> typeArguments,
List<Constant> positionalArguments,
Map<String, Constant> namedArguments) {
- return runInsideContext(constructor, () {
- return withNewEnvironment(() {
- final Class klass = constructor.enclosingClass;
- final FunctionNode function = constructor.function;
+ return withNewEnvironment(() {
+ final Class klass = constructor.enclosingClass;
+ final FunctionNode function = constructor.function;
- // We simulate now the constructor invocation.
+ // We simulate now the constructor invocation.
- // Step 1) Map type arguments and normal arguments from caller to
- // callee.
- for (int i = 0; i < klass.typeParameters.length; i++) {
- env.addTypeParameterValue(klass.typeParameters[i], typeArguments[i]);
- }
- for (int i = 0; i < function.positionalParameters.length; i++) {
- final VariableDeclaration parameter =
- function.positionalParameters[i];
- final Constant value = (i < positionalArguments.length)
- ? positionalArguments[i]
- // TODO(johnniwinther): This should call [_evaluateSubexpression].
- : _evaluateNullableSubexpression(parameter.initializer);
- if (value is AbortConstant) return value;
- env.addVariableValue(parameter, value);
- }
- for (final VariableDeclaration parameter in function.namedParameters) {
- final Constant value = namedArguments[parameter.name] ??
- // TODO(johnniwinther): This should call [_evaluateSubexpression].
- _evaluateNullableSubexpression(parameter.initializer);
- if (value is AbortConstant) return value;
- env.addVariableValue(parameter, value);
- }
+ // Step 1) Map type arguments and normal arguments from caller to
+ // callee.
+ for (int i = 0; i < klass.typeParameters.length; i++) {
+ env.addTypeParameterValue(klass.typeParameters[i], typeArguments[i]);
+ }
+ for (int i = 0; i < function.positionalParameters.length; i++) {
+ final VariableDeclaration parameter = function.positionalParameters[i];
+ final Constant value = (i < positionalArguments.length)
+ ? positionalArguments[i]
+ // TODO(johnniwinther): This should call [_evaluateSubexpression].
+ : _evaluateNullableSubexpression(parameter.initializer);
+ if (value is AbortConstant) return value;
+ env.addVariableValue(parameter, value);
+ }
+ for (final VariableDeclaration parameter in function.namedParameters) {
+ final Constant value = namedArguments[parameter.name] ??
+ // TODO(johnniwinther): This should call [_evaluateSubexpression].
+ _evaluateNullableSubexpression(parameter.initializer);
+ if (value is AbortConstant) return value;
+ env.addVariableValue(parameter, value);
+ }
- // Step 2) Run all initializers (including super calls) with environment
- // setup.
- for (final Field field in klass.fields) {
- if (!field.isStatic) {
- Constant constant =
- _evaluateNullableSubexpression(field.initializer);
- if (constant is AbortConstant) return constant;
- instanceBuilder.setFieldValue(field, constant);
+ // Step 2) Run all initializers (including super calls) with environment
+ // setup.
+ for (final Field field in klass.fields) {
+ if (!field.isStatic) {
+ Constant constant = _evaluateNullableSubexpression(field.initializer);
+ if (constant is AbortConstant) return constant;
+ instanceBuilder.setFieldValue(field, constant);
+ }
+ }
+ for (final Initializer init in constructor.initializers) {
+ if (init is FieldInitializer) {
+ Constant constant = _evaluateSubexpression(init.value);
+ if (constant is AbortConstant) return constant;
+ instanceBuilder.setFieldValue(init.field, constant);
+ } else if (init is LocalInitializer) {
+ final VariableDeclaration variable = init.variable;
+ Constant constant = _evaluateSubexpression(variable.initializer);
+ if (constant is AbortConstant) return constant;
+ env.addVariableValue(variable, constant);
+ } else if (init is SuperInitializer) {
+ AbortConstant error = checkConstructorConst(init, constructor);
+ if (error != null) return error;
+ List<DartType> types = _evaluateSuperTypeArguments(
+ init, constructor.enclosingClass.supertype);
+ if (types == null && _gotError != null) {
+ AbortConstant error = _gotError;
+ _gotError = null;
+ return error;
}
- }
- for (final Initializer init in constructor.initializers) {
- if (init is FieldInitializer) {
- Constant constant = _evaluateSubexpression(init.value);
- if (constant is AbortConstant) return constant;
- instanceBuilder.setFieldValue(init.field, constant);
- } else if (init is LocalInitializer) {
- final VariableDeclaration variable = init.variable;
- Constant constant = _evaluateSubexpression(variable.initializer);
- if (constant is AbortConstant) return constant;
- env.addVariableValue(variable, constant);
- } else if (init is SuperInitializer) {
- AbortConstant error = checkConstructorConst(init, constructor);
- if (error != null) return error;
- List<DartType> types = _evaluateSuperTypeArguments(
- init, constructor.enclosingClass.supertype);
- if (types == null && _gotError != null) {
- AbortConstant error = _gotError;
- _gotError = null;
- return error;
- }
- assert(_gotError == null);
- assert(types != null);
+ assert(_gotError == null);
+ assert(types != null);
- List<Constant> positionalArguments =
- _evaluatePositionalArguments(init.arguments);
- if (positionalArguments == null && _gotError != null) {
- AbortConstant error = _gotError;
- _gotError = null;
- return error;
- }
- assert(_gotError == null);
- assert(positionalArguments != null);
- Map<String, Constant> namedArguments =
- _evaluateNamedArguments(init.arguments);
- if (namedArguments == null && _gotError != null) {
- AbortConstant error = _gotError;
- _gotError = null;
- return error;
- }
- assert(_gotError == null);
- assert(namedArguments != null);
- error = handleConstructorInvocation(
- init.target, types, positionalArguments, namedArguments);
- if (error != null) return error;
- } else if (init is RedirectingInitializer) {
- // Since a redirecting constructor targets a constructor of the same
- // class, we pass the same [typeArguments].
- AbortConstant error = checkConstructorConst(init, constructor);
- if (error != null) return error;
- List<Constant> positionalArguments =
- _evaluatePositionalArguments(init.arguments);
- if (positionalArguments == null && _gotError != null) {
- AbortConstant error = _gotError;
- _gotError = null;
- return error;
- }
- assert(_gotError == null);
- assert(positionalArguments != null);
-
- Map<String, Constant> namedArguments =
- _evaluateNamedArguments(init.arguments);
- if (namedArguments == null && _gotError != null) {
- AbortConstant error = _gotError;
- _gotError = null;
- return error;
- }
- assert(_gotError == null);
- assert(namedArguments != null);
-
- error = handleConstructorInvocation(init.target, typeArguments,
- positionalArguments, namedArguments);
- if (error != null) return error;
- } else if (init is AssertInitializer) {
- AbortConstant error = checkAssert(init.statement);
- if (error != null) return error;
- } else {
- // InvalidInitializer or new Initializers.
- // Probably unreachable. InvalidInitializer is (currently) only
- // created for classes with no constructors that doesn't have a
- // super that takes no arguments. It thus cannot be const.
- // Explicit constructors with incorrect super calls will get a
- // ShadowInvalidInitializer which is actually a LocalInitializer.
- return createInvalidExpressionConstant(
- constructor,
- 'No support for handling initializer of type '
- '"${init.runtimeType}".');
+ List<Constant> positionalArguments =
+ _evaluatePositionalArguments(init.arguments);
+ if (positionalArguments == null && _gotError != null) {
+ AbortConstant error = _gotError;
+ _gotError = null;
+ return error;
}
- }
+ assert(_gotError == null);
+ assert(positionalArguments != null);
+ Map<String, Constant> namedArguments =
+ _evaluateNamedArguments(init.arguments);
+ if (namedArguments == null && _gotError != null) {
+ AbortConstant error = _gotError;
+ _gotError = null;
+ return error;
+ }
+ assert(_gotError == null);
+ assert(namedArguments != null);
+ error = handleConstructorInvocation(
+ init.target, types, positionalArguments, namedArguments);
+ if (error != null) return error;
+ } else if (init is RedirectingInitializer) {
+ // Since a redirecting constructor targets a constructor of the same
+ // class, we pass the same [typeArguments].
+ AbortConstant error = checkConstructorConst(init, constructor);
+ if (error != null) return error;
+ List<Constant> positionalArguments =
+ _evaluatePositionalArguments(init.arguments);
+ if (positionalArguments == null && _gotError != null) {
+ AbortConstant error = _gotError;
+ _gotError = null;
+ return error;
+ }
+ assert(_gotError == null);
+ assert(positionalArguments != null);
- for (UnevaluatedConstant constant in env.unevaluatedUnreadConstants) {
- instanceBuilder.unusedArguments.add(extract(constant));
+ Map<String, Constant> namedArguments =
+ _evaluateNamedArguments(init.arguments);
+ if (namedArguments == null && _gotError != null) {
+ AbortConstant error = _gotError;
+ _gotError = null;
+ return error;
+ }
+ assert(_gotError == null);
+ assert(namedArguments != null);
+
+ error = handleConstructorInvocation(
+ init.target, typeArguments, positionalArguments, namedArguments);
+ if (error != null) return error;
+ } else if (init is AssertInitializer) {
+ AbortConstant error = checkAssert(init.statement);
+ if (error != null) return error;
+ } else {
+ // InvalidInitializer or new Initializers.
+ // Probably unreachable. InvalidInitializer is (currently) only
+ // created for classes with no constructors that doesn't have a
+ // super that takes no arguments. It thus cannot be const.
+ // Explicit constructors with incorrect super calls will get a
+ // ShadowInvalidInitializer which is actually a LocalInitializer.
+ return createInvalidExpressionConstant(
+ constructor,
+ 'No support for handling initializer of type '
+ '"${init.runtimeType}".');
}
- return null;
- });
+ }
+
+ for (UnevaluatedConstant constant in env.unevaluatedUnreadConstants) {
+ instanceBuilder.unusedArguments.add(extract(constant));
+ }
+ return null;
});
}
@@ -1901,11 +1864,13 @@
Constant right = _evaluateSubexpression(node.right);
if (right is AbortConstant) return right;
leaveLazy();
- return unevaluated(node,
- new LogicalExpression(extract(left), node.operator, extract(right)));
+ return unevaluated(
+ node,
+ new LogicalExpression(
+ extract(left), node.operatorEnum, extract(right)));
}
- switch (node.operator) {
- case '||':
+ switch (node.operatorEnum) {
+ case LogicalExpressionOperator.OR:
if (left is BoolConstant) {
if (left.value) return trueConstant;
@@ -1918,7 +1883,7 @@
return createErrorConstant(
node,
templateConstEvalInvalidBinaryOperandType.withArguments(
- node.operator,
+ logicalExpressionOperatorToString(node.operatorEnum),
left,
typeEnvironment.coreTypes.boolLegacyRawType,
right.getType(_staticTypeContext),
@@ -1927,8 +1892,10 @@
return createErrorConstant(
node,
templateConstEvalInvalidMethodInvocation.withArguments(
- node.operator, left, isNonNullableByDefault));
- case '&&':
+ logicalExpressionOperatorToString(node.operatorEnum),
+ left,
+ isNonNullableByDefault));
+ case LogicalExpressionOperator.AND:
if (left is BoolConstant) {
if (!left.value) return falseConstant;
@@ -1941,7 +1908,7 @@
return createErrorConstant(
node,
templateConstEvalInvalidBinaryOperandType.withArguments(
- node.operator,
+ logicalExpressionOperatorToString(node.operatorEnum),
left,
typeEnvironment.coreTypes.boolLegacyRawType,
right.getType(_staticTypeContext),
@@ -1950,18 +1917,17 @@
return createErrorConstant(
node,
templateConstEvalInvalidMethodInvocation.withArguments(
- node.operator, left, isNonNullableByDefault));
- case '??':
- // Unreachable. LogicalExpression never created with `??`.
- return (left is! NullConstant)
- ? left
- : _evaluateSubexpression(node.right);
+ logicalExpressionOperatorToString(node.operatorEnum),
+ left,
+ isNonNullableByDefault));
default:
// Probably unreachable.
return createErrorConstant(
node,
templateConstEvalInvalidMethodInvocation.withArguments(
- node.operator, left, isNonNullableByDefault));
+ logicalExpressionOperatorToString(node.operatorEnum),
+ left,
+ isNonNullableByDefault));
}
}
@@ -2073,16 +2039,14 @@
Constant _evaluateExpressionInContext(Member member, Expression expression) {
StaticTypeContext oldStaticTypeContext = _staticTypeContext;
_staticTypeContext = new StaticTypeContext(member, typeEnvironment);
- Constant constant = runInsideContext(member, () {
- Constant constant = _evaluateSubexpression(expression);
- if (constant is AbortConstant) return constant;
+ Constant constant = _evaluateSubexpression(expression);
+ if (constant is! AbortConstant) {
if (_staticTypeContext.nonNullableByDefaultCompiledMode ==
NonNullableByDefaultCompiledMode.Agnostic &&
evaluationMode == EvaluationMode.weak) {
constant = _weakener.visitConstant(constant) ?? constant;
}
- return constant;
- });
+ }
_staticTypeContext = oldStaticTypeContext;
return constant;
}
@@ -2753,22 +2717,18 @@
T withNewInstanceBuilder<T>(
Class klass, List<DartType> typeArguments, T fn()) {
InstanceBuilder old = instanceBuilder;
- try {
- instanceBuilder = new InstanceBuilder(this, klass, typeArguments);
- return fn();
- } finally {
- instanceBuilder = old;
- }
+ instanceBuilder = new InstanceBuilder(this, klass, typeArguments);
+ T result = fn();
+ instanceBuilder = old;
+ return result;
}
T withNewEnvironment<T>(T fn()) {
final EvaluationEnvironment oldEnv = env;
- try {
- env = new EvaluationEnvironment();
- return fn();
- } finally {
- env = oldEnv;
- }
+ env = new EvaluationEnvironment();
+ T result = fn();
+ env = oldEnv;
+ return result;
}
/// Binary operation between two operands, at least one of which is a double.
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index 90787ec0..b683259 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -424,12 +424,21 @@
}
/// Return a representation of a logical expression at the given [fileOffset]
- /// having the [leftOperand], [rightOperand] and the [operator]
+ /// having the [leftOperand], [rightOperand] and the [operatorString]
/// (either `&&` or `||`).
Expression createLogicalExpression(int fileOffset, Expression leftOperand,
- String operator, Expression rightOperand) {
+ String operatorString, Expression rightOperand) {
assert(fileOffset != null);
- assert(operator == '&&' || operator == '||');
+ LogicalExpressionOperator operator;
+ if (operatorString == '&&') {
+ operator = LogicalExpressionOperator.AND;
+ } else if (operatorString == '||') {
+ operator = LogicalExpressionOperator.OR;
+ } else {
+ throw new UnsupportedError(
+ "Unhandled logical operator '$operatorString'");
+ }
+
return new LogicalExpression(leftOperand, operator, rightOperand)
..fileOffset = fileOffset;
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index 3fb157b..76e41cb 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -1739,15 +1739,15 @@
isVoidAllowed: false);
Expression left = inferrer.ensureAssignableResult(boolType, leftResult);
node.left = left..parent = node;
- inferrer.flowAnalysis
- .logicalBinaryOp_rightBegin(node.left, isAnd: node.operator == '&&');
+ inferrer.flowAnalysis.logicalBinaryOp_rightBegin(node.left,
+ isAnd: node.operatorEnum == LogicalExpressionOperator.AND);
ExpressionInferenceResult rightResult = inferrer.inferExpression(
node.right, boolType, !inferrer.isTopLevel,
isVoidAllowed: false);
Expression right = inferrer.ensureAssignableResult(boolType, rightResult);
node.right = right..parent = node;
- inferrer.flowAnalysis
- .logicalBinaryOp_end(node, node.right, isAnd: node.operator == '&&');
+ inferrer.flowAnalysis.logicalBinaryOp_end(node, node.right,
+ isAnd: node.operatorEnum == LogicalExpressionOperator.AND);
return new ExpressionInferenceResult(boolType, node);
}
@@ -5740,17 +5740,8 @@
}
if (initializerResult != null) {
DartType initializerType = initializerResult.inferredType;
- if (node.isImplicitlyTyped) {
- if (initializerType is TypeParameterType) {
- inferrer.flowAnalysis.promote(node, initializerType);
- }
- } else if (!node.isFinal) {
- // TODO(paulberry): `initializerType` is sometimes `null` during top
- // level inference. Figure out how to prevent this.
- if (initializerType != null) {
- inferrer.flowAnalysis
- .write(node, initializerType, viaInitializer: true);
- }
+ if (node.isImplicitlyTyped && initializerType is TypeParameterType) {
+ inferrer.flowAnalysis.promote(node, initializerType);
}
Expression initializer = inferrer.ensureAssignableResult(
node.type, initializerResult,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index eef5d01..ea4e30f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -932,13 +932,14 @@
SourceLibraryBuilder library = builder.library;
if (library.isNonNullableByDefault) {
if (constructor.isConst && lateFinalFields.isNotEmpty) {
- builder.addProblem(messageConstConstructorLateFinalFieldError,
- constructor.fileOffset, noLength,
- context: lateFinalFields
- .map((field) =>
- messageConstConstructorLateFinalFieldCause.withLocation(
- field.fileUri, field.charOffset, noLength))
- .toList());
+ for (FieldBuilder field in lateFinalFields) {
+ builder.addProblem(messageConstConstructorLateFinalFieldError,
+ field.charOffset, noLength,
+ context: [
+ messageConstConstructorLateFinalFieldCause.withLocation(
+ constructor.fileUri, constructor.fileOffset, noLength)
+ ]);
+ }
lateFinalFields.clear();
}
}
diff --git a/pkg/front_end/lib/src/testing/id_testing_helper.dart b/pkg/front_end/lib/src/testing/id_testing_helper.dart
index c81c0a0..92502bf 100644
--- a/pkg/front_end/lib/src/testing/id_testing_helper.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_helper.dart
@@ -375,7 +375,7 @@
if (member.enclosingClass.isEnum) {
if (member is Constructor ||
member.isInstanceMember ||
- member.name == 'values') {
+ member.name.text == 'values') {
return;
}
}
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 64a47d6..4e76c8b 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -2960,10 +2960,10 @@
severity: CONTEXT
ConstConstructorLateFinalFieldError:
- template: "Constructor is marked 'const' so fields can't be late."
+ template: "Can't have a late final field in a class with a const constructor."
ConstConstructorLateFinalFieldCause:
- template: "Field is late, but constructor is 'const'."
+ template: "This constructor is const."
severity: CONTEXT
ConstConstructorRedirectionToNonConst:
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index af9f637..ed80870 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -153,6 +153,9 @@
const String ENABLE_FULL_COMPILE = " full compile ";
+const String UPDATE_EXPECTATIONS = "updateExpectations";
+const String UPDATE_COMMENTS = "updateComments";
+
const String EXPECTATIONS = '''
[
{
@@ -290,6 +293,9 @@
final bool updateExpectations;
@override
+ String get updateExpectationsOption => '${UPDATE_EXPECTATIONS}=true';
+
+ @override
final ExpectationSet expectationSet =
new ExpectationSet.fromJsonList(jsonDecode(EXPECTATIONS));
@@ -687,8 +693,8 @@
bool weak = environment["weak"] == "true";
bool onlyCrashes = environment["onlyCrashes"] == "true";
bool ignoreExpectations = environment["ignoreExpectations"] == "true";
- bool updateExpectations = environment["updateExpectations"] == "true";
- bool updateComments = environment["updateComments"] == "true";
+ bool updateExpectations = environment[UPDATE_EXPECTATIONS] == "true";
+ bool updateComments = environment[UPDATE_COMMENTS] == "true";
bool skipVm = environment["skipVm"] == "true";
bool verify = environment["verify"] != "false";
bool kernelTextSerialization =
@@ -792,8 +798,8 @@
if (stressConstantEvaluatorVisitor.success > 0) {
result.extraConstantStrings.addAll(stressConstantEvaluatorVisitor.output);
result.extraConstantStrings.add("Extra constant evaluation: "
- "tries: ${stressConstantEvaluatorVisitor.tries}, "
- "successes: ${stressConstantEvaluatorVisitor.success}");
+ "evaluated: ${stressConstantEvaluatorVisitor.tries}, "
+ "effectively constant: ${stressConstantEvaluatorVisitor.success}");
}
return pass(result);
}
@@ -1098,7 +1104,8 @@
description, p, userLibraries, options, sourceTarget),
context.expectationSet["InstrumentationMismatch"],
instrumentation.problemsAsString,
- null);
+ null,
+ autoFixCommand: '${UPDATE_COMMENTS}=true');
}
}
}
diff --git a/pkg/front_end/test/fasta/textual_outline_suite.dart b/pkg/front_end/test/fasta/textual_outline_suite.dart
index db5dda5..aeb3343 100644
--- a/pkg/front_end/test/fasta/textual_outline_suite.dart
+++ b/pkg/front_end/test/fasta/textual_outline_suite.dart
@@ -22,6 +22,7 @@
runMe;
import '../utils/kernel_chain.dart' show MatchContext;
+import 'testing/suite.dart' show UPDATE_EXPECTATIONS;
const List<Map<String, String>> EXPECTATIONS = [
{
@@ -52,6 +53,10 @@
class Context extends ChainContext with MatchContext {
final bool updateExpectations;
+
+ @override
+ String get updateExpectationsOption => '${UPDATE_EXPECTATIONS}=true';
+
Context(this.updateExpectations);
final List<Step> steps = const <Step>[
diff --git a/pkg/front_end/test/parser_suite.dart b/pkg/front_end/test/parser_suite.dart
index 632e9ee..79145fb 100644
--- a/pkg/front_end/test/parser_suite.dart
+++ b/pkg/front_end/test/parser_suite.dart
@@ -46,6 +46,7 @@
TestDescription,
runMe;
+import 'fasta/testing/suite.dart' show UPDATE_EXPECTATIONS;
import 'utils/kernel_chain.dart' show MatchContext;
import 'parser_test_listener.dart' show ParserTestListener;
@@ -86,6 +87,10 @@
class Context extends ChainContext with MatchContext {
final bool updateExpectations;
+
+ @override
+ String get updateExpectationsOption => '${UPDATE_EXPECTATIONS}=true';
+
final bool addTrace;
final bool annotateLines;
final String suiteName;
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index 3b6c56f..9bd21db 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -1377,6 +1377,7 @@
holds
hood
hooks
+horns
horribly
host
hostnames
@@ -1969,6 +1970,7 @@
noticed
notifies
now
+nowhere
null
nullability
nullable
diff --git a/pkg/front_end/test/unit_test_suites.dart b/pkg/front_end/test/unit_test_suites.dart
index 1f42047..c106ebf 100644
--- a/pkg/front_end/test/unit_test_suites.dart
+++ b/pkg/front_end/test/unit_test_suites.dart
@@ -45,9 +45,10 @@
final bool printFailureLog;
final Uri outputDirectory;
final String testFilter;
+ final List<String> environmentOptions;
Options(this.configurationName, this.verbose, this.printFailureLog,
- this.outputDirectory, this.testFilter);
+ this.outputDirectory, this.testFilter, this.environmentOptions);
static Options parse(List<String> args) {
var parser = new ArgParser()
@@ -59,7 +60,9 @@
..addFlag("verbose",
abbr: "v", help: "print additional information", defaultsTo: false)
..addFlag("print",
- abbr: "p", help: "print failure logs", defaultsTo: false);
+ abbr: "p", help: "print failure logs", defaultsTo: false)
+ ..addMultiOption('environment',
+ abbr: 'D', help: "environment options for the test suite");
var parsedArguments = parser.parse(args);
String outputPath = parsedArguments["output-directory"] ?? ".";
Uri outputDirectory = Uri.base.resolveUri(Uri.directory(outputPath));
@@ -75,7 +78,8 @@
parsedArguments["verbose"],
parsedArguments["print"],
outputDirectory,
- filter);
+ filter,
+ parsedArguments['environment']);
}
}
@@ -142,8 +146,17 @@
if (result.trace != null) {
failureLog = "$failureLog\n\n${result.trace}";
}
- failureLog = "$failureLog\n\nRe-run this test: dart "
- "pkg/front_end/test/unit_test_suites.dart -p $testName";
+ if (result.autoFixCommand != null) {
+ failureLog = "$failureLog\n\n"
+ "To re-run this test, run:\n\n"
+ " dart pkg/front_end/test/unit_test_suites.dart -p $testName\n\n"
+ "To automatically update the test expectations, run:\n\n"
+ " dart pkg/front_end/test/unit_test_suites.dart -p $testName "
+ "-D${result.autoFixCommand}\n";
+ } else {
+ failureLog = "$failureLog\n\nRe-run this test: dart "
+ "pkg/front_end/test/unit_test_suites.dart -p $testName";
+ }
String outcome = "${result.outcome}";
logsPort.send(jsonEncode({
"name": testName,
@@ -287,6 +300,8 @@
final bool printFailureLog;
final String configurationName;
final String testFilter;
+ final List<String> environmentOptions;
+
const SuiteConfiguration(
this.name,
this.resultsPort,
@@ -294,7 +309,8 @@
this.verbose,
this.printFailureLog,
this.configurationName,
- this.testFilter);
+ this.testFilter,
+ this.environmentOptions);
}
void runSuite(SuiteConfiguration configuration) {
@@ -312,9 +328,11 @@
configuration.verbose,
configuration.printFailureLog,
configuration.configurationName);
- runMe(
- <String>[if (configuration.testFilter != null) configuration.testFilter],
- suite.createContext,
+ runMe(<String>[
+ if (configuration.testFilter != null) configuration.testFilter,
+ if (configuration.environmentOptions != null)
+ for (String option in configuration.environmentOptions) '-D${option}',
+ ], suite.createContext,
me: suiteUri,
configurationPath: suite.testingRootPath,
logger: logger,
@@ -359,7 +377,8 @@
options.verbose,
options.printFailureLog,
options.configurationName,
- filter);
+ filter,
+ options.environmentOptions);
Future future = Future<bool>(() async {
Stopwatch stopwatch = Stopwatch()..start();
print("Running suite $name");
diff --git a/pkg/front_end/test/utils/kernel_chain.dart b/pkg/front_end/test/utils/kernel_chain.dart
index d530ed8..804af3c 100644
--- a/pkg/front_end/test/utils/kernel_chain.dart
+++ b/pkg/front_end/test/utils/kernel_chain.dart
@@ -66,6 +66,8 @@
abstract class MatchContext implements ChainContext {
bool get updateExpectations;
+ String get updateExpectationsOption;
+
ExpectationSet get expectationSet;
Expectation get expectationFileMismatch =>
@@ -93,7 +95,10 @@
String diff = await runDiff(expectedFile.uri, actual);
onMismatch ??= expectationFileMismatch;
return new Result<O>(output, onMismatch,
- "$uri doesn't match ${expectedFile.uri}\n$diff", null);
+ "$uri doesn't match ${expectedFile.uri}\n$diff", null,
+ autoFixCommand: onMismatch == expectationFileMismatch
+ ? updateExpectationsOption
+ : null);
} else {
return new Result<O>.pass(output);
}
@@ -108,7 +113,8 @@
"""
Please create file ${expectedFile.path} with this content:
$actual""",
- null);
+ null,
+ autoFixCommand: updateExpectationsOption);
}
}
diff --git a/pkg/front_end/testcases/agnostic/as.dart.outline.expect b/pkg/front_end/testcases/agnostic/as.dart.outline.expect
index e6f3b0e..b6d34a3 100644
--- a/pkg/front_end/testcases/agnostic/as.dart.outline.expect
+++ b/pkg/front_end/testcases/agnostic/as.dart.outline.expect
@@ -11,4 +11,4 @@
Extra constant evaluation status:
Evaluated: ListLiteral @ org-dartlang-testcase:///as.dart:5:17 -> ListConstant(const <Null?>[])
Evaluated: ListLiteral @ org-dartlang-testcase:///as.dart:6:17 -> ListConstant(const <int?>[])
-Extra constant evaluation: tries: 4, successes: 2
+Extra constant evaluation: evaluated: 4, effectively constant: 2
diff --git a/pkg/front_end/testcases/agnostic/identical.dart.outline.expect b/pkg/front_end/testcases/agnostic/identical.dart.outline.expect
index 999e3a1..a3ec3dc 100644
--- a/pkg/front_end/testcases/agnostic/identical.dart.outline.expect
+++ b/pkg/front_end/testcases/agnostic/identical.dart.outline.expect
@@ -14,4 +14,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///identical.dart:6:17 -> ListConstant(const <int?>[])
Evaluated: StaticGet @ org-dartlang-testcase:///identical.dart:7:21 -> ListConstant(const <int>[])
Evaluated: StaticGet @ org-dartlang-testcase:///identical.dart:7:24 -> ListConstant(const <int?>[])
-Extra constant evaluation: tries: 5, successes: 4
+Extra constant evaluation: evaluated: 5, effectively constant: 4
diff --git a/pkg/front_end/testcases/agnostic/is.dart.outline.expect b/pkg/front_end/testcases/agnostic/is.dart.outline.expect
index daa025c..0046b04 100644
--- a/pkg/front_end/testcases/agnostic/is.dart.outline.expect
+++ b/pkg/front_end/testcases/agnostic/is.dart.outline.expect
@@ -11,4 +11,4 @@
Extra constant evaluation status:
Evaluated: ListLiteral @ org-dartlang-testcase:///is.dart:5:17 -> ListConstant(const <Null?>[])
Evaluated: ListLiteral @ org-dartlang-testcase:///is.dart:6:17 -> ListConstant(const <int?>[])
-Extra constant evaluation: tries: 4, successes: 2
+Extra constant evaluation: evaluated: 4, effectively constant: 2
diff --git a/pkg/front_end/testcases/agnostic/map.dart.outline.expect b/pkg/front_end/testcases/agnostic/map.dart.outline.expect
index c93a348..e1ceefa 100644
--- a/pkg/front_end/testcases/agnostic/map.dart.outline.expect
+++ b/pkg/front_end/testcases/agnostic/map.dart.outline.expect
@@ -14,4 +14,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///map.dart:6:17 -> ListConstant(const <int?>[])
Evaluated: StaticGet @ org-dartlang-testcase:///map.dart:7:12 -> ListConstant(const <int>[])
Evaluated: StaticGet @ org-dartlang-testcase:///map.dart:7:18 -> ListConstant(const <int?>[])
-Extra constant evaluation: tries: 5, successes: 4
+Extra constant evaluation: evaluated: 5, effectively constant: 4
diff --git a/pkg/front_end/testcases/agnostic/set.dart.outline.expect b/pkg/front_end/testcases/agnostic/set.dart.outline.expect
index 4e2d66b..53dca31 100644
--- a/pkg/front_end/testcases/agnostic/set.dart.outline.expect
+++ b/pkg/front_end/testcases/agnostic/set.dart.outline.expect
@@ -14,4 +14,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///set.dart:6:17 -> ListConstant(const <int?>[])
Evaluated: StaticGet @ org-dartlang-testcase:///set.dart:7:12 -> ListConstant(const <int>[])
Evaluated: StaticGet @ org-dartlang-testcase:///set.dart:7:15 -> ListConstant(const <int?>[])
-Extra constant evaluation: tries: 5, successes: 4
+Extra constant evaluation: evaluated: 5, effectively constant: 4
diff --git a/pkg/front_end/testcases/extensions/annotations.dart.outline.expect b/pkg/front_end/testcases/extensions/annotations.dart.outline.expect
index 4b30ee1..ff75d1b 100644
--- a/pkg/front_end/testcases/extensions/annotations.dart.outline.expect
+++ b/pkg/front_end/testcases/extensions/annotations.dart.outline.expect
@@ -48,4 +48,4 @@
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:14:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:17:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:21:2 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
-Extra constant evaluation: tries: 8, successes: 5
+Extra constant evaluation: evaluated: 8, effectively constant: 5
diff --git a/pkg/front_end/testcases/extensions/conflict_with_object.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/conflict_with_object.dart.strong.transformed.expect
index b5ae761..55715f8 100644
--- a/pkg/front_end/testcases/extensions/conflict_with_object.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/conflict_with_object.dart.strong.transformed.expect
@@ -93,4 +93,4 @@
Extra constant evaluation status:
Evaluated: MethodInvocation @ org-dartlang-testcase:///conflict_with_object.dart:21:19 -> BoolConstant(true)
-Extra constant evaluation: tries: 37, successes: 1
+Extra constant evaluation: evaluated: 37, effectively constant: 1
diff --git a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.strong.transformed.expect
index 8b2c087..c510c9c 100644
--- a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.strong.transformed.expect
@@ -100,4 +100,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///deferred_explicit_access.dart:12:31 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///deferred_explicit_access.dart:12:45 -> IntConstant(42)
Evaluated: VariableGet @ org-dartlang-testcase:///deferred_explicit_access.dart:12:45 -> IntConstant(42)
-Extra constant evaluation: tries: 95, successes: 3
+Extra constant evaluation: evaluated: 95, effectively constant: 3
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.transformed.expect
index 4cbf136..47097a2 100644
--- a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.transformed.expect
@@ -98,4 +98,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///explicit_extension_access.dart:48:36 -> IntConstant(23)
Evaluated: VariableGet @ org-dartlang-testcase:///explicit_extension_access.dart:49:36 -> IntConstant(67)
Evaluated: VariableGet @ org-dartlang-testcase:///explicit_extension_access.dart:49:36 -> IntConstant(67)
-Extra constant evaluation: tries: 121, successes: 4
+Extra constant evaluation: evaluated: 121, effectively constant: 4
diff --git a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.strong.transformed.expect
index d52f3d6..7239cba 100644
--- a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.strong.transformed.expect
@@ -141,4 +141,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///explicit_generic_extension_access.dart:93:41 -> IntConstant(23)
Evaluated: VariableGet @ org-dartlang-testcase:///explicit_generic_extension_access.dart:95:41 -> IntConstant(67)
Evaluated: VariableGet @ org-dartlang-testcase:///explicit_generic_extension_access.dart:95:41 -> IntConstant(67)
-Extra constant evaluation: tries: 217, successes: 6
+Extra constant evaluation: evaluated: 217, effectively constant: 6
diff --git a/pkg/front_end/testcases/extensions/extension_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/extension_setter.dart.strong.transformed.expect
index c3ec8472..245ead1 100644
--- a/pkg/front_end/testcases/extensions/extension_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/extension_setter.dart.strong.transformed.expect
@@ -324,4 +324,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:196:33 -> IntConstant(2)
Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:201:53 -> IntConstant(1)
Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:201:53 -> IntConstant(1)
-Extra constant evaluation: tries: 836, successes: 100
+Extra constant evaluation: evaluated: 836, effectively constant: 100
diff --git a/pkg/front_end/testcases/extensions/if_null.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/if_null.dart.strong.transformed.expect
index 15d3500..cd0b1b3 100644
--- a/pkg/front_end/testcases/extensions/if_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/if_null.dart.strong.transformed.expect
@@ -56,4 +56,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///if_null.dart:23:18 -> IntConstant(42)
Evaluated: VariableGet @ org-dartlang-testcase:///if_null.dart:24:29 -> IntConstant(42)
Evaluated: VariableGet @ org-dartlang-testcase:///if_null.dart:24:29 -> IntConstant(42)
-Extra constant evaluation: tries: 122, successes: 6
+Extra constant evaluation: evaluated: 122, effectively constant: 6
diff --git a/pkg/front_end/testcases/extensions/index.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/index.dart.strong.transformed.expect
index ec864e9..f406204 100644
--- a/pkg/front_end/testcases/extensions/index.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/index.dart.strong.transformed.expect
@@ -202,4 +202,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:104:29 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:106:31 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:106:31 -> IntConstant(0)
-Extra constant evaluation: tries: 579, successes: 78
+Extra constant evaluation: evaluated: 579, effectively constant: 78
diff --git a/pkg/front_end/testcases/extensions/instance_access.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/instance_access.dart.strong.transformed.expect
index f1cf6c6..b117363 100644
--- a/pkg/front_end/testcases/extensions/instance_access.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/instance_access.dart.strong.transformed.expect
@@ -164,4 +164,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:100:28 -> IntConstant(42)
Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:103:28 -> IntConstant(43)
Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:103:28 -> IntConstant(43)
-Extra constant evaluation: tries: 325, successes: 16
+Extra constant evaluation: evaluated: 325, effectively constant: 16
diff --git a/pkg/front_end/testcases/extensions/instance_tearoff.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/instance_tearoff.dart.strong.transformed.expect
index 45e1923..aabacb2 100644
--- a/pkg/front_end/testcases/extensions/instance_tearoff.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/instance_tearoff.dart.strong.transformed.expect
@@ -124,4 +124,4 @@
Evaluated: MethodInvocation @ org-dartlang-testcase:///instance_tearoff.dart:58:19 -> IntConstant(-7)
Evaluated: MethodInvocation @ org-dartlang-testcase:///instance_tearoff.dart:73:19 -> IntConstant(-4)
Evaluated: MethodInvocation @ org-dartlang-testcase:///instance_tearoff.dart:77:19 -> IntConstant(-7)
-Extra constant evaluation: tries: 144, successes: 4
+Extra constant evaluation: evaluated: 144, effectively constant: 4
diff --git a/pkg/front_end/testcases/extensions/internal_resolution.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/internal_resolution.dart.strong.transformed.expect
index f28f4cc..d9024f1 100644
--- a/pkg/front_end/testcases/extensions/internal_resolution.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/internal_resolution.dart.strong.transformed.expect
@@ -55,4 +55,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///internal_resolution.dart:23:28 -> IntConstant(42)
Evaluated: VariableGet @ org-dartlang-testcase:///internal_resolution.dart:25:28 -> IntConstant(87)
Evaluated: VariableGet @ org-dartlang-testcase:///internal_resolution.dart:25:28 -> IntConstant(87)
-Extra constant evaluation: tries: 49, successes: 4
+Extra constant evaluation: evaluated: 49, effectively constant: 4
diff --git a/pkg/front_end/testcases/extensions/issue39527.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/issue39527.dart.strong.transformed.expect
index fac7d9e..a4adb78 100644
--- a/pkg/front_end/testcases/extensions/issue39527.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue39527.dart.strong.transformed.expect
@@ -44,4 +44,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///issue39527.dart:19:19 -> IntConstant(42)
Evaluated: VariableGet @ org-dartlang-testcase:///issue39527.dart:22:17 -> IntConstant(42)
Evaluated: VariableGet @ org-dartlang-testcase:///issue39527.dart:22:17 -> IntConstant(42)
-Extra constant evaluation: tries: 56, successes: 4
+Extra constant evaluation: evaluated: 56, effectively constant: 4
diff --git a/pkg/front_end/testcases/extensions/null_aware.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/null_aware.dart.strong.transformed.expect
index 2b2a32d..fd2532c 100644
--- a/pkg/front_end/testcases/extensions/null_aware.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/null_aware.dart.strong.transformed.expect
@@ -112,4 +112,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:55:40 -> IntConstant(42)
Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:56:40 -> IntConstant(87)
Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:56:40 -> IntConstant(87)
-Extra constant evaluation: tries: 368, successes: 24
+Extra constant evaluation: evaluated: 368, effectively constant: 24
diff --git a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.strong.transformed.expect
index e7577c2..6d78eba 100644
--- a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.strong.transformed.expect
@@ -164,4 +164,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:100:28 -> IntConstant(42)
Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:103:28 -> IntConstant(43)
Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:103:28 -> IntConstant(43)
-Extra constant evaluation: tries: 325, successes: 16
+Extra constant evaluation: evaluated: 325, effectively constant: 16
diff --git a/pkg/front_end/testcases/general/DeltaBlue.dart.outline.expect b/pkg/front_end/testcases/general/DeltaBlue.dart.outline.expect
index 273a7fe..61148bb 100644
--- a/pkg/front_end/testcases/general/DeltaBlue.dart.outline.expect
+++ b/pkg/front_end/testcases/general/DeltaBlue.dart.outline.expect
@@ -272,4 +272,4 @@
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///DeltaBlue.dart:92:22 -> InstanceConstant(const Strength{Strength.value: 4, Strength.name: "normal"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///DeltaBlue.dart:93:28 -> InstanceConstant(const Strength{Strength.value: 5, Strength.name: "weakDefault"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///DeltaBlue.dart:94:23 -> InstanceConstant(const Strength{Strength.value: 6, Strength.name: "weakest"})
-Extra constant evaluation: tries: 10, successes: 7
+Extra constant evaluation: evaluated: 10, effectively constant: 7
diff --git a/pkg/front_end/testcases/general/abstract_members.dart.outline.expect b/pkg/front_end/testcases/general/abstract_members.dart.outline.expect
index 14f6467..c556119 100644
--- a/pkg/front_end/testcases/general/abstract_members.dart.outline.expect
+++ b/pkg/front_end/testcases/general/abstract_members.dart.outline.expect
@@ -403,4 +403,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_members.dart:23:12 -> SymbolConstant(#property2=)
Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:23:12 -> ListConstant(const <Type*>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_members.dart:23:12 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 73, successes: 28
+Extra constant evaluation: evaluated: 73, effectively constant: 28
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.outline.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.outline.expect
index 86ada81..54ce84a 100644
--- a/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.outline.expect
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.outline.expect
@@ -53,4 +53,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_overrides_concrete_with_no_such_method.dart:10:5 -> ListConstant(const <Type*>[])
Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_overrides_concrete_with_no_such_method.dart:10:5 -> ListConstant(const <dynamic>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_overrides_concrete_with_no_such_method.dart:10:5 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 9, successes: 4
+Extra constant evaluation: evaluated: 9, effectively constant: 4
diff --git a/pkg/front_end/testcases/general/annotation_on_enum_values.dart.outline.expect b/pkg/front_end/testcases/general/annotation_on_enum_values.dart.outline.expect
index 74e9e52..8352f12 100644
--- a/pkg/front_end/testcases/general/annotation_on_enum_values.dart.outline.expect
+++ b/pkg/front_end/testcases/general/annotation_on_enum_values.dart.outline.expect
@@ -54,4 +54,4 @@
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotation_on_enum_values.dart:18:4 -> InstanceConstant(const Fisk<int*>{Fisk.x: 42})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotation_on_enum_values.dart:19:3 -> InstanceConstant(const Foo{Foo.index: 1, Foo._name: "Foo.baz"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotation_on_enum_values.dart:20:3 -> InstanceConstant(const Foo{Foo.index: 2, Foo._name: "Foo.cafebabe"})
-Extra constant evaluation: tries: 11, successes: 6
+Extra constant evaluation: evaluated: 11, effectively constant: 6
diff --git a/pkg/front_end/testcases/general/annotation_top.dart.outline.expect b/pkg/front_end/testcases/general/annotation_top.dart.outline.expect
index a2c0119..a3676d1 100644
--- a/pkg/front_end/testcases/general/annotation_top.dart.outline.expect
+++ b/pkg/front_end/testcases/general/annotation_top.dart.outline.expect
@@ -62,4 +62,4 @@
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotation_top.dart:28:2 -> InstanceConstant(const A{})
Evaluated: StaticGet @ org-dartlang-testcase:///annotation_top.dart:27:2 -> InstanceConstant(const Object{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotation_top.dart:28:2 -> InstanceConstant(const A{})
-Extra constant evaluation: tries: 11, successes: 11
+Extra constant evaluation: evaluated: 11, effectively constant: 11
diff --git a/pkg/front_end/testcases/general/bug33099.dart.outline.expect b/pkg/front_end/testcases/general/bug33099.dart.outline.expect
index ce6b8f1..22c739f 100644
--- a/pkg/front_end/testcases/general/bug33099.dart.outline.expect
+++ b/pkg/front_end/testcases/general/bug33099.dart.outline.expect
@@ -68,4 +68,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///bug33099.dart:14:4 -> InstanceConstant(const _FailingTest{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bug33099.dart:7:40 -> InstanceConstant(const _FailingTest{})
-Extra constant evaluation: tries: 2, successes: 2
+Extra constant evaluation: evaluated: 2, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/bug33099.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug33099.dart.strong.transformed.expect
index 6ab71cc..2f10dab 100644
--- a/pkg/front_end/testcases/general/bug33099.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/bug33099.dart.strong.transformed.expect
@@ -87,4 +87,4 @@
Extra constant evaluation status:
Evaluated: TypeLiteral @ org-dartlang-testcase:///bug33099.dart:21:42 -> TypeLiteralConstant(MyTest2*)
-Extra constant evaluation: tries: 33, successes: 1
+Extra constant evaluation: evaluated: 33, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/casts.dart.strong.transformed.expect b/pkg/front_end/testcases/general/casts.dart.strong.transformed.expect
index 857760f..59f300e 100644
--- a/pkg/front_end/testcases/general/casts.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/casts.dart.strong.transformed.expect
@@ -28,4 +28,4 @@
Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:18:13 -> BoolConstant(false)
Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:19:13 -> BoolConstant(false)
Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:20:13 -> BoolConstant(true)
-Extra constant evaluation: tries: 21, successes: 9
+Extra constant evaluation: evaluated: 21, effectively constant: 9
diff --git a/pkg/front_end/testcases/general/check_deferred_read_type.dart.strong.transformed.expect b/pkg/front_end/testcases/general/check_deferred_read_type.dart.strong.transformed.expect
index 8ee35ad..fdd58da 100644
--- a/pkg/front_end/testcases/general/check_deferred_read_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/check_deferred_read_type.dart.strong.transformed.expect
@@ -39,4 +39,4 @@
Extra constant evaluation status:
Evaluated: TypeLiteral @ org-dartlang-testcase:///check_deferred_read_type.dart:9:13 -> TypeLiteralConstant(C*)
-Extra constant evaluation: tries: 4, successes: 1
+Extra constant evaluation: evaluated: 4, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/compound_binary_implicit_as.dart.strong.transformed.expect b/pkg/front_end/testcases/general/compound_binary_implicit_as.dart.strong.transformed.expect
index a73d318..2c3a4c0 100644
--- a/pkg/front_end/testcases/general/compound_binary_implicit_as.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/compound_binary_implicit_as.dart.strong.transformed.expect
@@ -43,4 +43,4 @@
Extra constant evaluation status:
Evaluated: VariableGet @ org-dartlang-testcase:///compound_binary_implicit_as.dart:16:9 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///compound_binary_implicit_as.dart:16:9 -> IntConstant(0)
-Extra constant evaluation: tries: 16, successes: 2
+Extra constant evaluation: evaluated: 16, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/constant_truncate.dart.outline.expect b/pkg/front_end/testcases/general/constant_truncate.dart.outline.expect
index da2fefe..0dde286 100644
--- a/pkg/front_end/testcases/general/constant_truncate.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constant_truncate.dart.outline.expect
@@ -95,4 +95,4 @@
Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:44:38 -> DoubleConstant(-Infinity)
Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:45:19 -> DoubleConstant(-Infinity)
Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:45:46 -> DoubleConstant(-Infinity)
-Extra constant evaluation: tries: 76, successes: 46
+Extra constant evaluation: evaluated: 76, effectively constant: 46
diff --git a/pkg/front_end/testcases/general/constant_truncate.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constant_truncate.dart.strong.transformed.expect
index 3d56c16..9d88e9d 100644
--- a/pkg/front_end/testcases/general/constant_truncate.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/constant_truncate.dart.strong.transformed.expect
@@ -427,4 +427,4 @@
Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:71:8 -> DoubleConstant(-0.0)
Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:78:8 -> DoubleConstant(-0.0)
Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:85:8 -> DoubleConstant(-0.0)
-Extra constant evaluation: tries: 115, successes: 12
+Extra constant evaluation: evaluated: 115, effectively constant: 12
diff --git a/pkg/front_end/testcases/general/constants/const_asserts.dart.outline.expect b/pkg/front_end/testcases/general/constants/const_asserts.dart.outline.expect
index a9222e8..2eaf487 100644
--- a/pkg/front_end/testcases/general/constants/const_asserts.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constants/const_asserts.dart.outline.expect
@@ -94,4 +94,4 @@
Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_asserts.dart:19:21 -> NullConstant(null)
Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_asserts.dart:21:22 -> NullConstant(null)
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_asserts.dart:31:24 -> InstanceConstant(const Foo{Foo.x: 1})
-Extra constant evaluation: tries: 48, successes: 7
+Extra constant evaluation: evaluated: 48, effectively constant: 7
diff --git a/pkg/front_end/testcases/general/constants/const_asserts.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/const_asserts.dart.strong.transformed.expect
index acaf574..d5afd92 100644
--- a/pkg/front_end/testcases/general/constants/const_asserts.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/const_asserts.dart.strong.transformed.expect
@@ -213,4 +213,4 @@
Evaluated: StringConcatenation @ org-dartlang-testcase:///const_asserts.dart:12:59 -> StringConstant("foo was false")
Evaluated: MethodInvocation @ org-dartlang-testcase:///const_asserts.dart:13:50 -> BoolConstant(true)
Evaluated: StringConcatenation @ org-dartlang-testcase:///const_asserts.dart:15:73 -> StringConstant("btw foo was false")
-Extra constant evaluation: tries: 34, successes: 4
+Extra constant evaluation: evaluated: 34, effectively constant: 4
diff --git a/pkg/front_end/testcases/general/constants/const_collections.dart.outline.expect b/pkg/front_end/testcases/general/constants/const_collections.dart.outline.expect
index 59c28c6..04597c0 100644
--- a/pkg/front_end/testcases/general/constants/const_collections.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constants/const_collections.dart.outline.expect
@@ -358,4 +358,4 @@
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_collections.dart:63:45 -> InstanceConstant(const CustomMap{})
Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:64:51 -> InstanceConstant(const CustomMap{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_collections.dart:66:9 -> InstanceConstant(const WithEquals{WithEquals.i: 42})
-Extra constant evaluation: tries: 90, successes: 59
+Extra constant evaluation: evaluated: 90, effectively constant: 59
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.outline.expect b/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.outline.expect
index e31b315..2f0bfb0 100644
--- a/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.outline.expect
@@ -104,4 +104,4 @@
Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:37:36 -> DoubleConstant(42.0)
Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:40:27 -> DoubleConstant(NaN)
Evaluated: StaticGet @ org-dartlang-testcase:///number_folds.dart:41:42 -> DoubleConstant(NaN)
-Extra constant evaluation: tries: 38, successes: 24
+Extra constant evaluation: evaluated: 38, effectively constant: 24
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/various.dart.outline.expect b/pkg/front_end/testcases/general/constants/js_semantics/various.dart.outline.expect
index 4897983..41ed046 100644
--- a/pkg/front_end/testcases/general/constants/js_semantics/various.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constants/js_semantics/various.dart.outline.expect
@@ -68,4 +68,4 @@
Evaluated: MethodInvocation @ org-dartlang-testcase:///various.dart:43:29 -> BoolConstant(true)
Evaluated: MethodInvocation @ org-dartlang-testcase:///various.dart:44:30 -> BoolConstant(false)
Evaluated: StringConcatenation @ org-dartlang-testcase:///various.dart:47:30 -> StringConstant("hello1764")
-Extra constant evaluation: tries: 29, successes: 29
+Extra constant evaluation: evaluated: 29, effectively constant: 29
diff --git a/pkg/front_end/testcases/general/constants/number_folds.dart.outline.expect b/pkg/front_end/testcases/general/constants/number_folds.dart.outline.expect
index 715ad66..0c36235 100644
--- a/pkg/front_end/testcases/general/constants/number_folds.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constants/number_folds.dart.outline.expect
@@ -101,4 +101,4 @@
Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:36:36 -> IntConstant(42)
Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:39:27 -> DoubleConstant(NaN)
Evaluated: StaticGet @ org-dartlang-testcase:///number_folds.dart:40:42 -> DoubleConstant(NaN)
-Extra constant evaluation: tries: 37, successes: 23
+Extra constant evaluation: evaluated: 37, effectively constant: 23
diff --git a/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart.outline.expect b/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart.outline.expect
index c1a907c..f61a38d 100644
--- a/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart.outline.expect
@@ -19,4 +19,4 @@
Evaluated: MethodInvocation @ org-dartlang-testcase:///rudimentary_test_01.dart:8:35 -> StringConstant("hello2 2hello 42!")
Evaluated: LogicalExpression @ org-dartlang-testcase:///rudimentary_test_01.dart:9:50 -> BoolConstant(true)
Evaluated: SymbolLiteral @ org-dartlang-testcase:///rudimentary_test_01.dart:10:19 -> SymbolConstant(#_x)
-Extra constant evaluation: tries: 5, successes: 5
+Extra constant evaluation: evaluated: 5, effectively constant: 5
diff --git a/pkg/front_end/testcases/general/constants/various.dart.outline.expect b/pkg/front_end/testcases/general/constants/various.dart.outline.expect
index 7b33312..055199f 100644
--- a/pkg/front_end/testcases/general/constants/various.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constants/various.dart.outline.expect
@@ -453,4 +453,4 @@
Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:213:40 -> BoolConstant(false)
Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:214:25 -> NullConstant(null)
Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:215:40 -> BoolConstant(false)
-Extra constant evaluation: tries: 136, successes: 84
+Extra constant evaluation: evaluated: 136, effectively constant: 84
diff --git a/pkg/front_end/testcases/general/constants/various.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/various.dart.strong.transformed.expect
index 2ad931e..e9451ab 100644
--- a/pkg/front_end/testcases/general/constants/various.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/various.dart.strong.transformed.expect
@@ -630,4 +630,4 @@
Extra constant evaluation status:
Evaluated: PropertyGet @ org-dartlang-testcase:///various.dart:111:26 -> IntConstant(5)
-Extra constant evaluation: tries: 12, successes: 1
+Extra constant evaluation: evaluated: 12, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.outline.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.outline.expect
index aff93a8..9745070 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.outline.expect
@@ -58,4 +58,4 @@
Evaluated with empty environment: StringConcatenation @ org-dartlang-testcase:///const_asserts.dart:14:73 -> StringConstant("btw foo was false")
Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_asserts.dart:14:44 -> BoolConstant(false)
Evaluated with empty environment: ConstructorInvocation @ org-dartlang-testcase:///const_asserts.dart:25:24 -> InstanceConstant(const Foo{Foo.x: 1})
-Extra constant evaluation: tries: 39, successes: 9
+Extra constant evaluation: evaluated: 39, effectively constant: 9
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.strong.transformed.expect
index 62817bb..d4deb80 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.strong.transformed.expect
@@ -140,4 +140,4 @@
Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///const_asserts.dart:14:44 -> BoolConstant(false)
Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///const_asserts.dart:25:24 -> InstanceConstant(const Foo{Foo.x: 1})
Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///const_asserts.dart:25:24 -> InstanceConstant(const Foo{Foo.x: 1})
-Extra constant evaluation: tries: 34, successes: 10
+Extra constant evaluation: evaluated: 34, effectively constant: 10
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.outline.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.outline.expect
index d579c1c..8dfa191 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.outline.expect
@@ -43,4 +43,4 @@
Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_collections.dart:28:37 -> BoolConstant(false)
Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:31:27 -> ListConstant(const <int>[])
Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:31:33 -> ListConstant(const <int?>[])
-Extra constant evaluation: tries: 25, successes: 20
+Extra constant evaluation: evaluated: 25, effectively constant: 20
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.strong.transformed.expect
index b99c5b8..44be456 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.strong.transformed.expect
@@ -88,4 +88,4 @@
Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///const_collections.dart:5:40 -> ListConstant(const <bool>[false, false, true])
Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///const_collections.dart:10:46 -> ListConstant(const <bool>[true, false, false, true, false])
Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///const_collections.dart:27:38 -> MapConstant(const <bool, bool>{false: false})
-Extra constant evaluation: tries: 16, successes: 5
+Extra constant evaluation: evaluated: 16, effectively constant: 5
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.outline.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.outline.expect
index b4f77fb..55d4864 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.outline.expect
@@ -18,4 +18,4 @@
Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///rudimentary_test_01.dart:7:27 -> StringConstant("world")
Evaluated: LogicalExpression @ org-dartlang-testcase:///rudimentary_test_01.dart:8:50 -> BoolConstant(true)
Evaluated: SymbolLiteral @ org-dartlang-testcase:///rudimentary_test_01.dart:9:19 -> SymbolConstant(#_x)
-Extra constant evaluation: tries: 5, successes: 5
+Extra constant evaluation: evaluated: 5, effectively constant: 5
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.strong.transformed.expect
index 4af1ccc..6957744 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.strong.transformed.expect
@@ -36,4 +36,4 @@
Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///rudimentary_test_01.dart:6:18 -> StringConstant("hello world!")
Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///rudimentary_test_01.dart:6:18 -> StringConstant("hello world!")
Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///rudimentary_test_01.dart:6:18 -> StringConstant("hello world!")
-Extra constant evaluation: tries: 8, successes: 4
+Extra constant evaluation: evaluated: 8, effectively constant: 4
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.outline.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.outline.expect
index de68860..4106544 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.outline.expect
@@ -226,4 +226,4 @@
Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:130:10 -> BoolConstant(false)
Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///various.dart:130:35 -> BoolConstant(false)
Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///various.dart:131:37 -> NullConstant(null)
-Extra constant evaluation: tries: 112, successes: 68
+Extra constant evaluation: evaluated: 112, effectively constant: 68
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.transformed.expect
index fd822a9..dbea8ca 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.transformed.expect
@@ -287,4 +287,4 @@
Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:127:35 -> BoolConstant(false)
Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:128:33 -> BoolConstant(true)
Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:130:33 -> NullConstant(null)
-Extra constant evaluation: tries: 66, successes: 24
+Extra constant evaluation: evaluated: 66, effectively constant: 24
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.outline.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.outline.expect
index 5f4b31d..4b3859b 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.outline.expect
@@ -130,4 +130,4 @@
Evaluated: ListConcatenation @ org-dartlang-testcase:///various_2_lib.dart:38:32 -> ListConstant(const <int>[0])
Evaluated: SetConcatenation @ org-dartlang-testcase:///various_2_lib.dart:39:31 -> SetConstant(const <int>{0})
Evaluated: MapConcatenation @ org-dartlang-testcase:///various_2_lib.dart:40:7 -> MapConstant(const <int, String>{0: "foo"})
-Extra constant evaluation: tries: 54, successes: 53
+Extra constant evaluation: evaluated: 54, effectively constant: 53
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.strong.transformed.expect
index 52f3aa3..6932698 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.strong.transformed.expect
@@ -134,4 +134,4 @@
Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various_2.dart:37:5 -> BoolConstant(false)
Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various_2.dart:37:5 -> BoolConstant(false)
Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various_2_lib.dart:20:39 -> PartialInstantiationConstant(id2<int>)
-Extra constant evaluation: tries: 41, successes: 4
+Extra constant evaluation: evaluated: 41, effectively constant: 4
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 342b8af..6077536 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
@@ -107,4 +107,4 @@
Evaluated: MethodInvocation @ org-dartlang-testcase:///control_flow_collection.dart:18:26 -> IntConstant(-1)
Evaluated: MethodInvocation @ org-dartlang-testcase:///control_flow_collection.dart:27:29 -> IntConstant(-1)
Evaluated: MethodInvocation @ org-dartlang-testcase:///control_flow_collection.dart:27:33 -> IntConstant(-1)
-Extra constant evaluation: tries: 160, successes: 4
+Extra constant evaluation: evaluated: 160, effectively constant: 4
diff --git a/pkg/front_end/testcases/general/covariant_generic.dart.strong.transformed.expect b/pkg/front_end/testcases/general/covariant_generic.dart.strong.transformed.expect
index d10ce88..3d30d4a 100644
--- a/pkg/front_end/testcases/general/covariant_generic.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/covariant_generic.dart.strong.transformed.expect
@@ -52,4 +52,4 @@
Extra constant evaluation status:
Evaluated: VariableGet @ org-dartlang-testcase:///covariant_generic.dart:42:31 -> IntConstant(3)
Evaluated: VariableGet @ org-dartlang-testcase:///covariant_generic.dart:43:31 -> DoubleConstant(2.5)
-Extra constant evaluation: tries: 58, successes: 2
+Extra constant evaluation: evaluated: 58, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/duplicated_declarations.dart.outline.expect b/pkg/front_end/testcases/general/duplicated_declarations.dart.outline.expect
index 58691fd..fea4f76 100644
--- a/pkg/front_end/testcases/general/duplicated_declarations.dart.outline.expect
+++ b/pkg/front_end/testcases/general/duplicated_declarations.dart.outline.expect
@@ -585,4 +585,4 @@
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///duplicated_declarations.dart:88:3 -> InstanceConstant(const AnotherEnum{AnotherEnum.index: 0, AnotherEnum._name: "AnotherEnum.a"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///duplicated_declarations.dart:89:3 -> InstanceConstant(const AnotherEnum{AnotherEnum.index: 1, AnotherEnum._name: "AnotherEnum.b"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///duplicated_declarations.dart:90:3 -> InstanceConstant(const AnotherEnum{AnotherEnum.index: 2, AnotherEnum._name: "AnotherEnum.c"})
-Extra constant evaluation: tries: 46, successes: 22
+Extra constant evaluation: evaluated: 46, effectively constant: 22
diff --git a/pkg/front_end/testcases/general/export_test.dart.strong.transformed.expect b/pkg/front_end/testcases/general/export_test.dart.strong.transformed.expect
index 1d3085a..0676de4 100644
--- a/pkg/front_end/testcases/general/export_test.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/export_test.dart.strong.transformed.expect
@@ -14,4 +14,4 @@
Extra constant evaluation status:
Evaluated: TypeLiteral @ org-dartlang-testcase:///export_test.dart:14:9 -> TypeLiteralConstant(UserTag*)
-Extra constant evaluation: tries: 2, successes: 1
+Extra constant evaluation: evaluated: 2, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
index c522059..04c23db 100644
--- a/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
@@ -101,4 +101,4 @@
Evaluated: TypeLiteral @ org-dartlang-testcase:///expressions.dart:72:9 -> TypeLiteralConstant(int*)
Evaluated: VariableGetImpl @ org-dartlang-testcase:///expressions.dart:72:9 -> TypeLiteralConstant(int*)
Evaluated: VariableGet @ org-dartlang-testcase:///expressions.dart:72:9 -> TypeLiteralConstant(int*)
-Extra constant evaluation: tries: 138, successes: 6
+Extra constant evaluation: evaluated: 138, effectively constant: 6
diff --git a/pkg/front_end/testcases/general/external_import.dart.outline.expect b/pkg/front_end/testcases/general/external_import.dart.outline.expect
index a83c46c..c82b9e6 100644
--- a/pkg/front_end/testcases/general/external_import.dart.outline.expect
+++ b/pkg/front_end/testcases/general/external_import.dart.outline.expect
@@ -13,4 +13,4 @@
Evaluated: ConstructorInvocation @ null -> InstanceConstant(const ExternalName{ExternalName.name: "dart-ext:here"})
Evaluated: ConstructorInvocation @ null -> InstanceConstant(const ExternalName{ExternalName.name: "dart-ext:foo/../there"})
Evaluated: ConstructorInvocation @ null -> InstanceConstant(const ExternalName{ExternalName.name: "dart-ext:/usr/local/somewhere"})
-Extra constant evaluation: tries: 3, successes: 3
+Extra constant evaluation: evaluated: 3, effectively constant: 3
diff --git a/pkg/front_end/testcases/general/ffi_sample.dart.outline.expect b/pkg/front_end/testcases/general/ffi_sample.dart.outline.expect
index 7e4abd5..2a3bf26 100644
--- a/pkg/front_end/testcases/general/ffi_sample.dart.outline.expect
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.outline.expect
@@ -33,4 +33,4 @@
Extra constant evaluation status:
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///ffi_sample.dart:13:4 -> InstanceConstant(const Double{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///ffi_sample.dart:16:4 -> InstanceConstant(const Double{})
-Extra constant evaluation: tries: 2, successes: 2
+Extra constant evaluation: evaluated: 2, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/getter_call.dart.strong.transformed.expect b/pkg/front_end/testcases/general/getter_call.dart.strong.transformed.expect
index bcd0feb..7d5a3ba 100644
--- a/pkg/front_end/testcases/general/getter_call.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/getter_call.dart.strong.transformed.expect
@@ -204,4 +204,4 @@
Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:160:10 -> IntConstant(-23)
Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:161:10 -> IntConstant(-11)
Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:162:10 -> IntConstant(-11)
-Extra constant evaluation: tries: 354, successes: 17
+Extra constant evaluation: evaluated: 354, effectively constant: 17
diff --git a/pkg/front_end/testcases/general/implicit_scope_test.dart.strong.transformed.expect b/pkg/front_end/testcases/general/implicit_scope_test.dart.strong.transformed.expect
index 4f4f2ae..19d91ae 100644
--- a/pkg/front_end/testcases/general/implicit_scope_test.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/implicit_scope_test.dart.strong.transformed.expect
@@ -62,4 +62,4 @@
Extra constant evaluation status:
Evaluated: MethodInvocation @ org-dartlang-testcase:///implicit_scope_test.dart:11:18 -> BoolConstant(true)
Evaluated: MethodInvocation @ org-dartlang-testcase:///implicit_scope_test.dart:32:49 -> BoolConstant(false)
-Extra constant evaluation: tries: 28, successes: 2
+Extra constant evaluation: evaluated: 28, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/invalid_type.dart.strong.transformed.expect b/pkg/front_end/testcases/general/invalid_type.dart.strong.transformed.expect
index 0311446..26b45d2 100644
--- a/pkg/front_end/testcases/general/invalid_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/invalid_type.dart.strong.transformed.expect
@@ -50,4 +50,4 @@
Extra constant evaluation status:
Evaluated: AsExpression @ org-dartlang-testcase:///invalid_type.dart:12:9 -> NullConstant(null)
-Extra constant evaluation: tries: 3, successes: 1
+Extra constant evaluation: evaluated: 3, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/issue40662.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue40662.dart.strong.transformed.expect
index 5509ab3..5fe56f9 100644
--- a/pkg/front_end/testcases/general/issue40662.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue40662.dart.strong.transformed.expect
@@ -88,4 +88,4 @@
Extra constant evaluation status:
Evaluated: MethodInvocation @ org-dartlang-testcase:///issue40662.dart:8:10 -> IntConstant(-1)
Evaluated: MethodInvocation @ org-dartlang-testcase:///issue40662.dart:9:10 -> IntConstant(-1)
-Extra constant evaluation: tries: 99, successes: 2
+Extra constant evaluation: evaluated: 99, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/issue40744.dart.outline.expect b/pkg/front_end/testcases/general/issue40744.dart.outline.expect
index 38f3347..3b367f6 100644
--- a/pkg/front_end/testcases/general/issue40744.dart.outline.expect
+++ b/pkg/front_end/testcases/general/issue40744.dart.outline.expect
@@ -11,4 +11,4 @@
Extra constant evaluation status:
Evaluated: MapLiteral @ org-dartlang-testcase:///issue40744.dart:5:53 -> InstanceConstant(const _ImmutableMap<String*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>["a", 1]})
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/issue42997.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue42997.dart.strong.transformed.expect
index 90269fa..b501d6e 100644
--- a/pkg/front_end/testcases/general/issue42997.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue42997.dart.strong.transformed.expect
@@ -85,4 +85,4 @@
Extra constant evaluation status:
Evaluated: TypeLiteral @ org-dartlang-testcase:///issue42997.dart:12:24 -> TypeLiteralConstant(Object*)
-Extra constant evaluation: tries: 2, successes: 1
+Extra constant evaluation: evaluated: 2, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/magic_const.dart.strong.transformed.expect b/pkg/front_end/testcases/general/magic_const.dart.strong.transformed.expect
index 2db3815..d40ba2b8 100644
--- a/pkg/front_end/testcases/general/magic_const.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/magic_const.dart.strong.transformed.expect
@@ -72,4 +72,4 @@
Extra constant evaluation status:
Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///magic_const.dart:21:8 -> BoolConstant(false)
-Extra constant evaluation: tries: 2, successes: 1
+Extra constant evaluation: evaluated: 2, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/metadata_enum.dart.outline.expect b/pkg/front_end/testcases/general/metadata_enum.dart.outline.expect
index 7e99438..14991ec 100644
--- a/pkg/front_end/testcases/general/metadata_enum.dart.outline.expect
+++ b/pkg/front_end/testcases/general/metadata_enum.dart.outline.expect
@@ -36,4 +36,4 @@
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///metadata_enum.dart:8:10 -> InstanceConstant(const E{E.index: 0, E._name: "E.E1"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///metadata_enum.dart:8:14 -> InstanceConstant(const E{E.index: 1, E._name: "E.E2"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///metadata_enum.dart:8:18 -> InstanceConstant(const E{E.index: 2, E._name: "E.E3"})
-Extra constant evaluation: tries: 9, successes: 5
+Extra constant evaluation: evaluated: 9, effectively constant: 5
diff --git a/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.outline.expect b/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.outline.expect
index 270cae4..537845c 100644
--- a/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.outline.expect
+++ b/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.outline.expect
@@ -43,4 +43,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///metadata_named_mixin_application.dart:7:2 -> NullConstant(null)
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/minimum_int.dart.strong.transformed.expect b/pkg/front_end/testcases/general/minimum_int.dart.strong.transformed.expect
index cc645b3..493f69a 100644
--- a/pkg/front_end/testcases/general/minimum_int.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/minimum_int.dart.strong.transformed.expect
@@ -8,4 +8,4 @@
Extra constant evaluation status:
Evaluated: MethodInvocation @ org-dartlang-testcase:///minimum_int.dart:1:17 -> IntConstant(-9223372036854775808)
-Extra constant evaluation: tries: 2, successes: 1
+Extra constant evaluation: evaluated: 2, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/missing_toplevel.dart.strong.transformed.expect b/pkg/front_end/testcases/general/missing_toplevel.dart.strong.transformed.expect
index b1f8f15..20fffed 100644
--- a/pkg/front_end/testcases/general/missing_toplevel.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/missing_toplevel.dart.strong.transformed.expect
@@ -137,4 +137,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///missing_toplevel.dart:28:48 -> IntConstant(2)
Evaluated: VariableGet @ org-dartlang-testcase:///missing_toplevel.dart:29:41 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///missing_toplevel.dart:29:48 -> IntConstant(2)
-Extra constant evaluation: tries: 37, successes: 5
+Extra constant evaluation: evaluated: 37, effectively constant: 5
diff --git a/pkg/front_end/testcases/general/mixin_from_patch/main.dart.outline.expect b/pkg/front_end/testcases/general/mixin_from_patch/main.dart.outline.expect
index 26ebb28..76e0c7e 100644
--- a/pkg/front_end/testcases/general/mixin_from_patch/main.dart.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_from_patch/main.dart.outline.expect
@@ -53,4 +53,4 @@
Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:14:3 -> InstanceConstant(const _Patch{})
Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:16:19 -> InstanceConstant(const _Patch{})
Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
-Extra constant evaluation: tries: 5, successes: 4
+Extra constant evaluation: evaluated: 5, effectively constant: 4
diff --git a/pkg/front_end/testcases/general/native_as_name.dart.outline.expect b/pkg/front_end/testcases/general/native_as_name.dart.outline.expect
index 664a1ec..27aedb4 100644
--- a/pkg/front_end/testcases/general/native_as_name.dart.outline.expect
+++ b/pkg/front_end/testcases/general/native_as_name.dart.outline.expect
@@ -78,4 +78,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///native_as_name.dart:26:4 -> InstanceConstant(const _Override{})
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.outline.expect b/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.outline.expect
index 092472c..ab987d2 100644
--- a/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.outline.expect
+++ b/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.outline.expect
@@ -57,4 +57,4 @@
Extra constant evaluation status:
Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///nested_implicit_const_with_env_var.dart:5:23 -> IntConstant(0)
-Extra constant evaluation: tries: 3, successes: 1
+Extra constant evaluation: evaluated: 3, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/no_such_method_forwarder.dart.outline.expect b/pkg/front_end/testcases/general/no_such_method_forwarder.dart.outline.expect
index 9f79d7f..ac5db6a 100644
--- a/pkg/front_end/testcases/general/no_such_method_forwarder.dart.outline.expect
+++ b/pkg/front_end/testcases/general/no_such_method_forwarder.dart.outline.expect
@@ -52,4 +52,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///no_such_method_forwarder.dart:11:8 -> ListConstant(const <Type*>[])
Evaluated: ListLiteral @ org-dartlang-testcase:///no_such_method_forwarder.dart:11:8 -> ListConstant(const <dynamic>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///no_such_method_forwarder.dart:11:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 16, successes: 8
+Extra constant evaluation: evaluated: 16, effectively constant: 8
diff --git a/pkg/front_end/testcases/general/no_such_method_private_setter.dart.outline.expect b/pkg/front_end/testcases/general/no_such_method_private_setter.dart.outline.expect
index 320288b..14a8225 100644
--- a/pkg/front_end/testcases/general/no_such_method_private_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/general/no_such_method_private_setter.dart.outline.expect
@@ -57,4 +57,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///no_such_method_private_setter_lib.dart:8:7 -> SymbolConstant(#_x=)
Evaluated: ListLiteral @ org-dartlang-testcase:///no_such_method_private_setter_lib.dart:8:7 -> ListConstant(const <Type*>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///no_such_method_private_setter_lib.dart:8:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 19, successes: 7
+Extra constant evaluation: evaluated: 19, effectively constant: 7
diff --git a/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.transformed.expect b/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.transformed.expect
index 3710901..efc4e77 100644
--- a/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.transformed.expect
@@ -369,4 +369,4 @@
Extra constant evaluation status:
Evaluated: VariableGet @ org-dartlang-testcase:///operator_method_not_found.dart:29:18 -> IntConstant(2)
-Extra constant evaluation: tries: 74, successes: 1
+Extra constant evaluation: evaluated: 74, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.outline.expect b/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.outline.expect
index f15030e..0242ff5 100644
--- a/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.outline.expect
+++ b/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.outline.expect
@@ -54,4 +54,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///override_check_generic_method_f_bounded.dart:15:4 -> InstanceConstant(const _Override{})
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/platform_invalid_uris/main.dart.outline.expect b/pkg/front_end/testcases/general/platform_invalid_uris/main.dart.outline.expect
index a24b28f..a493720 100644
--- a/pkg/front_end/testcases/general/platform_invalid_uris/main.dart.outline.expect
+++ b/pkg/front_end/testcases/general/platform_invalid_uris/main.dart.outline.expect
@@ -65,4 +65,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/private_method_tearoff.dart.outline.expect b/pkg/front_end/testcases/general/private_method_tearoff.dart.outline.expect
index 2face8d..095531c 100644
--- a/pkg/front_end/testcases/general/private_method_tearoff.dart.outline.expect
+++ b/pkg/front_end/testcases/general/private_method_tearoff.dart.outline.expect
@@ -57,4 +57,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///private_method_tearoff_lib.dart:8:8 -> ListConstant(const <Type*>[])
Evaluated: ListLiteral @ org-dartlang-testcase:///private_method_tearoff_lib.dart:8:8 -> ListConstant(const <dynamic>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///private_method_tearoff_lib.dart:8:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 8, successes: 4
+Extra constant evaluation: evaluated: 8, effectively constant: 4
diff --git a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.outline.expect
index 1261412..55876a5 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.outline.expect
@@ -29,4 +29,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///redirecting_factory_metadata.dart:13:4 -> IntConstant(2)
-Extra constant evaluation: tries: 5, successes: 1
+Extra constant evaluation: evaluated: 5, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/super_nsm.dart.outline.expect b/pkg/front_end/testcases/general/super_nsm.dart.outline.expect
index 070a084..1e84833 100644
--- a/pkg/front_end/testcases/general/super_nsm.dart.outline.expect
+++ b/pkg/front_end/testcases/general/super_nsm.dart.outline.expect
@@ -51,4 +51,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///super_nsm.dart:6:3 -> ListConstant(const <Type*>[])
Evaluated: ListLiteral @ org-dartlang-testcase:///super_nsm.dart:6:3 -> ListConstant(const <dynamic>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///super_nsm.dart:6:3 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 9, successes: 4
+Extra constant evaluation: evaluated: 9, effectively constant: 4
diff --git a/pkg/front_end/testcases/general/type_literal_as_metadata.dart.outline.expect b/pkg/front_end/testcases/general/type_literal_as_metadata.dart.outline.expect
index 5e8e20d..2add531 100644
--- a/pkg/front_end/testcases/general/type_literal_as_metadata.dart.outline.expect
+++ b/pkg/front_end/testcases/general/type_literal_as_metadata.dart.outline.expect
@@ -47,4 +47,4 @@
Extra constant evaluation status:
Evaluated: TypeLiteral @ org-dartlang-testcase:///type_literal_as_metadata.dart:9:2 -> TypeLiteralConstant(A*)
-Extra constant evaluation: tries: 2, successes: 1
+Extra constant evaluation: evaluated: 2, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/type_variable_uses.dart.strong.transformed.expect b/pkg/front_end/testcases/general/type_variable_uses.dart.strong.transformed.expect
index 4149d44..020bf8e 100644
--- a/pkg/front_end/testcases/general/type_variable_uses.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/type_variable_uses.dart.strong.transformed.expect
@@ -115,4 +115,4 @@
Extra constant evaluation status:
Evaluated: TypeLiteral @ org-dartlang-testcase:///type_variable_uses.dart:8:11 -> TypeLiteralConstant(<invalid>)
-Extra constant evaluation: tries: 4, successes: 1
+Extra constant evaluation: evaluated: 4, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/typedef.dart.strong.transformed.expect b/pkg/front_end/testcases/general/typedef.dart.strong.transformed.expect
index 4be9ba1..c1747f2 100644
--- a/pkg/front_end/testcases/general/typedef.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/typedef.dart.strong.transformed.expect
@@ -19,4 +19,4 @@
Evaluated: IsExpression @ org-dartlang-testcase:///typedef.dart:10:14 -> BoolConstant(true)
Evaluated: IsExpression @ org-dartlang-testcase:///typedef.dart:11:14 -> BoolConstant(false)
Evaluated: IsExpression @ org-dartlang-testcase:///typedef.dart:12:14 -> BoolConstant(false)
-Extra constant evaluation: tries: 6, successes: 3
+Extra constant evaluation: evaluated: 6, effectively constant: 3
diff --git a/pkg/front_end/testcases/general/void_methods.dart.strong.transformed.expect b/pkg/front_end/testcases/general/void_methods.dart.strong.transformed.expect
index a89e08f..e79e5a8 100644
--- a/pkg/front_end/testcases/general/void_methods.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/void_methods.dart.strong.transformed.expect
@@ -33,4 +33,4 @@
Extra constant evaluation status:
Evaluated: VariableGet @ org-dartlang-testcase:///void_methods.dart:7:24 -> IntConstant(0)
-Extra constant evaluation: tries: 36, successes: 1
+Extra constant evaluation: evaluated: 36, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/with_dependencies/issue43538/main.dart.outline.expect b/pkg/front_end/testcases/general/with_dependencies/issue43538/main.dart.outline.expect
index 75bd8af..a6664b4 100644
--- a/pkg/front_end/testcases/general/with_dependencies/issue43538/main.dart.outline.expect
+++ b/pkg/front_end/testcases/general/with_dependencies/issue43538/main.dart.outline.expect
@@ -56,4 +56,4 @@
Extra constant evaluation status:
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///main.dart:7:21 -> InstanceConstant(const B{A.d: 2.71, A.s: "default"})
-Extra constant evaluation: tries: 6, successes: 1
+Extra constant evaluation: evaluated: 6, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/with_dependencies/variance_from_dill/variance_from_dill.dart.strong.transformed.expect b/pkg/front_end/testcases/general/with_dependencies/variance_from_dill/variance_from_dill.dart.strong.transformed.expect
index c2f0c15..749e9d0 100644
--- a/pkg/front_end/testcases/general/with_dependencies/variance_from_dill/variance_from_dill.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/with_dependencies/variance_from_dill/variance_from_dill.dart.strong.transformed.expect
@@ -18,4 +18,4 @@
Extra constant evaluation status:
Evaluated: TypeLiteral @ org-dartlang-testcase:///variance_from_dill.dart:5:9 -> TypeLiteralConstant(dynamic Function(dynamic Function()*)*)
-Extra constant evaluation: tries: 2, successes: 1
+Extra constant evaluation: evaluated: 2, effectively constant: 1
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.transformed.expect
index f3b14c5..5d13162 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.transformed.expect
@@ -87,4 +87,4 @@
Extra constant evaluation status:
Evaluated: TypeLiteral @ org-dartlang-testcase:///bug33099.dart:23:42 -> TypeLiteralConstant(MyTest2*)
-Extra constant evaluation: tries: 33, successes: 1
+Extra constant evaluation: evaluated: 33, effectively constant: 1
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/casts.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/casts.dart.weak.transformed.expect
index e0df656..28908ee 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/casts.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/casts.dart.weak.transformed.expect
@@ -28,4 +28,4 @@
Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:20:13 -> BoolConstant(false)
Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:21:13 -> BoolConstant(false)
Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:22:13 -> BoolConstant(true)
-Extra constant evaluation: tries: 21, successes: 9
+Extra constant evaluation: evaluated: 21, effectively constant: 9
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/check_deferred_read_type.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/check_deferred_read_type.dart.weak.transformed.expect
index e6aa634..156d0a6 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/check_deferred_read_type.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/check_deferred_read_type.dart.weak.transformed.expect
@@ -39,4 +39,4 @@
Extra constant evaluation status:
Evaluated: TypeLiteral @ org-dartlang-testcase:///check_deferred_read_type.dart:11:13 -> TypeLiteralConstant(C*)
-Extra constant evaluation: tries: 4, successes: 1
+Extra constant evaluation: evaluated: 4, effectively constant: 1
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/compound_binary_implicit_as.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/compound_binary_implicit_as.dart.weak.transformed.expect
index 3af0af0..ded690f 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/compound_binary_implicit_as.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/compound_binary_implicit_as.dart.weak.transformed.expect
@@ -43,4 +43,4 @@
Extra constant evaluation status:
Evaluated: VariableGet @ org-dartlang-testcase:///compound_binary_implicit_as.dart:18:9 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///compound_binary_implicit_as.dart:18:9 -> IntConstant(0)
-Extra constant evaluation: tries: 16, successes: 2
+Extra constant evaluation: evaluated: 16, effectively constant: 2
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 006c2cc..fa89fde 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
@@ -107,4 +107,4 @@
Evaluated: MethodInvocation @ org-dartlang-testcase:///control_flow_collection.dart:20:26 -> IntConstant(-1)
Evaluated: MethodInvocation @ org-dartlang-testcase:///control_flow_collection.dart:29:29 -> IntConstant(-1)
Evaluated: MethodInvocation @ org-dartlang-testcase:///control_flow_collection.dart:29:33 -> IntConstant(-1)
-Extra constant evaluation: tries: 160, successes: 4
+Extra constant evaluation: evaluated: 160, effectively constant: 4
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.transformed.expect
index 224b225..5707da5 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.transformed.expect
@@ -52,4 +52,4 @@
Extra constant evaluation status:
Evaluated: VariableGet @ org-dartlang-testcase:///covariant_generic.dart:45:31 -> IntConstant(3)
Evaluated: VariableGet @ org-dartlang-testcase:///covariant_generic.dart:46:31 -> DoubleConstant(2.5)
-Extra constant evaluation: tries: 58, successes: 2
+Extra constant evaluation: evaluated: 58, effectively constant: 2
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/export_test.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/export_test.dart.weak.transformed.expect
index 3ecf074..405fb55 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/export_test.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/export_test.dart.weak.transformed.expect
@@ -14,4 +14,4 @@
Extra constant evaluation status:
Evaluated: TypeLiteral @ org-dartlang-testcase:///export_test.dart:16:9 -> TypeLiteralConstant(UserTag*)
-Extra constant evaluation: tries: 2, successes: 1
+Extra constant evaluation: evaluated: 2, effectively constant: 1
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect
index ce07630..4796426 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect
@@ -101,4 +101,4 @@
Evaluated: TypeLiteral @ org-dartlang-testcase:///expressions.dart:74:9 -> TypeLiteralConstant(int*)
Evaluated: VariableGetImpl @ org-dartlang-testcase:///expressions.dart:74:9 -> TypeLiteralConstant(int*)
Evaluated: VariableGet @ org-dartlang-testcase:///expressions.dart:74:9 -> TypeLiteralConstant(int*)
-Extra constant evaluation: tries: 138, successes: 6
+Extra constant evaluation: evaluated: 138, effectively constant: 6
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/implicit_scope_test.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/implicit_scope_test.dart.weak.transformed.expect
index 5135233..b63a7e4 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/implicit_scope_test.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/implicit_scope_test.dart.weak.transformed.expect
@@ -62,4 +62,4 @@
Extra constant evaluation status:
Evaluated: MethodInvocation @ org-dartlang-testcase:///implicit_scope_test.dart:14:18 -> BoolConstant(true)
Evaluated: MethodInvocation @ org-dartlang-testcase:///implicit_scope_test.dart:35:49 -> BoolConstant(false)
-Extra constant evaluation: tries: 28, successes: 2
+Extra constant evaluation: evaluated: 28, effectively constant: 2
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart.weak.transformed.expect
index 70af76d..a287469 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart.weak.transformed.expect
@@ -50,4 +50,4 @@
Extra constant evaluation status:
Evaluated: AsExpression @ org-dartlang-testcase:///invalid_type.dart:14:9 -> NullConstant(null)
-Extra constant evaluation: tries: 3, successes: 1
+Extra constant evaluation: evaluated: 3, effectively constant: 1
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/magic_const.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/magic_const.dart.weak.transformed.expect
index ffb08b7..ab4a00c 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/magic_const.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/magic_const.dart.weak.transformed.expect
@@ -72,4 +72,4 @@
Extra constant evaluation status:
Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///magic_const.dart:23:8 -> BoolConstant(false)
-Extra constant evaluation: tries: 2, successes: 1
+Extra constant evaluation: evaluated: 2, effectively constant: 1
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/minimum_int.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/minimum_int.dart.weak.transformed.expect
index 6bf610e..88f46a2 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/minimum_int.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/minimum_int.dart.weak.transformed.expect
@@ -8,4 +8,4 @@
Extra constant evaluation status:
Evaluated: MethodInvocation @ org-dartlang-testcase:///minimum_int.dart:1:17 -> IntConstant(-9223372036854775808)
-Extra constant evaluation: tries: 2, successes: 1
+Extra constant evaluation: evaluated: 2, effectively constant: 1
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.transformed.expect
index bc1404b..20f40c5 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.transformed.expect
@@ -137,4 +137,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///missing_toplevel.dart:30:48 -> IntConstant(2)
Evaluated: VariableGet @ org-dartlang-testcase:///missing_toplevel.dart:31:41 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///missing_toplevel.dart:31:48 -> IntConstant(2)
-Extra constant evaluation: tries: 37, successes: 5
+Extra constant evaluation: evaluated: 37, effectively constant: 5
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.transformed.expect
index 4f7e0a0..715890e 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.transformed.expect
@@ -369,4 +369,4 @@
Extra constant evaluation status:
Evaluated: VariableGet @ org-dartlang-testcase:///operator_method_not_found.dart:31:18 -> IntConstant(2)
-Extra constant evaluation: tries: 74, successes: 1
+Extra constant evaluation: evaluated: 74, effectively constant: 1
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/type_variable_uses.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/type_variable_uses.dart.weak.transformed.expect
index 1680081..8deddad 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/type_variable_uses.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/type_variable_uses.dart.weak.transformed.expect
@@ -115,4 +115,4 @@
Extra constant evaluation status:
Evaluated: TypeLiteral @ org-dartlang-testcase:///type_variable_uses.dart:10:11 -> TypeLiteralConstant(<invalid>)
-Extra constant evaluation: tries: 4, successes: 1
+Extra constant evaluation: evaluated: 4, effectively constant: 1
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/typedef.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/typedef.dart.weak.transformed.expect
index 801da4f..6176ac4 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/typedef.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/typedef.dart.weak.transformed.expect
@@ -19,4 +19,4 @@
Evaluated: IsExpression @ org-dartlang-testcase:///typedef.dart:12:14 -> BoolConstant(true)
Evaluated: IsExpression @ org-dartlang-testcase:///typedef.dart:13:14 -> BoolConstant(false)
Evaluated: IsExpression @ org-dartlang-testcase:///typedef.dart:14:14 -> BoolConstant(false)
-Extra constant evaluation: tries: 6, successes: 3
+Extra constant evaluation: evaluated: 6, effectively constant: 3
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/void_methods.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/void_methods.dart.weak.transformed.expect
index c00d5b7..9358d88 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/void_methods.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/void_methods.dart.weak.transformed.expect
@@ -33,4 +33,4 @@
Extra constant evaluation status:
Evaluated: VariableGet @ org-dartlang-testcase:///void_methods.dart:9:24 -> IntConstant(0)
-Extra constant evaluation: tries: 36, successes: 1
+Extra constant evaluation: evaluated: 36, effectively constant: 1
diff --git a/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.strong.transformed.expect b/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.strong.transformed.expect
index c3f99a8..e9cba62 100644
--- a/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.strong.transformed.expect
@@ -204,4 +204,4 @@
Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:160:10 -> IntConstant(-23)
Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:161:10 -> IntConstant(-11)
Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:162:10 -> IntConstant(-11)
-Extra constant evaluation: tries: 322, successes: 17
+Extra constant evaluation: evaluated: 322, effectively constant: 17
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/experiments_enabled_1.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/experiments_enabled_1.yaml
index 7b083ef..9af8d7f 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/experiments_enabled_1.yaml
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/experiments_enabled_1.yaml
@@ -14,8 +14,8 @@
main() {
dynamic x;
print(x >>> 2);
- Class? c = new Class() as Class?;
+ Class? c = new Class();
print(c!);
}
class Class {}
- expectedLibraryCount: 1
+ expectedLibraryCount: 1
\ No newline at end of file
diff --git a/pkg/front_end/testcases/inference/bug30624.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/bug30624.dart.strong.transformed.expect
index 2981516..e985e99 100644
--- a/pkg/front_end/testcases/inference/bug30624.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30624.dart.strong.transformed.expect
@@ -49,4 +49,4 @@
Extra constant evaluation status:
Evaluated: MethodInvocation @ org-dartlang-testcase:///bug30624.dart:40:35 -> IntConstant(-1)
-Extra constant evaluation: tries: 47, successes: 1
+Extra constant evaluation: evaluated: 47, effectively constant: 1
diff --git a/pkg/front_end/testcases/inference/complex_predecrement.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/complex_predecrement.dart.strong.transformed.expect
index 9385400..ff145dc 100644
--- a/pkg/front_end/testcases/inference/complex_predecrement.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/complex_predecrement.dart.strong.transformed.expect
@@ -11,4 +11,4 @@
Extra constant evaluation status:
Evaluated: VariableGet @ org-dartlang-testcase:///complex_predecrement.dart:10:75 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///complex_predecrement.dart:10:75 -> IntConstant(0)
-Extra constant evaluation: tries: 16, successes: 2
+Extra constant evaluation: evaluated: 16, effectively constant: 2
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.outline.expect
index f717ce5..1cea698 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.outline.expect
@@ -57,4 +57,4 @@
Extra constant evaluation status:
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///downwards_inference_annotations.dart:13:2 -> InstanceConstant(const Foo{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///downwards_inference_annotations.dart:16:2 -> InstanceConstant(const Foo{})
-Extra constant evaluation: tries: 2, successes: 2
+Extra constant evaluation: evaluated: 2, effectively constant: 2
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.outline.expect
index c319b9f..f6d0c76 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.outline.expect
@@ -44,4 +44,4 @@
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///downwards_inference_annotations_class_members.dart:13:4 -> InstanceConstant(const Foo{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///downwards_inference_annotations_class_members.dart:19:4 -> InstanceConstant(const Foo{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///downwards_inference_annotations_class_members.dart:16:4 -> InstanceConstant(const Foo{})
-Extra constant evaluation: tries: 3, successes: 3
+Extra constant evaluation: evaluated: 3, effectively constant: 3
diff --git a/pkg/front_end/testcases/inference/future_then.dart.outline.expect b/pkg/front_end/testcases/inference/future_then.dart.outline.expect
index ec42741..903b67e 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.outline.expect
@@ -52,4 +52,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then.dart:10:7 -> SymbolConstant(#timeout)
Evaluated: ListLiteral @ org-dartlang-testcase:///future_then.dart:10:7 -> ListConstant(const <Type*>[])
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then.dart:10:7 -> SymbolConstant(#onTimeout)
-Extra constant evaluation: tries: 46, successes: 13
+Extra constant evaluation: evaluated: 46, effectively constant: 13
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_2.dart.outline.expect
index ac1e337..590e815 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.outline.expect
@@ -52,4 +52,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_2.dart:10:7 -> SymbolConstant(#timeout)
Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_2.dart:10:7 -> ListConstant(const <Type*>[])
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_2.dart:10:7 -> SymbolConstant(#onTimeout)
-Extra constant evaluation: tries: 46, successes: 13
+Extra constant evaluation: evaluated: 46, effectively constant: 13
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_3.dart.outline.expect
index d64ec98..127f049 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.outline.expect
@@ -52,4 +52,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_3.dart:10:7 -> SymbolConstant(#timeout)
Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_3.dart:10:7 -> ListConstant(const <Type*>[])
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_3.dart:10:7 -> SymbolConstant(#onTimeout)
-Extra constant evaluation: tries: 46, successes: 13
+Extra constant evaluation: evaluated: 46, effectively constant: 13
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_4.dart.outline.expect
index 4cb8414..c3a7845 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.outline.expect
@@ -52,4 +52,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_4.dart:10:7 -> SymbolConstant(#timeout)
Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_4.dart:10:7 -> ListConstant(const <Type*>[])
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_4.dart:10:7 -> SymbolConstant(#onTimeout)
-Extra constant evaluation: tries: 46, successes: 13
+Extra constant evaluation: evaluated: 46, effectively constant: 13
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_5.dart.outline.expect
index 94fdb61..9bddbcd 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.outline.expect
@@ -52,4 +52,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_5.dart:10:7 -> SymbolConstant(#timeout)
Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_5.dart:10:7 -> ListConstant(const <Type*>[])
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_5.dart:10:7 -> SymbolConstant(#onTimeout)
-Extra constant evaluation: tries: 46, successes: 13
+Extra constant evaluation: evaluated: 46, effectively constant: 13
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_6.dart.outline.expect
index 0a04fa8..908df9c 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.outline.expect
@@ -52,4 +52,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_6.dart:10:7 -> SymbolConstant(#timeout)
Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_6.dart:10:7 -> ListConstant(const <Type*>[])
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_6.dart:10:7 -> SymbolConstant(#onTimeout)
-Extra constant evaluation: tries: 46, successes: 13
+Extra constant evaluation: evaluated: 46, effectively constant: 13
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.outline.expect
index 2f91f22..f0c10fb 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.outline.expect
@@ -52,4 +52,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional.dart:10:7 -> SymbolConstant(#timeout)
Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional.dart:10:7 -> ListConstant(const <Type*>[])
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional.dart:10:7 -> SymbolConstant(#onTimeout)
-Extra constant evaluation: tries: 46, successes: 13
+Extra constant evaluation: evaluated: 46, effectively constant: 13
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.outline.expect
index 83b70a3..6d7ac2e 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.outline.expect
@@ -52,4 +52,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_2.dart:10:7 -> SymbolConstant(#timeout)
Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_2.dart:10:7 -> ListConstant(const <Type*>[])
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_2.dart:10:7 -> SymbolConstant(#onTimeout)
-Extra constant evaluation: tries: 46, successes: 13
+Extra constant evaluation: evaluated: 46, effectively constant: 13
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.outline.expect
index c6dbbe3..5942aa9 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.outline.expect
@@ -52,4 +52,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_3.dart:10:7 -> SymbolConstant(#timeout)
Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_3.dart:10:7 -> ListConstant(const <Type*>[])
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_3.dart:10:7 -> SymbolConstant(#onTimeout)
-Extra constant evaluation: tries: 46, successes: 13
+Extra constant evaluation: evaluated: 46, effectively constant: 13
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.outline.expect
index 980c668..e3979f7 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.outline.expect
@@ -52,4 +52,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_4.dart:10:7 -> SymbolConstant(#timeout)
Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_4.dart:10:7 -> ListConstant(const <Type*>[])
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_4.dart:10:7 -> SymbolConstant(#onTimeout)
-Extra constant evaluation: tries: 46, successes: 13
+Extra constant evaluation: evaluated: 46, effectively constant: 13
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.outline.expect
index c2895c0..a52e25c 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.outline.expect
@@ -52,4 +52,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_5.dart:10:7 -> SymbolConstant(#timeout)
Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_5.dart:10:7 -> ListConstant(const <Type*>[])
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_5.dart:10:7 -> SymbolConstant(#onTimeout)
-Extra constant evaluation: tries: 46, successes: 13
+Extra constant evaluation: evaluated: 46, effectively constant: 13
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.outline.expect
index 19d530b..7b0d48e 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.outline.expect
@@ -52,4 +52,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_6.dart:10:7 -> SymbolConstant(#timeout)
Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_6.dart:10:7 -> ListConstant(const <Type*>[])
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_6.dart:10:7 -> SymbolConstant(#onTimeout)
-Extra constant evaluation: tries: 46, successes: 13
+Extra constant evaluation: evaluated: 46, effectively constant: 13
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.outline.expect
index 3d435d2..e4600c3 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.outline.expect
@@ -52,4 +52,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_ifNull.dart:10:7 -> SymbolConstant(#timeout)
Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_ifNull.dart:10:7 -> ListConstant(const <Type*>[])
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_ifNull.dart:10:7 -> SymbolConstant(#onTimeout)
-Extra constant evaluation: tries: 46, successes: 13
+Extra constant evaluation: evaluated: 46, effectively constant: 13
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.outline.expect
index dfeda7b..5309f49 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.outline.expect
@@ -52,4 +52,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards.dart:10:7 -> SymbolConstant(#timeout)
Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_upwards.dart:10:7 -> ListConstant(const <Type*>[])
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards.dart:10:7 -> SymbolConstant(#onTimeout)
-Extra constant evaluation: tries: 46, successes: 13
+Extra constant evaluation: evaluated: 46, effectively constant: 13
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.outline.expect
index 0a65e79..6b301eb 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.outline.expect
@@ -52,4 +52,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards_2.dart:10:7 -> SymbolConstant(#timeout)
Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_upwards_2.dart:10:7 -> ListConstant(const <Type*>[])
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards_2.dart:10:7 -> SymbolConstant(#onTimeout)
-Extra constant evaluation: tries: 46, successes: 13
+Extra constant evaluation: evaluated: 46, effectively constant: 13
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.outline.expect
index 8b87fb7..0085139 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.outline.expect
@@ -54,4 +54,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards_3.dart:10:7 -> SymbolConstant(#timeout)
Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_upwards_3.dart:10:7 -> ListConstant(const <Type*>[])
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards_3.dart:10:7 -> SymbolConstant(#onTimeout)
-Extra constant evaluation: tries: 46, successes: 13
+Extra constant evaluation: evaluated: 46, effectively constant: 13
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.outline.expect
index 5cc3d38..739558d 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.outline.expect
@@ -56,4 +56,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_async_conditional.dart:10:7 -> SymbolConstant(#timeout)
Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_async_conditional.dart:10:7 -> ListConstant(const <Type*>[])
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_async_conditional.dart:10:7 -> SymbolConstant(#onTimeout)
-Extra constant evaluation: tries: 46, successes: 13
+Extra constant evaluation: evaluated: 46, effectively constant: 13
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.outline.expect
index 81ac385..04c973a 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.outline.expect
@@ -56,4 +56,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_async_conditional_2.dart:10:7 -> SymbolConstant(#timeout)
Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_async_conditional_2.dart:10:7 -> ListConstant(const <Type*>[])
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_async_conditional_2.dart:10:7 -> SymbolConstant(#onTimeout)
-Extra constant evaluation: tries: 46, successes: 13
+Extra constant evaluation: evaluated: 46, effectively constant: 13
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.outline.expect
index b9cf624..ef0889f 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.outline.expect
@@ -57,4 +57,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards.dart:10:7 -> SymbolConstant(#timeout)
Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards.dart:10:7 -> ListConstant(const <Type*>[])
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards.dart:10:7 -> SymbolConstant(#onTimeout)
-Extra constant evaluation: tries: 46, successes: 13
+Extra constant evaluation: evaluated: 46, effectively constant: 13
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.outline.expect
index 9b8efa6..8471c54 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.outline.expect
@@ -57,4 +57,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_2.dart:10:7 -> SymbolConstant(#timeout)
Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards_2.dart:10:7 -> ListConstant(const <Type*>[])
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_2.dart:10:7 -> SymbolConstant(#onTimeout)
-Extra constant evaluation: tries: 46, successes: 13
+Extra constant evaluation: evaluated: 46, effectively constant: 13
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.outline.expect
index b1257cb..d14c4a7 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.outline.expect
@@ -57,4 +57,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_3.dart:10:7 -> SymbolConstant(#timeout)
Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards_3.dart:10:7 -> ListConstant(const <Type*>[])
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_3.dart:10:7 -> SymbolConstant(#onTimeout)
-Extra constant evaluation: tries: 46, successes: 13
+Extra constant evaluation: evaluated: 46, effectively constant: 13
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.outline.expect
index 4c1cf46..3853e42 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.outline.expect
@@ -57,4 +57,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_4.dart:10:7 -> SymbolConstant(#timeout)
Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards_4.dart:10:7 -> ListConstant(const <Type*>[])
Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_4.dart:10:7 -> SymbolConstant(#onTimeout)
-Extra constant evaluation: tries: 46, successes: 13
+Extra constant evaluation: evaluated: 46, effectively constant: 13
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect
index c7dfb50..0034901 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect
@@ -155,4 +155,4 @@
Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:47:72 -> PartialInstantiationConstant(min<num*>)
Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:48:65 -> PartialInstantiationConstant(min<Object*>)
Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:49:65 -> PartialInstantiationConstant(min<Object*>)
-Extra constant evaluation: tries: 133, successes: 28
+Extra constant evaluation: evaluated: 133, effectively constant: 28
diff --git a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.strong.transformed.expect
index 369ced0..854ab35 100644
--- a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.strong.transformed.expect
@@ -50,4 +50,4 @@
Extra constant evaluation status:
Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_nested_generic_instantiation.dart:28:71 -> PartialInstantiationConstant(max<int*>)
Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_nested_generic_instantiation.dart:29:67 -> PartialInstantiationConstant(max<int*>)
-Extra constant evaluation: tries: 16, successes: 2
+Extra constant evaluation: evaluated: 16, effectively constant: 2
diff --git a/pkg/front_end/testcases/inference/infer_binary_double_double.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_binary_double_double.dart.strong.transformed.expect
index 34352bf..944c9ba 100644
--- a/pkg/front_end/testcases/inference/infer_binary_double_double.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_binary_double_double.dart.strong.transformed.expect
@@ -43,4 +43,4 @@
Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_double.dart:17:45 -> BoolConstant(false)
Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_double.dart:18:42 -> BoolConstant(true)
Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_double.dart:19:41 -> DoubleConstant(1.0)
-Extra constant evaluation: tries: 24, successes: 12
+Extra constant evaluation: evaluated: 24, effectively constant: 12
diff --git a/pkg/front_end/testcases/inference/infer_binary_double_int.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_binary_double_int.dart.strong.transformed.expect
index efbfc78..c3d3a34 100644
--- a/pkg/front_end/testcases/inference/infer_binary_double_int.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_binary_double_int.dart.strong.transformed.expect
@@ -43,4 +43,4 @@
Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_int.dart:17:45 -> BoolConstant(false)
Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_int.dart:18:42 -> BoolConstant(true)
Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_int.dart:19:41 -> DoubleConstant(1.0)
-Extra constant evaluation: tries: 24, successes: 12
+Extra constant evaluation: evaluated: 24, effectively constant: 12
diff --git a/pkg/front_end/testcases/inference/infer_binary_int_double.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_binary_int_double.dart.strong.transformed.expect
index f75e4f5..c9a0c95 100644
--- a/pkg/front_end/testcases/inference/infer_binary_int_double.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_binary_int_double.dart.strong.transformed.expect
@@ -43,4 +43,4 @@
Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_double.dart:17:43 -> BoolConstant(false)
Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_double.dart:18:40 -> BoolConstant(true)
Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_double.dart:19:36 -> DoubleConstant(1.0)
-Extra constant evaluation: tries: 24, successes: 12
+Extra constant evaluation: evaluated: 24, effectively constant: 12
diff --git a/pkg/front_end/testcases/inference/infer_binary_int_int.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_binary_int_int.dart.strong.transformed.expect
index b8f9738..e0f1ccf 100644
--- a/pkg/front_end/testcases/inference/infer_binary_int_int.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_binary_int_int.dart.strong.transformed.expect
@@ -58,4 +58,4 @@
Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_int.dart:22:43 -> BoolConstant(false)
Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_int.dart:23:40 -> BoolConstant(true)
Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_int.dart:24:36 -> IntConstant(1)
-Extra constant evaluation: tries: 34, successes: 17
+Extra constant evaluation: evaluated: 34, effectively constant: 17
diff --git a/pkg/front_end/testcases/inference/infer_conditional.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_conditional.dart.strong.transformed.expect
index 63741d8..c348897 100644
--- a/pkg/front_end/testcases/inference/infer_conditional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_conditional.dart.strong.transformed.expect
@@ -13,4 +13,4 @@
Extra constant evaluation status:
Evaluated: ConditionalExpression @ org-dartlang-testcase:///infer_conditional.dart:8:35 -> DoubleConstant(2.0)
Evaluated: ConditionalExpression @ org-dartlang-testcase:///infer_conditional.dart:9:35 -> IntConstant(2)
-Extra constant evaluation: tries: 4, successes: 2
+Extra constant evaluation: evaluated: 4, effectively constant: 2
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.outline.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.outline.expect
index d35e13b..f89bc38 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.outline.expect
@@ -40,4 +40,4 @@
Evaluated: StaticGet @ org-dartlang-testcase:///infer_consts_transitively_2.dart:11:12 -> IntConstant(2)
Evaluated: StaticGet @ org-dartlang-testcase:///infer_consts_transitively_2_a.dart:10:12 -> IntConstant(2)
Evaluated: StaticGet @ org-dartlang-testcase:///infer_consts_transitively_2_a.dart:11:12 -> IntConstant(2)
-Extra constant evaluation: tries: 4, successes: 4
+Extra constant evaluation: evaluated: 4, effectively constant: 4
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.outline.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.outline.expect
index 8355e57..1b5944d 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.outline.expect
@@ -40,4 +40,4 @@
Evaluated: StaticGet @ org-dartlang-testcase:///infer_consts_transitively_2_a.dart:11:12 -> IntConstant(2)
Evaluated: StaticGet @ org-dartlang-testcase:///infer_consts_transitively_2.dart:10:12 -> IntConstant(2)
Evaluated: StaticGet @ org-dartlang-testcase:///infer_consts_transitively_2.dart:11:12 -> IntConstant(2)
-Extra constant evaluation: tries: 4, successes: 4
+Extra constant evaluation: evaluated: 4, effectively constant: 4
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 f97ff69..544c4cb 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
@@ -189,4 +189,4 @@
Extra constant evaluation status:
Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_from_complex_expressions_if_outer_most_value_is_precise.dart:27:25 -> IntConstant(5)
Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_from_complex_expressions_if_outer_most_value_is_precise.dart:30:32 -> IntConstant(-3)
-Extra constant evaluation: tries: 74, successes: 2
+Extra constant evaluation: evaluated: 74, effectively constant: 2
diff --git a/pkg/front_end/testcases/inference/infer_prefix_expression.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_prefix_expression.dart.strong.transformed.expect
index a232a1b..d0e0ac7 100644
--- a/pkg/front_end/testcases/inference/infer_prefix_expression.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_prefix_expression.dart.strong.transformed.expect
@@ -16,4 +16,4 @@
Evaluated: Not @ org-dartlang-testcase:///infer_prefix_expression.dart:8:13 -> BoolConstant(false)
Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_prefix_expression.dart:9:38 -> IntConstant(-2)
Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_prefix_expression.dart:10:39 -> IntConstant(-1)
-Extra constant evaluation: tries: 6, successes: 3
+Extra constant evaluation: evaluated: 6, effectively constant: 3
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.outline.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.outline.expect
index 5180a33..f02cb50 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.outline.expect
@@ -48,4 +48,4 @@
Evaluated: StaticGet @ org-dartlang-testcase:///infer_statics_transitively3.dart:14:14 -> IntConstant(4)
Evaluated: StaticGet @ org-dartlang-testcase:///infer_statics_transitively3.dart:15:14 -> NullConstant(null)
Evaluated: StaticGet @ org-dartlang-testcase:///infer_statics_transitively3.dart:16:16 -> NullConstant(null)
-Extra constant evaluation: tries: 5, successes: 5
+Extra constant evaluation: evaluated: 5, effectively constant: 5
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.outline.expect
index 457bfee..7fa241a 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.outline.expect
@@ -30,4 +30,4 @@
Extra constant evaluation status:
Evaluated: ListLiteral @ org-dartlang-testcase:///inferred_type_is_enum.dart:8:6 -> ListConstant(const <E*>[const E{E.index: 0, E._name: "E.v1"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inferred_type_is_enum.dart:8:10 -> InstanceConstant(const E{E.index: 0, E._name: "E.v1"})
-Extra constant evaluation: tries: 6, successes: 2
+Extra constant evaluation: evaluated: 6, effectively constant: 2
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.outline.expect
index ed56360..3c0b3c8 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.outline.expect
@@ -30,4 +30,4 @@
Extra constant evaluation status:
Evaluated: ListLiteral @ org-dartlang-testcase:///inferred_type_is_enum_values.dart:8:6 -> ListConstant(const <E*>[const E{E.index: 0, E._name: "E.v1"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inferred_type_is_enum_values.dart:8:10 -> InstanceConstant(const E{E.index: 0, E._name: "E.v1"})
-Extra constant evaluation: tries: 6, successes: 2
+Extra constant evaluation: evaluated: 6, effectively constant: 2
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.transformed.expect
index c809710..392e7e7 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.transformed.expect
@@ -51,4 +51,4 @@
Extra constant evaluation status:
Evaluated: Instantiation @ org-dartlang-testcase:///instantiate_tearoff.dart:25:10 -> PartialInstantiationConstant(f<int*>)
Evaluated: Instantiation @ org-dartlang-testcase:///instantiate_tearoff.dart:27:12 -> PartialInstantiationConstant(C.g<int*>)
-Extra constant evaluation: tries: 18, successes: 2
+Extra constant evaluation: evaluated: 18, effectively constant: 2
diff --git a/pkg/front_end/testcases/inference/override_equals.dart.outline.expect b/pkg/front_end/testcases/inference/override_equals.dart.outline.expect
index a23d9ae..f4c4777 100644
--- a/pkg/front_end/testcases/inference/override_equals.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/override_equals.dart.outline.expect
@@ -32,4 +32,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///override_equals.dart:9:4 -> InstanceConstant(const _Override{})
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/inference/reference_to_typedef.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/reference_to_typedef.dart.strong.transformed.expect
index 84f9764..1892d0c 100644
--- a/pkg/front_end/testcases/inference/reference_to_typedef.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/reference_to_typedef.dart.strong.transformed.expect
@@ -9,4 +9,4 @@
Extra constant evaluation status:
Evaluated: TypeLiteral @ org-dartlang-testcase:///reference_to_typedef.dart:9:11 -> TypeLiteralConstant(void Function()*)
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/inference/static_method_tear_off.dart.outline.expect b/pkg/front_end/testcases/inference/static_method_tear_off.dart.outline.expect
index bb135a1..37761d3 100644
--- a/pkg/front_end/testcases/inference/static_method_tear_off.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/static_method_tear_off.dart.outline.expect
@@ -25,4 +25,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///static_method_tear_off.dart:8:13 -> TearOffConstant(C.f)
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart b/pkg/front_end/testcases/inference_new/const_invocation.dart
index 8525174..4e58d44 100644
--- a/pkg/front_end/testcases/inference_new/const_invocation.dart
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart
@@ -8,7 +8,7 @@
typedef V F<U, V>(U u);
class Foo<T> {
- Bar<T> get v1 => const /*@ typeArgs=Null? */ Bar();
+ Bar<T> get v1 => const /*@typeArgs=Null?*/ Bar();
Bar<List<T>> get v2 => const /*@ typeArgs=List<Null?>* */ Bar();
Bar<F<T, T>> get v3 => const /*@ typeArgs=(Object*) ->* Null? */ Bar();
Bar<F<F<T, T>, T>> get v4 =>
diff --git a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.transformed.expect
index 4565d72..2c14e98 100644
--- a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.transformed.expect
@@ -138,4 +138,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///indexed_assign_combiner.dart:49:41 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///indexed_assign_combiner.dart:51:45 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///indexed_assign_combiner.dart:51:45 -> IntConstant(0)
-Extra constant evaluation: tries: 78, successes: 12
+Extra constant evaluation: evaluated: 78, effectively constant: 12
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.strong.transformed.expect
index d866bd3..d239253 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.strong.transformed.expect
@@ -11,4 +11,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///infer_assign_to_index.dart:9:34 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///infer_assign_to_index.dart:9:39 -> DoubleConstant(1.0)
Evaluated: VariableGet @ org-dartlang-testcase:///infer_assign_to_index.dart:9:39 -> DoubleConstant(1.0)
-Extra constant evaluation: tries: 11, successes: 3
+Extra constant evaluation: evaluated: 11, effectively constant: 3
diff --git a/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.strong.transformed.expect
index b528c5d..9c70f2f 100644
--- a/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.strong.transformed.expect
@@ -107,4 +107,4 @@
Evaluated: MethodInvocation @ org-dartlang-testcase:///initializer_rewrite_from_opt_out_lib.dart:7:30 -> BoolConstant(true)
Evaluated: VariableGet @ org-dartlang-testcase:///initializer_rewrite_from_opt_out_lib.dart:7:30 -> NullConstant(null)
Evaluated: VariableGet @ org-dartlang-testcase:///initializer_rewrite_from_opt_out_lib.dart:7:30 -> NullConstant(null)
-Extra constant evaluation: tries: 185, successes: 3
+Extra constant evaluation: evaluated: 185, effectively constant: 3
diff --git a/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.outline.expect b/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.outline.expect
index 94538ef..fc7694c 100644
--- a/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.outline.expect
@@ -27,4 +27,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.outline.expect b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.outline.expect
index e4dd765..b7a7d1d 100644
--- a/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.outline.expect
@@ -42,4 +42,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///issue41436c_lib.dart:6:12 -> SymbolConstant(#_#A#x=)
Evaluated: ListLiteral @ org-dartlang-testcase:///issue41436c_lib.dart:6:12 -> ListConstant(const <Type*>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///issue41436c_lib.dart:6:12 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 19, successes: 7
+Extra constant evaluation: evaluated: 19, effectively constant: 7
diff --git a/pkg/front_end/testcases/late_lowering/late_annotations.dart.outline.expect b/pkg/front_end/testcases/late_lowering/late_annotations.dart.outline.expect
index 52cdbab..bcd034d 100644
--- a/pkg/front_end/testcases/late_lowering/late_annotations.dart.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/late_annotations.dart.outline.expect
@@ -150,4 +150,4 @@
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:68:4 -> InstanceConstant(const Annotation{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:68:4 -> InstanceConstant(const Annotation{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:71:4 -> InstanceConstant(const Annotation{})
-Extra constant evaluation: tries: 34, successes: 34
+Extra constant evaluation: evaluated: 34, effectively constant: 34
diff --git a/pkg/front_end/testcases/late_lowering/late_annotations.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_annotations.dart.strong.transformed.expect
index 8bde560..4555905 100644
--- a/pkg/front_end/testcases/late_lowering/late_annotations.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_annotations.dart.strong.transformed.expect
@@ -178,4 +178,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///late_annotations.dart:61:25 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///late_annotations.dart:16:16 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///late_annotations.dart:72:25 -> IntConstant(0)
-Extra constant evaluation: tries: 268, successes: 6
+Extra constant evaluation: evaluated: 268, effectively constant: 6
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.transformed.expect
index 3306393..6fe95bd 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.transformed.expect
@@ -65,4 +65,4 @@
Extra constant evaluation status:
Evaluated: MethodInvocation @ org-dartlang-testcase:///late_final_nullable_local_without_initializer.dart:12:9 -> BoolConstant(true)
Evaluated: MethodInvocation @ org-dartlang-testcase:///late_final_nullable_local_without_initializer.dart:26:11 -> BoolConstant(true)
-Extra constant evaluation: tries: 81, successes: 2
+Extra constant evaluation: evaluated: 81, effectively constant: 2
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.transformed.expect
index 3306393..6fe95bd 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.transformed.expect
@@ -65,4 +65,4 @@
Extra constant evaluation status:
Evaluated: MethodInvocation @ org-dartlang-testcase:///late_final_nullable_local_without_initializer.dart:12:9 -> BoolConstant(true)
Evaluated: MethodInvocation @ org-dartlang-testcase:///late_final_nullable_local_without_initializer.dart:26:11 -> BoolConstant(true)
-Extra constant evaluation: tries: 81, successes: 2
+Extra constant evaluation: evaluated: 81, effectively constant: 2
diff --git a/pkg/front_end/testcases/late_lowering/later.dart.outline.expect b/pkg/front_end/testcases/late_lowering/later.dart.outline.expect
index 871c4c8..8288606 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/later.dart.outline.expect
@@ -57,4 +57,4 @@
Extra constant evaluation status:
Evaluated: VariableGet @ org-dartlang-testcase:///later.dart:46:18 -> IntConstant(42)
-Extra constant evaluation: tries: 17, successes: 1
+Extra constant evaluation: evaluated: 17, effectively constant: 1
diff --git a/pkg/front_end/testcases/late_lowering/later.dart.strong.expect b/pkg/front_end/testcases/late_lowering/later.dart.strong.expect
index 4646abe..cdcf986 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/later.dart.strong.expect
@@ -55,12 +55,12 @@
// late String s2 = '${fisk}${await hest()}${fisk}'; // Error.
// ^^^^^
//
-// pkg/front_end/testcases/late_lowering/later.dart:48:9: Error: Constructor is marked 'const' so fields can't be late.
-// const B(); // Error: B has late final fields.
-// ^
-// pkg/front_end/testcases/late_lowering/later.dart:46:18: Context: Field is late, but constructor is 'const'.
+// pkg/front_end/testcases/late_lowering/later.dart:46:18: Error: Can't have a late final field in a class with a const constructor.
// late final int x = 42;
// ^
+// pkg/front_end/testcases/late_lowering/later.dart:48:9: Context: This constructor is const.
+// const B(); // Error: B has late final fields.
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/late_lowering/later.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/later.dart.strong.transformed.expect
index ddeb453..7afe2ac 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/later.dart.strong.transformed.expect
@@ -55,12 +55,12 @@
// late String s2 = '${fisk}${await hest()}${fisk}'; // Error.
// ^^^^^
//
-// pkg/front_end/testcases/late_lowering/later.dart:48:9: Error: Constructor is marked 'const' so fields can't be late.
-// const B(); // Error: B has late final fields.
-// ^
-// pkg/front_end/testcases/late_lowering/later.dart:46:18: Context: Field is late, but constructor is 'const'.
+// pkg/front_end/testcases/late_lowering/later.dart:46:18: Error: Can't have a late final field in a class with a const constructor.
// late final int x = 42;
// ^
+// pkg/front_end/testcases/late_lowering/later.dart:48:9: Context: This constructor is const.
+// const B(); // Error: B has late final fields.
+// ^
//
import self as self;
import "dart:core" as core;
@@ -271,4 +271,4 @@
Extra constant evaluation status:
Evaluated: VariableGet @ org-dartlang-testcase:///later.dart:46:18 -> IntConstant(42)
-Extra constant evaluation: tries: 216, successes: 1
+Extra constant evaluation: evaluated: 216, effectively constant: 1
diff --git a/pkg/front_end/testcases/late_lowering/later.dart.weak.expect b/pkg/front_end/testcases/late_lowering/later.dart.weak.expect
index 3a9b187..1144c13 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/later.dart.weak.expect
@@ -55,12 +55,12 @@
// late String s2 = '${fisk}${await hest()}${fisk}'; // Error.
// ^^^^^
//
-// pkg/front_end/testcases/late_lowering/later.dart:48:9: Error: Constructor is marked 'const' so fields can't be late.
-// const B(); // Error: B has late final fields.
-// ^
-// pkg/front_end/testcases/late_lowering/later.dart:46:18: Context: Field is late, but constructor is 'const'.
+// pkg/front_end/testcases/late_lowering/later.dart:46:18: Error: Can't have a late final field in a class with a const constructor.
// late final int x = 42;
// ^
+// pkg/front_end/testcases/late_lowering/later.dart:48:9: Context: This constructor is const.
+// const B(); // Error: B has late final fields.
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/late_lowering/later.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/later.dart.weak.transformed.expect
index 27b946d..4dac8b1 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/later.dart.weak.transformed.expect
@@ -55,12 +55,12 @@
// late String s2 = '${fisk}${await hest()}${fisk}'; // Error.
// ^^^^^
//
-// pkg/front_end/testcases/late_lowering/later.dart:48:9: Error: Constructor is marked 'const' so fields can't be late.
-// const B(); // Error: B has late final fields.
-// ^
-// pkg/front_end/testcases/late_lowering/later.dart:46:18: Context: Field is late, but constructor is 'const'.
+// pkg/front_end/testcases/late_lowering/later.dart:46:18: Error: Can't have a late final field in a class with a const constructor.
// late final int x = 42;
// ^
+// pkg/front_end/testcases/late_lowering/later.dart:48:9: Context: This constructor is const.
+// const B(); // Error: B has late final fields.
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.transformed.expect
index 27673f7..0980864 100644
--- a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.transformed.expect
@@ -239,4 +239,4 @@
Evaluated: MethodInvocation @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:36:16 -> BoolConstant(true)
Evaluated: VariableGet @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:36:16 -> NullConstant(null)
Evaluated: VariableGet @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:36:16 -> NullConstant(null)
-Extra constant evaluation: tries: 291, successes: 21
+Extra constant evaluation: evaluated: 291, effectively constant: 21
diff --git a/pkg/front_end/testcases/late_lowering/override.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/override.dart.strong.transformed.expect
index 98d7c8d..f94376c 100644
--- a/pkg/front_end/testcases/late_lowering/override.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/override.dart.strong.transformed.expect
@@ -123,4 +123,4 @@
Extra constant evaluation status:
Evaluated: VariableGet @ org-dartlang-testcase:///override.dart:16:18 -> IntConstant(0)
-Extra constant evaluation: tries: 232, successes: 1
+Extra constant evaluation: evaluated: 232, effectively constant: 1
diff --git a/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.transformed.expect
index 886c804..6466db6 100644
--- a/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.transformed.expect
@@ -91,4 +91,4 @@
Extra constant evaluation status:
Evaluated: VariableGet @ org-dartlang-testcase:///override_getter_setter.dart:18:18 -> IntConstant(2)
-Extra constant evaluation: tries: 119, successes: 1
+Extra constant evaluation: evaluated: 119, effectively constant: 1
diff --git a/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.strong.transformed.expect
index 41b22c9..6d153d9 100644
--- a/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.strong.transformed.expect
@@ -51,4 +51,4 @@
Extra constant evaluation status:
Evaluated: VariableGet @ org-dartlang-testcase:///late_fields.dart:11:17 -> NullConstant(null)
Evaluated: VariableGet @ org-dartlang-testcase:///late_fields.dart:12:16 -> IntConstant(0)
-Extra constant evaluation: tries: 98, successes: 2
+Extra constant evaluation: evaluated: 98, effectively constant: 2
diff --git a/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.weak.transformed.expect
index 41b22c9..6d153d9 100644
--- a/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.weak.transformed.expect
@@ -51,4 +51,4 @@
Extra constant evaluation status:
Evaluated: VariableGet @ org-dartlang-testcase:///late_fields.dart:11:17 -> NullConstant(null)
Evaluated: VariableGet @ org-dartlang-testcase:///late_fields.dart:12:16 -> IntConstant(0)
-Extra constant evaluation: tries: 98, successes: 2
+Extra constant evaluation: evaluated: 98, effectively constant: 2
diff --git a/pkg/front_end/testcases/new_const_insertion/simple.dart.strong.transformed.expect b/pkg/front_end/testcases/new_const_insertion/simple.dart.strong.transformed.expect
index fb310aa..b2d7e74 100644
--- a/pkg/front_end/testcases/new_const_insertion/simple.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/new_const_insertion/simple.dart.strong.transformed.expect
@@ -29,4 +29,4 @@
Extra constant evaluation status:
Evaluated: MethodInvocation @ org-dartlang-testcase:///simple.dart:15:7 -> IntConstant(10)
-Extra constant evaluation: tries: 9, successes: 1
+Extra constant evaluation: evaluated: 9, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd/constant_null_check.dart.outline.expect b/pkg/front_end/testcases/nnbd/constant_null_check.dart.outline.expect
index a0aea49..3e7a02e 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_check.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_check.dart.outline.expect
@@ -25,4 +25,4 @@
Evaluated: StaticGet @ org-dartlang-testcase:///constant_null_check.dart:9:16 -> NullConstant(null)
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_check.dart:16:23 -> InstanceConstant(const Class{Class.y: 42})
Evaluated: StaticGet @ org-dartlang-testcase:///constant_null_check.dart:17:29 -> NullConstant(null)
-Extra constant evaluation: tries: 8, successes: 4
+Extra constant evaluation: evaluated: 8, effectively constant: 4
diff --git a/pkg/front_end/testcases/nnbd/constant_null_is.dart.outline.expect b/pkg/front_end/testcases/nnbd/constant_null_is.dart.outline.expect
index d4cc82b..04a6535 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_is.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_is.dart.outline.expect
@@ -77,4 +77,4 @@
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:31:19 -> InstanceConstant(const Class<int>{Class.field: true})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:32:19 -> InstanceConstant(const Class<int?>{Class.field: true})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:33:19 -> InstanceConstant(const Class<Null?>{Class.field: true})
-Extra constant evaluation: tries: 33, successes: 25
+Extra constant evaluation: evaluated: 33, effectively constant: 25
diff --git a/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.transformed.expect
index ed5849f..72bc1d1 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.transformed.expect
@@ -107,4 +107,4 @@
Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:56:15 -> BoolConstant(true)
Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:57:15 -> BoolConstant(true)
Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:7:40 -> BoolConstant(false)
-Extra constant evaluation: tries: 102, successes: 14
+Extra constant evaluation: evaluated: 102, effectively constant: 14
diff --git a/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.transformed.expect
index de05935..4bd5117 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.transformed.expect
@@ -105,4 +105,4 @@
Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:56:15 -> BoolConstant(true)
Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:57:15 -> BoolConstant(true)
Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:7:40 -> BoolConstant(true)
-Extra constant evaluation: tries: 102, successes: 14
+Extra constant evaluation: evaluated: 102, effectively constant: 14
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.outline.expect b/pkg/front_end/testcases/nnbd/constants.dart.outline.expect
index e3c22f4..4de21ca 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.outline.expect
@@ -97,4 +97,4 @@
Evaluated: ListConcatenation @ org-dartlang-testcase:///constants_lib.dart:25:32 -> ListConstant(const <int>[0])
Evaluated: SetConcatenation @ org-dartlang-testcase:///constants_lib.dart:26:31 -> InstanceConstant(const _UnmodifiableSet<int>{_UnmodifiableSet._map: const _ImmutableMap<int, Null?>{_ImmutableMap._kvPairs: const <dynamic>[0, null]}})
Evaluated: MapConcatenation @ org-dartlang-testcase:///constants_lib.dart:27:7 -> InstanceConstant(const _ImmutableMap<int, String>{_ImmutableMap._kvPairs: const <dynamic>[0, "foo"]})
-Extra constant evaluation: tries: 35, successes: 34
+Extra constant evaluation: evaluated: 35, effectively constant: 34
diff --git a/pkg/front_end/testcases/nnbd/dynamic_object_call.dart.outline.expect b/pkg/front_end/testcases/nnbd/dynamic_object_call.dart.outline.expect
index eb118e8..723338b0 100644
--- a/pkg/front_end/testcases/nnbd/dynamic_object_call.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/dynamic_object_call.dart.outline.expect
@@ -21,4 +21,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///dynamic_object_call.dart:6:4 -> InstanceConstant(const _Override{})
Evaluated: StaticGet @ org-dartlang-testcase:///dynamic_object_call.dart:9:4 -> InstanceConstant(const _Override{})
-Extra constant evaluation: tries: 2, successes: 2
+Extra constant evaluation: evaluated: 2, effectively constant: 2
diff --git a/pkg/front_end/testcases/nnbd/external_fields.dart.outline.expect b/pkg/front_end/testcases/nnbd/external_fields.dart.outline.expect
index 2486d51..99614fc 100644
--- a/pkg/front_end/testcases/nnbd/external_fields.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/external_fields.dart.outline.expect
@@ -146,4 +146,4 @@
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:81:4 -> InstanceConstant(const Annotation{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:81:4 -> InstanceConstant(const Annotation{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:84:4 -> InstanceConstant(const Annotation{})
-Extra constant evaluation: tries: 25, successes: 25
+Extra constant evaluation: evaluated: 25, effectively constant: 25
diff --git a/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.outline.expect b/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.outline.expect
index 38f9bc7..c79998e 100644
--- a/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.outline.expect
@@ -31,4 +31,4 @@
Evaluated: SetLiteral @ org-dartlang-testcase:///from_agnostic.dart:9:12 -> InstanceConstant(const _UnmodifiableSet<List<int?>>{_UnmodifiableSet._map: const _ImmutableMap<List<int?>, Null?>{_ImmutableMap._kvPairs: const <dynamic>[const <int>[], null, const <int?>[], null]}})
Evaluated: StaticGet @ org-dartlang-testcase:///from_agnostic.dart:10:12 -> ListConstant(const <int>[])
Evaluated: StaticGet @ org-dartlang-testcase:///from_agnostic.dart:11:12 -> ListConstant(const <int?>[])
-Extra constant evaluation: tries: 5, successes: 5
+Extra constant evaluation: evaluated: 5, effectively constant: 5
diff --git a/pkg/front_end/testcases/nnbd/infer_if_null.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/infer_if_null.dart.strong.transformed.expect
index 9b4d8c9..571f848 100644
--- a/pkg/front_end/testcases/nnbd/infer_if_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/infer_if_null.dart.strong.transformed.expect
@@ -84,4 +84,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:60:21 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:60:28 -> StringConstant("bar")
Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:60:28 -> StringConstant("bar")
-Extra constant evaluation: tries: 112, successes: 14
+Extra constant evaluation: evaluated: 112, effectively constant: 14
diff --git a/pkg/front_end/testcases/nnbd/infer_if_null.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/infer_if_null.dart.weak.transformed.expect
index 9b4d8c9..571f848 100644
--- a/pkg/front_end/testcases/nnbd/infer_if_null.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/infer_if_null.dart.weak.transformed.expect
@@ -84,4 +84,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:60:21 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:60:28 -> StringConstant("bar")
Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:60:28 -> StringConstant("bar")
-Extra constant evaluation: tries: 112, successes: 14
+Extra constant evaluation: evaluated: 112, effectively constant: 14
diff --git a/pkg/front_end/testcases/nnbd/injected_late_field_checks/main.dart.outline.expect b/pkg/front_end/testcases/nnbd/injected_late_field_checks/main.dart.outline.expect
index c810721..2726966 100644
--- a/pkg/front_end/testcases/nnbd/injected_late_field_checks/main.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/injected_late_field_checks/main.dart.outline.expect
@@ -25,4 +25,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
index 7daa8f5..4d1285a 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
@@ -135,4 +135,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///issue41102.dart:37:15 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///issue41102.dart:37:20 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///issue41102.dart:37:20 -> IntConstant(0)
-Extra constant evaluation: tries: 55, successes: 3
+Extra constant evaluation: evaluated: 55, effectively constant: 3
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
index 7daa8f5..4d1285a 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
@@ -135,4 +135,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///issue41102.dart:37:15 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///issue41102.dart:37:20 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///issue41102.dart:37:20 -> IntConstant(0)
-Extra constant evaluation: tries: 55, successes: 3
+Extra constant evaluation: evaluated: 55, effectively constant: 3
diff --git a/pkg/front_end/testcases/nnbd/issue41114.dart b/pkg/front_end/testcases/nnbd/issue41114.dart
index 3929126..7db889f 100644
--- a/pkg/front_end/testcases/nnbd/issue41114.dart
+++ b/pkg/front_end/testcases/nnbd/issue41114.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
main() async {
- List<String>? a = <String>[] as List<String>?;
+ List<String>? a = <String>[];
Iterable<String>? b = a?.map((e) => e);
Iterable<String>? i = b ?? a;
print(i);
diff --git a/pkg/front_end/testcases/nnbd/issue41114.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41114.dart.strong.expect
index 6fb76f5..4b2167b 100644
--- a/pkg/front_end/testcases/nnbd/issue41114.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41114.dart.strong.expect
@@ -3,7 +3,7 @@
import "dart:core" as core;
static method main() → dynamic async {
- core::List<core::String>? a = <core::String>[] as{ForNonNullableByDefault} core::List<core::String>?;
+ core::List<core::String>? a = <core::String>[];
core::Iterable<core::String>? b = let final core::List<core::String>? #t1 = a in #t1.{core::List::==}(null) ?{core::Iterable<core::String>?} null : #t1{core::List<core::String>}.{core::Iterable::map}<core::String>((core::String e) → core::String => e);
core::Iterable<core::String>? i = let final core::Iterable<core::String>? #t2 = b in #t2.{core::Object::==}(null) ?{core::Iterable<core::String>?} a : #t2{core::Iterable<core::String>};
core::print(i);
diff --git a/pkg/front_end/testcases/nnbd/issue41114.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41114.dart.weak.expect
index 6fb76f5..4b2167b 100644
--- a/pkg/front_end/testcases/nnbd/issue41114.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41114.dart.weak.expect
@@ -3,7 +3,7 @@
import "dart:core" as core;
static method main() → dynamic async {
- core::List<core::String>? a = <core::String>[] as{ForNonNullableByDefault} core::List<core::String>?;
+ core::List<core::String>? a = <core::String>[];
core::Iterable<core::String>? b = let final core::List<core::String>? #t1 = a in #t1.{core::List::==}(null) ?{core::Iterable<core::String>?} null : #t1{core::List<core::String>}.{core::Iterable::map}<core::String>((core::String e) → core::String => e);
core::Iterable<core::String>? i = let final core::Iterable<core::String>? #t2 = b in #t2.{core::Object::==}(null) ?{core::Iterable<core::String>?} a : #t2{core::Iterable<core::String>};
core::print(i);
diff --git a/pkg/front_end/testcases/nnbd/issue41273.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41273.dart.strong.transformed.expect
index 14f079a..368f224 100644
--- a/pkg/front_end/testcases/nnbd/issue41273.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41273.dart.strong.transformed.expect
@@ -33,4 +33,4 @@
Extra constant evaluation status:
Evaluated: TypeLiteral @ org-dartlang-testcase:///issue41273.dart:16:21 -> TypeLiteralConstant(Object)
-Extra constant evaluation: tries: 49, successes: 1
+Extra constant evaluation: evaluated: 49, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd/issue41273.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41273.dart.weak.transformed.expect
index c59851f..e7749a6 100644
--- a/pkg/front_end/testcases/nnbd/issue41273.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41273.dart.weak.transformed.expect
@@ -34,4 +34,4 @@
Extra constant evaluation status:
Evaluated: TypeLiteral @ org-dartlang-testcase:///issue41273.dart:16:21 -> TypeLiteralConstant(Object)
-Extra constant evaluation: tries: 175, successes: 1
+Extra constant evaluation: evaluated: 175, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd/issue41495.dart b/pkg/front_end/testcases/nnbd/issue41495.dart
index cca6995..ceaf89a 100644
--- a/pkg/front_end/testcases/nnbd/issue41495.dart
+++ b/pkg/front_end/testcases/nnbd/issue41495.dart
@@ -10,7 +10,7 @@
main() {}
errors() {
- A? a1 = new A() as A?;
+ A? a1 = new A();
a1.c1;
a1.test;
}
diff --git a/pkg/front_end/testcases/nnbd/issue41495.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41495.dart.strong.expect
index 4df1b52..ecc36781 100644
--- a/pkg/front_end/testcases/nnbd/issue41495.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41495.dart.strong.expect
@@ -27,7 +27,7 @@
}
static method main() → dynamic {}
static method errors() → dynamic {
- self::A? a1 = new self::A::•() as{ForNonNullableByDefault} self::A?;
+ self::A? a1 = new self::A::•();
let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41495.dart:14:6: Error: Property 'c1' cannot be accessed on 'A?' because it is potentially null.
- 'A' is from 'pkg/front_end/testcases/nnbd/issue41495.dart'.
Try accessing using ?. instead.
diff --git a/pkg/front_end/testcases/nnbd/issue41495.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41495.dart.weak.expect
index 4df1b52..ecc36781 100644
--- a/pkg/front_end/testcases/nnbd/issue41495.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41495.dart.weak.expect
@@ -27,7 +27,7 @@
}
static method main() → dynamic {}
static method errors() → dynamic {
- self::A? a1 = new self::A::•() as{ForNonNullableByDefault} self::A?;
+ self::A? a1 = new self::A::•();
let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41495.dart:14:6: Error: Property 'c1' cannot be accessed on 'A?' because it is potentially null.
- 'A' is from 'pkg/front_end/testcases/nnbd/issue41495.dart'.
Try accessing using ?. instead.
diff --git a/pkg/front_end/testcases/nnbd/issue41657.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue41657.dart.outline.expect
index 0c7badc..a9d3a40 100644
--- a/pkg/front_end/testcases/nnbd/issue41657.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue41657.dart.outline.expect
@@ -19,4 +19,4 @@
Evaluated: IsExpression @ org-dartlang-testcase:///issue41657.dart:8:38 -> BoolConstant(false)
Evaluated: ListLiteral @ org-dartlang-testcase:///issue41657.dart:10:38 -> ListConstant(const <Null?>[])
Evaluated: ListLiteral @ org-dartlang-testcase:///issue41657.dart:12:38 -> ListConstant(const <int?>[])
-Extra constant evaluation: tries: 6, successes: 4
+Extra constant evaluation: evaluated: 6, effectively constant: 4
diff --git a/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.transformed.expect
index 3e924b7..46f2af9 100644
--- a/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.transformed.expect
@@ -53,4 +53,4 @@
Evaluated: MethodInvocation @ org-dartlang-testcase:///issue41700b.dart:8:12 -> BoolConstant(true)
Evaluated: VariableGet @ org-dartlang-testcase:///issue41700b.dart:8:12 -> NullConstant(null)
Evaluated: VariableGet @ org-dartlang-testcase:///issue41700b.dart:8:12 -> NullConstant(null)
-Extra constant evaluation: tries: 7, successes: 3
+Extra constant evaluation: evaluated: 7, effectively constant: 3
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart b/pkg/front_end/testcases/nnbd/issue42429.dart
new file mode 100644
index 0000000..5023f9a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart
@@ -0,0 +1,66 @@
+// 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.
+
+class A<T extends num> {}
+
+typedef FArgument<X extends num> = Function(X);
+typedef FReturn<X extends num> = X Function();
+typedef FBoth<X extends num> = X Function(X);
+typedef FNowhere<X extends num> = Function();
+
+foo() {
+ A<Object> aObject; // Error.
+ A<num?> aNumNullable; // Error.
+ A<int?> aIntNullable; // Error.
+ A<Null> aNull; // Error.
+ FArgument<Object> fArgumentObject; // Error.
+ FArgument<num?> fArgumentNumNullable; // Error.
+ FArgument<int?> fArgumentIntNullable; // Error.
+ FArgument<Null> fArgumentNull; // Error.
+ FReturn<Object> fReturnObject; // Error.
+ FReturn<num?> fReturnNumNullable; // Error.
+ FReturn<int?> fReturnIntNullable; // Error.
+ FReturn<Null> fReturnNull; // Error.
+ FBoth<Object> fBothObject; // Error.
+ FBoth<num?> fBothNumNullable; // Error.
+ FBoth<int?> fBothIntNullable; // Error.
+ FBoth<Null> fBothNull; // Error.
+ FNowhere<Object> fNowhereObject; // Error.
+ FNowhere<num?> fNowhereNumNullable; // Error.
+ FNowhere<int?> fNowhereIntNullable; // Error.
+ FNowhere<Null> fNowhereNull; // Error.
+
+ A<Object?> aObjectNullable; // Ok.
+ A<dynamic> aDynamic; // Ok.
+ A<void> aVoid; // Ok.
+ A<num> aNum; // Ok.
+ A<int> aInt; // Ok.
+ A<Never> aNever; // Ok.
+ FArgument<Object?> fArgumentObjectNullable; // Ok.
+ FArgument<dynamic> fArgumentDynamic; // Ok.
+ FArgument<void> fArgumentVoid; // Ok.
+ FArgument<num> fArgumentNum; // Ok.
+ FArgument<int> fArgumentInt; // Ok.
+ FArgument<Never> fArgumentNever; // Ok.
+ FReturn<Object?> fReturnObjectNullable; // Ok.
+ FReturn<dynamic> fReturnDynamic; // Ok.
+ FReturn<void> fReturnVoid; // Ok.
+ FReturn<num> fReturnNum; // Ok.
+ FReturn<int> fReturnInt; // Ok.
+ FReturn<Never> fReturnNever; // Ok.
+ FBoth<Object?> fBothObjectNullable; // Ok.
+ FBoth<dynamic> fBothDynamic; // Ok.
+ FBoth<void> fBothVoid; // Ok.
+ FBoth<num> fBothNum; // Ok.
+ FBoth<int> fBothInt; // Ok.
+ FBoth<Never> fBothNever; // Ok.
+ FNowhere<Object?> fNowhereObjectNullable; // Ok.
+ FNowhere<dynamic> fNowhereDynamic; // Ok.
+ FNowhere<void> fNowhereVoid; // Ok.
+ FNowhere<num> fNowhereNum; // Ok.
+ FNowhere<int> fNowhereInt; // Ok.
+ FNowhere<Never> fNowhereNever; // Ok.
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.outline.expect
new file mode 100644
index 0000000..2034770
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.outline.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef FArgument<contravariant X extends core::num = core::num> = (X) → dynamic;
+typedef FReturn<X extends core::num = core::num> = () → X;
+typedef FBoth<invariant X extends core::num = core::num> = (X) → X;
+typedef FNowhere<unrelated X extends core::num = core::num> = () → dynamic;
+class A<T extends core::num = core::num> extends core::Object {
+ synthetic constructor •() → self::A<self::A::T>
+ ;
+}
+static method foo() → dynamic
+ ;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.expect
new file mode 100644
index 0000000..30ddc8d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.expect
@@ -0,0 +1,234 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:13:13: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// A<Object> aObject; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:14:11: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// A<num?> aNumNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:15:11: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// A<int?> aIntNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:16:11: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// A<Null> aNull; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:17:21: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// FArgument<Object> fArgumentObject; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:18:19: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+// FArgument<num?> fArgumentNumNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:19:19: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+// FArgument<int?> fArgumentIntNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:20:19: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+// FArgument<Null> fArgumentNull; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:21:19: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// FReturn<Object> fReturnObject; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:22:17: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+// FReturn<num?> fReturnNumNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:23:17: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+// FReturn<int?> fReturnIntNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:24:17: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+// FReturn<Null> fReturnNull; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:25:17: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// FBoth<Object> fBothObject; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:26:15: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+// FBoth<num?> fBothNumNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:27:15: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+// FBoth<int?> fBothIntNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:28:15: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+// FBoth<Null> fBothNull; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:29:20: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// FNowhere<Object> fNowhereObject; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:30:18: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+// FNowhere<num?> fNowhereNumNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:31:18: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+// FNowhere<int?> fNowhereIntNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:32:18: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+// FNowhere<Null> fNowhereNull; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef FArgument<contravariant X extends core::num = core::num> = (X) → dynamic;
+typedef FReturn<X extends core::num = core::num> = () → X;
+typedef FBoth<invariant X extends core::num = core::num> = (X) → X;
+typedef FNowhere<unrelated X extends core::num = core::num> = () → dynamic;
+class A<T extends core::num = core::num> extends core::Object {
+ synthetic constructor •() → self::A<self::A::T>
+ : super core::Object::•()
+ ;
+}
+static method foo() → dynamic {
+ self::A<core::Object> aObject;
+ self::A<core::num?> aNumNullable;
+ self::A<core::int?> aIntNullable;
+ self::A<core::Null?> aNull;
+ (core::Object) → dynamic fArgumentObject;
+ (core::num?) → dynamic fArgumentNumNullable;
+ (core::int?) → dynamic fArgumentIntNullable;
+ (core::Null?) → dynamic fArgumentNull;
+ () → core::Object fReturnObject;
+ () → core::num? fReturnNumNullable;
+ () → core::int? fReturnIntNullable;
+ () → core::Null? fReturnNull;
+ (core::Object) → core::Object fBothObject;
+ (core::num?) → core::num? fBothNumNullable;
+ (core::int?) → core::int? fBothIntNullable;
+ (core::Null?) → core::Null? fBothNull;
+ () → dynamic fNowhereObject;
+ () → dynamic fNowhereNumNullable;
+ () → dynamic fNowhereIntNullable;
+ () → dynamic fNowhereNull;
+ self::A<core::Object?> aObjectNullable;
+ self::A<dynamic> aDynamic;
+ self::A<void> aVoid;
+ self::A<core::num> aNum;
+ self::A<core::int> aInt;
+ self::A<Never> aNever;
+ (core::Object?) → dynamic fArgumentObjectNullable;
+ (dynamic) → dynamic fArgumentDynamic;
+ (void) → dynamic fArgumentVoid;
+ (core::num) → dynamic fArgumentNum;
+ (core::int) → dynamic fArgumentInt;
+ (Never) → dynamic fArgumentNever;
+ () → core::Object? fReturnObjectNullable;
+ () → dynamic fReturnDynamic;
+ () → void fReturnVoid;
+ () → core::num fReturnNum;
+ () → core::int fReturnInt;
+ () → Never fReturnNever;
+ (core::Object?) → core::Object? fBothObjectNullable;
+ (dynamic) → dynamic fBothDynamic;
+ (void) → void fBothVoid;
+ (core::num) → core::num fBothNum;
+ (core::int) → core::int fBothInt;
+ (Never) → Never fBothNever;
+ () → dynamic fNowhereObjectNullable;
+ () → dynamic fNowhereDynamic;
+ () → dynamic fNowhereVoid;
+ () → dynamic fNowhereNum;
+ () → dynamic fNowhereInt;
+ () → dynamic fNowhereNever;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.transformed.expect
new file mode 100644
index 0000000..30ddc8d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.transformed.expect
@@ -0,0 +1,234 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:13:13: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// A<Object> aObject; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:14:11: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// A<num?> aNumNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:15:11: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// A<int?> aIntNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:16:11: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// A<Null> aNull; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:17:21: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// FArgument<Object> fArgumentObject; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:18:19: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+// FArgument<num?> fArgumentNumNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:19:19: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+// FArgument<int?> fArgumentIntNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:20:19: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+// FArgument<Null> fArgumentNull; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:21:19: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// FReturn<Object> fReturnObject; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:22:17: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+// FReturn<num?> fReturnNumNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:23:17: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+// FReturn<int?> fReturnIntNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:24:17: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+// FReturn<Null> fReturnNull; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:25:17: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// FBoth<Object> fBothObject; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:26:15: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+// FBoth<num?> fBothNumNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:27:15: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+// FBoth<int?> fBothIntNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:28:15: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+// FBoth<Null> fBothNull; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:29:20: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// FNowhere<Object> fNowhereObject; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:30:18: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+// FNowhere<num?> fNowhereNumNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:31:18: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+// FNowhere<int?> fNowhereIntNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:32:18: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+// FNowhere<Null> fNowhereNull; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef FArgument<contravariant X extends core::num = core::num> = (X) → dynamic;
+typedef FReturn<X extends core::num = core::num> = () → X;
+typedef FBoth<invariant X extends core::num = core::num> = (X) → X;
+typedef FNowhere<unrelated X extends core::num = core::num> = () → dynamic;
+class A<T extends core::num = core::num> extends core::Object {
+ synthetic constructor •() → self::A<self::A::T>
+ : super core::Object::•()
+ ;
+}
+static method foo() → dynamic {
+ self::A<core::Object> aObject;
+ self::A<core::num?> aNumNullable;
+ self::A<core::int?> aIntNullable;
+ self::A<core::Null?> aNull;
+ (core::Object) → dynamic fArgumentObject;
+ (core::num?) → dynamic fArgumentNumNullable;
+ (core::int?) → dynamic fArgumentIntNullable;
+ (core::Null?) → dynamic fArgumentNull;
+ () → core::Object fReturnObject;
+ () → core::num? fReturnNumNullable;
+ () → core::int? fReturnIntNullable;
+ () → core::Null? fReturnNull;
+ (core::Object) → core::Object fBothObject;
+ (core::num?) → core::num? fBothNumNullable;
+ (core::int?) → core::int? fBothIntNullable;
+ (core::Null?) → core::Null? fBothNull;
+ () → dynamic fNowhereObject;
+ () → dynamic fNowhereNumNullable;
+ () → dynamic fNowhereIntNullable;
+ () → dynamic fNowhereNull;
+ self::A<core::Object?> aObjectNullable;
+ self::A<dynamic> aDynamic;
+ self::A<void> aVoid;
+ self::A<core::num> aNum;
+ self::A<core::int> aInt;
+ self::A<Never> aNever;
+ (core::Object?) → dynamic fArgumentObjectNullable;
+ (dynamic) → dynamic fArgumentDynamic;
+ (void) → dynamic fArgumentVoid;
+ (core::num) → dynamic fArgumentNum;
+ (core::int) → dynamic fArgumentInt;
+ (Never) → dynamic fArgumentNever;
+ () → core::Object? fReturnObjectNullable;
+ () → dynamic fReturnDynamic;
+ () → void fReturnVoid;
+ () → core::num fReturnNum;
+ () → core::int fReturnInt;
+ () → Never fReturnNever;
+ (core::Object?) → core::Object? fBothObjectNullable;
+ (dynamic) → dynamic fBothDynamic;
+ (void) → void fBothVoid;
+ (core::num) → core::num fBothNum;
+ (core::int) → core::int fBothInt;
+ (Never) → Never fBothNever;
+ () → dynamic fNowhereObjectNullable;
+ () → dynamic fNowhereDynamic;
+ () → dynamic fNowhereVoid;
+ () → dynamic fNowhereNum;
+ () → dynamic fNowhereInt;
+ () → dynamic fNowhereNever;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.textual_outline.expect
new file mode 100644
index 0000000..f4e93b5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.textual_outline.expect
@@ -0,0 +1,8 @@
+class A<T extends num> {}
+
+typedef FArgument<X extends num> = Function(X);
+typedef FReturn<X extends num> = X Function();
+typedef FBoth<X extends num> = X Function(X);
+typedef FNowhere<X extends num> = Function();
+foo() {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..b830697
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.textual_outline_modelled.expect
@@ -0,0 +1,8 @@
+class A<T extends num> {}
+
+foo() {}
+main() {}
+typedef FArgument<X extends num> = Function(X);
+typedef FBoth<X extends num> = X Function(X);
+typedef FNowhere<X extends num> = Function();
+typedef FReturn<X extends num> = X Function();
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.expect
new file mode 100644
index 0000000..30ddc8d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.expect
@@ -0,0 +1,234 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:13:13: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// A<Object> aObject; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:14:11: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// A<num?> aNumNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:15:11: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// A<int?> aIntNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:16:11: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// A<Null> aNull; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:17:21: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// FArgument<Object> fArgumentObject; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:18:19: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+// FArgument<num?> fArgumentNumNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:19:19: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+// FArgument<int?> fArgumentIntNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:20:19: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+// FArgument<Null> fArgumentNull; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:21:19: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// FReturn<Object> fReturnObject; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:22:17: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+// FReturn<num?> fReturnNumNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:23:17: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+// FReturn<int?> fReturnIntNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:24:17: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+// FReturn<Null> fReturnNull; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:25:17: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// FBoth<Object> fBothObject; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:26:15: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+// FBoth<num?> fBothNumNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:27:15: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+// FBoth<int?> fBothIntNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:28:15: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+// FBoth<Null> fBothNull; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:29:20: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// FNowhere<Object> fNowhereObject; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:30:18: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+// FNowhere<num?> fNowhereNumNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:31:18: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+// FNowhere<int?> fNowhereIntNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:32:18: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+// FNowhere<Null> fNowhereNull; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef FArgument<contravariant X extends core::num = core::num> = (X) → dynamic;
+typedef FReturn<X extends core::num = core::num> = () → X;
+typedef FBoth<invariant X extends core::num = core::num> = (X) → X;
+typedef FNowhere<unrelated X extends core::num = core::num> = () → dynamic;
+class A<T extends core::num = core::num> extends core::Object {
+ synthetic constructor •() → self::A<self::A::T>
+ : super core::Object::•()
+ ;
+}
+static method foo() → dynamic {
+ self::A<core::Object> aObject;
+ self::A<core::num?> aNumNullable;
+ self::A<core::int?> aIntNullable;
+ self::A<core::Null?> aNull;
+ (core::Object) → dynamic fArgumentObject;
+ (core::num?) → dynamic fArgumentNumNullable;
+ (core::int?) → dynamic fArgumentIntNullable;
+ (core::Null?) → dynamic fArgumentNull;
+ () → core::Object fReturnObject;
+ () → core::num? fReturnNumNullable;
+ () → core::int? fReturnIntNullable;
+ () → core::Null? fReturnNull;
+ (core::Object) → core::Object fBothObject;
+ (core::num?) → core::num? fBothNumNullable;
+ (core::int?) → core::int? fBothIntNullable;
+ (core::Null?) → core::Null? fBothNull;
+ () → dynamic fNowhereObject;
+ () → dynamic fNowhereNumNullable;
+ () → dynamic fNowhereIntNullable;
+ () → dynamic fNowhereNull;
+ self::A<core::Object?> aObjectNullable;
+ self::A<dynamic> aDynamic;
+ self::A<void> aVoid;
+ self::A<core::num> aNum;
+ self::A<core::int> aInt;
+ self::A<Never> aNever;
+ (core::Object?) → dynamic fArgumentObjectNullable;
+ (dynamic) → dynamic fArgumentDynamic;
+ (void) → dynamic fArgumentVoid;
+ (core::num) → dynamic fArgumentNum;
+ (core::int) → dynamic fArgumentInt;
+ (Never) → dynamic fArgumentNever;
+ () → core::Object? fReturnObjectNullable;
+ () → dynamic fReturnDynamic;
+ () → void fReturnVoid;
+ () → core::num fReturnNum;
+ () → core::int fReturnInt;
+ () → Never fReturnNever;
+ (core::Object?) → core::Object? fBothObjectNullable;
+ (dynamic) → dynamic fBothDynamic;
+ (void) → void fBothVoid;
+ (core::num) → core::num fBothNum;
+ (core::int) → core::int fBothInt;
+ (Never) → Never fBothNever;
+ () → dynamic fNowhereObjectNullable;
+ () → dynamic fNowhereDynamic;
+ () → dynamic fNowhereVoid;
+ () → dynamic fNowhereNum;
+ () → dynamic fNowhereInt;
+ () → dynamic fNowhereNever;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.transformed.expect
new file mode 100644
index 0000000..30ddc8d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.transformed.expect
@@ -0,0 +1,234 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:13:13: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// A<Object> aObject; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:14:11: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// A<num?> aNumNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:15:11: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// A<int?> aIntNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:16:11: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// A<Null> aNull; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:17:21: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// FArgument<Object> fArgumentObject; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:18:19: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+// FArgument<num?> fArgumentNumNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:19:19: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+// FArgument<int?> fArgumentIntNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:20:19: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+// FArgument<Null> fArgumentNull; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:21:19: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// FReturn<Object> fReturnObject; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:22:17: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+// FReturn<num?> fReturnNumNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:23:17: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+// FReturn<int?> fReturnIntNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:24:17: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+// FReturn<Null> fReturnNull; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:25:17: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// FBoth<Object> fBothObject; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:26:15: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+// FBoth<num?> fBothNumNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:27:15: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+// FBoth<int?> fBothIntNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:28:15: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+// FBoth<Null> fBothNull; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:29:20: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// FNowhere<Object> fNowhereObject; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:30:18: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+// FNowhere<num?> fNowhereNumNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:31:18: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+// FNowhere<int?> fNowhereIntNullable; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:32:18: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+// FNowhere<Null> fNowhereNull; // Error.
+// ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef FArgument<contravariant X extends core::num = core::num> = (X) → dynamic;
+typedef FReturn<X extends core::num = core::num> = () → X;
+typedef FBoth<invariant X extends core::num = core::num> = (X) → X;
+typedef FNowhere<unrelated X extends core::num = core::num> = () → dynamic;
+class A<T extends core::num = core::num> extends core::Object {
+ synthetic constructor •() → self::A<self::A::T>
+ : super core::Object::•()
+ ;
+}
+static method foo() → dynamic {
+ self::A<core::Object> aObject;
+ self::A<core::num?> aNumNullable;
+ self::A<core::int?> aIntNullable;
+ self::A<core::Null?> aNull;
+ (core::Object) → dynamic fArgumentObject;
+ (core::num?) → dynamic fArgumentNumNullable;
+ (core::int?) → dynamic fArgumentIntNullable;
+ (core::Null?) → dynamic fArgumentNull;
+ () → core::Object fReturnObject;
+ () → core::num? fReturnNumNullable;
+ () → core::int? fReturnIntNullable;
+ () → core::Null? fReturnNull;
+ (core::Object) → core::Object fBothObject;
+ (core::num?) → core::num? fBothNumNullable;
+ (core::int?) → core::int? fBothIntNullable;
+ (core::Null?) → core::Null? fBothNull;
+ () → dynamic fNowhereObject;
+ () → dynamic fNowhereNumNullable;
+ () → dynamic fNowhereIntNullable;
+ () → dynamic fNowhereNull;
+ self::A<core::Object?> aObjectNullable;
+ self::A<dynamic> aDynamic;
+ self::A<void> aVoid;
+ self::A<core::num> aNum;
+ self::A<core::int> aInt;
+ self::A<Never> aNever;
+ (core::Object?) → dynamic fArgumentObjectNullable;
+ (dynamic) → dynamic fArgumentDynamic;
+ (void) → dynamic fArgumentVoid;
+ (core::num) → dynamic fArgumentNum;
+ (core::int) → dynamic fArgumentInt;
+ (Never) → dynamic fArgumentNever;
+ () → core::Object? fReturnObjectNullable;
+ () → dynamic fReturnDynamic;
+ () → void fReturnVoid;
+ () → core::num fReturnNum;
+ () → core::int fReturnInt;
+ () → Never fReturnNever;
+ (core::Object?) → core::Object? fBothObjectNullable;
+ (dynamic) → dynamic fBothDynamic;
+ (void) → void fBothVoid;
+ (core::num) → core::num fBothNum;
+ (core::int) → core::int fBothInt;
+ (Never) → Never fBothNever;
+ () → dynamic fNowhereObjectNullable;
+ () → dynamic fNowhereDynamic;
+ () → dynamic fNowhereVoid;
+ () → dynamic fNowhereNum;
+ () → dynamic fNowhereInt;
+ () → dynamic fNowhereNever;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect
index 02ed204..87a95fd 100644
--- a/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect
@@ -19,4 +19,4 @@
Extra constant evaluation status:
Evaluated: Instantiation @ org-dartlang-testcase:///issue42433.dart:11:16 -> PartialInstantiationConstant(checkme<X>)
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect
index 1757a97..7c42561 100644
--- a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect
@@ -19,4 +19,4 @@
Extra constant evaluation status:
Evaluated: Instantiation @ org-dartlang-testcase:///issue42433.dart:11:16 -> PartialInstantiationConstant(checkme<X*>)
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect
index 0fcadb3..baab324 100644
--- a/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect
@@ -46,4 +46,4 @@
Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:709:13 -> ListConstant(const <Type*>[])
Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:709:13 -> ListConstant(const <dynamic>[])
Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:709:13 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 61, successes: 15
+Extra constant evaluation: evaluated: 61, effectively constant: 15
diff --git a/pkg/front_end/testcases/nnbd/issue43354.dart b/pkg/front_end/testcases/nnbd/issue43354.dart
new file mode 100644
index 0000000..0fe7700
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43354.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.
+
+// The error should be reported on the field, not the constructor.
+
+class A {
+ late final int foo = 42;
+ const A();
+}
+
+class B {
+ late final int foo = 42;
+ late final String bar = "foobar";
+ const B();
+}
+
+class C {
+ late final int foo = 42;
+ const C();
+ const C.another();
+}
+
+class D {
+ late final int foo = 42;
+ late final String bar = "foobar";
+ const D();
+ const D.another();
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43354.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue43354.dart.outline.expect
new file mode 100644
index 0000000..af871a2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43354.dart.outline.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/ {
+ late final field core::int foo = 42;
+ const constructor •() → self::A
+ : super core::Object::•()
+ ;
+}
+class B extends core::Object /*hasConstConstructor*/ {
+ late final field core::int foo = 42;
+ late final field core::String bar = "foobar";
+ const constructor •() → self::B
+ : super core::Object::•()
+ ;
+}
+class C extends core::Object /*hasConstConstructor*/ {
+ late final field core::int foo = 42;
+ const constructor •() → self::C
+ : super core::Object::•()
+ ;
+ const constructor another() → self::C
+ : super core::Object::•()
+ ;
+}
+class D extends core::Object /*hasConstConstructor*/ {
+ late final field core::int foo = 42;
+ late final field core::String bar = "foobar";
+ const constructor •() → self::D
+ : super core::Object::•()
+ ;
+ const constructor another() → self::D
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/issue43354.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43354.dart.strong.expect
new file mode 100644
index 0000000..b068885
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43354.dart.strong.expect
@@ -0,0 +1,82 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:8:18: Error: Can't have a late final field in a class with a const constructor.
+// late final int foo = 42;
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:9:9: Context: This constructor is const.
+// const A();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:13:18: Error: Can't have a late final field in a class with a const constructor.
+// late final int foo = 42;
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:15:9: Context: This constructor is const.
+// const B();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:14:21: Error: Can't have a late final field in a class with a const constructor.
+// late final String bar = "foobar";
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:15:9: Context: This constructor is const.
+// const B();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:19:18: Error: Can't have a late final field in a class with a const constructor.
+// late final int foo = 42;
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:20:9: Context: This constructor is const.
+// const C();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:25:18: Error: Can't have a late final field in a class with a const constructor.
+// late final int foo = 42;
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:27:9: Context: This constructor is const.
+// const D();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:26:21: Error: Can't have a late final field in a class with a const constructor.
+// late final String bar = "foobar";
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:27:9: Context: This constructor is const.
+// const D();
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/ {
+ late final field core::int foo = 42;
+ const constructor •() → self::A
+ : super core::Object::•()
+ ;
+}
+class B extends core::Object /*hasConstConstructor*/ {
+ late final field core::int foo = 42;
+ late final field core::String bar = "foobar";
+ const constructor •() → self::B
+ : super core::Object::•()
+ ;
+}
+class C extends core::Object /*hasConstConstructor*/ {
+ late final field core::int foo = 42;
+ const constructor •() → self::C
+ : super core::Object::•()
+ ;
+ const constructor another() → self::C
+ : super core::Object::•()
+ ;
+}
+class D extends core::Object /*hasConstConstructor*/ {
+ late final field core::int foo = 42;
+ late final field core::String bar = "foobar";
+ const constructor •() → self::D
+ : super core::Object::•()
+ ;
+ const constructor another() → self::D
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43354.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43354.dart.strong.transformed.expect
new file mode 100644
index 0000000..b068885
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43354.dart.strong.transformed.expect
@@ -0,0 +1,82 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:8:18: Error: Can't have a late final field in a class with a const constructor.
+// late final int foo = 42;
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:9:9: Context: This constructor is const.
+// const A();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:13:18: Error: Can't have a late final field in a class with a const constructor.
+// late final int foo = 42;
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:15:9: Context: This constructor is const.
+// const B();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:14:21: Error: Can't have a late final field in a class with a const constructor.
+// late final String bar = "foobar";
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:15:9: Context: This constructor is const.
+// const B();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:19:18: Error: Can't have a late final field in a class with a const constructor.
+// late final int foo = 42;
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:20:9: Context: This constructor is const.
+// const C();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:25:18: Error: Can't have a late final field in a class with a const constructor.
+// late final int foo = 42;
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:27:9: Context: This constructor is const.
+// const D();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:26:21: Error: Can't have a late final field in a class with a const constructor.
+// late final String bar = "foobar";
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:27:9: Context: This constructor is const.
+// const D();
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/ {
+ late final field core::int foo = 42;
+ const constructor •() → self::A
+ : super core::Object::•()
+ ;
+}
+class B extends core::Object /*hasConstConstructor*/ {
+ late final field core::int foo = 42;
+ late final field core::String bar = "foobar";
+ const constructor •() → self::B
+ : super core::Object::•()
+ ;
+}
+class C extends core::Object /*hasConstConstructor*/ {
+ late final field core::int foo = 42;
+ const constructor •() → self::C
+ : super core::Object::•()
+ ;
+ const constructor another() → self::C
+ : super core::Object::•()
+ ;
+}
+class D extends core::Object /*hasConstConstructor*/ {
+ late final field core::int foo = 42;
+ late final field core::String bar = "foobar";
+ const constructor •() → self::D
+ : super core::Object::•()
+ ;
+ const constructor another() → self::D
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43354.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue43354.dart.textual_outline.expect
new file mode 100644
index 0000000..d4f44a6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43354.dart.textual_outline.expect
@@ -0,0 +1,27 @@
+class A {
+ late ;
+ final int foo = 42;
+ const A();
+}
+class B {
+ late ;
+ final int foo = 42;
+ late ;
+ final String bar = "foobar";
+ const B();
+}
+class C {
+ late ;
+ final int foo = 42;
+ const C();
+ const C.another();
+}
+class D {
+ late ;
+ final int foo = 42;
+ late ;
+ final String bar = "foobar";
+ const D();
+ const D.another();
+}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43354.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43354.dart.weak.expect
new file mode 100644
index 0000000..b068885
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43354.dart.weak.expect
@@ -0,0 +1,82 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:8:18: Error: Can't have a late final field in a class with a const constructor.
+// late final int foo = 42;
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:9:9: Context: This constructor is const.
+// const A();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:13:18: Error: Can't have a late final field in a class with a const constructor.
+// late final int foo = 42;
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:15:9: Context: This constructor is const.
+// const B();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:14:21: Error: Can't have a late final field in a class with a const constructor.
+// late final String bar = "foobar";
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:15:9: Context: This constructor is const.
+// const B();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:19:18: Error: Can't have a late final field in a class with a const constructor.
+// late final int foo = 42;
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:20:9: Context: This constructor is const.
+// const C();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:25:18: Error: Can't have a late final field in a class with a const constructor.
+// late final int foo = 42;
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:27:9: Context: This constructor is const.
+// const D();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:26:21: Error: Can't have a late final field in a class with a const constructor.
+// late final String bar = "foobar";
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:27:9: Context: This constructor is const.
+// const D();
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/ {
+ late final field core::int foo = 42;
+ const constructor •() → self::A
+ : super core::Object::•()
+ ;
+}
+class B extends core::Object /*hasConstConstructor*/ {
+ late final field core::int foo = 42;
+ late final field core::String bar = "foobar";
+ const constructor •() → self::B
+ : super core::Object::•()
+ ;
+}
+class C extends core::Object /*hasConstConstructor*/ {
+ late final field core::int foo = 42;
+ const constructor •() → self::C
+ : super core::Object::•()
+ ;
+ const constructor another() → self::C
+ : super core::Object::•()
+ ;
+}
+class D extends core::Object /*hasConstConstructor*/ {
+ late final field core::int foo = 42;
+ late final field core::String bar = "foobar";
+ const constructor •() → self::D
+ : super core::Object::•()
+ ;
+ const constructor another() → self::D
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43354.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43354.dart.weak.transformed.expect
new file mode 100644
index 0000000..b068885
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43354.dart.weak.transformed.expect
@@ -0,0 +1,82 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:8:18: Error: Can't have a late final field in a class with a const constructor.
+// late final int foo = 42;
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:9:9: Context: This constructor is const.
+// const A();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:13:18: Error: Can't have a late final field in a class with a const constructor.
+// late final int foo = 42;
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:15:9: Context: This constructor is const.
+// const B();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:14:21: Error: Can't have a late final field in a class with a const constructor.
+// late final String bar = "foobar";
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:15:9: Context: This constructor is const.
+// const B();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:19:18: Error: Can't have a late final field in a class with a const constructor.
+// late final int foo = 42;
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:20:9: Context: This constructor is const.
+// const C();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:25:18: Error: Can't have a late final field in a class with a const constructor.
+// late final int foo = 42;
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:27:9: Context: This constructor is const.
+// const D();
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:26:21: Error: Can't have a late final field in a class with a const constructor.
+// late final String bar = "foobar";
+// ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:27:9: Context: This constructor is const.
+// const D();
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/ {
+ late final field core::int foo = 42;
+ const constructor •() → self::A
+ : super core::Object::•()
+ ;
+}
+class B extends core::Object /*hasConstConstructor*/ {
+ late final field core::int foo = 42;
+ late final field core::String bar = "foobar";
+ const constructor •() → self::B
+ : super core::Object::•()
+ ;
+}
+class C extends core::Object /*hasConstConstructor*/ {
+ late final field core::int foo = 42;
+ const constructor •() → self::C
+ : super core::Object::•()
+ ;
+ const constructor another() → self::C
+ : super core::Object::•()
+ ;
+}
+class D extends core::Object /*hasConstConstructor*/ {
+ late final field core::int foo = 42;
+ late final field core::String bar = "foobar";
+ const constructor •() → self::D
+ : super core::Object::•()
+ ;
+ const constructor another() → self::D
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/later.dart.strong.expect b/pkg/front_end/testcases/nnbd/later.dart.strong.expect
index 4ea3cb9..992c773 100644
--- a/pkg/front_end/testcases/nnbd/later.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/later.dart.strong.expect
@@ -55,12 +55,12 @@
// late String s2 = '${fisk}${await hest()}${fisk}';
// ^^^^^
//
-// pkg/front_end/testcases/nnbd/later.dart:46:9: Error: Constructor is marked 'const' so fields can't be late.
-// const B();
-// ^
-// pkg/front_end/testcases/nnbd/later.dart:44:18: Context: Field is late, but constructor is 'const'.
+// pkg/front_end/testcases/nnbd/later.dart:44:18: Error: Can't have a late final field in a class with a const constructor.
// late final int x = 42;
// ^
+// pkg/front_end/testcases/nnbd/later.dart:46:9: Context: This constructor is const.
+// const B();
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd/later.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/later.dart.strong.transformed.expect
index 37d882a..f36cfd3 100644
--- a/pkg/front_end/testcases/nnbd/later.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/later.dart.strong.transformed.expect
@@ -55,12 +55,12 @@
// late String s2 = '${fisk}${await hest()}${fisk}';
// ^^^^^
//
-// pkg/front_end/testcases/nnbd/later.dart:46:9: Error: Constructor is marked 'const' so fields can't be late.
-// const B();
-// ^
-// pkg/front_end/testcases/nnbd/later.dart:44:18: Context: Field is late, but constructor is 'const'.
+// pkg/front_end/testcases/nnbd/later.dart:44:18: Error: Can't have a late final field in a class with a const constructor.
// late final int x = 42;
// ^
+// pkg/front_end/testcases/nnbd/later.dart:46:9: Context: This constructor is const.
+// const B();
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd/later.dart.weak.expect b/pkg/front_end/testcases/nnbd/later.dart.weak.expect
index 4ea3cb9..992c773 100644
--- a/pkg/front_end/testcases/nnbd/later.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/later.dart.weak.expect
@@ -55,12 +55,12 @@
// late String s2 = '${fisk}${await hest()}${fisk}';
// ^^^^^
//
-// pkg/front_end/testcases/nnbd/later.dart:46:9: Error: Constructor is marked 'const' so fields can't be late.
-// const B();
-// ^
-// pkg/front_end/testcases/nnbd/later.dart:44:18: Context: Field is late, but constructor is 'const'.
+// pkg/front_end/testcases/nnbd/later.dart:44:18: Error: Can't have a late final field in a class with a const constructor.
// late final int x = 42;
// ^
+// pkg/front_end/testcases/nnbd/later.dart:46:9: Context: This constructor is const.
+// const B();
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd/later.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/later.dart.weak.transformed.expect
index 37d882a..f36cfd3 100644
--- a/pkg/front_end/testcases/nnbd/later.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/later.dart.weak.transformed.expect
@@ -55,12 +55,12 @@
// late String s2 = '${fisk}${await hest()}${fisk}';
// ^^^^^
//
-// pkg/front_end/testcases/nnbd/later.dart:46:9: Error: Constructor is marked 'const' so fields can't be late.
-// const B();
-// ^
-// pkg/front_end/testcases/nnbd/later.dart:44:18: Context: Field is late, but constructor is 'const'.
+// pkg/front_end/testcases/nnbd/later.dart:44:18: Error: Can't have a late final field in a class with a const constructor.
// late final int x = 42;
// ^
+// pkg/front_end/testcases/nnbd/later.dart:46:9: Context: This constructor is const.
+// const B();
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd/null_aware_chain.dart b/pkg/front_end/testcases/nnbd/null_aware_chain.dart
index ff589af..a53cacf 100644
--- a/pkg/front_end/testcases/nnbd/null_aware_chain.dart
+++ b/pkg/front_end/testcases/nnbd/null_aware_chain.dart
@@ -11,6 +11,6 @@
}
main() {
- Class? c = new Class() as Class?;
+ Class? c = new Class();
c?.getter1.getter2?.getter1.getter2?.field = c;
}
diff --git a/pkg/front_end/testcases/nnbd/null_aware_chain.dart.strong.expect b/pkg/front_end/testcases/nnbd/null_aware_chain.dart.strong.expect
index 4c16033..267161a 100644
--- a/pkg/front_end/testcases/nnbd/null_aware_chain.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/null_aware_chain.dart.strong.expect
@@ -13,7 +13,7 @@
return this.{self::Class::field};
}
static method main() → dynamic {
- self::Class? c = new self::Class::•() as{ForNonNullableByDefault} self::Class?;
+ self::Class? c = new self::Class::•();
let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t2 = #t1{self::Class}.{self::Class::getter1}.{self::Class::getter2} in #t2.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t3 = #t2{self::Class}.{self::Class::getter1}.{self::Class::getter2} in #t3.{core::Object::==}(null) ?{self::Class?} null : #t3{self::Class}.{self::Class::field} = c{self::Class};
}
diff --git a/pkg/front_end/testcases/nnbd/null_aware_chain.dart.weak.expect b/pkg/front_end/testcases/nnbd/null_aware_chain.dart.weak.expect
index 4c16033..267161a 100644
--- a/pkg/front_end/testcases/nnbd/null_aware_chain.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/null_aware_chain.dart.weak.expect
@@ -13,7 +13,7 @@
return this.{self::Class::field};
}
static method main() → dynamic {
- self::Class? c = new self::Class::•() as{ForNonNullableByDefault} self::Class?;
+ self::Class? c = new self::Class::•();
let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t2 = #t1{self::Class}.{self::Class::getter1}.{self::Class::getter2} in #t2.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t3 = #t2{self::Class}.{self::Class::getter1}.{self::Class::getter2} in #t3.{core::Object::==}(null) ?{self::Class?} null : #t3{self::Class}.{self::Class::field} = c{self::Class};
}
diff --git a/pkg/front_end/testcases/nnbd/null_check.dart b/pkg/front_end/testcases/nnbd/null_check.dart
index 4cef88b..110d74f 100644
--- a/pkg/front_end/testcases/nnbd/null_check.dart
+++ b/pkg/front_end/testcases/nnbd/null_check.dart
@@ -9,7 +9,7 @@
}
main() {
- Class? c = new Class() as Class?;
+ Class? c = new Class();
c!;
c!.field;
c!.field = 42;
@@ -22,7 +22,7 @@
c + c!;
(c + c)!;
- bool? o = true as bool?;
+ bool? o = true;
!o! ? !o! : !!o!!;
!(o!) ? (!o)! : (!(!o)!)!;
-}
+}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/null_check.dart.strong.expect b/pkg/front_end/testcases/nnbd/null_check.dart.strong.expect
index a1827fa..26ca627 100644
--- a/pkg/front_end/testcases/nnbd/null_check.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/null_check.dart.strong.expect
@@ -99,7 +99,7 @@
return new self::Class::•();
}
static method main() → dynamic {
- self::Class? c = new self::Class::•() as{ForNonNullableByDefault} self::Class?;
+ self::Class? c = new self::Class::•();
c!;
c{self::Class}!.{self::Class::field};
c{self::Class}!.{self::Class::field} = 42;
@@ -111,7 +111,7 @@
c{self::Class}!.{self::Class::+}(c{self::Class}!);
c{self::Class}.{self::Class::+}(c{self::Class}!);
c{self::Class}.{self::Class::+}(c{self::Class})!;
- core::bool? o = true as{ForNonNullableByDefault} core::bool?;
+ core::bool? o = true;
!o! ?{core::bool} !o{core::bool}! : !!o{core::bool}!!;
!o{core::bool}! ?{core::bool} (!o{core::bool})! : (!(!o{core::bool})!)!;
}
diff --git a/pkg/front_end/testcases/nnbd/null_check.dart.weak.expect b/pkg/front_end/testcases/nnbd/null_check.dart.weak.expect
index a1827fa..26ca627 100644
--- a/pkg/front_end/testcases/nnbd/null_check.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/null_check.dart.weak.expect
@@ -99,7 +99,7 @@
return new self::Class::•();
}
static method main() → dynamic {
- self::Class? c = new self::Class::•() as{ForNonNullableByDefault} self::Class?;
+ self::Class? c = new self::Class::•();
c!;
c{self::Class}!.{self::Class::field};
c{self::Class}!.{self::Class::field} = 42;
@@ -111,7 +111,7 @@
c{self::Class}!.{self::Class::+}(c{self::Class}!);
c{self::Class}.{self::Class::+}(c{self::Class}!);
c{self::Class}.{self::Class::+}(c{self::Class})!;
- core::bool? o = true as{ForNonNullableByDefault} core::bool?;
+ core::bool? o = true;
!o! ?{core::bool} !o{core::bool}! : !!o{core::bool}!!;
!o{core::bool}! ?{core::bool} (!o{core::bool})! : (!(!o{core::bool})!)!;
}
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_index.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/null_shorting_index.dart.strong.transformed.expect
index 796847e..9838019 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_index.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_index.dart.strong.transformed.expect
@@ -194,4 +194,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:72:25 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:73:25 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:73:25 -> IntConstant(0)
-Extra constant evaluation: tries: 723, successes: 60
+Extra constant evaluation: evaluated: 723, effectively constant: 60
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_index.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/null_shorting_index.dart.weak.transformed.expect
index 11ed800..7e7ea06 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_index.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_index.dart.weak.transformed.expect
@@ -194,4 +194,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:72:25 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:73:25 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:73:25 -> IntConstant(0)
-Extra constant evaluation: tries: 702, successes: 60
+Extra constant evaluation: evaluated: 702, effectively constant: 60
diff --git a/pkg/front_end/testcases/nnbd/nullable_param.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_param.dart.strong.transformed.expect
index 0e67f9e..49de6f1 100644
--- a/pkg/front_end/testcases/nnbd/nullable_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_param.dart.strong.transformed.expect
@@ -25,4 +25,4 @@
Extra constant evaluation status:
Evaluated: MethodInvocation @ org-dartlang-testcase:///nullable_param.dart:19:23 -> IntConstant(-1)
-Extra constant evaluation: tries: 20, successes: 1
+Extra constant evaluation: evaluated: 20, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd/nullable_param.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_param.dart.weak.transformed.expect
index 0e67f9e..49de6f1 100644
--- a/pkg/front_end/testcases/nnbd/nullable_param.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_param.dart.weak.transformed.expect
@@ -25,4 +25,4 @@
Extra constant evaluation status:
Evaluated: MethodInvocation @ org-dartlang-testcase:///nullable_param.dart:19:23 -> IntConstant(-1)
-Extra constant evaluation: tries: 20, successes: 1
+Extra constant evaluation: evaluated: 20, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd/nullable_setter.dart b/pkg/front_end/testcases/nnbd/nullable_setter.dart
index f644300..8e9d230 100644
--- a/pkg/front_end/testcases/nnbd/nullable_setter.dart
+++ b/pkg/front_end/testcases/nnbd/nullable_setter.dart
@@ -19,7 +19,7 @@
}
main() {
- C? c = new C() as C?;
+ C? c = new C();
expect("", c?.m);
c.setter = "42";
expect("42", c?.m);
diff --git a/pkg/front_end/testcases/nnbd/nullable_setter.dart.strong.expect b/pkg/front_end/testcases/nnbd/nullable_setter.dart.strong.expect
index ac016f2..d367854 100644
--- a/pkg/front_end/testcases/nnbd/nullable_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_setter.dart.strong.expect
@@ -21,7 +21,7 @@
let final self::C? #t2 = #this in #t2.{core::Object::==}(null) ?{core::String?} null : #t2{self::C}.{self::C::m} = "${index}${value}";
}
static method main() → dynamic {
- self::C? c = new self::C::•() as{ForNonNullableByDefault} self::C?;
+ self::C? c = new self::C::•();
self::expect("", let final self::C? #t3 = c in #t3.{core::Object::==}(null) ?{core::String?} null : #t3{self::C}.{self::C::m});
self::_extension#0|set#setter(c, "42");
self::expect("42", let final self::C? #t4 = c in #t4.{core::Object::==}(null) ?{core::String?} null : #t4{self::C}.{self::C::m});
diff --git a/pkg/front_end/testcases/nnbd/nullable_setter.dart.weak.expect b/pkg/front_end/testcases/nnbd/nullable_setter.dart.weak.expect
index ac016f2..d367854 100644
--- a/pkg/front_end/testcases/nnbd/nullable_setter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_setter.dart.weak.expect
@@ -21,7 +21,7 @@
let final self::C? #t2 = #this in #t2.{core::Object::==}(null) ?{core::String?} null : #t2{self::C}.{self::C::m} = "${index}${value}";
}
static method main() → dynamic {
- self::C? c = new self::C::•() as{ForNonNullableByDefault} self::C?;
+ self::C? c = new self::C::•();
self::expect("", let final self::C? #t3 = c in #t3.{core::Object::==}(null) ?{core::String?} null : #t3{self::C}.{self::C::m});
self::_extension#0|set#setter(c, "42");
self::expect("42", let final self::C? #t4 = c in #t4.{core::Object::==}(null) ?{core::String?} null : #t4{self::C}.{self::C::m});
diff --git a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.outline.expect b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.outline.expect
index 5ac5185..f5a5f71 100644
--- a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.outline.expect
@@ -45,4 +45,4 @@
Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:9:43 -> InstanceConstant(const _Patch{})
Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:15:19 -> InstanceConstant(const _Patch{})
Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:28:17 -> InstanceConstant(const _Patch{})
-Extra constant evaluation: tries: 6, successes: 4
+Extra constant evaluation: evaluated: 6, effectively constant: 4
diff --git a/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.outline.expect b/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.outline.expect
index 8aaaafa..96c486e9 100644
--- a/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.outline.expect
@@ -40,4 +40,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
-Extra constant evaluation: tries: 2, successes: 2
+Extra constant evaluation: evaluated: 2, effectively constant: 2
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect
index b15b586..9036823 100644
--- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect
@@ -67,4 +67,4 @@
Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:8:22 -> InstanceConstant(const _Patch{})
Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:11:2 -> InstanceConstant(const _Patch{})
Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
-Extra constant evaluation: tries: 3, successes: 3
+Extra constant evaluation: evaluated: 3, effectively constant: 3
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.outline.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.outline.expect
index 629005d9..55b2345 100644
--- a/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.outline.expect
@@ -50,4 +50,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///potentially_constant_type_as.dart:22:36 -> IntConstant(3)
Evaluated: Instantiation @ org-dartlang-testcase:///potentially_constant_type_as.dart:11:43 -> PartialInstantiationConstant(idFunction<int>)
-Extra constant evaluation: tries: 11, successes: 2
+Extra constant evaluation: evaluated: 11, effectively constant: 2
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.outline.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.outline.expect
index 423d7bd..b2e2658 100644
--- a/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.outline.expect
@@ -46,4 +46,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///potentially_constant_type_is.dart:22:36 -> IntConstant(3)
Evaluated: Instantiation @ org-dartlang-testcase:///potentially_constant_type_is.dart:11:43 -> PartialInstantiationConstant(idFunction<int>)
-Extra constant evaluation: tries: 11, successes: 2
+Extra constant evaluation: evaluated: 11, effectively constant: 2
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.outline.expect b/pkg/front_end/testcases/nnbd/return_null.dart.outline.expect
index a4a97e5..3806476 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.outline.expect
@@ -55,4 +55,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///return_null.dart:43:6 -> ListConstant(const <Enum>[const Enum{Enum.index: 0, Enum._name: "Enum.a"}, const Enum{Enum.index: 1, Enum._name: "Enum.b"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///return_null.dart:43:13 -> InstanceConstant(const Enum{Enum.index: 0, Enum._name: "Enum.a"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///return_null.dart:43:16 -> InstanceConstant(const Enum{Enum.index: 1, Enum._name: "Enum.b"})
-Extra constant evaluation: tries: 7, successes: 3
+Extra constant evaluation: evaluated: 7, effectively constant: 3
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect
index 18713fd..4f8e60b 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect
@@ -644,4 +644,4 @@
Evaluated: MethodInvocation @ org-dartlang-testcase:///return_null.dart:75:14 -> BoolConstant(true)
Evaluated: VariableGet @ org-dartlang-testcase:///return_null.dart:75:14 -> NullConstant(null)
Evaluated: VariableGet @ org-dartlang-testcase:///return_null.dart:75:14 -> NullConstant(null)
-Extra constant evaluation: tries: 428, successes: 12
+Extra constant evaluation: evaluated: 428, effectively constant: 12
diff --git a/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.transformed.expect
index bb2c387..2c4e1da 100644
--- a/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.transformed.expect
@@ -118,4 +118,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///shorting_stop.dart:26:13 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///shorting_stop.dart:27:11 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///shorting_stop.dart:27:11 -> IntConstant(0)
-Extra constant evaluation: tries: 165, successes: 4
+Extra constant evaluation: evaluated: 165, effectively constant: 4
diff --git a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect
index bb2c387..2c4e1da 100644
--- a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect
@@ -118,4 +118,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///shorting_stop.dart:26:13 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///shorting_stop.dart:27:11 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///shorting_stop.dart:27:11 -> IntConstant(0)
-Extra constant evaluation: tries: 165, successes: 4
+Extra constant evaluation: evaluated: 165, effectively constant: 4
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 bbb733e..87930a9 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
@@ -221,4 +221,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///strictly_non_nullable_warnings.dart:42:8 -> IntConstant(42)
Evaluated: VariableGet @ org-dartlang-testcase:///strictly_non_nullable_warnings.dart:43:5 -> IntConstant(42)
Evaluated: VariableGet @ org-dartlang-testcase:///strictly_non_nullable_warnings.dart:43:5 -> IntConstant(42)
-Extra constant evaluation: tries: 221, successes: 6
+Extra constant evaluation: evaluated: 221, effectively constant: 6
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 bbb733e..87930a9 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
@@ -221,4 +221,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///strictly_non_nullable_warnings.dart:42:8 -> IntConstant(42)
Evaluated: VariableGet @ org-dartlang-testcase:///strictly_non_nullable_warnings.dart:43:5 -> IntConstant(42)
Evaluated: VariableGet @ org-dartlang-testcase:///strictly_non_nullable_warnings.dart:43:5 -> IntConstant(42)
-Extra constant evaluation: tries: 221, successes: 6
+Extra constant evaluation: evaluated: 221, effectively constant: 6
diff --git a/pkg/front_end/testcases/nnbd/switch_nullable_enum.dart.outline.expect b/pkg/front_end/testcases/nnbd/switch_nullable_enum.dart.outline.expect
index 487e5d5..6bfb752 100644
--- a/pkg/front_end/testcases/nnbd/switch_nullable_enum.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/switch_nullable_enum.dart.outline.expect
@@ -34,4 +34,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///switch_nullable_enum.dart:5:6 -> ListConstant(const <Enum>[const Enum{Enum.index: 0, Enum._name: "Enum.e1"}, const Enum{Enum.index: 1, Enum._name: "Enum.e2"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///switch_nullable_enum.dart:5:13 -> InstanceConstant(const Enum{Enum.index: 0, Enum._name: "Enum.e1"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///switch_nullable_enum.dart:5:17 -> InstanceConstant(const Enum{Enum.index: 1, Enum._name: "Enum.e2"})
-Extra constant evaluation: tries: 7, successes: 3
+Extra constant evaluation: evaluated: 7, effectively constant: 3
diff --git a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect
index cfc2836..c7475f1 100644
--- a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect
@@ -97,4 +97,4 @@
Evaluated: MethodInvocation @ org-dartlang-testcase:///tearoff_from_nullable_receiver.dart:14:24 -> BoolConstant(true)
Evaluated: VariableGet @ org-dartlang-testcase:///tearoff_from_nullable_receiver.dart:14:24 -> NullConstant(null)
Evaluated: VariableGet @ org-dartlang-testcase:///tearoff_from_nullable_receiver.dart:14:24 -> NullConstant(null)
-Extra constant evaluation: tries: 58, successes: 3
+Extra constant evaluation: evaluated: 58, effectively constant: 3
diff --git a/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.strong.transformed.expect
index 32ed016..0104bef 100644
--- a/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.strong.transformed.expect
@@ -30,4 +30,4 @@
Evaluated: MethodInvocation @ org-dartlang-testcase:///type_constraint_solving_closures_in_upper_and_lower_bounds.dart:10:3 -> BoolConstant(true)
Evaluated: VariableGet @ org-dartlang-testcase:///type_constraint_solving_closures_in_upper_and_lower_bounds.dart:10:15 -> NullConstant(null)
Evaluated: VariableGet @ org-dartlang-testcase:///type_constraint_solving_closures_in_upper_and_lower_bounds.dart:10:3 -> NullConstant(null)
-Extra constant evaluation: tries: 12, successes: 3
+Extra constant evaluation: evaluated: 12, effectively constant: 3
diff --git a/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.transformed.expect
index e3474fe..439da59 100644
--- a/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.transformed.expect
@@ -141,4 +141,4 @@
Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:8:40 -> BoolConstant(true)
Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is_lib.dart:24:15 -> BoolConstant(false)
Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is_lib.dart:25:15 -> BoolConstant(true)
-Extra constant evaluation: tries: 139, successes: 16
+Extra constant evaluation: evaluated: 139, effectively constant: 16
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.transformed.expect
index 87f8f14..a19de51 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.transformed.expect
@@ -30,4 +30,4 @@
Extra constant evaluation status:
Evaluated: IsExpression @ org-dartlang-testcase:///issue41657.dart:5:44 -> BoolConstant(true)
Evaluated: IsExpression @ org-dartlang-testcase:///issue41657.dart:7:44 -> BoolConstant(true)
-Extra constant evaluation: tries: 18, successes: 2
+Extra constant evaluation: evaluated: 18, effectively constant: 2
diff --git a/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.expect
index 17acc60..211e16d 100644
--- a/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.expect
@@ -488,11 +488,11 @@
new uns::OptInClass4::•().{uns::OptInClass4::methodForEffect}(i);
}
static method nullAwareIfNullSetOptIn(core::int i) → dynamic {
- uns::OptInClass5? o = new uns::OptInClass5::•(i) as{ForNonNullableByDefault} uns::OptInClass5?;
+ uns::OptInClass5? o = new uns::OptInClass5::•(i);
return let final uns::OptInClass5? #t66 = o in #t66.{core::Object::==}(null) ?{core::int?} null : let final core::int #t67 = #t66.{uns::OptInClass5::field} in #t67.{core::num::==}(null) ?{core::int} #t66.{uns::OptInClass5::field} = 42 : #t67;
}
static method nullAwareIfNullSetOptInForEffect(core::int i) → dynamic {
- uns::OptInClass5? o = new uns::OptInClass5::•(i) as{ForNonNullableByDefault} uns::OptInClass5?;
+ uns::OptInClass5? o = new uns::OptInClass5::•(i);
let final uns::OptInClass5? #t68 = o in #t68.{core::Object::==}(null) ?{core::int?} null : #t68.{uns::OptInClass5::field}.{core::num::==}(null) ?{core::int} #t68.{uns::OptInClass5::field} = 42 : null;
}
static method isTestOptIn(core::int i) → dynamic
diff --git a/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.transformed.expect
index 8d00f15..af2b9be 100644
--- a/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.transformed.expect
@@ -639,4 +639,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks_lib.dart:39:56 -> IntConstant(42)
Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks_lib.dart:134:5 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks_lib.dart:134:5 -> IntConstant(0)
-Extra constant evaluation: tries: 720, successes: 18
+Extra constant evaluation: evaluated: 720, effectively constant: 18
diff --git a/pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart b/pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart
index 738e03a..6dd9b47 100644
--- a/pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart
+++ b/pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart
@@ -85,12 +85,12 @@
}
nullAwareIfNullSetOptIn(int i) {
- OptInClass5? o = new OptInClass5(i) as OptInClass5?;
+ OptInClass5? o = new OptInClass5(i);
return o?.field ??= 42;
}
nullAwareIfNullSetOptInForEffect(int i) {
- OptInClass5? o = new OptInClass5(i) as OptInClass5?;
+ OptInClass5? o = new OptInClass5(i);
o?.field ??= 42;
}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.outline.expect
index 2cd194d..6a3fcc1 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.outline.expect
@@ -54,4 +54,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_accessors_from_field.dart:18:7 -> SymbolConstant(#foo=)
Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_accessors_from_field.dart:18:7 -> ListConstant(const <Type*>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_accessors_from_field.dart:18:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 19, successes: 7
+Extra constant evaluation: evaluated: 19, effectively constant: 7
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.outline.expect
index be8c3ef..26d73b4 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.outline.expect
@@ -71,4 +71,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_arent_mixed_in.dart:12:7 -> SymbolConstant(#foo=)
Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_arent_mixed_in.dart:12:7 -> ListConstant(const <Type*>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_arent_mixed_in.dart:12:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 19, successes: 7
+Extra constant evaluation: evaluated: 19, effectively constant: 7
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.outline.expect
index 228826a..8db6c2b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.outline.expect
@@ -77,4 +77,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_one_defined.dart:17:7 -> ListConstant(const <Type*>[])
Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_one_defined.dart:17:7 -> ListConstant(const <dynamic>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_one_defined.dart:17:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 19, successes: 7
+Extra constant evaluation: evaluated: 19, effectively constant: 7
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect
index 7f8e4b5..8348811 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect
@@ -50,4 +50,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_with_substitution.dart:18:11 -> SymbolConstant(#foo=)
Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_with_substitution.dart:18:11 -> ListConstant(const <Type*>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_with_substitution.dart:18:11 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 19, successes: 7
+Extra constant evaluation: evaluated: 19, effectively constant: 7
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.outline.expect
index 85a5331..29f7048 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.outline.expect
@@ -47,4 +47,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_interface_nsm_inherited.dart:16:8 -> ListConstant(const <Type*>[])
Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_interface_nsm_inherited.dart:16:8 -> ListConstant(const <dynamic>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_interface_nsm_inherited.dart:16:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 8, successes: 4
+Extra constant evaluation: evaluated: 8, effectively constant: 4
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_abstract_different_type.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_abstract_different_type.dart.outline.expect
index d42519a..a18f420 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_abstract_different_type.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_abstract_different_type.dart.outline.expect
@@ -50,4 +50,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_override_abstract_different_type.dart:17:7 -> SymbolConstant(#float=)
Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_override_abstract_different_type.dart:17:7 -> ListConstant(const <Type*>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_override_abstract_different_type.dart:17:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 40, successes: 12
+Extra constant evaluation: evaluated: 40, effectively constant: 12
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.outline.expect
index a7aa057..fd257f0 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.outline.expect
@@ -82,4 +82,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_override_with_different_signature.dart:26:7 -> ListConstant(const <Type*>[])
Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_override_with_different_signature.dart:26:7 -> SymbolConstant(#amount)
Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_override_with_different_signature.dart:26:7 -> SymbolConstant(#yetAnother)
-Extra constant evaluation: tries: 39, successes: 10
+Extra constant evaluation: evaluated: 39, effectively constant: 10
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.outline.expect
index fb783b9..be653d9 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.outline.expect
@@ -68,4 +68,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///concrete_method_over_forwarder_in_mixin_application.dart:10:3 -> ListConstant(const <Type*>[])
Evaluated: ListLiteral @ org-dartlang-testcase:///concrete_method_over_forwarder_in_mixin_application.dart:10:3 -> ListConstant(const <dynamic>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///concrete_method_over_forwarder_in_mixin_application.dart:10:3 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 9, successes: 4
+Extra constant evaluation: evaluated: 9, effectively constant: 4
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.outline.expect
index 9d3cb8e..27e25ce 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.outline.expect
@@ -39,4 +39,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///default_argument_values.dart:22:7 -> SymbolConstant(#hest)
Evaluated: ListLiteral @ org-dartlang-testcase:///default_argument_values.dart:22:7 -> ListConstant(const <Type*>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///default_argument_values.dart:22:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 22, successes: 7
+Extra constant evaluation: evaluated: 22, effectively constant: 7
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.outline.expect
index aab9b99..4dfd530 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.outline.expect
@@ -58,4 +58,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///duplicated_abstract_method.dart:14:8 -> ListConstant(const <Type*>[])
Evaluated: ListLiteral @ org-dartlang-testcase:///duplicated_abstract_method.dart:14:8 -> ListConstant(const <dynamic>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///duplicated_abstract_method.dart:14:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 8, successes: 4
+Extra constant evaluation: evaluated: 8, effectively constant: 4
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/forwarder_propagation.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarder_propagation.dart.outline.expect
index 30955c5..dcd9757 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/forwarder_propagation.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarder_propagation.dart.outline.expect
@@ -132,4 +132,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///forwarder_propagation_lib.dart:6:7 -> SymbolConstant(#_privateField=)
Evaluated: ListLiteral @ org-dartlang-testcase:///forwarder_propagation_lib.dart:6:7 -> ListConstant(const <Type*>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///forwarder_propagation_lib.dart:6:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 79, successes: 29
+Extra constant evaluation: evaluated: 79, effectively constant: 29
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.outline.expect
index 6e1c5fd..e03bb94 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.outline.expect
@@ -67,4 +67,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///forwarders_not_assumed_from_mixin.dart:10:8 -> ListConstant(const <Type*>[])
Evaluated: ListLiteral @ org-dartlang-testcase:///forwarders_not_assumed_from_mixin.dart:10:8 -> ListConstant(const <dynamic>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///forwarders_not_assumed_from_mixin.dart:10:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 16, successes: 8
+Extra constant evaluation: evaluated: 16, effectively constant: 8
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.outline.expect
index bd80008..513d138 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.outline.expect
@@ -48,4 +48,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///interface_with_concrete.dart:16:8 -> ListConstant(const <Type*>[])
Evaluated: ListLiteral @ org-dartlang-testcase:///interface_with_concrete.dart:16:8 -> ListConstant(const <dynamic>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///interface_with_concrete.dart:16:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 8, successes: 4
+Extra constant evaluation: evaluated: 8, effectively constant: 4
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.outline.expect
index f8bacc6..6e4c566 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.outline.expect
@@ -91,4 +91,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///interface_with_nsm.dart:15:8 -> ListConstant(const <Type*>[])
Evaluated: ListLiteral @ org-dartlang-testcase:///interface_with_nsm.dart:15:8 -> ListConstant(const <dynamic>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///interface_with_nsm.dart:15:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 24, successes: 12
+Extra constant evaluation: evaluated: 24, effectively constant: 12
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.outline.expect
index f723036..8a420c1 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.outline.expect
@@ -87,4 +87,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///multiple_abstract_setters.dart:16:12 -> SymbolConstant(#foo=)
Evaluated: ListLiteral @ org-dartlang-testcase:///multiple_abstract_setters.dart:16:12 -> ListConstant(const <Type*>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///multiple_abstract_setters.dart:16:12 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 19, successes: 7
+Extra constant evaluation: evaluated: 19, effectively constant: 7
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.outline.expect
index a0cdefd..c81571e 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.outline.expect
@@ -33,4 +33,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///no_forwarders_for_abstract_classes.dart:13:8 -> ListConstant(const <Type*>[])
Evaluated: ListLiteral @ org-dartlang-testcase:///no_forwarders_for_abstract_classes.dart:13:8 -> ListConstant(const <dynamic>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///no_forwarders_for_abstract_classes.dart:13:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 8, successes: 4
+Extra constant evaluation: evaluated: 8, effectively constant: 4
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.outline.expect
index 0a63c6f..59a56b80 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.outline.expect
@@ -41,4 +41,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///no_forwarders_for_abstract_classes_chain.dart:14:8 -> ListConstant(const <Type*>[])
Evaluated: ListLiteral @ org-dartlang-testcase:///no_forwarders_for_abstract_classes_chain.dart:14:8 -> ListConstant(const <dynamic>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///no_forwarders_for_abstract_classes_chain.dart:14:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 8, successes: 4
+Extra constant evaluation: evaluated: 8, effectively constant: 4
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.outline.expect
index 878ce86..cf93dc7 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.outline.expect
@@ -31,4 +31,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_inherited.dart:13:8 -> SymbolConstant(#call)
Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_inherited.dart:13:8 -> ListConstant(const <Type*>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///nsm_inherited.dart:13:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 10, successes: 3
+Extra constant evaluation: evaluated: 10, effectively constant: 3
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.outline.expect
index f44fb74..69a5847 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.outline.expect
@@ -46,4 +46,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_mixed_in.dart:15:8 -> ListConstant(const <Type*>[])
Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_mixed_in.dart:15:8 -> ListConstant(const <dynamic>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///nsm_mixed_in.dart:15:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 8, successes: 4
+Extra constant evaluation: evaluated: 8, effectively constant: 4
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect
index 43a5a8b..6b1da0c 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect
@@ -69,4 +69,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///private_module.dart:11:8 -> ListConstant(const <Type*>[])
Evaluated: ListLiteral @ org-dartlang-testcase:///private_module.dart:11:8 -> ListConstant(const <dynamic>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///private_module.dart:11:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 16, successes: 8
+Extra constant evaluation: evaluated: 16, effectively constant: 8
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.outline.expect
index 8a438d1..40e53fb 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.outline.expect
@@ -34,4 +34,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///private_same.dart:10:8 -> ListConstant(const <Type*>[])
Evaluated: ListLiteral @ org-dartlang-testcase:///private_same.dart:10:8 -> ListConstant(const <dynamic>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///private_same.dart:10:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 8, successes: 4
+Extra constant evaluation: evaluated: 8, effectively constant: 4
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/same.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/same.dart.outline.expect
index 228bf79..b321f75 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/same.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/same.dart.outline.expect
@@ -28,4 +28,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///same.dart:14:8 -> ListConstant(const <Type*>[])
Evaluated: ListLiteral @ org-dartlang-testcase:///same.dart:14:8 -> ListConstant(const <dynamic>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///same.dart:14:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 8, successes: 4
+Extra constant evaluation: evaluated: 8, effectively constant: 4
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.outline.expect
index d34c55c..7c74a0a 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.outline.expect
@@ -39,4 +39,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///setter_not_shadowed_by_method.dart:12:12 -> SymbolConstant(#foo=)
Evaluated: ListLiteral @ org-dartlang-testcase:///setter_not_shadowed_by_method.dart:12:12 -> ListConstant(const <Type*>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///setter_not_shadowed_by_method.dart:12:12 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 10, successes: 3
+Extra constant evaluation: evaluated: 10, effectively constant: 3
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
index f3f2e8b..e523dd2 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
@@ -61,4 +61,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///subst_on_forwarder.dart:10:5 -> ListConstant(const <Type*>[])
Evaluated: ListLiteral @ org-dartlang-testcase:///subst_on_forwarder.dart:10:5 -> ListConstant(const <dynamic>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///subst_on_forwarder.dart:10:5 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 9, successes: 4
+Extra constant evaluation: evaluated: 9, effectively constant: 4
diff --git a/pkg/front_end/testcases/rasta/enum.dart.outline.expect b/pkg/front_end/testcases/rasta/enum.dart.outline.expect
index ee249a7..2be4a63 100644
--- a/pkg/front_end/testcases/rasta/enum.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/enum.dart.outline.expect
@@ -31,4 +31,4 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///enum.dart:5:6 -> ListConstant(const <Foo*>[const Foo{Foo.index: 0, Foo._name: "Foo.ec1"}, const Foo{Foo.index: 1, Foo._name: "Foo.ec2"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///enum.dart:6:3 -> InstanceConstant(const Foo{Foo.index: 0, Foo._name: "Foo.ec1"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///enum.dart:7:3 -> InstanceConstant(const Foo{Foo.index: 1, Foo._name: "Foo.ec2"})
-Extra constant evaluation: tries: 7, successes: 3
+Extra constant evaluation: evaluated: 7, effectively constant: 3
diff --git a/pkg/front_end/testcases/rasta/issue_000026.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000026.dart.strong.transformed.expect
index 8a4fbe0..d8064f6 100644
--- a/pkg/front_end/testcases/rasta/issue_000026.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000026.dart.strong.transformed.expect
@@ -47,4 +47,4 @@
Extra constant evaluation status:
Evaluated: MethodInvocation @ org-dartlang-testcase:///issue_000026.dart:8:13 -> IntConstant(3)
Evaluated: MethodInvocation @ org-dartlang-testcase:///issue_000026.dart:14:13 -> IntConstant(-1)
-Extra constant evaluation: tries: 4, successes: 2
+Extra constant evaluation: evaluated: 4, effectively constant: 2
diff --git a/pkg/front_end/testcases/rasta/issue_000043.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000043.dart.strong.transformed.expect
index 27bb674..9a23794 100644
--- a/pkg/front_end/testcases/rasta/issue_000043.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000043.dart.strong.transformed.expect
@@ -23,4 +23,4 @@
Extra constant evaluation status:
Evaluated: TypeLiteral @ org-dartlang-testcase:///issue_000043.dart:6:14 -> TypeLiteralConstant(C*)
-Extra constant evaluation: tries: 3, successes: 1
+Extra constant evaluation: evaluated: 3, effectively constant: 1
diff --git a/pkg/front_end/testcases/rasta/issue_000045.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000045.dart.strong.transformed.expect
index 0a88a49..c9a26da 100644
--- a/pkg/front_end/testcases/rasta/issue_000045.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000045.dart.strong.transformed.expect
@@ -22,4 +22,4 @@
Extra constant evaluation status:
Evaluated: StringConcatenation @ org-dartlang-testcase:///issue_000045.dart:6:1 -> StringConstant("1
\"\"\"")
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
index a99869d..9fbd201 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
@@ -54,4 +54,4 @@
Extra constant evaluation status:
Evaluated: ListLiteral @ org-dartlang-testcase:///issue_000070.dart:22:33 -> ListConstant(const <Null?>[null])
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/rasta/issue_000081.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000081.dart.strong.transformed.expect
index 6eb4bee..8b6d4d8 100644
--- a/pkg/front_end/testcases/rasta/issue_000081.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000081.dart.strong.transformed.expect
@@ -38,4 +38,4 @@
Extra constant evaluation status:
Evaluated: VariableGet @ org-dartlang-testcase:///issue_000081.dart:22:5 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///issue_000081.dart:22:5 -> IntConstant(0)
-Extra constant evaluation: tries: 33, successes: 2
+Extra constant evaluation: evaluated: 33, effectively constant: 2
diff --git a/pkg/front_end/testcases/rasta/static.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/static.dart.strong.transformed.expect
index 531daa2..7c94fe0 100644
--- a/pkg/front_end/testcases/rasta/static.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/static.dart.strong.transformed.expect
@@ -345,4 +345,4 @@
Evaluated: Let @ org-dartlang-testcase:///static.dart:76:28 -> IntConstant(42)
Evaluated: ConditionalExpression @ org-dartlang-testcase:///static.dart:79:24 -> NullConstant(null)
Evaluated: Let @ org-dartlang-testcase:///static.dart:80:28 -> TearOffConstant(Foo.staticFunction)
-Extra constant evaluation: tries: 122, successes: 6
+Extra constant evaluation: evaluated: 122, effectively constant: 6
diff --git a/pkg/front_end/testcases/rasta/type_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/type_literals.dart.strong.transformed.expect
index a1307d9..b50aab5 100644
--- a/pkg/front_end/testcases/rasta/type_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/type_literals.dart.strong.transformed.expect
@@ -545,4 +545,4 @@
Evaluated: Let @ org-dartlang-testcase:///type_literals.dart:77:17 -> TypeLiteralConstant(dynamic)
Evaluated: ConditionalExpression @ org-dartlang-testcase:///type_literals.dart:80:10 -> NullConstant(null)
Evaluated: Let @ org-dartlang-testcase:///type_literals.dart:81:14 -> TypeLiteralConstant(void Function()*)
-Extra constant evaluation: tries: 72, successes: 12
+Extra constant evaluation: evaluated: 72, effectively constant: 12
diff --git a/pkg/front_end/testcases/rasta/typedef.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/typedef.dart.strong.transformed.expect
index c70ff3c..2fda16d 100644
--- a/pkg/front_end/testcases/rasta/typedef.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/typedef.dart.strong.transformed.expect
@@ -35,4 +35,4 @@
Extra constant evaluation status:
Evaluated: TypeLiteral @ org-dartlang-testcase:///typedef.dart:8:9 -> TypeLiteralConstant(void Function()*)
Evaluated: ConditionalExpression @ org-dartlang-testcase:///typedef.dart:10:7 -> NullConstant(null)
-Extra constant evaluation: tries: 3, successes: 2
+Extra constant evaluation: evaluated: 3, effectively constant: 2
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.transformed.expect
index 6f30679..85061fb 100644
--- a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.transformed.expect
@@ -265,4 +265,4 @@
Evaluated: TypeLiteral @ org-dartlang-testcase:///unresolved_for_in.dart:21:13 -> TypeLiteralConstant(void Function()*)
Evaluated: TypeLiteral @ org-dartlang-testcase:///unresolved_for_in.dart:35:11 -> TypeLiteralConstant(Fisk*)
Evaluated: TypeLiteral @ org-dartlang-testcase:///unresolved_for_in.dart:41:11 -> TypeLiteralConstant(void Function()*)
-Extra constant evaluation: tries: 85, successes: 4
+Extra constant evaluation: evaluated: 85, effectively constant: 4
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_30838.dart.strong.transformed.expect
index 29d84c1..83eb83e 100644
--- a/pkg/front_end/testcases/regress/issue_30838.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.strong.transformed.expect
@@ -37,4 +37,4 @@
Extra constant evaluation status:
Evaluated: VariableGet @ org-dartlang-testcase:///issue_30838.dart:15:15 -> StringConstant("hello")
-Extra constant evaluation: tries: 7, successes: 1
+Extra constant evaluation: evaluated: 7, effectively constant: 1
diff --git a/pkg/front_end/testcases/regress/issue_31180.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31180.dart.strong.transformed.expect
index 2bb9e3f..49cab5b 100644
--- a/pkg/front_end/testcases/regress/issue_31180.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31180.dart.strong.transformed.expect
@@ -18,4 +18,4 @@
Extra constant evaluation status:
Evaluated: Let @ org-dartlang-testcase:///issue_31180.dart:6:10 -> NullConstant(null)
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect
index c697a08..14ec668 100644
--- a/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect
@@ -18,4 +18,4 @@
Extra constant evaluation status:
Evaluated: IsExpression @ org-dartlang-testcase:///issue_31846.dart:6:14 -> BoolConstant(true)
-Extra constant evaluation: tries: 26, successes: 1
+Extra constant evaluation: evaluated: 26, effectively constant: 1
diff --git a/pkg/front_end/testcases/regress/issue_35220.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_35220.dart.strong.transformed.expect
index a5f5964..2538af6 100644
--- a/pkg/front_end/testcases/regress/issue_35220.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35220.dart.strong.transformed.expect
@@ -36,4 +36,4 @@
Extra constant evaluation status:
Evaluated: Not @ org-dartlang-testcase:///issue_35220.dart:6:25 -> BoolConstant(true)
-Extra constant evaluation: tries: 3, successes: 1
+Extra constant evaluation: evaluated: 3, effectively constant: 1
diff --git a/pkg/front_end/testcases/regress/issue_36793.dart.outline.expect b/pkg/front_end/testcases/regress/issue_36793.dart.outline.expect
index 969fc91..8436fb3 100644
--- a/pkg/front_end/testcases/regress/issue_36793.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_36793.dart.outline.expect
@@ -21,4 +21,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///issue_36793.dart:7:2 -> IntConstant(42)
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.transformed.expect
index 013a7ab..84c4721 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.transformed.expect
@@ -30,4 +30,4 @@
Extra constant evaluation status:
Evaluated: VariableGet @ org-dartlang-testcase:///contravariant_getter.dart:18:49 -> DoubleConstant(1.5)
-Extra constant evaluation: tries: 14, successes: 1
+Extra constant evaluation: evaluated: 14, effectively constant: 1
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.strong.transformed.expect
index d832e66..12c20f9 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.strong.transformed.expect
@@ -33,4 +33,4 @@
Extra constant evaluation status:
Evaluated: VariableGet @ org-dartlang-testcase:///dynamic_invocation_of_getter.dart:14:7 -> DoubleConstant(1.5)
-Extra constant evaluation: tries: 10, successes: 1
+Extra constant evaluation: evaluated: 10, effectively constant: 1
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect
index 2a5053a..4656a41 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect
@@ -64,4 +64,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///contravariant_combiner.dart:27:5 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///contravariant_combiner.dart:28:13 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///contravariant_combiner.dart:28:13 -> IntConstant(0)
-Extra constant evaluation: tries: 58, successes: 4
+Extra constant evaluation: evaluated: 58, effectively constant: 4
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
index 45354e3..c4d3d9c 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
@@ -92,4 +92,4 @@
Extra constant evaluation status:
Evaluated: VariableGet @ org-dartlang-testcase:///contravariant_generic_return_with_compound_assign_implicit_downcast.dart:50:21 -> IntConstant(0)
-Extra constant evaluation: tries: 58, successes: 1
+Extra constant evaluation: evaluated: 58, effectively constant: 1
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.transformed.expect
index 1b209c7..e094433 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.transformed.expect
@@ -57,4 +57,4 @@
Evaluated: VariableGet @ org-dartlang-testcase:///contravariant_index_assign.dart:23:45 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///contravariant_index_assign.dart:24:53 -> IntConstant(0)
Evaluated: VariableGet @ org-dartlang-testcase:///contravariant_index_assign.dart:24:53 -> IntConstant(0)
-Extra constant evaluation: tries: 64, successes: 8
+Extra constant evaluation: evaluated: 64, effectively constant: 8
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 1619610..3d0f6a4 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -161,8 +161,8 @@
late_lowering/later: FormatterCrash
late_lowering/override: FormatterCrash
late_lowering/override_getter_setter: FormatterCrash
-late_lowering_sentinel/late_fields: FormatterCrash
late_lowering/uninitialized_non_nullable_late_fields: FormatterCrash
+late_lowering_sentinel/late_fields: FormatterCrash
nnbd/abstract_field_errors: FormatterCrash
nnbd/covariant_late_field: FormatterCrash
nnbd/extension_bounds: FormatterCrash
@@ -177,6 +177,7 @@
nnbd/issue41597: FormatterCrash
nnbd/issue42967: FormatterCrash
nnbd/issue43278: FormatterCrash
+nnbd/issue43354: FormatterCrash
nnbd/late: FormatterCrash
nnbd/later: FormatterCrash
nnbd/no_null_shorting_explicit_extension: FormatterCrash
diff --git a/pkg/front_end/testcases/unified_collections/string_concatenation.dart.strong.transformed.expect b/pkg/front_end/testcases/unified_collections/string_concatenation.dart.strong.transformed.expect
index 47b50a0..b5ffe41 100644
--- a/pkg/front_end/testcases/unified_collections/string_concatenation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/unified_collections/string_concatenation.dart.strong.transformed.expect
@@ -16,4 +16,4 @@
Extra constant evaluation status:
Evaluated: StringConcatenation @ org-dartlang-testcase:///string_concatenation.dart:7:3 -> StringConstant("ab")
Evaluated: StringConcatenation @ org-dartlang-testcase:///string_concatenation.dart:7:18 -> StringConstant("cd")
-Extra constant evaluation: tries: 10, successes: 2
+Extra constant evaluation: evaluated: 10, effectively constant: 2
diff --git a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart
index 031deb0..a878e4a 100644
--- a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart
+++ b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart
@@ -5,18 +5,47 @@
import 'value_class_support_lib.dart';
class Animal {
- final int numberOfLegs;
+ final int? numberOfLegs;
Animal({required this.numberOfLegs});
}
@valueClass
class Cat extends Animal {
- final int numberOfWhiskers;
+ final int? numberOfWhiskers;
}
+class Foo {
+ int? bar, bar2;
+ Foo({this.bar, this.bar2});
+ Foo copyWith({int bar, int bar2}) {
+ return Foo(bar, bar2);
+ }
+}
+
+@valueClass
+class A {}
+
main() {
Cat cat = new Cat(numberOfWhiskers: 20, numberOfLegs: 4);
- (cat as dynamic).copyWith(numberOfWhiskers: 4);
+ // positive case
+ Cat cat2 = (cat as dynamic).copyWith(numberOfWhiskers: 4) as Cat;
+ // nested case
+ Cat cat3 = ((((cat as dynamic).copyWith(numberOfWhiskers: 4) as Cat) as dynamic).copyWith(numberOfLegs: 3) as Cat);
+ // wrong right hand side
+ Cat cat4 = (cat as Object).copyWith(numberOfWhiskers: 4);
+ // empty arguments
+ Cat cat5 = (cat as dynamic).copyWith() as Cat;
+ // Some existing fields, extra arguments.
+ Cat cat6 = (cat as dynamic).copyWith(numberOfWhiskers: 4, numberOfHorns: 5) as Cat;
+
+ A a;
+ // No fields, extra arguments.
+ A a2 = (a as dynamic).copyWith(x: 42, y: 42) as A;
+
+
+ Foo foo = Foo(bar: 4, bar2: 5);
+ // wrong left hand side
+ Foo foo2 = (foo as dynamic).copyWith(bar: 4) as Foo;
}
diff --git a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.outline.expect b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.outline.expect
index 97e851f..93422d0 100644
--- a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.outline.expect
@@ -1,4 +1,15 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:20:21: Error: Optional parameter 'bar' should have a default value because its type 'int' doesn't allow null.
+// Foo copyWith({int bar, int bar2}) {
+// ^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:20:30: Error: Optional parameter 'bar2' should have a default value because its type 'int' doesn't allow null.
+// Foo copyWith({int bar, int bar2}) {
+// ^^^^
+//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
@@ -6,16 +17,29 @@
import "org-dartlang-testcase:///value_class_support_lib.dart";
class Animal extends core::Object {
- final field core::int numberOfLegs;
- constructor •({required core::int numberOfLegs}) → self::Animal
+ final field core::int? numberOfLegs;
+ constructor •({required core::int? numberOfLegs}) → self::Animal
;
}
@val::valueClass
class Cat extends self::Animal {
- final field core::int numberOfWhiskers;
+ final field core::int? numberOfWhiskers;
synthetic constructor •() → self::Cat
;
}
+class Foo extends core::Object {
+ field core::int? bar;
+ field core::int? bar2;
+ constructor •({core::int? bar, core::int? bar2}) → self::Foo
+ ;
+ method copyWith({core::int bar, core::int bar2}) → self::Foo
+ ;
+}
+@val::valueClass
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ ;
+}
static method main() → dynamic
;
@@ -36,4 +60,5 @@
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///copy_with_call_sites.dart:12:2 -> StringConstant("valueClass")
-Extra constant evaluation: tries: 1, successes: 1
+Evaluated: StaticGet @ org-dartlang-testcase:///copy_with_call_sites.dart:25:2 -> StringConstant("valueClass")
+Extra constant evaluation: evaluated: 2, effectively constant: 2
diff --git a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.expect b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.expect
index dd3b9ec..e404600 100644
--- a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.expect
@@ -2,17 +2,43 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:18:20: Error: No named parameter with the name 'numberOfWhiskers'.
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:20:21: Error: Optional parameter 'bar' should have a default value because its type 'int' doesn't allow null.
+// Foo copyWith({int bar, int bar2}) {
+// ^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:20:30: Error: Optional parameter 'bar2' should have a default value because its type 'int' doesn't allow null.
+// Foo copyWith({int bar, int bar2}) {
+// ^^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:21:15: Error: Too many positional arguments: 0 allowed, but 2 found.
+// Try removing the extra positional arguments.
+// return Foo(bar, bar2);
+// ^
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:19:3: Context: Found this candidate, but the arguments don't match.
+// Foo({this.bar, this.bar2});
+// ^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:29:20: Error: No named parameter with the name 'numberOfWhiskers'.
// Cat cat = new Cat(numberOfWhiskers: 20, numberOfLegs: 4);
// ^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
// class Cat extends Animal {
// ^
//
-// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:14:13: Error: Final field 'numberOfWhiskers' is not initialized.
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:35:29: Error: The method 'copyWith' isn't defined for the class 'Object'.
+// - 'Object' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named 'copyWith'.
+// Cat cat4 = (cat as Object).copyWith(numberOfWhiskers: 4);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:43:10: Error: Non-nullable variable 'a' must be assigned before it can be used.
+// A a2 = (a as dynamic).copyWith(x: 42, y: 42) as A;
+// ^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:14:14: Error: Final field 'numberOfWhiskers' is not initialized.
// Try to initialize the field in the declaration or in every constructor.
-// final int numberOfWhiskers;
-// ^^^^^^^^^^^^^^^^
+// final int? numberOfWhiskers;
+// ^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
@@ -21,28 +47,70 @@
import "org-dartlang-testcase:///value_class_support_lib.dart";
class Animal extends core::Object {
- final field core::int numberOfLegs;
- constructor •({required core::int numberOfLegs = #C1}) → self::Animal
+ final field core::int? numberOfLegs;
+ constructor •({required core::int? numberOfLegs = #C1}) → self::Animal
: self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
;
}
class Cat extends self::Animal {
- final field core::int numberOfWhiskers = null;
- synthetic constructor •({required core::int numberOfWhiskers, core::int numberOfLegs}) → self::Cat
+ final field core::int? numberOfWhiskers = null;
+ synthetic constructor •({required core::int? numberOfWhiskers, core::int? numberOfLegs}) → self::Cat
: self::Cat::numberOfWhiskers = numberOfWhiskers, super self::Animal::•(numberOfLegs)
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///copy_with_call_sites.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
- method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
+ method /*isNullableByDefault*/ copyWith({core::int? numberOfLegs, core::int? numberOfWhiskers}) → dynamic
return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
}
+class Foo extends core::Object {
+ field core::int? bar;
+ field core::int? bar2;
+ constructor •({core::int? bar = #C1, core::int? bar2 = #C1}) → self::Foo
+ : self::Foo::bar = bar, self::Foo::bar2 = bar2, super core::Object::•()
+ ;
+ method copyWith({core::int bar = #C1, core::int bar2 = #C1}) → self::Foo {
+ return invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:21:15: Error: Too many positional arguments: 0 allowed, but 2 found.
+Try removing the extra positional arguments.
+ return Foo(bar, bar2);
+ ^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Foo;
+ }
+}
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ : super core::Object::•()
+ ;
+ operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
+ return other is self::A;
+ get /*isNullableByDefault*/ hashCode() → core::int
+ return val::JenkinsSmiHash::finish("org-dartlang-testcase:///copy_with_call_sites.dartA".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "A()";
+ method /*isNullableByDefault*/ copyWith() → dynamic
+ return new self::A::•();
+}
static method main() → dynamic {
- self::Cat cat = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:18:20: Error: No named parameter with the name 'numberOfWhiskers'.
+ self::Cat cat = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:29:20: Error: No named parameter with the name 'numberOfWhiskers'.
Cat cat = new Cat(numberOfWhiskers: 20, numberOfLegs: 4);
^^^^^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
- let final dynamic #t1 = cat as{ForNonNullableByDefault} dynamic in #t1.copyWith(numberOfWhiskers: 4, numberOfLegs: #t1.numberOfLegs);
+ self::Cat cat2 = (let final dynamic #t1 = cat as{ForNonNullableByDefault} dynamic in #t1.copyWith(numberOfWhiskers: 4, numberOfLegs: #t1.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+ self::Cat cat3 = (let final dynamic #t2 = ((cat as{ForNonNullableByDefault} dynamic).copyWith(numberOfWhiskers: 4) as{ForNonNullableByDefault} self::Cat) as{ForNonNullableByDefault} dynamic in #t2.copyWith(numberOfWhiskers: #t2.numberOfWhiskers, numberOfLegs: 3)) as{ForNonNullableByDefault} self::Cat;
+ self::Cat cat4 = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:35:29: Error: The method 'copyWith' isn't defined for the class 'Object'.
+ - 'Object' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named 'copyWith'.
+ Cat cat4 = (cat as Object).copyWith(numberOfWhiskers: 4);
+ ^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
+ self::Cat cat5 = (let final dynamic #t3 = cat as{ForNonNullableByDefault} dynamic in #t3.copyWith(numberOfWhiskers: #t3.numberOfWhiskers, numberOfLegs: #t3.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+ self::Cat cat6 = (let final dynamic #t4 = cat as{ForNonNullableByDefault} dynamic in #t4.copyWith(numberOfWhiskers: 4, numberOfLegs: #t4.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+ self::A a;
+ self::A a2 = (let final dynamic #t5 = (let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:43:10: Error: Non-nullable variable 'a' must be assigned before it can be used.
+ A a2 = (a as dynamic).copyWith(x: 42, y: 42) as A;
+ ^" in a) as{ForNonNullableByDefault} dynamic in #t5.copyWith()) as{ForNonNullableByDefault} self::A;
+ self::Foo foo = new self::Foo::•(bar: 4, bar2: 5);
+ self::Foo foo2 = (foo as{ForNonNullableByDefault} dynamic).copyWith(bar: 4) as{ForNonNullableByDefault} self::Foo;
}
library /*isNonNullableByDefault*/;
diff --git a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.transformed.expect
index f361669..90ed8ba 100644
--- a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.transformed.expect
@@ -2,17 +2,43 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:18:20: Error: No named parameter with the name 'numberOfWhiskers'.
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:20:21: Error: Optional parameter 'bar' should have a default value because its type 'int' doesn't allow null.
+// Foo copyWith({int bar, int bar2}) {
+// ^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:20:30: Error: Optional parameter 'bar2' should have a default value because its type 'int' doesn't allow null.
+// Foo copyWith({int bar, int bar2}) {
+// ^^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:21:15: Error: Too many positional arguments: 0 allowed, but 2 found.
+// Try removing the extra positional arguments.
+// return Foo(bar, bar2);
+// ^
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:19:3: Context: Found this candidate, but the arguments don't match.
+// Foo({this.bar, this.bar2});
+// ^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:29:20: Error: No named parameter with the name 'numberOfWhiskers'.
// Cat cat = new Cat(numberOfWhiskers: 20, numberOfLegs: 4);
// ^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
// class Cat extends Animal {
// ^
//
-// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:14:13: Error: Final field 'numberOfWhiskers' is not initialized.
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:35:29: Error: The method 'copyWith' isn't defined for the class 'Object'.
+// - 'Object' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named 'copyWith'.
+// Cat cat4 = (cat as Object).copyWith(numberOfWhiskers: 4);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:43:10: Error: Non-nullable variable 'a' must be assigned before it can be used.
+// A a2 = (a as dynamic).copyWith(x: 42, y: 42) as A;
+// ^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:14:14: Error: Final field 'numberOfWhiskers' is not initialized.
// Try to initialize the field in the declaration or in every constructor.
-// final int numberOfWhiskers;
-// ^^^^^^^^^^^^^^^^
+// final int? numberOfWhiskers;
+// ^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
@@ -21,28 +47,70 @@
import "org-dartlang-testcase:///value_class_support_lib.dart";
class Animal extends core::Object {
- final field core::int numberOfLegs;
- constructor •({required core::int numberOfLegs = #C1}) → self::Animal
+ final field core::int? numberOfLegs;
+ constructor •({required core::int? numberOfLegs = #C1}) → self::Animal
: self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
;
}
class Cat extends self::Animal {
- final field core::int numberOfWhiskers = null;
- synthetic constructor •({required core::int numberOfWhiskers, core::int numberOfLegs}) → self::Cat
+ final field core::int? numberOfWhiskers = null;
+ synthetic constructor •({required core::int? numberOfWhiskers, core::int? numberOfLegs}) → self::Cat
: self::Cat::numberOfWhiskers = numberOfWhiskers, super self::Animal::•(numberOfLegs)
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///copy_with_call_sites.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
- method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
+ method /*isNullableByDefault*/ copyWith({core::int? numberOfLegs, core::int? numberOfWhiskers}) → dynamic
return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
}
+class Foo extends core::Object {
+ field core::int? bar;
+ field core::int? bar2;
+ constructor •({core::int? bar = #C1, core::int? bar2 = #C1}) → self::Foo
+ : self::Foo::bar = bar, self::Foo::bar2 = bar2, super core::Object::•()
+ ;
+ method copyWith({core::int bar = #C1, core::int bar2 = #C1}) → self::Foo {
+ return invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:21:15: Error: Too many positional arguments: 0 allowed, but 2 found.
+Try removing the extra positional arguments.
+ return Foo(bar, bar2);
+ ^";
+ }
+}
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ : super core::Object::•()
+ ;
+ operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
+ return other is self::A;
+ get /*isNullableByDefault*/ hashCode() → core::int
+ return val::JenkinsSmiHash::finish("org-dartlang-testcase:///copy_with_call_sites.dartA".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "A()";
+ method /*isNullableByDefault*/ copyWith() → dynamic
+ return new self::A::•();
+}
static method main() → dynamic {
- self::Cat cat = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:18:20: Error: No named parameter with the name 'numberOfWhiskers'.
+ self::Cat cat = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:29:20: Error: No named parameter with the name 'numberOfWhiskers'.
Cat cat = new Cat(numberOfWhiskers: 20, numberOfLegs: 4);
^^^^^^^^^^^^^^^^";
- let final dynamic #t1 = cat as{ForNonNullableByDefault} dynamic in #t1.copyWith(numberOfWhiskers: 4, numberOfLegs: #t1.numberOfLegs);
+ self::Cat cat2 = (let final dynamic #t1 = cat as{ForNonNullableByDefault} dynamic in #t1.copyWith(numberOfWhiskers: 4, numberOfLegs: #t1.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+ self::Cat cat3 = (let final dynamic #t2 = ((cat as{ForNonNullableByDefault} dynamic).copyWith(numberOfWhiskers: 4) as{ForNonNullableByDefault} self::Cat) as{ForNonNullableByDefault} dynamic in #t2.copyWith(numberOfWhiskers: #t2.numberOfWhiskers, numberOfLegs: 3)) as{ForNonNullableByDefault} self::Cat;
+ self::Cat cat4 = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:35:29: Error: The method 'copyWith' isn't defined for the class 'Object'.
+ - 'Object' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named 'copyWith'.
+ Cat cat4 = (cat as Object).copyWith(numberOfWhiskers: 4);
+ ^^^^^^^^";
+ self::Cat cat5 = (let final dynamic #t3 = cat as{ForNonNullableByDefault} dynamic in #t3.copyWith(numberOfWhiskers: #t3.numberOfWhiskers, numberOfLegs: #t3.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+ self::Cat cat6 = (let final dynamic #t4 = cat as{ForNonNullableByDefault} dynamic in #t4.copyWith(numberOfWhiskers: 4, numberOfLegs: #t4.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+ self::A a;
+ self::A a2 = (let final dynamic #t5 = (let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:43:10: Error: Non-nullable variable 'a' must be assigned before it can be used.
+ A a2 = (a as dynamic).copyWith(x: 42, y: 42) as A;
+ ^" in a) as{ForNonNullableByDefault} dynamic in #t5.copyWith()) as{ForNonNullableByDefault} self::A;
+ self::Foo foo = new self::Foo::•(bar: 4, bar2: 5);
+ self::Foo foo2 = (foo as{ForNonNullableByDefault} dynamic).copyWith(bar: 4) as{ForNonNullableByDefault} self::Foo;
}
library /*isNonNullableByDefault*/;
@@ -70,3 +138,7 @@
#C1 = null
#C2 = "valueClass"
}
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///copy_with_call_sites.dart:26:7 -> StringConstant("A()")
+Extra constant evaluation: evaluated: 128, effectively constant: 1
diff --git a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.textual_outline.expect b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.textual_outline.expect
index 93a182d..55829f7 100644
--- a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.textual_outline.expect
@@ -1,13 +1,22 @@
import 'value_class_support_lib.dart';
class Animal {
- final int numberOfLegs;
+ final int? numberOfLegs;
Animal({required this.numberOfLegs});
}
@valueClass
class Cat extends Animal {
- final int numberOfWhiskers;
+ final int? numberOfWhiskers;
}
+class Foo {
+ int? bar, bar2;
+ Foo({this.bar, this.bar2});
+ Foo copyWith({int bar, int bar2}) {}
+}
+
+@valueClass
+class A {}
+
main() {}
diff --git a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.textual_outline_modelled.expect
index ce2b2e3..77c0c3c 100644
--- a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.textual_outline_modelled.expect
@@ -1,13 +1,22 @@
import 'value_class_support_lib.dart';
+@valueClass
+class A {}
+
class Animal {
Animal({required this.numberOfLegs});
- final int numberOfLegs;
+ final int? numberOfLegs;
}
@valueClass
class Cat extends Animal {
- final int numberOfWhiskers;
+ final int? numberOfWhiskers;
+}
+
+class Foo {
+ Foo({this.bar, this.bar2});
+ Foo copyWith({int bar, int bar2}) {}
+ int? bar, bar2;
}
main() {}
diff --git a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.expect b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.expect
index dd3b9ec..e404600 100644
--- a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.expect
@@ -2,17 +2,43 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:18:20: Error: No named parameter with the name 'numberOfWhiskers'.
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:20:21: Error: Optional parameter 'bar' should have a default value because its type 'int' doesn't allow null.
+// Foo copyWith({int bar, int bar2}) {
+// ^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:20:30: Error: Optional parameter 'bar2' should have a default value because its type 'int' doesn't allow null.
+// Foo copyWith({int bar, int bar2}) {
+// ^^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:21:15: Error: Too many positional arguments: 0 allowed, but 2 found.
+// Try removing the extra positional arguments.
+// return Foo(bar, bar2);
+// ^
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:19:3: Context: Found this candidate, but the arguments don't match.
+// Foo({this.bar, this.bar2});
+// ^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:29:20: Error: No named parameter with the name 'numberOfWhiskers'.
// Cat cat = new Cat(numberOfWhiskers: 20, numberOfLegs: 4);
// ^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
// class Cat extends Animal {
// ^
//
-// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:14:13: Error: Final field 'numberOfWhiskers' is not initialized.
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:35:29: Error: The method 'copyWith' isn't defined for the class 'Object'.
+// - 'Object' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named 'copyWith'.
+// Cat cat4 = (cat as Object).copyWith(numberOfWhiskers: 4);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:43:10: Error: Non-nullable variable 'a' must be assigned before it can be used.
+// A a2 = (a as dynamic).copyWith(x: 42, y: 42) as A;
+// ^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:14:14: Error: Final field 'numberOfWhiskers' is not initialized.
// Try to initialize the field in the declaration or in every constructor.
-// final int numberOfWhiskers;
-// ^^^^^^^^^^^^^^^^
+// final int? numberOfWhiskers;
+// ^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
@@ -21,28 +47,70 @@
import "org-dartlang-testcase:///value_class_support_lib.dart";
class Animal extends core::Object {
- final field core::int numberOfLegs;
- constructor •({required core::int numberOfLegs = #C1}) → self::Animal
+ final field core::int? numberOfLegs;
+ constructor •({required core::int? numberOfLegs = #C1}) → self::Animal
: self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
;
}
class Cat extends self::Animal {
- final field core::int numberOfWhiskers = null;
- synthetic constructor •({required core::int numberOfWhiskers, core::int numberOfLegs}) → self::Cat
+ final field core::int? numberOfWhiskers = null;
+ synthetic constructor •({required core::int? numberOfWhiskers, core::int? numberOfLegs}) → self::Cat
: self::Cat::numberOfWhiskers = numberOfWhiskers, super self::Animal::•(numberOfLegs)
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///copy_with_call_sites.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
- method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
+ method /*isNullableByDefault*/ copyWith({core::int? numberOfLegs, core::int? numberOfWhiskers}) → dynamic
return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
}
+class Foo extends core::Object {
+ field core::int? bar;
+ field core::int? bar2;
+ constructor •({core::int? bar = #C1, core::int? bar2 = #C1}) → self::Foo
+ : self::Foo::bar = bar, self::Foo::bar2 = bar2, super core::Object::•()
+ ;
+ method copyWith({core::int bar = #C1, core::int bar2 = #C1}) → self::Foo {
+ return invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:21:15: Error: Too many positional arguments: 0 allowed, but 2 found.
+Try removing the extra positional arguments.
+ return Foo(bar, bar2);
+ ^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Foo;
+ }
+}
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ : super core::Object::•()
+ ;
+ operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
+ return other is self::A;
+ get /*isNullableByDefault*/ hashCode() → core::int
+ return val::JenkinsSmiHash::finish("org-dartlang-testcase:///copy_with_call_sites.dartA".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "A()";
+ method /*isNullableByDefault*/ copyWith() → dynamic
+ return new self::A::•();
+}
static method main() → dynamic {
- self::Cat cat = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:18:20: Error: No named parameter with the name 'numberOfWhiskers'.
+ self::Cat cat = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:29:20: Error: No named parameter with the name 'numberOfWhiskers'.
Cat cat = new Cat(numberOfWhiskers: 20, numberOfLegs: 4);
^^^^^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
- let final dynamic #t1 = cat as{ForNonNullableByDefault} dynamic in #t1.copyWith(numberOfWhiskers: 4, numberOfLegs: #t1.numberOfLegs);
+ self::Cat cat2 = (let final dynamic #t1 = cat as{ForNonNullableByDefault} dynamic in #t1.copyWith(numberOfWhiskers: 4, numberOfLegs: #t1.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+ self::Cat cat3 = (let final dynamic #t2 = ((cat as{ForNonNullableByDefault} dynamic).copyWith(numberOfWhiskers: 4) as{ForNonNullableByDefault} self::Cat) as{ForNonNullableByDefault} dynamic in #t2.copyWith(numberOfWhiskers: #t2.numberOfWhiskers, numberOfLegs: 3)) as{ForNonNullableByDefault} self::Cat;
+ self::Cat cat4 = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:35:29: Error: The method 'copyWith' isn't defined for the class 'Object'.
+ - 'Object' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named 'copyWith'.
+ Cat cat4 = (cat as Object).copyWith(numberOfWhiskers: 4);
+ ^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
+ self::Cat cat5 = (let final dynamic #t3 = cat as{ForNonNullableByDefault} dynamic in #t3.copyWith(numberOfWhiskers: #t3.numberOfWhiskers, numberOfLegs: #t3.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+ self::Cat cat6 = (let final dynamic #t4 = cat as{ForNonNullableByDefault} dynamic in #t4.copyWith(numberOfWhiskers: 4, numberOfLegs: #t4.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+ self::A a;
+ self::A a2 = (let final dynamic #t5 = (let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:43:10: Error: Non-nullable variable 'a' must be assigned before it can be used.
+ A a2 = (a as dynamic).copyWith(x: 42, y: 42) as A;
+ ^" in a) as{ForNonNullableByDefault} dynamic in #t5.copyWith()) as{ForNonNullableByDefault} self::A;
+ self::Foo foo = new self::Foo::•(bar: 4, bar2: 5);
+ self::Foo foo2 = (foo as{ForNonNullableByDefault} dynamic).copyWith(bar: 4) as{ForNonNullableByDefault} self::Foo;
}
library /*isNonNullableByDefault*/;
diff --git a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.transformed.expect
index f361669..90ed8ba 100644
--- a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.transformed.expect
@@ -2,17 +2,43 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:18:20: Error: No named parameter with the name 'numberOfWhiskers'.
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:20:21: Error: Optional parameter 'bar' should have a default value because its type 'int' doesn't allow null.
+// Foo copyWith({int bar, int bar2}) {
+// ^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:20:30: Error: Optional parameter 'bar2' should have a default value because its type 'int' doesn't allow null.
+// Foo copyWith({int bar, int bar2}) {
+// ^^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:21:15: Error: Too many positional arguments: 0 allowed, but 2 found.
+// Try removing the extra positional arguments.
+// return Foo(bar, bar2);
+// ^
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:19:3: Context: Found this candidate, but the arguments don't match.
+// Foo({this.bar, this.bar2});
+// ^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:29:20: Error: No named parameter with the name 'numberOfWhiskers'.
// Cat cat = new Cat(numberOfWhiskers: 20, numberOfLegs: 4);
// ^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
// class Cat extends Animal {
// ^
//
-// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:14:13: Error: Final field 'numberOfWhiskers' is not initialized.
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:35:29: Error: The method 'copyWith' isn't defined for the class 'Object'.
+// - 'Object' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named 'copyWith'.
+// Cat cat4 = (cat as Object).copyWith(numberOfWhiskers: 4);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:43:10: Error: Non-nullable variable 'a' must be assigned before it can be used.
+// A a2 = (a as dynamic).copyWith(x: 42, y: 42) as A;
+// ^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:14:14: Error: Final field 'numberOfWhiskers' is not initialized.
// Try to initialize the field in the declaration or in every constructor.
-// final int numberOfWhiskers;
-// ^^^^^^^^^^^^^^^^
+// final int? numberOfWhiskers;
+// ^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
@@ -21,28 +47,70 @@
import "org-dartlang-testcase:///value_class_support_lib.dart";
class Animal extends core::Object {
- final field core::int numberOfLegs;
- constructor •({required core::int numberOfLegs = #C1}) → self::Animal
+ final field core::int? numberOfLegs;
+ constructor •({required core::int? numberOfLegs = #C1}) → self::Animal
: self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
;
}
class Cat extends self::Animal {
- final field core::int numberOfWhiskers = null;
- synthetic constructor •({required core::int numberOfWhiskers, core::int numberOfLegs}) → self::Cat
+ final field core::int? numberOfWhiskers = null;
+ synthetic constructor •({required core::int? numberOfWhiskers, core::int? numberOfLegs}) → self::Cat
: self::Cat::numberOfWhiskers = numberOfWhiskers, super self::Animal::•(numberOfLegs)
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///copy_with_call_sites.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
- method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
+ method /*isNullableByDefault*/ copyWith({core::int? numberOfLegs, core::int? numberOfWhiskers}) → dynamic
return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
}
+class Foo extends core::Object {
+ field core::int? bar;
+ field core::int? bar2;
+ constructor •({core::int? bar = #C1, core::int? bar2 = #C1}) → self::Foo
+ : self::Foo::bar = bar, self::Foo::bar2 = bar2, super core::Object::•()
+ ;
+ method copyWith({core::int bar = #C1, core::int bar2 = #C1}) → self::Foo {
+ return invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:21:15: Error: Too many positional arguments: 0 allowed, but 2 found.
+Try removing the extra positional arguments.
+ return Foo(bar, bar2);
+ ^";
+ }
+}
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ : super core::Object::•()
+ ;
+ operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
+ return other is self::A;
+ get /*isNullableByDefault*/ hashCode() → core::int
+ return val::JenkinsSmiHash::finish("org-dartlang-testcase:///copy_with_call_sites.dartA".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "A()";
+ method /*isNullableByDefault*/ copyWith() → dynamic
+ return new self::A::•();
+}
static method main() → dynamic {
- self::Cat cat = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:18:20: Error: No named parameter with the name 'numberOfWhiskers'.
+ self::Cat cat = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:29:20: Error: No named parameter with the name 'numberOfWhiskers'.
Cat cat = new Cat(numberOfWhiskers: 20, numberOfLegs: 4);
^^^^^^^^^^^^^^^^";
- let final dynamic #t1 = cat as{ForNonNullableByDefault} dynamic in #t1.copyWith(numberOfWhiskers: 4, numberOfLegs: #t1.numberOfLegs);
+ self::Cat cat2 = (let final dynamic #t1 = cat as{ForNonNullableByDefault} dynamic in #t1.copyWith(numberOfWhiskers: 4, numberOfLegs: #t1.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+ self::Cat cat3 = (let final dynamic #t2 = ((cat as{ForNonNullableByDefault} dynamic).copyWith(numberOfWhiskers: 4) as{ForNonNullableByDefault} self::Cat) as{ForNonNullableByDefault} dynamic in #t2.copyWith(numberOfWhiskers: #t2.numberOfWhiskers, numberOfLegs: 3)) as{ForNonNullableByDefault} self::Cat;
+ self::Cat cat4 = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:35:29: Error: The method 'copyWith' isn't defined for the class 'Object'.
+ - 'Object' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named 'copyWith'.
+ Cat cat4 = (cat as Object).copyWith(numberOfWhiskers: 4);
+ ^^^^^^^^";
+ self::Cat cat5 = (let final dynamic #t3 = cat as{ForNonNullableByDefault} dynamic in #t3.copyWith(numberOfWhiskers: #t3.numberOfWhiskers, numberOfLegs: #t3.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+ self::Cat cat6 = (let final dynamic #t4 = cat as{ForNonNullableByDefault} dynamic in #t4.copyWith(numberOfWhiskers: 4, numberOfLegs: #t4.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+ self::A a;
+ self::A a2 = (let final dynamic #t5 = (let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:43:10: Error: Non-nullable variable 'a' must be assigned before it can be used.
+ A a2 = (a as dynamic).copyWith(x: 42, y: 42) as A;
+ ^" in a) as{ForNonNullableByDefault} dynamic in #t5.copyWith()) as{ForNonNullableByDefault} self::A;
+ self::Foo foo = new self::Foo::•(bar: 4, bar2: 5);
+ self::Foo foo2 = (foo as{ForNonNullableByDefault} dynamic).copyWith(bar: 4) as{ForNonNullableByDefault} self::Foo;
}
library /*isNonNullableByDefault*/;
@@ -70,3 +138,7 @@
#C1 = null
#C2 = "valueClass"
}
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///copy_with_call_sites.dart:26:7 -> StringConstant("A()")
+Extra constant evaluation: evaluated: 128, effectively constant: 1
diff --git a/pkg/front_end/testcases/value_class/empty.dart.outline.expect b/pkg/front_end/testcases/value_class/empty.dart.outline.expect
index 7f28314..2f8fd42 100644
--- a/pkg/front_end/testcases/value_class/empty.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/empty.dart.outline.expect
@@ -30,4 +30,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///empty.dart:7:2 -> StringConstant("valueClass")
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/value_class/empty.dart.strong.expect b/pkg/front_end/testcases/value_class/empty.dart.strong.expect
index e659acf..ea8f20e 100644
--- a/pkg/front_end/testcases/value_class/empty.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/empty.dart.strong.expect
@@ -13,6 +13,8 @@
return other is self::EmptyClass;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///empty.dartEmptyClass".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "EmptyClass()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::EmptyClass::•();
}
diff --git a/pkg/front_end/testcases/value_class/empty.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/empty.dart.strong.transformed.expect
index e659acf..0ce153d 100644
--- a/pkg/front_end/testcases/value_class/empty.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/empty.dart.strong.transformed.expect
@@ -13,6 +13,8 @@
return other is self::EmptyClass;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///empty.dartEmptyClass".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "EmptyClass()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::EmptyClass::•();
}
@@ -42,3 +44,7 @@
constants {
#C1 = "valueClass"
}
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///empty.dart:8:7 -> StringConstant("EmptyClass()")
+Extra constant evaluation: evaluated: 40, effectively constant: 1
diff --git a/pkg/front_end/testcases/value_class/empty.dart.weak.expect b/pkg/front_end/testcases/value_class/empty.dart.weak.expect
index e659acf..ea8f20e 100644
--- a/pkg/front_end/testcases/value_class/empty.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/empty.dart.weak.expect
@@ -13,6 +13,8 @@
return other is self::EmptyClass;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///empty.dartEmptyClass".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "EmptyClass()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::EmptyClass::•();
}
diff --git a/pkg/front_end/testcases/value_class/empty.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/empty.dart.weak.transformed.expect
index e659acf..0ce153d 100644
--- a/pkg/front_end/testcases/value_class/empty.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/empty.dart.weak.transformed.expect
@@ -13,6 +13,8 @@
return other is self::EmptyClass;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///empty.dartEmptyClass".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "EmptyClass()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::EmptyClass::•();
}
@@ -42,3 +44,7 @@
constants {
#C1 = "valueClass"
}
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///empty.dart:8:7 -> StringConstant("EmptyClass()")
+Extra constant evaluation: evaluated: 40, effectively constant: 1
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
index 492c803..da7ab09 100644
--- a/pkg/front_end/testcases/value_class/explicit_mixin.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart.outline.expect
@@ -55,4 +55,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///explicit_mixin.dart:7:2 -> StringConstant("valueClass")
Evaluated: StaticGet @ org-dartlang-testcase:///explicit_mixin.dart:17:2 -> StringConstant("valueClass")
-Extra constant evaluation: tries: 2, successes: 2
+Extra constant evaluation: evaluated: 2, effectively constant: 2
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
index 6852df4..8f5b282 100644
--- a/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.expect
@@ -13,6 +13,8 @@
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "A()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::A::•();
}
@@ -44,6 +46,8 @@
return other is self::F;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartF".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "F()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::F::•();
}
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
index 27d97db..f6df7f8 100644
--- 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
@@ -13,6 +13,8 @@
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "A()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::A::•();
}
@@ -39,6 +41,8 @@
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "A()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::A::•();
}
@@ -50,6 +54,8 @@
return other is self::F;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartF".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "F()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::F::•();
}
@@ -79,3 +85,9 @@
constants {
#C1 = "valueClass"
}
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///explicit_mixin.dart:8:7 -> StringConstant("A()")
+Evaluated: StringConcatenation @ org-dartlang-testcase:///explicit_mixin.dart:8:7 -> StringConstant("A()")
+Evaluated: StringConcatenation @ org-dartlang-testcase:///explicit_mixin.dart:18:7 -> StringConstant("F()")
+Extra constant evaluation: evaluated: 52, effectively constant: 3
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
index 6852df4..8f5b282 100644
--- a/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.expect
@@ -13,6 +13,8 @@
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "A()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::A::•();
}
@@ -44,6 +46,8 @@
return other is self::F;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartF".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "F()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::F::•();
}
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
index 27d97db..f6df7f8 100644
--- 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
@@ -13,6 +13,8 @@
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "A()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::A::•();
}
@@ -39,6 +41,8 @@
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "A()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::A::•();
}
@@ -50,6 +54,8 @@
return other is self::F;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartF".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "F()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::F::•();
}
@@ -79,3 +85,9 @@
constants {
#C1 = "valueClass"
}
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///explicit_mixin.dart:8:7 -> StringConstant("A()")
+Evaluated: StringConcatenation @ org-dartlang-testcase:///explicit_mixin.dart:8:7 -> StringConstant("A()")
+Evaluated: StringConcatenation @ org-dartlang-testcase:///explicit_mixin.dart:18:7 -> StringConstant("F()")
+Extra constant evaluation: evaluated: 52, effectively constant: 3
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart.outline.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.outline.expect
index 844ecde..941c5938 100644
--- a/pkg/front_end/testcases/value_class/non_final_field_error.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart.outline.expect
@@ -31,4 +31,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///non_final_field_error.dart:7:2 -> StringConstant("valueClass")
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
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
index ae9077e..106c4ea 100644
--- 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
@@ -21,6 +21,8 @@
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_final_field_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
return new self::Animal::•(numberOfLegs: numberOfLegs);
}
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
index ae9077e..106c4ea 100644
--- 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
@@ -21,6 +21,8 @@
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_final_field_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
return new self::Animal::•(numberOfLegs: numberOfLegs);
}
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
index ae9077e..106c4ea 100644
--- 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
@@ -21,6 +21,8 @@
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_final_field_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
return new self::Animal::•(numberOfLegs: numberOfLegs);
}
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
index ae9077e..106c4ea 100644
--- 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
@@ -21,6 +21,8 @@
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_final_field_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
return new self::Animal::•(numberOfLegs: numberOfLegs);
}
diff --git a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.outline.expect b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.outline.expect
index 83976fb..3c037ce 100644
--- a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.outline.expect
@@ -35,4 +35,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///non_value_extends_value_error.dart:7:2 -> StringConstant("valueClass")
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
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
index 805f287..8b97d06 100644
--- 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
@@ -22,6 +22,8 @@
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_extends_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
return new self::Animal::•(numberOfLegs: numberOfLegs);
}
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
index 805f287..8b97d06 100644
--- 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
@@ -22,6 +22,8 @@
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_extends_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
return new self::Animal::•(numberOfLegs: numberOfLegs);
}
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
index 805f287..8b97d06 100644
--- 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
@@ -22,6 +22,8 @@
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_extends_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
return new self::Animal::•(numberOfLegs: numberOfLegs);
}
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
index 805f287..8b97d06 100644
--- 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
@@ -22,6 +22,8 @@
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_extends_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
return new self::Animal::•(numberOfLegs: numberOfLegs);
}
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.outline.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.outline.expect
index e21ab6e..a164ad8 100644
--- a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.outline.expect
@@ -36,4 +36,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///non_value_implements_value_error.dart:7:2 -> StringConstant("valueClass")
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
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
index 95373ed..c12b1c3 100644
--- 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
@@ -27,6 +27,8 @@
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_implements_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
return new self::Animal::•(numberOfLegs: numberOfLegs);
}
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
index 95373ed..c12b1c3 100644
--- 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
@@ -27,6 +27,8 @@
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_implements_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
return new self::Animal::•(numberOfLegs: numberOfLegs);
}
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
index 95373ed..c12b1c3 100644
--- 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
@@ -27,6 +27,8 @@
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_implements_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
return new self::Animal::•(numberOfLegs: numberOfLegs);
}
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
index 95373ed..c12b1c3 100644
--- 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
@@ -27,6 +27,8 @@
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_implements_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
return new self::Animal::•(numberOfLegs: numberOfLegs);
}
diff --git a/pkg/front_end/testcases/value_class/simple.dart.outline.expect b/pkg/front_end/testcases/value_class/simple.dart.outline.expect
index 133d2e8..fd0c916 100644
--- a/pkg/front_end/testcases/value_class/simple.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/simple.dart.outline.expect
@@ -33,4 +33,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///simple.dart:7:2 -> StringConstant("valueClass")
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/value_class/simple.dart.strong.expect b/pkg/front_end/testcases/value_class/simple.dart.strong.expect
index 862862f..67bbec1 100644
--- a/pkg/front_end/testcases/value_class/simple.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/simple.dart.strong.expect
@@ -43,6 +43,8 @@
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///simple.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
return new self::Animal::•(numberOfLegs: numberOfLegs);
}
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
index 3213a78..88adc14 100644
--- a/pkg/front_end/testcases/value_class/simple.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/simple.dart.strong.transformed.expect
@@ -43,6 +43,8 @@
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///simple.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
return new self::Animal::•(numberOfLegs: numberOfLegs);
}
diff --git a/pkg/front_end/testcases/value_class/simple.dart.weak.expect b/pkg/front_end/testcases/value_class/simple.dart.weak.expect
index 862862f..67bbec1 100644
--- a/pkg/front_end/testcases/value_class/simple.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/simple.dart.weak.expect
@@ -43,6 +43,8 @@
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///simple.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
return new self::Animal::•(numberOfLegs: numberOfLegs);
}
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
index 3213a78..88adc14 100644
--- a/pkg/front_end/testcases/value_class/simple.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/simple.dart.weak.transformed.expect
@@ -43,6 +43,8 @@
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///simple.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
return new self::Animal::•(numberOfLegs: numberOfLegs);
}
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.outline.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.outline.expect
index b9fa359..6b5a117 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.outline.expect
@@ -38,4 +38,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///value_extends_non_value.dart:12:2 -> StringConstant("valueClass")
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
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
index d02e298..8ab2483 100644
--- 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
@@ -49,6 +49,8 @@
return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_extends_non_value.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
}
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
index 6ed1828..2227f34 100644
--- 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
@@ -49,6 +49,8 @@
return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_extends_non_value.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
}
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
index d02e298..8ab2483 100644
--- 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
@@ -49,6 +49,8 @@
return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_extends_non_value.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
}
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
index 6ed1828..2227f34 100644
--- 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
@@ -49,6 +49,8 @@
return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_extends_non_value.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
}
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.outline.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.outline.expect
index 817542e..a1dd54d 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.outline.expect
@@ -46,4 +46,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///value_extends_non_value_error.dart:11:2 -> StringConstant("valueClass")
Evaluated: StaticGet @ org-dartlang-testcase:///value_extends_non_value_error.dart:18:2 -> StringConstant("valueClass")
-Extra constant evaluation: tries: 2, successes: 2
+Extra constant evaluation: evaluated: 2, effectively constant: 2
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.expect
index 240ae96..95e0356 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.expect
@@ -31,6 +31,8 @@
return other is self::Cat;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::Cat::•();
}
@@ -48,6 +50,8 @@
return other is self::Cat2;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat2".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat2()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::Cat2::•();
}
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.transformed.expect
index 240ae96..b55acf5 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.transformed.expect
@@ -31,6 +31,8 @@
return other is self::Cat;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::Cat::•();
}
@@ -48,6 +50,8 @@
return other is self::Cat2;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat2".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat2()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::Cat2::•();
}
@@ -77,3 +81,8 @@
constants {
#C1 = "valueClass"
}
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///value_extends_non_value_error.dart:12:7 -> StringConstant("Cat()")
+Evaluated: StringConcatenation @ org-dartlang-testcase:///value_extends_non_value_error.dart:19:7 -> StringConstant("Cat2()")
+Extra constant evaluation: evaluated: 46, effectively constant: 2
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.expect
index 240ae96..95e0356 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.expect
@@ -31,6 +31,8 @@
return other is self::Cat;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::Cat::•();
}
@@ -48,6 +50,8 @@
return other is self::Cat2;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat2".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat2()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::Cat2::•();
}
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.transformed.expect
index 240ae96..b55acf5 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.transformed.expect
@@ -31,6 +31,8 @@
return other is self::Cat;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::Cat::•();
}
@@ -48,6 +50,8 @@
return other is self::Cat2;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat2".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat2()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::Cat2::•();
}
@@ -77,3 +81,8 @@
constants {
#C1 = "valueClass"
}
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///value_extends_non_value_error.dart:12:7 -> StringConstant("Cat()")
+Evaluated: StringConcatenation @ org-dartlang-testcase:///value_extends_non_value_error.dart:19:7 -> StringConstant("Cat2()")
+Extra constant evaluation: evaluated: 46, effectively constant: 2
diff --git a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.outline.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.outline.expect
index 09d9e5f..73b6a82 100644
--- a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.outline.expect
@@ -85,4 +85,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///value_implements_non_value.dart:12:2 -> StringConstant("valueClass")
Evaluated: StaticGet @ org-dartlang-testcase:///value_implements_non_value.dart:22:2 -> StringConstant("valueClass")
-Extra constant evaluation: tries: 2, successes: 2
+Extra constant evaluation: evaluated: 2, effectively constant: 2
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
index 81644f5..0c996cf 100644
--- 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
@@ -92,6 +92,8 @@
return other is self::Cat && this.{self::Cat::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat".{core::String::hashCode}, this.{self::Cat::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat(numberOfLegs: ${this.{self::Cat::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
}
@@ -111,6 +113,8 @@
return other is self::Cat2 && this.{self::Cat2::numberOfLegs}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfLegs}) && this.{self::Cat2::numberOfWhiskers}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat2".{core::String::hashCode}, this.{self::Cat2::numberOfLegs}.{core::num::hashCode}), this.{self::Cat2::numberOfWhiskers}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat2(numberOfLegs: ${this.{self::Cat2::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat2::numberOfWhiskers}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
return new self::Cat2::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
}
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
index bcf2a6e..8073f01 100644
--- 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
@@ -92,6 +92,8 @@
return other is self::Cat && this.{self::Cat::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat".{core::String::hashCode}, this.{self::Cat::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat(numberOfLegs: ${this.{self::Cat::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
}
@@ -111,6 +113,8 @@
return other is self::Cat2 && this.{self::Cat2::numberOfLegs}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfLegs}) && this.{self::Cat2::numberOfWhiskers}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat2".{core::String::hashCode}, this.{self::Cat2::numberOfLegs}.{core::num::hashCode}), this.{self::Cat2::numberOfWhiskers}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat2(numberOfLegs: ${this.{self::Cat2::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat2::numberOfWhiskers}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
return new self::Cat2::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
}
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
index 5c550c6..25f2810 100644
--- 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
@@ -92,6 +92,8 @@
return other is self::Cat && this.{self::Cat::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat".{core::String::hashCode}, this.{self::Cat::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat(numberOfLegs: ${this.{self::Cat::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
}
@@ -111,6 +113,8 @@
return other is self::Cat2 && this.{self::Cat2::numberOfLegs}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfLegs}) && this.{self::Cat2::numberOfWhiskers}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat2".{core::String::hashCode}, this.{self::Cat2::numberOfLegs}.{core::num::hashCode}), this.{self::Cat2::numberOfWhiskers}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat2(numberOfLegs: ${this.{self::Cat2::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat2::numberOfWhiskers}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
return new self::Cat2::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
}
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
index 455ce4f..97545af 100644
--- 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
@@ -92,6 +92,8 @@
return other is self::Cat && this.{self::Cat::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat".{core::String::hashCode}, this.{self::Cat::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat(numberOfLegs: ${this.{self::Cat::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
}
@@ -111,6 +113,8 @@
return other is self::Cat2 && this.{self::Cat2::numberOfLegs}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfLegs}) && this.{self::Cat2::numberOfWhiskers}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat2".{core::String::hashCode}, this.{self::Cat2::numberOfLegs}.{core::num::hashCode}), this.{self::Cat2::numberOfWhiskers}.{core::num::hashCode}));
+ method /*isNullableByDefault*/ toString() → core::String
+ return "Cat2(numberOfLegs: ${this.{self::Cat2::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat2::numberOfWhiskers}.{core::int::toString}()})";
method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
return new self::Cat2::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
}
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
index e4f0339..cbe7b43 100644
--- 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
@@ -52,4 +52,4 @@
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///value_mixin_error.dart:7:2 -> StringConstant("valueClass")
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
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
index f0c520b..5b97acf 100644
--- 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
@@ -13,6 +13,8 @@
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "A()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::A::•();
}
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
index 4ea2146..5b474c0 100644
--- 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
@@ -13,6 +13,8 @@
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "A()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::A::•();
}
@@ -29,6 +31,8 @@
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "A()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::A::•();
}
@@ -73,3 +77,8 @@
constants {
#C1 = "valueClass"
}
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///value_mixin_error.dart:8:7 -> StringConstant("A()")
+Evaluated: StringConcatenation @ org-dartlang-testcase:///value_mixin_error.dart:8:7 -> StringConstant("A()")
+Extra constant evaluation: evaluated: 46, effectively constant: 2
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
index f0c520b..5b97acf 100644
--- 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
@@ -13,6 +13,8 @@
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "A()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::A::•();
}
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
index 4ea2146..5b474c0 100644
--- 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
@@ -13,6 +13,8 @@
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "A()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::A::•();
}
@@ -29,6 +31,8 @@
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
+ method /*isNullableByDefault*/ toString() → core::String
+ return "A()";
method /*isNullableByDefault*/ copyWith() → dynamic
return new self::A::•();
}
@@ -73,3 +77,8 @@
constants {
#C1 = "valueClass"
}
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///value_mixin_error.dart:8:7 -> StringConstant("A()")
+Evaluated: StringConcatenation @ org-dartlang-testcase:///value_mixin_error.dart:8:7 -> StringConstant("A()")
+Extra constant evaluation: evaluated: 46, effectively constant: 2
diff --git a/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.outline.expect b/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.outline.expect
index 217885d..22cd762 100644
--- a/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.outline.expect
+++ b/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.outline.expect
@@ -180,4 +180,4 @@
Evaluated: SymbolLiteral @ org-dartlang-testcase:///generic_covariance_sound_variance.dart:22:5 -> SymbolConstant(#x=)
Evaluated: ListLiteral @ org-dartlang-testcase:///generic_covariance_sound_variance.dart:22:5 -> ListConstant(const <Type*>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///generic_covariance_sound_variance.dart:22:5 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
-Extra constant evaluation: tries: 42, successes: 13
+Extra constant evaluation: evaluated: 42, effectively constant: 13
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index c0f3e48..a82fc45 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -4339,14 +4339,25 @@
}
}
+enum LogicalExpressionOperator { AND, OR }
+
+String logicalExpressionOperatorToString(LogicalExpressionOperator operator) {
+ switch (operator) {
+ case LogicalExpressionOperator.AND:
+ return "&&";
+ case LogicalExpressionOperator.OR:
+ return "||";
+ }
+ throw "Unhandled LogicalExpressionOperator: ${operator}";
+}
+
/// Expression of form `x && y` or `x || y`
class LogicalExpression extends Expression {
Expression left;
- // TODO(jensj): `??` is not supported and we shouldn't say so.
- String operator; // && or || or ??
+ LogicalExpressionOperator operatorEnum; // AND (&&) or OR (||).
Expression right;
- LogicalExpression(this.left, this.operator, this.right) {
+ LogicalExpression(this.left, this.operatorEnum, this.right) {
left?.parent = this;
right?.parent = this;
}
@@ -4383,7 +4394,7 @@
void toTextInternal(AstPrinter printer) {
int minimumPrecedence = precedence;
printer.writeExpression(left, minimumPrecedence: minimumPrecedence);
- printer.write(' $operator ');
+ printer.write(' ${logicalExpressionOperatorToString(operatorEnum)} ');
printer.writeExpression(right, minimumPrecedence: minimumPrecedence + 1);
}
}
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 63cbbf3..34b3512 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -1638,12 +1638,12 @@
return variableStack[index];
}
- String logicalOperatorToString(int index) {
+ LogicalExpressionOperator logicalOperatorToEnum(int index) {
switch (index) {
case 0:
- return '&&';
+ return LogicalExpressionOperator.AND;
case 1:
- return '||';
+ return LogicalExpressionOperator.OR;
default:
throw fail('unexpected logical operator index: $index');
}
@@ -1786,7 +1786,7 @@
return new NullCheck(readExpression())..fileOffset = offset;
case Tag.LogicalExpression:
return new LogicalExpression(readExpression(),
- logicalOperatorToString(readByte()), readExpression());
+ logicalOperatorToEnum(readByte()), readExpression());
case Tag.ConditionalExpression:
return new ConditionalExpression(readExpression(), readExpression(),
readExpression(), readDartTypeOption());
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index f85987b..9489134 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -1549,11 +1549,11 @@
writeNode(node.operand);
}
- int logicalOperatorIndex(String operator) {
+ int logicalOperatorIndex(LogicalExpressionOperator operator) {
switch (operator) {
- case '&&':
+ case LogicalExpressionOperator.AND:
return 0;
- case '||':
+ case LogicalExpressionOperator.OR:
return 1;
}
throw new ArgumentError('Not a logical operator: $operator');
@@ -1563,7 +1563,7 @@
void visitLogicalExpression(LogicalExpression node) {
writeByte(Tag.LogicalExpression);
writeNode(node.left);
- writeByte(logicalOperatorIndex(node.operator));
+ writeByte(logicalOperatorIndex(node.operatorEnum));
writeNode(node.right);
}
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index 6b7bbad..e326843 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -203,7 +203,7 @@
visitLogicalExpression(LogicalExpression node) {
return new LogicalExpression(
- clone(node.left), node.operator, clone(node.right));
+ clone(node.left), node.operatorEnum, clone(node.right));
}
visitConditionalExpression(ConditionalExpression node) {
diff --git a/pkg/kernel/lib/src/bounds_checks.dart b/pkg/kernel/lib/src/bounds_checks.dart
index 2597bba..3bbef8a 100644
--- a/pkg/kernel/lib/src/bounds_checks.dart
+++ b/pkg/kernel/lib/src/bounds_checks.dart
@@ -376,7 +376,8 @@
if (!allowSuperBounded) return result;
result = null;
- type = convertSuperBoundedToRegularBounded(typeEnvironment, type, bottomType);
+ type = convertSuperBoundedToRegularBounded(
+ library, typeEnvironment, type, bottomType);
List<DartType> argumentsToReport = arguments.toList();
if (type is InterfaceType) {
variables = type.classNode.typeParameters;
@@ -483,13 +484,16 @@
/// Replaces all covariant occurrences of `dynamic`, `Object`, and `void` with
/// [BottomType] and all contravariant occurrences of `Null` and [BottomType]
/// with `Object`.
-DartType convertSuperBoundedToRegularBounded(
+DartType convertSuperBoundedToRegularBounded(Library clientLibrary,
TypeEnvironment typeEnvironment, DartType type, DartType bottomType,
{bool isCovariant = true}) {
- if ((type is DynamicType ||
+ bool isTop = clientLibrary.isNonNullableByDefault
+ ? typeEnvironment.coreTypes.isTop(type)
+ : type is DynamicType ||
type is VoidType ||
- isObject(typeEnvironment, type)) &&
- isCovariant) {
+ type is InterfaceType &&
+ type.classNode == typeEnvironment.coreTypes.objectClass;
+ if (isTop && isCovariant) {
return bottomType;
} else if ((type == bottomType || type is BottomType) && !isCovariant) {
return typeEnvironment.coreTypes.objectLegacyRawType;
@@ -498,7 +502,7 @@
new List<DartType>(type.typeArguments.length);
for (int i = 0; i < replacedTypeArguments.length; i++) {
replacedTypeArguments[i] = convertSuperBoundedToRegularBounded(
- typeEnvironment, type.typeArguments[i], bottomType,
+ clientLibrary, typeEnvironment, type.typeArguments[i], bottomType,
isCovariant: isCovariant);
}
return new InterfaceType(
@@ -508,20 +512,23 @@
new List<DartType>(type.typeArguments.length);
for (int i = 0; i < replacedTypeArguments.length; i++) {
replacedTypeArguments[i] = convertSuperBoundedToRegularBounded(
- typeEnvironment, type.typeArguments[i], bottomType,
+ clientLibrary, typeEnvironment, type.typeArguments[i], bottomType,
isCovariant: isCovariant);
}
return new TypedefType(
type.typedefNode, type.nullability, replacedTypeArguments);
} else if (type is FunctionType) {
var replacedReturnType = convertSuperBoundedToRegularBounded(
- typeEnvironment, type.returnType, bottomType,
+ clientLibrary, typeEnvironment, type.returnType, bottomType,
isCovariant: isCovariant);
var replacedPositionalParameters =
new List<DartType>(type.positionalParameters.length);
for (int i = 0; i < replacedPositionalParameters.length; i++) {
replacedPositionalParameters[i] = convertSuperBoundedToRegularBounded(
- typeEnvironment, type.positionalParameters[i], bottomType,
+ clientLibrary,
+ typeEnvironment,
+ type.positionalParameters[i],
+ bottomType,
isCovariant: !isCovariant);
}
var replacedNamedParameters =
@@ -529,8 +536,8 @@
for (int i = 0; i < replacedNamedParameters.length; i++) {
replacedNamedParameters[i] = new NamedType(
type.namedParameters[i].name,
- convertSuperBoundedToRegularBounded(
- typeEnvironment, type.namedParameters[i].type, bottomType,
+ convertSuperBoundedToRegularBounded(clientLibrary, typeEnvironment,
+ type.namedParameters[i].type, bottomType,
isCovariant: !isCovariant));
}
return new FunctionType(
@@ -542,17 +549,12 @@
} else if (type is FutureOrType) {
return new FutureOrType(
convertSuperBoundedToRegularBounded(
- typeEnvironment, type.typeArgument, bottomType),
+ clientLibrary, typeEnvironment, type.typeArgument, bottomType),
type.declaredNullability);
}
return type;
}
-bool isObject(TypeEnvironment typeEnvironment, DartType type) {
- return type is InterfaceType &&
- type.classNode == typeEnvironment.coreTypes.objectClass;
-}
-
int computeVariance(TypeParameter typeParameter, DartType type,
{Map<TypeParameter, Map<DartType, int>> computedVariances}) {
computedVariances ??= new Map<TypeParameter, Map<DartType, int>>.identity();
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 209122a..da9af2b 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -1383,9 +1383,10 @@
}
visitLogicalExpression(LogicalExpression node) {
- int precedence = Precedence.binaryPrecedence[node.operator];
+ int precedence = Precedence
+ .binaryPrecedence[logicalExpressionOperatorToString(node.operatorEnum)];
writeExpression(node.left, precedence);
- writeSpaced(node.operator);
+ writeSpaced(logicalExpressionOperatorToString(node.operatorEnum));
writeExpression(node.right, precedence + 1);
}
@@ -2484,7 +2485,7 @@
int visitNot(Not node) => PREFIX;
int visitNullCheck(NullCheck node) => PRIMARY;
int visitLogicalExpression(LogicalExpression node) =>
- binaryPrecedence[node.operator];
+ binaryPrecedence[logicalExpressionOperatorToString(node.operatorEnum)];
int visitConditionalExpression(ConditionalExpression node) => CONDITIONAL;
int visitStringConcatenation(StringConcatenation node) => PRIMARY;
int visitIsExpression(IsExpression node) => RELATIONAL;
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index ef7c689..60a3e19 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -45,7 +45,7 @@
String visitInvalidExpression(InvalidExpression _) => "invalid";
String visitNot(Not _) => "not";
String visitLogicalExpression(LogicalExpression expression) {
- return expression.operator;
+ return logicalExpressionOperatorToString(expression.operatorEnum);
}
String visitStringConcatenation(StringConcatenation _) => "concat";
@@ -143,7 +143,8 @@
}
LogicalExpression wrapLogicalAnd(Tuple2<Expression, Expression> tuple) {
- return new LogicalExpression(tuple.first, '&&', tuple.second);
+ return new LogicalExpression(
+ tuple.first, LogicalExpressionOperator.AND, tuple.second);
}
TextSerializer<LogicalExpression> logicalOrSerializer = new Wrapped(
@@ -152,7 +153,8 @@
new Tuple2Serializer(expressionSerializer, expressionSerializer));
LogicalExpression wrapLogicalOr(Tuple2<Expression, Expression> tuple) {
- return new LogicalExpression(tuple.first, '||', tuple.second);
+ return new LogicalExpression(
+ tuple.first, LogicalExpressionOperator.OR, tuple.second);
}
TextSerializer<StringConcatenation> stringConcatenationSerializer = new Wrapped(
diff --git a/pkg/kernel/lib/transformations/async.dart b/pkg/kernel/lib/transformations/async.dart
index 9d5b372..5c32065 100644
--- a/pkg/kernel/lib/transformations/async.dart
+++ b/pkg/kernel/lib/transformations/async.dart
@@ -351,7 +351,7 @@
new MethodInvocation(expr.right, new Name('=='),
new Arguments(<Expression>[new BoolLiteral(true)])))));
var then, otherwise;
- if (expr.operator == '&&') {
+ if (expr.operatorEnum == LogicalExpressionOperator.AND) {
then = rightBody;
otherwise = null;
} else {
diff --git a/pkg/kernel/lib/transformations/value_class.dart b/pkg/kernel/lib/transformations/value_class.dart
index c616cea..d56989a 100644
--- a/pkg/kernel/lib/transformations/value_class.dart
+++ b/pkg/kernel/lib/transformations/value_class.dart
@@ -76,7 +76,6 @@
void transformValueClass(Class cls, CoreTypes coreTypes,
ClassHierarchy hierarchy, TypeEnvironment typeEnvironment) {
- List<VariableDeclaration> allVariables = queryAllInstanceVariables(cls);
Constructor syntheticConstructor = null;
for (Constructor constructor in cls.constructors) {
if (constructor.isSynthetic) {
@@ -84,11 +83,16 @@
}
}
+ List<VariableDeclaration> allVariables = queryAllInstanceVariables(cls);
+ List<VariableDeclaration> allVariablesList = allVariables.toList();
+ allVariablesList.sort((a, b) => a.name.compareTo(b.name));
+
addConstructor(cls, coreTypes, syntheticConstructor);
- addEqualsOperator(cls, coreTypes, hierarchy, allVariables.toList());
- addHashCode(cls, coreTypes, hierarchy, allVariables.toList());
- addCopyWith(cls, coreTypes, hierarchy, allVariables.toList(),
- syntheticConstructor, typeEnvironment);
+ addEqualsOperator(cls, coreTypes, hierarchy, allVariablesList);
+ addHashCode(cls, coreTypes, hierarchy, allVariablesList);
+ addToString(cls, coreTypes, hierarchy, allVariablesList);
+ addCopyWith(cls, coreTypes, hierarchy, allVariablesList, syntheticConstructor,
+ typeEnvironment);
}
void addConstructor(
@@ -128,7 +132,8 @@
}
void addEqualsOperator(Class cls, CoreTypes coreTypes, ClassHierarchy hierarchy,
- List<VariableDeclaration> allVariables) {
+ List<VariableDeclaration> allVariablesList) {
+ List<VariableDeclaration> allVariables = allVariablesList.toList();
for (Procedure procedure in cls.procedures) {
if (procedure.kind == ProcedureKind.Operator &&
procedure.name.text == "==") {
@@ -136,9 +141,7 @@
return;
}
}
- DartType returnType = cls.enclosingLibrary.isNonNullableByDefault
- ? coreTypes.boolNonNullableRawType
- : coreTypes.boolLegacyRawType;
+ DartType returnType = coreTypes.boolRawType(cls.enclosingLibrary.nonNullable);
DartType myType = coreTypes.thisInterfaceType(cls, Nullability.nonNullable);
VariableDeclaration other = VariableDeclaration("other",
@@ -174,8 +177,8 @@
targetsEquals[f]))
.fold(
IsExpression(VariableGet(other), myType),
- (previousValue, element) =>
- LogicalExpression(previousValue, '&&', element))),
+ (previousValue, element) => LogicalExpression(
+ previousValue, LogicalExpressionOperator.AND, element))),
returnType: returnType,
positionalParameters: [other]),
fileUri: cls.fileUri)
@@ -184,7 +187,8 @@
}
void addHashCode(Class cls, CoreTypes coreTypes, ClassHierarchy hierarchy,
- List<VariableDeclaration> allVariables) {
+ List<VariableDeclaration> allVariablesList) {
+ List<VariableDeclaration> allVariables = allVariablesList.toList();
for (Procedure procedure in cls.procedures) {
if (procedure.kind == ProcedureKind.Getter &&
procedure.name.text == "hashCode") {
@@ -192,9 +196,7 @@
return;
}
}
- DartType returnType = cls.enclosingLibrary.isNonNullableByDefault
- ? coreTypes.intNonNullableRawType
- : coreTypes.intLegacyRawType;
+ DartType returnType = coreTypes.intRawType(cls.enclosingLibrary.nonNullable);
Procedure hashCombine, hashFinish;
HashCombineMethodsScanner hashCombineMethodsScanner =
@@ -252,13 +254,48 @@
..fileOffset = cls.fileOffset);
}
+void addToString(Class cls, CoreTypes coreTypes, ClassHierarchy hierarchy,
+ List<VariableDeclaration> allVariablesList) {
+ List<Expression> wording = [StringLiteral("${cls.name}(")];
+
+ for (VariableDeclaration variable in allVariablesList) {
+ wording.add(StringLiteral("${variable.name}: "));
+ wording.add(MethodInvocation(
+ PropertyGet(ThisExpression(), Name(variable.name),
+ hierarchy.getInterfaceMember(cls, Name(variable.name))),
+ Name("toString"),
+ Arguments([]),
+ (variable.type is InterfaceType)
+ ? hierarchy.getInterfaceMember(
+ (variable.type as InterfaceType).classNode, Name("toString"))
+ : null));
+ wording.add(StringLiteral(", "));
+ }
+ if (allVariablesList.length != 0) {
+ wording[wording.length - 1] = StringLiteral(")");
+ } else {
+ wording.add(StringLiteral(")"));
+ }
+ DartType returnType =
+ coreTypes.stringRawType(cls.enclosingLibrary.nonNullable);
+ cls.addMember(Procedure(
+ Name("toString"),
+ ProcedureKind.Method,
+ FunctionNode(ReturnStatement(StringConcatenation(wording)),
+ returnType: returnType),
+ fileUri: cls.fileUri)
+ ..fileOffset = cls.fileOffset);
+}
+
void addCopyWith(
Class cls,
CoreTypes coreTypes,
ClassHierarchy hierarchy,
- List<VariableDeclaration> allVariables,
+ List<VariableDeclaration> allVariablesList,
Constructor syntheticConstructor,
TypeEnvironment typeEnvironment) {
+ List<VariableDeclaration> allVariables = allVariablesList.toList();
+
Map<VariableDeclaration, Member> targetsEquals = new Map();
Map<VariableDeclaration, Member> targets = new Map();
for (VariableDeclaration variable in allVariables) {
diff --git a/pkg/kernel/test/verify_test.dart b/pkg/kernel/test/verify_test.dart
index 905375c..6bf0a97 100644
--- a/pkg/kernel/test/verify_test.dart
+++ b/pkg/kernel/test/verify_test.dart
@@ -57,7 +57,7 @@
VariableDeclaration variable = test.makeVariable();
test.addNode(LogicalExpression(
new Let(variable, new VariableGet(variable)),
- '&&',
+ LogicalExpressionOperator.AND,
new VariableGet(variable)));
return variable;
},
diff --git a/pkg/nnbd_migration/test/api_test.dart b/pkg/nnbd_migration/test/api_test.dart
index 2140235..5a8f2bb 100644
--- a/pkg/nnbd_migration/test/api_test.dart
+++ b/pkg/nnbd_migration/test/api_test.dart
@@ -4626,7 +4626,7 @@
// here non-null is OK.
int i1 = 0, i2 = i1.gcd(2);
// here non-null is not OK.
- int? i3 = 0, i4 = i3.gcd(2), i5 = null;
+ int? i3 = 0, i4 = i3!.gcd(2), i5 = null;
}
''';
diff --git a/pkg/testing/lib/src/chain.dart b/pkg/testing/lib/src/chain.dart
index e51bcb4..a6c982d 100644
--- a/pkg/testing/lib/src/chain.dart
+++ b/pkg/testing/lib/src/chain.dart
@@ -354,7 +354,12 @@
final List<String> logs = <String>[];
- Result(this.output, this.outcome, this.error, this.trace);
+ /// If set, running the test with '-D$autoFixCommand' will automatically
+ /// update the test to match new expectations.
+ final String autoFixCommand;
+
+ Result(this.output, this.outcome, this.error, this.trace,
+ {this.autoFixCommand});
Result.pass(O output) : this(output, Expectation.Pass, null, null);
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index 2a54a62..1846f60 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -1635,8 +1635,7 @@
if (condition is Not) {
_genConditionAndJumpIf(condition.operand, !value, dest);
} else if (condition is LogicalExpression) {
- assert(condition.operator == '||' || condition.operator == '&&');
- final isOR = (condition.operator == '||');
+ final isOR = (condition.operatorEnum == LogicalExpressionOperator.OR);
Label shortCircuit, done;
if (isOR == value) {
@@ -3221,12 +3220,10 @@
@override
visitLogicalExpression(LogicalExpression node) {
- assert(node.operator == '||' || node.operator == '&&');
-
final Label shortCircuit = new Label();
final Label done = new Label();
final int temp = locals.tempIndexInFrame(node);
- final isOR = (node.operator == '||');
+ final isOR = (node.operatorEnum == LogicalExpressionOperator.OR);
_genConditionAndJumpIf(node.left, isOR, shortCircuit);
diff --git a/pkg/vm/lib/transformations/type_flow/summary_collector.dart b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
index 0f04cfa..fb0fc33 100644
--- a/pkg/vm/lib/transformations/type_flow/summary_collector.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
@@ -1317,8 +1317,7 @@
_variableValues = null;
return;
} else if (node is LogicalExpression) {
- assert(node.operator == '||' || node.operator == '&&');
- final isOR = (node.operator == '||');
+ final isOR = (node.operatorEnum == LogicalExpressionOperator.OR);
_visitCondition(node.left, trueState, falseState);
if (isOR) {
// expr1 || expr2
diff --git a/pkg/vm/lib/transformations/unreachable_code_elimination.dart b/pkg/vm/lib/transformations/unreachable_code_elimination.dart
index 6dd07b5..8444ce7 100644
--- a/pkg/vm/lib/transformations/unreachable_code_elimination.dart
+++ b/pkg/vm/lib/transformations/unreachable_code_elimination.dart
@@ -79,22 +79,23 @@
node.transformChildren(this);
final left = node.left;
final right = node.right;
- final operator = node.operator;
+ final operatorEnum = node.operatorEnum;
if (_isBoolConstant(left)) {
final leftValue = _getBoolConstantValue(left);
if (_isBoolConstant(right)) {
final rightValue = _getBoolConstantValue(right);
- if (operator == '||') {
+ if (operatorEnum == LogicalExpressionOperator.OR) {
return _createBoolLiteral(leftValue || rightValue, node.fileOffset);
- } else if (operator == '&&') {
+ } else if (operatorEnum == LogicalExpressionOperator.AND) {
return _createBoolLiteral(leftValue && rightValue, node.fileOffset);
} else {
- throw 'Unexpected LogicalExpression operator ${operator}: $node';
+ throw 'Unexpected LogicalExpression operator ${operatorEnum}: $node';
}
} else {
- if (leftValue && operator == '||') {
+ if (leftValue && operatorEnum == LogicalExpressionOperator.OR) {
return _createBoolLiteral(true, node.fileOffset);
- } else if (!leftValue && operator == '&&') {
+ } else if (!leftValue &&
+ operatorEnum == LogicalExpressionOperator.AND) {
return _createBoolLiteral(false, node.fileOffset);
}
}
diff --git a/pkg/vm_service/CHANGELOG.md b/pkg/vm_service/CHANGELOG.md
index b049853..ca07f4f 100644
--- a/pkg/vm_service/CHANGELOG.md
+++ b/pkg/vm_service/CHANGELOG.md
@@ -1,5 +1,11 @@
# Changelog
+## 5.3.0
+- Added support for `dart:io` extensions version 1.4.
+- Update to version `3.40.0` of the spec.
+- Added `IsolateFlag` class.
+- Added `isolateFlags` property to `Isolate`.
+
## 5.2.0
- Added support for `dart:io` extensions version 1.3.
- Added combination getter/setter `httpEnableTimelineLogging`.
diff --git a/pkg/vm_service/example/vm_service_assert.dart b/pkg/vm_service/example/vm_service_assert.dart
index 52746bd..e2ae6d1 100644
--- a/pkg/vm_service/example/vm_service_assert.dart
+++ b/pkg/vm_service/example/vm_service_assert.dart
@@ -47,6 +47,13 @@
return list;
}
+List<vms.IsolateFlag> assertListOfIsolateFlag(List<vms.IsolateFlag> list) {
+ for (vms.IsolateFlag elem in list) {
+ assertIsolateFlag(elem);
+ }
+ return list;
+}
+
String assertString(String obj) {
assertNotNull(obj);
if (obj.isEmpty) throw 'expected non-zero length string';
@@ -667,6 +674,7 @@
assertString(obj.number);
assertString(obj.name);
assertBool(obj.isSystemIsolate);
+ assertListOfIsolateFlag(obj.isolateFlags);
assertInt(obj.startTime);
assertBool(obj.runnable);
assertInt(obj.livePorts);
@@ -678,6 +686,13 @@
return obj;
}
+vms.IsolateFlag assertIsolateFlag(vms.IsolateFlag obj) {
+ assertNotNull(obj);
+ assertString(obj.name);
+ assertString(obj.valueAsString);
+ return obj;
+}
+
vms.IsolateGroupRef assertIsolateGroupRef(vms.IsolateGroupRef obj) {
assertNotNull(obj);
assertString(obj.type);
diff --git a/pkg/vm_service/java/.gitignore b/pkg/vm_service/java/.gitignore
index fbcce7d..ae6691f 100644
--- a/pkg/vm_service/java/.gitignore
+++ b/pkg/vm_service/java/.gitignore
@@ -79,6 +79,7 @@
src/org/dartlang/vm/service/element/InstanceRef.java
src/org/dartlang/vm/service/element/InstanceSet.java
src/org/dartlang/vm/service/element/Isolate.java
+src/org/dartlang/vm/service/element/IsolateFlag.java
src/org/dartlang/vm/service/element/IsolateGroup.java
src/org/dartlang/vm/service/element/IsolateGroupRef.java
src/org/dartlang/vm/service/element/IsolateRef.java
diff --git a/pkg/vm_service/java/version.properties b/pkg/vm_service/java/version.properties
index e076127..d0564a6 100644
--- a/pkg/vm_service/java/version.properties
+++ b/pkg/vm_service/java/version.properties
@@ -1 +1 @@
-version=3.39
+version=3.40
diff --git a/pkg/vm_service/lib/src/dart_io_extensions.dart b/pkg/vm_service/lib/src/dart_io_extensions.dart
index ce777d6..886b947 100644
--- a/pkg/vm_service/lib/src/dart_io_extensions.dart
+++ b/pkg/vm_service/lib/src/dart_io_extensions.dart
@@ -12,6 +12,14 @@
extension DartIOExtension on VmService {
static bool _factoriesRegistered = false;
+ static Map<String, Version> _isolateVersion = {};
+
+ Future<Version> _version(String isolateId) async {
+ if (_isolateVersion[isolateId] == null) {
+ _isolateVersion[isolateId] = await getDartIOVersion(isolateId);
+ }
+ return _isolateVersion[isolateId];
+ }
/// The `getDartIOVersion` RPC returns the available version of the dart:io
/// service protocol extensions.
@@ -58,11 +66,26 @@
'enable': enable,
});
+ /// The _httpEnableTimelineLogging_ RPC is used to set and inspect the value of
+ /// `HttpClient.enableTimelineLogging`, which determines if HTTP client requests
+ /// should be logged to the timeline. If `enabled` is provided, the state of
+ /// `HttpClient.enableTimelineLogging` will be updated to the value of `enabled`.
+ ///
+ /// If the value of `HttpClient.enableTimelineLogging` is changed, a
+ /// `HttpTimelineLoggingStateChange` event will be sent on the `Extension` stream.
Future<HttpTimelineLoggingState> httpEnableTimelineLogging(String isolateId,
- [bool enable]) =>
- _callHelper('ext.dart.io.httpEnableTimelineLogging', isolateId, args: {
- if (enable != null) 'enable': enable,
- });
+ [bool enabled]) async {
+ final version = await _version(isolateId);
+ // Parameter name changed in version 1.4.
+ final enableKey =
+ ((version.major == 1 && version.minor > 3) || version.major >= 2)
+ ? 'enabled'
+ : 'enable';
+ return _callHelper('ext.dart.io.httpEnableTimelineLogging', isolateId,
+ args: {
+ if (enabled != null) enableKey: enabled,
+ });
+ }
/// The `getOpenFiles` RPC is used to retrieve the list of files currently
/// opened files by `dart:io` from a given isolate.
diff --git a/pkg/vm_service/lib/src/vm_service.dart b/pkg/vm_service/lib/src/vm_service.dart
index 4f63e01..fd20c5b 100644
--- a/pkg/vm_service/lib/src/vm_service.dart
+++ b/pkg/vm_service/lib/src/vm_service.dart
@@ -28,7 +28,7 @@
HeapSnapshotObjectNoData,
HeapSnapshotObjectNullData;
-const String vmServiceVersion = '3.39.0';
+const String vmServiceVersion = '3.40.0';
/// @optional
const String optional = 'optional';
@@ -139,6 +139,7 @@
'Instance': Instance.parse,
'@Isolate': IsolateRef.parse,
'Isolate': Isolate.parse,
+ 'IsolateFlag': IsolateFlag.parse,
'@IsolateGroup': IsolateGroupRef.parse,
'IsolateGroup': IsolateGroup.parse,
'InboundReferences': InboundReferences.parse,
@@ -4745,6 +4746,10 @@
/// internal use. If `false`, this isolate is likely running user code.
bool isSystemIsolate;
+ /// The list of isolate flags provided to this isolate. See Dart_IsolateFlags
+ /// in dart_api.h for the list of accepted isolate flags.
+ List<IsolateFlag> isolateFlags;
+
/// The time that the VM started in milliseconds since the epoch.
///
/// Suitable to pass to DateTime.fromMillisecondsSinceEpoch.
@@ -4794,6 +4799,7 @@
@required this.number,
@required this.name,
@required this.isSystemIsolate,
+ @required this.isolateFlags,
@required this.startTime,
@required this.runnable,
@required this.livePorts,
@@ -4812,6 +4818,8 @@
number = json['number'];
name = json['name'];
isSystemIsolate = json['isSystemIsolate'];
+ isolateFlags = List<IsolateFlag>.from(
+ createServiceObject(json['isolateFlags'], const ['IsolateFlag']) ?? []);
startTime = json['startTime'];
runnable = json['runnable'];
livePorts = json['livePorts'];
@@ -4838,6 +4846,7 @@
'number': number,
'name': name,
'isSystemIsolate': isSystemIsolate,
+ 'isolateFlags': isolateFlags.map((f) => f.toJson()).toList(),
'startTime': startTime,
'runnable': runnable,
'livePorts': livePorts,
@@ -4861,6 +4870,40 @@
String toString() => '[Isolate]';
}
+/// Represents the value of a single isolate flag. See [Isolate].
+class IsolateFlag {
+ static IsolateFlag parse(Map<String, dynamic> json) =>
+ json == null ? null : IsolateFlag._fromJson(json);
+
+ /// The name of the flag.
+ String name;
+
+ /// The value of this flag as a string.
+ String valueAsString;
+
+ IsolateFlag({
+ @required this.name,
+ @required this.valueAsString,
+ });
+
+ IsolateFlag._fromJson(Map<String, dynamic> json) {
+ name = json['name'];
+ valueAsString = json['valueAsString'];
+ }
+
+ Map<String, dynamic> toJson() {
+ var json = <String, dynamic>{};
+ json.addAll({
+ 'name': name,
+ 'valueAsString': valueAsString,
+ });
+ return json;
+ }
+
+ String toString() =>
+ '[IsolateFlag name: ${name}, valueAsString: ${valueAsString}]';
+}
+
/// `IsolateGroupRef` is a reference to an `IsolateGroup` object.
class IsolateGroupRef extends Response {
static IsolateGroupRef parse(Map<String, dynamic> json) =>
diff --git a/pkg/vm_service/pubspec.yaml b/pkg/vm_service/pubspec.yaml
index c2280d1..690f8b6 100644
--- a/pkg/vm_service/pubspec.yaml
+++ b/pkg/vm_service/pubspec.yaml
@@ -2,7 +2,7 @@
description: >-
A library to communicate with a service implementing the Dart VM
service protocol.
-version: 5.2.0
+version: 5.3.0
homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm_service
diff --git a/pkg/vm_service/test/get_isolate_rpc_test.dart b/pkg/vm_service/test/get_isolate_rpc_test.dart
new file mode 100644
index 0000000..ed901a3
--- /dev/null
+++ b/pkg/vm_service/test/get_isolate_rpc_test.dart
@@ -0,0 +1,60 @@
+// 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:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
+import 'common/test_helper.dart';
+
+var tests = <VMTest>[
+ (VmService service) async {
+ final vm = await service.getVM();
+ final result = await service.getIsolate(vm.isolates.first.id);
+ expect(result.id, startsWith('isolates/'));
+ expect(result.number, isNotNull);
+ expect(result.isolateFlags, isNotNull);
+ expect(result.isolateFlags.length, isPositive);
+ expect(result.isSystemIsolate, isFalse);
+ expect(result.json['_originNumber'], result.number);
+ expect(result.startTime, isPositive);
+ expect(result.livePorts, isPositive);
+ expect(result.pauseOnExit, isFalse);
+ expect(result.pauseEvent.type, 'Event');
+ expect(result.error, isNull);
+ expect(result.json['_numZoneHandles'], isPositive);
+ expect(result.json['_numScopedHandles'], isPositive);
+ expect(result.rootLib, isNotNull);
+ expect(result.libraries.length, isPositive);
+ expect(result.libraries[0], isNotNull);
+ expect(result.breakpoints.length, isZero);
+ expect(result.json['_heaps']['new']['type'], 'HeapSpace');
+ expect(result.json['_heaps']['old']['type'], 'HeapSpace');
+ },
+
+ (VmService service) async {
+ bool caughtException;
+ try {
+ await service.getIsolate('badid');
+ expect(false, isTrue, reason: 'Unreachable');
+ } on RPCError catch (e) {
+ caughtException = true;
+ expect(e.code, equals(RPCError.kInvalidParams));
+ expect(e.details, "getIsolate: invalid 'isolateId' parameter: badid");
+ }
+ expect(caughtException, isTrue);
+ },
+
+ // Plausible isolate id, not found.
+ (VmService service) async {
+ try {
+ await service.getIsolate('isolates/9999999999');
+ fail('successfully got isolate with bad ID');
+ } on SentinelException catch (e) {
+ expect(e.sentinel.kind, 'Collected');
+ expect(e.sentinel.valueAsString, '<collected>');
+ }
+ },
+];
+
+main(args) async => runVMTests(args, tests);
diff --git a/pkg/vm_service/test/server_test.dart b/pkg/vm_service/test/server_test.dart
index 37a9549..739af84 100644
--- a/pkg/vm_service/test/server_test.dart
+++ b/pkg/vm_service/test/server_test.dart
@@ -50,6 +50,7 @@
startTime: 1,
runnable: true,
livePorts: 2,
+ isolateFlags: [],
pauseOnExit: false,
pauseEvent: Event(
kind: EventKind.kResume,
@@ -78,6 +79,7 @@
startTime: 1,
runnable: true,
livePorts: 2,
+ isolateFlags: [],
pauseOnExit: false,
pauseEvent: Event(
kind: EventKind.kResume,
diff --git a/pkg/vm_service/tool/dart/generate_dart.dart b/pkg/vm_service/tool/dart/generate_dart.dart
index 1fbe545..49fb41a 100644
--- a/pkg/vm_service/tool/dart/generate_dart.dart
+++ b/pkg/vm_service/tool/dart/generate_dart.dart
@@ -936,6 +936,13 @@
return list;
}
+List<vms.IsolateFlag> assertListOfIsolateFlag(List<vms.IsolateFlag> list) {
+ for (vms.IsolateFlag elem in list) {
+ assertIsolateFlag(elem);
+ }
+ return list;
+}
+
String assertString(String obj) {
assertNotNull(obj);
if (obj.isEmpty) throw 'expected non-zero length string';
diff --git a/runtime/bin/builtin_impl_sources.gni b/runtime/bin/builtin_impl_sources.gni
index b8ea4eb..58323d0 100644
--- a/runtime/bin/builtin_impl_sources.gni
+++ b/runtime/bin/builtin_impl_sources.gni
@@ -45,6 +45,7 @@
"file_macos.cc",
"file_support.cc",
"file_win.cc",
+ "file_win.h",
"io_buffer.cc",
"io_buffer.h",
"isolate_data.cc",
diff --git a/runtime/bin/directory_win.cc b/runtime/bin/directory_win.cc
index ec96863..16b0984 100644
--- a/runtime/bin/directory_win.cc
+++ b/runtime/bin/directory_win.cc
@@ -13,6 +13,7 @@
#include "bin/crypto.h"
#include "bin/dartutils.h"
#include "bin/file.h"
+#include "bin/file_win.h"
#include "bin/namespace.h"
#include "bin/utils.h"
#include "bin/utils_win.h"
@@ -21,8 +22,6 @@
#undef DeleteFile
-#define MAX_LONG_PATH 32767
-
namespace dart {
namespace bin {
@@ -278,7 +277,12 @@
}
static bool DeleteRecursively(PathBuffer* path) {
- DWORD attributes = GetFileAttributesW(path->AsStringW());
+ PathBuffer prefixed_path;
+ if (!prefixed_path.Add(PrefixLongDirectoryPath(path->AsScopedString()))) {
+ return false;
+ }
+
+ DWORD attributes = GetFileAttributesW(prefixed_path.AsStringW());
if (attributes == INVALID_FILE_ATTRIBUTES) {
return false;
}
@@ -286,33 +290,34 @@
// filesystem that we do not want to recurse into.
if ((attributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) {
// Just delete the junction itself.
- return RemoveDirectoryW(path->AsStringW()) != 0;
+ return RemoveDirectoryW(prefixed_path.AsStringW()) != 0;
}
// If it's a file, remove it directly.
if ((attributes & FILE_ATTRIBUTE_DIRECTORY) == 0) {
- return DeleteFile(L"", path);
+ return DeleteFile(L"", &prefixed_path);
}
- if (!path->AddW(L"\\*")) {
+ if (!prefixed_path.AddW(L"\\*")) {
return false;
}
WIN32_FIND_DATAW find_file_data;
- HANDLE find_handle = FindFirstFileW(path->AsStringW(), &find_file_data);
+ HANDLE find_handle =
+ FindFirstFileW(prefixed_path.AsStringW(), &find_file_data);
if (find_handle == INVALID_HANDLE_VALUE) {
return false;
}
// Adjust the path by removing the '*' used for the search.
- int path_length = path->length() - 1;
- path->Reset(path_length);
+ int path_length = prefixed_path.length() - 1;
+ prefixed_path.Reset(path_length);
do {
- if (!DeleteEntry(&find_file_data, path)) {
+ if (!DeleteEntry(&find_file_data, &prefixed_path)) {
break;
}
- path->Reset(path_length); // DeleteEntry adds to the path.
+ prefixed_path.Reset(path_length); // DeleteEntry adds to the path.
} while (FindNextFileW(find_handle, &find_file_data) != 0);
DWORD last_error = GetLastError();
@@ -324,8 +329,9 @@
return false;
}
// All content deleted succesfully, try to delete directory.
- path->Reset(path_length - 1); // Drop the "\" from the end of the path.
- return RemoveDirectoryW(path->AsStringW()) != 0;
+ prefixed_path.Reset(path_length -
+ 1); // Drop the "\" from the end of the path.
+ return RemoveDirectoryW(prefixed_path.AsStringW()) != 0;
}
static Directory::ExistsResult ExistsHelper(const wchar_t* dir_name) {
@@ -349,7 +355,8 @@
Directory::ExistsResult Directory::Exists(Namespace* namespc,
const char* dir_name) {
- Utf8ToWideScope system_name(dir_name);
+ const char* prefixed_dir_name = PrefixLongDirectoryPath(dir_name);
+ Utf8ToWideScope system_name(prefixed_dir_name);
return ExistsHelper(system_name.wide());
}
@@ -369,7 +376,8 @@
}
bool Directory::Create(Namespace* namespc, const char* dir_name) {
- Utf8ToWideScope system_name(dir_name);
+ const char* prefixed_dir_name = PrefixLongDirectoryPath(dir_name);
+ Utf8ToWideScope system_name(prefixed_dir_name);
int create_status = CreateDirectoryW(system_name.wide(), NULL);
// If the directory already existed, treat it as a success.
if ((create_status == 0) && (GetLastError() == ERROR_ALREADY_EXISTS) &&
@@ -475,10 +483,11 @@
bool Directory::Delete(Namespace* namespc,
const char* dir_name,
bool recursive) {
+ const char* prefixed_dir_name = PrefixLongDirectoryPath(dir_name);
bool result = false;
- Utf8ToWideScope system_dir_name(dir_name);
+ Utf8ToWideScope system_dir_name(prefixed_dir_name);
if (!recursive) {
- if (File::GetType(namespc, dir_name, true) == File::kIsDirectory) {
+ if (File::GetType(namespc, prefixed_dir_name, true) == File::kIsDirectory) {
result = (RemoveDirectoryW(system_dir_name.wide()) != 0);
} else {
SetLastError(ERROR_FILE_NOT_FOUND);
@@ -495,18 +504,20 @@
bool Directory::Rename(Namespace* namespc,
const char* path,
const char* new_path) {
- Utf8ToWideScope system_path(path);
- Utf8ToWideScope system_new_path(new_path);
+ const char* prefixed_dir = PrefixLongDirectoryPath(path);
+ Utf8ToWideScope system_path(prefixed_dir);
ExistsResult exists = ExistsHelper(system_path.wide());
if (exists != EXISTS) {
return false;
}
+ const char* prefixed_new_dir = PrefixLongDirectoryPath(new_path);
+ Utf8ToWideScope system_new_path(prefixed_new_dir);
ExistsResult new_exists = ExistsHelper(system_new_path.wide());
// MoveFile does not allow replacing existing directories. Therefore,
// if the new_path is currently a directory we need to delete it
// first.
if (new_exists == EXISTS) {
- bool success = Delete(namespc, new_path, true);
+ bool success = Delete(namespc, prefixed_new_dir, true);
if (!success) {
return false;
}
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
index 21f8df2..46425dc 100644
--- a/runtime/bin/file_win.cc
+++ b/runtime/bin/file_win.cc
@@ -5,13 +5,15 @@
#include "platform/globals.h"
#if defined(HOST_OS_WINDOWS)
-#include "bin/file.h"
+#include <functional>
+#include <memory>
+#include <string>
+#include <Shlwapi.h> // NOLINT
#include <WinIoCtl.h> // NOLINT
#include <fcntl.h> // NOLINT
#include <io.h> // NOLINT
-#include <Shlwapi.h> // NOLINT
-#undef StrDup // defined in Shlwapi.h as StrDupW
+#undef StrDup // defined in Shlwapi.h as StrDupW
#include <stdio.h> // NOLINT
#include <string.h> // NOLINT
#include <sys/stat.h> // NOLINT
@@ -20,6 +22,8 @@
#include "bin/builtin.h"
#include "bin/crypto.h"
#include "bin/directory.h"
+#include "bin/file.h"
+#include "bin/file_win.h"
#include "bin/namespace.h"
#include "bin/utils.h"
#include "bin/utils_win.h"
@@ -298,8 +302,146 @@
return new File(new FileHandle(fd));
}
+class StringRAII {
+ public:
+ explicit StringRAII(const char* s) : s_(s), own_(false) {}
+ explicit StringRAII(char* s) : s_(s), own_(true) {}
+ ~StringRAII() {
+ if (own_) {
+ free(const_cast<char*>(s_));
+ }
+ }
+ const char* str() const { return s_; }
+ const char* release() {
+ own_ = false;
+ return s_;
+ }
+
+ private:
+ bool own_;
+ const char* s_;
+};
+
+class Wchart {
+ public:
+ explicit Wchart(int size) {
+ buf_ = reinterpret_cast<wchar_t*>(malloc(size * sizeof(wchar_t)));
+ }
+ ~Wchart() { free(buf_); }
+ wchar_t* buf() const { return buf_; }
+
+ private:
+ wchar_t* buf_;
+};
+
+static StringRAII ConvertToAbsolutePath(const char* path,
+ bool* p_has_converted_successfully) {
+ const int kPathLength = 16384;
+ Wchart buffer(kPathLength); // use some reasonably large initial buffer
+ Utf8ToWideScope path_utf8_to_wide(path);
+ *p_has_converted_successfully = true;
+ int full_path_length =
+ GetFullPathNameW(path_utf8_to_wide.wide(), kPathLength, buffer.buf(),
+ /*lpFilePart=*/nullptr);
+ if (full_path_length == 0) {
+ *p_has_converted_successfully = false;
+ // GetFullPathNameW failed
+ return StringRAII(path);
+ }
+ if (full_path_length < kPathLength) {
+ WideToUtf8Scope scope(buffer.buf());
+ return StringRAII(strdup(scope.utf8()));
+ }
+
+ // Try again with bigger buffer.
+ Wchart bigger_buffer(full_path_length);
+ if (GetFullPathNameW(path_utf8_to_wide.wide(), full_path_length,
+ bigger_buffer.buf(),
+ /*lpFilePart=*/nullptr) == 0) {
+ *p_has_converted_successfully = false;
+ // GetFullPathNameW failed
+ return StringRAII(path);
+ }
+ WideToUtf8Scope scope(bigger_buffer.buf());
+ return StringRAII(strdup(scope.utf8()));
+}
+
+static StringRAII PrefixLongPathIfExceedLimit(
+ const char* path,
+ bool is_file,
+ std::function<char*(int)> allocate) {
+ // File name and Directory name have different size limit.
+ // Reference: https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#maximum-path-length-limitation
+ const int path_short_limit = is_file ? MAX_PATH : MAX_DIRECTORY_PATH;
+
+ const char* kLongPathPrefix = "\\\\?\\";
+ const int kLongPathPrefixLength = 4;
+
+ // if absolute path is short or already prefixed, just return it.
+ if ((File::IsAbsolutePath(path) && strlen(path) < path_short_limit) ||
+ strncmp(path, kLongPathPrefix, kLongPathPrefixLength) == 0) {
+ return StringRAII(path);
+ }
+
+ // Long relative path have to be converted to absolute path before prefixing.
+ bool is_ok = true;
+ StringRAII absolute_path_raii = File::IsAbsolutePath(path)
+ ? StringRAII(path)
+ : ConvertToAbsolutePath(path, &is_ok);
+ if (!is_ok) {
+ return StringRAII(path);
+ }
+ const char* absolute_path = absolute_path_raii.str();
+ int length = strlen(absolute_path);
+ if (length < path_short_limit) {
+ // No need for a prefix if absolute path is short
+ return StringRAII(path);
+ }
+ if (strncmp(absolute_path, kLongPathPrefix, kLongPathPrefixLength) == 0) {
+ // Relative path converted to absolute could get a prefix.
+ return StringRAII(absolute_path);
+ }
+
+ // Add prefix and replace forward slashes with backward slashes.
+ char* result = allocate((kLongPathPrefixLength + length + 1) * sizeof(char));
+ strncpy(result, kLongPathPrefix, kLongPathPrefixLength);
+ for (int i = 0; i < length; i++) {
+ result[kLongPathPrefixLength + i] =
+ absolute_path[i] == '/' ? '\\' : absolute_path[i];
+ }
+ result[length + kLongPathPrefixLength] = '\0';
+ return StringRAII(result);
+}
+
+static const char* PrefixLongFilePath(const char* path) {
+ return PrefixLongPathIfExceedLimit(
+ path, /*is_file=*/true,
+ [](int size) {
+ return reinterpret_cast<char*>(Dart_ScopeAllocate(size));
+ })
+ .release();
+}
+
+static StringRAII PrefixLongFilePathNoScope(const char* path) {
+ return PrefixLongPathIfExceedLimit(path, /*is_file=*/true, [](int size) {
+ return reinterpret_cast<char*>(malloc(size));
+ });
+}
+
+const char* PrefixLongDirectoryPath(const char* path) {
+ return PrefixLongPathIfExceedLimit(
+ path, /*is_file=*/false,
+ [](int size) {
+ return reinterpret_cast<char*>(Dart_ScopeAllocate(size));
+ })
+ .release();
+}
+
File* File::Open(Namespace* namespc, const char* path, FileOpenMode mode) {
- Utf8ToWideScope system_name(path);
+ // File::Open can be called without scope(when launching isolate),
+ // so it mallocs prefixed path
+ StringRAII string_raii = PrefixLongFilePathNoScope(path);
+ Utf8ToWideScope system_name(string_raii.str());
File* file = FileOpenW(system_name.wide(), mode);
return file;
}
@@ -364,8 +506,9 @@
}
bool File::Exists(Namespace* namespc, const char* name) {
+ StringRAII string_raii = PrefixLongFilePathNoScope(name);
+ Utf8ToWideScope system_name(string_raii.str());
struct __stat64 st;
- Utf8ToWideScope system_name(name);
return StatHelper(system_name.wide(), &st);
}
@@ -379,7 +522,7 @@
}
bool File::Create(Namespace* namespc, const char* name) {
- Utf8ToWideScope system_name(name);
+ Utf8ToWideScope system_name(PrefixLongFilePath(name));
int fd = _wopen(system_name.wide(), O_RDONLY | O_CREAT, 0666);
if (fd < 0) {
return false;
@@ -426,8 +569,8 @@
bool File::CreateLink(Namespace* namespc,
const char* utf8_name,
const char* utf8_target) {
- Utf8ToWideScope name(utf8_name);
- Utf8ToWideScope target(utf8_target);
+ Utf8ToWideScope name(PrefixLongFilePath(utf8_name));
+ Utf8ToWideScope target(PrefixLongFilePath(utf8_target));
DWORD flags = SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE;
File::Type type = File::GetType(namespc, utf8_target, true);
@@ -449,13 +592,13 @@
}
bool File::Delete(Namespace* namespc, const char* name) {
- Utf8ToWideScope system_name(name);
+ Utf8ToWideScope system_name(PrefixLongFilePath(name));
int status = _wremove(system_name.wide());
return status != -1;
}
bool File::DeleteLink(Namespace* namespc, const char* name) {
- Utf8ToWideScope system_name(name);
+ Utf8ToWideScope system_name(PrefixLongFilePath(name));
bool result = false;
DWORD attributes = GetFileAttributesW(system_name.wide());
if ((attributes == INVALID_FILE_ATTRIBUTES) ||
@@ -477,13 +620,15 @@
bool File::Rename(Namespace* namespc,
const char* old_path,
const char* new_path) {
- File::Type type = GetType(namespc, old_path, false);
+ const char* prefixed_old_path = PrefixLongFilePath(old_path);
+ File::Type type = GetType(namespc, prefixed_old_path, false);
if (type != kIsFile) {
SetLastError(ERROR_FILE_NOT_FOUND);
return false;
}
- Utf8ToWideScope system_old_path(old_path);
- Utf8ToWideScope system_new_path(new_path);
+ const char* prefixed_new_path = PrefixLongFilePath(new_path);
+ Utf8ToWideScope system_old_path(prefixed_old_path);
+ Utf8ToWideScope system_new_path(prefixed_new_path);
DWORD flags = MOVEFILE_WRITE_THROUGH | MOVEFILE_REPLACE_EXISTING;
int move_status =
MoveFileExW(system_old_path.wide(), system_new_path.wide(), flags);
@@ -493,23 +638,25 @@
bool File::RenameLink(Namespace* namespc,
const char* old_path,
const char* new_path) {
- File::Type type = GetType(namespc, old_path, false);
+ const char* prefixed_old_path = PrefixLongFilePath(old_path);
+ File::Type type = GetType(namespc, prefixed_old_path, false);
if (type != kIsLink) {
SetLastError(ERROR_FILE_NOT_FOUND);
return false;
}
- Utf8ToWideScope system_old_path(old_path);
- Utf8ToWideScope system_new_path(new_path);
+ Utf8ToWideScope system_old_path(prefixed_old_path);
+ const char* prefixed_new_path = PrefixLongFilePath(new_path);
+ Utf8ToWideScope system_new_path(prefixed_new_path);
DWORD flags = MOVEFILE_WRITE_THROUGH | MOVEFILE_REPLACE_EXISTING;
// Junction links on Windows appear as special directories. MoveFileExW's
// MOVEFILE_REPLACE_EXISTING does not allow for replacement of directories,
// so we need to remove it before renaming a link. This step is only
// necessary for junctions created by the old Link.create implementation.
- if ((Directory::Exists(namespc, new_path) == Directory::EXISTS) &&
- (GetType(namespc, new_path, false) == kIsLink)) {
+ if ((Directory::Exists(namespc, prefixed_new_path) == Directory::EXISTS) &&
+ (GetType(namespc, prefixed_new_path, false) == kIsLink)) {
// Bail out if the DeleteLink call fails.
- if (!DeleteLink(namespc, new_path)) {
+ if (!DeleteLink(namespc, prefixed_new_path)) {
return false;
}
}
@@ -615,24 +762,26 @@
bool File::Copy(Namespace* namespc,
const char* old_path,
const char* new_path) {
- File::Type type = GetType(namespc, old_path, false);
+ const char* prefixed_old_path = PrefixLongFilePath(old_path);
+ const char* prefixed_new_path = PrefixLongFilePath(new_path);
+ File::Type type = GetType(namespc, prefixed_old_path, false);
if (type != kIsFile) {
SetLastError(ERROR_FILE_NOT_FOUND);
return false;
}
- wchar_t* temp_file = CopyIntoTempFile(old_path, new_path);
+ wchar_t* temp_file = CopyIntoTempFile(prefixed_old_path, prefixed_new_path);
if (temp_file == NULL) {
// If temp file creation fails, fall back on doing a direct copy.
- Utf8ToWideScope system_old_path(old_path);
- Utf8ToWideScope system_new_path(new_path);
+ Utf8ToWideScope system_old_path(prefixed_old_path);
+ Utf8ToWideScope system_new_path(prefixed_new_path);
return CopyFileExW(system_old_path.wide(), system_new_path.wide(), NULL,
NULL, NULL, 0) != 0;
}
- Utf8ToWideScope system_new_dest(new_path);
+ Utf8ToWideScope system_new_dest(prefixed_new_path);
// Remove the existing file. Otherwise, renaming will fail.
- if (Exists(namespc, new_path)) {
+ if (Exists(namespc, prefixed_new_path)) {
DeleteFileW(system_new_dest.wide());
}
@@ -647,7 +796,7 @@
int64_t File::LengthFromPath(Namespace* namespc, const char* name) {
struct __stat64 st;
- Utf8ToWideScope system_name(name);
+ Utf8ToWideScope system_name(PrefixLongFilePath(name));
if (!StatHelper(system_name.wide(), &st)) {
return -1;
}
@@ -658,7 +807,8 @@
const char* pathname,
char* dest,
int dest_size) {
- const wchar_t* name = StringUtilsWin::Utf8ToWide(pathname);
+ const wchar_t* name =
+ StringUtilsWin::Utf8ToWide(PrefixLongFilePath(pathname));
HANDLE dir_handle = CreateFileW(
name, GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
@@ -668,8 +818,10 @@
return NULL;
}
+ // Allocate a buffer for regular paths (smaller than MAX_PATH). If buffer is
+ // too small for a long path, allocate a bigger buffer and try again.
int buffer_size =
- sizeof(REPARSE_DATA_BUFFER) + 2 * (MAX_PATH + 1) * sizeof(WCHAR);
+ sizeof(REPARSE_DATA_BUFFER) + (MAX_PATH + 1) * sizeof(WCHAR);
REPARSE_DATA_BUFFER* buffer =
reinterpret_cast<REPARSE_DATA_BUFFER*>(Dart_ScopeAllocate(buffer_size));
DWORD received_bytes; // Value is not used.
@@ -677,9 +829,26 @@
buffer, buffer_size, &received_bytes, NULL);
if (result == 0) {
DWORD error = GetLastError();
- CloseHandle(dir_handle);
- SetLastError(error);
- return NULL;
+ // If ERROR_MORE_DATA is thrown, the target path exceeds the size limit. A
+ // bigger buffer will be required.
+ if (error == ERROR_MORE_DATA) {
+ // Allocate a bigger buffer with MAX_LONG_PATH
+ buffer_size =
+ sizeof(REPARSE_DATA_BUFFER) + (MAX_LONG_PATH + 1) * sizeof(WCHAR);
+ buffer = reinterpret_cast<REPARSE_DATA_BUFFER*>(
+ Dart_ScopeAllocate(buffer_size));
+ result = DeviceIoControl(dir_handle, FSCTL_GET_REPARSE_POINT, NULL, 0,
+ buffer, buffer_size, &received_bytes, NULL);
+ if (result == 0) {
+ // Overwrite the ERROR_MORE_DATA.
+ error = GetLastError();
+ }
+ }
+ if (result == 0) {
+ CloseHandle(dir_handle);
+ SetLastError(error);
+ return NULL;
+ }
}
if (CloseHandle(dir_handle) == 0) {
return NULL;
@@ -726,11 +895,12 @@
}
void File::Stat(Namespace* namespc, const char* name, int64_t* data) {
- File::Type type = GetType(namespc, name, false);
+ const char* prefixed_name = PrefixLongFilePath(name);
+ File::Type type = GetType(namespc, prefixed_name, false);
data[kType] = type;
if (type != kDoesNotExist) {
struct _stat64 st;
- Utf8ToWideScope system_name(name);
+ Utf8ToWideScope system_name(prefixed_name);
int stat_status = _wstat64(system_name.wide(), &st);
if (stat_status == 0) {
data[kCreatedTime] = st.st_ctime * 1000;
@@ -746,7 +916,7 @@
time_t File::LastAccessed(Namespace* namespc, const char* name) {
struct __stat64 st;
- Utf8ToWideScope system_name(name);
+ Utf8ToWideScope system_name(PrefixLongFilePath(name));
if (!StatHelper(system_name.wide(), &st)) {
return -1;
}
@@ -755,7 +925,7 @@
time_t File::LastModified(Namespace* namespc, const char* name) {
struct __stat64 st;
- Utf8ToWideScope system_name(name);
+ Utf8ToWideScope system_name(PrefixLongFilePath(name));
if (!StatHelper(system_name.wide(), &st)) {
return -1;
}
@@ -767,7 +937,7 @@
int64_t millis) {
// First get the current times.
struct __stat64 st;
- Utf8ToWideScope system_name(name);
+ Utf8ToWideScope system_name(PrefixLongFilePath(name));
if (!StatHelper(system_name.wide(), &st)) {
return false;
}
@@ -784,7 +954,7 @@
int64_t millis) {
// First get the current times.
struct __stat64 st;
- Utf8ToWideScope system_name(name);
+ Utf8ToWideScope system_name(PrefixLongFilePath(name));
if (!StatHelper(system_name.wide(), &st)) {
return false;
}
@@ -801,7 +971,6 @@
bool File::IsAbsolutePath(const char* pathname) {
if (pathname == NULL) return false;
char first = pathname[0];
- if (pathname == 0) return false;
char second = pathname[1];
if (first == '\\' && second == '\\') return true;
if (second != ':') return false;
@@ -814,7 +983,7 @@
const char* pathname,
char* dest,
int dest_size) {
- Utf8ToWideScope system_name(pathname);
+ Utf8ToWideScope system_name(PrefixLongFilePath(pathname));
HANDLE file_handle =
CreateFileW(system_name.wide(), 0, FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS, NULL);
@@ -838,9 +1007,8 @@
// Remove leading \\?\ if possible, unless input used it.
int offset = 0;
- if ((result_size < MAX_PATH - 1 + 4) && (result_size > 4) &&
- (wcsncmp(path.get(), L"\\\\?\\", 4) == 0) &&
- (wcsncmp(system_name.wide(), L"\\\\?\\", 4) != 0)) {
+ if ((result_size > 4) && (wcsncmp(path.get(), L"\\\\?\\", 4) == 0) &&
+ (strncmp(pathname, "\\\\?\\", 4) != 0)) {
offset = 4;
}
int utf8_size = WideCharToMultiByte(CP_UTF8, 0, path.get() + offset, -1,
@@ -878,8 +1046,13 @@
File::Type File::GetType(Namespace* namespc,
const char* pathname,
bool follow_links) {
+ // File::GetType can be called without scope(when launching isolate),
+ // so it mallocs prefixed path.
+ StringRAII string_raii = PrefixLongFilePathNoScope(pathname);
+ const char* prefixed_path = string_raii.str();
+
// Convert to wchar_t string.
- Utf8ToWideScope name(pathname);
+ Utf8ToWideScope name(prefixed_path);
DWORD attributes = GetFileAttributesW(name.wide());
File::Type result = kIsFile;
if (attributes == INVALID_FILE_ATTRIBUTES) {
@@ -919,7 +1092,8 @@
USE(namespc_1);
USE(namespc_2);
BY_HANDLE_FILE_INFORMATION file_info[2];
- const char* file_names[2] = {file_1, file_2};
+ const char* file_names[2] = {PrefixLongFilePath(file_1),
+ PrefixLongFilePath(file_2)};
for (int i = 0; i < 2; ++i) {
Utf8ToWideScope wide_name(file_names[i]);
HANDLE file_handle = CreateFileW(
diff --git a/runtime/bin/file_win.h b/runtime/bin/file_win.h
new file mode 100644
index 0000000..ef5f732
--- /dev/null
+++ b/runtime/bin/file_win.h
@@ -0,0 +1,22 @@
+// 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.
+
+#ifndef RUNTIME_BIN_FILE_WIN_H_
+#define RUNTIME_BIN_FILE_WIN_H_
+
+#include "bin/file.h"
+
+// The limit for a regular directory is 248.
+// Reference: https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#maximum-path-length-limitation
+#define MAX_DIRECTORY_PATH (MAX_PATH - 12)
+
+namespace dart {
+namespace bin {
+
+const char* PrefixLongDirectoryPath(const char* path);
+
+} // namespace bin
+} // namespace dart
+
+#endif // RUNTIME_BIN_FILE_WIN_H_
diff --git a/runtime/bin/io_natives.cc b/runtime/bin/io_natives.cc
index 6c36240..9730817 100644
--- a/runtime/bin/io_natives.cc
+++ b/runtime/bin/io_natives.cc
@@ -117,7 +117,9 @@
V(SecureSocket_Destroy, 1) \
V(SecureSocket_FilterPointer, 1) \
V(SecureSocket_GetSelectedProtocol, 1) \
- V(SecureSocket_Handshake, 1) \
+ V(SecureSocket_Handshake, 2) \
+ V(SecureSocket_MarkAsTrusted, 3) \
+ V(SecureSocket_NewX509CertificateWrapper, 1) \
V(SecureSocket_Init, 1) \
V(SecureSocket_PeerCertificate, 1) \
V(SecureSocket_RegisterBadCertificateCallback, 2) \
diff --git a/runtime/bin/namespace_win.cc b/runtime/bin/namespace_win.cc
index f31d37a1d..09a05f5 100644
--- a/runtime/bin/namespace_win.cc
+++ b/runtime/bin/namespace_win.cc
@@ -10,6 +10,8 @@
#include <errno.h>
#include <sys/stat.h>
+#include "bin/file.h"
+#include "bin/file_win.h"
#include "bin/utils.h"
#include "bin/utils_win.h"
@@ -46,6 +48,9 @@
}
bool Namespace::SetCurrent(Namespace* namespc, const char* path) {
+ // TODO(zichangguo): "\\?\" prepended long path doesn't work.
+ // https://github.com/dart-lang/sdk/issues/42416
+ path = PrefixLongDirectoryPath(path);
Utf8ToWideScope system_path(path);
bool result = SetCurrentDirectoryW(system_path.wide()) != 0;
return result;
diff --git a/runtime/bin/process_fuchsia.cc b/runtime/bin/process_fuchsia.cc
index 495eceb..f5495d8 100644
--- a/runtime/bin/process_fuchsia.cc
+++ b/runtime/bin/process_fuchsia.cc
@@ -625,7 +625,8 @@
LOG_INFO("ProcessStarter: Start() Calling fdio_spawn_vmo\n");
zx_handle_t process = ZX_HANDLE_INVALID;
char err_msg[FDIO_SPAWN_ERR_MSG_MAX_LENGTH];
- uint32_t flags = FDIO_SPAWN_CLONE_JOB | FDIO_SPAWN_DEFAULT_LDSVC;
+ uint32_t flags = FDIO_SPAWN_CLONE_JOB | FDIO_SPAWN_DEFAULT_LDSVC |
+ FDIO_SPAWN_CLONE_UTC_CLOCK;
status = fdio_spawn_vmo(ZX_HANDLE_INVALID, flags, vmo, program_arguments_,
program_environment_, actions_count, actions,
&process, err_msg);
diff --git a/runtime/bin/secure_socket_filter.cc b/runtime/bin/secure_socket_filter.cc
index 207971f..c7a89a5 100644
--- a/runtime/bin/secure_socket_filter.cc
+++ b/runtime/bin/secure_socket_filter.cc
@@ -32,6 +32,7 @@
// To protect library initialization.
Mutex* SSLFilter::mutex_ = nullptr;
int SSLFilter::filter_ssl_index;
+int SSLFilter::ssl_cert_context_index;
void SSLFilter::Init() {
ASSERT(SSLFilter::mutex_ == nullptr);
@@ -143,7 +144,26 @@
}
void FUNCTION_NAME(SecureSocket_Handshake)(Dart_NativeArguments args) {
- GetFilter(args)->Handshake();
+ Dart_Handle port = ThrowIfError(Dart_GetNativeArgument(args, 1));
+ ASSERT(!Dart_IsNull(port));
+
+ Dart_Port port_id;
+ ThrowIfError(Dart_SendPortGetId(port, &port_id));
+ int result = GetFilter(args)->Handshake(port_id);
+ Dart_SetReturnValue(args, Dart_NewInteger(result));
+}
+
+void FUNCTION_NAME(SecureSocket_MarkAsTrusted)(Dart_NativeArguments args) {
+ GetFilter(args)->MarkAsTrusted(args);
+}
+
+void FUNCTION_NAME(SecureSocket_NewX509CertificateWrapper)(
+ Dart_NativeArguments args) {
+ intptr_t x509_pointer = DartUtils::GetNativeIntptrArgument(args, 0);
+ ASSERT(x509_pointer != 0);
+ X509* x509 = reinterpret_cast<X509*>(x509_pointer);
+ X509_up_ref(x509);
+ Dart_SetReturnValue(args, X509Helper::WrappedX509Certificate(x509));
}
void FUNCTION_NAME(SecureSocket_GetSelectedProtocol)(
@@ -447,6 +467,8 @@
SSL_library_init();
filter_ssl_index = SSL_get_ex_new_index(0, NULL, NULL, NULL, NULL);
ASSERT(filter_ssl_index >= 0);
+ ssl_cert_context_index = SSL_get_ex_new_index(0, NULL, NULL, NULL, NULL);
+ ASSERT(ssl_cert_context_index >= 0);
library_initialized_ = true;
}
}
@@ -477,7 +499,15 @@
SSL_set_mode(ssl_, SSL_MODE_AUTO_RETRY); // TODO(whesse): Is this right?
SSL_set_ex_data(ssl_, filter_ssl_index, this);
context->RegisterCallbacks(ssl_);
+ SSL_set_ex_data(ssl_, ssl_cert_context_index, context);
+ TrustEvaluateHandlerFunc trust_evaluate_handler =
+ context->GetTrustEvaluateHandler();
+ if (trust_evaluate_handler != nullptr) {
+ trust_evaluate_reply_port_ = Dart_NewNativePort(
+ "SSLCertContextTrustEvaluate", trust_evaluate_handler,
+ /*handle_concurrently=*/false);
+ }
if (is_server_) {
int certificate_mode =
request_client_certificate ? SSL_VERIFY_PEER : SSL_VERIFY_NONE;
@@ -529,13 +559,37 @@
}
}
}
- Handshake();
+ // We don't expect certificate evaluation on first attempt,
+ // we expect requests for more bytes, therefore we could get away
+ // with passing illegal port.
+ Handshake(ILLEGAL_PORT);
}
-void SSLFilter::Handshake() {
+void SSLFilter::MarkAsTrusted(Dart_NativeArguments args) {
+ intptr_t certificate_pointer = DartUtils::GetNativeIntptrArgument(args, 1);
+ ASSERT(certificate_pointer != 0);
+ certificate_trust_state_.reset(
+ new X509TrustState(reinterpret_cast<X509*>(certificate_pointer),
+ DartUtils::GetNativeBooleanArgument(args, 2)));
+ if (SSL_LOG_STATUS) {
+ Syslog::Print("Mark %p as %strusted certificate\n",
+ certificate_trust_state_.get()->x509(),
+ certificate_trust_state_.get()->is_trusted() ? "" : "not ");
+ }
+}
+
+int SSLFilter::Handshake(Dart_Port reply_port) {
+ // Set reply port to be used by CertificateVerificationCallback
+ // invoked by SSL_do_handshake: this is where results of
+ // certificate evaluation will be communicated to.
+ reply_port_ = reply_port;
+
// Try and push handshake along.
- int status;
- status = SSL_do_handshake(ssl_);
+ int status = SSL_do_handshake(ssl_);
+ int error = SSL_get_error(ssl_, status);
+ if (error == SSL_ERROR_WANT_CERTIFICATE_VERIFY) {
+ return SSL_ERROR_WANT_CERTIFICATE_VERIFY;
+ }
if (callback_error != NULL) {
// The SSL_do_handshake will try performing a handshake and might call
// a CertificateCallback. If the certificate validation
@@ -545,7 +599,7 @@
}
if (SSL_want_write(ssl_) || SSL_want_read(ssl_)) {
in_handshake_ = true;
- return;
+ return error;
}
SecureSocketUtils::CheckStatusSSL(
status, "HandshakeException",
@@ -572,6 +626,8 @@
Dart_HandleFromPersistent(handshake_complete_), 0, NULL));
in_handshake_ = false;
}
+
+ return error;
}
void SSLFilter::GetSelectedProtocol(Dart_NativeArguments args) {
@@ -644,6 +700,10 @@
Dart_DeletePersistentHandle(bad_certificate_callback_);
bad_certificate_callback_ = NULL;
}
+ if (trust_evaluate_reply_port_ != ILLEGAL_PORT) {
+ Dart_CloseNativePort(trust_evaluate_reply_port_);
+ trust_evaluate_reply_port_ = ILLEGAL_PORT;
+ }
FreeResources();
}
diff --git a/runtime/bin/secure_socket_filter.h b/runtime/bin/secure_socket_filter.h
index 70ad32e..826e28f 100644
--- a/runtime/bin/secure_socket_filter.h
+++ b/runtime/bin/secure_socket_filter.h
@@ -9,6 +9,8 @@
#include <openssl/ssl.h>
#include <openssl/x509.h>
+#include <memory>
+
#include "bin/builtin.h"
#include "bin/reference_counting.h"
#include "bin/security_context.h"
@@ -21,6 +23,21 @@
extern const unsigned char* root_certificates_pem;
extern unsigned int root_certificates_pem_length;
+class X509TrustState {
+ public:
+ X509TrustState(const X509* x509, bool is_trusted)
+ : x509_(x509), is_trusted_(is_trusted) {}
+
+ const X509* x509() const { return x509_; }
+ bool is_trusted() const { return is_trusted_; }
+
+ private:
+ const X509* x509_;
+ bool is_trusted_;
+
+ DISALLOW_COPY_AND_ASSIGN(X509TrustState);
+};
+
class SSLFilter : public ReferenceCounted<SSLFilter> {
public:
static void Init();
@@ -65,7 +82,8 @@
Dart_Handle protocols_handle);
void Destroy();
void FreeResources();
- void Handshake();
+ void MarkAsTrusted(Dart_NativeArguments args);
+ int Handshake(Dart_Port reply_port);
void GetSelectedProtocol(Dart_NativeArguments args);
void Renegotiate(bool use_session_cache,
bool request_client_certificate,
@@ -90,6 +108,17 @@
// The index of the external data field in _ssl that points to the SSLFilter.
static int filter_ssl_index;
+ // The index of the external data field in _ssl that points to the
+ // SSLCertContext.
+ static int ssl_cert_context_index;
+
+ const X509TrustState* certificate_trust_state() {
+ return certificate_trust_state_.get();
+ }
+ Dart_Port reply_port() const { return reply_port_; }
+ Dart_Port trust_evaluate_reply_port() const {
+ return trust_evaluate_reply_port_;
+ }
private:
static const intptr_t kInternalBIOSize;
@@ -98,6 +127,9 @@
SSL* ssl_;
BIO* socket_side_;
+ // Currently only one(root) certificate is evaluated via
+ // TrustEvaluate mechanism.
+ std::unique_ptr<X509TrustState> certificate_trust_state_;
uint8_t* buffers_[kNumBuffers];
int buffer_size_;
@@ -111,6 +143,9 @@
bool is_server_;
char* hostname_;
+ Dart_Port reply_port_ = ILLEGAL_PORT;
+ Dart_Port trust_evaluate_reply_port_ = ILLEGAL_PORT;
+
static bool IsBufferEncrypted(int i) {
return static_cast<BufferIndex>(i) >= kFirstEncrypted;
}
diff --git a/runtime/bin/secure_socket_unsupported.cc b/runtime/bin/secure_socket_unsupported.cc
index 6a72909..8d2b2fc 100644
--- a/runtime/bin/secure_socket_unsupported.cc
+++ b/runtime/bin/secure_socket_unsupported.cc
@@ -36,6 +36,17 @@
"Secure Sockets unsupported on this platform"));
}
+void FUNCTION_NAME(SecureSocket_MarkAsTrusted)(Dart_NativeArguments args) {
+ Dart_ThrowException(DartUtils::NewDartArgumentError(
+ "Secure Sockets unsupported on this platform"));
+}
+
+void FUNCTION_NAME(SecureSocket_NewX509CertificateWrapper)(
+ Dart_NativeArguments args) {
+ Dart_ThrowException(DartUtils::NewDartArgumentError(
+ "Secure Sockets unsupported on this platform"));
+}
+
void FUNCTION_NAME(SecureSocket_GetSelectedProtocol)(
Dart_NativeArguments args) {
Dart_ThrowException(DartUtils::NewDartArgumentError(
diff --git a/runtime/bin/security_context.h b/runtime/bin/security_context.h
index 8c37365..206a859 100644
--- a/runtime/bin/security_context.h
+++ b/runtime/bin/security_context.h
@@ -18,6 +18,9 @@
// Forward declaration
class SSLFilter;
+typedef void (*TrustEvaluateHandlerFunc)(Dart_Port dest_port_id,
+ Dart_CObject* message);
+
class SSLCertContext : public ReferenceCounted<SSLCertContext> {
public:
static const intptr_t kApproximateSize;
@@ -83,6 +86,7 @@
void set_trust_builtin(bool trust_builtin) { trust_builtin_ = trust_builtin; }
void RegisterCallbacks(SSL* ssl);
+ TrustEvaluateHandlerFunc GetTrustEvaluateHandler() const;
private:
void AddCompiledInCerts();
diff --git a/runtime/bin/security_context_android.cc b/runtime/bin/security_context_android.cc
index d474999..e0e9378 100644
--- a/runtime/bin/security_context_android.cc
+++ b/runtime/bin/security_context_android.cc
@@ -57,6 +57,10 @@
// verification mechanism.
}
+TrustEvaluateHandlerFunc SSLCertContext::GetTrustEvaluateHandler() const {
+ return nullptr;
+}
+
} // namespace bin
} // namespace dart
diff --git a/runtime/bin/security_context_fuchsia.cc b/runtime/bin/security_context_fuchsia.cc
index f66500e..e8f2f7a 100644
--- a/runtime/bin/security_context_fuchsia.cc
+++ b/runtime/bin/security_context_fuchsia.cc
@@ -50,6 +50,10 @@
// verification mechanism.
}
+TrustEvaluateHandlerFunc SSLCertContext::GetTrustEvaluateHandler() const {
+ return nullptr;
+}
+
} // namespace bin
} // namespace dart
diff --git a/runtime/bin/security_context_linux.cc b/runtime/bin/security_context_linux.cc
index 8ca9049..e4a9312 100644
--- a/runtime/bin/security_context_linux.cc
+++ b/runtime/bin/security_context_linux.cc
@@ -70,6 +70,10 @@
// verification mechanism.
}
+TrustEvaluateHandlerFunc SSLCertContext::GetTrustEvaluateHandler() const {
+ return nullptr;
+}
+
} // namespace bin
} // namespace dart
diff --git a/runtime/bin/security_context_macos.cc b/runtime/bin/security_context_macos.cc
index ea642aa..c130b6a 100644
--- a/runtime/bin/security_context_macos.cc
+++ b/runtime/bin/security_context_macos.cc
@@ -102,36 +102,110 @@
return SecCertificateCreateWithData(NULL, cert_buf.get());
}
-static int CertificateVerificationCallback(X509_STORE_CTX* ctx, void* arg) {
- SSLCertContext* context = static_cast<SSLCertContext*>(arg);
+static ssl_verify_result_t CertificateVerificationCallback(SSL* ssl,
+ uint8_t* out_alert) {
+ SSLFilter* filter = static_cast<SSLFilter*>(
+ SSL_get_ex_data(ssl, SSLFilter::filter_ssl_index));
+
+ const X509TrustState* certificate_trust_state =
+ filter->certificate_trust_state();
+ if (certificate_trust_state != nullptr) {
+ // Callback have been previously called to explicitly evaluate root_cert.
+ STACK_OF(X509)* unverified = sk_X509_dup(SSL_get_peer_full_cert_chain(ssl));
+ X509* root_cert = nullptr;
+ for (uintptr_t i = sk_X509_num(unverified); i > 0; i--) {
+ root_cert = sk_X509_shift(unverified);
+ if (root_cert == nullptr) {
+ break;
+ }
+ }
+ if (certificate_trust_state->x509() == root_cert) {
+ return certificate_trust_state->is_trusted() ? ssl_verify_ok
+ : ssl_verify_invalid;
+ }
+ }
+
+ Dart_CObject dart_cobject_ssl;
+ dart_cobject_ssl.type = Dart_CObject_kInt64;
+ dart_cobject_ssl.value.as_int64 = reinterpret_cast<intptr_t>(ssl);
+
+ Dart_CObject reply_send_port;
+ reply_send_port.type = Dart_CObject_kSendPort;
+ reply_send_port.value.as_send_port.id = filter->reply_port();
+
+ Dart_CObject array;
+ array.type = Dart_CObject_kArray;
+ array.value.as_array.length = 2;
+ Dart_CObject* values[] = {&dart_cobject_ssl, &reply_send_port};
+ array.value.as_array.values = values;
+
+ Dart_PostCObject(filter->trust_evaluate_reply_port(), &array);
+ return ssl_verify_retry;
+}
+
+static void postReply(Dart_Port reply_port_id,
+ bool success,
+ X509* certificate = nullptr) {
+ Dart_CObject dart_cobject_success;
+ dart_cobject_success.type = Dart_CObject_kBool;
+ dart_cobject_success.value.as_bool = success;
+
+ Dart_CObject dart_cobject_certificate;
+ dart_cobject_certificate.type = Dart_CObject_kInt64;
+ dart_cobject_certificate.value.as_int64 =
+ reinterpret_cast<intptr_t>(certificate);
+
+ Dart_CObject array;
+ array.type = Dart_CObject_kArray;
+ array.value.as_array.length = 2;
+ Dart_CObject* values[] = {&dart_cobject_success, &dart_cobject_certificate};
+ array.value.as_array.values = values;
+
+ Dart_PostCObject(reply_port_id, &array);
+}
+
+static void TrustEvaluateHandler(Dart_Port dest_port_id,
+ Dart_CObject* message) {
+ CObjectArray request(message);
+ ASSERT(request.Length() == 2);
+
+ CObjectIntptr ssl_cobject(request[0]);
+ SSL* ssl = reinterpret_cast<SSL*>(ssl_cobject.Value());
+ SSLFilter* filter = static_cast<SSLFilter*>(
+ SSL_get_ex_data(ssl, SSLFilter::filter_ssl_index));
+ SSLCertContext* context = static_cast<SSLCertContext*>(
+ SSL_get_ex_data(ssl, SSLFilter::ssl_cert_context_index));
+ CObjectSendPort reply_port(request[1]);
+ Dart_Port reply_port_id = reply_port.Value();
+
+ STACK_OF(X509)* unverified = sk_X509_dup(SSL_get_peer_full_cert_chain(ssl));
// Convert BoringSSL formatted certificates to SecCertificate certificates.
ScopedCFMutableArrayRef cert_chain(NULL);
X509* root_cert = NULL;
- if (ctx->untrusted != NULL) {
- STACK_OF(X509)* user_provided_certs = ctx->untrusted;
- int num_certs = sk_X509_num(user_provided_certs);
- int current_cert = 0;
- cert_chain.set(CFArrayCreateMutable(NULL, num_certs, NULL));
- X509* ca;
- while ((ca = sk_X509_shift(user_provided_certs)) != NULL) {
- ScopedSecCertificateRef cert(CreateSecCertificateFromX509(ca));
- if (cert == NULL) {
- return ctx->verify_cb(0, ctx);
- }
- CFArrayAppendValue(cert_chain.get(), cert.release());
- ++current_cert;
+ int num_certs = sk_X509_num(unverified);
+ int current_cert = 0;
+ cert_chain.set(CFArrayCreateMutable(NULL, num_certs, NULL));
+ X509* ca;
+ while ((ca = sk_X509_shift(unverified)) != NULL) {
+ ScopedSecCertificateRef cert(CreateSecCertificateFromX509(ca));
+ if (cert == NULL) {
+ postReply(reply_port_id, /*success=*/false);
+ return;
+ }
+ CFArrayAppendValue(cert_chain.get(), cert.release());
+ ++current_cert;
- if (current_cert == num_certs) {
- root_cert = ca;
- }
+ if (current_cert == num_certs) {
+ root_cert = ca;
}
}
+ SSL_CTX* ssl_ctx = SSL_get_SSL_CTX(ssl);
+ X509_STORE* store = SSL_CTX_get_cert_store(ssl_ctx);
// Convert all trusted certificates provided by the user via
// setTrustedCertificatesBytes or the command line into SecCertificates.
ScopedCFMutableArrayRef trusted_certs(CFArrayCreateMutable(NULL, 0, NULL));
- X509_STORE* store = ctx->ctx;
ASSERT(store != NULL);
if (store->objs != NULL) {
@@ -139,17 +213,14 @@
X509* ca = sk_X509_OBJECT_value(store->objs, i)->data.x509;
ScopedSecCertificateRef cert(CreateSecCertificateFromX509(ca));
if (cert == NULL) {
- return ctx->verify_cb(0, ctx);
+ postReply(reply_port_id, /*success=*/false);
+ return;
}
CFArrayAppendValue(trusted_certs.get(), cert.release());
}
}
// Generate a policy for validating chains for SSL.
- const int ssl_index = SSL_get_ex_data_X509_STORE_CTX_idx();
- SSL* ssl = static_cast<SSL*>(X509_STORE_CTX_get_ex_data(ctx, ssl_index));
- SSLFilter* filter = static_cast<SSLFilter*>(
- SSL_get_ex_data(ssl, SSLFilter::filter_ssl_index));
CFStringRef cfhostname = NULL;
if (filter->hostname() != NULL) {
cfhostname = CFStringCreateWithCString(NULL, filter->hostname(),
@@ -164,7 +235,8 @@
OSStatus status = SecTrustCreateWithCertificates(cert_chain.get(),
policy.get(), trust.ptr());
if (status != noErr) {
- return ctx->verify_cb(0, ctx);
+ postReply(reply_port_id, /*success=*/false);
+ return;
}
// If the user provided any additional CA certificates, add them to the trust
@@ -172,7 +244,8 @@
if (CFArrayGetCount(trusted_certs.get()) > 0) {
status = SecTrustSetAnchorCertificates(trust.get(), trusted_certs.get());
if (status != noErr) {
- return ctx->verify_cb(0, ctx);
+ postReply(reply_port_id, /*success=*/false);
+ return;
}
}
@@ -181,7 +254,8 @@
status =
SecTrustSetAnchorCertificatesOnly(trust.get(), !context->trust_builtin());
if (status != noErr) {
- return ctx->verify_cb(0, ctx);
+ postReply(reply_port_id, /*success=*/false);
+ return;
}
SecTrustResultType trust_result;
@@ -199,29 +273,23 @@
USE(res);
status = SecTrustGetTrustResult(trust.get(), &trust_result);
#else
+
// SecTrustEvaluate is deprecated as of OSX 10.15 and iOS 13.
status = SecTrustEvaluate(trust.get(), &trust_result);
#endif
- if (status != noErr) {
- return ctx->verify_cb(0, ctx);
- }
-
- if ((trust_result == kSecTrustResultProceed) ||
- (trust_result == kSecTrustResultUnspecified)) {
- // Successfully verified certificate!
- return ctx->verify_cb(1, ctx);
- }
-
- // Set current_cert to the root of the certificate chain. This will be passed
- // to the callback provided by the user for additional verification steps.
- ctx->current_cert = root_cert;
- return ctx->verify_cb(0, ctx);
+ postReply(reply_port_id,
+ status == noErr && (trust_result == kSecTrustResultProceed ||
+ trust_result == kSecTrustResultUnspecified),
+ root_cert);
}
void SSLCertContext::RegisterCallbacks(SSL* ssl) {
- SSL_CTX* ctx = SSL_get_SSL_CTX(ssl);
- SSL_CTX_set_cert_verify_callback(ctx, CertificateVerificationCallback, this);
+ SSL_set_custom_verify(ssl, SSL_VERIFY_PEER, CertificateVerificationCallback);
+}
+
+TrustEvaluateHandlerFunc SSLCertContext::GetTrustEvaluateHandler() const {
+ return &TrustEvaluateHandler;
}
void SSLCertContext::TrustBuiltinRoots() {
diff --git a/runtime/bin/security_context_win.cc b/runtime/bin/security_context_win.cc
index 95673ca..1b49292 100644
--- a/runtime/bin/security_context_win.cc
+++ b/runtime/bin/security_context_win.cc
@@ -134,6 +134,10 @@
// verification mechanism.
}
+TrustEvaluateHandlerFunc SSLCertContext::GetTrustEvaluateHandler() const {
+ return nullptr;
+}
+
} // namespace bin
} // namespace dart
diff --git a/runtime/bin/utils_win.h b/runtime/bin/utils_win.h
index fdb4909..0e4fae9 100644
--- a/runtime/bin/utils_win.h
+++ b/runtime/bin/utils_win.h
@@ -9,6 +9,8 @@
#include "platform/utils.h"
+#define MAX_LONG_PATH 32767
+
namespace dart {
namespace bin {
diff --git a/runtime/observatory/tests/service/get_isolate_rpc_test.dart b/runtime/observatory/tests/service/get_isolate_rpc_test.dart
index adffeb7..4e79317 100644
--- a/runtime/observatory/tests/service/get_isolate_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_isolate_rpc_test.dart
@@ -16,6 +16,8 @@
expect(result['type'], equals('Isolate'));
expect(result['id'], startsWith('isolates/'));
expect(result['number'], isA<String>());
+ expect(result['isolateFlags'], isA<List>());
+ expect(result['isolateFlags'].length, isPositive);
expect(result['isSystemIsolate'], isFalse);
expect(result['_originNumber'], equals(result['number']));
expect(result['startTime'], isPositive);
diff --git a/runtime/observatory/tests/service/get_version_rpc_test.dart b/runtime/observatory/tests/service/get_version_rpc_test.dart
index 8e949ec..8b56393 100644
--- a/runtime/observatory/tests/service/get_version_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_version_rpc_test.dart
@@ -12,7 +12,7 @@
var result = await vm.invokeRpcNoUpgrade('getVersion', {});
expect(result['type'], equals('Version'));
expect(result['major'], equals(3));
- expect(result['minor'], equals(39));
+ expect(result['minor'], equals(40));
expect(result['_privateMajor'], equals(0));
expect(result['_privateMinor'], equals(0));
},
diff --git a/runtime/tests/vm/dart/regress_43464_test.dart b/runtime/tests/vm/dart/regress_43464_test.dart
new file mode 100644
index 0000000..43a3c113
--- /dev/null
+++ b/runtime/tests/vm/dart/regress_43464_test.dart
@@ -0,0 +1,21 @@
+// 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:expect/expect.dart';
+
+class A {}
+
+abstract class B<T> {
+ dynamic foo(T a);
+}
+
+class C extends B<A> {
+ dynamic foo(A a) {
+ return () => a;
+ }
+}
+
+main() {
+ Expect.throws(() => (C().foo as dynamic)(1));
+}
diff --git a/runtime/tests/vm/dart/thread_priority_macos_test.dart b/runtime/tests/vm/dart/thread_priority_macos_test.dart
index b466eb0..b7c8280 100644
--- a/runtime/tests/vm/dart/thread_priority_macos_test.dart
+++ b/runtime/tests/vm/dart/thread_priority_macos_test.dart
@@ -29,7 +29,7 @@
// struct sched_param { int sched_priority; }
class SchedParam extends Struct {
@Int32()
- int schedPriority;
+ external int schedPriority;
}
main(args) {
diff --git a/runtime/tests/vm/dart_2/regress_43464_test.dart b/runtime/tests/vm/dart_2/regress_43464_test.dart
new file mode 100644
index 0000000..43a3c113
--- /dev/null
+++ b/runtime/tests/vm/dart_2/regress_43464_test.dart
@@ -0,0 +1,21 @@
+// 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:expect/expect.dart';
+
+class A {}
+
+abstract class B<T> {
+ dynamic foo(T a);
+}
+
+class C extends B<A> {
+ dynamic foo(A a) {
+ return () => a;
+ }
+}
+
+main() {
+ Expect.throws(() => (C().foo as dynamic)(1));
+}
diff --git a/runtime/vm/compiler/backend/type_propagator.cc b/runtime/vm/compiler/backend/type_propagator.cc
index 6c35a83..3877f45 100644
--- a/runtime/vm/compiler/backend/type_propagator.cc
+++ b/runtime/vm/compiler/backend/type_propagator.cc
@@ -1405,6 +1405,12 @@
}
CompileType LoadLocalInstr::ComputeType() const {
+ if (local().needs_covariant_check_in_method()) {
+ // We may not yet have checked the actual type of the parameter value.
+ // Assuming that the value has the required type can lead to unsound
+ // optimizations. See dartbug.com/43464.
+ return CompileType::FromCid(kDynamicCid);
+ }
const AbstractType& local_type = local().type();
TraceStrongModeType(this, local_type);
return CompileType::FromAbstractType(local_type);
diff --git a/runtime/vm/compiler/backend/typed_data_aot_test.cc b/runtime/vm/compiler/backend/typed_data_aot_test.cc
index d978e86..30d58db 100644
--- a/runtime/vm/compiler/backend/typed_data_aot_test.cc
+++ b/runtime/vm/compiler/backend/typed_data_aot_test.cc
@@ -451,6 +451,61 @@
}
}
+ISOLATE_UNIT_TEST_CASE(IRTest_TypedDataAOT_Regress43534) {
+ const char* kScript =
+ R"(
+ import 'dart:typed_data';
+
+ @pragma('vm:never-inline')
+ void callWith<T>(void Function(T arg) fun, T arg) {
+ fun(arg);
+ }
+
+ void test() {
+ callWith<Uint8List>((Uint8List list) {
+ if (list[0] != 0) throw 'a';
+ }, Uint8List(10));
+ }
+ )";
+
+ const auto& root_library = Library::Handle(LoadTestScript(kScript));
+ Invoke(root_library, "test");
+ const auto& test_function =
+ Function::Handle(GetFunction(root_library, "test"));
+ const auto& closures = GrowableObjectArray::Handle(
+ Isolate::Current()->object_store()->closure_functions());
+ auto& function = Function::Handle();
+ for (intptr_t i = closures.Length() - 1; 0 <= i; ++i) {
+ function ^= closures.At(i);
+ if (function.parent_function() == test_function.raw()) {
+ break;
+ }
+ function = Function::null();
+ }
+ RELEASE_ASSERT(!function.IsNull());
+ TestPipeline pipeline(function, CompilerPass::kAOT);
+ FlowGraph* flow_graph = pipeline.RunPasses({});
+
+ auto entry = flow_graph->graph_entry()->normal_entry();
+ EXPECT(entry != nullptr);
+ ILMatcher cursor(flow_graph, entry, /*trace=*/true);
+ RELEASE_ASSERT(cursor.TryMatch(
+ {
+ kMatchAndMoveGoto,
+ kMatchAndMoveBranchFalse,
+ kMatchAndMoveAssertAssignable,
+ kMatchAndMoveGoto,
+ kMatchAndMoveLoadField,
+ kMatchAndMoveGenericCheckBound,
+ kMatchAndMoveLoadUntagged,
+ kMatchAndMoveLoadIndexed,
+ kMatchAndMoveBranchFalse,
+ kMoveGlob,
+ kMatchReturn,
+ },
+ kMoveGlob));
+}
+
#endif // defined(DART_PRECOMPILER)
} // namespace dart
diff --git a/runtime/vm/compiler/call_specializer.cc b/runtime/vm/compiler/call_specializer.cc
index 2c7f4dc..d1ad68b 100644
--- a/runtime/vm/compiler/call_specializer.cc
+++ b/runtime/vm/compiler/call_specializer.cc
@@ -1571,16 +1571,17 @@
const intptr_t receiver_index = call->FirstArgIndex();
- CompileType* receiver_type = call->ArgumentAt(receiver_index + 0)->Type();
+ CompileType* receiver_type =
+ call->ArgumentValueAt(receiver_index + 0)->Type();
CompileType* index_type = nullptr;
if (is_index_get || is_index_set) {
- index_type = call->ArgumentAt(receiver_index + 1)->Type();
+ index_type = call->ArgumentValueAt(receiver_index + 1)->Type();
}
CompileType* value_type = nullptr;
if (is_index_set) {
- value_type = call->ArgumentAt(receiver_index + 2)->Type();
+ value_type = call->ArgumentValueAt(receiver_index + 2)->Type();
}
auto& type_class = Class::Handle(zone_);
diff --git a/runtime/vm/compiler/compiler_sources.gni b/runtime/vm/compiler/compiler_sources.gni
index f1c672a..0efb336 100644
--- a/runtime/vm/compiler/compiler_sources.gni
+++ b/runtime/vm/compiler/compiler_sources.gni
@@ -188,6 +188,7 @@
"backend/yield_position_test.cc",
"cha_test.cc",
"frontend/kernel_binary_flowgraph_test.cc",
+ "frontend/multiple_entrypoints_test.cc",
"write_barrier_elimination_test.cc",
]
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 5944069..87a3298 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -1822,8 +1822,10 @@
Fragment* checks = is_covariant ? explicit_checks : implicit_checks;
*checks += LoadLocal(param);
- *checks += CheckAssignable(*target_type, name,
- AssertAssignableInstr::kParameterCheck);
+ *checks += AssertAssignableLoadTypeArguments(
+ TokenPosition::kNoSource, *target_type, name,
+ AssertAssignableInstr::kParameterCheck);
+ *checks += StoreLocal(param);
*checks += Drop();
if (!is_covariant && implicit_redefinitions != nullptr && optimizing_) {
diff --git a/runtime/vm/compiler/frontend/multiple_entrypoints_test.cc b/runtime/vm/compiler/frontend/multiple_entrypoints_test.cc
new file mode 100644
index 0000000..9ae1679
--- /dev/null
+++ b/runtime/vm/compiler/frontend/multiple_entrypoints_test.cc
@@ -0,0 +1,106 @@
+// 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.
+
+#include "vm/compiler/backend/il_test_helper.h"
+#include "vm/compiler/compiler_pass.h"
+#include "vm/object.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+#if defined(DART_PRECOMPILER)
+
+ISOLATE_UNIT_TEST_CASE(IRTest_MultilpeEntryPoints_Regress43534) {
+ const char* kScript =
+ R"(
+ import 'dart:typed_data';
+
+ @pragma('vm:never-inline')
+ void callWith<T>(void Function(T arg) fun, T arg) {
+ fun(arg);
+ }
+
+ @pragma('vm:never-inline')
+ void use(dynamic arg) {}
+
+ void test() {
+ callWith<Uint8List>((Uint8List list) {
+ use(list);
+ }, Uint8List(10));
+ }
+ )";
+
+ const auto& root_library = Library::Handle(LoadTestScript(kScript));
+ Invoke(root_library, "test");
+ const auto& test_function =
+ Function::Handle(GetFunction(root_library, "test"));
+ const auto& closures = GrowableObjectArray::Handle(
+ Isolate::Current()->object_store()->closure_functions());
+ auto& function = Function::Handle();
+ for (intptr_t i = closures.Length() - 1; 0 <= i; ++i) {
+ function ^= closures.At(i);
+ if (function.parent_function() == test_function.raw()) {
+ break;
+ }
+ function = Function::null();
+ }
+ RELEASE_ASSERT(!function.IsNull());
+ TestPipeline pipeline(function, CompilerPass::kAOT);
+ FlowGraph* flow_graph = pipeline.RunPasses({CompilerPass::kComputeSSA});
+
+ auto entry = flow_graph->graph_entry()->normal_entry();
+ EXPECT(entry != nullptr);
+
+ auto unchecked_entry = flow_graph->graph_entry()->unchecked_entry();
+ EXPECT(unchecked_entry != nullptr);
+
+ AssertAssignableInstr* assert_assignable = nullptr;
+ StaticCallInstr* static_call = nullptr;
+
+ // Normal entry
+ ILMatcher cursor(flow_graph, entry, /*trace=*/true);
+ RELEASE_ASSERT(cursor.TryMatch(
+ {
+ kMatchAndMoveGoto,
+ kMatchAndMoveBranchFalse,
+ {kMatchAndMoveAssertAssignable, &assert_assignable},
+ kMatchAndMoveGoto,
+ {kMatchAndMoveStaticCall, &static_call},
+ kMatchReturn,
+ },
+ kMoveGlob));
+
+ RedefinitionInstr* redefinition = nullptr;
+ StaticCallInstr* static_call2 = nullptr;
+
+ // Unchecked entry
+ ILMatcher cursor2(flow_graph, entry, /*trace=*/true);
+ RELEASE_ASSERT(cursor2.TryMatch(
+ {
+ kMatchAndMoveGoto,
+ kMatchAndMoveBranchTrue,
+ {kMatchAndMoveRedefinition, &redefinition},
+ kMatchAndMoveGoto,
+ {kMatchAndMoveStaticCall, &static_call2},
+ kMatchReturn,
+ },
+ kMoveGlob));
+
+ // Ensure the value the static call uses is a Phi node with 2 inputs:
+ // a) Normal entry: AssertAssignable
+ // b) Unchecked entry: Redefinition
+ RELEASE_ASSERT(static_call->ArgumentAt(0)->IsPhi());
+ auto phi = static_call->ArgumentAt(0)->AsPhi();
+ auto input_a = phi->InputAt(0)->definition();
+ auto input_b = phi->InputAt(1)->definition();
+ RELEASE_ASSERT(input_a->IsRedefinition());
+ RELEASE_ASSERT(input_b->IsAssertAssignable());
+ RELEASE_ASSERT(input_a == redefinition);
+ RELEASE_ASSERT(input_b == assert_assignable);
+ RELEASE_ASSERT(static_call == static_call2);
+}
+
+#endif // defined(DART_PRECOMPILER)
+
+} // namespace dart
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index e736c7a..b859d99 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -1601,6 +1601,9 @@
helper.IsCovariant() ||
(helper.IsGenericCovariantImpl() &&
(attrs.has_non_this_uses || attrs.has_tearoff_uses));
+ if (needs_covariant_check_in_method) {
+ variable->set_needs_covariant_check_in_method();
+ }
switch (type_check_mode) {
case kTypeCheckAllParameters:
diff --git a/runtime/vm/compiler/recognized_methods_list.h b/runtime/vm/compiler/recognized_methods_list.h
index e9f8516a..7044628 100644
--- a/runtime/vm/compiler/recognized_methods_list.h
+++ b/runtime/vm/compiler/recognized_methods_list.h
@@ -192,7 +192,7 @@
V(::, reachabilityFence, ReachabilityFence, 0xad39d0a6) \
V(_Utf8Decoder, _scan, Utf8DecoderScan, 0x78f44c3c) \
V(_Future, timeout, FutureTimeout, 0x010f8ad4) \
- V(Future, wait, FutureWait, 0x6c0c3295) \
+ V(Future, wait, FutureWait, 0x9a812df7) \
// List of intrinsics:
// (class-name, function-name, intrinsification method, fingerprint).
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 142c890..9cba5d4 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -252,7 +252,7 @@
void ExecuteCatchEntryMoves(const CatchEntryMoves& moves) {
Zone* zone = Thread::Current()->zone();
auto& value = Object::Handle(zone);
- auto& dst_values = Array::Handle(zone, Array::New(moves.count()));
+ GrowableArray<Object*> dst_values;
uword fp = handler_fp;
ObjectPool* pool = nullptr;
@@ -309,7 +309,7 @@
UNREACHABLE();
}
- dst_values.SetAt(j, value);
+ dst_values.Add(&Object::Handle(zone, value.raw()));
}
{
@@ -317,8 +317,7 @@
for (int j = 0; j < moves.count(); j++) {
const CatchEntryMove& move = moves.At(j);
- value = dst_values.At(j);
- *TaggedSlotAt(fp, move.dest_slot()) = value.raw();
+ *TaggedSlotAt(fp, move.dest_slot()) = dst_values[j]->raw();
}
}
}
@@ -879,7 +878,10 @@
// the isolate etc.). This can happen in the compiler, which is not
// allowed to allocate in new space, so we pass the kOld argument.
const UnhandledException& unhandled_exception = UnhandledException::Handle(
- zone, UnhandledException::New(exception, stacktrace, Heap::kOld));
+ zone, exception.raw() == isolate->object_store()->out_of_memory()
+ ? isolate->isolate_object_store()
+ ->preallocated_unhandled_exception()
+ : UnhandledException::New(exception, stacktrace, Heap::kOld));
stacktrace = StackTrace::null();
JumpToExceptionHandler(thread, handler_pc, handler_sp, handler_fp,
unhandled_exception, stacktrace);
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index f94e466..8f475f6 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -1511,29 +1511,24 @@
api_flags->version = DART_FLAGS_CURRENT_VERSION;
#define INIT_FROM_FLAG(when, name, bitname, isolate_flag, flag) \
api_flags->isolate_flag = flag;
- ISOLATE_FLAG_LIST(INIT_FROM_FLAG)
+ BOOL_ISOLATE_FLAG_LIST(INIT_FROM_FLAG)
#undef INIT_FROM_FLAG
api_flags->entry_points = NULL;
- api_flags->load_vmservice_library = false;
api_flags->copy_parent_code = false;
- api_flags->null_safety = false;
- api_flags->is_system_isolate = false;
}
void Isolate::FlagsCopyTo(Dart_IsolateFlags* api_flags) const {
api_flags->version = DART_FLAGS_CURRENT_VERSION;
#define INIT_FROM_FIELD(when, name, bitname, isolate_flag, flag) \
api_flags->isolate_flag = name();
- ISOLATE_FLAG_LIST(INIT_FROM_FIELD)
+ BOOL_ISOLATE_FLAG_LIST(INIT_FROM_FIELD)
#undef INIT_FROM_FIELD
api_flags->entry_points = NULL;
- api_flags->load_vmservice_library = should_load_vmservice();
api_flags->copy_parent_code = false;
- api_flags->null_safety = null_safety();
- api_flags->is_system_isolate = is_system_isolate();
}
void Isolate::FlagsCopyFrom(const Dart_IsolateFlags& api_flags) {
+ const bool copy_parent_code_ = copy_parent_code();
#if defined(DART_PRECOMPILER)
#define FLAG_FOR_PRECOMPILER(action) action
#else
@@ -1552,16 +1547,16 @@
FLAG_FOR_##when(isolate_flags_ = bitname##Bit::update( \
api_flags.isolate_flag, isolate_flags_));
- ISOLATE_FLAG_LIST(SET_FROM_FLAG)
-
+ BOOL_ISOLATE_FLAG_LIST(SET_FROM_FLAG)
+ isolate_flags_ = CopyParentCodeBit::update(copy_parent_code_, isolate_flags_);
+ // Needs to be called manually, otherwise we don't set the null_safety_set
+ // bit.
+ set_null_safety(api_flags.null_safety);
#undef FLAG_FOR_NONPRODUCT
#undef FLAG_FOR_PRECOMPILER
#undef FLAG_FOR_PRODUCT
#undef SET_FROM_FLAG
- set_should_load_vmservice(api_flags.load_vmservice_library);
- set_null_safety(api_flags.null_safety);
- set_is_system_isolate(api_flags.is_system_isolate);
// Copy entry points list.
ASSERT(embedder_entry_points_ == NULL);
if (api_flags.entry_points != NULL) {
@@ -3088,6 +3083,25 @@
heap()->PrintToJSONObject(Heap::kOld, &jsheap);
}
+ {
+// Stringification macros
+// See https://gcc.gnu.org/onlinedocs/gcc-4.8.5/cpp/Stringification.html
+#define TO_STRING(s) STR(s)
+#define STR(s) #s
+
+#define ADD_ISOLATE_FLAGS(when, name, bitname, isolate_flag_name, flag_name) \
+ { \
+ JSONObject jsflag(&jsflags); \
+ jsflag.AddProperty("name", TO_STRING(name)); \
+ jsflag.AddProperty("valueAsString", name() ? "true" : "false"); \
+ }
+ JSONArray jsflags(&jsobj, "isolateFlags");
+ BOOL_ISOLATE_FLAG_LIST(ADD_ISOLATE_FLAGS)
+#undef ADD_ISOLATE_FLAGS
+#undef TO_STRING
+#undef STR
+ }
+
jsobj.AddProperty("runnable", is_runnable());
jsobj.AddProperty("livePorts", message_handler()->live_ports());
jsobj.AddProperty("pauseOnExit", message_handler()->should_pause_on_exit());
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index f59147d..66ff4ec 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -177,15 +177,33 @@
// List of Isolate flags with corresponding members of Dart_IsolateFlags and
// corresponding global command line flags.
+#define BOOL_ISOLATE_FLAG_LIST(V) \
+ BOOL_ISOLATE_FLAG_LIST_DEFAULT_GETTER(V) \
+ BOOL_ISOLATE_FLAG_LIST_CUSTOM_GETTER(V)
+
+// List of Isolate flags with default getters.
//
-// V(when, name, bit-name, Dart_IsolateFlags-name, command-line-flag-name)
+// V(when, name, bit-name, Dart_IsolateFlags-name, command-line-flag-name)
//
-#define ISOLATE_FLAG_LIST(V) \
+#define BOOL_ISOLATE_FLAG_LIST_DEFAULT_GETTER(V) \
V(NONPRODUCT, asserts, EnableAsserts, enable_asserts, FLAG_enable_asserts) \
V(NONPRODUCT, use_field_guards, UseFieldGuards, use_field_guards, \
FLAG_use_field_guards) \
V(NONPRODUCT, use_osr, UseOsr, use_osr, FLAG_use_osr) \
- V(PRECOMPILER, obfuscate, Obfuscate, obfuscate, false_by_default)
+ V(PRECOMPILER, obfuscate, Obfuscate, obfuscate, false_by_default) \
+ V(PRODUCT, should_load_vmservice_library, ShouldLoadVmService, \
+ load_vmservice_library, false_by_default) \
+ V(PRODUCT, copy_parent_code, CopyParentCode, copy_parent_code, \
+ false_by_default) \
+ V(PRODUCT, is_system_isolate, IsSystemIsolate, is_system_isolate, \
+ false_by_default)
+
+// List of Isolate flags with custom getters named #name().
+//
+// V(when, name, bit-name, Dart_IsolateFlags-name, default_value)
+//
+#define BOOL_ISOLATE_FLAG_LIST_CUSTOM_GETTER(V) \
+ V(PRODUCT, null_safety, NullSafety, null_safety, false_by_default)
// Represents the information used for spawning the first isolate within an
// isolate group.
@@ -1275,7 +1293,7 @@
USE(false_by_default); \
return FLAG_FOR_##when(bitname##Bit::decode(isolate_flags_), flag_name); \
}
- ISOLATE_FLAG_LIST(DECLARE_GETTER)
+ BOOL_ISOLATE_FLAG_LIST_DEFAULT_GETTER(DECLARE_GETTER)
#undef FLAG_FOR_NONPRODUCT
#undef FLAG_FOR_PRECOMPILER
#undef FLAG_FOR_PRODUCT
@@ -1297,6 +1315,7 @@
ASSERT(!null_safety_not_set());
return NullSafetyBit::decode(isolate_flags_);
}
+
void set_null_safety(bool null_safety) {
isolate_flags_ = NullSafetySetBit::update(true, isolate_flags_);
isolate_flags_ = NullSafetyBit::update(null_safety, isolate_flags_);
@@ -1404,7 +1423,6 @@
void set_is_system_isolate(bool is_system_isolate) {
is_system_isolate_ = is_system_isolate;
}
- bool is_system_isolate() const { return is_system_isolate_; }
#if !defined(PRODUCT)
GrowableObjectArrayPtr GetAndClearPendingServiceExtensionCalls();
@@ -1478,9 +1496,11 @@
V(UseFieldGuards) \
V(UseOsr) \
V(Obfuscate) \
+ V(CopyParentCode) \
V(ShouldLoadVmService) \
V(NullSafety) \
- V(NullSafetySet)
+ V(NullSafetySet) \
+ V(IsSystemIsolate)
// Isolate specific flags.
enum FlagBits {
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 9f873d9..9902dc6 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -211,6 +211,9 @@
if (variable->is_explicit_covariant_parameter()) {
raw_parameter->set_is_explicit_covariant_parameter();
}
+ if (variable->needs_covariant_check_in_method()) {
+ raw_parameter->set_needs_covariant_check_in_method();
+ }
raw_parameter->set_type_check_mode(variable->type_check_mode());
if (function().HasOptionalParameters()) {
bool ok = scope->AddVariable(raw_parameter);
diff --git a/runtime/vm/scopes.h b/runtime/vm/scopes.h
index a9761d7..b003324 100644
--- a/runtime/vm/scopes.h
+++ b/runtime/vm/scopes.h
@@ -91,7 +91,7 @@
is_invisible_(false),
is_captured_parameter_(false),
is_forced_stack_(false),
- is_explicit_covariant_parameter_(false),
+ covariance_mode_(kNotCovariant),
is_late_(false),
is_chained_future_(false),
expected_context_index_(-1),
@@ -147,10 +147,17 @@
}
bool is_explicit_covariant_parameter() const {
- return is_explicit_covariant_parameter_;
+ return covariance_mode_ == kExplicit;
}
- void set_is_explicit_covariant_parameter() {
- is_explicit_covariant_parameter_ = true;
+ void set_is_explicit_covariant_parameter() { covariance_mode_ = kExplicit; }
+
+ bool needs_covariant_check_in_method() const {
+ return covariance_mode_ != kNotCovariant;
+ }
+ void set_needs_covariant_check_in_method() {
+ if (covariance_mode_ == kNotCovariant) {
+ covariance_mode_ = kImplicit;
+ }
}
enum TypeCheckMode {
@@ -208,6 +215,12 @@
bool Equals(const LocalVariable& other) const;
private:
+ enum CovarianceMode {
+ kNotCovariant,
+ kImplicit,
+ kExplicit,
+ };
+
static const int kUninitializedIndex = INT_MIN;
const TokenPosition declaration_pos_;
@@ -228,7 +241,7 @@
bool is_invisible_;
bool is_captured_parameter_;
bool is_forced_stack_;
- bool is_explicit_covariant_parameter_;
+ CovarianceMode covariance_mode_;
bool is_late_;
bool is_chained_future_;
intptr_t expected_context_index_;
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index a3cf970..bf1d99b 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -15,7 +15,7 @@
namespace dart {
#define SERVICE_PROTOCOL_MAJOR_VERSION 3
-#define SERVICE_PROTOCOL_MINOR_VERSION 39
+#define SERVICE_PROTOCOL_MINOR_VERSION 40
class Array;
class EmbedderServiceHandler;
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index 69dde47..b8d0906 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -1,8 +1,8 @@
-# Dart VM Service Protocol 3.39
+# Dart VM Service Protocol 3.40
> Please post feedback to the [observatory-discuss group][discuss-list]
-This document describes of _version 3.39_ of the Dart VM Service Protocol. This
+This document describes of _version 3.40_ of the Dart VM Service Protocol. This
protocol is used to communicate with a running Dart Virtual Machine.
To use the Service Protocol, start the VM with the *--observe* flag.
@@ -102,6 +102,7 @@
- [Instance](#instance)
- [InstanceSet](#instanceset)
- [Isolate](#isolate)
+ - [IsolateFlag](#isolateflag)
- [IsolateGroup](#isolategroup)
- [Library](#library)
- [LibraryDependency](#librarydependency)
@@ -2785,6 +2786,10 @@
// internal use. If `false`, this isolate is likely running user code.
bool isSystemIsolate;
+ // The list of isolate flags provided to this isolate. See Dart_IsolateFlags
+ // in dart_api.h for the list of accepted isolate flags.
+ IsolateFlag[] isolateFlags;
+
// The time that the VM started in milliseconds since the epoch.
//
// Suitable to pass to DateTime.fromMillisecondsSinceEpoch.
@@ -2830,6 +2835,20 @@
An _Isolate_ object provides information about one isolate in the VM.
+### IsolateFlag
+
+```
+class IsolateFlag {
+ // The name of the flag.
+ string name;
+
+ // The value of this flag as a string.
+ string valueAsString;
+}
+```
+
+Represents the value of a single isolate flag. See [Isolate](#isolate).
+
### IsolateGroup
```
@@ -2845,7 +2864,7 @@
// Specifies whether the isolate group was spawned by the VM or embedder for
// internal use. If `false`, this isolate group is likely running user code.
- bool isSystemIsolateGroup;
+ bool isSystemIsolateGroup;
}
```
@@ -2865,7 +2884,7 @@
// Specifies whether the isolate group was spawned by the VM or embedder for
// internal use. If `false`, this isolate group is likely running user code.
- bool isSystemIsolateGroup;
+ bool isSystemIsolateGroup;
// A list of all isolates in this isolate group.
@Isolate[] isolates;
@@ -3835,5 +3854,6 @@
3.37 | Added `getWebSocketTarget` RPC and `WebSocketTarget` object.
3.38 | Added `isSystemIsolate` property to `@Isolate` and `Isolate`, `isSystemIsolateGroup` property to `@IsolateGroup` and `IsolateGroup`, and properties `systemIsolates` and `systemIsolateGroups` to `VM`.
3.39 | Removed the following deprecated RPCs and objects: `getClientName`, `getWebSocketTarget`, `setClientName`, `requireResumeApproval`, `ClientName`, and `WebSocketTarget`.
+3.40 | Added `IsolateFlag` object and `isolateFlags` property to `Isolate`.
[discuss-list]: https://groups.google.com/a/dartlang.org/forum/#!forum/observatory-discuss
diff --git a/runtime/vm/service/service_extension.md b/runtime/vm/service/service_extension.md
index b564c2a..5cb05ff 100644
--- a/runtime/vm/service/service_extension.md
+++ b/runtime/vm/service/service_extension.md
@@ -1,4 +1,4 @@
-# Dart VM Service Protocol Extension 1.2
+# Dart VM Service Protocol Extension 1.4
This protocol describes service extensions that are made available through
the Dart core libraries, but are not part of the core
@@ -10,7 +10,7 @@
## dart:io Extensions
-This section describes _version 1.2_ of the dart:io service protocol extensions.
+This section describes _version 1.4_ of the dart:io service protocol extensions.
### getVersion
@@ -135,13 +135,13 @@
### httpEnableTimelineLogging
```
-HttpTimelineLoggingState httpEnableTimelineLogging(string isolateId, bool enable [optional])
+HttpTimelineLoggingState httpEnableTimelineLogging(string isolateId, bool enabled [optional])
```
The _httpEnableTimelineLogging_ RPC is used to set and inspect the value of
`HttpClient.enableTimelineLogging`, which determines if HTTP client requests
-should be logged to the timeline. If `enable` is provided, the state of
-`HttpClient.enableTimelineLogging` will be updated to the value of `enable`.
+should be logged to the timeline. If `enabled` is provided, the state of
+`HttpClient.enableTimelineLogging` will be updated to the value of `enabled`.
If the value of `HttpClient.enableTimelineLogging` is changed, a
`HttpTimelineLoggingStateChange` event will be sent on the `Extension` stream.
@@ -344,3 +344,4 @@
1.1 | Added `lastReadTime` and `lastWriteTime` properties to `SocketStatistic`.
1.2 | Added `getOpenFiles`, `getOpenFileById`, `getSpawnedProcesses`, and `getSpawnedProcessById` RPCs and added `OpenFile` and `SpawnedProcess` objects.
1.3 | Added `httpEnableTimelineLogging` RPC and `HttpTimelineLoggingStateChange` event, deprecated `getHttpEnableTimelineLogging` and `setHttpEnableTimelineLogging`.
+1.4 | Updated `httpEnableTimelineLogging` parameter `enable` to `enabled`. `enable` will continue to be accepted.
diff --git a/sdk/lib/_http/http.dart b/sdk/lib/_http/http.dart
index b7ca682..76d2c68 100644
--- a/sdk/lib/_http/http.dart
+++ b/sdk/lib/_http/http.dart
@@ -1945,8 +1945,9 @@
* and only for the status codes [HttpStatus.movedPermanently]
* (301), [HttpStatus.found] (302),
* [HttpStatus.movedTemporarily] (302, alias for
- * [HttpStatus.found]), [HttpStatus.seeOther] (303) and
- * [HttpStatus.temporaryRedirect] (307). For
+ * [HttpStatus.found]), [HttpStatus.seeOther] (303),
+ * [HttpStatus.temporaryRedirect] (307) and
+ * [HttpStatus.permanentRedirect] (308). For
* [HttpStatus.seeOther] (303) automatic redirect will also happen
* for "POST" requests with the method changed to "GET" when
* following the redirect.
diff --git a/sdk/lib/_http/http_impl.dart b/sdk/lib/_http/http_impl.dart
index 4731868..eac06c4 100644
--- a/sdk/lib/_http/http_impl.dart
+++ b/sdk/lib/_http/http_impl.dart
@@ -350,6 +350,7 @@
bool get isRedirect {
if (_httpRequest.method == "GET" || _httpRequest.method == "HEAD") {
return statusCode == HttpStatus.movedPermanently ||
+ statusCode == HttpStatus.permanentRedirect ||
statusCode == HttpStatus.found ||
statusCode == HttpStatus.seeOther ||
statusCode == HttpStatus.temporaryRedirect;
diff --git a/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart b/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
index 5c5f484..772263c 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
@@ -70,9 +70,9 @@
class Primitives {
static int? parseInt(@nullCheck String source, int? _radix) {
var re = JS('', r'/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i');
- // TODO(jmesserly): this isn't reified List<String>, but it's safe to use as
- // long as we use it locally and don't expose it to user code.
- List<String>? match = JS('', '#.exec(#)', re, source);
+ // This isn't reified List<String?>?, but it's safe to use as long as we use
+ // it locally and don't expose it to user code.
+ var match = JS<List<String?>?>('', '#.exec(#)', re, source);
int digitsIndex = 1;
int hexIndex = 2;
int decimalIndex = 3;
@@ -82,7 +82,7 @@
// again.
return null;
}
- String? decimalMatch = match[decimalIndex];
+ var decimalMatch = match[decimalIndex];
if (_radix == null) {
if (decimalMatch != null) {
// Cannot fail because we know that the digits are all decimal.
@@ -304,13 +304,17 @@
// Example: "Wed May 16 2012 21:13:00 GMT+0200 (CEST)".
// We extract this name using a regexp.
var d = lazyAsJsDate(receiver);
- List? match = JS('JSArray|Null', r'/\((.*)\)/.exec(#.toString())', d);
+ // In this method all calls to `exec()` include a single capture group and
+ // it is only read if there is a match so a value will be present. To avoid
+ // extra null checks or casts from dynamic we type the return type of
+ // `exec()` to always contain non-nullable Strings.
+ var match = JS<List<String>?>('', r'/\((.*)\)/.exec(#.toString())', d);
if (match != null) return match[1];
// Internet Explorer 10+ emits the zone name without parenthesis:
// Example: Thu Oct 31 14:07:44 PDT 2013
- match = JS(
- 'JSArray|Null',
+ match = JS<List<String>?>(
+ '',
// Thu followed by a space.
r'/^[A-Z,a-z]{3}\s'
// Oct 31 followed by space.
@@ -329,7 +333,8 @@
// UTC/GMT offset.
// Example (IE9): Wed Nov 20 09:51:00 UTC+0100 2013
// (Opera): Wed Nov 20 2013 11:03:38 GMT+0100
- match = JS('JSArray|Null', r'/(?:GMT|UTC)[+-]\d{4}/.exec(#.toString())', d);
+ match =
+ JS<List<String>?>('', r'/(?:GMT|UTC)[+-]\d{4}/.exec(#.toString())', d);
if (match != null) return match[0];
return "";
}
diff --git a/sdk/lib/_internal/js_dev_runtime/private/regexp_helper.dart b/sdk/lib/_internal/js_dev_runtime/private/regexp_helper.dart
index 6ce53ac..73f95fb 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/regexp_helper.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/regexp_helper.dart
@@ -116,8 +116,9 @@
}
RegExpMatch? firstMatch(@nullCheck String string) {
- List<String>? m =
- JS('JSExtendableArray|Null', r'#.exec(#)', _nativeRegExp, string);
+ // This isn't reified List<String?>?, but it's safe to use as long as we use
+ // it locally and don't expose it to user code.
+ var m = JS<List<String?>?>('', r'#.exec(#)', _nativeRegExp, string);
if (m == null) return null;
return _MatchImplementation(this, m);
}
@@ -144,8 +145,9 @@
RegExpMatch? _execGlobal(String string, int start) {
Object regexp = _nativeGlobalVersion;
JS("void", "#.lastIndex = #", regexp, start);
- List<String>? match =
- JS("JSExtendableArray|Null", "#.exec(#)", regexp, string);
+ // This isn't reified List<String?>?, but it's safe to use as long as we use
+ // it locally and don't expose it to user code.
+ var match = JS<List<String?>?>("", "#.exec(#)", regexp, string);
if (match == null) return null;
return _MatchImplementation(this, match);
}
@@ -153,8 +155,9 @@
RegExpMatch? _execAnchored(String string, int start) {
Object regexp = _nativeAnchoredVersion;
JS("void", "#.lastIndex = #", regexp, start);
- List<String>? match =
- JS("JSExtendableArray|Null", "#.exec(#)", regexp, string);
+ // This isn't reified List<String?>?, but it's safe to use as long as we use
+ // it locally and don't expose it to user code.
+ var match = JS<List<String?>?>("", "#.exec(#)", regexp, string);
if (match == null) return null;
// If the last capture group participated, the original regexp did not
// match at the start position.
@@ -178,9 +181,12 @@
class _MatchImplementation implements RegExpMatch {
final Pattern pattern;
- // Contains a JS RegExp match object.
- // It is an Array of String values with extra "index" and "input" properties.
- final List<String> _match;
+ // Contains a JS RegExp match object that is an Array with extra "index" and
+ // "input" properties. The array contains Strings but the values at indices
+ // related to capture groups can be undefined.
+ // This isn't reified List<String?>, but it's safe to use as long as we use
+ // it locally and don't expose it to user code.
+ final List<String?> _match;
_MatchImplementation(this.pattern, this._match) {
assert(JS("var", "#.input", _match) is String);
@@ -189,7 +195,7 @@
String get input => JS("String", "#.input", _match);
int get start => JS("int", "#.index", _match);
- int get end => start + _match[0].length;
+ int get end => start + _match[0]!.length;
String? group(int index) => _match[index];
String? operator [](int index) => group(index);
diff --git a/sdk/lib/_internal/vm/bin/secure_socket_patch.dart b/sdk/lib/_internal/vm/bin/secure_socket_patch.dart
index 9a0586d..5989763 100644
--- a/sdk/lib/_internal/vm/bin/secure_socket_patch.dart
+++ b/sdk/lib/_internal/vm/bin/secure_socket_patch.dart
@@ -98,7 +98,61 @@
void _destroy() native "SecureSocket_Destroy";
- void handshake() native "SecureSocket_Handshake";
+ int _handshake(SendPort replyPort) native "SecureSocket_Handshake";
+
+ void _markAsTrusted(int certificatePtr, bool isTrusted)
+ native "SecureSocket_MarkAsTrusted";
+
+ static X509Certificate _newX509CertificateWrapper(int certificatePtr)
+ native "SecureSocket_NewX509CertificateWrapper";
+
+ Future<bool> handshake() {
+ Completer<bool> evaluatorCompleter = Completer<bool>();
+
+ ReceivePort rpEvaluateResponse = ReceivePort();
+ rpEvaluateResponse.listen((data) {
+ List list = data as List;
+ // incoming messages (bool isTrusted, int certificatePtr) is
+ // sent by TrustEvaluator native port after system evaluates
+ // the certificate chain
+ if (list.length != 2) {
+ throw Exception("Invalid number of arguments in evaluate response");
+ }
+ bool isTrusted = list[0] as bool;
+ int certificatePtr = list[1] as int;
+ if (!isTrusted) {
+ if (badCertificateCallback != null) {
+ try {
+ isTrusted = badCertificateCallback!(
+ _newX509CertificateWrapper(certificatePtr));
+ } catch (e, st) {
+ evaluatorCompleter.completeError(e, st);
+ rpEvaluateResponse.close();
+ return;
+ }
+ }
+ }
+ _markAsTrusted(certificatePtr, isTrusted);
+ evaluatorCompleter.complete(true);
+ rpEvaluateResponse.close();
+ });
+
+ const int kSslErrorWantCertificateVerify = 16; // ssl.h:558
+ int handshakeResult;
+ try {
+ handshakeResult = _handshake(rpEvaluateResponse.sendPort);
+ } catch (e, st) {
+ rpEvaluateResponse.close();
+ rethrow;
+ }
+ if (handshakeResult == kSslErrorWantCertificateVerify) {
+ return evaluatorCompleter.future;
+ } else {
+ // Response is ready, no need for evaluate response receive port
+ rpEvaluateResponse.close();
+ return Future<bool>.value(false);
+ }
+ }
void rehandshake() => throw new UnimplementedError();
@@ -113,9 +167,16 @@
X509Certificate? get peerCertificate native "SecureSocket_PeerCertificate";
- void registerBadCertificateCallback(Function callback)
+ void _registerBadCertificateCallback(Function callback)
native "SecureSocket_RegisterBadCertificateCallback";
+ Function? badCertificateCallback;
+
+ void registerBadCertificateCallback(Function callback) {
+ badCertificateCallback = callback;
+ _registerBadCertificateCallback(callback);
+ }
+
void registerHandshakeCompleteCallback(Function handshakeCompleteHandler)
native "SecureSocket_RegisterHandshakeCompleteCallback";
@@ -205,7 +266,7 @@
class _X509CertificateImpl extends NativeFieldWrapperClass1
implements X509Certificate {
// The native field must be set manually on a new object, in native code.
- // This is done by WrappedX509 in secure_socket.cc.
+ // This is done by WrappedX509Certificate in security_context.cc.
_X509CertificateImpl._();
Uint8List get _der native "X509_Der";
diff --git a/sdk/lib/core/iterator.dart b/sdk/lib/core/iterator.dart
index e9a6284..13c76b4 100644
--- a/sdk/lib/core/iterator.dart
+++ b/sdk/lib/core/iterator.dart
@@ -38,7 +38,7 @@
* Advances the iterator to the next element of the iteration.
*
* Should be called before reading [current].
- * It the call to `moveNext` returns `true`,
+ * If the call to `moveNext` returns `true`,
* then [current] will contain the next element of the iteration
* until `moveNext` is called again.
* If the call returns `false`, there are no further elements
diff --git a/sdk/lib/io/network_profiling.dart b/sdk/lib/io/network_profiling.dart
index cb3d1ba..5c1c620 100644
--- a/sdk/lib/io/network_profiling.dart
+++ b/sdk/lib/io/network_profiling.dart
@@ -6,7 +6,7 @@
// TODO(bkonyi): refactor into io_resource_info.dart
const int _versionMajor = 1;
-const int _versionMinor = 3;
+const int _versionMinor = 4;
const String _tcpSocket = 'tcp';
const String _udpSocket = 'udp';
@@ -57,7 +57,15 @@
responseJson = _setHttpEnableTimelineLogging(parameters);
break;
case _kHttpEnableTimelineLogging:
- if (parameters.containsKey('enable')) {
+ if (parameters.containsKey('enabled') ||
+ parameters.containsKey('enable')) {
+ // TODO(bkonyi): Backwards compatibility.
+ // See https://github.com/dart-lang/sdk/issues/43638.
+ assert(_versionMajor == 1,
+ "'enable' is deprecated and should be removed (See #43638)");
+ if (parameters.containsKey('enabled')) {
+ parameters['enable'] = parameters['enabled']!;
+ }
_setHttpEnableTimelineLogging(parameters);
}
responseJson = _getHttpEnableTimelineLogging();
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index 08e9bf7..98d2dcf 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -812,11 +812,19 @@
void _secureHandshake() {
try {
- _secureFilter!.handshake();
- _filterStatus.writeEmpty = false;
- _readSocket();
- _writeSocket();
- _scheduleFilter();
+ _secureFilter!.handshake().then((needRetryHandshake) {
+ if (needRetryHandshake) {
+ // Some certificates have been evaluated, need to rety handshake.
+ _secureHandshake();
+ } else {
+ _filterStatus.writeEmpty = false;
+ _readSocket();
+ _writeSocket();
+ _scheduleFilter();
+ }
+ }).catchError((e, stackTrace) {
+ _reportError(e, stackTrace);
+ });
} catch (e, stackTrace) {
_reportError(e, stackTrace);
}
@@ -1235,7 +1243,7 @@
bool requireClientCertificate,
Uint8List protocols);
void destroy();
- void handshake();
+ Future<bool> handshake();
String? selectedProtocol();
void rehandshake();
void renegotiate(bool useSessionCache, bool requestClientCertificate,
diff --git a/sdk/lib/vmservice/running_isolates.dart b/sdk/lib/vmservice/running_isolates.dart
index 6b6667a..03a6811 100644
--- a/sdk/lib/vmservice/running_isolates.dart
+++ b/sdk/lib/vmservice/running_isolates.dart
@@ -75,14 +75,6 @@
_Evaluator(this._message, this._isolate, this._service);
Future<Response> run() async {
- if (_service.ddsUri != null) {
- return Response.from(encodeRpcError(
- _message,
- kInternalError,
- details: 'Fell through to VM Service expression evaluation when a DDS '
- 'instance was connected. Please file an issue on GitHub.',
- ));
- }
final buildScopeResponse = await _buildScope();
final responseJson = buildScopeResponse.decodeJson();
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index 1ca6f0b..7600e13 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -36,11 +36,8 @@
LanguageFeatures/Instantiate-to-bound/typedef/*: Skip # Not migrated to NNBD
LanguageFeatures/Instantiate-to-bound/typedef/dynamic/*: Skip # Not migrated to NNBD
LanguageFeatures/Instantiate-to-bound/typedef/static/*: Skip # Not migrated to NNBD
-LanguageFeatures/Simple-bounds/*: Skip # Not migrated to NNBD
-LanguageFeatures/Simple-bounds/dynamic/*: Skip # Not migrated to NNBD
-LanguageFeatures/Simple-bounds/dynamic/type-aliases/*: Skip # Not migrated to NNBD
-LanguageFeatures/Simple-bounds/static/*: Skip # Not migrated to NNBD
-LanguageFeatures/Simple-bounds/static/type-aliases/*: Skip # Not migrated to NNBD
+LanguageFeatures/Simple-bounds/dynamic/type-aliases/*: Skip # Type aliases are not fully implemented
+LanguageFeatures/Simple-bounds/static/type-aliases/*: Skip # Type aliases are not fully implemented
LanguageFeatures/Triple-Shift/*: Skip # Triple shift is not implemented yet
LanguageFeatures/regression/34560_t02/01: Skip # Type aliases are not fully implemented
LibTest/io/RawDatagramSocket/*: Skip # https://github.com/dart-lang/co19/issues/195
diff --git a/tests/language/await/null_aware_test.dart b/tests/language/await/null_aware_test.dart
index 88f16f0..819de12 100644
--- a/tests/language/await/null_aware_test.dart
+++ b/tests/language/await/null_aware_test.dart
@@ -13,11 +13,11 @@
}
main() async {
- var x = 1 as int?;
+ int? x = 1;
x ??= await f();
Expect.equals(1, x);
- var y = 1 as int?;
+ int? y = 1;
y = y ?? await f();
Expect.equals(1, y);
}
diff --git a/tests/language/constructor/missing_initializer_test.dart b/tests/language/constructor/missing_initializer_test.dart
index 3736c5f..2de088e 100644
--- a/tests/language/constructor/missing_initializer_test.dart
+++ b/tests/language/constructor/missing_initializer_test.dart
@@ -12,7 +12,7 @@
final dynamic n;
// ^
// [analyzer] COMPILE_TIME_ERROR.FINAL_NOT_INITIALIZED
- // [cfe] unspecified
+ // [cfe] Final field 'n' is not initialized.
// Uninitialized, but no errors.
abstract final int x1;
@@ -34,6 +34,7 @@
class C = Object with A;
// ^
// [analyzer] COMPILE_TIME_ERROR.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER
+ // [cfe] The non-abstract class 'C' is missing implementations for these members:
// Has a generative constructor: default.
abstract class D {
diff --git a/tests/language/if_null/assignment_static_test.dart b/tests/language/if_null/assignment_static_test.dart
index 7eee56b..14edd3c 100644
--- a/tests/language/if_null/assignment_static_test.dart
+++ b/tests/language/if_null/assignment_static_test.dart
@@ -141,7 +141,7 @@
// The static type of e1?.v op= e2 is the static type of e1.v op e2,
// therefore the static type of e1?.v ??= e2 is the static type of
// e1.v ?? e2, which is the LUB of NonNull(typeof(e1?.v)) and typeof(e2).
- var c = new ClassWithInstanceGetters() as ClassWithInstanceGetters?;
+ ClassWithInstanceGetters? c = new ClassWithInstanceGetters();
(c?.a ??= theA)!.a; //# 36: ok
(c?.a ??= theA)!.b; //# 37: compile-time error
(c?.a ??= theB)!.a; //# 38: ok
diff --git a/tests/language/if_null/behavior_test.dart b/tests/language/if_null/behavior_test.dart
index a55d7f5..a679108 100644
--- a/tests/language/if_null/behavior_test.dart
+++ b/tests/language/if_null/behavior_test.dart
@@ -32,8 +32,8 @@
C? nullC() => null;
main() {
- var one = 1 as int?;
- var b = B('B') as B?;
+ int? one = 1;
+ B? b = B('B');
Expect.equals(1, one ?? 2);
Expect.equals(1, one ?? null);
Expect.equals(2, null ?? 2);
diff --git a/tests/language/if_null/evaluation_order_test.dart b/tests/language/if_null/evaluation_order_test.dart
index c4da142..ca78ab4 100644
--- a/tests/language/if_null/evaluation_order_test.dart
+++ b/tests/language/if_null/evaluation_order_test.dart
@@ -27,7 +27,7 @@
}
main() {
- var one = 1 as int?;
+ int? one = 1;
Expect.equals(1, one ?? bad());
Expect.equals(2, first() ?? second());
}
diff --git a/tests/language/implicit_downcast_during/if_null_assignment_test.dart b/tests/language/implicit_downcast_during/if_null_assignment_test.dart
index c29d634..7c91b32 100644
--- a/tests/language/implicit_downcast_during/if_null_assignment_test.dart
+++ b/tests/language/implicit_downcast_during/if_null_assignment_test.dart
@@ -8,7 +8,7 @@
void main() {
B? b;
- var a = new B() as A?;
+ A? a = new B();
b ??= a;
// ^
// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
diff --git a/tests/language/implicit_downcast_during/null_aware_method_invocation_test.dart b/tests/language/implicit_downcast_during/null_aware_method_invocation_test.dart
index 59c115e..535c7db 100644
--- a/tests/language/implicit_downcast_during/null_aware_method_invocation_test.dart
+++ b/tests/language/implicit_downcast_during/null_aware_method_invocation_test.dart
@@ -11,7 +11,7 @@
}
main() {
- var c = new C() as C?;
+ C? c = new C();
A a = new B();
c?.f(a);
// ^
diff --git a/tests/language/mixin/regress_flutter_66859_test.dart b/tests/language/mixin/regress_flutter_66859_test.dart
new file mode 100644
index 0000000..544da53
--- /dev/null
+++ b/tests/language/mixin/regress_flutter_66859_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.
+
+// Verifies that mixin supertypes are properly maintained even if marked as
+// deferred (e.g., in a circular hierarchy).
+// Regression test for: https://github.com/flutter/flutter/issues/66859
+
+import "package:expect/expect.dart";
+
+mixin M {}
+
+mixin N {}
+
+class A extends B<C> with M, N {}
+
+class B<T> {}
+
+class C extends A {}
+
+class Z extends B<Z> with M {}
+
+main() {
+ var z = Z();
+ Expect.isTrue(z is B<Z>);
+ Expect.isTrue(z is M);
+ var a = A();
+ Expect.isTrue(a is M);
+ Expect.isTrue(a is N);
+ Expect.isTrue(a is B<C>);
+}
diff --git a/tests/language/nnbd/static_errors/super_equals_disallows_non_matching_type_error_test.dart b/tests/language/nnbd/static_errors/super_equals_disallows_non_matching_type_error_test.dart
index a2a8182..4366065 100644
--- a/tests/language/nnbd/static_errors/super_equals_disallows_non_matching_type_error_test.dart
+++ b/tests/language/nnbd/static_errors/super_equals_disallows_non_matching_type_error_test.dart
@@ -24,7 +24,7 @@
class Derived extends Base {
void test() {
String string = 'foo';
- var stringQuestion = 'foo' as String?;
+ String? stringQuestion = 'foo';
super == string;
// ^^^^^^
// [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
diff --git a/tests/language/nnbd/syntax/class_member_declarations_test.dart b/tests/language/nnbd/syntax/class_member_declarations_test.dart
index a6c8efd..3aa7d26 100644
--- a/tests/language/nnbd/syntax/class_member_declarations_test.dart
+++ b/tests/language/nnbd/syntax/class_member_declarations_test.dart
@@ -46,7 +46,7 @@
main() {
A? a;
- var s = '' as String?;
+ String? s = '';
a
?..foo().length
..x27 = s!.toString().length;
diff --git a/tests/language/nnbd/syntax/null_assertion_ambiguous_test.dart b/tests/language/nnbd/syntax/null_assertion_ambiguous_test.dart
index 131631e..b4b357e 100644
--- a/tests/language/nnbd/syntax/null_assertion_ambiguous_test.dart
+++ b/tests/language/nnbd/syntax/null_assertion_ambiguous_test.dart
@@ -43,7 +43,7 @@
Expect.throws(() {
x3 = a!;
});
- var x4 = 0 as Object?;
+ Object? x4 = 0;
Expect.throws(() {
x4 = a!;
});
@@ -62,7 +62,7 @@
// ignores its argument, and verify that the appropriate exception is still
// thrown.
var x6 = 2;
- var i = 2 as int?;
+ int? i = 2;
x6 * i!;
var x7 = new C();
i = null;
@@ -73,9 +73,9 @@
// `-x!` means `-(x!)`, not `(-x)!`. We check the compile-time behavior by
// checking that the negation is accepted even though x is nullable. We check
// the runtime behavior by using an object whose operator- returns null.
- var x8 = 2 as int?;
+ int? x8 = 2;
-x8!;
- var x9 = new C() as C?;
+ C? x9 = new C();
var x10 = -x9!;
Expect.isNull(x10);
diff --git a/tests/language/null_aware/access_runtime_2_test.dart b/tests/language/null_aware/access_runtime_2_test.dart
index a1ade72..b67de99 100644
--- a/tests/language/null_aware/access_runtime_2_test.dart
+++ b/tests/language/null_aware/access_runtime_2_test.dart
@@ -28,7 +28,7 @@
// e1?.id is equivalent to ((x) => x == null ? null : x.id)(e1).
- var c = new C(1) as C?;
+ C? c = new C(1);
Expect.equals(1, c?.v);
// C?.id is equivalent to C.id.
diff --git a/tests/language/null_aware/access_runtime_5_test.dart b/tests/language/null_aware/access_runtime_5_test.dart
index 6db60ce3..5984802 100644
--- a/tests/language/null_aware/access_runtime_5_test.dart
+++ b/tests/language/null_aware/access_runtime_5_test.dart
@@ -35,7 +35,7 @@
// The static type of e1?.d is the static type of e1.id.
- var c = new C(1) as C?;
+ C? c = new C(1);
{ int? i = c?.v; Expect.equals(1, i); }
diff --git a/tests/language/null_aware/access_test.dart b/tests/language/null_aware/access_test.dart
index b2d1bc0..224a794 100644
--- a/tests/language/null_aware/access_test.dart
+++ b/tests/language/null_aware/access_test.dart
@@ -70,8 +70,8 @@
// ^^^
// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'bad' isn't defined for the class 'C'.
- { var b = new C(1) as B?; Expect.equals(1, b?.v); }
- // ^
+ { B? b = new C(1); Expect.equals(1, b?.v); }
+ // ^
// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'v' isn't defined for the class 'B'.
diff --git a/tests/language/null_aware/assignment_runtime_11_test.dart b/tests/language/null_aware/assignment_runtime_11_test.dart
index ca60103..05b84a6 100644
--- a/tests/language/null_aware/assignment_runtime_11_test.dart
+++ b/tests/language/null_aware/assignment_runtime_11_test.dart
@@ -77,7 +77,7 @@
// The static type of e1?.v op= e2 is the static type of e1.v op e2.
- { var d = new D(new E()) as D?; F? f = (d?.v += 1); Expect.identical(d!.v, f); }
+ { D? d = new D(new E()); F? f = (d?.v += 1); Expect.identical(d!.v, f); }
diff --git a/tests/language/null_aware/assignment_runtime_2_test.dart b/tests/language/null_aware/assignment_runtime_2_test.dart
index bc0cdb6..825bfc6 100644
--- a/tests/language/null_aware/assignment_runtime_2_test.dart
+++ b/tests/language/null_aware/assignment_runtime_2_test.dart
@@ -50,7 +50,7 @@
// e1?.v = e2 is equivalent to ((x) => x == null ? null : x.v = e2)(e1).
- { var c = new C(1) as C?; Expect.equals(2, c?.v = 2); Expect.equals(2, c!.v); }
+ { C? c = new C(1); Expect.equals(2, c?.v = 2); Expect.equals(2, c!.v); }
// C?.v = e2 is equivalent to C.v = e2.
diff --git a/tests/language/null_aware/assignment_runtime_5_test.dart b/tests/language/null_aware/assignment_runtime_5_test.dart
index 9507557..abcf60a 100644
--- a/tests/language/null_aware/assignment_runtime_5_test.dart
+++ b/tests/language/null_aware/assignment_runtime_5_test.dart
@@ -57,7 +57,7 @@
// The static type of e1?.v = e2 is the static type of e2.
- { var d = new D(new E()) as D?; G g = new G(); F? f = (d?.v = g); Expect.identical(f, g); }
+ { D? d = new D(new E()); G g = new G(); F? f = (d?.v = g); Expect.identical(f, g); }
diff --git a/tests/language/null_aware/assignment_runtime_9_test.dart b/tests/language/null_aware/assignment_runtime_9_test.dart
index 0a16c52..3c2d6c0 100644
--- a/tests/language/null_aware/assignment_runtime_9_test.dart
+++ b/tests/language/null_aware/assignment_runtime_9_test.dart
@@ -71,7 +71,7 @@
// e1?.v op= e2 is equivalent to ((x) => x?.v = x.v op e2)(e1).
- { var c = new C(1) as C?; Expect.equals(3, c?.v += 2); Expect.equals(3, c!.v); }
+ { C? c = new C(1); Expect.equals(3, c?.v += 2); Expect.equals(3, c!.v); }
// C?.v op= e2 is equivalent to C.v op= e2.
diff --git a/tests/language/null_aware/assignment_test.dart b/tests/language/null_aware/assignment_test.dart
index d7bf2f4..112b0a6 100644
--- a/tests/language/null_aware/assignment_test.dart
+++ b/tests/language/null_aware/assignment_test.dart
@@ -59,9 +59,9 @@
{ h.C.staticInt = 1; Expect.equals(2, h.C?.staticInt = 2); Expect.equals(2, h.C.staticInt); }
// The static type of e1?.v = e2 is the static type of e2.
- { var d = new D(new E()) as D?; G g = new G(); F? f = (d?.v = g); Expect.identical(f, g); }
- { var d = new D(new E()) as D?; E e = new G(); F? f = (d?.v = e); }
- // ^^^^^^^^
+ { D? d = new D(new E()); G g = new G(); F? f = (d?.v = g); Expect.identical(f, g); }
+ { D? d = new D(new E()); E e = new G(); F? f = (d?.v = e); }
+ // ^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'E?' can't be assigned to a variable of type 'F?'.
{ D.staticE = new E(); G g = new G(); F? f = (D?.staticE = g); Expect.identical(f, g); }
diff --git a/tests/language/null_aware/increment_decrement_runtime_12_test.dart b/tests/language/null_aware/increment_decrement_runtime_12_test.dart
index 4e9c166..03986fb 100644
--- a/tests/language/null_aware/increment_decrement_runtime_12_test.dart
+++ b/tests/language/null_aware/increment_decrement_runtime_12_test.dart
@@ -68,7 +68,7 @@
// The static type of e1?.v-- is the same as the static type of e1.v.
- { E e1 = new E(); var d = new D(e1) as D?; E? e2 = d?.v--; Expect.identical(e1, e2); }
+ { E e1 = new E(); D? d = new D(e1); E? e2 = d?.v--; Expect.identical(e1, e2); }
diff --git a/tests/language/null_aware/increment_decrement_runtime_16_test.dart b/tests/language/null_aware/increment_decrement_runtime_16_test.dart
index cfd1b8b..1016d22 100644
--- a/tests/language/null_aware/increment_decrement_runtime_16_test.dart
+++ b/tests/language/null_aware/increment_decrement_runtime_16_test.dart
@@ -77,7 +77,7 @@
// ++e1?.v is equivalent to e1?.v += 1.
- { var c = new C(1) as C?; Expect.equals(2, ++c?.v); Expect.equals(2, c!.v); }
+ { C? c = new C(1); Expect.equals(2, ++c?.v); Expect.equals(2, c!.v); }
// ++C?.v is equivalent to C?.v += 1.
diff --git a/tests/language/null_aware/increment_decrement_runtime_19_test.dart b/tests/language/null_aware/increment_decrement_runtime_19_test.dart
index 0677ac7..bb8c565 100644
--- a/tests/language/null_aware/increment_decrement_runtime_19_test.dart
+++ b/tests/language/null_aware/increment_decrement_runtime_19_test.dart
@@ -84,7 +84,7 @@
// The static type of ++e1?.v is the same as the static type of e1.v + 1.
- { var d = new D(new E()) as D?; F? f = ++d?.v; Expect.identical(d!.v, f); }
+ { D? d = new D(new E()); F? f = ++d?.v; Expect.identical(d!.v, f); }
diff --git a/tests/language/null_aware/increment_decrement_runtime_23_test.dart b/tests/language/null_aware/increment_decrement_runtime_23_test.dart
index 2927351..b2dc6b5 100644
--- a/tests/language/null_aware/increment_decrement_runtime_23_test.dart
+++ b/tests/language/null_aware/increment_decrement_runtime_23_test.dart
@@ -93,7 +93,7 @@
// --e1?.v is equivalent to e1?.v -= 1.
- { var c = new C(1) as C?; Expect.equals(0, --c?.v); Expect.equals(0, c!.v); }
+ { C? c = new C(1); Expect.equals(0, --c?.v); Expect.equals(0, c!.v); }
// --C?.v is equivalent to C?.v -= 1.
diff --git a/tests/language/null_aware/increment_decrement_runtime_26_test.dart b/tests/language/null_aware/increment_decrement_runtime_26_test.dart
index 903c33a..4201d15 100644
--- a/tests/language/null_aware/increment_decrement_runtime_26_test.dart
+++ b/tests/language/null_aware/increment_decrement_runtime_26_test.dart
@@ -100,7 +100,7 @@
// The static type of --e1?.v is the same as the static type of e1.v - 1.
- { var d = new D(new E()) as D?; F? f = --d?.v; Expect.identical(d!.v, f); }
+ { D? d = new D(new E()); F? f = --d?.v; Expect.identical(d!.v, f); }
diff --git a/tests/language/null_aware/increment_decrement_runtime_2_test.dart b/tests/language/null_aware/increment_decrement_runtime_2_test.dart
index 3a29ccc..67bca4a 100644
--- a/tests/language/null_aware/increment_decrement_runtime_2_test.dart
+++ b/tests/language/null_aware/increment_decrement_runtime_2_test.dart
@@ -45,7 +45,7 @@
// e1?.v++ is equivalent to ((x) => x == null ? null : x.v++)(e1).
- { var c = new C(1) as C?; Expect.equals(1, c?.v++); Expect.equals(2, c!.v); }
+ { C? c = new C(1); Expect.equals(1, c?.v++); Expect.equals(2, c!.v); }
// C?.v++ is equivalent to C.v++.
diff --git a/tests/language/null_aware/increment_decrement_runtime_5_test.dart b/tests/language/null_aware/increment_decrement_runtime_5_test.dart
index 0cc85fb..8ca6c72 100644
--- a/tests/language/null_aware/increment_decrement_runtime_5_test.dart
+++ b/tests/language/null_aware/increment_decrement_runtime_5_test.dart
@@ -52,7 +52,7 @@
// The static type of e1?.v++ is the same as the static type of e1.v.
- { E e1 = new E(); var d = new D(e1) as D?; E? e2 = d?.v++; Expect.identical(e1, e2); }
+ { E e1 = new E(); D? d = new D(e1); E? e2 = d?.v++; Expect.identical(e1, e2); }
diff --git a/tests/language/null_aware/increment_decrement_runtime_9_test.dart b/tests/language/null_aware/increment_decrement_runtime_9_test.dart
index 7b42679..cd3bd72 100644
--- a/tests/language/null_aware/increment_decrement_runtime_9_test.dart
+++ b/tests/language/null_aware/increment_decrement_runtime_9_test.dart
@@ -61,7 +61,7 @@
// e1?.v-- is equivalent to ((x) => x == null ? null : x.v--)(e1).
- { var c = new C(1) as C?; Expect.equals(1, c?.v--); Expect.equals(0, c!.v); }
+ { C? c = new C(1); Expect.equals(1, c?.v--); Expect.equals(0, c!.v); }
// C?.v-- is equivalent to C.v--.
diff --git a/tests/language/null_aware/increment_decrement_test.dart b/tests/language/null_aware/increment_decrement_test.dart
index 7e80690..0b620fc 100644
--- a/tests/language/null_aware/increment_decrement_test.dart
+++ b/tests/language/null_aware/increment_decrement_test.dart
@@ -42,16 +42,16 @@
// e1?.v++ is equivalent to ((x) => x == null ? null : x.v++)(e1).
Expect.equals(null, nullC()?.v++);
- { var c = new C(1) as C?; Expect.equals(1, c?.v++); Expect.equals(2, c!.v); }
+ { C? c = new C(1); Expect.equals(1, c?.v++); Expect.equals(2, c!.v); }
// C?.v++ is equivalent to C.v++.
{ C.staticInt = 1; Expect.equals(1, C?.staticInt++); Expect.equals(2, C.staticInt); }
{ h.C.staticInt = 1; Expect.equals(1, h.C?.staticInt++); Expect.equals(2, h.C.staticInt); }
// The static type of e1?.v++ is the same as the static type of e1.v.
- { E e1 = new E(); var d = new D(e1) as D?; E? e2 = d?.v++; Expect.identical(e1, e2); }
- { G g = new G(); var d = new D(g) as D?; F? f = d?.v++; Expect.identical(f, g); }
- // ^^^^^^
+ { E e1 = new E(); D? d = new D(e1); E? e2 = d?.v++; Expect.identical(e1, e2); }
+ { G g = new G(); D? d = new D(g); F? f = d?.v++; Expect.identical(f, g); }
+ // ^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'E?' can't be assigned to a variable of type 'F?'.
{ E e1 = new E(); D.staticE = e1; E? e2 = D?.staticE++; Expect.identical(e1, e2); }
@@ -69,16 +69,16 @@
// e1?.v-- is equivalent to ((x) => x == null ? null : x.v--)(e1).
Expect.equals(null, nullC()?.v--);
- { var c = new C(1) as C?; Expect.equals(1, c?.v--); Expect.equals(0, c!.v); }
+ { C? c = new C(1); Expect.equals(1, c?.v--); Expect.equals(0, c!.v); }
// C?.v-- is equivalent to C.v--.
{ C.staticInt = 1; Expect.equals(1, C?.staticInt--); Expect.equals(0, C.staticInt); }
{ h.C.staticInt = 1; Expect.equals(1, h.C?.staticInt--); Expect.equals(0, h.C.staticInt); }
// The static type of e1?.v-- is the same as the static type of e1.v.
- { E e1 = new E(); var d = new D(e1) as D?; E? e2 = d?.v--; Expect.identical(e1, e2); }
- { G g = new G(); var d = new D(g) as D?; F? f = d?.v--; Expect.identical(f, g); }
- // ^^^^^^
+ { E e1 = new E(); D? d = new D(e1); E? e2 = d?.v--; Expect.identical(e1, e2); }
+ { G g = new G(); D? d = new D(g); F? f = d?.v--; Expect.identical(f, g); }
+ // ^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'E?' can't be assigned to a variable of type 'F?'.
{ E e1 = new E(); D.staticE = e1; E? e2 = D?.staticE--; Expect.identical(e1, e2); }
@@ -96,18 +96,18 @@
// ++e1?.v is equivalent to e1?.v += 1.
Expect.equals(null, ++nullC()?.v);
- { var c = new C(1) as C?; Expect.equals(2, ++c?.v); Expect.equals(2, c!.v); }
+ { C? c = new C(1); Expect.equals(2, ++c?.v); Expect.equals(2, c!.v); }
// ++C?.v is equivalent to C?.v += 1.
{ C.staticInt = 1; Expect.equals(2, ++C?.staticInt); Expect.equals(2, C.staticInt); }
{ h.C.staticInt = 1; Expect.equals(2, ++h.C?.staticInt); Expect.equals(2, h.C.staticInt); }
// The static type of ++e1?.v is the same as the static type of e1.v + 1.
- { var d = new D(new E()) as D?; F? f = ++d?.v; Expect.identical(d!.v, f); }
- { var d = new D(new E()) as D?; H? h = ++d?.v; Expect.identical(d!.v, h); }
- // ^^^^^^
+ { D? d = new D(new E()); F? f = ++d?.v; Expect.identical(d!.v, f); }
+ { D? d = new D(new E()); H? h = ++d?.v; Expect.identical(d!.v, h); }
+ // ^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
- // ^
+ // ^
// [cfe] A value of type 'G?' can't be assigned to a variable of type 'H?'.
{ D.staticE = new E(); F? f = ++D?.staticE; Expect.identical(D.staticE, f); }
{ h.D.staticE = new h.E(); h.F? f = ++h.D?.staticE; Expect.identical(h.D.staticE, f); }
@@ -124,18 +124,18 @@
// --e1?.v is equivalent to e1?.v -= 1.
Expect.equals(null, --nullC()?.v);
- { var c = new C(1) as C?; Expect.equals(0, --c?.v); Expect.equals(0, c!.v); }
+ { C? c = new C(1); Expect.equals(0, --c?.v); Expect.equals(0, c!.v); }
// --C?.v is equivalent to C?.v -= 1.
{ C.staticInt = 1; Expect.equals(0, --C?.staticInt); Expect.equals(0, C.staticInt); }
{ h.C.staticInt = 1; Expect.equals(0, --h.C?.staticInt); Expect.equals(0, h.C.staticInt); }
// The static type of --e1?.v is the same as the static type of e1.v - 1.
- { var d = new D(new E()) as D?; F? f = --d?.v; Expect.identical(d!.v, f); }
- { var d = new D(new E()) as D?; H? h = --d?.v; Expect.identical(d!.v, h); }
- // ^^^^^^
+ { D? d = new D(new E()); F? f = --d?.v; Expect.identical(d!.v, f); }
+ { D? d = new D(new E()); H? h = --d?.v; Expect.identical(d!.v, h); }
+ // ^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
- // ^
+ // ^
// [cfe] A value of type 'G?' can't be assigned to a variable of type 'H?'.
{ D.staticE = new E(); F? f = --D?.staticE; Expect.identical(D.staticE, f); }
{ h.D.staticE = new h.E(); h.F? f = --h.D?.staticE; Expect.identical(h.D.staticE, f); }
diff --git a/tests/language/null_aware/invocation_runtime_2_test.dart b/tests/language/null_aware/invocation_runtime_2_test.dart
index 8c11b27..70a36d1 100644
--- a/tests/language/null_aware/invocation_runtime_2_test.dart
+++ b/tests/language/null_aware/invocation_runtime_2_test.dart
@@ -32,7 +32,7 @@
// o?.m(...) is equivalent to ((x) => x == null ? null : x.m(...))(o).
- var c = C() as C?;
+ C? c = C();
Expect.equals(1, c?.f(() => 1));
// C?.m(...) is equivalent to C.m(...).
diff --git a/tests/language/null_aware/invocation_runtime_6_test.dart b/tests/language/null_aware/invocation_runtime_6_test.dart
index bbabd59..23559d8 100644
--- a/tests/language/null_aware/invocation_runtime_6_test.dart
+++ b/tests/language/null_aware/invocation_runtime_6_test.dart
@@ -41,7 +41,7 @@
// The static type of o?.m(...) is the same as the static type of
// o.m(...).
- var c = new C() as C?;
+ C? c = new C();
{ int? i = c?.g(() => 1); Expect.equals(1, i); }
diff --git a/tests/language/null_aware/invocation_test.dart b/tests/language/null_aware/invocation_test.dart
index b1f38e6..a1515fa 100644
--- a/tests/language/null_aware/invocation_test.dart
+++ b/tests/language/null_aware/invocation_test.dart
@@ -23,7 +23,7 @@
C? nullC() => null;
main() {
- var c = C() as C?;
+ C? c = C();
// Make sure the "none" test fails if method invocation using "?." is not
// implemented. This makes status files easier to maintain.
@@ -66,12 +66,12 @@
// Let T be the static type of o and let y be a fresh variable of type T.
// Exactly the same static warnings that would be caused by y.m(...) are also
// generated in the case of o?.m(...).
- { var b = new C() as B?; Expect.equals(1, b?.f(() => 1)); }
- // ^
+ { B? b = new C(); Expect.equals(1, b?.f(() => 1)); }
+ // ^
// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'f' isn't defined for the class 'B'.
- { var i = 1 as int?; Expect.equals(null, nullC()?.f(i)); }
- // ^
+ { int? i = 1; Expect.equals(null, nullC()?.f(i)); }
+ // ^
// [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
// [cfe] The argument type 'int?' can't be assigned to the parameter type 'dynamic Function()?'.
diff --git a/tests/language/null_aware/null_shortening_test.dart b/tests/language/null_aware/null_shortening_test.dart
index eaaffe5..f4ce95c 100644
--- a/tests/language/null_aware/null_shortening_test.dart
+++ b/tests/language/null_aware/null_shortening_test.dart
@@ -50,11 +50,11 @@
main() {
C1 c1 = C1();
- var c1q = c1 as C1?;
+ C1? c1q = c1;
C1? c1n = null;
C2 c2 = C2();
- var c2q = c2 as C2?;
+ C2? c2q = c2;
// All selector operations short on null.
// .foo
diff --git a/tests/language/null_aware/opt_test.dart b/tests/language/null_aware/opt_test.dart
index 57f3848..c5bb8a7 100644
--- a/tests/language/null_aware/opt_test.dart
+++ b/tests/language/null_aware/opt_test.dart
@@ -23,17 +23,17 @@
test() {
var c;
- var d = new C(5) as C?;
+ C? d = new C(5);
Expect.equals(null, c?.m(bomb()));
Expect.equals(null, getNull()?.anything(bomb()));
Expect.equals(1, d?.m(1));
- var c2 = new C(1) as C?;
+ C? c2 = new C(1);
Expect.equals(1, c2?.f);
Expect.equals(null, c?.v);
Expect.equals(10, c ?? 10);
Expect.equals(d, d ?? bomb());
- var list = [[3]] as List<List<int>>?;
+ List<List<int>>? list = [[3]];
Expect.equals(
3,
list?.expand((i) => i).toList()[0]);
@@ -58,7 +58,7 @@
e?.f++;
Expect.equals(201, e.f);
- var five = 5 as int?;
+ int? five = 5;
var x = five ?? bomb();
}
diff --git a/tests/language/regress/regress29784_test.dart b/tests/language/regress/regress29784_test.dart
index 0df166f..37db686 100644
--- a/tests/language/regress/regress29784_test.dart
+++ b/tests/language/regress/regress29784_test.dart
@@ -16,6 +16,7 @@
// [cfe] Can't access 'this' in a field initializer to read 'a'.
A.ko() : assert(a == null);
// ^
+ // [analyzer] COMPILE_TIME_ERROR.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER
// [cfe] Can't access 'this' in a field initializer to read 'a'.
var a, b;
}
diff --git a/tests/language/spread_collections/const_test.dart b/tests/language/spread_collections/const_test.dart
index cab125f..1eb4d76 100644
--- a/tests/language/spread_collections/const_test.dart
+++ b/tests/language/spread_collections/const_test.dart
@@ -43,8 +43,8 @@
const <int>[...<int>[...<int>[1, 2], ...<int>[3, 4]]]);
// Null-aware.
- const list23 = <int>[2, 3] as List<int>?;
- const list4 = <int>[4] as List<int>?;
+ const List<int>? list23 = <int>[2, 3];
+ const List<int>? list4 = <int>[4];
Expect.identical(list,
const <int>[1, ...?list23, ...?(null), ...?list4]);
@@ -98,8 +98,8 @@
});
// Null-aware.
- const map23 = <int, int>{2: 2, 3: 3} as Map<int, int>?;
- const map4 = <int, int>{4: 4} as Map<int, int>?;
+ const Map<int, int>? map23 = <int, int>{2: 2, 3: 3};
+ const Map<int, int>? map4 = <int, int>{4: 4};
Expect.identical(map, const <int, int>{
1: 1,
...?map23,
@@ -155,8 +155,8 @@
Expect.identical(set, const <int>{...<int>{...<int>[1, 2], ...<int>[3, 4]}});
// Null-aware.
- const list23 = <int>[2, 3] as List<int>?;
- const list4 = <int>[4] as List<int>?;
+ const List<int>? list23 = <int>[2, 3];
+ const List<int>? list4 = <int>[4];
Expect.identical(set,
const <int>{1, ...?list23, ...?(null), ...?list4});
diff --git a/tests/language/spread_collections/spread_test.dart b/tests/language/spread_collections/spread_test.dart
index baee04c..2a19168 100644
--- a/tests/language/spread_collections/spread_test.dart
+++ b/tests/language/spread_collections/spread_test.dart
@@ -43,8 +43,8 @@
Expect.listEquals(list, <int>[...<int>[...<int>[1, 2], ...<int>[3, 4]]]);
// Null-aware.
- var list23 = [2, 3] as List<int>?;
- var list4 = [4] as List<int>?;
+ List<int>? list23 = [2, 3];
+ List<int>? list4 = [4];
Expect.listEquals(list, <int>[1, ...?list23, ...?(null), ...?list4]);
// Does not deep flatten.
@@ -94,8 +94,8 @@
});
// Null-aware.
- var map23 = {2: 2, 3: 3} as Map<int, int>?;
- var map4 = {4: 4} as Map<int, int>?;
+ Map<int, int>? map23 = {2: 2, 3: 3};
+ Map<int, int>? map4 = {4: 4};
Expect.mapEquals(map, <int, int>{
1: 1,
...?map23,
@@ -147,8 +147,8 @@
Expect.setEquals(set, <int>{...<int>{...<int>[1, 2], ...<int>[3, 4]}});
// Null-aware.
- var list23 = [2, 3] as List<int>?;
- var list4 = [4] as List<int>?;
+ List<int>? list23 = [2, 3];
+ List<int>? list4 = [4];
Expect.setEquals(set, <int>{1, ...?list23, ...?(null), ...?list4});
// Does not deep flatten.
diff --git a/tests/language/spread_collections/syntax_test.dart b/tests/language/spread_collections/syntax_test.dart
index ed6676f..aa6a51f 100644
--- a/tests/language/spread_collections/syntax_test.dart
+++ b/tests/language/spread_collections/syntax_test.dart
@@ -17,11 +17,11 @@
var a = [0];
Expect.listEquals([1, 2, 3], [1, ...a = [2], 3]);
- var nullableA = [0] as List<int>?;
+ List<int>? nullableA = [0];
Expect.listEquals([1, 3], [1, ...?nullableA = null, 3]);
var b = [2];
Expect.listEquals([1, 2, 3, 4], [1, ...b..add(3), 4]);
- var nullableB = [2] as List<int>?;
+ List<int>? nullableB = [2];
Expect.listEquals([1, 2, 3, 4], [1, ...?nullableB?..add(3), 4]);
}
diff --git a/tests/language_2/regress/regress29784_test.dart b/tests/language_2/regress/regress29784_test.dart
index 0df166f..37db686 100644
--- a/tests/language_2/regress/regress29784_test.dart
+++ b/tests/language_2/regress/regress29784_test.dart
@@ -16,6 +16,7 @@
// [cfe] Can't access 'this' in a field initializer to read 'a'.
A.ko() : assert(a == null);
// ^
+ // [analyzer] COMPILE_TIME_ERROR.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER
// [cfe] Can't access 'this' in a field initializer to read 'a'.
var a, b;
}
diff --git a/tests/standalone/http_launch_test.dart b/tests/standalone/http_launch_test.dart
index 1c9f8ab..07d6c13 100644
--- a/tests/standalone/http_launch_test.dart
+++ b/tests/standalone/http_launch_test.dart
@@ -9,6 +9,7 @@
// OtherResources=http_launch_data/http_launch_main.dart
// OtherResources=http_launch_data/http_spawn_main.dart
// OtherResources=http_launch_data/the_packages/simple/simple.dart
+// OtherResources=http_launch_data/.dart_tool/package_config.json
// OtherResources=http_launch_data/.packages
//
// Test:
diff --git a/tests/standalone/io/file_long_path_test.dart b/tests/standalone/io/file_long_path_test.dart
new file mode 100644
index 0000000..454e633d
--- /dev/null
+++ b/tests/standalone/io/file_long_path_test.dart
@@ -0,0 +1,247 @@
+// 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.
+//
+// This test is Windows-only.
+
+import 'dart:io';
+
+import "package:expect/expect.dart";
+
+const maxPath = 260;
+const maxDirectoryPath = maxPath - 12;
+String longName = '${'x' * 248}';
+
+Directory createLongPathDir(Directory tmp) {
+ if (tmp.path.length <= maxDirectoryPath) {
+ var path = tmp.path;
+ path += '\\${'t' * 248}';
+ var dir = Directory(path);
+ dir.createSync(recursive: true);
+ // Test the rename() of directory
+ dir = dir.renameSync(tmp.path + '\\$longName');
+ Expect.isTrue(dir.existsSync());
+ Expect.isFalse(Directory(path).existsSync());
+ return dir;
+ } else {
+ return tmp;
+ }
+}
+
+void testCreate(String dir) {
+ final path = '${dir}\\a_long_path_filename';
+ Expect.isTrue(path.length > maxPath);
+ final file = File(path);
+ file.createSync();
+ Expect.isTrue(file.existsSync());
+ file.deleteSync();
+}
+
+void testCopy(String dir) {
+ final src = '${dir}\\a_long_path_filename_1';
+ final dest = '${dir}\\a_long_path_filename_2';
+ Expect.isTrue(src.length > maxPath);
+ final file1 = File(src);
+ file1.createSync();
+
+ final file2 = file1.copySync(dest);
+ Expect.isTrue(file2.existsSync());
+ file1.deleteSync();
+ file2.deleteSync();
+}
+
+void testRename(String dir) {
+ final path = '${dir}\\a_long_path_filename';
+ Expect.isTrue(path.length > maxPath);
+ final file = File(path);
+ file.createSync();
+ Expect.isTrue(file.existsSync());
+
+ final renamedFile = file.renameSync('${path}_copy');
+
+ Expect.isFalse(file.existsSync());
+ Expect.isTrue(renamedFile.existsSync());
+ renamedFile.deleteSync();
+}
+
+void testReadWrite(String dir) {
+ final path = '${dir}\\a_long_path_filename';
+ Expect.isTrue(path.length > maxPath);
+ final file = File(path);
+
+ final content = "testReadWrite";
+ file.writeAsStringSync(content);
+ Expect.isTrue(file.existsSync());
+
+ int length = file.lengthSync();
+ Expect.equals(content.length, length);
+
+ final string = file.readAsStringSync();
+ Expect.equals(content, string);
+ file.deleteSync();
+}
+
+void testOpen(String dir) {
+ final path = '${dir}\\a_long_path_filename';
+ Expect.isTrue(path.length > maxPath);
+ final file = File(path);
+ file.createSync();
+ final access = file.openSync();
+ access.closeSync();
+}
+
+void testFileStat(String dir) {
+ final path = '${dir}\\a_long_path_filename';
+ Expect.isTrue(path.length > maxPath);
+ final file = File(path);
+ file.createSync();
+ final stat = FileStat.statSync(file.path);
+
+ final dateTime = DateTime.utc(2020);
+
+ file.setLastModifiedSync(dateTime);
+ Expect.notEquals(
+ stat.modified.toString(), file.lastModifiedSync().toString());
+
+ file.setLastAccessedSync(dateTime);
+ Expect.notEquals(
+ stat.accessed.toString(), file.lastAccessedSync().toString());
+}
+
+void testCreateLinkToDir(String dir) {
+ final path = '${dir}\\a_long_path_linkname';
+ Expect.isTrue(path.length > maxPath);
+ var target = '$dir\\a_long_path_target';
+ final link = Link(path)..createSync(target);
+
+ final dest = Directory(target)..createSync();
+ Expect.isTrue(dest.existsSync());
+
+ Expect.isTrue(link.existsSync());
+ Expect.isTrue(link.targetSync().contains('a_long_path_target'));
+
+ // Rename link
+ var renamedLink = link.renameSync('${dir}\\a_renamed_long_path_link');
+ Expect.isTrue(renamedLink.existsSync());
+ Expect.isFalse(link.existsSync());
+ Expect.isTrue(renamedLink.targetSync().contains('a_long_path_target'));
+
+ // Update link target
+ target = '$dir\\an_updated_target';
+ final renamedDest = Directory(target)..createSync();
+ renamedLink.updateSync(target);
+ Expect.isTrue(renamedLink.targetSync().contains('an_updated_target'));
+
+ dest.deleteSync();
+ renamedDest.deleteSync();
+ renamedLink.deleteSync();
+}
+
+void testCreateLinkToFile(String dir) {
+ final path = '${dir}\\a_long_path_linkname';
+ Expect.isTrue(path.length > maxPath);
+ var target = '$dir\\a_long_path_target';
+ final link = Link(path)..createSync(target);
+
+ final dest = File(target)..createSync();
+ Expect.isTrue(dest.existsSync());
+
+ Expect.isTrue(link.existsSync());
+ Expect.isTrue(link.targetSync().contains('a_long_path_target'));
+ Expect.isTrue(link.resolveSymbolicLinksSync().contains('a_long_path_target'));
+
+ // Rename link
+ var renamedLink = link.renameSync('${dir}\\a_renamed_long_path_link');
+ Expect.isTrue(renamedLink.existsSync());
+ Expect.isFalse(link.existsSync());
+ Expect.isTrue(renamedLink.targetSync().contains('a_long_path_target'));
+
+ // Update link target
+ target = '$dir\\an_updated_target';
+ final renamedDest = File(target)..createSync();
+ renamedLink.updateSync(target);
+ Expect.isTrue(renamedLink.targetSync().contains('an_updated_target'));
+
+ dest.deleteSync();
+ renamedDest.deleteSync();
+ renamedLink.deleteSync();
+}
+
+testNormalLinkToLongPath(String short, String long) {
+ var target = File('$long\\file_target')..createSync();
+ final link = Link('$short\\link')..createSync(target.path);
+ Expect.isTrue(target.path.length > maxPath);
+ Expect.isTrue(link.resolveSymbolicLinksSync().length > maxPath);
+ Expect.isTrue(link.path.length < maxPath);
+ Expect.isTrue(link.resolveSymbolicLinksSync().contains('file_target'));
+
+ Expect.isTrue(link.existsSync());
+ Expect.equals(target.path, link.targetSync());
+
+ var targetDir = Directory('$long\\dir_target')..createSync();
+ link.updateSync(targetDir.path);
+ Expect.equals(targetDir.path, link.targetSync());
+
+ link.deleteSync();
+ target.deleteSync();
+ targetDir.deleteSync();
+}
+
+testLongPathLinkToNormal(String short, String long) {
+ var target = File('$short\\file_target')..createSync();
+ final link = Link('$long\\link')..createSync(target.path);
+
+ Expect.isTrue(target.path.length < maxPath);
+ Expect.isTrue(link.path.length > maxPath);
+ Expect.isTrue(link.resolveSymbolicLinksSync().contains('file_target'));
+
+ Expect.isTrue(link.existsSync());
+ Expect.equals(target.path, link.targetSync());
+
+ var targetDir = Directory('$short\\dir_target')..createSync();
+ link.updateSync(targetDir.path);
+ Expect.equals(targetDir.path, link.targetSync());
+
+ link.deleteSync();
+ target.deleteSync();
+ targetDir.deleteSync();
+}
+
+testDirectorySetCurrent(String dir) {
+ // This tests setting a long path directory to current directory.
+ // This will fail.
+ Expect.isTrue(dir.length > maxPath);
+ Expect.throws<FileSystemException>(() {
+ Directory.current = dir;
+ }, (e) => e.toString().contains('extension is too long'));
+}
+
+void main() {
+ if (!Platform.isWindows) {
+ return;
+ }
+ final tmp = Directory.systemTemp.createTempSync('dart-file-long-path');
+ final oldCurrent = Directory.current;
+ Directory.current = tmp;
+ try {
+ String dir = createLongPathDir(tmp).path;
+ testDirectorySetCurrent(dir);
+ for (final path in [dir, ".\\$longName", ".\\$longName\\..\\$longName"]) {
+ testCreate(path);
+ testCopy(path);
+ testRename(path);
+ testReadWrite(path);
+ testOpen(path);
+ testFileStat(path);
+ testCreateLinkToDir(path);
+ testCreateLinkToFile(path);
+ }
+
+ testNormalLinkToLongPath(tmp.path, dir);
+ testLongPathLinkToNormal(tmp.path, dir);
+ } finally {
+ // Reset the current Directory.
+ Directory.current = oldCurrent;
+ tmp.deleteSync(recursive: true);
+ }
+}
diff --git a/tests/standalone/io/file_relative_long_path_test.dart b/tests/standalone/io/file_relative_long_path_test.dart
new file mode 100644
index 0000000..0c53ab3
--- /dev/null
+++ b/tests/standalone/io/file_relative_long_path_test.dart
@@ -0,0 +1,39 @@
+// 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.
+//
+// This test is Windows-only. It tests a short (shorter than 260) relative path
+// representing a long absolute path cannot be used by Windows API. Running this
+// test without proper support on long path will get an error.
+
+import 'dart:io';
+
+const maxPath = 260;
+
+void main(args) {
+ if (!Platform.isWindows) {
+ return;
+ }
+ final dir = Directory.systemTemp.createTempSync('test');
+
+ if (dir.path.length >= maxPath) {
+ return;
+ }
+
+ // Make sure oldpath is shorter than MAX_PATH (260).
+ int length = (maxPath - dir.path.length) ~/ 2;
+ final oldpath = Directory('${dir.path}\\${'x' * length}}');
+ oldpath.createSync(recursive: true);
+ final temp = Directory.current;
+
+ Directory.current = oldpath.path;
+
+ // The length of relative path is always shorter than maxPath, but it
+ // represents a path exceeding the maxPath.
+ final newpath = Directory('.\\${'y' * 2 * length}');
+ newpath.createSync();
+
+ // Reset current directory before deletion.
+ Directory.current = temp.path;
+ dir.deleteSync(recursive: true);
+}
diff --git a/tests/standalone/io/http_redirect_test.dart b/tests/standalone/io/http_redirect_test.dart
index c008a34..f68e32f 100644
--- a/tests/standalone/io/http_redirect_test.dart
+++ b/tests/standalone/io/http_redirect_test.dart
@@ -106,6 +106,7 @@
addRedirectHandler(n++, HttpStatus.movedTemporarily);
addRedirectHandler(n++, HttpStatus.seeOther);
addRedirectHandler(n++, HttpStatus.temporaryRedirect);
+ addRedirectHandler(n++, HttpStatus.permanentRedirect);
for (int i = n; i < 10; i++) {
addRedirectHandler(i, HttpStatus.movedPermanently);
}
diff --git a/tests/standalone/out_of_memory_slow_growth_test.dart b/tests/standalone/out_of_memory_slow_growth_test.dart
new file mode 100644
index 0000000..e534dc6
--- /dev/null
+++ b/tests/standalone/out_of_memory_slow_growth_test.dart
@@ -0,0 +1,24 @@
+// 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.
+
+// VMOptions=--old_gen_heap_size=20
+// VMOptions=--old_gen_heap_size=20 --enable_vm_service --pause_isolates_on_unhandled_exceptions
+
+import "package:expect/expect.dart";
+
+main() {
+ var leak;
+ var exceptionThrown = false;
+ try {
+ leak = [];
+ while (true) {
+ leak = [leak];
+ }
+ } on OutOfMemoryError catch (exception) {
+ leak = null;
+ exceptionThrown = true;
+ print("Okay");
+ }
+ Expect.isTrue(exceptionThrown);
+}
diff --git a/tests/standalone_2/io/file_long_path_test.dart b/tests/standalone_2/io/file_long_path_test.dart
new file mode 100644
index 0000000..454e633d
--- /dev/null
+++ b/tests/standalone_2/io/file_long_path_test.dart
@@ -0,0 +1,247 @@
+// 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.
+//
+// This test is Windows-only.
+
+import 'dart:io';
+
+import "package:expect/expect.dart";
+
+const maxPath = 260;
+const maxDirectoryPath = maxPath - 12;
+String longName = '${'x' * 248}';
+
+Directory createLongPathDir(Directory tmp) {
+ if (tmp.path.length <= maxDirectoryPath) {
+ var path = tmp.path;
+ path += '\\${'t' * 248}';
+ var dir = Directory(path);
+ dir.createSync(recursive: true);
+ // Test the rename() of directory
+ dir = dir.renameSync(tmp.path + '\\$longName');
+ Expect.isTrue(dir.existsSync());
+ Expect.isFalse(Directory(path).existsSync());
+ return dir;
+ } else {
+ return tmp;
+ }
+}
+
+void testCreate(String dir) {
+ final path = '${dir}\\a_long_path_filename';
+ Expect.isTrue(path.length > maxPath);
+ final file = File(path);
+ file.createSync();
+ Expect.isTrue(file.existsSync());
+ file.deleteSync();
+}
+
+void testCopy(String dir) {
+ final src = '${dir}\\a_long_path_filename_1';
+ final dest = '${dir}\\a_long_path_filename_2';
+ Expect.isTrue(src.length > maxPath);
+ final file1 = File(src);
+ file1.createSync();
+
+ final file2 = file1.copySync(dest);
+ Expect.isTrue(file2.existsSync());
+ file1.deleteSync();
+ file2.deleteSync();
+}
+
+void testRename(String dir) {
+ final path = '${dir}\\a_long_path_filename';
+ Expect.isTrue(path.length > maxPath);
+ final file = File(path);
+ file.createSync();
+ Expect.isTrue(file.existsSync());
+
+ final renamedFile = file.renameSync('${path}_copy');
+
+ Expect.isFalse(file.existsSync());
+ Expect.isTrue(renamedFile.existsSync());
+ renamedFile.deleteSync();
+}
+
+void testReadWrite(String dir) {
+ final path = '${dir}\\a_long_path_filename';
+ Expect.isTrue(path.length > maxPath);
+ final file = File(path);
+
+ final content = "testReadWrite";
+ file.writeAsStringSync(content);
+ Expect.isTrue(file.existsSync());
+
+ int length = file.lengthSync();
+ Expect.equals(content.length, length);
+
+ final string = file.readAsStringSync();
+ Expect.equals(content, string);
+ file.deleteSync();
+}
+
+void testOpen(String dir) {
+ final path = '${dir}\\a_long_path_filename';
+ Expect.isTrue(path.length > maxPath);
+ final file = File(path);
+ file.createSync();
+ final access = file.openSync();
+ access.closeSync();
+}
+
+void testFileStat(String dir) {
+ final path = '${dir}\\a_long_path_filename';
+ Expect.isTrue(path.length > maxPath);
+ final file = File(path);
+ file.createSync();
+ final stat = FileStat.statSync(file.path);
+
+ final dateTime = DateTime.utc(2020);
+
+ file.setLastModifiedSync(dateTime);
+ Expect.notEquals(
+ stat.modified.toString(), file.lastModifiedSync().toString());
+
+ file.setLastAccessedSync(dateTime);
+ Expect.notEquals(
+ stat.accessed.toString(), file.lastAccessedSync().toString());
+}
+
+void testCreateLinkToDir(String dir) {
+ final path = '${dir}\\a_long_path_linkname';
+ Expect.isTrue(path.length > maxPath);
+ var target = '$dir\\a_long_path_target';
+ final link = Link(path)..createSync(target);
+
+ final dest = Directory(target)..createSync();
+ Expect.isTrue(dest.existsSync());
+
+ Expect.isTrue(link.existsSync());
+ Expect.isTrue(link.targetSync().contains('a_long_path_target'));
+
+ // Rename link
+ var renamedLink = link.renameSync('${dir}\\a_renamed_long_path_link');
+ Expect.isTrue(renamedLink.existsSync());
+ Expect.isFalse(link.existsSync());
+ Expect.isTrue(renamedLink.targetSync().contains('a_long_path_target'));
+
+ // Update link target
+ target = '$dir\\an_updated_target';
+ final renamedDest = Directory(target)..createSync();
+ renamedLink.updateSync(target);
+ Expect.isTrue(renamedLink.targetSync().contains('an_updated_target'));
+
+ dest.deleteSync();
+ renamedDest.deleteSync();
+ renamedLink.deleteSync();
+}
+
+void testCreateLinkToFile(String dir) {
+ final path = '${dir}\\a_long_path_linkname';
+ Expect.isTrue(path.length > maxPath);
+ var target = '$dir\\a_long_path_target';
+ final link = Link(path)..createSync(target);
+
+ final dest = File(target)..createSync();
+ Expect.isTrue(dest.existsSync());
+
+ Expect.isTrue(link.existsSync());
+ Expect.isTrue(link.targetSync().contains('a_long_path_target'));
+ Expect.isTrue(link.resolveSymbolicLinksSync().contains('a_long_path_target'));
+
+ // Rename link
+ var renamedLink = link.renameSync('${dir}\\a_renamed_long_path_link');
+ Expect.isTrue(renamedLink.existsSync());
+ Expect.isFalse(link.existsSync());
+ Expect.isTrue(renamedLink.targetSync().contains('a_long_path_target'));
+
+ // Update link target
+ target = '$dir\\an_updated_target';
+ final renamedDest = File(target)..createSync();
+ renamedLink.updateSync(target);
+ Expect.isTrue(renamedLink.targetSync().contains('an_updated_target'));
+
+ dest.deleteSync();
+ renamedDest.deleteSync();
+ renamedLink.deleteSync();
+}
+
+testNormalLinkToLongPath(String short, String long) {
+ var target = File('$long\\file_target')..createSync();
+ final link = Link('$short\\link')..createSync(target.path);
+ Expect.isTrue(target.path.length > maxPath);
+ Expect.isTrue(link.resolveSymbolicLinksSync().length > maxPath);
+ Expect.isTrue(link.path.length < maxPath);
+ Expect.isTrue(link.resolveSymbolicLinksSync().contains('file_target'));
+
+ Expect.isTrue(link.existsSync());
+ Expect.equals(target.path, link.targetSync());
+
+ var targetDir = Directory('$long\\dir_target')..createSync();
+ link.updateSync(targetDir.path);
+ Expect.equals(targetDir.path, link.targetSync());
+
+ link.deleteSync();
+ target.deleteSync();
+ targetDir.deleteSync();
+}
+
+testLongPathLinkToNormal(String short, String long) {
+ var target = File('$short\\file_target')..createSync();
+ final link = Link('$long\\link')..createSync(target.path);
+
+ Expect.isTrue(target.path.length < maxPath);
+ Expect.isTrue(link.path.length > maxPath);
+ Expect.isTrue(link.resolveSymbolicLinksSync().contains('file_target'));
+
+ Expect.isTrue(link.existsSync());
+ Expect.equals(target.path, link.targetSync());
+
+ var targetDir = Directory('$short\\dir_target')..createSync();
+ link.updateSync(targetDir.path);
+ Expect.equals(targetDir.path, link.targetSync());
+
+ link.deleteSync();
+ target.deleteSync();
+ targetDir.deleteSync();
+}
+
+testDirectorySetCurrent(String dir) {
+ // This tests setting a long path directory to current directory.
+ // This will fail.
+ Expect.isTrue(dir.length > maxPath);
+ Expect.throws<FileSystemException>(() {
+ Directory.current = dir;
+ }, (e) => e.toString().contains('extension is too long'));
+}
+
+void main() {
+ if (!Platform.isWindows) {
+ return;
+ }
+ final tmp = Directory.systemTemp.createTempSync('dart-file-long-path');
+ final oldCurrent = Directory.current;
+ Directory.current = tmp;
+ try {
+ String dir = createLongPathDir(tmp).path;
+ testDirectorySetCurrent(dir);
+ for (final path in [dir, ".\\$longName", ".\\$longName\\..\\$longName"]) {
+ testCreate(path);
+ testCopy(path);
+ testRename(path);
+ testReadWrite(path);
+ testOpen(path);
+ testFileStat(path);
+ testCreateLinkToDir(path);
+ testCreateLinkToFile(path);
+ }
+
+ testNormalLinkToLongPath(tmp.path, dir);
+ testLongPathLinkToNormal(tmp.path, dir);
+ } finally {
+ // Reset the current Directory.
+ Directory.current = oldCurrent;
+ tmp.deleteSync(recursive: true);
+ }
+}
diff --git a/tests/standalone_2/io/file_relative_long_path_test.dart b/tests/standalone_2/io/file_relative_long_path_test.dart
new file mode 100644
index 0000000..0c53ab3
--- /dev/null
+++ b/tests/standalone_2/io/file_relative_long_path_test.dart
@@ -0,0 +1,39 @@
+// 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.
+//
+// This test is Windows-only. It tests a short (shorter than 260) relative path
+// representing a long absolute path cannot be used by Windows API. Running this
+// test without proper support on long path will get an error.
+
+import 'dart:io';
+
+const maxPath = 260;
+
+void main(args) {
+ if (!Platform.isWindows) {
+ return;
+ }
+ final dir = Directory.systemTemp.createTempSync('test');
+
+ if (dir.path.length >= maxPath) {
+ return;
+ }
+
+ // Make sure oldpath is shorter than MAX_PATH (260).
+ int length = (maxPath - dir.path.length) ~/ 2;
+ final oldpath = Directory('${dir.path}\\${'x' * length}}');
+ oldpath.createSync(recursive: true);
+ final temp = Directory.current;
+
+ Directory.current = oldpath.path;
+
+ // The length of relative path is always shorter than maxPath, but it
+ // represents a path exceeding the maxPath.
+ final newpath = Directory('.\\${'y' * 2 * length}');
+ newpath.createSync();
+
+ // Reset current directory before deletion.
+ Directory.current = temp.path;
+ dir.deleteSync(recursive: true);
+}
diff --git a/tests/standalone_2/io/http_redirect_test.dart b/tests/standalone_2/io/http_redirect_test.dart
index 1e54bb9..ccb95c5 100644
--- a/tests/standalone_2/io/http_redirect_test.dart
+++ b/tests/standalone_2/io/http_redirect_test.dart
@@ -106,6 +106,7 @@
addRedirectHandler(n++, HttpStatus.movedTemporarily);
addRedirectHandler(n++, HttpStatus.seeOther);
addRedirectHandler(n++, HttpStatus.temporaryRedirect);
+ addRedirectHandler(n++, HttpStatus.permanentRedirect);
for (int i = n; i < 10; i++) {
addRedirectHandler(i, HttpStatus.movedPermanently);
}
diff --git a/tests/standalone_2/out_of_memory_slow_growth_test.dart b/tests/standalone_2/out_of_memory_slow_growth_test.dart
new file mode 100644
index 0000000..e534dc6
--- /dev/null
+++ b/tests/standalone_2/out_of_memory_slow_growth_test.dart
@@ -0,0 +1,24 @@
+// 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.
+
+// VMOptions=--old_gen_heap_size=20
+// VMOptions=--old_gen_heap_size=20 --enable_vm_service --pause_isolates_on_unhandled_exceptions
+
+import "package:expect/expect.dart";
+
+main() {
+ var leak;
+ var exceptionThrown = false;
+ try {
+ leak = [];
+ while (true) {
+ leak = [leak];
+ }
+ } on OutOfMemoryError catch (exception) {
+ leak = null;
+ exceptionThrown = true;
+ print("Okay");
+ }
+ Expect.isTrue(exceptionThrown);
+}
diff --git a/tools/VERSION b/tools/VERSION
index 32d89b9..3731a6d 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 11
PATCH 0
-PRERELEASE 181
+PRERELEASE 182
PRERELEASE_PATCH 0
\ No newline at end of file