Version 2.10.0-77.0.dev

Merge commit '0967d19156acc5ca4fc1cf7dcc129d6c680f3696' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index 052e071..c3ba326 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -178,7 +178,7 @@
       "name": "csslib",
       "rootUri": "../third_party/pkg/csslib",
       "packageUri": "lib/",
-      "languageVersion": "2.2"
+      "languageVersion": "2.10"
     },
     {
       "name": "dart2js_info",
@@ -752,4 +752,4 @@
       "languageVersion": "2.4"
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f605320..9e6332c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,7 +6,7 @@
 
 *   Adds `Abort` method to class `HttpClientRequest`, which allows users
     to cancel outgoing HTTP requests and stop following IO operations.
-*   A validtion check is added to `path` of class `Cookie`. Having characters
+*   A validation check is added to `path` of class `Cookie`. Having characters
     ranging from 0x00 to 0x1f and 0x3b (";") will lead to a `FormatException`.
 
 #### `dart:typed_data`
diff --git a/DEPS b/DEPS
index d6e2886..79c9692 100644
--- a/DEPS
+++ b/DEPS
@@ -44,7 +44,7 @@
   # co19 is a cipd package. Use update.sh in tests/co19[_2] to update these
   # hashes. It requires access to the dart-build-access group, which EngProd
   # has.
-  "co19_rev": "d94e371b8aafa3f4b88821c63a5ef1f618c2124d",
+  "co19_rev": "12855e59cd7e031d076cc8cece9f5ee08e77ca8c",
   "co19_2_rev": "e48b3090826cf40b8037648f19d211e8eab1b4b6",
 
   # The internal benchmarks to use. See go/dart-benchmarks-internal
@@ -79,8 +79,8 @@
   "collection_rev": "583693680fc067e34ca5b72503df25e8b80579f9",
   "convert_rev": "c1b01f832835d3d8a06b0b246a361c0eaab35d3c",
   "crypto_rev": "f7c48b334b1386bc5ab0f706fbcd6df8496a87fc",
-  "csslib_rev": "451448a9ac03f87a8d0377fc0b411d8c388a6cb4",
-  "dart2js_info_rev" : "94ba36cb77067f28b75a4212e77b810a2d7385e9",
+  "csslib_rev": "166d3e07eabc8283c6137cfde17fb25b8bb40080",
+  "dart2js_info_rev" : "0632a623b08e1f601c7eba99e0186a581ae799e9",
 
   # Note: Updates to dart_style have to be coordinated with the infrastructure
   # team so that the internal formatter in `tools/sdks/dart-sdk/bin/dartfmt`
diff --git a/pkg/_fe_analyzer_shared/lib/src/scanner/abstract_scanner.dart b/pkg/_fe_analyzer_shared/lib/src/scanner/abstract_scanner.dart
index 5f87669..da4fc35 100644
--- a/pkg/_fe_analyzer_shared/lib/src/scanner/abstract_scanner.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/scanner/abstract_scanner.dart
@@ -1894,8 +1894,9 @@
         codeUnits.add(next);
         next = advance();
       }
-      appendToken(new StringToken.fromString(TokenType.IDENTIFIER,
-          new String.fromCharCodes(codeUnits), charOffset));
+      appendToken(new StringToken.fromString(
+          TokenType.IDENTIFIER, new String.fromCharCodes(codeUnits), charOffset,
+          precedingComments: comments));
       return next;
     } else {
       prependErrorToken(errorToken);
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index 3a0b9e7..a3860dc 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -25,7 +25,7 @@
 
   void _addCommentRanges() {
     var token = _unit.beginToken;
-    do {
+    while (token != null) {
       Token commentToken = token.precedingComments;
       while (commentToken != null) {
         HighlightRegionType highlightType;
@@ -44,8 +44,13 @@
         }
         commentToken = commentToken.next;
       }
+      if (token.type == TokenType.EOF) {
+        // Only exit the loop *after* processing the EOF token as it may
+        // have preceeding comments.
+        break;
+      }
       token = token.next;
-    } while (token != null && token.type != TokenType.EOF);
+    }
   }
 
   void _addIdentifierRegion(SimpleIdentifier node) {
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights2.dart b/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
index 3be6bae..2c677c7 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
@@ -25,7 +25,7 @@
 
   void _addCommentRanges() {
     var token = _unit.beginToken;
-    do {
+    while (token != null) {
       Token commentToken = token.precedingComments;
       while (commentToken != null) {
         HighlightRegionType highlightType;
@@ -44,8 +44,13 @@
         }
         commentToken = commentToken.next;
       }
+      if (token.type == TokenType.EOF) {
+        // Only exit the loop *after* processing the EOF token as it may
+        // have preceeding comments.
+        break;
+      }
       token = token.next;
-    } while (token != null && token.type != TokenType.EOF);
+    }
   }
 
   void _addIdentifierRegion(SimpleIdentifier node) {
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 bb4ce51..f83015d 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
@@ -13,6 +13,7 @@
 import 'package:analysis_server/src/services/correction/dart/convert_add_all_to_spread.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_conditional_expression_to_if_element.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_documentation_into_line.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_map_from_iterable_to_for_literal.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_quotes.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_contains.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_generic_function_syntax.dart';
@@ -86,6 +87,8 @@
     LintNames.prefer_equal_for_default_values:
         ReplaceColonWithEquals.newInstance,
     LintNames.prefer_final_fields: MakeFinal.newInstance,
+    LintNames.prefer_for_elements_to_map_fromIterable:
+        ConvertMapFromIterableToForLiteral.newInstance,
     LintNames.prefer_generic_function_type_aliases:
         ConvertToGenericFunctionSyntax.newInstance,
     LintNames.prefer_if_elements_to_conditional_expressions:
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_error_code.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_error_code.dart
index 3a8456c..0235247 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_error_code.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_error_code.dart
@@ -12,15 +12,15 @@
    * Parameters:
    * 0: the unsupported key
    */
-  static const TransformSetErrorCode unsupportedKey = TransformSetErrorCode(
-      'unsupported_key', "The key '{0}' isn't supported.");
+  static const TransformSetErrorCode unsupportedKey =
+      TransformSetErrorCode('unsupportedKey', "The key '{0}' isn't supported.");
 
   /**
    * Parameters:
    * 0: the message produced by the YAML parser
    */
   static const TransformSetErrorCode yamlSyntaxError =
-      TransformSetErrorCode('yaml_syntax_error', "{0}");
+      TransformSetErrorCode('yamlSyntaxError', "{0}");
 
   /// Initialize a newly created error code.
   const TransformSetErrorCode(String name, String message,
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 3a3af62..d6330c2 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
@@ -43,12 +43,14 @@
   /// [errorReporter].
   TransformSetParser(this.errorReporter);
 
-  /// Return the result of parsing the file [content] into a transform set.
+  /// Return the result of parsing the file [content] into a transform set, or
+  /// `null` if the content does not represent a valid transform set.
   TransformSet parse(String content) {
     assert(content != null);
     var map = _parseYaml(content);
     if (map == null) {
-      return TransformSet();
+      // The error has already been reported.
+      return null;
     }
     return _translateTransformSet(map);
   }
@@ -89,7 +91,8 @@
     }
   }
 
-  /// Translate the [node] into a change.
+  /// Translate the [node] into a change. Return the resulting change, or `null`
+  /// if the [node] does not represent a valid change.
   Change _translateChange(YamlNode node) {
     if (node is YamlMap) {
       var kind = _translateString(node.valueAt(_kindKey));
@@ -108,12 +111,22 @@
     }
   }
 
-  /// Translate the [node] into an element descriptor.
+  /// Translate the [node] into an element descriptor. Return the resulting
+  /// descriptor, or `null` if the [node] does not represent a valid element
+  /// descriptor.
   ElementDescriptor _translateElement(YamlNode node) {
     if (node is YamlMap) {
       var uris = _translateList(node.valueAt(_urisKey), _translateString);
+      if (uris == null) {
+        // The error has already been reported.
+        return null;
+      }
       var components =
           _translateList(node.valueAt(_componentsKey), _translateString);
+      if (components == null) {
+        // The error has already been reported.
+        return null;
+      }
       return ElementDescriptor(libraryUris: uris, components: components);
     } else if (node == null) {
       // TODO(brianwilkerson) Report the missing YAML.
@@ -124,7 +137,8 @@
     }
   }
 
-  /// Translate the [node] into an integer.
+  /// Translate the [node] into an integer. Return the resulting integer, or
+  /// `null` if the [node] does not represent a valid integer.
   int _translateInteger(YamlNode node) {
     if (node is YamlScalar) {
       var value = node.value;
@@ -146,6 +160,9 @@
   }
 
   /// Translate the [node] into a list of objects using the [elementTranslator].
+  /// Return the resulting list, or `null` if the [node] does not represent a
+  /// valid list. If any of the elements of the list can't be translated, they
+  /// will be omitted from the list but the valid elements will be returned.
   List<R> _translateList<R>(
       YamlNode node, R Function(YamlNode) elementTranslator) {
     if (node is YamlList) {
@@ -166,14 +183,19 @@
     }
   }
 
-  /// Translate the [node] into a rename change.
+  /// Translate the [node] into a rename change. Return the resulting change, or
+  /// `null` if the [node] does not represent a valid rename change.
   Change _translateRenameChange(YamlMap node) {
     _reportUnsupportedKeys(node, const {_kindKey, _newNameKey});
     var newName = _translateString(node.valueAt(_newNameKey));
+    if (newName == null) {
+      return null;
+    }
     return Rename(newName: newName);
   }
 
-  /// Translate the [node] into a string.
+  /// Translate the [node] into a string. Return the resulting string, or `null`
+  /// if the [node] does not represent a valid string.
   String _translateString(YamlNode node) {
     if (node is YamlScalar) {
       var value = node.value;
@@ -194,7 +216,8 @@
     }
   }
 
-  /// Translate the [node] into a transform.
+  /// Translate the [node] into a transform. Return the resulting transform, or
+  /// `null` if the [node] does not represent a valid transform.
   Transform _translateTransform(YamlNode node) {
     if (node is YamlMap) {
       _reportUnsupportedKeys(node, const {_changesKey, _elementKey, _titleKey});
@@ -202,6 +225,10 @@
       var element = _translateElement(node.valueAt(_elementKey));
       var changes =
           _translateList<Change>(node.valueAt(_changesKey), _translateChange);
+      if (changes == null) {
+        // The error has already been reported.
+        return null;
+      }
       return Transform(title: title, element: element, changes: changes);
     } else if (node == null) {
       // TODO(brianwilkerson) Report the missing YAML.
@@ -212,7 +239,8 @@
     }
   }
 
-  /// Translate the [node] into a transform set.
+  /// Translate the [node] into a transform set. Return the resulting transform
+  /// set, or `null` if the [node] does not represent a valid transform set.
   TransformSet _translateTransformSet(YamlNode node) {
     if (node is YamlMap) {
       _reportUnsupportedKeys(node, const {_transformsKey, _versionKey});
@@ -225,6 +253,10 @@
       }
       var transformations =
           _translateList(node.valueAt(_transformsKey), _translateTransform);
+      if (transformations == null) {
+        // The error has already been reported.
+        return null;
+      }
       for (var transform in transformations) {
         set.addTransform(transform);
       }
diff --git a/pkg/analysis_server/test/src/computer/highlights2_computer_test.dart b/pkg/analysis_server/test/src/computer/highlights2_computer_test.dart
index 1102320..5f3e70a0 100644
--- a/pkg/analysis_server/test/src/computer/highlights2_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/highlights2_computer_test.dart
@@ -29,6 +29,21 @@
     sourcePath = convertPath('/home/test/lib/test.dart');
   }
 
+  Future<void> test_comment() async {
+    await _computeHighlights('''
+// A trailing comment
+''');
+    _check(HighlightRegionType.COMMENT_END_OF_LINE, '// A trailing comment');
+  }
+
+  Future<void> test_comment_trailing() async {
+    await _computeHighlights('''
+class A {}
+// A trailing comment
+''');
+    _check(HighlightRegionType.COMMENT_END_OF_LINE, '// A trailing comment');
+  }
+
   Future<void> test_extension() async {
     await _computeHighlights('''
 extension E on String {}
@@ -62,13 +77,6 @@
     _check(HighlightRegionType.KEYWORD, 'throw');
   }
 
-  Future<void> test_trailingComment() async {
-    await _computeHighlights('''
-// A trailing comment
-''');
-    _check(HighlightRegionType.COMMENT_END_OF_LINE, '// A trailing comment');
-  }
-
   void _check(HighlightRegionType expectedType, String expectedText) {
     for (var region in highlights) {
       if (region.type == expectedType) {
diff --git a/pkg/analysis_server/test/src/computer/highlights_computer_test.dart b/pkg/analysis_server/test/src/computer/highlights_computer_test.dart
index d853b1e..854a638 100644
--- a/pkg/analysis_server/test/src/computer/highlights_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/highlights_computer_test.dart
@@ -29,6 +29,21 @@
     sourcePath = convertPath('/home/test/lib/test.dart');
   }
 
+  Future<void> test_comment() async {
+    await _computeHighlights('''
+// A trailing comment
+''');
+    _check(HighlightRegionType.COMMENT_END_OF_LINE, '// A trailing comment');
+  }
+
+  Future<void> test_comment_trailing() async {
+    await _computeHighlights('''
+class A {}
+// A trailing comment
+''');
+    _check(HighlightRegionType.COMMENT_END_OF_LINE, '// A trailing comment');
+  }
+
   Future<void> test_extension() async {
     await _computeHighlights('''
 extension E on String {}
@@ -48,13 +63,6 @@
     _check(HighlightRegionType.IDENTIFIER_DEFAULT, 'foo');
   }
 
-  Future<void> test_trailingComment() async {
-    await _computeHighlights('''
-// A trailing comment
-''');
-    _check(HighlightRegionType.COMMENT_END_OF_LINE, '// A trailing comment');
-  }
-
   void _check(HighlightRegionType expectedType, String expectedText) {
     for (var region in highlights) {
       if (region.type == expectedType) {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_map_from_iterable_to_for_literal_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_map_from_iterable_to_for_literal_test.dart
new file mode 100644
index 0000000..151df66
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_map_from_iterable_to_for_literal_test.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/linter/lint_names.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'bulk_fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertToForElementTest);
+  });
+}
+
+@reflectiveTest
+class ConvertToForElementTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.prefer_for_elements_to_map_fromIterable;
+
+  Future<void> test_singleFile() async {
+    await resolveTestUnit('''
+f(Iterable<int> i) {
+  var k = 3;
+  return Map.fromIterable(i, key: (k) => k * 2, value: (v) => k);
+}
+
+f2(Iterable<int> i) {
+  return Map.fromIterable(i, key: (k) => k * 2, value: (v) => 0);
+}
+''');
+    await assertHasFix('''
+f(Iterable<int> i) {
+  var k = 3;
+  return { for (var e in i) e * 2 : k };
+}
+
+f2(Iterable<int> i) {
+  return { for (var k in i) k * 2 : 0 };
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
index 7f0b31c..077f112 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
@@ -8,6 +8,8 @@
 import 'add_override_test.dart' as add_override;
 import 'convert_documentation_into_line_test.dart'
     as convert_documentation_into_line;
+import 'convert_map_from_iterable_to_for_literal_test.dart'
+    as convert_map_from_iterable_to_for_literal;
 import 'convert_to_contains_test.dart' as convert_to_contains;
 import 'convert_to_generic_function_syntax_test.dart'
     as convert_to_generic_function_syntax;
@@ -51,6 +53,7 @@
     add_await.main();
     add_override.main();
     convert_documentation_into_line.main();
+    convert_map_from_iterable_to_for_literal.main();
     convert_to_contains.main();
     convert_to_generic_function_syntax.main();
     convert_to_if_element.main();
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 543f5ac..336979b 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
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix/data_driven/rename.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_error_code.dart';
 import 'package:matcher/matcher.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -17,6 +18,26 @@
 
 @reflectiveTest
 class TransformSetParserTest extends AbstractTransformSetParserTest {
+  void test_incomplete() {
+    parse('''
+version: 1
+transforms:
+''');
+    expect(result, null);
+    // TODO(brianwilkerson) Report a diagnostic.
+    errorListener.assertErrors([]);
+  }
+
+  void test_invalidYaml() {
+    parse('''
+[
+''');
+    expect(result, null);
+    errorListener.assertErrors([
+      error(TransformSetErrorCode.yamlSyntaxError, 2, 0),
+    ]);
+  }
+
   void test_rename() {
     parse('''
 version: 1
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 1eb1e16..5919677 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -2,6 +2,8 @@
 * Added `LocalVariableElement.hasInitializer`,
   `PropertyInducingElement.hasInitializer`, `ParameterElement.hasDefaultValue`.
 * `ElementImpl.toString()` uses `getDisplayString(withNullability: true)`.
+* Deprecated `ElementAnnotation.constantValue`, it does not guarantee that
+  the value has been computed. Use `computeConstantValue()` instead.
 
 ## 0.40.0
 * Added `LibraryElement.featureSet`.
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 0b17e13..71b8251 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -691,6 +691,7 @@
   /// Return a representation of the value of this annotation, or `null` if the
   /// value of this annotation has not been computed or if the value could not
   /// be computed because of errors.
+  @Deprecated('Use computeConstantValue() instead')
   DartObject get constantValue;
 
   /// Return the element representing the field, variable, or const constructor
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 9115009..0dfd4db 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -2409,6 +2409,7 @@
   List<AnalysisError> get constantEvaluationErrors =>
       evaluationResult?.errors ?? const <AnalysisError>[];
 
+  @Deprecated('Use computeConstantValue() instead')
   @override
   DartObject get constantValue => evaluationResult?.value;
 
@@ -2565,7 +2566,7 @@
       computeConstants(library.typeProvider, library.typeSystem,
           context.declaredVariables, [this], analysisOptions.experimentStatus);
     }
-    return constantValue;
+    return evaluationResult?.value;
   }
 
   @override
@@ -7596,6 +7597,7 @@
   /// initializers.
   Expression get constantInitializer => null;
 
+  @Deprecated('Use computeConstantValue() instead')
   @override
   DartObject get constantValue => evaluationResult?.value;
 
diff --git a/pkg/analyzer/lib/src/dart/element/type_system.dart b/pkg/analyzer/lib/src/dart/element/type_system.dart
index 9918dee..f27c23b 100644
--- a/pkg/analyzer/lib/src/dart/element/type_system.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_system.dart
@@ -171,12 +171,15 @@
   bool isNonNullable(DartType type) {
     if (type.isDynamic || type.isVoid || type.isDartCoreNull) {
       return false;
+    } else if (type is TypeParameterTypeImpl && type.promotedBound != null) {
+      return isNonNullable(type.promotedBound);
     } else if (type.nullabilitySuffix == NullabilitySuffix.question) {
       return false;
-    } else if (type.isDartAsyncFutureOr) {
-      return isNonNullable((type as InterfaceType).typeArguments[0]);
+    } else if (type is InterfaceType && type.isDartAsyncFutureOr) {
+      return isNonNullable(type.typeArguments[0]);
     } else if (type is TypeParameterType) {
-      return isNonNullable(type.bound);
+      var bound = type.element.bound;
+      return bound != null && isNonNullable(bound);
     }
     return true;
   }
@@ -185,6 +188,8 @@
   bool isNullable(DartType type) {
     if (type.isDynamic || type.isVoid || type.isDartCoreNull) {
       return true;
+    } else if (type is TypeParameterTypeImpl && type.promotedBound != null) {
+      return isNullable(type.promotedBound);
     } else if (type.nullabilitySuffix == NullabilitySuffix.question) {
       return true;
     } else if (type.isDartAsyncFutureOr) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
index fda77df..cd5deb0 100644
--- a/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
@@ -18,7 +18,6 @@
 import 'package:analyzer/src/dart/resolver/type_property_resolver.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/resolver.dart';
-import 'package:analyzer/src/task/strong/checker.dart';
 import 'package:meta/meta.dart';
 
 /// Helper for resolving [PrefixExpression]s.
@@ -58,6 +57,23 @@
 
     node.operand.accept(_resolver);
 
+    var operand = node.operand;
+    if (operand is SimpleIdentifier) {
+      var element = operand.staticElement;
+      // ElementResolver does not set it.
+      if (element is VariableElement) {
+        _resolver.setReadElement(operand, element);
+        _resolver.setWriteElement(operand, element);
+      }
+    }
+
+    if (node.readElement == null || node.readType == null) {
+      _resolver.setReadElement(operand, null);
+    }
+    if (node.writeElement == null || node.writeType == null) {
+      _resolver.setWriteElement(operand, null);
+    }
+
     if (operator.isIncrementOperator) {
       _assignmentShared.checkFinalAlreadyAssigned(node.operand);
     }
@@ -67,12 +83,12 @@
   }
 
   /// Check that the result [type] of a prefix or postfix `++` or `--`
-  /// expression is assignable to the write type of the [operand].
+  /// expression is assignable to the write type of the operand.
   ///
   /// TODO(scheglov) this is duplicate
   void _checkForInvalidAssignmentIncDec(
-      AstNode node, Expression operand, DartType type) {
-    var operandWriteType = _getStaticType(operand);
+      PrefixExpressionImpl node, DartType type) {
+    var operandWriteType = node.writeType;
     if (!_typeSystem.isAssignableTo2(type, operandWriteType)) {
       _resolver.errorReporter.reportErrorForNode(
         CompileTimeErrorCode.INVALID_ASSIGNMENT,
@@ -121,31 +137,6 @@
     }
   }
 
-  /// Return the static type of the given [expression] that is to be used for
-  /// type analysis.
-  ///
-  /// TODO(scheglov) this is duplicate
-  DartType _getStaticType(Expression expression, {bool read = false}) {
-    if (read) {
-      var type = getReadType(
-        expression,
-      );
-      return _resolveTypeParameter(type);
-    } else {
-      if (expression is SimpleIdentifier && expression.inSetterContext()) {
-        var element = expression.staticElement;
-        if (element is PromotableElement) {
-          // We're writing to the element so ignore promotions.
-          return element.type;
-        } else {
-          return expression.staticType;
-        }
-      } else {
-        return expression.staticType;
-      }
-    }
-  }
-
   /// Return the non-nullable variant of the [type] if NNBD is enabled, otherwise
   /// return the type itself.
   ///
@@ -186,9 +177,9 @@
         node.staticElement = member;
         return;
       }
-      DartType staticType = _getStaticType(operand, read: true);
 
-      if (identical(staticType, NeverTypeImpl.instance)) {
+      var readType = node.readType ?? operand.staticType;
+      if (identical(readType, NeverTypeImpl.instance)) {
         _resolver.errorReporter.reportErrorForNode(
           HintCode.RECEIVER_OF_TYPE_NEVER,
           operand,
@@ -198,24 +189,24 @@
 
       var result = _typePropertyResolver.resolve(
         receiver: operand,
-        receiverType: staticType,
+        receiverType: readType,
         name: methodName,
         receiverErrorNode: operand,
         nameErrorNode: operand,
       );
       node.staticElement = result.getter;
-      if (_shouldReportInvalidMember(staticType, result)) {
+      if (_shouldReportInvalidMember(readType, result)) {
         if (operand is SuperExpression) {
           _errorReporter.reportErrorForToken(
             CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR,
             operator,
-            [methodName, staticType],
+            [methodName, readType],
           );
         } else {
           _errorReporter.reportErrorForToken(
             CompileTimeErrorCode.UNDEFINED_OPERATOR,
             operator,
-            [methodName, staticType],
+            [methodName, readType],
           );
         }
       }
@@ -234,11 +225,10 @@
       if (operand is ExtensionOverride) {
         // No special handling for incremental operators.
       } else if (operator.isIncrementOperator) {
-        var operandReadType = _getStaticType(operand, read: true);
-        if (operandReadType.isDartCoreInt) {
+        if (node.readType.isDartCoreInt) {
           staticType = _nonNullable(_typeProvider.intType);
         } else {
-          _checkForInvalidAssignmentIncDec(node, operand, staticType);
+          _checkForInvalidAssignmentIncDec(node, staticType);
         }
         if (operand is SimpleIdentifier) {
           var element = operand.staticElement;
@@ -266,13 +256,6 @@
     _flowAnalysis?.flow?.logicalNot_end(node, operand);
   }
 
-  /// If the given [type] is a type parameter, resolve it to the type that should
-  /// be used when looking up members. Otherwise, return the original type.
-  ///
-  /// TODO(scheglov) this is duplicate
-  DartType _resolveTypeParameter(DartType type) =>
-      type?.resolveToBound(_typeProvider.objectType);
-
   /// Return `true` if we should report an error for the lookup [result] on
   /// the [type].
   ///
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index 43ab1dd..aef2cc9 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -1480,7 +1480,7 @@
     }
     for (var annotation in classElement.metadata) {
       if (annotation.isTarget) {
-        var value = annotation.constantValue;
+        var value = annotation.computeConstantValue();
         var kinds = <TargetKind>{};
         for (var kindObject in value.getField('kinds').toSetValue()) {
           var index = kindObject.getField('index').toIntValue();
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 901e787..e2fd8ef 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -596,6 +596,10 @@
         parent.operator.type.isIncrementOperator) {
       parent.readElement = element;
       parent.readType = readType;
+    } else if (parent is PrefixExpressionImpl &&
+        parent.operator.type.isIncrementOperator) {
+      parent.readElement = element;
+      parent.readType = readType;
     }
   }
 
@@ -638,6 +642,10 @@
         parent.operator.type.isIncrementOperator) {
       parent.writeElement = element;
       parent.writeType = writeType;
+    } else if (parent is PrefixExpressionImpl &&
+        parent.operator.type.isIncrementOperator) {
+      parent.writeElement = element;
+      parent.writeType = writeType;
     }
   }
 
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 2522b77..493d29a 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -860,7 +860,7 @@
 ''');
     var result = await driver.getResult(testFile);
     Annotation at_x = AstFinder.getClass(result.unit, 'C').metadata[0];
-    expect(at_x.elementAnnotation.constantValue.toIntValue(), 1);
+    expect(at_x.elementAnnotation.computeConstantValue().toIntValue(), 1);
   }
 
   test_const_circular_reference() async {
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index 1b926d3..a5956bb 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -858,12 +858,10 @@
     ParameterElement parameter = argument.staticParameterElement;
 
     ElementAnnotation annotation = parameter.metadata[0];
-    expect(annotation.constantValue, isNull);
 
     DartObject value = annotation.computeConstantValue();
     expect(value, isNotNull);
     expect(value.getField('f').toStringValue(), 'x');
-    expect(annotation.constantValue, value);
   }
 }
 
diff --git a/pkg/analyzer/test/src/dart/element/nullable_test.dart b/pkg/analyzer/test/src/dart/element/nullable_test.dart
index 6c98f54..d385bae 100644
--- a/pkg/analyzer/test/src/dart/element/nullable_test.dart
+++ b/pkg/analyzer/test/src/dart/element/nullable_test.dart
@@ -119,7 +119,7 @@
     isNotNonNullable(nullStar);
   }
 
-  test_typeParameter_noneBound() {
+  test_typeParameter_boundNone() {
     var T = typeParameter('T', bound: intNone);
 
     isNonNullable(
@@ -131,7 +131,7 @@
     );
   }
 
-  test_typeParameter_questionBound() {
+  test_typeParameter_boundQuestion() {
     var T = typeParameter('T', bound: intQuestion);
 
     isNotNonNullable(
@@ -143,7 +143,7 @@
     );
   }
 
-  test_typeParameter_starBound() {
+  test_typeParameter_boundStar() {
     var T = typeParameter('T', bound: intStar);
 
     isNonNullable(
@@ -151,6 +151,42 @@
     );
   }
 
+  test_typeParameter_promotedBoundNone() {
+    var T = typeParameter('T');
+
+    isNonNullable(
+      typeParameterTypeNone(T, promotedBound: intNone),
+    );
+
+    isNonNullable(
+      typeParameterTypeQuestion(T, promotedBound: intNone),
+    );
+  }
+
+  test_typeParameter_promotedBoundQuestion() {
+    var T = typeParameter('T');
+
+    isNotNonNullable(
+      typeParameterTypeNone(T, promotedBound: intQuestion),
+    );
+
+    isNotNonNullable(
+      typeParameterTypeQuestion(T, promotedBound: intQuestion),
+    );
+  }
+
+  test_typeParameter_promotedBoundStar() {
+    var T = typeParameter('T');
+
+    isNonNullable(
+      typeParameterTypeNone(T, promotedBound: intStar),
+    );
+
+    isNonNullable(
+      typeParameterTypeQuestion(T, promotedBound: intStar),
+    );
+  }
+
   test_void() {
     isNotNonNullable(voidNone);
   }
@@ -248,7 +284,7 @@
     isNullable(nullStar);
   }
 
-  test_typeParameter_noneBound() {
+  test_typeParameter_boundNone() {
     var T = typeParameter('T', bound: intNone);
 
     isNotNullable(
@@ -260,7 +296,7 @@
     );
   }
 
-  test_typeParameter_questionBound_none() {
+  test_typeParameter_boundQuestion_none() {
     var T = typeParameter('T', bound: intQuestion);
 
     isNotNullable(
@@ -272,7 +308,7 @@
     );
   }
 
-  test_typeParameter_starBound() {
+  test_typeParameter_boundStar() {
     var T = typeParameter('T', bound: intStar);
 
     isNotNullable(
@@ -280,6 +316,42 @@
     );
   }
 
+  test_typeParameter_promotedBoundNone() {
+    var T = typeParameter('T');
+
+    isNotNullable(
+      typeParameterTypeNone(T, promotedBound: intNone),
+    );
+
+    isNotNullable(
+      typeParameterTypeQuestion(T, promotedBound: intNone),
+    );
+  }
+
+  test_typeParameter_promotedBoundQuestion() {
+    var T = typeParameter('T');
+
+    isNullable(
+      typeParameterTypeNone(T, promotedBound: intQuestion),
+    );
+
+    isNullable(
+      typeParameterTypeQuestion(T, promotedBound: intQuestion),
+    );
+  }
+
+  test_typeParameter_promotedBoundStar() {
+    var T = typeParameter('T');
+
+    isNotNullable(
+      typeParameterTypeNone(T, promotedBound: intStar),
+    );
+
+    isNotNullable(
+      typeParameterTypeQuestion(T, promotedBound: intStar),
+    );
+  }
+
   test_void() {
     isNullable(voidNone);
   }
@@ -473,7 +545,7 @@
     isNotStrictlyNonNullable(nullStar);
   }
 
-  test_typeParameter_noneBound() {
+  test_typeParameter_boundNone() {
     var T = typeParameter('T', bound: intNone);
 
     isStrictlyNonNullable(
@@ -489,7 +561,7 @@
     );
   }
 
-  test_typeParameter_questionBound() {
+  test_typeParameter_boundQuestion() {
     var T = typeParameter('T', bound: intQuestion);
 
     isNotStrictlyNonNullable(
@@ -505,7 +577,7 @@
     );
   }
 
-  test_typeParameter_starBound() {
+  test_typeParameter_boundStar() {
     var T = typeParameter('T', bound: intStar);
 
     isNotStrictlyNonNullable(
diff --git a/pkg/analyzer/test/src/dart/resolution/constant_test.dart b/pkg/analyzer/test/src/dart/resolution/constant_test.dart
index 11c9ec8..0d0a042 100644
--- a/pkg/analyzer/test/src/dart/resolution/constant_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/constant_test.dart
@@ -40,7 +40,7 @@
     // To evaluate `const A()` we have to evaluate `{int p}`.
     // Even if its value is `null`.
     expect(p.isConstantEvaluated, isTrue);
-    expect(p.constantValue.isNull, isTrue);
+    expect(p.computeConstantValue().isNull, isTrue);
   }
 
   test_constFactoryRedirection_super() async {
@@ -64,7 +64,7 @@
 ''');
 
     var node = findNode.annotation('@I');
-    var value = node.elementAnnotation.constantValue;
+    var value = node.elementAnnotation.computeConstantValue();
     expect(value.getField('(super)').getField('f').toIntValue(), 42);
   }
 
diff --git a/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart
index 1d159f9..14ddc4ca 100644
--- a/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/prefix_expression_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/ast/ast.dart';
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -38,6 +39,10 @@
 
     assertPrefixExpression(
       findNode.prefix('!f()'),
+      readElement: null,
+      readType: null,
+      writeElement: null,
+      writeType: null,
       element: boolElement.getMethod('!'),
       type: 'bool',
     );
@@ -45,13 +50,17 @@
 
   test_bang_bool_localVariable() async {
     await assertNoErrorsInCode(r'''
-f(bool x) {
+void f(bool x) {
   !x;
 }
 ''');
 
     assertPrefixExpression(
       findNode.prefix('!x'),
+      readElement: null,
+      readType: null,
+      writeElement: null,
+      writeType: null,
       element: boolElement.getMethod('!'),
       type: 'bool',
     );
@@ -59,29 +68,117 @@
 
   test_bang_int_localVariable() async {
     await assertErrorsInCode(r'''
-f(int x) {
+void f(int x) {
   !x;
 }
 ''', [
-      error(CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION, 14, 1),
+      error(CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION, 19, 1),
     ]);
 
     assertPrefixExpression(
       findNode.prefix('!x'),
+      readElement: null,
+      readType: null,
+      writeElement: null,
+      writeType: null,
       element: null,
       type: 'bool',
     );
   }
 
-  test_minus_int_localVariable() async {
+  test_inc_indexExpression_instance() async {
     await assertNoErrorsInCode(r'''
-f(int x) {
+class A {
+  int operator[](int index) => 0;
+  operator[]=(int index, num _) {}
+}
+
+void f(A a) {
+  ++a[0];
+}
+''');
+
+    assertPrefixExpression(
+      findNode.prefix('++'),
+      readElement: findElement.method('[]'),
+      readType: 'int',
+      writeElement: findElement.method('[]='),
+      writeType: 'num',
+      element: elementMatcher(
+        numElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'int',
+    );
+  }
+
+  test_inc_indexExpression_super() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  int operator[](int index) => 0;
+  operator[]=(int index, num _) {}
+}
+
+class B extends A {
+  void f(A a) {
+    ++super[0];
+  }
+}
+''');
+
+    assertPrefixExpression(
+      findNode.prefix('++'),
+      readElement: findElement.method('[]'),
+      readType: 'int',
+      writeElement: findElement.method('[]='),
+      writeType: 'num',
+      element: elementMatcher(
+        numElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'int',
+    );
+  }
+
+  test_inc_indexExpression_this() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  int operator[](int index) => 0;
+  operator[]=(int index, num _) {}
+  
+  void f() {
+    ++this[0];
+  }
+}
+''');
+
+    assertPrefixExpression(
+      findNode.prefix('++'),
+      readElement: findElement.method('[]'),
+      readType: 'int',
+      writeElement: findElement.method('[]='),
+      writeType: 'num',
+      element: elementMatcher(
+        numElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'int',
+    );
+  }
+
+  test_minus_simpleIdentifier_parameter_int() async {
+    await assertNoErrorsInCode(r'''
+void f(int x) {
   -x;
 }
 ''');
 
     assertPrefixExpression(
       findNode.prefix('-x'),
+      readElement: null,
+      readType: null,
+      writeElement: null,
+      writeType: null,
       element: elementMatcher(
         intElement.getMethod('unary-'),
         isLegacy: isNullSafetySdkAndLegacyLibrary,
@@ -90,24 +187,7 @@
     );
   }
 
-  test_plusPlus_double() async {
-    await assertNoErrorsInCode(r'''
-f(double x) {
-  ++x;
-}
-''');
-
-    assertPrefixExpression(
-      findNode.prefix('++x'),
-      element: elementMatcher(
-        doubleElement.getMethod('+'),
-        isLegacy: isNullSafetySdkAndLegacyLibrary,
-      ),
-      type: 'double',
-    );
-  }
-
-  test_plusPlus_extensionOverride() async {
+  test_plusPlus_notLValue_extensionOverride() async {
     await assertErrorsInCode(r'''
 class C {}
 
@@ -117,29 +197,41 @@
   }
 }
 
-f(C c) {
+void f(C c) {
   ++Ext(c);
 }
 ''', [
-      error(ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, 98, 1),
+      error(ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, 103, 1),
     ]);
 
     assertPrefixExpression(
       findNode.prefix('++Ext'),
+      readElement: null,
+      readType: 'dynamic',
+      writeElement: null,
+      writeType: 'dynamic',
       element: findElement.method('+'),
       type: 'int',
     );
   }
 
-  test_plusPlus_int_localVariable() async {
+  test_plusPlus_prefixedIdentifier_instance() async {
     await assertNoErrorsInCode(r'''
-f(int x) {
-  ++x;
+class A {
+  int x = 0;
+}
+
+void f(A a) {
+  ++a.x;
 }
 ''');
 
     assertPrefixExpression(
-      findNode.prefix('++x'),
+      findNode.prefix('++'),
+      readElement: findElement.getter('x'),
+      readType: 'int',
+      writeElement: findElement.setter('x'),
+      writeType: 'int',
       element: elementMatcher(
         numElement.getMethod('+'),
         isLegacy: isNullSafetySdkAndLegacyLibrary,
@@ -148,19 +240,55 @@
     );
   }
 
-  /// Verify that we get all necessary types when building the dependencies
-  /// graph during top-level inference.
-  test_plusPlus_int_topLevelInference() async {
+  test_plusPlus_prefixedIdentifier_topLevel() async {
+    newFile('$testPackageLibPath/a.dart', content: r'''
+int x = 0;
+''');
     await assertNoErrorsInCode(r'''
-var x = 0;
+import 'a.dart' as p;
 
-class M1 {
-  final y = ++x;
+void f() {
+  ++p.x;
+}
+''');
+
+    var importFind = findElement.importFind('package:test/a.dart');
+
+    var prefix = findNode.prefix('++');
+    assertPrefixExpression(
+      prefix,
+      readElement: importFind.topGet('x'),
+      readType: 'int',
+      writeElement: importFind.topSet('x'),
+      writeType: 'int',
+      element: elementMatcher(
+        numElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'int',
+    );
+
+    var prefixed = prefix.operand as PrefixedIdentifier;
+    assertImportPrefix(prefixed.prefix, importFind.prefix);
+  }
+
+  test_plusPlus_propertyAccess_instance() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  int x = 0;
+}
+
+void f() {
+  ++A().x;
 }
 ''');
 
     assertPrefixExpression(
-      findNode.prefix('++x'),
+      findNode.prefix('++'),
+      readElement: findElement.getter('x'),
+      readType: 'int',
+      writeElement: findElement.setter('x'),
+      writeType: 'int',
       element: elementMatcher(
         numElement.getMethod('+'),
         isLegacy: isNullSafetySdkAndLegacyLibrary,
@@ -169,15 +297,118 @@
     );
   }
 
-  test_plusPlus_num() async {
+  test_plusPlus_propertyAccess_super() async {
     await assertNoErrorsInCode(r'''
-f(num x) {
+class A {
+  set x(num _) {}
+  int get x => 0;
+}
+
+class B extends A {
+  set x(num _) {}
+  int get x => 0;
+
+  void f() {
+    ++super.x;
+  }
+}
+''');
+
+    assertPrefixExpression(
+      findNode.prefix('++'),
+      readElement: findElement.getter('x', of: 'A'),
+      readType: 'int',
+      writeElement: findElement.setter('x', of: 'A'),
+      writeType: 'num',
+      element: elementMatcher(
+        numElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'int',
+    );
+  }
+
+  test_plusPlus_propertyAccess_this() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  set x(num _) {}
+  int get x => 0;
+
+  void f() {
+    ++this.x;
+  }
+}
+''');
+
+    assertPrefixExpression(
+      findNode.prefix('++'),
+      readElement: findElement.getter('x'),
+      readType: 'int',
+      writeElement: findElement.setter('x'),
+      writeType: 'num',
+      element: elementMatcher(
+        numElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'int',
+    );
+  }
+
+  test_plusPlus_simpleIdentifier_parameter_double() async {
+    await assertNoErrorsInCode(r'''
+void f(double x) {
   ++x;
 }
 ''');
 
     assertPrefixExpression(
       findNode.prefix('++x'),
+      readElement: findElement.parameter('x'),
+      readType: 'double',
+      writeElement: findElement.parameter('x'),
+      writeType: 'double',
+      element: elementMatcher(
+        doubleElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'double',
+    );
+  }
+
+  test_plusPlus_simpleIdentifier_parameter_int() async {
+    await assertNoErrorsInCode(r'''
+void f(int x) {
+  ++x;
+}
+''');
+
+    assertPrefixExpression(
+      findNode.prefix('++x'),
+      readElement: findElement.parameter('x'),
+      readType: 'int',
+      writeElement: findElement.parameter('x'),
+      writeType: 'int',
+      element: elementMatcher(
+        numElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'int',
+    );
+  }
+
+  test_plusPlus_simpleIdentifier_parameter_num() async {
+    await assertNoErrorsInCode(r'''
+void f(num x) {
+  ++x;
+}
+''');
+
+    assertPrefixExpression(
+      findNode.prefix('++x'),
+      readElement: findElement.parameter('x'),
+      readType: 'num',
+      writeElement: findElement.parameter('x'),
+      writeType: 'num',
       element: elementMatcher(
         numElement.getMethod('+'),
         isLegacy: isNullSafetySdkAndLegacyLibrary,
@@ -186,15 +417,227 @@
     );
   }
 
-  test_tilde_int_localVariable() async {
+  test_plusPlus_simpleIdentifier_parameter_typeParameter() async {
+    await assertErrorsInCode(
+      r'''
+void f<T extends num>(T x) {
+  ++x;
+}
+''',
+      expectedErrorsByNullability(nullable: [
+        error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 31, 3),
+      ], legacy: []),
+    );
+
+    assertPrefixExpression(
+      findNode.prefix('++x'),
+      readElement: findElement.parameter('x'),
+      readType: 'T',
+      writeElement: findElement.parameter('x'),
+      writeType: 'T',
+      element: elementMatcher(
+        numElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'num',
+    );
+  }
+
+  test_plusPlus_simpleIdentifier_thisGetter_superSetter() async {
     await assertNoErrorsInCode(r'''
-f(int x) {
+class A {
+  set x(num _) {}
+}
+
+class B extends A {
+  int get x => 0;
+  void f() {
+    ++x;
+  }
+}
+''');
+
+    var prefix = findNode.prefix('++x');
+    assertPrefixExpression(
+      prefix,
+      readElement: findElement.getter('x'),
+      readType: 'int',
+      writeElement: findElement.setter('x'),
+      writeType: 'num',
+      element: elementMatcher(
+        numElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'int',
+    );
+
+    assertSimpleIdentifier(
+      prefix.operand,
+      readElement: findElement.getter('x'),
+      writeElement: findElement.setter('x'),
+      type: 'num',
+    );
+  }
+
+  test_plusPlus_simpleIdentifier_thisGetter_thisSetter() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  int get x => 0;
+  set x(num _) {}
+  void f() {
+    ++x;
+  }
+}
+''');
+
+    var prefix = findNode.prefix('++x');
+    assertPrefixExpression(
+      prefix,
+      readElement: findElement.getter('x'),
+      readType: 'int',
+      writeElement: findElement.setter('x'),
+      writeType: 'num',
+      element: elementMatcher(
+        numElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'int',
+    );
+
+    assertSimpleIdentifier(
+      prefix.operand,
+      readElement: findElement.getter('x'),
+      writeElement: findElement.setter('x'),
+      type: 'num',
+    );
+  }
+
+  test_plusPlus_simpleIdentifier_topGetter_topSetter() async {
+    await assertNoErrorsInCode(r'''
+int get x => 0;
+
+set x(num _) {}
+
+void f() {
+  ++x;
+}
+''');
+
+    var prefix = findNode.prefix('++x');
+    assertPrefixExpression(
+      prefix,
+      readElement: findElement.topGet('x'),
+      readType: 'int',
+      writeElement: findElement.topSet('x'),
+      writeType: 'num',
+      element: elementMatcher(
+        numElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'int',
+    );
+
+    assertSimpleIdentifier(
+      prefix.operand,
+      readElement: findElement.topGet('x'),
+      writeElement: findElement.topSet('x'),
+      type: 'num',
+    );
+  }
+
+  test_plusPlus_simpleIdentifier_topGetter_topSetter_fromClass() async {
+    await assertNoErrorsInCode(r'''
+int get x => 0;
+
+set x(num _) {}
+
+class A {
+  void f() {
+    ++x;
+  }
+}
+''');
+
+    var prefix = findNode.prefix('++x');
+    assertPrefixExpression(
+      prefix,
+      readElement: findElement.topGet('x'),
+      readType: 'int',
+      writeElement: findElement.topSet('x'),
+      writeType: 'num',
+      element: elementMatcher(
+        numElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'int',
+    );
+
+    assertSimpleIdentifier(
+      prefix.operand,
+      readElement: findElement.topGet('x'),
+      writeElement: findElement.topSet('x'),
+      type: 'num',
+    );
+  }
+
+  test_plusPlus_simpleIdentifier_typeLiteral() async {
+    await assertErrorsInCode(r'''
+void f() {
+  ++int;
+}
+''', [
+      error(CompileTimeErrorCode.ASSIGNMENT_TO_TYPE, 15, 3),
+    ]);
+
+    assertPrefixExpression(
+      findNode.prefix('++int'),
+      readElement: null,
+      readType: 'dynamic',
+      writeElement: intElement,
+      writeType: 'dynamic',
+      element: null,
+      type: 'dynamic',
+    );
+  }
+
+  /// Verify that we get all necessary types when building the dependencies
+  /// graph during top-level inference.
+  test_plusPlus_topLevelInference() async {
+    await assertNoErrorsInCode(r'''
+var x = 0;
+
+class A {
+  final y = ++x;
+}
+''');
+
+    assertPrefixExpression(
+      findNode.prefix('++x'),
+      readElement: findElement.topGet('x'),
+      readType: 'int',
+      writeElement: findElement.topSet('x'),
+      writeType: 'int',
+      element: elementMatcher(
+        numElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'int',
+    );
+  }
+
+  test_tilde_simpleIdentifier_parameter_int() async {
+    await assertNoErrorsInCode(r'''
+void f(int x) {
   ~x;
 }
 ''');
 
     assertPrefixExpression(
       findNode.prefix('~x'),
+      readElement: null,
+      readType: null,
+      writeElement: null,
+      writeType: null,
       element: elementMatcher(
         intElement.getMethod('~'),
         isLegacy: isNullSafetySdkAndLegacyLibrary,
@@ -222,6 +665,10 @@
 
     assertPrefixExpression(
       findNode.prefix('!a'),
+      readElement: null,
+      readType: null,
+      writeElement: null,
+      writeType: null,
       element: boolElement.getMethod('!'),
       type: 'bool',
     );
@@ -242,6 +689,10 @@
 
     assertPrefixExpression(
       findNode.prefix('-a'),
+      readElement: null,
+      readType: null,
+      writeElement: null,
+      writeType: null,
       element: intElement.getMethod('unary-'),
       type: 'int',
     );
@@ -253,7 +704,7 @@
   Object operator +(int _) => this;
 }
 
-f(Object x) {
+void f(Object x) {
   if (x is A) {
     ++x;
   }
@@ -262,6 +713,10 @@
 
     assertPrefixExpression(
       findNode.prefix('++x'),
+      readElement: findElement.parameter('x'),
+      readType: 'A',
+      writeElement: findElement.parameter('x'),
+      writeType: 'Object',
       element: findElement.method('+'),
       type: 'Object',
     );
@@ -275,13 +730,17 @@
   int foo = 0;
 }
 
-f(A? a) {
+void f(A? a) {
   ++a?.foo;
 }
 ''');
 
     assertPrefixExpression(
       findNode.prefix('++a'),
+      readElement: findElement.getter('foo'),
+      readType: 'int',
+      writeElement: findElement.setter('foo'),
+      writeType: 'int',
       element: numElement.getMethod('+'),
       type: 'int?',
     );
@@ -302,6 +761,10 @@
 
     assertPrefixExpression(
       findNode.prefix('~a'),
+      readElement: null,
+      readType: null,
+      writeElement: null,
+      writeType: null,
       element: intElement.getMethod('~'),
       type: 'int',
     );
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 9d4bf8d..be1327b 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -615,9 +615,20 @@
 
   void assertPrefixExpression(
     PrefixExpression node, {
+    @required Object readElement,
+    @required String readType,
+    @required Object writeElement,
+    @required String writeType,
     @required Object element,
     @required String type,
   }) {
+    assertCompoundAssignment(
+      node,
+      readElement: readElement,
+      readType: readType,
+      writeElement: writeElement,
+      writeType: writeType,
+    );
     assertElement(node.staticElement, element);
     assertType(node, type);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
index 01bb301..a5edc42 100644
--- a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
@@ -364,6 +364,10 @@
 
     assertPrefixExpression(
       findNode.prefix('++x'),
+      readElement: findElement.parameter('x'),
+      readType: 'Never',
+      writeElement: findElement.parameter('x'),
+      writeType: 'Never',
       element: null,
       type: 'Never',
     );
@@ -380,6 +384,10 @@
 
     assertPrefixExpression(
       findNode.prefix('++x'),
+      readElement: findElement.parameter('x'),
+      readType: 'Never?',
+      writeElement: findElement.parameter('x'),
+      writeType: 'Never?',
       element: null,
       type: 'dynamic',
     );
diff --git a/pkg/compiler/lib/src/inferrer/powersets/powerset_bits.dart b/pkg/compiler/lib/src/inferrer/powersets/powerset_bits.dart
index 21b6a29..f91a311 100644
--- a/pkg/compiler/lib/src/inferrer/powersets/powerset_bits.dart
+++ b/pkg/compiler/lib/src/inferrer/powersets/powerset_bits.dart
@@ -35,15 +35,26 @@
   static const int _nullIndex = 2;
   static const int _otherIndex = 3;
 
-  static const int _maxIndex = _otherIndex;
+  static const int _interceptorIndex = 4;
+  static const int _notInterceptorIndex = 5;
+  static const int _nullInterceptorIndex = 6;
 
+  static const int _maxIndex = _nullInterceptorIndex;
   static const List<int> _singletonIndices = [
     _trueIndex,
     _falseIndex,
     _nullIndex,
   ];
 
-  static const List<String> _bitNames = ['true', 'false', 'null', 'other'];
+  static const List<String> _bitNames = [
+    'true',
+    'false',
+    'null',
+    'other',
+    'interceptor',
+    'notInterceptor',
+    'null'
+  ];
 
   PowersetBitsDomain(this._closedWorld);
 
@@ -62,16 +73,35 @@
   int get preciseMask => _singletonIndices.fold(
       powersetBottom, (mask, index) => mask | 1 << index);
 
+  int get interceptorMask => 1 << _interceptorIndex;
+  int get notInterceptorMask => 1 << _notInterceptorIndex;
+  int get nullInterceptorMask => 1 << _nullInterceptorIndex;
+  int get interceptorDomainMask =>
+      interceptorMask | notInterceptorMask | nullInterceptorMask;
+
   int get powersetBottom => 0;
   int get powersetTop => (1 << _maxIndex + 1) - 1;
 
+  int get trueValue => trueMask | interceptorMask;
+  int get falseValue => falseMask | interceptorMask;
+  int get boolValue => boolMask | interceptorMask;
+  int get nullValue => nullMask | nullInterceptorMask;
+  int get otherValue => otherMask | interceptorMask | notInterceptorMask;
+  int get interceptorOtherValue => otherMask | interceptorMask;
+
   bool isPotentiallyBoolean(int value) => (value & boolMask) != 0;
   bool isPotentiallyNull(int value) => (value & nullMask) != 0;
   bool isPotentiallyOther(int value) => (value & otherMask) != 0;
+  bool isPotentiallyInterceptor(int value) => (value & interceptorMask) != 0;
+  bool isPotentiallyNotInterceptor(int value) =>
+      (value & notInterceptorMask) != 0;
+  bool isPotentiallyNullInterceptor(int value) =>
+      (value & notInterceptorMask) != 0;
 
-  bool isDefinitelyTrue(int value) => value == trueMask;
-  bool isDefinitelyFalse(int value) => value == falseMask;
-  bool isDefinitelyNull(int value) => value == nullMask;
+  bool isDefinitelyTrue(int value) => value == trueValue;
+  bool isDefinitelyFalse(int value) => value == falseValue;
+  bool isDefinitelyNull(int value) => value == nullValue;
+
   bool isSingleton(int value) =>
       isDefinitelyTrue(value) ||
       isDefinitelyFalse(value) ||
@@ -83,19 +113,13 @@
   AbstractBool isOther(int value) =>
       AbstractBool.maybeOrFalse(isPotentiallyOther(value));
 
-  AbstractBool isIn(int subset, int superset) {
-    if (union(subset, superset) == superset) {
-      if (isPrecise(superset)) return AbstractBool.True;
-    } else {
-      if (isPrecise(subset)) return AbstractBool.False;
-    }
-    return AbstractBool.Maybe;
-  }
-
   /// Returns a descriptive string for [bits]
   static String toText(int bits, {bool omitIfTop = false}) {
-    int boolDomainMask = (1 << _maxIndex + 1) - 1;
-    return _toTextDomain(bits, boolDomainMask, omitIfTop);
+    int boolNullOtherMask = (1 << _otherIndex + 1) - 1;
+    int interceptorDomainMask =
+        (1 << _nullInterceptorIndex + 1) - (1 << _interceptorIndex);
+    return _toTextDomain(bits, interceptorDomainMask, omitIfTop) +
+        _toTextDomain(bits, boolNullOtherMask, omitIfTop);
   }
 
   /// Returns a descriptive string for a subset of [bits] defined by
@@ -119,6 +143,20 @@
     return '$sb';
   }
 
+  AbstractBool _isIn(int subset, int superset) {
+    if (union(subset, superset) == superset) {
+      if (isPrecise(superset)) return AbstractBool.True;
+    } else {
+      if (isPrecise(subset)) return AbstractBool.False;
+    }
+    return AbstractBool.Maybe;
+  }
+
+  AbstractBool isIn(int subset, int superset) {
+    // TODO(coam): We can also take advantage of other bits to be more precise
+    return _isIn(subset & boolNullOtherMask, superset & boolNullOtherMask);
+  }
+
   AbstractBool needsNoSuchMethodHandling(int receiver, Selector selector) =>
       AbstractBool.Maybe;
 
@@ -154,20 +192,26 @@
 
   int computeAbstractValueForConstant(ConstantValue value) {
     if (value.isTrue) {
-      return trueMask;
+      return trueValue;
     }
     if (value.isFalse) {
-      return falseMask;
+      return falseValue;
     }
     if (value.isNull) {
-      return nullMask;
+      return nullValue;
     }
-    return otherMask;
+
+    // TODO(coam): We could be more precise if we implement a visitor to
+    // ConstantValue
+    return createFromStaticType(value.getType(commonElements), nullable: false);
   }
 
   AbstractBool areDisjoint(int a, int b) {
     int overlap = intersection(a, b);
-    if (overlap == powersetBottom) return AbstractBool.True;
+    if (overlap & interceptorDomainMask == powersetBottom) {
+      return AbstractBool.True;
+    }
+    if (overlap & boolNullOtherMask == powersetBottom) return AbstractBool.True;
     if (isPrecise(overlap)) return AbstractBool.False;
     return AbstractBool.Maybe;
   }
@@ -221,7 +265,11 @@
 
   AbstractBool isInteger(int value) => isOther(value);
 
-  AbstractBool isInterceptor(int value) => AbstractBool.Maybe;
+  AbstractBool isInterceptor(int value) {
+    if (!isPotentiallyInterceptor(value)) return AbstractBool.False;
+    if (isPotentiallyNotInterceptor(value)) return AbstractBool.Maybe;
+    return AbstractBool.True;
+  }
 
   AbstractBool isPrimitiveString(int value) => isOther(value);
 
@@ -261,7 +309,9 @@
   AbstractBool isExact(int value) => AbstractBool.Maybe;
 
   AbstractBool isEmpty(int value) {
-    if (value == powersetBottom) return AbstractBool.True;
+    if (value & interceptorDomainMask == powersetBottom)
+      return AbstractBool.True;
+    if (value & boolNullOtherMask == powersetBottom) return AbstractBool.True;
     if (isPrecise(value)) return AbstractBool.False;
     return AbstractBool.Maybe;
   }
@@ -280,11 +330,11 @@
   AbstractBool containsType(int value, ClassEntity cls) => AbstractBool.Maybe;
 
   int includeNull(int value) {
-    return value | nullMask;
+    return value | nullValue;
   }
 
   int excludeNull(int value) {
-    return value & ~nullMask;
+    return value & ~nullValue;
   }
 
   AbstractBool couldBeTypedArray(int value) => isOther(value);
@@ -299,39 +349,43 @@
     return cls == commonElements.jsNullClass || cls == commonElements.nullClass;
   }
 
-  // This function checks if cls is one of those classes other than bool or null
-  // that are live by default in a program.
-  bool _isLiveByDefault(ClassEntity cls) {
-    return cls == commonElements.intClass ||
-        cls == commonElements.numClass ||
-        cls == commonElements.doubleClass ||
-        cls == commonElements.stringClass;
-  }
-
   ClassInfo _computeClassInfo(ClassEntity cls) {
     ClassInfo classInfo = _storedClassInfo[cls];
     if (classInfo != null) {
       return classInfo;
     }
 
-    // Bool and Null are handled specially because the powerset bits
-    // contain information about values being bool or null.
+    // Handle null case specially
     if (_isNullSubtype(cls)) {
-      classInfo = ClassInfo(nullMask, powersetBottom, powersetBottom);
-      _storedClassInfo[cls] = classInfo;
-      return classInfo;
-    }
-    if (_isBoolSubtype(cls)) {
-      classInfo = ClassInfo(boolMask, powersetBottom, powersetBottom);
+      classInfo = ClassInfo(nullValue, powersetBottom, powersetBottom);
       _storedClassInfo[cls] = classInfo;
       return classInfo;
     }
 
-    // If cls is instantiated or live by default the 'other' bit should be set to 1.
-    int exactBits = powersetBottom;
-    if (_isLiveByDefault(cls) ||
-        _closedWorld.classHierarchy.isInstantiated(cls)) {
-      exactBits = otherMask;
+    // Handle bool and JSBool specially. Both appear to be 'instantiated' but
+    // only JSBool is really instantiated.
+    if (_isBoolSubtype(cls)) {
+      int exactBits = boolMask | interceptorMask;
+      classInfo = ClassInfo(exactBits, powersetBottom, powersetBottom);
+      _storedClassInfo[cls] = classInfo;
+      return classInfo;
+    }
+
+    // Compute interceptor and notInterceptor bits first
+    int interceptorBits = powersetBottom;
+    if (_closedWorld.classHierarchy.isInstantiated(cls)) {
+      if (_closedWorld.classHierarchy
+          .isSubclassOf(cls, commonElements.jsInterceptorClass)) {
+        interceptorBits |= interceptorMask;
+      } else {
+        interceptorBits |= notInterceptorMask;
+      }
+    }
+
+    int exactBits = interceptorBits;
+    if (_closedWorld.classHierarchy.isInstantiated(cls)) {
+      // If cls is instantiated or live by default the 'other' bit should be set to 1.
+      exactBits |= otherMask;
     }
 
     int strictSubtypeBits = powersetBottom;
@@ -517,43 +571,65 @@
 
   int get emptyType => powersetBottom;
 
-  int get constMapType => otherMask;
+  int _constMapType;
+  int get constMapType => _constMapType ??=
+      createNonNullSubtype(commonElements.constMapLiteralClass);
 
-  int get constSetType => otherMask;
+  int get constSetType => otherValue;
 
-  int get constListType => otherMask;
+  int _constListType;
+  int get constListType => _constListType ??=
+      createNonNullExact(commonElements.jsUnmodifiableArrayClass);
 
-  int get positiveIntType => otherMask;
+  int _fixedListType;
+  int get fixedListType =>
+      _fixedListType ??= createNonNullExact(commonElements.jsFixedArrayClass);
 
-  int get uint32Type => otherMask;
+  int _growableListType;
+  int get growableListType => _growableListType ??=
+      createNonNullExact(commonElements.jsExtendableArrayClass);
 
-  int get uint31Type => otherMask;
+  int get nullType => nullValue;
 
-  int get fixedListType => otherMask;
+  int get nonNullType => powersetTop & ~nullValue;
 
-  int get growableListType => otherMask;
+  int _mapType;
+  int get mapType =>
+      _mapType ??= createNonNullSubtype(commonElements.mapLiteralClass);
 
-  int get nullType => nullMask;
+  int _setType;
+  int get setType =>
+      _setType ??= createNonNullSubtype(commonElements.setLiteralClass);
 
-  int get nonNullType => otherMask;
+  int _listType;
+  int get listType =>
+      _listType ??= createNonNullExact(commonElements.jsArrayClass);
 
-  int get mapType => otherMask;
+  int _stringType;
+  int get stringType =>
+      _stringType ??= createNonNullSubtype(commonElements.jsStringClass);
 
-  int get setType => otherMask;
+  int _numType;
+  int get numType =>
+      _numType ??= createNonNullSubclass(commonElements.jsNumberClass);
 
-  int get listType => otherMask;
+  int _doubleType;
+  int get doubleType =>
+      _doubleType ??= createNonNullExact(commonElements.jsDoubleClass);
 
-  int get stringType => otherMask;
+  int _intType;
+  int get intType =>
+      _intType ??= createNonNullSubtype(commonElements.jsIntClass);
 
-  int get numType => otherMask;
+  int get positiveIntType => intType;
+  int get uint32Type => intType;
+  int get uint31Type => intType;
 
-  int get doubleType => otherMask;
+  int get boolType => boolValue;
 
-  int get intType => otherMask;
+  int _functionType;
+  int get functionType =>
+      _functionType ??= createNonNullSubtype(commonElements.functionClass);
 
-  int get boolType => boolMask;
-
-  int get functionType => otherMask;
-
-  int get typeType => otherMask;
+  int get typeType => otherValue;
 }
diff --git a/pkg/compiler/lib/src/inferrer/powersets/powersets.dart b/pkg/compiler/lib/src/inferrer/powersets/powersets.dart
index 0d5fb61..61a5124 100644
--- a/pkg/compiler/lib/src/inferrer/powersets/powersets.dart
+++ b/pkg/compiler/lib/src/inferrer/powersets/powersets.dart
@@ -18,7 +18,7 @@
 class PowersetValue implements AbstractValue {
   final AbstractValue _abstractValue;
   final int _powersetBits;
-  const PowersetValue(this._abstractValue, this._powersetBits);
+  PowersetValue(this._abstractValue, this._powersetBits);
 
   AbstractValue get abstractValue => _abstractValue;
   int get powersetBits => _powersetBits;
@@ -143,7 +143,7 @@
 
   @override
   AbstractValue computeReceiver(Iterable<MemberEntity> members) {
-    int powersetBits = _powersetBitsDomain.powersetTop;
+    int powersetBits = _powersetBitsDomain.computeReceiver(members);
     AbstractValue abstractValue = _abstractValueDomain.computeReceiver(members);
     return PowersetValue(abstractValue, powersetBits);
   }
@@ -213,7 +213,7 @@
       covariant PowersetValue key,
       covariant PowersetValue value,
       covariant Map<String, AbstractValue> mappings) {
-    int powersetBits = _powersetBitsDomain.otherMask;
+    int powersetBits = originalValue._powersetBits;
     AbstractValue abstractValue = _abstractValueDomain.createDictionaryValue(
         originalValue._abstractValue,
         allocationNode,
@@ -258,7 +258,7 @@
       MemberEntity allocationElement,
       covariant PowersetValue key,
       covariant PowersetValue value) {
-    int powersetBits = _powersetBitsDomain.otherMask;
+    int powersetBits = originalValue._powersetBits;
     AbstractValue abstractValue = _abstractValueDomain.createMapValue(
         originalValue._abstractValue,
         allocationNode,
@@ -289,7 +289,7 @@
       Object allocationNode,
       MemberEntity allocationElement,
       covariant PowersetValue elementType) {
-    int powersetBits = _powersetBitsDomain.otherMask;
+    int powersetBits = originalValue._powersetBits;
     AbstractValue abstractValue = _abstractValueDomain.createSetValue(
         originalValue._abstractValue,
         allocationNode,
@@ -326,7 +326,7 @@
       MemberEntity allocationElement,
       covariant PowersetValue elementType,
       int length) {
-    int powersetBits = _powersetBitsDomain.otherMask;
+    int powersetBits = originalValue._powersetBits;
     AbstractValue abstractValue = _abstractValueDomain.createContainerValue(
         originalValue._abstractValue,
         allocationNode,
diff --git a/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart b/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
index a484821..f03685c 100644
--- a/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
+++ b/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
@@ -92,10 +92,6 @@
 
   bool canUseSelfForInterceptor(HInstruction receiver,
       {Set<ClassEntity> interceptedClasses}) {
-    if (receiver.isPrimitive(_abstractValueDomain).isPotentiallyTrue) {
-      // Primitives always need interceptors.
-      return false;
-    }
     if (receiver.isNull(_abstractValueDomain).isPotentiallyTrue) {
       if (interceptedClasses == null ||
           interceptedClasses.contains(_commonElements.jsNullClass)) {
diff --git a/pkg/compiler/test/inference/powerset_bits2_test.dart b/pkg/compiler/test/inference/powerset_bits2_test.dart
index 3ed02cd..db5fe3d 100644
--- a/pkg/compiler/test/inference/powerset_bits2_test.dart
+++ b/pkg/compiler/test/inference/powerset_bits2_test.dart
@@ -39,8 +39,8 @@
     PowersetDomain powersetDomain = closedWorld.abstractValueDomain;
     PowersetBitsDomain powersetBitsDomain = powersetDomain.powersetBitsDomain;
 
-    var exactTrue = powersetBitsDomain.trueMask;
-    var exactFalse = powersetBitsDomain.falseMask;
+    var exactTrue = powersetBitsDomain.trueValue;
+    var exactFalse = powersetBitsDomain.falseValue;
     dynamic classA =
         elementEnvironment.lookupClass(elementEnvironment.mainLibrary, 'A');
     var exactA = powersetBitsDomain.createNonNullExact(classA);
diff --git a/pkg/compiler/test/inference/powerset_bits3_test.dart b/pkg/compiler/test/inference/powerset_bits3_test.dart
new file mode 100644
index 0000000..1f275a9
--- /dev/null
+++ b/pkg/compiler/test/inference/powerset_bits3_test.dart
@@ -0,0 +1,104 @@
+// 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.
+
+// @dart = 2.7
+
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/common.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/inferrer/abstract_value_domain.dart';
+import 'package:compiler/src/inferrer/powersets/powersets.dart';
+import 'package:compiler/src/world.dart';
+import 'package:expect/expect.dart';
+import '../helpers/element_lookup.dart';
+import '../helpers/memory_compiler.dart';
+
+const String CODE = """
+class A extends Comparable {
+  int compareTo(x) { return 0; }
+}
+class B extends Comparable {
+  int compareTo(x) { return 0; }
+}
+class C extends Comparable {
+  int compareTo(x) { return 0; }
+}
+class D extends Comparable {
+  int compareTo(x) { return 0; }
+}
+class E extends Comparable {
+  int compareTo(x) { return 0; }
+}
+
+var sink;
+test(x) {
+  if (x.compareTo(x)) {
+    sink = x;
+  }
+}
+
+var sink2;
+test2(x) {
+  sink2 = x;
+  print(x);
+}
+
+var sink3;
+test3(x) {
+  sink3 = x;
+  print(x);
+}
+
+
+main() {
+  A a = A();
+  B b = B();
+  C c = C();
+  D d = D();
+  E e = E();
+  test(a);
+  test(b);
+  test(c);
+  test(d);
+  test(e);
+  test2(-1);
+  test2(1);
+  test2("x");
+  test3([1]);
+  test3(0);
+  test3(a);
+}
+""";
+
+main() {
+  retainDataForTesting = true;
+
+  runTests() async {
+    CompilationResult result = await runCompiler(memorySourceFiles: {
+      'main.dart': CODE
+    }, options: [
+      '--experimental-powersets',
+    ]);
+    Expect.isTrue(result.isSuccess);
+    Compiler compiler = result.compiler;
+    var results = compiler.globalInference.resultsForTesting;
+    JClosedWorld closedWorld = results.closedWorld;
+    PowersetDomain powersetDomain = closedWorld.abstractValueDomain;
+
+    checkInterceptor(String name, {AbstractBool result = AbstractBool.True}) {
+      var element = findMember(closedWorld, name);
+      PowersetValue value = results.resultOfMember(element).type;
+      Expect.equals(powersetDomain.isInterceptor(value), result);
+    }
+
+    checkInterceptor('sink', result: AbstractBool.False);
+    checkInterceptor('sink2');
+    checkInterceptor('sink3', result: AbstractBool.Maybe);
+  }
+
+  asyncTest(() async {
+    print('--test from kernel------------------------------------------------');
+    await runTests();
+  });
+}
diff --git a/pkg/compiler/test/inference/powerset_bits_test.dart b/pkg/compiler/test/inference/powerset_bits_test.dart
index 4261af7..0bf0a6e 100644
--- a/pkg/compiler/test/inference/powerset_bits_test.dart
+++ b/pkg/compiler/test/inference/powerset_bits_test.dart
@@ -56,11 +56,12 @@
       Expect.equals(bits, mask.powersetBits);
     }
 
-    checkBits('a', powersetBitsDomain.trueMask);
-    checkBits('b', powersetBitsDomain.boolMask);
-    checkBits('c', powersetBitsDomain.boolMask);
-    checkBits('d', powersetBitsDomain.boolMask);
-    checkBits('e', powersetBitsDomain.falseMask | powersetBitsDomain.nullMask);
+    checkBits('a', powersetBitsDomain.trueValue);
+    checkBits('b', powersetBitsDomain.boolValue);
+    checkBits('c', powersetBitsDomain.boolValue);
+    checkBits('d', powersetBitsDomain.boolValue);
+    checkBits(
+        'e', powersetBitsDomain.falseValue | powersetBitsDomain.nullValue);
   }
 
   asyncTest(() async {
diff --git a/pkg/dartdev/README.md b/pkg/dartdev/README.md
index f2662cc..25e92b1 100644
--- a/pkg/dartdev/README.md
+++ b/pkg/dartdev/README.md
@@ -7,18 +7,18 @@
 
 Global options:
 -h, --help                 Print this usage information.
--v, --verbose              Show verbose output.
+-v, --verbose              Show additional command output.
     --version              Print the Dart SDK version.
     --enable-analytics     Enable anonymous analytics.
     --disable-analytics    Disable anonymous analytics.
 
 Available commands:
   analyze   Analyze the project's Dart code.
+  compile   Compile Dart to various formats.
   create    Create a new project.
-  format    Format Dart source code.
-  migrate   Perform a null safety migration on a project or package.
+  format    Idiomatically formats Dart source code.
   pub       Work with packages.
-  run       Run a Dart file.
+  run       Run a Dart program.
   test      Runs tests in this project.
 
 Run "dart help <command>" for more information about a command.
diff --git a/pkg/dartdev/lib/dartdev.dart b/pkg/dartdev/lib/dartdev.dart
index 275c8c2..72df662 100644
--- a/pkg/dartdev/lib/dartdev.dart
+++ b/pkg/dartdev/lib/dartdev.dart
@@ -247,9 +247,9 @@
     argParser.addMultiOption(
       experimentFlagName,
       valueHelp: 'experiment',
-      allowed: features.map((feature) => feature.enableString),
       allowedHelp: verbose ? allowedHelp : null,
-      help: 'Enable one or more experimental features.',
+      help: 'Enable one or more experimental features '
+          '(see dart.dev/go/experiments).',
     );
   }
 
diff --git a/pkg/dartdev/lib/src/commands/analyze.dart b/pkg/dartdev/lib/src/commands/analyze.dart
index e78e881..139d262 100644
--- a/pkg/dartdev/lib/src/commands/analyze.dart
+++ b/pkg/dartdev/lib/src/commands/analyze.dart
@@ -12,9 +12,14 @@
 import '../utils.dart';
 import 'analyze_impl.dart';
 
-// TODO: Support enable-experiment for 'dart analyze'.
-
 class AnalyzeCommand extends DartdevCommand<int> {
+  /// The maximum length of any of the existing severity labels.
+  static const int _severityWidth = 7;
+
+  /// The number of spaces needed to indent follow-on lines (the body) under the
+  /// message. The width left for the severity label plus the separator width.
+  static const int _bodyIndentWidth = _severityWidth + 3;
+
   AnalyzeCommand() : super('analyze', "Analyze the project's Dart code.") {
     argParser
       ..addFlag('fatal-infos',
@@ -91,7 +96,7 @@
         // error • Message ... at path.dart:line:col • (code)
 
         var filePath = path.relative(error.file, from: dir.path);
-        var severity = error.severity.toLowerCase().padLeft(7);
+        var severity = error.severity.toLowerCase().padLeft(_severityWidth);
         if (error.isError) {
           severity = log.ansi.error(severity);
         }
@@ -104,7 +109,7 @@
         );
 
         if (verbose) {
-          var padding = ' '.padLeft(error.severity.length + 2);
+          var padding = ' ' * _bodyIndentWidth;
           for (var message in error.contextMessages) {
             log.stdout('$padding${message.message} '
                 'at ${message.filePath}:${message.line}:${message.column}');
diff --git a/pkg/dartdev/lib/src/commands/analyze_impl.dart b/pkg/dartdev/lib/src/commands/analyze_impl.dart
index e3e7396..714753d 100644
--- a/pkg/dartdev/lib/src/commands/analyze_impl.dart
+++ b/pkg/dartdev/lib/src/commands/analyze_impl.dart
@@ -239,6 +239,10 @@
 
   List<DiagnosticMessage> get contextMessages {
     var messages = json['contextMessages'] as List<dynamic>;
+    if (messages == null) {
+      // The field is optional, so we return an empty list as a default value.
+      return [];
+    }
     return messages.map((message) => DiagnosticMessage(message)).toList();
   }
 
diff --git a/pkg/dartdev/lib/src/commands/compile.dart b/pkg/dartdev/lib/src/commands/compile.dart
index 9add920..873680b 100644
--- a/pkg/dartdev/lib/src/commands/compile.dart
+++ b/pkg/dartdev/lib/src/commands/compile.dart
@@ -174,7 +174,7 @@
         abbr: commonOptions['outputFile'].abbr,
       )
       ..addMultiOption('define', abbr: 'D', valueHelp: 'key=value', help: '''
-Set values of environment variables. To specify multiple variables, use multiple options or use commas to separate key-value pairs.
+Define an environment declaration. To specify multiple declarations, use multiple options or use commas to separate key-value pairs.
 For example, 'dart compile $commandName -Da=1,b=2 main.dart'.''')
       ..addFlag('enable-asserts',
           negatable: false, help: 'Enable assert statements.')
diff --git a/pkg/dartdev/lib/src/commands/run.dart b/pkg/dartdev/lib/src/commands/run.dart
index fe2f67a..b0296d4 100644
--- a/pkg/dartdev/lib/src/commands/run.dart
+++ b/pkg/dartdev/lib/src/commands/run.dart
@@ -189,11 +189,9 @@
       }
 
       if (!foundImplicitFileToRun) {
-        log.stderr(
-          'Could not find the implicit file to run: '
-          'bin$separator$cwdName.dart.',
-        );
-        return errorExitCode;
+        // This throws.
+        usageException('Could not find the implicit file to run: '
+            'bin$separator$cwdName.dart.');
       }
     }
 
diff --git a/pkg/dartdev/lib/src/utils.dart b/pkg/dartdev/lib/src/utils.dart
index f77574c..88b80ed 100644
--- a/pkg/dartdev/lib/src/utils.dart
+++ b/pkg/dartdev/lib/src/utils.dart
@@ -56,7 +56,8 @@
       allCmds != null &&
       args.isNotEmpty &&
       allCmds.isNotEmpty &&
-      args.firstWhere((arg) => allCmds.contains(arg)) == 'help' &&
+      args.firstWhere((arg) => allCmds.contains(arg), orElse: () => '') ==
+          'help' &&
       args.contains('help') &&
       args.contains('pub') &&
       args.indexOf('help') + 1 == args.indexOf('pub');
diff --git a/pkg/dartdev/test/commands/analyze_test.dart b/pkg/dartdev/test/commands/analyze_test.dart
index 61206ca..aa4e2eb 100644
--- a/pkg/dartdev/test/commands/analyze_test.dart
+++ b/pkg/dartdev/test/commands/analyze_test.dart
@@ -2,11 +2,13 @@
 // 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:dartdev/src/commands/analyze_impl.dart';
 import 'package:test/test.dart';
 
 import '../utils.dart';
 
 void main() {
+  group('analysisError', defineAnalysisError, timeout: longTimeout);
   group('analyze', defineAnalyze, timeout: longTimeout);
 }
 
@@ -15,6 +17,13 @@
 const String _analyzeUsageText =
     'Usage: dart analyze [arguments] [<directory>]';
 
+const String _unusedImportAnalysisOptions = '''
+analyzer:
+  errors:
+    # Increase the severity of several hints.
+    unused_import: warning
+''';
+
 const String _unusedImportCodeSnippet = '''
 import 'dart:convert';
 
@@ -23,12 +32,26 @@
 }
 ''';
 
-const String _unusedImportAnalysisOptions = '''
-analyzer:
-  errors:
-    # Increase the severity of several hints.
-    unused_import: warning
-''';
+void defineAnalysisError() {
+  group('contextMessages', () {
+    test('none', () {
+      var error = AnalysisError({});
+      expect(error.contextMessages, isEmpty);
+    });
+    test('one', () {
+      var error = AnalysisError({
+        'contextMessages': [<String, dynamic>{}],
+      });
+      expect(error.contextMessages, hasLength(1));
+    });
+    test('two', () {
+      var error = AnalysisError({
+        'contextMessages': [<String, dynamic>{}, <String, dynamic>{}],
+      });
+      expect(error.contextMessages, hasLength(2));
+    });
+  });
+}
 
 void defineAnalyze() {
   TestProject p;
diff --git a/pkg/dartdev/test/commands/run_test.dart b/pkg/dartdev/test/commands/run_test.dart
index 38c40c1..5c36e71 100644
--- a/pkg/dartdev/test/commands/run_test.dart
+++ b/pkg/dartdev/test/commands/run_test.dart
@@ -81,7 +81,7 @@
     expect(result.stdout, isEmpty);
     expect(result.stderr,
         contains('Could not find the implicit file to run: bin'));
-    expect(result.exitCode, 255);
+    expect(result.exitCode, 64);
   });
 
   test('arguments are properly passed', () {
diff --git a/pkg/dartdev/test/test_all.dart b/pkg/dartdev/test/test_all.dart
index 0c45d45..a3b6db4 100644
--- a/pkg/dartdev/test/test_all.dart
+++ b/pkg/dartdev/test/test_all.dart
@@ -17,6 +17,7 @@
 import 'commands/run_test.dart' as run;
 import 'commands/test_test.dart' as test;
 import 'core_test.dart' as core;
+import 'experiments_test.dart' as experiments;
 import 'sdk_test.dart' as sdk;
 import 'utils_test.dart' as utils;
 
@@ -25,6 +26,7 @@
     analytics.main();
     analyze.main();
     create.main();
+    experiments.main();
     fix.main();
     flag.main();
     format.main();
diff --git a/pkg/dartdev/test/utils_test.dart b/pkg/dartdev/test/utils_test.dart
index 31cc6c9..9740dd1 100644
--- a/pkg/dartdev/test/utils_test.dart
+++ b/pkg/dartdev/test/utils_test.dart
@@ -108,6 +108,8 @@
       expect(PubUtils.shouldModifyArgs([], null), isFalse);
       expect(PubUtils.shouldModifyArgs(null, []), isFalse);
       expect(PubUtils.shouldModifyArgs([], []), isFalse);
+      expect(PubUtils.shouldModifyArgs(['-h'], allCmds), isFalse);
+      expect(PubUtils.shouldModifyArgs(['--help'], allCmds), isFalse);
       expect(PubUtils.shouldModifyArgs(['help'], allCmds), isFalse);
       expect(PubUtils.shouldModifyArgs(['pub'], allCmds), isFalse);
       expect(PubUtils.shouldModifyArgs(['analyze', 'help', 'pub'], allCmds),
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 2940119..3a5f05f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -1090,7 +1090,7 @@
 
     if (loader.target.context.options
         .isExperimentEnabledGlobally(ExperimentalFlag.valueClass)) {
-      valueClass.transformComponent(component);
+      valueClass.transformComponent(component, loader.coreTypes);
       ticker.logMs("Lowered value classes");
     }
 
diff --git a/pkg/front_end/parser_testcases/error_recovery/comment_on_non_ascii_identifier.dart b/pkg/front_end/parser_testcases/error_recovery/comment_on_non_ascii_identifier.dart
new file mode 100644
index 0000000..0c1ef17
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/comment_on_non_ascii_identifier.dart
@@ -0,0 +1,12 @@
+main() {
+  // Identifiers can't have non-ascii characters.
+  // Having this comment shouldn't trigger any asserts though.
+  int æFoo = 42;
+  // Try comment on an identifier that doesn't start with a non-ascii char too.
+  int fooÆ = 42;
+  // Try comment on an OK identifier too.
+  int foo = 42;
+  print(/* comment */ æFoo);
+  print(/* comment */ fooÆ);
+  print(/* comment */ foo);
+}
\ No newline at end of file
diff --git a/pkg/front_end/parser_testcases/error_recovery/comment_on_non_ascii_identifier.dart.expect b/pkg/front_end/parser_testcases/error_recovery/comment_on_non_ascii_identifier.dart.expect
new file mode 100644
index 0000000..d241e52
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/comment_on_non_ascii_identifier.dart.expect
@@ -0,0 +1,111 @@
+Problems reported:
+
+parser/error_recovery/comment_on_non_ascii_identifier:4:7: The non-ASCII character 'æ' (U+00E6) can't be used in identifiers, only in strings and comments.
+  int æFoo = 42;
+      ^
+
+parser/error_recovery/comment_on_non_ascii_identifier:6:10: The non-ASCII character 'Æ' (U+00C6) can't be used in identifiers, only in strings and comments.
+  int fooÆ = 42;
+         ^
+
+parser/error_recovery/comment_on_non_ascii_identifier:9:23: The non-ASCII character 'æ' (U+00E6) can't be used in identifiers, only in strings and comments.
+  print(/* comment */ æFoo);
+                      ^
+
+parser/error_recovery/comment_on_non_ascii_identifier:10:26: The non-ASCII character 'Æ' (U+00C6) can't be used in identifiers, only in strings and comments.
+  print(/* comment */ fooÆ);
+                         ^
+
+beginCompilationUnit(main)
+  beginMetadataStar(main)
+  endMetadataStar(0)
+  beginTopLevelMember(main)
+    beginTopLevelMethod(NonAsciiIdentifierToken(198), null)
+      handleNoType(NonAsciiIdentifierToken(198))
+      handleIdentifier(main, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(æFoo)
+        handleType(int, null)
+        beginVariablesDeclaration(æFoo, null, null)
+          handleIdentifier(æFoo, localVariableDeclaration)
+          beginInitializedIdentifier(æFoo)
+            beginVariableInitializer(=)
+              handleLiteralInt(42)
+            endVariableInitializer(=)
+          endInitializedIdentifier(æFoo)
+        endVariablesDeclaration(1, ;)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(fooÆ)
+        handleType(int, null)
+        beginVariablesDeclaration(fooÆ, null, null)
+          handleIdentifier(fooÆ, localVariableDeclaration)
+          beginInitializedIdentifier(fooÆ)
+            beginVariableInitializer(=)
+              handleLiteralInt(42)
+            endVariableInitializer(=)
+          endInitializedIdentifier(fooÆ)
+        endVariablesDeclaration(1, ;)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(foo)
+        handleType(int, null)
+        beginVariablesDeclaration(foo, null, null)
+          handleIdentifier(foo, localVariableDeclaration)
+          beginInitializedIdentifier(foo)
+            beginVariableInitializer(=)
+              handleLiteralInt(42)
+            endVariableInitializer(=)
+          endInitializedIdentifier(foo)
+        endVariablesDeclaration(1, ;)
+        handleIdentifier(print, expression)
+        handleNoTypeArguments(()
+        beginArguments(()
+          handleIdentifier(æFoo, expression)
+          handleNoTypeArguments())
+          handleNoArguments())
+          handleSend(æFoo, ))
+        endArguments(1, (, ))
+        handleSend(print, ;)
+        handleExpressionStatement(;)
+        handleIdentifier(print, expression)
+        handleNoTypeArguments(()
+        beginArguments(()
+          handleIdentifier(fooÆ, expression)
+          handleNoTypeArguments())
+          handleNoArguments())
+          handleSend(fooÆ, ))
+        endArguments(1, (, ))
+        handleSend(print, ;)
+        handleExpressionStatement(;)
+        handleIdentifier(print, expression)
+        handleNoTypeArguments(()
+        beginArguments(()
+          handleIdentifier(foo, expression)
+          handleNoTypeArguments())
+          handleNoArguments())
+          handleSend(foo, ))
+        endArguments(1, (, ))
+        handleSend(print, ;)
+        handleExpressionStatement(;)
+      endBlockFunctionBody(6, {, })
+    endTopLevelMethod(main, null, })
+  endTopLevelDeclaration()
+  handleErrorToken(NonAsciiIdentifierToken(230))
+  handleRecoverableError(Message[NonAsciiIdentifier, The non-ASCII character 'æ' (U+00E6) can't be used in identifiers, only in strings and comments., Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign)., {character: æ, codePoint: 230}], NonAsciiIdentifierToken(230), NonAsciiIdentifierToken(230))
+  handleErrorToken(NonAsciiIdentifierToken(198))
+  handleRecoverableError(Message[NonAsciiIdentifier, The non-ASCII character 'Æ' (U+00C6) can't be used in identifiers, only in strings and comments., Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign)., {character: Æ, codePoint: 198}], NonAsciiIdentifierToken(198), NonAsciiIdentifierToken(198))
+  handleErrorToken(NonAsciiIdentifierToken(230))
+  handleRecoverableError(Message[NonAsciiIdentifier, The non-ASCII character 'æ' (U+00E6) can't be used in identifiers, only in strings and comments., Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign)., {character: æ, codePoint: 230}], NonAsciiIdentifierToken(230), NonAsciiIdentifierToken(230))
+  handleErrorToken(NonAsciiIdentifierToken(198))
+  handleRecoverableError(Message[NonAsciiIdentifier, The non-ASCII character 'Æ' (U+00C6) can't be used in identifiers, only in strings and comments., Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign)., {character: Æ, codePoint: 198}], NonAsciiIdentifierToken(198), NonAsciiIdentifierToken(198))
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/comment_on_non_ascii_identifier.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/comment_on_non_ascii_identifier.dart.intertwined.expect
new file mode 100644
index 0000000..7413d26
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/comment_on_non_ascii_identifier.dart.intertwined.expect
@@ -0,0 +1,234 @@
+parseUnit(NonAsciiIdentifierToken(230))
+  skipErrorTokens(NonAsciiIdentifierToken(230))
+  listener: beginCompilationUnit(main)
+  syntheticPreviousToken(main)
+  parseTopLevelDeclarationImpl(NonAsciiIdentifierToken(198), Instance of 'DirectiveContext')
+    parseMetadataStar(NonAsciiIdentifierToken(198))
+      listener: beginMetadataStar(main)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(NonAsciiIdentifierToken(198))
+      listener: beginTopLevelMember(main)
+      isReservedKeyword(()
+      parseTopLevelMethod(NonAsciiIdentifierToken(198), null, NonAsciiIdentifierToken(198), Instance of 'NoType', null, main, false)
+        listener: beginTopLevelMethod(NonAsciiIdentifierToken(198), null)
+        listener: handleNoType(NonAsciiIdentifierToken(198))
+        ensureIdentifierPotentiallyRecovered(NonAsciiIdentifierToken(198), topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(main, topLevelFunctionDeclaration)
+        parseMethodTypeVar(main)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(main, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, int)
+          parseStatement({)
+            parseStatementX({)
+              parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+                looksLikeLocalFunction(æFoo)
+                listener: beginMetadataStar(int)
+                listener: endMetadataStar(0)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(æFoo)
+                listener: handleType(int, null)
+                listener: beginVariablesDeclaration(æFoo, null, null)
+                parseVariablesDeclarationRest(int, true)
+                  parseOptionallyInitializedIdentifier(int)
+                    ensureIdentifier(int, localVariableDeclaration)
+                      listener: handleIdentifier(æFoo, localVariableDeclaration)
+                    listener: beginInitializedIdentifier(æFoo)
+                    parseVariableInitializerOpt(æFoo)
+                      listener: beginVariableInitializer(=)
+                      parseExpression(=)
+                        parsePrecedenceExpression(=, 1, true)
+                          parseUnaryExpression(=, true)
+                            parsePrimary(=, expression)
+                              parseLiteralInt(=)
+                                listener: handleLiteralInt(42)
+                      listener: endVariableInitializer(=)
+                    listener: endInitializedIdentifier(æFoo)
+                  ensureSemicolon(42)
+                  listener: endVariablesDeclaration(1, ;)
+          notEofOrValue(}, int)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                looksLikeLocalFunction(fooÆ)
+                listener: beginMetadataStar(int)
+                listener: endMetadataStar(0)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(fooÆ)
+                listener: handleType(int, null)
+                listener: beginVariablesDeclaration(fooÆ, null, null)
+                parseVariablesDeclarationRest(int, true)
+                  parseOptionallyInitializedIdentifier(int)
+                    ensureIdentifier(int, localVariableDeclaration)
+                      listener: handleIdentifier(fooÆ, localVariableDeclaration)
+                    listener: beginInitializedIdentifier(fooÆ)
+                    parseVariableInitializerOpt(fooÆ)
+                      listener: beginVariableInitializer(=)
+                      parseExpression(=)
+                        parsePrecedenceExpression(=, 1, true)
+                          parseUnaryExpression(=, true)
+                            parsePrimary(=, expression)
+                              parseLiteralInt(=)
+                                listener: handleLiteralInt(42)
+                      listener: endVariableInitializer(=)
+                    listener: endInitializedIdentifier(fooÆ)
+                  ensureSemicolon(42)
+                  listener: endVariablesDeclaration(1, ;)
+          notEofOrValue(}, int)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                looksLikeLocalFunction(foo)
+                listener: beginMetadataStar(int)
+                listener: endMetadataStar(0)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(foo)
+                listener: handleType(int, null)
+                listener: beginVariablesDeclaration(foo, null, null)
+                parseVariablesDeclarationRest(int, true)
+                  parseOptionallyInitializedIdentifier(int)
+                    ensureIdentifier(int, localVariableDeclaration)
+                      listener: handleIdentifier(foo, localVariableDeclaration)
+                    listener: beginInitializedIdentifier(foo)
+                    parseVariableInitializerOpt(foo)
+                      listener: beginVariableInitializer(=)
+                      parseExpression(=)
+                        parsePrecedenceExpression(=, 1, true)
+                          parseUnaryExpression(=, true)
+                            parsePrimary(=, expression)
+                              parseLiteralInt(=)
+                                listener: handleLiteralInt(42)
+                      listener: endVariableInitializer(=)
+                    listener: endInitializedIdentifier(foo)
+                  ensureSemicolon(42)
+                  listener: endVariablesDeclaration(1, ;)
+          notEofOrValue(}, print)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                looksLikeLocalFunction(print)
+                parseExpressionStatement(;)
+                  parseExpression(;)
+                    parsePrecedenceExpression(;, 1, true)
+                      parseUnaryExpression(;, true)
+                        parsePrimary(;, expression)
+                          parseSendOrFunctionLiteral(;, expression)
+                            looksLikeFunctionBody(;)
+                            parseSend(;, expression)
+                              ensureIdentifier(;, expression)
+                                listener: handleIdentifier(print, expression)
+                              listener: handleNoTypeArguments(()
+                              parseArgumentsOpt(print)
+                                parseArguments(print)
+                                  parseArgumentsRest(()
+                                    listener: beginArguments(()
+                                    parseExpression(()
+                                      parsePrecedenceExpression((, 1, true)
+                                        parseUnaryExpression((, true)
+                                          parsePrimary((, expression)
+                                            parseSendOrFunctionLiteral((, expression)
+                                              parseSend((, expression)
+                                                ensureIdentifier((, expression)
+                                                  listener: handleIdentifier(æFoo, expression)
+                                                listener: handleNoTypeArguments())
+                                                parseArgumentsOpt(æFoo)
+                                                  listener: handleNoArguments())
+                                                listener: handleSend(æFoo, ))
+                                    listener: endArguments(1, (, ))
+                              listener: handleSend(print, ;)
+                  ensureSemicolon())
+                  listener: handleExpressionStatement(;)
+          notEofOrValue(}, print)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                looksLikeLocalFunction(print)
+                parseExpressionStatement(;)
+                  parseExpression(;)
+                    parsePrecedenceExpression(;, 1, true)
+                      parseUnaryExpression(;, true)
+                        parsePrimary(;, expression)
+                          parseSendOrFunctionLiteral(;, expression)
+                            looksLikeFunctionBody(;)
+                            parseSend(;, expression)
+                              ensureIdentifier(;, expression)
+                                listener: handleIdentifier(print, expression)
+                              listener: handleNoTypeArguments(()
+                              parseArgumentsOpt(print)
+                                parseArguments(print)
+                                  parseArgumentsRest(()
+                                    listener: beginArguments(()
+                                    parseExpression(()
+                                      parsePrecedenceExpression((, 1, true)
+                                        parseUnaryExpression((, true)
+                                          parsePrimary((, expression)
+                                            parseSendOrFunctionLiteral((, expression)
+                                              parseSend((, expression)
+                                                ensureIdentifier((, expression)
+                                                  listener: handleIdentifier(fooÆ, expression)
+                                                listener: handleNoTypeArguments())
+                                                parseArgumentsOpt(fooÆ)
+                                                  listener: handleNoArguments())
+                                                listener: handleSend(fooÆ, ))
+                                    listener: endArguments(1, (, ))
+                              listener: handleSend(print, ;)
+                  ensureSemicolon())
+                  listener: handleExpressionStatement(;)
+          notEofOrValue(}, print)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                looksLikeLocalFunction(print)
+                parseExpressionStatement(;)
+                  parseExpression(;)
+                    parsePrecedenceExpression(;, 1, true)
+                      parseUnaryExpression(;, true)
+                        parsePrimary(;, expression)
+                          parseSendOrFunctionLiteral(;, expression)
+                            looksLikeFunctionBody(;)
+                            parseSend(;, expression)
+                              ensureIdentifier(;, expression)
+                                listener: handleIdentifier(print, expression)
+                              listener: handleNoTypeArguments(()
+                              parseArgumentsOpt(print)
+                                parseArguments(print)
+                                  parseArgumentsRest(()
+                                    listener: beginArguments(()
+                                    parseExpression(()
+                                      parsePrecedenceExpression((, 1, true)
+                                        parseUnaryExpression((, true)
+                                          parsePrimary((, expression)
+                                            parseSendOrFunctionLiteral((, expression)
+                                              parseSend((, expression)
+                                                ensureIdentifier((, expression)
+                                                  listener: handleIdentifier(foo, expression)
+                                                listener: handleNoTypeArguments())
+                                                parseArgumentsOpt(foo)
+                                                  listener: handleNoArguments())
+                                                listener: handleSend(foo, ))
+                                    listener: endArguments(1, (, ))
+                              listener: handleSend(print, ;)
+                  ensureSemicolon())
+                  listener: handleExpressionStatement(;)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(6, {, })
+        listener: endTopLevelMethod(main, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(NonAsciiIdentifierToken(230))
+    listener: handleErrorToken(NonAsciiIdentifierToken(230))
+    listener: handleRecoverableError(Message[NonAsciiIdentifier, The non-ASCII character 'æ' (U+00E6) can't be used in identifiers, only in strings and comments., Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign)., {character: æ, codePoint: 230}], NonAsciiIdentifierToken(230), NonAsciiIdentifierToken(230))
+    listener: handleErrorToken(NonAsciiIdentifierToken(198))
+    listener: handleRecoverableError(Message[NonAsciiIdentifier, The non-ASCII character 'Æ' (U+00C6) can't be used in identifiers, only in strings and comments., Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign)., {character: Æ, codePoint: 198}], NonAsciiIdentifierToken(198), NonAsciiIdentifierToken(198))
+    listener: handleErrorToken(NonAsciiIdentifierToken(230))
+    listener: handleRecoverableError(Message[NonAsciiIdentifier, The non-ASCII character 'æ' (U+00E6) can't be used in identifiers, only in strings and comments., Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign)., {character: æ, codePoint: 230}], NonAsciiIdentifierToken(230), NonAsciiIdentifierToken(230))
+    listener: handleErrorToken(NonAsciiIdentifierToken(198))
+    listener: handleRecoverableError(Message[NonAsciiIdentifier, The non-ASCII character 'Æ' (U+00C6) can't be used in identifiers, only in strings and comments., Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign)., {character: Æ, codePoint: 198}], NonAsciiIdentifierToken(198), NonAsciiIdentifierToken(198))
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/comment_on_non_ascii_identifier.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/comment_on_non_ascii_identifier.dart.parser.expect
new file mode 100644
index 0000000..e0dacd4
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/comment_on_non_ascii_identifier.dart.parser.expect
@@ -0,0 +1,31 @@
+main() {
+
+
+int æFoo = 42;
+
+int fooÆ = 42;
+
+int foo = 42;
+print( æFoo);
+print( fooÆ);
+print( foo);
+}
+
+[NonAsciiIdentifierToken]
+
+[NonAsciiIdentifierToken]
+
+
+[NonAsciiIdentifierToken]
+[NonAsciiIdentifierToken]main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+
+
+int[StringToken] æFoo[StringToken] =[SimpleToken] 42[StringToken];[SimpleToken]
+
+int[StringToken] fooÆ[StringToken] =[SimpleToken] 42[StringToken];[SimpleToken]
+
+int[StringToken] foo[StringToken] =[SimpleToken] 42[StringToken];[SimpleToken]
+print[StringToken]([BeginToken] æFoo[StringToken])[SimpleToken];[SimpleToken]
+print[StringToken]([BeginToken] fooÆ[StringToken])[SimpleToken];[SimpleToken]
+print[StringToken]([BeginToken] foo[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/comment_on_non_ascii_identifier.dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/comment_on_non_ascii_identifier.dart.scanner.expect
new file mode 100644
index 0000000..e0dacd4
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/comment_on_non_ascii_identifier.dart.scanner.expect
@@ -0,0 +1,31 @@
+main() {
+
+
+int æFoo = 42;
+
+int fooÆ = 42;
+
+int foo = 42;
+print( æFoo);
+print( fooÆ);
+print( foo);
+}
+
+[NonAsciiIdentifierToken]
+
+[NonAsciiIdentifierToken]
+
+
+[NonAsciiIdentifierToken]
+[NonAsciiIdentifierToken]main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+
+
+int[StringToken] æFoo[StringToken] =[SimpleToken] 42[StringToken];[SimpleToken]
+
+int[StringToken] fooÆ[StringToken] =[SimpleToken] 42[StringToken];[SimpleToken]
+
+int[StringToken] foo[StringToken] =[SimpleToken] 42[StringToken];[SimpleToken]
+print[StringToken]([BeginToken] æFoo[StringToken])[SimpleToken];[SimpleToken]
+print[StringToken]([BeginToken] fooÆ[StringToken])[SimpleToken];[SimpleToken]
+print[StringToken]([BeginToken] foo[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/pubspec.yaml b/pkg/front_end/pubspec.yaml
index e6f10d1..f81b308 100644
--- a/pkg/front_end/pubspec.yaml
+++ b/pkg/front_end/pubspec.yaml
@@ -8,8 +8,10 @@
 environment:
   sdk: '>=2.2.2 <3.0.0'
 dependencies:
-  _fe_analyzer_shared: ^2.0.0
-  kernel: 0.3.29
+  _fe_analyzer_shared:
+    path: ../_fe_analyzer_shared/
+  kernel:
+    path: ../kernel/
   package_config:
     path: ../../third_party/pkg_tested/package_config/
 dev_dependencies:
diff --git a/pkg/front_end/test/deps_test.dart b/pkg/front_end/test/deps_test.dart
index 64cce4a..3bb12a7 100644
--- a/pkg/front_end/test/deps_test.dart
+++ b/pkg/front_end/test/deps_test.dart
@@ -35,9 +35,10 @@
   // TODO(johnniwinther): Fix to allow dependency of package:package_config.
   "third_party/pkg_tested/package_config/lib/src/util_io.dart",
 
-  // TODO(CFE-team): This file should not be included.
+  // TODO(CFE-team): These files should not be included.
   // The package isn't even in pubspec.yaml.
   "pkg/meta/lib/meta.dart",
+  "pkg/meta/lib/meta_meta.dart",
 };
 
 Future<void> main() async {
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 6b2cbce..969be0d 100644
--- a/pkg/front_end/testcases/value_class/empty.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/empty.dart.strong.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class EmptyClass extends core::Object {
   synthetic constructor •() → self::EmptyClass
     : super core::Object::•()
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 6b2cbce..969be0d 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
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class EmptyClass extends core::Object {
   synthetic constructor •() → self::EmptyClass
     : super core::Object::•()
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 6b2cbce..969be0d 100644
--- a/pkg/front_end/testcases/value_class/empty.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/empty.dart.weak.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class EmptyClass extends core::Object {
   synthetic constructor •() → self::EmptyClass
     : super core::Object::•()
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 6b2cbce..969be0d 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
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class EmptyClass extends core::Object {
   synthetic constructor •() → self::EmptyClass
     : super core::Object::•()
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 34ca526..38e8d0c 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
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class A extends core::Object {
   synthetic constructor •() → self::A
     : super core::Object::•()
@@ -28,7 +27,6 @@
     : super self::B::•()
     ;
 }
-@#C1
 class F = self::B with self::C {
   synthetic constructor •() → self::F
     : super self::B::•()
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 b6394fb..1203e0a 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
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class A extends core::Object {
   synthetic constructor •() → self::A
     : super core::Object::•()
@@ -28,7 +27,6 @@
     : super self::B::•()
     ;
 }
-@#C1
 class F extends self::B implements self::C /*isEliminatedMixin*/  {
   synthetic constructor •() → self::F
     : super self::B::•()
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 34ca526..38e8d0c 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
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class A extends core::Object {
   synthetic constructor •() → self::A
     : super core::Object::•()
@@ -28,7 +27,6 @@
     : super self::B::•()
     ;
 }
-@#C1
 class F = self::B with self::C {
   synthetic constructor •() → self::F
     : super self::B::•()
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 b6394fb..1203e0a 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
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class A extends core::Object {
   synthetic constructor •() → self::A
     : super core::Object::•()
@@ -28,7 +27,6 @@
     : super self::B::•()
     ;
 }
-@#C1
 class F extends self::B implements self::C /*isEliminatedMixin*/  {
   synthetic constructor •() → self::F
     : super self::B::•()
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart b/pkg/front_end/testcases/value_class/non_final_field_error.dart
index 1cb241b..b9ac3c4 100644
--- a/pkg/front_end/testcases/value_class/non_final_field_error.dart
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart
@@ -6,7 +6,7 @@
 
 @valueClass
 class Animal {
-  int numLegs;
+  int numberOfLegs;
 }
 
 main() {}
\ No newline at end of file
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 0576b95..2b8fa05 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
@@ -4,7 +4,7 @@
 
 @self::valueClass
 class Animal extends core::Object {
-  field core::int numLegs;
+  field core::int numberOfLegs;
   synthetic constructor •() → self::Animal
     ;
 }
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.expect
index c424f4f..c7c00ed 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
@@ -2,18 +2,17 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/non_final_field_error.dart:9:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
-//   int numLegs;
-//       ^^^^^^^
+// pkg/front_end/testcases/value_class/non_final_field_error.dart:9:7: Error: Field 'numberOfLegs' should be initialized because its type 'int' doesn't allow null.
+//   int numberOfLegs;
+//       ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class Animal extends core::Object {
-  field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 static const field core::String valueClass = #C1;
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 c424f4f..c7c00ed 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
@@ -2,18 +2,17 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/non_final_field_error.dart:9:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
-//   int numLegs;
-//       ^^^^^^^
+// pkg/front_end/testcases/value_class/non_final_field_error.dart:9:7: Error: Field 'numberOfLegs' should be initialized because its type 'int' doesn't allow null.
+//   int numberOfLegs;
+//       ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class Animal extends core::Object {
-  field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 static const field core::String valueClass = #C1;
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart.textual_outline.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.textual_outline.expect
index 2130873..f3e2971 100644
--- a/pkg/front_end/testcases/value_class/non_final_field_error.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart.textual_outline.expect
@@ -2,7 +2,7 @@
 
 @valueClass
 class Animal {
-  int numLegs;
+  int numberOfLegs;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.textual_outline_modelled.expect
index e9bb0a6..8e62800 100644
--- a/pkg/front_end/testcases/value_class/non_final_field_error.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart.textual_outline_modelled.expect
@@ -1,6 +1,6 @@
 @valueClass
 class Animal {
-  int numLegs;
+  int numberOfLegs;
 }
 
 const String valueClass = "valueClass";
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.expect
index c424f4f..c7c00ed 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
@@ -2,18 +2,17 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/non_final_field_error.dart:9:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
-//   int numLegs;
-//       ^^^^^^^
+// pkg/front_end/testcases/value_class/non_final_field_error.dart:9:7: Error: Field 'numberOfLegs' should be initialized because its type 'int' doesn't allow null.
+//   int numberOfLegs;
+//       ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class Animal extends core::Object {
-  field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 static const field core::String valueClass = #C1;
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 c424f4f..c7c00ed 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
@@ -2,18 +2,17 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/non_final_field_error.dart:9:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
-//   int numLegs;
-//       ^^^^^^^
+// pkg/front_end/testcases/value_class/non_final_field_error.dart:9:7: Error: Field 'numberOfLegs' should be initialized because its type 'int' doesn't allow null.
+//   int numberOfLegs;
+//       ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class Animal extends core::Object {
-  field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 static const field core::String valueClass = #C1;
diff --git a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart
index 00d89f6..e7ab504 100644
--- a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart
@@ -6,7 +6,7 @@
 
 @valueClass
 class Animal {
-  final int numLegs;
+  final int numberOfLegs;
 }
 
 class Cat extends Animal {}
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 0dc7afd..df9e66f 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
@@ -4,7 +4,7 @@
 
 @self::valueClass
 class Animal extends core::Object {
-  final field core::int numLegs;
+  final field core::int numberOfLegs;
   synthetic constructor •() → self::Animal
     ;
 }
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 257657f..8ba63ea 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
@@ -2,19 +2,18 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/non_value_extends_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/non_value_extends_value_error.dart:9:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class Animal extends core::Object {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 class Cat extends self::Animal {
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 257657f..8ba63ea 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
@@ -2,19 +2,18 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/non_value_extends_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/non_value_extends_value_error.dart:9:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class Animal extends core::Object {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 class Cat extends self::Animal {
diff --git a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.textual_outline.expect b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.textual_outline.expect
index 91337d4..0394cbe 100644
--- a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.textual_outline.expect
@@ -2,7 +2,7 @@
 
 @valueClass
 class Animal {
-  final int numLegs;
+  final int numberOfLegs;
 }
 
 class Cat extends Animal {}
diff --git a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.textual_outline_modelled.expect
index 693a088..93eb8a7 100644
--- a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.textual_outline_modelled.expect
@@ -1,6 +1,6 @@
 @valueClass
 class Animal {
-  final int numLegs;
+  final int numberOfLegs;
 }
 
 class Cat extends Animal {}
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 257657f..8ba63ea 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
@@ -2,19 +2,18 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/non_value_extends_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/non_value_extends_value_error.dart:9:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class Animal extends core::Object {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 class Cat extends self::Animal {
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 257657f..8ba63ea 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
@@ -2,19 +2,18 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/non_value_extends_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/non_value_extends_value_error.dart:9:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class Animal extends core::Object {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 class Cat extends self::Animal {
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart
index ee4bd91..f86c562 100644
--- a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart
@@ -6,11 +6,11 @@
 
 @valueClass
 class Animal {
-  final int numLegs;
+  final int numberOfLegs;
 }
 
 class Cat implements Animal {
-  final int numLegs;
+  final int numberOfLegs;
 }
 
 main() {}
\ No newline at end of file
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 1b24fca..bc92132 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
@@ -4,12 +4,12 @@
 
 @self::valueClass
 class Animal extends core::Object {
-  final field core::int numLegs;
+  final field core::int numberOfLegs;
   synthetic constructor •() → self::Animal
     ;
 }
 class Cat extends core::Object implements self::Animal {
-  final field core::int numLegs;
+  final field core::int numberOfLegs;
   synthetic constructor •() → self::Cat
     ;
 }
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.expect
index a2359d2..15fac95 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
@@ -2,28 +2,27 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:9:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:13:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class Animal extends core::Object {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 class Cat extends core::Object implements self::Animal {
-  final field core::int numLegs = null;
+  final field core::int numberOfLegs = null;
   synthetic constructor •() → self::Cat
     : super core::Object::•()
     ;
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 a2359d2..15fac95 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
@@ -2,28 +2,27 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:9:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:13:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class Animal extends core::Object {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 class Cat extends core::Object implements self::Animal {
-  final field core::int numLegs = null;
+  final field core::int numberOfLegs = null;
   synthetic constructor •() → self::Cat
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.textual_outline.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.textual_outline.expect
index a28b098..21b0351 100644
--- a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.textual_outline.expect
@@ -2,11 +2,11 @@
 
 @valueClass
 class Animal {
-  final int numLegs;
+  final int numberOfLegs;
 }
 
 class Cat implements Animal {
-  final int numLegs;
+  final int numberOfLegs;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.textual_outline_modelled.expect
index 021adc2..fd4d61a 100644
--- a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.textual_outline_modelled.expect
@@ -1,10 +1,10 @@
 @valueClass
 class Animal {
-  final int numLegs;
+  final int numberOfLegs;
 }
 
 class Cat implements Animal {
-  final int numLegs;
+  final int numberOfLegs;
 }
 
 const String valueClass = "valueClass";
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.expect
index a2359d2..15fac95 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
@@ -2,28 +2,27 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:9:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:13:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class Animal extends core::Object {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 class Cat extends core::Object implements self::Animal {
-  final field core::int numLegs = null;
+  final field core::int numberOfLegs = null;
   synthetic constructor •() → self::Cat
     : super core::Object::•()
     ;
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 a2359d2..15fac95 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
@@ -2,28 +2,27 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:9:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:13:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class Animal extends core::Object {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 class Cat extends core::Object implements self::Animal {
-  final field core::int numLegs = null;
+  final field core::int numberOfLegs = null;
   synthetic constructor •() → self::Cat
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/value_class/simple.dart b/pkg/front_end/testcases/value_class/simple.dart
index e781016..c2b4107 100644
--- a/pkg/front_end/testcases/value_class/simple.dart
+++ b/pkg/front_end/testcases/value_class/simple.dart
@@ -6,13 +6,13 @@
 
 @valueClass
 class Animal {
-  final int numLegs;
+  final int numberOfLegs;
 }
 
 main() {
-  Animal firstAnimal = Animal(numLegs: 4);
-  Animal secondAnimal = Animal(numLegs: 4);
-  Animal thirdAnimal = Animal(numLegs: 3);
+  Animal firstAnimal = Animal(numberOfLegs: 4);
+  Animal secondAnimal = Animal(numberOfLegs: 4);
+  Animal thirdAnimal = Animal(numberOfLegs: 3);
 
   expect(true, firstAnimal == secondAnimal);
   expect(false, firstAnimal == thirdAnimal);
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 03509b9..14f3e52 100644
--- a/pkg/front_end/testcases/value_class/simple.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/simple.dart.outline.expect
@@ -4,7 +4,7 @@
 
 @self::valueClass
 class Animal extends core::Object {
-  final field core::int numLegs;
+  final field core::int numberOfLegs;
   synthetic constructor •() → self::Animal
     ;
 }
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 09bd934..c9eb762 100644
--- a/pkg/front_end/testcases/value_class/simple.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/simple.dart.strong.expect
@@ -2,53 +2,52 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
-//   Animal firstAnimal = Animal(numLegs: 4);
-//                               ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numberOfLegs'.
+//   Animal firstAnimal = Animal(numberOfLegs: 4);
+//                               ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
 // class Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
-//   Animal secondAnimal = Animal(numLegs: 4);
-//                                ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numberOfLegs'.
+//   Animal secondAnimal = Animal(numberOfLegs: 4);
+//                                ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
 // class Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
-//   Animal thirdAnimal = Animal(numLegs: 3);
-//                               ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numberOfLegs'.
+//   Animal thirdAnimal = Animal(numberOfLegs: 3);
+//                               ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
 // class Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/simple.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/simple.dart:9:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class Animal extends core::Object {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 static const field core::String valueClass = #C1;
 static method main() → dynamic {
-  self::Animal firstAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
-  Animal firstAnimal = Animal(numLegs: 4);
-                              ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
-  self::Animal secondAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
-  Animal secondAnimal = Animal(numLegs: 4);
-                               ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
-  self::Animal thirdAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
-  Animal thirdAnimal = Animal(numLegs: 3);
-                              ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
+  self::Animal firstAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numberOfLegs'.
+  Animal firstAnimal = Animal(numberOfLegs: 4);
+                              ^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
+  self::Animal secondAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numberOfLegs'.
+  Animal secondAnimal = Animal(numberOfLegs: 4);
+                               ^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
+  self::Animal thirdAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numberOfLegs'.
+  Animal thirdAnimal = Animal(numberOfLegs: 3);
+                              ^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
   self::expect(true, firstAnimal.{core::Object::==}(secondAnimal));
   self::expect(false, firstAnimal.{core::Object::==}(thirdAnimal));
   self::expect(true, firstAnimal.{core::Object::hashCode}.{core::num::==}(secondAnimal.{core::Object::hashCode}));
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 535162a..344eb6f 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
@@ -2,53 +2,52 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
-//   Animal firstAnimal = Animal(numLegs: 4);
-//                               ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numberOfLegs'.
+//   Animal firstAnimal = Animal(numberOfLegs: 4);
+//                               ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
 // class Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
-//   Animal secondAnimal = Animal(numLegs: 4);
-//                                ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numberOfLegs'.
+//   Animal secondAnimal = Animal(numberOfLegs: 4);
+//                                ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
 // class Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
-//   Animal thirdAnimal = Animal(numLegs: 3);
-//                               ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numberOfLegs'.
+//   Animal thirdAnimal = Animal(numberOfLegs: 3);
+//                               ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
 // class Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/simple.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/simple.dart:9:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class Animal extends core::Object {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 static const field core::String valueClass = #C1;
 static method main() → dynamic {
-  self::Animal firstAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
-  Animal firstAnimal = Animal(numLegs: 4);
-                              ^^^^^^^";
-  self::Animal secondAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
-  Animal secondAnimal = Animal(numLegs: 4);
-                               ^^^^^^^";
-  self::Animal thirdAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
-  Animal thirdAnimal = Animal(numLegs: 3);
-                              ^^^^^^^";
+  self::Animal firstAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numberOfLegs'.
+  Animal firstAnimal = Animal(numberOfLegs: 4);
+                              ^^^^^^^^^^^^";
+  self::Animal secondAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numberOfLegs'.
+  Animal secondAnimal = Animal(numberOfLegs: 4);
+                               ^^^^^^^^^^^^";
+  self::Animal thirdAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numberOfLegs'.
+  Animal thirdAnimal = Animal(numberOfLegs: 3);
+                              ^^^^^^^^^^^^";
   self::expect(true, firstAnimal.{core::Object::==}(secondAnimal));
   self::expect(false, firstAnimal.{core::Object::==}(thirdAnimal));
   self::expect(true, firstAnimal.{core::Object::hashCode}.{core::num::==}(secondAnimal.{core::Object::hashCode}));
diff --git a/pkg/front_end/testcases/value_class/simple.dart.textual_outline.expect b/pkg/front_end/testcases/value_class/simple.dart.textual_outline.expect
index 5408535..318ea62 100644
--- a/pkg/front_end/testcases/value_class/simple.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/value_class/simple.dart.textual_outline.expect
@@ -2,7 +2,7 @@
 
 @valueClass
 class Animal {
-  final int numLegs;
+  final int numberOfLegs;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/value_class/simple.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/value_class/simple.dart.textual_outline_modelled.expect
index dabb2ae..05032a9 100644
--- a/pkg/front_end/testcases/value_class/simple.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/value_class/simple.dart.textual_outline_modelled.expect
@@ -1,6 +1,6 @@
 @valueClass
 class Animal {
-  final int numLegs;
+  final int numberOfLegs;
 }
 
 const String valueClass = "valueClass";
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 09bd934..c9eb762 100644
--- a/pkg/front_end/testcases/value_class/simple.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/simple.dart.weak.expect
@@ -2,53 +2,52 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
-//   Animal firstAnimal = Animal(numLegs: 4);
-//                               ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numberOfLegs'.
+//   Animal firstAnimal = Animal(numberOfLegs: 4);
+//                               ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
 // class Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
-//   Animal secondAnimal = Animal(numLegs: 4);
-//                                ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numberOfLegs'.
+//   Animal secondAnimal = Animal(numberOfLegs: 4);
+//                                ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
 // class Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
-//   Animal thirdAnimal = Animal(numLegs: 3);
-//                               ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numberOfLegs'.
+//   Animal thirdAnimal = Animal(numberOfLegs: 3);
+//                               ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
 // class Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/simple.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/simple.dart:9:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class Animal extends core::Object {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 static const field core::String valueClass = #C1;
 static method main() → dynamic {
-  self::Animal firstAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
-  Animal firstAnimal = Animal(numLegs: 4);
-                              ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
-  self::Animal secondAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
-  Animal secondAnimal = Animal(numLegs: 4);
-                               ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
-  self::Animal thirdAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
-  Animal thirdAnimal = Animal(numLegs: 3);
-                              ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
+  self::Animal firstAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numberOfLegs'.
+  Animal firstAnimal = Animal(numberOfLegs: 4);
+                              ^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
+  self::Animal secondAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numberOfLegs'.
+  Animal secondAnimal = Animal(numberOfLegs: 4);
+                               ^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
+  self::Animal thirdAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numberOfLegs'.
+  Animal thirdAnimal = Animal(numberOfLegs: 3);
+                              ^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
   self::expect(true, firstAnimal.{core::Object::==}(secondAnimal));
   self::expect(false, firstAnimal.{core::Object::==}(thirdAnimal));
   self::expect(true, firstAnimal.{core::Object::hashCode}.{core::num::==}(secondAnimal.{core::Object::hashCode}));
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 535162a..344eb6f 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
@@ -2,53 +2,52 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
-//   Animal firstAnimal = Animal(numLegs: 4);
-//                               ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numberOfLegs'.
+//   Animal firstAnimal = Animal(numberOfLegs: 4);
+//                               ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
 // class Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
-//   Animal secondAnimal = Animal(numLegs: 4);
-//                                ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numberOfLegs'.
+//   Animal secondAnimal = Animal(numberOfLegs: 4);
+//                                ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
 // class Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
-//   Animal thirdAnimal = Animal(numLegs: 3);
-//                               ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numberOfLegs'.
+//   Animal thirdAnimal = Animal(numberOfLegs: 3);
+//                               ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
 // class Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/simple.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/simple.dart:9:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class Animal extends core::Object {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 static const field core::String valueClass = #C1;
 static method main() → dynamic {
-  self::Animal firstAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
-  Animal firstAnimal = Animal(numLegs: 4);
-                              ^^^^^^^";
-  self::Animal secondAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
-  Animal secondAnimal = Animal(numLegs: 4);
-                               ^^^^^^^";
-  self::Animal thirdAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
-  Animal thirdAnimal = Animal(numLegs: 3);
-                              ^^^^^^^";
+  self::Animal firstAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numberOfLegs'.
+  Animal firstAnimal = Animal(numberOfLegs: 4);
+                              ^^^^^^^^^^^^";
+  self::Animal secondAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numberOfLegs'.
+  Animal secondAnimal = Animal(numberOfLegs: 4);
+                               ^^^^^^^^^^^^";
+  self::Animal thirdAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numberOfLegs'.
+  Animal thirdAnimal = Animal(numberOfLegs: 3);
+                              ^^^^^^^^^^^^";
   self::expect(true, firstAnimal.{core::Object::==}(secondAnimal));
   self::expect(false, firstAnimal.{core::Object::==}(thirdAnimal));
   self::expect(true, firstAnimal.{core::Object::hashCode}.{core::num::==}(secondAnimal.{core::Object::hashCode}));
diff --git a/pkg/front_end/testcases/value_class/super_type.dart b/pkg/front_end/testcases/value_class/super_type.dart
index 4182161..10dad24 100644
--- a/pkg/front_end/testcases/value_class/super_type.dart
+++ b/pkg/front_end/testcases/value_class/super_type.dart
@@ -6,19 +6,19 @@
 
 @valueClass
 class Animal {
-  final int numLegs;
+  final int numberOfLegs;
 }
 
 @valueClass
 class Cat implements Animal {
-  final int numLegs;
-  final int numWhiskers;
+  final int numberOfLegs;
+  final int numberOfWhiskers;
 }
 
 main() {
-  Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
-  Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
-  Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
+  Cat firstCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+  Cat secondCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+  Cat thirdCat = Cat(numberOfLegs: 4, numberOfWhiskers: 0);
 
   expect(true, firstCat == secondCat);
   expect(false, firstCat == thirdCat);
diff --git a/pkg/front_end/testcases/value_class/super_type.dart.outline.expect b/pkg/front_end/testcases/value_class/super_type.dart.outline.expect
index 1f378c2..5256842 100644
--- a/pkg/front_end/testcases/value_class/super_type.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/super_type.dart.outline.expect
@@ -4,14 +4,14 @@
 
 @self::valueClass
 class Animal extends core::Object {
-  final field core::int numLegs;
+  final field core::int numberOfLegs;
   synthetic constructor •() → self::Animal
     ;
 }
 @self::valueClass
 class Cat extends core::Object implements self::Animal {
-  final field core::int numLegs;
-  final field core::int numWhiskers;
+  final field core::int numberOfLegs;
+  final field core::int numberOfWhiskers;
   synthetic constructor •() → self::Cat
     ;
 }
diff --git a/pkg/front_end/testcases/value_class/super_type.dart.strong.expect b/pkg/front_end/testcases/value_class/super_type.dart.strong.expect
index ed5ed73..63760688 100644
--- a/pkg/front_end/testcases/value_class/super_type.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/super_type.dart.strong.expect
@@ -2,71 +2,69 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
-//   Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
-//                      ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numberOfLegs'.
+//   Cat firstCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+//                      ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
 // class Cat implements Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
-//   Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
-//                       ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numberOfLegs'.
+//   Cat secondCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+//                       ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
 // class Cat implements Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
-//   Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
-//                      ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numberOfLegs'.
+//   Cat thirdCat = Cat(numberOfLegs: 4, numberOfWhiskers: 0);
+//                      ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
 // class Cat implements Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/super_type.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/super_type.dart:9:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/value_class/super_type.dart:14:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/super_type.dart:14:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/value_class/super_type.dart:15:13: Error: Final field 'numWhiskers' is not initialized.
+// pkg/front_end/testcases/value_class/super_type.dart:15:13: Error: Final field 'numberOfWhiskers' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numWhiskers;
-//             ^^^^^^^^^^^
+//   final int numberOfWhiskers;
+//             ^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class Animal extends core::Object {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
-@#C1
 class Cat extends core::Object implements self::Animal {
-  final field core::int numLegs = null;
-  final field core::int numWhiskers = null;
-  synthetic constructor •() → self::Cat
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  final field core::int numberOfWhiskers = null;
+  synthetic constructor •({required core::int numberOfLegs, required core::int numberOfWhiskers}) → self::Cat
+    : self::Cat::numberOfLegs = numberOfLegs, self::Cat::numberOfWhiskers = numberOfWhiskers, super core::Object::•()
     ;
 }
 static const field core::String valueClass = #C1;
 static method main() → dynamic {
-  self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
-  Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
-                     ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
-  self::Cat secondCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
-  Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
-                      ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
-  self::Cat thirdCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
-  Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
-                     ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
+  self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numberOfLegs'.
+  Cat firstCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+                     ^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
+  self::Cat secondCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numberOfLegs'.
+  Cat secondCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+                      ^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
+  self::Cat thirdCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numberOfLegs'.
+  Cat thirdCat = Cat(numberOfLegs: 4, numberOfWhiskers: 0);
+                     ^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
   self::expect(true, firstCat.{core::Object::==}(secondCat));
   self::expect(false, firstCat.{core::Object::==}(thirdCat));
   self::expect(true, firstCat.{core::Object::hashCode}.{core::num::==}(secondCat.{core::Object::hashCode}));
diff --git a/pkg/front_end/testcases/value_class/super_type.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/super_type.dart.strong.transformed.expect
index b21e4ae..fdbcb96 100644
--- a/pkg/front_end/testcases/value_class/super_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/super_type.dart.strong.transformed.expect
@@ -2,71 +2,69 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
-//   Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
-//                      ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numberOfLegs'.
+//   Cat firstCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+//                      ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
 // class Cat implements Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
-//   Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
-//                       ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numberOfLegs'.
+//   Cat secondCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+//                       ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
 // class Cat implements Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
-//   Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
-//                      ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numberOfLegs'.
+//   Cat thirdCat = Cat(numberOfLegs: 4, numberOfWhiskers: 0);
+//                      ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
 // class Cat implements Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/super_type.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/super_type.dart:9:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/value_class/super_type.dart:14:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/super_type.dart:14:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/value_class/super_type.dart:15:13: Error: Final field 'numWhiskers' is not initialized.
+// pkg/front_end/testcases/value_class/super_type.dart:15:13: Error: Final field 'numberOfWhiskers' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numWhiskers;
-//             ^^^^^^^^^^^
+//   final int numberOfWhiskers;
+//             ^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class Animal extends core::Object {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
-@#C1
 class Cat extends core::Object implements self::Animal {
-  final field core::int numLegs = null;
-  final field core::int numWhiskers = null;
-  synthetic constructor •() → self::Cat
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  final field core::int numberOfWhiskers = null;
+  synthetic constructor •({required core::int numberOfLegs, required core::int numberOfWhiskers}) → self::Cat
+    : self::Cat::numberOfLegs = numberOfLegs, self::Cat::numberOfWhiskers = numberOfWhiskers, super core::Object::•()
     ;
 }
 static const field core::String valueClass = #C1;
 static method main() → dynamic {
-  self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
-  Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
-                     ^^^^^^^";
-  self::Cat secondCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
-  Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
-                      ^^^^^^^";
-  self::Cat thirdCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
-  Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
-                     ^^^^^^^";
+  self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numberOfLegs'.
+  Cat firstCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+                     ^^^^^^^^^^^^";
+  self::Cat secondCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numberOfLegs'.
+  Cat secondCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+                      ^^^^^^^^^^^^";
+  self::Cat thirdCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numberOfLegs'.
+  Cat thirdCat = Cat(numberOfLegs: 4, numberOfWhiskers: 0);
+                     ^^^^^^^^^^^^";
   self::expect(true, firstCat.{core::Object::==}(secondCat));
   self::expect(false, firstCat.{core::Object::==}(thirdCat));
   self::expect(true, firstCat.{core::Object::hashCode}.{core::num::==}(secondCat.{core::Object::hashCode}));
diff --git a/pkg/front_end/testcases/value_class/super_type.dart.textual_outline.expect b/pkg/front_end/testcases/value_class/super_type.dart.textual_outline.expect
index 08894f3..027fa5d 100644
--- a/pkg/front_end/testcases/value_class/super_type.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/value_class/super_type.dart.textual_outline.expect
@@ -2,13 +2,13 @@
 
 @valueClass
 class Animal {
-  final int numLegs;
+  final int numberOfLegs;
 }
 
 @valueClass
 class Cat implements Animal {
-  final int numLegs;
-  final int numWhiskers;
+  final int numberOfLegs;
+  final int numberOfWhiskers;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/value_class/super_type.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/value_class/super_type.dart.textual_outline_modelled.expect
index 33c1c4f..7b66670 100644
--- a/pkg/front_end/testcases/value_class/super_type.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/value_class/super_type.dart.textual_outline_modelled.expect
@@ -1,12 +1,12 @@
 @valueClass
 class Animal {
-  final int numLegs;
+  final int numberOfLegs;
 }
 
 @valueClass
 class Cat implements Animal {
-  final int numLegs;
-  final int numWhiskers;
+  final int numberOfLegs;
+  final int numberOfWhiskers;
 }
 
 const String valueClass = "valueClass";
diff --git a/pkg/front_end/testcases/value_class/super_type.dart.weak.expect b/pkg/front_end/testcases/value_class/super_type.dart.weak.expect
index ed5ed73..63760688 100644
--- a/pkg/front_end/testcases/value_class/super_type.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/super_type.dart.weak.expect
@@ -2,71 +2,69 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
-//   Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
-//                      ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numberOfLegs'.
+//   Cat firstCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+//                      ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
 // class Cat implements Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
-//   Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
-//                       ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numberOfLegs'.
+//   Cat secondCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+//                       ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
 // class Cat implements Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
-//   Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
-//                      ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numberOfLegs'.
+//   Cat thirdCat = Cat(numberOfLegs: 4, numberOfWhiskers: 0);
+//                      ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
 // class Cat implements Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/super_type.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/super_type.dart:9:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/value_class/super_type.dart:14:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/super_type.dart:14:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/value_class/super_type.dart:15:13: Error: Final field 'numWhiskers' is not initialized.
+// pkg/front_end/testcases/value_class/super_type.dart:15:13: Error: Final field 'numberOfWhiskers' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numWhiskers;
-//             ^^^^^^^^^^^
+//   final int numberOfWhiskers;
+//             ^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class Animal extends core::Object {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
-@#C1
 class Cat extends core::Object implements self::Animal {
-  final field core::int numLegs = null;
-  final field core::int numWhiskers = null;
-  synthetic constructor •() → self::Cat
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  final field core::int numberOfWhiskers = null;
+  synthetic constructor •({required core::int numberOfLegs, required core::int numberOfWhiskers}) → self::Cat
+    : self::Cat::numberOfLegs = numberOfLegs, self::Cat::numberOfWhiskers = numberOfWhiskers, super core::Object::•()
     ;
 }
 static const field core::String valueClass = #C1;
 static method main() → dynamic {
-  self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
-  Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
-                     ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
-  self::Cat secondCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
-  Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
-                      ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
-  self::Cat thirdCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
-  Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
-                     ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
+  self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numberOfLegs'.
+  Cat firstCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+                     ^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
+  self::Cat secondCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numberOfLegs'.
+  Cat secondCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+                      ^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
+  self::Cat thirdCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numberOfLegs'.
+  Cat thirdCat = Cat(numberOfLegs: 4, numberOfWhiskers: 0);
+                     ^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
   self::expect(true, firstCat.{core::Object::==}(secondCat));
   self::expect(false, firstCat.{core::Object::==}(thirdCat));
   self::expect(true, firstCat.{core::Object::hashCode}.{core::num::==}(secondCat.{core::Object::hashCode}));
diff --git a/pkg/front_end/testcases/value_class/super_type.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/super_type.dart.weak.transformed.expect
index b21e4ae..fdbcb96 100644
--- a/pkg/front_end/testcases/value_class/super_type.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/super_type.dart.weak.transformed.expect
@@ -2,71 +2,69 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
-//   Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
-//                      ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numberOfLegs'.
+//   Cat firstCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+//                      ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
 // class Cat implements Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
-//   Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
-//                       ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numberOfLegs'.
+//   Cat secondCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+//                       ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
 // class Cat implements Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
-//   Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
-//                      ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numberOfLegs'.
+//   Cat thirdCat = Cat(numberOfLegs: 4, numberOfWhiskers: 0);
+//                      ^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
 // class Cat implements Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/super_type.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/super_type.dart:9:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/value_class/super_type.dart:14:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/super_type.dart:14:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/value_class/super_type.dart:15:13: Error: Final field 'numWhiskers' is not initialized.
+// pkg/front_end/testcases/value_class/super_type.dart:15:13: Error: Final field 'numberOfWhiskers' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numWhiskers;
-//             ^^^^^^^^^^^
+//   final int numberOfWhiskers;
+//             ^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class Animal extends core::Object {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
-@#C1
 class Cat extends core::Object implements self::Animal {
-  final field core::int numLegs = null;
-  final field core::int numWhiskers = null;
-  synthetic constructor •() → self::Cat
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  final field core::int numberOfWhiskers = null;
+  synthetic constructor •({required core::int numberOfLegs, required core::int numberOfWhiskers}) → self::Cat
+    : self::Cat::numberOfLegs = numberOfLegs, self::Cat::numberOfWhiskers = numberOfWhiskers, super core::Object::•()
     ;
 }
 static const field core::String valueClass = #C1;
 static method main() → dynamic {
-  self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
-  Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
-                     ^^^^^^^";
-  self::Cat secondCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
-  Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
-                      ^^^^^^^";
-  self::Cat thirdCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
-  Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
-                     ^^^^^^^";
+  self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numberOfLegs'.
+  Cat firstCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+                     ^^^^^^^^^^^^";
+  self::Cat secondCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numberOfLegs'.
+  Cat secondCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+                      ^^^^^^^^^^^^";
+  self::Cat thirdCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numberOfLegs'.
+  Cat thirdCat = Cat(numberOfLegs: 4, numberOfWhiskers: 0);
+                     ^^^^^^^^^^^^";
   self::expect(true, firstCat.{core::Object::==}(secondCat));
   self::expect(false, firstCat.{core::Object::==}(thirdCat));
   self::expect(true, firstCat.{core::Object::hashCode}.{core::num::==}(secondCat.{core::Object::hashCode}));
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart b/pkg/front_end/testcases/value_class/value_extends_non_value.dart
index 96bbf65..141c492 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value.dart
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart
@@ -5,10 +5,13 @@
 const String valueClass = "valueClass";
 
 class Animal {
-  final int numLegs;
+  final int numberOfLegs;
+  Animal({required this.numberOfLegs});
 }
 
 @valueClass
-class Cat extends Animal {}
+class Cat extends Animal {
+  final int numberOfWhiskers;
+}
 
 main() {}
\ No newline at end of file
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 c0cd3b6..f21b790e 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
@@ -3,12 +3,13 @@
 import "dart:core" as core;
 
 class Animal extends core::Object {
-  final field core::int numLegs;
-  synthetic constructor •() → self::Animal
+  final field core::int numberOfLegs;
+  constructor •({required core::int numberOfLegs}) → self::Animal
     ;
 }
 @self::valueClass
 class Cat extends self::Animal {
+  final field core::int numberOfWhiskers;
   synthetic constructor •() → self::Cat
     ;
 }
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 a196b35..bb987c0 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
@@ -2,29 +2,30 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/value_extends_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/value_extends_non_value.dart:14:13: Error: Final field 'numberOfWhiskers' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfWhiskers;
+//             ^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
 class Animal extends core::Object {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  final field core::int numberOfLegs;
+  constructor •({required core::int numberOfLegs = #C1}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
-@#C1
 class Cat extends self::Animal {
-  synthetic constructor •() → self::Cat
-    : super self::Animal::•()
+  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)
     ;
 }
-static const field core::String valueClass = #C1;
+static const field core::String valueClass = #C2;
 static method main() → dynamic {}
 
 constants  {
-  #C1 = "valueClass"
+  #C1 = null
+  #C2 = "valueClass"
 }
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.transformed.expect
index a196b35..bb987c0 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
@@ -2,29 +2,30 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/value_extends_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/value_extends_non_value.dart:14:13: Error: Final field 'numberOfWhiskers' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfWhiskers;
+//             ^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
 class Animal extends core::Object {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  final field core::int numberOfLegs;
+  constructor •({required core::int numberOfLegs = #C1}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
-@#C1
 class Cat extends self::Animal {
-  synthetic constructor •() → self::Cat
-    : super self::Animal::•()
+  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)
     ;
 }
-static const field core::String valueClass = #C1;
+static const field core::String valueClass = #C2;
 static method main() → dynamic {}
 
 constants  {
-  #C1 = "valueClass"
+  #C1 = null
+  #C2 = "valueClass"
 }
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.textual_outline.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.textual_outline.expect
index ec2d5db..2f604a3 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.textual_outline.expect
@@ -1,10 +1,13 @@
 const String valueClass = "valueClass";
 
 class Animal {
-  final int numLegs;
+  final int numberOfLegs;
+  Animal({required this.numberOfLegs});
 }
 
 @valueClass
-class Cat extends Animal {}
+class Cat extends Animal {
+  final int numberOfWhiskers;
+}
 
 main() {}
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.textual_outline_modelled.expect
index e50bc0f..777086a 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.textual_outline_modelled.expect
@@ -1,9 +1,12 @@
 class Animal {
-  final int numLegs;
+  Animal({required this.numberOfLegs});
+  final int numberOfLegs;
 }
 
 @valueClass
-class Cat extends Animal {}
+class Cat extends Animal {
+  final int numberOfWhiskers;
+}
 
 const String valueClass = "valueClass";
 main() {}
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 a196b35..bb987c0 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
@@ -2,29 +2,30 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/value_extends_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/value_extends_non_value.dart:14:13: Error: Final field 'numberOfWhiskers' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfWhiskers;
+//             ^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
 class Animal extends core::Object {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  final field core::int numberOfLegs;
+  constructor •({required core::int numberOfLegs = #C1}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
-@#C1
 class Cat extends self::Animal {
-  synthetic constructor •() → self::Cat
-    : super self::Animal::•()
+  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)
     ;
 }
-static const field core::String valueClass = #C1;
+static const field core::String valueClass = #C2;
 static method main() → dynamic {}
 
 constants  {
-  #C1 = "valueClass"
+  #C1 = null
+  #C2 = "valueClass"
 }
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.transformed.expect
index a196b35..bb987c0 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
@@ -2,29 +2,30 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/value_extends_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/value_extends_non_value.dart:14:13: Error: Final field 'numberOfWhiskers' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfWhiskers;
+//             ^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
 class Animal extends core::Object {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
+  final field core::int numberOfLegs;
+  constructor •({required core::int numberOfLegs = #C1}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
-@#C1
 class Cat extends self::Animal {
-  synthetic constructor •() → self::Cat
-    : super self::Animal::•()
+  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)
     ;
 }
-static const field core::String valueClass = #C1;
+static const field core::String valueClass = #C2;
 static method main() → dynamic {}
 
 constants  {
-  #C1 = "valueClass"
+  #C1 = null
+  #C2 = "valueClass"
 }
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart
index bb077de..2f58313 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart
@@ -5,7 +5,7 @@
 const String valueClass = "valueClass";
 
 class Animal {
-  int numLegs;
+  int numberOfLegs;
 }
 
 @valueClass
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 7d29b32..05499cb 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Animal extends core::Object {
-  field core::int numLegs;
+  field core::int numberOfLegs;
   synthetic constructor •() → self::Animal
     ;
 }
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 e0188c9..9c469b8 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
@@ -2,20 +2,19 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/value_extends_non_value_error.dart:8:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
-//   int numLegs;
-//       ^^^^^^^
+// pkg/front_end/testcases/value_class/value_extends_non_value_error.dart:8:7: Error: Field 'numberOfLegs' should be initialized because its type 'int' doesn't allow null.
+//   int numberOfLegs;
+//       ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
 class Animal extends core::Object {
-  field core::int numLegs = null;
+  field core::int numberOfLegs = null;
   synthetic constructor •() → self::Animal
     : super core::Object::•()
     ;
 }
-@#C1
 class Cat extends self::Animal {
   synthetic constructor •() → self::Cat
     : super self::Animal::•()
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 e0188c9..9c469b8 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
@@ -2,20 +2,19 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/value_extends_non_value_error.dart:8:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
-//   int numLegs;
-//       ^^^^^^^
+// pkg/front_end/testcases/value_class/value_extends_non_value_error.dart:8:7: Error: Field 'numberOfLegs' should be initialized because its type 'int' doesn't allow null.
+//   int numberOfLegs;
+//       ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
 class Animal extends core::Object {
-  field core::int numLegs = null;
+  field core::int numberOfLegs = null;
   synthetic constructor •() → self::Animal
     : super core::Object::•()
     ;
 }
-@#C1
 class Cat extends self::Animal {
   synthetic constructor •() → self::Cat
     : super self::Animal::•()
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.textual_outline.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.textual_outline.expect
index 5d5b409..a670dab 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.textual_outline.expect
@@ -1,7 +1,7 @@
 const String valueClass = "valueClass";
 
 class Animal {
-  int numLegs;
+  int numberOfLegs;
 }
 
 @valueClass
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.textual_outline_modelled.expect
index d7e499c..d4c74c2 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.textual_outline_modelled.expect
@@ -1,5 +1,5 @@
 class Animal {
-  int numLegs;
+  int numberOfLegs;
 }
 
 @valueClass
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 e0188c9..9c469b8 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
@@ -2,20 +2,19 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/value_extends_non_value_error.dart:8:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
-//   int numLegs;
-//       ^^^^^^^
+// pkg/front_end/testcases/value_class/value_extends_non_value_error.dart:8:7: Error: Field 'numberOfLegs' should be initialized because its type 'int' doesn't allow null.
+//   int numberOfLegs;
+//       ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
 class Animal extends core::Object {
-  field core::int numLegs = null;
+  field core::int numberOfLegs = null;
   synthetic constructor •() → self::Animal
     : super core::Object::•()
     ;
 }
-@#C1
 class Cat extends self::Animal {
   synthetic constructor •() → self::Cat
     : super self::Animal::•()
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 e0188c9..9c469b8 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
@@ -2,20 +2,19 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/value_extends_non_value_error.dart:8:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
-//   int numLegs;
-//       ^^^^^^^
+// pkg/front_end/testcases/value_class/value_extends_non_value_error.dart:8:7: Error: Field 'numberOfLegs' should be initialized because its type 'int' doesn't allow null.
+//   int numberOfLegs;
+//       ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
 class Animal extends core::Object {
-  field core::int numLegs = null;
+  field core::int numberOfLegs = null;
   synthetic constructor •() → self::Animal
     : super core::Object::•()
     ;
 }
-@#C1
 class Cat extends self::Animal {
   synthetic constructor •() → self::Cat
     : super self::Animal::•()
diff --git a/pkg/front_end/testcases/value_class/value_implements_non_value.dart b/pkg/front_end/testcases/value_class/value_implements_non_value.dart
index cf2c4b0..e75c70d 100644
--- a/pkg/front_end/testcases/value_class/value_implements_non_value.dart
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart
@@ -5,12 +5,12 @@
 const String valueClass = "valueClass";
 
 class Animal {
-  final int numLegs;
+  final int numberOfLegs;
 }
 
 @valueClass
 class Cat implements Animal {
-  final int numLegs;
+  final int numberOfLegs;
 }
 
 main() {}
\ No newline at end of file
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 e4fba11..ed5f98c 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
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class Animal extends core::Object {
-  final field core::int numLegs;
+  final field core::int numberOfLegs;
   synthetic constructor •() → self::Animal
     ;
 }
 @self::valueClass
 class Cat extends core::Object implements self::Animal {
-  final field core::int numLegs;
+  final field core::int numberOfLegs;
   synthetic constructor •() → self::Cat
     ;
 }
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 549053c..9b0e0a3 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
@@ -2,30 +2,29 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/value_implements_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:8:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/value_class/value_implements_non_value.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:13:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
 class Animal extends core::Object {
-  final field core::int numLegs = null;
+  final field core::int numberOfLegs = null;
   synthetic constructor •() → self::Animal
     : super core::Object::•()
     ;
 }
-@#C1
 class Cat extends core::Object implements self::Animal {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Cat
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Cat
+    : self::Cat::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 static const field core::String valueClass = #C1;
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 549053c..9b0e0a3 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
@@ -2,30 +2,29 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/value_implements_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:8:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/value_class/value_implements_non_value.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:13:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
 class Animal extends core::Object {
-  final field core::int numLegs = null;
+  final field core::int numberOfLegs = null;
   synthetic constructor •() → self::Animal
     : super core::Object::•()
     ;
 }
-@#C1
 class Cat extends core::Object implements self::Animal {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Cat
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Cat
+    : self::Cat::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 static const field core::String valueClass = #C1;
diff --git a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.textual_outline.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.textual_outline.expect
index c0ada4f..193bb7e 100644
--- a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.textual_outline.expect
@@ -1,12 +1,12 @@
 const String valueClass = "valueClass";
 
 class Animal {
-  final int numLegs;
+  final int numberOfLegs;
 }
 
 @valueClass
 class Cat implements Animal {
-  final int numLegs;
+  final int numberOfLegs;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.textual_outline_modelled.expect
index 650aa4b..c6763aa 100644
--- a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.textual_outline_modelled.expect
@@ -1,10 +1,10 @@
 class Animal {
-  final int numLegs;
+  final int numberOfLegs;
 }
 
 @valueClass
 class Cat implements Animal {
-  final int numLegs;
+  final int numberOfLegs;
 }
 
 const String valueClass = "valueClass";
diff --git a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.expect
index 549053c..9b0e0a3 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
@@ -2,30 +2,29 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/value_implements_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:8:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/value_class/value_implements_non_value.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:13:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
 class Animal extends core::Object {
-  final field core::int numLegs = null;
+  final field core::int numberOfLegs = null;
   synthetic constructor •() → self::Animal
     : super core::Object::•()
     ;
 }
-@#C1
 class Cat extends core::Object implements self::Animal {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Cat
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Cat
+    : self::Cat::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 static const field core::String valueClass = #C1;
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 549053c..9b0e0a3 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
@@ -2,30 +2,29 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/value_implements_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:8:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/value_class/value_implements_non_value.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:13:13: Error: Final field 'numberOfLegs' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numLegs;
-//             ^^^^^^^
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
 
 class Animal extends core::Object {
-  final field core::int numLegs = null;
+  final field core::int numberOfLegs = null;
   synthetic constructor •() → self::Animal
     : super core::Object::•()
     ;
 }
-@#C1
 class Cat extends core::Object implements self::Animal {
-  final field core::int numLegs = null;
-  synthetic constructor •() → self::Cat
-    : super core::Object::•()
+  final field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Cat
+    : self::Cat::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 static const field core::String valueClass = #C1;
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart b/pkg/front_end/testcases/value_class/value_mixin_error.dart
index 22c8a1f..3cf32a7 100644
--- a/pkg/front_end/testcases/value_class/value_mixin_error.dart
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart
@@ -10,6 +10,6 @@
 class B {}
 
 class C extends B with A {} // error, value class as mixin
-class C extends A with B {} // error, C extends a value class
+class D extends A with B {} // error, D extends a value class
 
 main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.outline.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.outline.expect
index a5b1239..4ccaf3a 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
@@ -1,14 +1,4 @@
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/value_class/value_mixin_error.dart:13:7: Error: 'C' is already declared in this scope.
-// class C extends A with B {} // error, C extends a value class
-//       ^
-// pkg/front_end/testcases/value_class/value_mixin_error.dart:12:7: Context: Previous declaration of 'C'.
-// class C extends B with A {} // error, value class as mixin
-//       ^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -26,19 +16,19 @@
     : super self::B::•()
     ;
 }
-class C#1 extends self::_C&A&B {
-  synthetic constructor •() → self::C#1
-    ;
-}
 class C extends self::_C&B&A {
   synthetic constructor •() → self::C
     ;
 }
-abstract class _C&A&B = self::A with self::B /*isAnonymousMixin*/  {
-  synthetic constructor •() → self::_C&A&B
+abstract class _D&A&B = self::A with self::B /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_D&A&B
     : super self::A::•()
     ;
 }
+class D extends self::_D&A&B {
+  synthetic constructor •() → self::D
+    ;
+}
 static const field core::String valueClass = "valueClass";
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.expect
index 46047b4..cc2aea2 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
@@ -1,18 +1,7 @@
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/value_class/value_mixin_error.dart:13:7: Error: 'C' is already declared in this scope.
-// class C extends A with B {} // error, C extends a value class
-//       ^
-// pkg/front_end/testcases/value_class/value_mixin_error.dart:12:7: Context: Previous declaration of 'C'.
-// class C extends B with A {} // error, value class as mixin
-//       ^
-//
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class A extends core::Object {
   synthetic constructor •() → self::A
     : super core::Object::•()
@@ -28,21 +17,21 @@
     : super self::B::•()
     ;
 }
-class C#1 extends self::_C&A&B {
-  synthetic constructor •() → self::C#1
-    : super self::_C&A&B::•()
-    ;
-}
 class C extends self::_C&B&A {
   synthetic constructor •() → self::C
     : super self::_C&B&A::•()
     ;
 }
-abstract class _C&A&B = self::A with self::B /*isAnonymousMixin*/  {
-  synthetic constructor •() → self::_C&A&B
+abstract class _D&A&B = self::A with self::B /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_D&A&B
     : super self::A::•()
     ;
 }
+class D extends self::_D&A&B {
+  synthetic constructor •() → self::D
+    : super self::_D&A&B::•()
+    ;
+}
 static const field core::String valueClass = #C1;
 static method main() → dynamic {}
 
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 0a9c8b9..5382fce 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
@@ -1,18 +1,7 @@
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/value_class/value_mixin_error.dart:13:7: Error: 'C' is already declared in this scope.
-// class C extends A with B {} // error, C extends a value class
-//       ^
-// pkg/front_end/testcases/value_class/value_mixin_error.dart:12:7: Context: Previous declaration of 'C'.
-// class C extends B with A {} // error, value class as mixin
-//       ^
-//
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class A extends core::Object {
   synthetic constructor •() → self::A
     : super core::Object::•()
@@ -28,21 +17,21 @@
     : super self::B::•()
     ;
 }
-class C#1 extends self::_C&A&B {
-  synthetic constructor •() → self::C#1
-    : super self::_C&A&B::•()
-    ;
-}
 class C extends self::_C&B&A {
   synthetic constructor •() → self::C
     : super self::_C&B&A::•()
     ;
 }
-abstract class _C&A&B extends self::A implements self::B /*isAnonymousMixin,isEliminatedMixin*/  {
-  synthetic constructor •() → self::_C&A&B
+abstract class _D&A&B extends self::A implements self::B /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_D&A&B
     : super self::A::•()
     ;
 }
+class D extends self::_D&A&B {
+  synthetic constructor •() → self::D
+    : super self::_D&A&B::•()
+    ;
+}
 static const field core::String valueClass = #C1;
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.textual_outline.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.textual_outline.expect
index c195f72..811ccf9 100644
--- a/pkg/front_end/testcases/value_class/value_mixin_error.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart.textual_outline.expect
@@ -7,6 +7,6 @@
 
 class C extends B with A {}
 
-class C extends A with B {}
+class D extends A with B {}
 
 main() {}
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.textual_outline_modelled.expect
index 17460dc..f9ac261 100644
--- a/pkg/front_end/testcases/value_class/value_mixin_error.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart.textual_outline_modelled.expect
@@ -3,9 +3,9 @@
 
 class B {}
 
-class C extends A with B {}
-
 class C extends B with A {}
 
+class D extends A with B {}
+
 const String valueClass = "valueClass";
 main() {}
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 46047b4..cc2aea2 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
@@ -1,18 +1,7 @@
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/value_class/value_mixin_error.dart:13:7: Error: 'C' is already declared in this scope.
-// class C extends A with B {} // error, C extends a value class
-//       ^
-// pkg/front_end/testcases/value_class/value_mixin_error.dart:12:7: Context: Previous declaration of 'C'.
-// class C extends B with A {} // error, value class as mixin
-//       ^
-//
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class A extends core::Object {
   synthetic constructor •() → self::A
     : super core::Object::•()
@@ -28,21 +17,21 @@
     : super self::B::•()
     ;
 }
-class C#1 extends self::_C&A&B {
-  synthetic constructor •() → self::C#1
-    : super self::_C&A&B::•()
-    ;
-}
 class C extends self::_C&B&A {
   synthetic constructor •() → self::C
     : super self::_C&B&A::•()
     ;
 }
-abstract class _C&A&B = self::A with self::B /*isAnonymousMixin*/  {
-  synthetic constructor •() → self::_C&A&B
+abstract class _D&A&B = self::A with self::B /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_D&A&B
     : super self::A::•()
     ;
 }
+class D extends self::_D&A&B {
+  synthetic constructor •() → self::D
+    : super self::_D&A&B::•()
+    ;
+}
 static const field core::String valueClass = #C1;
 static method main() → dynamic {}
 
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 0a9c8b9..5382fce 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
@@ -1,18 +1,7 @@
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/value_class/value_mixin_error.dart:13:7: Error: 'C' is already declared in this scope.
-// class C extends A with B {} // error, C extends a value class
-//       ^
-// pkg/front_end/testcases/value_class/value_mixin_error.dart:12:7: Context: Previous declaration of 'C'.
-// class C extends B with A {} // error, value class as mixin
-//       ^
-//
 import self as self;
 import "dart:core" as core;
 
-@#C1
 class A extends core::Object {
   synthetic constructor •() → self::A
     : super core::Object::•()
@@ -28,21 +17,21 @@
     : super self::B::•()
     ;
 }
-class C#1 extends self::_C&A&B {
-  synthetic constructor •() → self::C#1
-    : super self::_C&A&B::•()
-    ;
-}
 class C extends self::_C&B&A {
   synthetic constructor •() → self::C
     : super self::_C&B&A::•()
     ;
 }
-abstract class _C&A&B extends self::A implements self::B /*isAnonymousMixin,isEliminatedMixin*/  {
-  synthetic constructor •() → self::_C&A&B
+abstract class _D&A&B extends self::A implements self::B /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_D&A&B
     : super self::A::•()
     ;
 }
+class D extends self::_D&A&B {
+  synthetic constructor •() → self::D
+    : super self::_D&A&B::•()
+    ;
+}
 static const field core::String valueClass = #C1;
 static method main() → dynamic {}
 
diff --git a/pkg/kernel/lib/transformations/value_class.dart b/pkg/kernel/lib/transformations/value_class.dart
index cc0577e..4b3acb0 100644
--- a/pkg/kernel/lib/transformations/value_class.dart
+++ b/pkg/kernel/lib/transformations/value_class.dart
@@ -6,11 +6,186 @@
 
 import '../ast.dart';
 import '../kernel.dart';
-import '../visitor.dart';
+import '../core_types.dart' show CoreTypes;
 
-Component transformComponent(Component component) {
-  new ValueClassTransformer().visitComponent(component);
-  return component;
+void transformComponent(Component node, CoreTypes coreTypes) {
+  for (Library library in node.libraries) {
+    for (Class cls in library.classes) {
+      if (isValueClass(cls)) {
+        transformValueClass(cls, coreTypes);
+      }
+    }
+  }
 }
 
-class ValueClassTransformer extends Transformer {}
+void transformValueClass(Class cls, CoreTypes coreTypes) {
+  addConstructor(cls, coreTypes);
+  // addEqualsOperator(cls, coreTypes);
+  // addHashCode(cls, coreTypes);
+  // addCopyWith(cls);
+}
+
+void addConstructor(Class cls, CoreTypes coreTypes) {
+  Constructor superConstructor = null;
+  for (Constructor constructor in cls.superclass.constructors) {
+    if (constructor.name.name == "") {
+      superConstructor = constructor;
+    }
+  }
+  Constructor syntheticConstructor = null;
+  for (Constructor constructor in cls.constructors) {
+    if (constructor.isSynthetic) {
+      syntheticConstructor = constructor;
+    }
+  }
+
+  List<VariableDeclaration> superParameters = superConstructor
+      .function.namedParameters
+      .map<VariableDeclaration>((e) => VariableDeclaration(e.name, type: e.type)
+        ..parent = syntheticConstructor.function)
+      .toList();
+  Map<String, VariableDeclaration> ownFields = Map.fromIterable(cls.fields,
+      key: (f) => f.name.name,
+      value: (f) =>
+          VariableDeclaration(f.name.name, type: f.type, isRequired: true)
+            ..parent = syntheticConstructor.function);
+
+  List<Initializer> initializersConstructor = cls.fields
+      .map<Initializer>((f) =>
+          FieldInitializer(f, VariableGet(ownFields[f.name.name]))
+            ..parent = syntheticConstructor)
+      .toList();
+
+  initializersConstructor.add(SuperInitializer(superConstructor,
+      Arguments(superParameters.map((f) => VariableGet(f)).toList()))
+    ..parent = syntheticConstructor);
+
+  syntheticConstructor.function.namedParameters
+    ..clear()
+    ..addAll(ownFields.values)
+    ..addAll(superParameters);
+  syntheticConstructor.initializers = initializersConstructor;
+
+  int valueClassAnnotationIndex;
+  for (int annotationIndex = 0;
+      annotationIndex < cls.annotations.length;
+      annotationIndex++) {
+    Expression annotation = cls.annotations[annotationIndex];
+    if (annotation is ConstantExpression &&
+        annotation.constant is StringConstant) {
+      StringConstant constant = annotation.constant;
+      if (constant.value == 'valueClass') {
+        valueClassAnnotationIndex = annotationIndex;
+      }
+    }
+  }
+  cls.annotations.removeAt(valueClassAnnotationIndex);
+}
+/*
+
+void addEqualsOperator(Class cls, CoreTypes coreTypes) {
+  Map<String, VariableDeclaration> environment = Map.fromIterable(cls.fields,
+      key: (f) => f.name.name,
+      value: (f) => VariableDeclaration(f.name.name, type: f.type));
+
+  VariableDeclaration other = VariableDeclaration("other");
+
+  var retType = cls.enclosingLibrary.isNonNullableByDefault
+      ? coreTypes.boolNonNullableRawType
+      : coreTypes.boolLegacyRawType;
+  var myType = coreTypes.thisInterfaceType(cls, Nullability.nonNullable);
+
+  cls.addMember(Procedure(
+      Name("=="),
+      ProcedureKind.Operator,
+      FunctionNode(
+          ReturnStatement(ConditionalExpression(
+              IsExpression(VariableGet(other), myType),
+              cls.fields
+                  .map((f) => MethodInvocation(
+                      PropertyGet(ThisExpression(), f.name, f),
+                      Name('=='),
+                      Arguments([
+                        PropertyGet(VariableGet(other, myType), f.name, f)
+                      ])))
+                  .toList()
+                  .fold(
+                      BoolLiteral(true),
+                      (previousValue, element) =>
+                          LogicalExpression(previousValue, '&&', element)),
+              BoolLiteral(false),
+              retType)),
+          returnType: retType,
+          positionalParameters: [other])));
+}
+
+void addHashCode(Class cls, CoreTypes coreTypes) {
+  Map<String, VariableDeclaration> environment = Map.fromIterable(cls.fields,
+      key: (f) => f.name.name,
+      value: (f) => VariableDeclaration(f.name.name, type: f.type));
+
+  VariableDeclaration other = VariableDeclaration("other");
+
+  var retType = cls.enclosingLibrary.isNonNullableByDefault
+      ? coreTypes.boolNonNullableRawType
+      : coreTypes.boolLegacyRawType;
+
+  cls.addMember(Procedure(
+      Name("hashCode"),
+      ProcedureKind.Getter,
+      FunctionNode(ReturnStatement(cls.fields
+          .map((f) => DirectPropertyGet(
+              VariableGet(environment[f.name.name]),
+              Procedure(Name("hashCode"), ProcedureKind.Getter,
+                  null) // TODO(jlcontreras): Add ref to the real hashCode getter, dont create a new one
+              ))
+          .toList()
+          .fold(
+              IntLiteral(0),
+              (previousValue, element) => MethodInvocation(
+                  previousValue, Name("*"), Arguments([element])))))));
+}
+
+void addCopyWith(Class cls) {
+  Map<String, VariableDeclaration> environment = Map.fromIterable(cls.fields,
+      key: (f) => f.name.name,
+      value: (f) => VariableDeclaration(f.name.name, type: f.type));
+
+  Constructor syntheticConstructor = null;
+  for (Constructor constructor in cls.constructors) {
+    if (constructor.isSynthetic) {
+      syntheticConstructor = constructor;
+    }
+  }
+
+  cls.addMember(Procedure(
+      Name("copyWith"),
+      ProcedureKind.Method,
+      FunctionNode(
+          ReturnStatement(ConstructorInvocation(
+              syntheticConstructor,
+              Arguments(cls.fields
+                  .map((f) => ConditionalExpression(
+                      MethodInvocation(VariableGet(environment[f.name.name]),
+                          Name('=='), Arguments([NullLiteral()])),
+                      PropertyGet(ThisExpression(), f.name, f),
+                      VariableGet(environment[f.name.name]),
+                      f.type))
+                  .toList()))),
+          namedParameters:
+              cls.fields.map((f) => environment[f.name.name]).toList())));
+}
+*/
+
+bool isValueClass(Class cls) {
+  for (Expression annotation in cls.annotations) {
+    if (annotation is ConstantExpression &&
+        annotation.constant is StringConstant) {
+      StringConstant constant = annotation.constant;
+      if (constant.value == 'valueClass') {
+        return true;
+      }
+    }
+  }
+  return false;
+}
diff --git a/pkg/meta/lib/meta.dart b/pkg/meta/lib/meta.dart
index b123407..11652e1 100644
--- a/pkg/meta/lib/meta.dart
+++ b/pkg/meta/lib/meta.dart
@@ -19,6 +19,8 @@
 /// language tour.
 library meta;
 
+import 'meta_meta.dart';
+
 /// Used to annotate a function `f`. Indicates that `f` always throws an
 /// exception. Any functions that override `f`, in class inheritance, are also
 /// expected to conform to this contract.
@@ -305,6 +307,13 @@
   const _Checked();
 }
 
+@Target({
+  TargetKind.classType,
+  TargetKind.function,
+  TargetKind.getter,
+  TargetKind.library,
+  TargetKind.method,
+})
 class _DoNotStore {
   const _DoNotStore();
 }
diff --git a/pkg/test_runner/analysis_options.yaml b/pkg/test_runner/analysis_options.yaml
index c452209..788c451 100644
--- a/pkg/test_runner/analysis_options.yaml
+++ b/pkg/test_runner/analysis_options.yaml
@@ -5,10 +5,8 @@
   rules:
     # TODO: Enable these once the existing violations have been fixed.
 #    - annotate_overrides
-#    - avoid_renaming_method_parameters
 #    - non_constant_identifier_names
 #    - only_throw_errors
-#    - prefer_initializing_formals
 #    - prefer_interpolation_to_compose_strings
 #    - prefer_is_empty
 #    - prefer_is_not_empty
@@ -19,6 +17,7 @@
     - avoid_init_to_null
     - avoid_null_checks_in_equality_operators
     - avoid_relative_lib_imports
+    - avoid_renaming_method_parameters
     - avoid_return_types_on_setters
     - avoid_returning_null
     - avoid_returning_null_for_void
@@ -60,6 +59,7 @@
     - prefer_equal_for_default_values
     - prefer_final_fields
     - prefer_generic_function_type_aliases
+    - prefer_initializing_formals
     - prefer_null_aware_operators
     - prefer_typing_uninitialized_variables
     - recursive_getters
diff --git a/pkg/test_runner/lib/src/browser_controller.dart b/pkg/test_runner/lib/src/browser_controller.dart
index f2804c5..75a89ad 100644
--- a/pkg/test_runner/lib/src/browser_controller.dart
+++ b/pkg/test_runner/lib/src/browser_controller.dart
@@ -815,11 +815,8 @@
     if (_currentStartingBrowserId == id) _currentStartingBrowserId = null;
   }
 
-  BrowserTestRunner(
-      TestConfiguration configuration, String localIp, this.maxNumBrowsers)
-      : configuration = configuration,
-        localIp = localIp,
-        testingServer = BrowserTestingServer(configuration, localIp,
+  BrowserTestRunner(this.configuration, this.localIp, this.maxNumBrowsers)
+      : testingServer = BrowserTestingServer(configuration, localIp,
             Browser.requiresFocus(configuration.runtime.name)) {
     testingServer.testRunner = this;
   }
diff --git a/pkg/test_runner/lib/src/command.dart b/pkg/test_runner/lib/src/command.dart
index ae9fb11..348ae03 100644
--- a/pkg/test_runner/lib/src/command.dart
+++ b/pkg/test_runner/lib/src/command.dart
@@ -502,11 +502,10 @@
   final String dartFile;
   final bool checked;
 
-  VMBatchCommand(String executable, String dartFile, List<String> arguments,
+  VMBatchCommand(String executable, this.dartFile, List<String> arguments,
       Map<String, String> environmentOverrides,
       {this.checked = true, int index = 0})
-      : dartFile = dartFile,
-        super('vm-batch', executable, arguments, environmentOverrides, null,
+      : super('vm-batch', executable, arguments, environmentOverrides, null,
             index);
 
   VMBatchCommand indexedCopy(int index) =>
diff --git a/pkg/test_runner/lib/src/compiler_configuration.dart b/pkg/test_runner/lib/src/compiler_configuration.dart
index 935a637..6b08ea0 100644
--- a/pkg/test_runner/lib/src/compiler_configuration.dart
+++ b/pkg/test_runner/lib/src/compiler_configuration.dart
@@ -307,14 +307,16 @@
       : super._subclass(configuration);
 
   CommandArtifact computeCompilationArtifact(String tempDir,
-      List<String> globalArguments, Map<String, String> environmentOverrides) {
+      List<String> arguments, Map<String, String> environmentOverrides) {
     var allCommands = <Command>[];
 
     // The first compilation command is as usual.
-    var arguments = pipelineCommands[0].extractArguments(globalArguments, null);
+    var compileArguments =
+        pipelineCommands[0].extractArguments(arguments, null);
     var artifact = pipelineCommands[0]
         .compilerConfiguration
-        .computeCompilationArtifact(tempDir, arguments, environmentOverrides);
+        .computeCompilationArtifact(
+            tempDir, compileArguments, environmentOverrides);
     allCommands.addAll(artifact.commands);
 
     // The following compilation commands are based on the output of the
@@ -322,9 +324,9 @@
     for (var i = 1; i < pipelineCommands.length; i++) {
       var command = pipelineCommands[i];
 
-      arguments = command.extractArguments(globalArguments, artifact.filename);
-      artifact = command.compilerConfiguration
-          .computeCompilationArtifact(tempDir, arguments, environmentOverrides);
+      compileArguments = command.extractArguments(arguments, artifact.filename);
+      artifact = command.compilerConfiguration.computeCompilationArtifact(
+          tempDir, compileArguments, environmentOverrides);
 
       allCommands.addAll(artifact.commands);
     }
@@ -564,8 +566,8 @@
         workingDirectory: inputDir);
   }
 
-  CommandArtifact computeCompilationArtifact(
-      String tempDir, List<String> arguments, Map<String, String> environment) {
+  CommandArtifact computeCompilationArtifact(String tempDir,
+      List<String> arguments, Map<String, String> environmentOverrides) {
     // The list of arguments comes from a call to our own
     // computeCompilerArguments(). It contains the shared options followed by
     // the input file path.
@@ -576,10 +578,9 @@
     var inputFilename = Uri.file(inputFile).pathSegments.last;
     var outputFile = "$tempDir/${inputFilename.replaceAll('.dart', '.js')}";
 
-    return CommandArtifact(
-        [_createCommand(inputFile, outputFile, sharedOptions, environment)],
-        outputFile,
-        "application/javascript");
+    return CommandArtifact([
+      _createCommand(inputFile, outputFile, sharedOptions, environmentOverrides)
+    ], outputFile, "application/javascript");
   }
 }
 
diff --git a/pkg/test_runner/lib/src/runtime_configuration.dart b/pkg/test_runner/lib/src/runtime_configuration.dart
index ad3f498..cb2c9c4 100644
--- a/pkg/test_runner/lib/src/runtime_configuration.dart
+++ b/pkg/test_runner/lib/src/runtime_configuration.dart
@@ -303,7 +303,7 @@
 
 class DartPrecompiledRuntimeConfiguration extends DartVmRuntimeConfiguration {
   final bool useElf;
-  DartPrecompiledRuntimeConfiguration({bool useElf}) : useElf = useElf;
+  DartPrecompiledRuntimeConfiguration({this.useElf});
 
   List<Command> computeRuntimeCommands(
       CommandArtifact artifact,
@@ -360,7 +360,7 @@
   static const deviceTestDir = '/data/local/tmp/precompilation-testing/test';
 
   final bool useElf;
-  DartPrecompiledAdbRuntimeConfiguration({bool useElf}) : useElf = useElf;
+  DartPrecompiledAdbRuntimeConfiguration({this.useElf});
 
   List<Command> computeRuntimeCommands(
       CommandArtifact artifact,
diff --git a/pkg/test_runner/lib/src/test_progress.dart b/pkg/test_runner/lib/src/test_progress.dart
index 7faf841..850c492 100644
--- a/pkg/test_runner/lib/src/test_progress.dart
+++ b/pkg/test_runner/lib/src/test_progress.dart
@@ -224,12 +224,12 @@
 
   TimingPrinter(this._startTime);
 
-  void done(TestCase testCase) {
-    for (var commandOutput in testCase.commandOutputs.values) {
+  void done(TestCase test) {
+    for (var commandOutput in test.commandOutputs.values) {
       var command = commandOutput.command;
       _commandOutputs.add(commandOutput);
       _commandToTestCases.putIfAbsent(command, () => <TestCase>[]);
-      _commandToTestCases[command].add(testCase);
+      _commandToTestCases[command].add(test);
     }
   }
 
@@ -430,7 +430,7 @@
   CompactProgressIndicator(DateTime startTime, this._formatter)
       : super(startTime);
 
-  void _printDoneProgress(TestCase testCase) {
+  void _printDoneProgress(TestCase test) {
     var percent = ((_completedTests / _foundTests) * 100).toInt().toString();
     var progressPadded = (_allTestsKnown ? percent : '--').padLeft(3);
     var passedPadded = _passedTests.toString().padLeft(5);
diff --git a/pkg/test_runner/tool/update_static_error_tests.dart b/pkg/test_runner/tool/update_static_error_tests.dart
index 263fc75..eaa1bf8 100644
--- a/pkg/test_runner/tool/update_static_error_tests.dart
+++ b/pkg/test_runner/tool/update_static_error_tests.dart
@@ -8,6 +8,7 @@
 
 import 'package:args/args.dart';
 import 'package:glob/glob.dart';
+import 'package:path/path.dart' as p;
 
 import 'package:test_runner/src/command_output.dart';
 import 'package:test_runner/src/path.dart';
@@ -18,6 +19,8 @@
 const _usage =
     "Usage: dart update_static_error_tests.dart [flags...] <path glob>";
 
+final String _analyzerPath = _findAnalyzer();
+
 Future<void> main(List<String> args) async {
   var sources = ErrorSource.all.map((e) => e.marker).toList();
 
@@ -207,15 +210,11 @@
   // TODO(rnystrom): Running the analyzer command line each time is very slow.
   // Either import the analyzer as a library, or at least invoke it in a batch
   // mode.
-  var result = await Process.run(
-      Platform.isWindows
-          ? "sdk\\bin\\dartanalyzer.bat"
-          : "sdk/bin/dartanalyzer",
-      [
-        ...options,
-        "--format=machine",
-        path,
-      ]);
+  var result = await Process.run(_analyzerPath, [
+    ...options,
+    "--format=machine",
+    path,
+  ]);
 
   // Analyzer returns 3 when it detects errors, 2 when it detects
   // warnings and --fatal-warnings is enabled, 1 when it detects
@@ -260,3 +259,34 @@
   FastaCommandOutput.parseErrors(result.stdout as String, errors);
   return errors;
 }
+
+/// Find the most recently-built analyzer.
+String _findAnalyzer() {
+  String newestAnalyzer;
+  DateTime newestAnalyzerTime;
+
+  var buildDirectory = Directory(Platform.isMacOS ? "xcodebuild" : "out");
+  if (buildDirectory.existsSync()) {
+    for (var config in buildDirectory.listSync()) {
+      var analyzerPath = p.join(config.path, "dart-sdk", "bin", "dartanalyzer");
+      var analyzerFile = File(analyzerPath);
+      if (!analyzerFile.existsSync()) continue;
+      var modified = analyzerFile.lastModifiedSync();
+
+      if (newestAnalyzerTime == null || modified.isAfter(newestAnalyzerTime)) {
+        newestAnalyzer = analyzerPath;
+        newestAnalyzerTime = modified;
+      }
+    }
+  }
+
+  if (newestAnalyzer == null) {
+    // Clear the current line since we're in the middle of a progress line.
+    print("");
+    print("Could not find a built SDK with a dartanalyzer to run.");
+    print("Make sure to build the Dart SDK before running this tool.");
+    exit(1);
+  }
+
+  return newestAnalyzer;
+}
diff --git a/runtime/include/dart_tools_api.h b/runtime/include/dart_tools_api.h
index 2b47365..c7ebb49 100644
--- a/runtime/include/dart_tools_api.h
+++ b/runtime/include/dart_tools_api.h
@@ -268,6 +268,62 @@
                                                   const uint8_t* bytes,
                                                   intptr_t bytes_length);
 
+/**
+ * Usage statistics for a space/generation at a particular moment in time.
+ *
+ * \param new_space Data for New Space.
+ *
+ * \param old_space Data for Old Space.
+ */
+typedef struct {
+  /**
+   * \param used_in_words Amount of memory space used, in words.
+   *
+   * \param capacity_in_words Memory space capacity, in words.
+   *
+   * \param external_in_words External memory, in words.
+   */
+  struct {
+    intptr_t used_in_words;
+    intptr_t capacity_in_words;
+    intptr_t external_in_words;
+  } new_space, old_space;
+} Dart_GCStats;
+
+/**
+ * A Garbage Collection event with memory usage statistics.
+ *
+ * \param type The event type. Static lifetime.
+ *
+ * \param reason The reason for the GC event. Static lifetime.
+ *
+ * \param before Memory usage statistics measured before GC was performed.
+ *
+ * \param before Memory usage statistics measured after GC was performed.
+ */
+typedef struct {
+  const char* type;
+  const char* reason;
+  Dart_GCStats before;
+  Dart_GCStats after;
+} Dart_GCEvent;
+
+/**
+ * A callback invoked when the VM emits a GC event.
+ *
+ * \param event The GC event data. Pointer only valid for the duration of the
+ *   callback.
+ */
+typedef void (*Dart_GCEventCallback)(Dart_GCEvent* event);
+
+/**
+ * Sets the native GC event callback.
+ *
+ * \param callback A function pointer to an event handler callback function.
+ *   A NULL value removes the existing listen callback function if any.
+ */
+DART_EXPORT void Dart_SetGCEventCallback(Dart_GCEventCallback callback);
+
 /*
  * ========
  * Reload support
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index e2840ba..1440eaa 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -6379,6 +6379,10 @@
   return Api::Success();
 }
 
+DART_EXPORT void Dart_SetGCEventCallback(Dart_GCEventCallback callback) {
+  Isolate::Current()->heap()->SetGCEventCallback(callback);
+}
+
 DART_EXPORT char* Dart_SetFileModifiedCallback(
     Dart_FileModifiedCallback file_modified_callback) {
 #if !defined(PRODUCT)
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index 25a24ce..51031cc 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -67,7 +67,8 @@
       read_only_(false),
       last_gc_was_old_space_(false),
       assume_scavenge_will_fail_(false),
-      gc_on_nth_allocation_(kNoForcedGarbageCollection) {
+      gc_on_nth_allocation_(kNoForcedGarbageCollection),
+      gc_event_callback_(nullptr) {
   UpdateGlobalMaxUsed();
   for (int sel = 0; sel < kNumWeakSelectors; sel++) {
     new_weak_tables_[sel] = new WeakTable();
@@ -1017,6 +1018,35 @@
     });
   }
 #endif  // !PRODUCT
+  if (gc_event_callback_ != nullptr) {
+    Dart_GCEvent event;
+
+    event.type = GCTypeToString(stats_.type_);
+    event.reason = GCReasonToString(stats_.reason_);
+
+    event.before.new_space.capacity_in_words =
+        stats_.before_.new_.capacity_in_words;
+    event.before.new_space.external_in_words =
+        stats_.before_.new_.external_in_words;
+    event.before.new_space.used_in_words = stats_.before_.new_.used_in_words;
+    event.before.old_space.capacity_in_words =
+        stats_.before_.old_.capacity_in_words;
+    event.before.old_space.external_in_words =
+        stats_.before_.old_.external_in_words;
+    event.before.old_space.used_in_words = stats_.before_.old_.used_in_words;
+    event.after.new_space.capacity_in_words =
+        stats_.after_.new_.capacity_in_words;
+    event.after.new_space.external_in_words =
+        stats_.after_.new_.external_in_words;
+    event.after.new_space.used_in_words = stats_.after_.new_.used_in_words;
+    event.after.old_space.capacity_in_words =
+        stats_.after_.old_.capacity_in_words;
+    event.after.old_space.external_in_words =
+        stats_.after_.old_.external_in_words;
+    event.after.old_space.used_in_words = stats_.after_.old_.used_in_words;
+
+    (*gc_event_callback_)(&event);
+  }
 }
 
 void Heap::PrintStats() {
diff --git a/runtime/vm/heap/heap.h b/runtime/vm/heap/heap.h
index 8982ba3..0ea8e09 100644
--- a/runtime/vm/heap/heap.h
+++ b/runtime/vm/heap/heap.h
@@ -9,6 +9,8 @@
 #error "Should not include runtime"
 #endif
 
+#include "include/dart_tools_api.h"
+
 #include "platform/assert.h"
 #include "vm/allocation.h"
 #include "vm/flags.h"
@@ -320,6 +322,10 @@
 
   void MergeFrom(Heap* donor);
 
+  void SetGCEventCallback(Dart_GCEventCallback callback) {
+    gc_event_callback_ = callback;
+  }
+
  private:
   class GCStats : public ValueObject {
    public:
@@ -416,6 +422,8 @@
   // sensitive codepaths.
   intptr_t gc_on_nth_allocation_;
 
+  Dart_GCEventCallback gc_event_callback_;
+
   friend class Become;       // VisitObjectPointers
   friend class GCCompactor;  // VisitObjectPointers
   friend class Precompiler;  // VisitObjects
@@ -429,6 +437,7 @@
   friend class ProgramVisitor;        // VisitObjectsImagePages
   friend class Serializer;            // VisitObjectsImagePages
   friend class HeapTestHelper;
+  friend class MetricsTestHelper;
 
   DISALLOW_COPY_AND_ASSIGN(Heap);
 };
diff --git a/runtime/vm/metrics_test.cc b/runtime/vm/metrics_test.cc
index 5798b7a..a26aaac 100644
--- a/runtime/vm/metrics_test.cc
+++ b/runtime/vm/metrics_test.cc
@@ -13,6 +13,7 @@
 #include "vm/json_stream.h"
 #include "vm/metrics.h"
 #include "vm/unit_test.h"
+// #include "vm/heap.h"
 
 namespace dart {
 
@@ -114,4 +115,55 @@
   }
 }
 
+class MetricsTestHelper {
+ public:
+  static void Scavenge(Thread* thread) {
+    thread->heap()->CollectNewSpaceGarbage(thread, Heap::kDebugging);
+  }
+};
+
+static uintptr_t event_counter;
+static const char* last_gcevent_type;
+static const char* last_gcevent_reason;
+
+void MyGCEventCallback(Dart_GCEvent* e) {
+  event_counter++;
+  last_gcevent_type = e->type;
+  last_gcevent_reason = e->reason;
+}
+
+ISOLATE_UNIT_TEST_CASE(Metric_SetGCEventCallback) {
+  event_counter = 0;
+  last_gcevent_type = nullptr;
+  last_gcevent_reason = nullptr;
+
+  {
+    TransitionVMToNative transition(Thread::Current());
+
+    const char* kScript = "void main() {}";
+    Dart_Handle api_lib = TestCase::LoadTestScript(
+        kScript, /*resolver=*/nullptr, RESOLVED_USER_TEST_URI);
+    EXPECT_VALID(api_lib);
+  }
+
+  EXPECT_EQ(0UL, event_counter);
+  EXPECT_NULLPTR(last_gcevent_type);
+  EXPECT_NULLPTR(last_gcevent_reason);
+
+  Dart_SetGCEventCallback(&MyGCEventCallback);
+
+  MetricsTestHelper::Scavenge(Thread::Current());
+
+  EXPECT_EQ(1UL, event_counter);
+  EXPECT_STREQ("Scavenge", last_gcevent_type);
+  EXPECT_STREQ("debugging", last_gcevent_reason);
+
+  // This call emits 2 or 3 events.
+  Isolate::Current()->heap()->CollectAllGarbage(Heap::kLowMemory);
+
+  EXPECT_GE(event_counter, 3UL);
+  EXPECT_STREQ("MarkCompact", last_gcevent_type);
+  EXPECT_STREQ("low memory", last_gcevent_reason);
+}
+
 }  // namespace dart
diff --git a/sdk/lib/_http/http_impl.dart b/sdk/lib/_http/http_impl.dart
index f01e495..3cf75d9 100644
--- a/sdk/lib/_http/http_impl.dart
+++ b/sdk/lib/_http/http_impl.dart
@@ -1988,6 +1988,12 @@
     _socket.destroy();
   }
 
+  void destroyFromExternal() {
+    closed = true;
+    _httpClient._connectionClosedNoFurtherClosing(this);
+    _socket.destroy();
+  }
+
   void close() {
     closed = true;
     _httpClient._connectionClosed(this);
@@ -1996,6 +2002,14 @@
         .then((_) => _socket.destroy());
   }
 
+  void closeFromExternal() {
+    closed = true;
+    _httpClient._connectionClosedNoFurtherClosing(this);
+    _streamFuture!
+        .timeout(_httpClient.idleTimeout)
+        .then((_) => _socket.destroy());
+  }
+
   Future<_HttpClientConnection> createProxyTunnel(
       String host,
       int port,
@@ -2141,14 +2155,14 @@
     }
     if (force) {
       for (var c in _idle.toList()) {
-        c.destroy();
+        c.destroyFromExternal();
       }
       for (var c in _active.toList()) {
-        c.destroy();
+        c.destroyFromExternal();
       }
     } else {
       for (var c in _idle.toList()) {
-        c.close();
+        c.closeFromExternal();
       }
     }
   }
@@ -2486,6 +2500,20 @@
     }
   }
 
+  // Remove a closed connection and not issue _closeConnections(). If the close
+  // is signaled from user by calling close(), _closeConnections() was called
+  // and prevent further calls.
+  void _connectionClosedNoFurtherClosing(_HttpClientConnection connection) {
+    connection.stopTimer();
+    var connectionTarget = _connectionTargets[connection.key];
+    if (connectionTarget != null) {
+      connectionTarget.connectionClosed(connection);
+      if (connectionTarget.isEmpty) {
+        _connectionTargets.remove(connection.key);
+      }
+    }
+  }
+
   void _connectionsChanged() {
     if (_closing) {
       _closeConnections(_closingForcefully);
diff --git a/sdk/lib/_internal/vm/bin/file_patch.dart b/sdk/lib/_internal/vm/bin/file_patch.dart
index 033abea..b243920 100644
--- a/sdk/lib/_internal/vm/bin/file_patch.dart
+++ b/sdk/lib/_internal/vm/bin/file_patch.dart
@@ -299,6 +299,15 @@
           }
         }
       } else if (event == RawSocketEvent.closed) {
+        // After this point we should not try to do anything with pathId as
+        // the handle it represented is closed and gone now.
+        if (_idMap.containsKey(pathId)) {
+          _idMap.remove(pathId);
+          if (_idMap.isEmpty && _id != null) {
+            _closeWatcher(_id!);
+            _id = null;
+          }
+        }
       } else if (event == RawSocketEvent.readClosed) {
         // If Directory watcher buffer overflows, it will send an readClosed event.
         // Normal closing will cancel stream subscription so that path is
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index c046c23..6c796d4 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -26,8 +26,6 @@
 Language/Statements/Assert/*: Skip # Not migrated to NNBD
 Language/Statements/Expression_Statements/syntax_t06: Skip # Type aliases are not fully implemented
 Language/Types/Type_Aliases/built-in_types_t11: Skip # Triple shift is not implemented yet
-LanguageFeatures/Constant-update-2018/*: Skip # Not migrated to NNBD
-LanguageFeatures/Control-flow-collections/*: Skip # Not migrated to NNBD
 LanguageFeatures/Extension-methods/explicit_extension_member_invocation_A15_t09: Skip # Triple shift is not implemented yet
 LanguageFeatures/Instantiate-to-bound/*: Skip # Not migrated to NNBD
 LanguageFeatures/Instantiate-to-bound/class/*: Skip # Not migrated to NNBD
diff --git a/tests/standalone/io/http_close_stack_overflow_test.dart b/tests/standalone/io/http_close_stack_overflow_test.dart
new file mode 100644
index 0000000..27055f8
--- /dev/null
+++ b/tests/standalone/io/http_close_stack_overflow_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+// Test that closing a large amount of servers will not lead to a stack
+// overflow.
+Future<void> main() async {
+  final max = 10000;
+  final servers = <ServerSocket>[];
+  for (var i = 0; i < max; i++) {
+    final server = await ServerSocket.bind("localhost", 0);
+    server.listen((Socket socket) {});
+    servers.add(server);
+  }
+  final client = HttpClient();
+  var got = 0;
+  for (var i = 0; i < max; i++) {
+    new Future(() async {
+      try {
+        final request = await client
+            .getUrl(Uri.parse("http://localhost:${servers[i].port}/"));
+        got++;
+        if (got == max) {
+          // Test that no stack overflow happens.
+          client.close(force: true);
+          for (final server in servers) {
+            server.close();
+          }
+        }
+        final response = await request.close();
+        response.drain();
+      } on HttpException catch (_) {}
+    });
+  }
+}
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index fd4c088..73137e9 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -5,6 +5,7 @@
 # Tests using the multitest feature where failure is expected should *also* be
 # listed in tests/lib/analyzer/analyze_tests.status without the "standalone"
 # prefix.
+io/http_close_stack_overflow_test: Skip # The test is heavy loaded. Should be used for manual test.
 io/http_linklocal_ipv6_test: SkipByDesign # This needs manual test.
 io/non_utf8_directory_test: Skip # Issue 33519. Temp files causing bots to go purple.
 io/non_utf8_file_test: Skip # Issue 33519. Temp files causing bots to go purple.
diff --git a/tests/standalone_2/io/http_close_stack_overflow_test.dart b/tests/standalone_2/io/http_close_stack_overflow_test.dart
new file mode 100644
index 0000000..27055f8
--- /dev/null
+++ b/tests/standalone_2/io/http_close_stack_overflow_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+// Test that closing a large amount of servers will not lead to a stack
+// overflow.
+Future<void> main() async {
+  final max = 10000;
+  final servers = <ServerSocket>[];
+  for (var i = 0; i < max; i++) {
+    final server = await ServerSocket.bind("localhost", 0);
+    server.listen((Socket socket) {});
+    servers.add(server);
+  }
+  final client = HttpClient();
+  var got = 0;
+  for (var i = 0; i < max; i++) {
+    new Future(() async {
+      try {
+        final request = await client
+            .getUrl(Uri.parse("http://localhost:${servers[i].port}/"));
+        got++;
+        if (got == max) {
+          // Test that no stack overflow happens.
+          client.close(force: true);
+          for (final server in servers) {
+            server.close();
+          }
+        }
+        final response = await request.close();
+        response.drain();
+      } on HttpException catch (_) {}
+    });
+  }
+}
diff --git a/tests/standalone_2/standalone_2.status b/tests/standalone_2/standalone_2.status
index f99d678..257680b 100644
--- a/tests/standalone_2/standalone_2.status
+++ b/tests/standalone_2/standalone_2.status
@@ -5,6 +5,7 @@
 # Tests using the multitest feature where failure is expected should *also* be
 # listed in tests/lib/analyzer/analyze_tests.status without the "standalone"
 # prefix.
+io/http_close_stack_overflow_test: Skip # The test is heavy loaded. Should be used for manual test.
 io/http_linklocal_ipv6_test: SkipByDesign # This needs manual test.
 io/non_utf8_directory_test: Skip # Issue 33519. Temp files causing bots to go purple.
 io/non_utf8_file_test: Skip # Issue 33519. Temp files causing bots to go purple.
diff --git a/tools/VERSION b/tools/VERSION
index 3d7e732..0adee07 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 10
 PATCH 0
-PRERELEASE 76
+PRERELEASE 77
 PRERELEASE_PATCH 0
\ No newline at end of file