CQ. Split elements_test.dart into several files.

Change-Id: I060a58dc784a0dddbb15c3222e559ae930aef972
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/378542
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/test/src/summary/elements/augmentation_import_test.dart b/pkg/analyzer/test/src/summary/elements/augmentation_import_test.dart
new file mode 100644
index 0000000..11dec8e
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/elements/augmentation_import_test.dart
@@ -0,0 +1,266 @@
+// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../dart/resolution/node_text_expectations.dart';
+import '../elements_base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(LibraryAugmentationImportElementTest_keepLinking);
+    defineReflectiveTests(LibraryAugmentationImportElementTest_fromBytes);
+    defineReflectiveTests(UpdateNodeTextExpectations);
+  });
+}
+
+abstract class LibraryAugmentationImportElementTest extends ElementsBaseTest {
+  test_library_augmentationImports_augmentation() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+class A {}
+''');
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class B {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class B @31
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class A @35
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::A::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::A
+''');
+
+    var import_0 = library.augmentationImports[0];
+    var augmentation = import_0.importedAugmentation!;
+    expect(augmentation.enclosingElement, same(library));
+  }
+
+  test_library_augmentationImports_depthFirst() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+import augment 'b.dart';
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'a.dart';
+''');
+
+    newFile('$testPackageLibPath/c.dart', r'''
+augment library 'test.dart';
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'c.dart';
+''');
+
+    configuration.withLibraryAugmentations = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentations
+    <testLibrary>::@augmentation::package:test/a.dart
+    <testLibrary>::@augmentation::package:test/b.dart
+    <testLibrary>::@augmentation::package:test/c.dart
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+      augmentationImports
+        package:test/b.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+          reference: <testLibrary>::@augmentation::package:test/b.dart
+          definingUnit: <testLibrary>::@fragment::package:test/b.dart
+    package:test/c.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/c.dart
+      definingUnit: <testLibrary>::@fragment::package:test/c.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+    <testLibrary>::@fragment::package:test/c.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/c.dart
+      enclosingElement3: <testLibraryFragment>
+''');
+
+    var import_0 = library.augmentationImports[0];
+    var augmentation = import_0.importedAugmentation!;
+    expect(augmentation.enclosingElement, same(library));
+  }
+
+  test_library_augmentationImports_noRelativeUriStr() async {
+    var library = await buildLibrary(r'''
+import augment '${'foo'}.dart';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    noRelativeUriString
+      enclosingElement: <testLibrary>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+''');
+  }
+
+  test_library_augmentationImports_withRelativeUri_emptyUriSelf() async {
+    var library = await buildLibrary(r'''
+import augment '';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    source 'package:test/test.dart'
+      enclosingElement: <testLibrary>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+''');
+  }
+
+  test_library_augmentationImports_withRelativeUri_noSource() async {
+    var library = await buildLibrary(r'''
+import augment 'foo:bar';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    relativeUri 'foo:bar'
+      enclosingElement: <testLibrary>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+''');
+  }
+
+  test_library_augmentationImports_withRelativeUri_notAugmentation_library() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+library my.lib;
+''');
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    source 'package:test/a.dart'
+      enclosingElement: <testLibrary>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+''');
+  }
+
+  test_library_augmentationImports_withRelativeUri_notAugmentation_part() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+part of other.lib;
+''');
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    source 'package:test/a.dart'
+      enclosingElement: <testLibrary>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+''');
+  }
+
+  test_library_augmentationImports_withRelativeUri_notExists() async {
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    source 'package:test/a.dart'
+      enclosingElement: <testLibrary>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+''');
+  }
+
+  test_library_augmentationImports_withRelativeUriString() async {
+    var library = await buildLibrary(r'''
+import augment ':';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    relativeUriString ':'
+      enclosingElement: <testLibrary>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+''');
+  }
+}
+
+@reflectiveTest
+class LibraryAugmentationImportElementTest_fromBytes
+    extends LibraryAugmentationImportElementTest {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class LibraryAugmentationImportElementTest_keepLinking
+    extends LibraryAugmentationImportElementTest {
+  @override
+  bool get keepLinkingLibraries => true;
+}
diff --git a/pkg/analyzer/test/src/summary/elements/class_test.dart b/pkg/analyzer/test/src/summary/elements/class_test.dart
new file mode 100644
index 0000000..5b2eda1
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/elements/class_test.dart
@@ -0,0 +1,20980 @@
+// Copyright (c) 2024, 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:analyzer/dart/element/element.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../dart/resolution/node_text_expectations.dart';
+import '../element_text.dart';
+import '../elements_base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ClassElementTest_keepLinking);
+    defineReflectiveTests(ClassElementTest_fromBytes);
+    defineReflectiveTests(ClassElementTest_augmentation_keepLinking);
+    defineReflectiveTests(ClassElementTest_augmentation_fromBytes);
+    defineReflectiveTests(UpdateNodeTextExpectations);
+  });
+}
+
+abstract class ClassElementTest extends ElementsBaseTest {
+  test_class_abstract() async {
+    var library = await buildLibrary('abstract class C {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        abstract class C @15
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_base() async {
+    var library = await buildLibrary('base class C {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        base class C @11
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_constructor_const() async {
+    var library = await buildLibrary('class C { const C(); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const @16
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_constructor_const_external() async {
+    var library = await buildLibrary('class C { external const C(); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            external const @25
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_constructor_documented() async {
+    var library = await buildLibrary('''
+class C {
+  /**
+   * Docs
+   */
+  C();
+}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @34
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              documentationComment: /**\n   * Docs\n   */
+''');
+  }
+
+  test_class_constructor_explicit_named() async {
+    var library = await buildLibrary('class C { C.foo(); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            foo @12
+              reference: <testLibraryFragment>::@class::C::@constructor::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 11
+              nameEnd: 15
+''');
+  }
+
+  test_class_constructor_explicit_type_params() async {
+    var library = await buildLibrary('class C<T, U> { C(); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+            covariant U @11
+              defaultType: dynamic
+          constructors
+            @16
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_constructor_explicit_unnamed() async {
+    var library = await buildLibrary('class C { C(); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @10
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_constructor_external() async {
+    var library = await buildLibrary('class C { external C(); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            external @19
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_constructor_factory() async {
+    var library = await buildLibrary('class C { factory C() => throw 0; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            factory @18
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_constructor_field_formal_dynamic_dynamic() async {
+    var library =
+        await buildLibrary('class C { dynamic x; C(dynamic this.x); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @18
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            @21
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional final this.x @36
+                  type: dynamic
+                  field: <testLibraryFragment>::@class::C::@field::x
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: dynamic
+              returnType: void
+''');
+  }
+
+  test_class_constructor_field_formal_dynamic_typed() async {
+    var library = await buildLibrary('class C { dynamic x; C(int this.x); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @18
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            @21
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional final this.x @32
+                  type: int
+                  field: <testLibraryFragment>::@class::C::@field::x
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: dynamic
+              returnType: void
+''');
+  }
+
+  test_class_constructor_field_formal_dynamic_untyped() async {
+    var library = await buildLibrary('class C { dynamic x; C(this.x); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @18
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            @21
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional final this.x @28
+                  type: dynamic
+                  field: <testLibraryFragment>::@class::C::@field::x
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: dynamic
+              returnType: void
+''');
+  }
+
+  test_class_constructor_field_formal_functionTyped_noReturnType() async {
+    var library = await buildLibrary(r'''
+class C {
+  var x;
+  C(this.x(double b));
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @16
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            @21
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional final this.x @28
+                  type: dynamic Function(double)
+                  parameters
+                    requiredPositional b @37
+                      type: double
+                  field: <testLibraryFragment>::@class::C::@field::x
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: dynamic
+              returnType: void
+''');
+  }
+
+  test_class_constructor_field_formal_functionTyped_withReturnType() async {
+    var library = await buildLibrary(r'''
+class C {
+  var x;
+  C(int this.x(double b));
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @16
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            @21
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional final this.x @32
+                  type: int Function(double)
+                  parameters
+                    requiredPositional b @41
+                      type: double
+                  field: <testLibraryFragment>::@class::C::@field::x
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: dynamic
+              returnType: void
+''');
+  }
+
+  test_class_constructor_field_formal_functionTyped_withReturnType_generic() async {
+    var library = await buildLibrary(r'''
+class C {
+  Function() f;
+  C(List<U> this.f<T, U>(T t));
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            f @23
+              reference: <testLibraryFragment>::@class::C::@field::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic Function()
+          constructors
+            @28
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional final this.f @43
+                  type: List<U> Function<T, U>(T)
+                  typeParameters
+                    covariant T @45
+                    covariant U @48
+                  parameters
+                    requiredPositional t @53
+                      type: T
+                  field: <testLibraryFragment>::@class::C::@field::f
+          accessors
+            synthetic get f @-1
+              reference: <testLibraryFragment>::@class::C::@getter::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic Function()
+            synthetic set f= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _f @-1
+                  type: dynamic Function()
+              returnType: void
+''');
+  }
+
+  test_class_constructor_field_formal_multiple_matching_fields() async {
+    // This is a compile-time error but it should still analyze consistently.
+    var library = await buildLibrary('class C { C(this.x); int x; String x; }');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @25
+              reference: <testLibraryFragment>::@class::C::@field::x::@def::0
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+            x @35
+              reference: <testLibraryFragment>::@class::C::@field::x::@def::1
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: String
+          constructors
+            @10
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional final this.x @17
+                  type: int
+                  field: <testLibraryFragment>::@class::C::@field::x::@def::0
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x::@def::0
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x::@def::0
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: int
+              returnType: void
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x::@def::1
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: String
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x::@def::1
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: String
+              returnType: void
+''');
+  }
+
+  test_class_constructor_field_formal_no_matching_field() async {
+    // This is a compile-time error but it should still analyze consistently.
+    var library = await buildLibrary('class C { C(this.x); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @10
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional final this.x @17
+                  type: dynamic
+                  field: <null>
+''');
+  }
+
+  test_class_constructor_field_formal_typed_dynamic() async {
+    var library = await buildLibrary('class C { num x; C(dynamic this.x); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @14
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: num
+          constructors
+            @17
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional final this.x @32
+                  type: dynamic
+                  field: <testLibraryFragment>::@class::C::@field::x
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: num
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: num
+              returnType: void
+''');
+  }
+
+  test_class_constructor_field_formal_typed_typed() async {
+    var library = await buildLibrary('class C { num x; C(int this.x); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @14
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: num
+          constructors
+            @17
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional final this.x @28
+                  type: int
+                  field: <testLibraryFragment>::@class::C::@field::x
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: num
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: num
+              returnType: void
+''');
+  }
+
+  test_class_constructor_field_formal_typed_untyped() async {
+    var library = await buildLibrary('class C { num x; C(this.x); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @14
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: num
+          constructors
+            @17
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional final this.x @24
+                  type: num
+                  field: <testLibraryFragment>::@class::C::@field::x
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: num
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: num
+              returnType: void
+''');
+  }
+
+  test_class_constructor_field_formal_untyped_dynamic() async {
+    var library = await buildLibrary('class C { var x; C(dynamic this.x); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @14
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            @17
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional final this.x @32
+                  type: dynamic
+                  field: <testLibraryFragment>::@class::C::@field::x
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: dynamic
+              returnType: void
+''');
+  }
+
+  test_class_constructor_field_formal_untyped_typed() async {
+    var library = await buildLibrary('class C { var x; C(int this.x); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @14
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            @17
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional final this.x @28
+                  type: int
+                  field: <testLibraryFragment>::@class::C::@field::x
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: dynamic
+              returnType: void
+''');
+  }
+
+  test_class_constructor_field_formal_untyped_untyped() async {
+    var library = await buildLibrary('class C { var x; C(this.x); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @14
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            @17
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional final this.x @24
+                  type: dynamic
+                  field: <testLibraryFragment>::@class::C::@field::x
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: dynamic
+              returnType: void
+''');
+  }
+
+  test_class_constructor_fieldFormal_named_noDefault() async {
+    var library = await buildLibrary('class C { int x; C({this.x}); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @14
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            @17
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                optionalNamed default final this.x @25
+                  reference: <testLibraryFragment>::@class::C::@constructor::new::@parameter::x
+                  type: int
+                  field: <testLibraryFragment>::@class::C::@field::x
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_constructor_fieldFormal_named_withDefault() async {
+    var library = await buildLibrary('class C { int x; C({this.x: 42}); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @14
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            @17
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                optionalNamed default final this.x @25
+                  reference: <testLibraryFragment>::@class::C::@constructor::new::@parameter::x
+                  type: int
+                  constantInitializer
+                    IntegerLiteral
+                      literal: 42 @28
+                      staticType: int
+                  field: <testLibraryFragment>::@class::C::@field::x
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_constructor_fieldFormal_optional_noDefault() async {
+    var library = await buildLibrary('class C { int x; C([this.x]); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @14
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            @17
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                optionalPositional default final this.x @25
+                  type: int
+                  field: <testLibraryFragment>::@class::C::@field::x
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_constructor_fieldFormal_optional_withDefault() async {
+    var library = await buildLibrary('class C { int x; C([this.x = 42]); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @14
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            @17
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                optionalPositional default final this.x @25
+                  type: int
+                  constantInitializer
+                    IntegerLiteral
+                      literal: 42 @29
+                      staticType: int
+                  field: <testLibraryFragment>::@class::C::@field::x
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_constructor_implicit_type_params() async {
+    var library = await buildLibrary('class C<T, U> {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+            covariant U @11
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_constructor_initializers_assertInvocation() async {
+    var library = await buildLibrary('''
+class C {
+  const C(int x) : assert(x >= 42);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const @18
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional x @24
+                  type: int
+              constantInitializers
+                AssertInitializer
+                  assertKeyword: assert @29
+                  leftParenthesis: ( @35
+                  condition: BinaryExpression
+                    leftOperand: SimpleIdentifier
+                      token: x @36
+                      staticElement: <testLibraryFragment>::@class::C::@constructor::new::@parameter::x
+                      staticType: int
+                    operator: >= @38
+                    rightOperand: IntegerLiteral
+                      literal: 42 @41
+                      staticType: int
+                    staticElement: dart:core::<fragment>::@class::num::@method::>=
+                    staticInvokeType: bool Function(num)
+                    staticType: bool
+                  rightParenthesis: ) @43
+''');
+  }
+
+  test_class_constructor_initializers_assertInvocation_message() async {
+    var library = await buildLibrary('''
+class C {
+  const C(int x) : assert(x >= 42, 'foo');
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const @18
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional x @24
+                  type: int
+              constantInitializers
+                AssertInitializer
+                  assertKeyword: assert @29
+                  leftParenthesis: ( @35
+                  condition: BinaryExpression
+                    leftOperand: SimpleIdentifier
+                      token: x @36
+                      staticElement: <testLibraryFragment>::@class::C::@constructor::new::@parameter::x
+                      staticType: int
+                    operator: >= @38
+                    rightOperand: IntegerLiteral
+                      literal: 42 @41
+                      staticType: int
+                    staticElement: dart:core::<fragment>::@class::num::@method::>=
+                    staticInvokeType: bool Function(num)
+                    staticType: bool
+                  comma: , @43
+                  message: SimpleStringLiteral
+                    literal: 'foo' @45
+                  rightParenthesis: ) @50
+''');
+  }
+
+  test_class_constructor_initializers_field() async {
+    var library = await buildLibrary('''
+class C {
+  final x;
+  const C() : x = 42;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            final x @18
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            const @29
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                ConstructorFieldInitializer
+                  fieldName: SimpleIdentifier
+                    token: x @35
+                    staticElement: <testLibraryFragment>::@class::C::@field::x
+                    staticType: null
+                  equals: = @37
+                  expression: IntegerLiteral
+                    literal: 42 @39
+                    staticType: int
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+''');
+  }
+
+  test_class_constructor_initializers_field_notConst() async {
+    var library = await buildLibrary('''
+class C {
+  final x;
+  const C() : x = foo();
+}
+int foo() => 42;
+''');
+    // It is OK to keep non-constant initializers.
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            final x @18
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            const @29
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                ConstructorFieldInitializer
+                  fieldName: SimpleIdentifier
+                    token: x @35
+                    staticElement: <testLibraryFragment>::@class::C::@field::x
+                    staticType: null
+                  equals: = @37
+                  expression: MethodInvocation
+                    methodName: SimpleIdentifier
+                      token: foo @39
+                      staticElement: <testLibraryFragment>::@function::foo
+                      staticType: int Function()
+                    argumentList: ArgumentList
+                      leftParenthesis: ( @42
+                      rightParenthesis: ) @43
+                    staticInvokeType: int Function()
+                    staticType: int
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+      functions
+        foo @52
+          reference: <testLibraryFragment>::@function::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_class_constructor_initializers_field_optionalPositionalParameter() async {
+    var library = await buildLibrary('''
+class A {
+  final int _f;
+  const A([int f = 0]) : _f = f;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            final promotable _f @22
+              reference: <testLibraryFragment>::@class::A::@field::_f
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+          constructors
+            const @34
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                optionalPositional default f @41
+                  type: int
+                  constantInitializer
+                    IntegerLiteral
+                      literal: 0 @45
+                      staticType: int
+              constantInitializers
+                ConstructorFieldInitializer
+                  fieldName: SimpleIdentifier
+                    token: _f @51
+                    staticElement: <testLibraryFragment>::@class::A::@field::_f
+                    staticType: null
+                  equals: = @54
+                  expression: SimpleIdentifier
+                    token: f @56
+                    staticElement: <testLibraryFragment>::@class::A::@constructor::new::@parameter::f
+                    staticType: int
+          accessors
+            synthetic get _f @-1
+              reference: <testLibraryFragment>::@class::A::@getter::_f
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+''');
+  }
+
+  test_class_constructor_initializers_field_recordLiteral() async {
+    var library = await buildLibrary('''
+class C {
+  final Object x;
+  const C(int a) : x = (0, a);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            final x @25
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: Object
+          constructors
+            const @36
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional a @42
+                  type: int
+              constantInitializers
+                ConstructorFieldInitializer
+                  fieldName: SimpleIdentifier
+                    token: x @47
+                    staticElement: <testLibraryFragment>::@class::C::@field::x
+                    staticType: null
+                  equals: = @49
+                  expression: RecordLiteral
+                    leftParenthesis: ( @51
+                    fields
+                      IntegerLiteral
+                        literal: 0 @52
+                        staticType: int
+                      SimpleIdentifier
+                        token: a @55
+                        staticElement: <testLibraryFragment>::@class::C::@constructor::new::@parameter::a
+                        staticType: int
+                    rightParenthesis: ) @56
+                    staticType: (int, int)
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: Object
+''');
+  }
+
+  test_class_constructor_initializers_field_withParameter() async {
+    var library = await buildLibrary('''
+class C {
+  final x;
+  const C(int p) : x = 1 + p;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            final x @18
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            const @29
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional p @35
+                  type: int
+              constantInitializers
+                ConstructorFieldInitializer
+                  fieldName: SimpleIdentifier
+                    token: x @40
+                    staticElement: <testLibraryFragment>::@class::C::@field::x
+                    staticType: null
+                  equals: = @42
+                  expression: BinaryExpression
+                    leftOperand: IntegerLiteral
+                      literal: 1 @44
+                      staticType: int
+                    operator: + @46
+                    rightOperand: SimpleIdentifier
+                      token: p @48
+                      staticElement: <testLibraryFragment>::@class::C::@constructor::new::@parameter::p
+                      staticType: int
+                    staticElement: dart:core::<fragment>::@class::num::@method::+
+                    staticInvokeType: num Function(num)
+                    staticType: int
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+''');
+  }
+
+  test_class_constructor_initializers_genericFunctionType() async {
+    var library = await buildLibrary('''
+class A<T> {
+  const A();
+}
+class B {
+  const B(dynamic x);
+  const B.f()
+   : this(A<Function()>());
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            const @21
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class B @34
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const @46
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                requiredPositional x @56
+                  type: dynamic
+            const f @70
+              reference: <testLibraryFragment>::@class::B::@constructor::f
+              enclosingElement: <testLibraryFragment>::@class::B
+              periodOffset: 69
+              nameEnd: 71
+              constantInitializers
+                RedirectingConstructorInvocation
+                  thisKeyword: this @79
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @83
+                    arguments
+                      InstanceCreationExpression
+                        constructorName: ConstructorName
+                          type: NamedType
+                            name: A @84
+                            typeArguments: TypeArgumentList
+                              leftBracket: < @85
+                              arguments
+                                GenericFunctionType
+                                  functionKeyword: Function @86
+                                  parameters: FormalParameterList
+                                    leftParenthesis: ( @94
+                                    rightParenthesis: ) @95
+                                  declaredElement: GenericFunctionTypeElement
+                                    parameters
+                                    returnType: dynamic
+                                    type: dynamic Function()
+                                  type: dynamic Function()
+                              rightBracket: > @96
+                            element: <testLibraryFragment>::@class::A
+                            type: A<dynamic Function()>
+                          staticElement: ConstructorMember
+                            base: <testLibraryFragment>::@class::A::@constructor::new
+                            substitution: {T: dynamic Function()}
+                        argumentList: ArgumentList
+                          leftParenthesis: ( @97
+                          rightParenthesis: ) @98
+                        staticType: A<dynamic Function()>
+                    rightParenthesis: ) @99
+                  staticElement: <testLibraryFragment>::@class::B::@constructor::new
+              redirectedConstructor: <testLibraryFragment>::@class::B::@constructor::new
+''');
+  }
+
+  test_class_constructor_initializers_superInvocation_argumentContextType() async {
+    var library = await buildLibrary('''
+class A {
+  const A(List<String> values);
+}
+class B extends A {
+  const B() : super(const []);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const @18
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional values @33
+                  type: List<String>
+        class B @50
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            const @72
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @78
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @83
+                    arguments
+                      ListLiteral
+                        constKeyword: const @84
+                        leftBracket: [ @90
+                        rightBracket: ] @91
+                        staticType: List<String>
+                    rightParenthesis: ) @92
+                  staticElement: <testLibraryFragment>::@class::A::@constructor::new
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_constructor_initializers_superInvocation_named() async {
+    var library = await buildLibrary('''
+class A {
+  const A.aaa(int p);
+}
+class C extends A {
+  const C() : super.aaa(42);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const aaa @20
+              reference: <testLibraryFragment>::@class::A::@constructor::aaa
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 19
+              nameEnd: 23
+              parameters
+                requiredPositional p @28
+                  type: int
+        class C @40
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            const @62
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @68
+                  period: . @73
+                  constructorName: SimpleIdentifier
+                    token: aaa @74
+                    staticElement: <testLibraryFragment>::@class::A::@constructor::aaa
+                    staticType: null
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @77
+                    arguments
+                      IntegerLiteral
+                        literal: 42 @78
+                        staticType: int
+                    rightParenthesis: ) @80
+                  staticElement: <testLibraryFragment>::@class::A::@constructor::aaa
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::aaa
+''');
+  }
+
+  test_class_constructor_initializers_superInvocation_named_underscore() async {
+    var library = await buildLibrary('''
+class A {
+  const A._();
+}
+class B extends A {
+  const B() : super._();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const _ @20
+              reference: <testLibraryFragment>::@class::A::@constructor::_
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 19
+              nameEnd: 21
+        class B @33
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            const @55
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @61
+                  period: . @66
+                  constructorName: SimpleIdentifier
+                    token: _ @67
+                    staticElement: <testLibraryFragment>::@class::A::@constructor::_
+                    staticType: null
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @68
+                    rightParenthesis: ) @69
+                  staticElement: <testLibraryFragment>::@class::A::@constructor::_
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::_
+''');
+  }
+
+  test_class_constructor_initializers_superInvocation_namedExpression() async {
+    var library = await buildLibrary('''
+class A {
+  const A.aaa(a, {int b});
+}
+class C extends A {
+  const C() : super.aaa(1, b: 2);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const aaa @20
+              reference: <testLibraryFragment>::@class::A::@constructor::aaa
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 19
+              nameEnd: 23
+              parameters
+                requiredPositional a @24
+                  type: dynamic
+                optionalNamed default b @32
+                  reference: <testLibraryFragment>::@class::A::@constructor::aaa::@parameter::b
+                  type: int
+        class C @45
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            const @67
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @73
+                  period: . @78
+                  constructorName: SimpleIdentifier
+                    token: aaa @79
+                    staticElement: <testLibraryFragment>::@class::A::@constructor::aaa
+                    staticType: null
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @82
+                    arguments
+                      IntegerLiteral
+                        literal: 1 @83
+                        staticType: int
+                      NamedExpression
+                        name: Label
+                          label: SimpleIdentifier
+                            token: b @86
+                            staticElement: <testLibraryFragment>::@class::A::@constructor::aaa::@parameter::b
+                            staticType: null
+                          colon: : @87
+                        expression: IntegerLiteral
+                          literal: 2 @89
+                          staticType: int
+                    rightParenthesis: ) @90
+                  staticElement: <testLibraryFragment>::@class::A::@constructor::aaa
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::aaa
+''');
+  }
+
+  test_class_constructor_initializers_superInvocation_unnamed() async {
+    var library = await buildLibrary('''
+class A {
+  const A(int p);
+}
+class C extends A {
+  const C.ccc() : super(42);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const @18
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional p @24
+                  type: int
+        class C @36
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            const ccc @60
+              reference: <testLibraryFragment>::@class::C::@constructor::ccc
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 59
+              nameEnd: 63
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @68
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @73
+                    arguments
+                      IntegerLiteral
+                        literal: 42 @74
+                        staticType: int
+                    rightParenthesis: ) @76
+                  staticElement: <testLibraryFragment>::@class::A::@constructor::new
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_constructor_initializers_thisInvocation_argumentContextType() async {
+    var library = await buildLibrary('''
+class A {
+  const A(List<String> values);
+  const A.empty() : this(const []);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const @18
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional values @33
+                  type: List<String>
+            const empty @52
+              reference: <testLibraryFragment>::@class::A::@constructor::empty
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 51
+              nameEnd: 57
+              constantInitializers
+                RedirectingConstructorInvocation
+                  thisKeyword: this @62
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @66
+                    arguments
+                      ListLiteral
+                        constKeyword: const @67
+                        leftBracket: [ @73
+                        rightBracket: ] @74
+                        staticType: List<String>
+                    rightParenthesis: ) @75
+                  staticElement: <testLibraryFragment>::@class::A::@constructor::new
+              redirectedConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_constructor_initializers_thisInvocation_named() async {
+    var library = await buildLibrary('''
+class C {
+  const C() : this.named(1, 'bbb');
+  const C.named(int a, String b);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const @18
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                RedirectingConstructorInvocation
+                  thisKeyword: this @24
+                  period: . @28
+                  constructorName: SimpleIdentifier
+                    token: named @29
+                    staticElement: <testLibraryFragment>::@class::C::@constructor::named
+                    staticType: null
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @34
+                    arguments
+                      IntegerLiteral
+                        literal: 1 @35
+                        staticType: int
+                      SimpleStringLiteral
+                        literal: 'bbb' @38
+                    rightParenthesis: ) @43
+                  staticElement: <testLibraryFragment>::@class::C::@constructor::named
+              redirectedConstructor: <testLibraryFragment>::@class::C::@constructor::named
+            const named @56
+              reference: <testLibraryFragment>::@class::C::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 55
+              nameEnd: 61
+              parameters
+                requiredPositional a @66
+                  type: int
+                requiredPositional b @76
+                  type: String
+''');
+  }
+
+  test_class_constructor_initializers_thisInvocation_namedExpression() async {
+    var library = await buildLibrary('''
+class C {
+  const C() : this.named(1, b: 2);
+  const C.named(a, {int b});
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const @18
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                RedirectingConstructorInvocation
+                  thisKeyword: this @24
+                  period: . @28
+                  constructorName: SimpleIdentifier
+                    token: named @29
+                    staticElement: <testLibraryFragment>::@class::C::@constructor::named
+                    staticType: null
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @34
+                    arguments
+                      IntegerLiteral
+                        literal: 1 @35
+                        staticType: int
+                      NamedExpression
+                        name: Label
+                          label: SimpleIdentifier
+                            token: b @38
+                            staticElement: <testLibraryFragment>::@class::C::@constructor::named::@parameter::b
+                            staticType: null
+                          colon: : @39
+                        expression: IntegerLiteral
+                          literal: 2 @41
+                          staticType: int
+                    rightParenthesis: ) @42
+                  staticElement: <testLibraryFragment>::@class::C::@constructor::named
+              redirectedConstructor: <testLibraryFragment>::@class::C::@constructor::named
+            const named @55
+              reference: <testLibraryFragment>::@class::C::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 54
+              nameEnd: 60
+              parameters
+                requiredPositional a @61
+                  type: dynamic
+                optionalNamed default b @69
+                  reference: <testLibraryFragment>::@class::C::@constructor::named::@parameter::b
+                  type: int
+''');
+  }
+
+  test_class_constructor_initializers_thisInvocation_unnamed() async {
+    var library = await buildLibrary('''
+class C {
+  const C.named() : this(1, 'bbb');
+  const C(int a, String b);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const named @20
+              reference: <testLibraryFragment>::@class::C::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 19
+              nameEnd: 25
+              constantInitializers
+                RedirectingConstructorInvocation
+                  thisKeyword: this @30
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @34
+                    arguments
+                      IntegerLiteral
+                        literal: 1 @35
+                        staticType: int
+                      SimpleStringLiteral
+                        literal: 'bbb' @38
+                    rightParenthesis: ) @43
+                  staticElement: <testLibraryFragment>::@class::C::@constructor::new
+              redirectedConstructor: <testLibraryFragment>::@class::C::@constructor::new
+            const @54
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional a @60
+                  type: int
+                requiredPositional b @70
+                  type: String
+''');
+  }
+
+  test_class_constructor_parameters_super_explicitType_function() async {
+    var library = await buildLibrary('''
+class A {
+  A(Object? a);
+}
+
+class B extends A {
+  B(int super.a<T extends num>(T d)?);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @12
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional a @22
+                  type: Object?
+        class B @35
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            @51
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                requiredPositional final super.a @63
+                  type: int Function<T extends num>(T)?
+                  typeParameters
+                    covariant T @65
+                      bound: num
+                  parameters
+                    requiredPositional d @82
+                      type: T
+                  superConstructorParameter: <testLibraryFragment>::@class::A::@constructor::new::@parameter::a
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_constructor_parameters_super_explicitType_interface() async {
+    var library = await buildLibrary('''
+class A {
+  A(num a);
+}
+
+class B extends A {
+  B(int super.a);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @12
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional a @18
+                  type: num
+        class B @31
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            @47
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                requiredPositional final super.a @59
+                  type: int
+                  superConstructorParameter: <testLibraryFragment>::@class::A::@constructor::new::@parameter::a
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_constructor_parameters_super_explicitType_interface_nullable() async {
+    var library = await buildLibrary('''
+class A {
+  A(num? a);
+}
+
+class B extends A {
+  B(int? super.a);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @12
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional a @19
+                  type: num?
+        class B @32
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            @48
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                requiredPositional final super.a @61
+                  type: int?
+                  superConstructorParameter: <testLibraryFragment>::@class::A::@constructor::new::@parameter::a
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_constructor_parameters_super_invalid_topFunction() async {
+    var library = await buildLibrary('''
+void f(super.a) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        f @5
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional final super.a @13
+              type: dynamic
+              superConstructorParameter: <null>
+          returnType: void
+''');
+  }
+
+  test_class_constructor_parameters_super_optionalNamed() async {
+    var library = await buildLibrary('''
+class A {
+  A({required int a, required double b});
+}
+
+class B extends A {
+  B({String o1, super.a, String o2, super.b}) : super();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @12
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredNamed default a @28
+                  reference: <testLibraryFragment>::@class::A::@constructor::new::@parameter::a
+                  type: int
+                requiredNamed default b @47
+                  reference: <testLibraryFragment>::@class::A::@constructor::new::@parameter::b
+                  type: double
+        class B @61
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            @77
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                optionalNamed default o1 @87
+                  reference: <testLibraryFragment>::@class::B::@constructor::new::@parameter::o1
+                  type: String
+                optionalNamed default final super.a @97
+                  reference: <testLibraryFragment>::@class::B::@constructor::new::@parameter::a
+                  type: int
+                  superConstructorParameter: <testLibraryFragment>::@class::A::@constructor::new::@parameter::a
+                optionalNamed default o2 @107
+                  reference: <testLibraryFragment>::@class::B::@constructor::new::@parameter::o2
+                  type: String
+                optionalNamed default final super.b @117
+                  reference: <testLibraryFragment>::@class::B::@constructor::new::@parameter::b
+                  type: double
+                  superConstructorParameter: <testLibraryFragment>::@class::A::@constructor::new::@parameter::b
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_constructor_parameters_super_optionalNamed_defaultValue() async {
+    var library = await buildLibrary('''
+class A {
+  A({int a = 0});
+}
+
+class B extends A {
+  B({super.a});
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @12
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                optionalNamed default a @19
+                  reference: <testLibraryFragment>::@class::A::@constructor::new::@parameter::a
+                  type: int
+                  constantInitializer
+                    IntegerLiteral
+                      literal: 0 @23
+                      staticType: int
+        class B @37
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            @53
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                optionalNamed default final hasDefaultValue super.a @62
+                  reference: <testLibraryFragment>::@class::B::@constructor::new::@parameter::a
+                  type: int
+                  superConstructorParameter: <testLibraryFragment>::@class::A::@constructor::new::@parameter::a
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_constructor_parameters_super_optionalNamed_unresolved() async {
+    var library = await buildLibrary('''
+class A {
+  A({required int a});
+}
+
+class B extends A {
+  B({super.b});
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @12
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredNamed default a @28
+                  reference: <testLibraryFragment>::@class::A::@constructor::new::@parameter::a
+                  type: int
+        class B @42
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            @58
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                optionalNamed default final super.b @67
+                  reference: <testLibraryFragment>::@class::B::@constructor::new::@parameter::b
+                  type: dynamic
+                  superConstructorParameter: <null>
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_constructor_parameters_super_optionalNamed_unresolved2() async {
+    var library = await buildLibrary('''
+class A {
+  A(int a);
+}
+
+class B extends A {
+  B({super.a});
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @12
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional a @18
+                  type: int
+        class B @31
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            @47
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                optionalNamed default final super.a @56
+                  reference: <testLibraryFragment>::@class::B::@constructor::new::@parameter::a
+                  type: dynamic
+                  superConstructorParameter: <null>
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_constructor_parameters_super_optionalPositional() async {
+    var library = await buildLibrary('''
+class A {
+  A(int a, double b);
+}
+
+class B extends A {
+  B([String o1, super.a, String o2, super.b]) : super();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @12
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional a @18
+                  type: int
+                requiredPositional b @28
+                  type: double
+        class B @41
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            @57
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                optionalPositional default o1 @67
+                  type: String
+                optionalPositional default final super.a @77
+                  type: int
+                  superConstructorParameter: <testLibraryFragment>::@class::A::@constructor::new::@parameter::a
+                optionalPositional default o2 @87
+                  type: String
+                optionalPositional default final super.b @97
+                  type: double
+                  superConstructorParameter: <testLibraryFragment>::@class::A::@constructor::new::@parameter::b
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_constructor_parameters_super_requiredNamed() async {
+    var library = await buildLibrary('''
+class A {
+  A({required int a, required double b});
+}
+
+class B extends A {
+  B({
+    required String o1,
+    required super.a,
+    required String o2,
+    required super.b,
+  }) : super();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @12
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredNamed default a @28
+                  reference: <testLibraryFragment>::@class::A::@constructor::new::@parameter::a
+                  type: int
+                requiredNamed default b @47
+                  reference: <testLibraryFragment>::@class::A::@constructor::new::@parameter::b
+                  type: double
+        class B @61
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            @77
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                requiredNamed default o1 @101
+                  reference: <testLibraryFragment>::@class::B::@constructor::new::@parameter::o1
+                  type: String
+                requiredNamed default final super.a @124
+                  reference: <testLibraryFragment>::@class::B::@constructor::new::@parameter::a
+                  type: int
+                  superConstructorParameter: <testLibraryFragment>::@class::A::@constructor::new::@parameter::a
+                requiredNamed default o2 @147
+                  reference: <testLibraryFragment>::@class::B::@constructor::new::@parameter::o2
+                  type: String
+                requiredNamed default final super.b @170
+                  reference: <testLibraryFragment>::@class::B::@constructor::new::@parameter::b
+                  type: double
+                  superConstructorParameter: <testLibraryFragment>::@class::A::@constructor::new::@parameter::b
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_constructor_parameters_super_requiredNamed_defaultValue() async {
+    var library = await buildLibrary('''
+class A {
+  A({int a = 0});
+}
+
+class B extends A {
+  B({required super.a});
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @12
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                optionalNamed default a @19
+                  reference: <testLibraryFragment>::@class::A::@constructor::new::@parameter::a
+                  type: int
+                  constantInitializer
+                    IntegerLiteral
+                      literal: 0 @23
+                      staticType: int
+        class B @37
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            @53
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                requiredNamed default final super.a @71
+                  reference: <testLibraryFragment>::@class::B::@constructor::new::@parameter::a
+                  type: int
+                  superConstructorParameter: <testLibraryFragment>::@class::A::@constructor::new::@parameter::a
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_constructor_parameters_super_requiredPositional() async {
+    var library = await buildLibrary('''
+class A {
+  A(int a, double b);
+}
+
+class B extends A {
+  B(String o1, super.a, String o2, super.b) : super();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @12
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional a @18
+                  type: int
+                requiredPositional b @28
+                  type: double
+        class B @41
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            @57
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                requiredPositional o1 @66
+                  type: String
+                requiredPositional final super.a @76
+                  type: int
+                  superConstructorParameter: <testLibraryFragment>::@class::A::@constructor::new::@parameter::a
+                requiredPositional o2 @86
+                  type: String
+                requiredPositional final super.b @96
+                  type: double
+                  superConstructorParameter: <testLibraryFragment>::@class::A::@constructor::new::@parameter::b
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_constructor_parameters_super_requiredPositional_inferenceOrder() async {
+    // It is important that `B` is declared after `C`, so that we check that
+    // inference happens in order - first `B`, then `C`.
+    var library = await buildLibrary('''
+abstract class A {
+  A(int a);
+}
+
+class C extends B {
+  C(super.a);
+}
+
+class B extends A {
+  B(super.a);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        abstract class A @15
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @21
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional a @27
+                  type: int
+        class C @40
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: B
+          constructors
+            @56
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional final super.a @64
+                  type: int
+                  superConstructorParameter: <testLibraryFragment>::@class::B::@constructor::new::@parameter::a
+              superConstructor: <testLibraryFragment>::@class::B::@constructor::new
+        class B @77
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            @93
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                requiredPositional final super.a @101
+                  type: int
+                  superConstructorParameter: <testLibraryFragment>::@class::A::@constructor::new::@parameter::a
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_constructor_parameters_super_requiredPositional_inferenceOrder_generic() async {
+    // It is important that `C` is declared before `B`, so that we check that
+    // inference happens in order - first `B`, then `C`.
+    var library = await buildLibrary('''
+class A {
+  A(int a);
+}
+
+class C extends B<String> {
+  C(super.a);
+}
+
+class B<T> extends A {
+  B(super.a);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @12
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional a @18
+                  type: int
+        class C @31
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: B<String>
+          constructors
+            @55
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional final super.a @63
+                  type: int
+                  superConstructorParameter: SuperFormalParameterMember
+                    base: <testLibraryFragment>::@class::B::@constructor::new::@parameter::a
+                    substitution: {T: String}
+              superConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::B::@constructor::new
+                substitution: {T: String}
+        class B @76
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @78
+              defaultType: dynamic
+          supertype: A
+          constructors
+            @95
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                requiredPositional final super.a @103
+                  type: int
+                  superConstructorParameter: <testLibraryFragment>::@class::A::@constructor::new::@parameter::a
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_constructor_parameters_super_requiredPositional_unresolved() async {
+    var library = await buildLibrary('''
+class A {}
+
+class B extends A {
+  B(super.a);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class B @18
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            @34
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                requiredPositional final super.a @42
+                  type: dynamic
+                  superConstructorParameter: <null>
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_constructor_parameters_super_requiredPositional_unresolved2() async {
+    var library = await buildLibrary('''
+class A {
+  A({required int a})
+}
+
+class B extends A {
+  B(super.a);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @12
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredNamed default a @28
+                  reference: <testLibraryFragment>::@class::A::@constructor::new::@parameter::a
+                  type: int
+        class B @41
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            @57
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                requiredPositional final super.a @65
+                  type: dynamic
+                  superConstructorParameter: <null>
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_constructor_params() async {
+    var library = await buildLibrary('class C { C(x, int y); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @10
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional x @12
+                  type: dynamic
+                requiredPositional y @19
+                  type: int
+''');
+  }
+
+  test_class_constructor_redirected_factory_named() async {
+    var library = await buildLibrary('''
+class C {
+  factory C() = D.named;
+  C._();
+}
+class D extends C {
+  D.named() : super._();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            factory @20
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              redirectedConstructor: <testLibraryFragment>::@class::D::@constructor::named
+            _ @39
+              reference: <testLibraryFragment>::@class::C::@constructor::_
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 38
+              nameEnd: 40
+        class D @52
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          supertype: C
+          constructors
+            named @70
+              reference: <testLibraryFragment>::@class::D::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::D
+              periodOffset: 69
+              nameEnd: 75
+              superConstructor: <testLibraryFragment>::@class::C::@constructor::_
+''');
+  }
+
+  test_class_constructor_redirected_factory_named_generic() async {
+    var library = await buildLibrary('''
+class C<T, U> {
+  factory C() = D<U, T>.named;
+  C._();
+}
+class D<T, U> extends C<U, T> {
+  D.named() : super._();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+            covariant U @11
+              defaultType: dynamic
+          constructors
+            factory @26
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              redirectedConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::D::@constructor::named
+                substitution: {T: U, U: T}
+            _ @51
+              reference: <testLibraryFragment>::@class::C::@constructor::_
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 50
+              nameEnd: 52
+        class D @64
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @66
+              defaultType: dynamic
+            covariant U @69
+              defaultType: dynamic
+          supertype: C<U, T>
+          constructors
+            named @94
+              reference: <testLibraryFragment>::@class::D::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::D
+              periodOffset: 93
+              nameEnd: 99
+              superConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::C::@constructor::_
+                substitution: {T: U, U: T}
+''');
+  }
+
+  test_class_constructor_redirected_factory_named_generic_viaTypeAlias() async {
+    var library = await buildLibrary('''
+typedef A<T, U> = C<T, U>;
+class B<T, U> {
+  factory B() = A<U, T>.named;
+  B._();
+}
+class C<T, U> extends A<U, T> {
+  C.named() : super._();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class B @33
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @35
+              defaultType: dynamic
+            covariant U @38
+              defaultType: dynamic
+          constructors
+            factory @53
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              redirectedConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::C::@constructor::named
+                substitution: {T: U, U: T}
+            _ @78
+              reference: <testLibraryFragment>::@class::B::@constructor::_
+              enclosingElement: <testLibraryFragment>::@class::B
+              periodOffset: 77
+              nameEnd: 79
+        class C @91
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @93
+              defaultType: dynamic
+            covariant U @96
+              defaultType: dynamic
+          supertype: C<U, T>
+            alias: <testLibraryFragment>::@typeAlias::A
+              typeArguments
+                U
+                T
+          constructors
+            named @121
+              reference: <testLibraryFragment>::@class::C::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 120
+              nameEnd: 126
+      typeAliases
+        A @8
+          reference: <testLibraryFragment>::@typeAlias::A
+          typeParameters
+            covariant T @10
+              defaultType: dynamic
+            covariant U @13
+              defaultType: dynamic
+          aliasedType: C<T, U>
+''');
+  }
+
+  test_class_constructor_redirected_factory_named_imported() async {
+    addSource('$testPackageLibPath/foo.dart', '''
+import 'test.dart';
+class D extends C {
+  D.named() : super._();
+}
+''');
+    var library = await buildLibrary('''
+import 'foo.dart';
+class C {
+  factory C() = D.named;
+  C._();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @25
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            factory @39
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              redirectedConstructor: package:test/foo.dart::<fragment>::@class::D::@constructor::named
+            _ @58
+              reference: <testLibraryFragment>::@class::C::@constructor::_
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 57
+              nameEnd: 59
+''');
+  }
+
+  test_class_constructor_redirected_factory_named_imported_generic() async {
+    addSource('$testPackageLibPath/foo.dart', '''
+import 'test.dart';
+class D<T, U> extends C<U, T> {
+  D.named() : super._();
+}
+''');
+    var library = await buildLibrary('''
+import 'foo.dart';
+class C<T, U> {
+  factory C() = D<U, T>.named;
+  C._();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @25
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @27
+              defaultType: dynamic
+            covariant U @30
+              defaultType: dynamic
+          constructors
+            factory @45
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              redirectedConstructor: ConstructorMember
+                base: package:test/foo.dart::<fragment>::@class::D::@constructor::named
+                substitution: {T: U, U: T}
+            _ @70
+              reference: <testLibraryFragment>::@class::C::@constructor::_
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 69
+              nameEnd: 71
+''');
+  }
+
+  test_class_constructor_redirected_factory_named_prefixed() async {
+    addSource('$testPackageLibPath/foo.dart', '''
+import 'test.dart';
+class D extends C {
+  D.named() : super._();
+}
+''');
+    var library = await buildLibrary('''
+import 'foo.dart' as foo;
+class C {
+  factory C() = foo.D.named;
+  C._();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo.dart as foo @21
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    foo @21
+      reference: <testLibraryFragment>::@prefix::foo
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo.dart as foo @21
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        foo @21
+          reference: <testLibraryFragment>::@prefix::foo
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @32
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            factory @46
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              redirectedConstructor: package:test/foo.dart::<fragment>::@class::D::@constructor::named
+            _ @69
+              reference: <testLibraryFragment>::@class::C::@constructor::_
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 68
+              nameEnd: 70
+''');
+  }
+
+  test_class_constructor_redirected_factory_named_prefixed_generic() async {
+    addSource('$testPackageLibPath/foo.dart', '''
+import 'test.dart';
+class D<T, U> extends C<U, T> {
+  D.named() : super._();
+}
+''');
+    var library = await buildLibrary('''
+import 'foo.dart' as foo;
+class C<T, U> {
+  factory C() = foo.D<U, T>.named;
+  C._();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo.dart as foo @21
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    foo @21
+      reference: <testLibraryFragment>::@prefix::foo
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo.dart as foo @21
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        foo @21
+          reference: <testLibraryFragment>::@prefix::foo
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @32
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @34
+              defaultType: dynamic
+            covariant U @37
+              defaultType: dynamic
+          constructors
+            factory @52
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              redirectedConstructor: ConstructorMember
+                base: package:test/foo.dart::<fragment>::@class::D::@constructor::named
+                substitution: {T: U, U: T}
+            _ @81
+              reference: <testLibraryFragment>::@class::C::@constructor::_
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 80
+              nameEnd: 82
+''');
+  }
+
+  test_class_constructor_redirected_factory_named_unresolved_class() async {
+    var library = await buildLibrary('''
+class C<E> {
+  factory C() = D.named<E>;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant E @8
+              defaultType: dynamic
+          constructors
+            factory @23
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_constructor_redirected_factory_named_unresolved_constructor() async {
+    var library = await buildLibrary('''
+class D {}
+class C<E> {
+  factory C() = D.named<E>;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class D @6
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+        class C @17
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant E @19
+              defaultType: dynamic
+          constructors
+            factory @34
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_constructor_redirected_factory_unnamed() async {
+    var library = await buildLibrary('''
+class C {
+  factory C() = D;
+  C._();
+}
+class D extends C {
+  D() : super._();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            factory @20
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              redirectedConstructor: <testLibraryFragment>::@class::D::@constructor::new
+            _ @33
+              reference: <testLibraryFragment>::@class::C::@constructor::_
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 32
+              nameEnd: 34
+        class D @46
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          supertype: C
+          constructors
+            @62
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+              superConstructor: <testLibraryFragment>::@class::C::@constructor::_
+''');
+  }
+
+  test_class_constructor_redirected_factory_unnamed_generic() async {
+    var library = await buildLibrary('''
+class C<T, U> {
+  factory C() = D<U, T>;
+  C._();
+}
+class D<T, U> extends C<U, T> {
+  D() : super._();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+            covariant U @11
+              defaultType: dynamic
+          constructors
+            factory @26
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              redirectedConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::D::@constructor::new
+                substitution: {T: U, U: T}
+            _ @45
+              reference: <testLibraryFragment>::@class::C::@constructor::_
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 44
+              nameEnd: 46
+        class D @58
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @60
+              defaultType: dynamic
+            covariant U @63
+              defaultType: dynamic
+          supertype: C<U, T>
+          constructors
+            @86
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+              superConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::C::@constructor::_
+                substitution: {T: U, U: T}
+''');
+  }
+
+  test_class_constructor_redirected_factory_unnamed_generic_viaTypeAlias() async {
+    var library = await buildLibrary('''
+typedef A<T, U> = C<T, U>;
+class B<T, U> {
+  factory B() = A<U, T>;
+  B_();
+}
+class C<T, U> extends B<U, T> {
+  C() : super._();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class B @33
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @35
+              defaultType: dynamic
+            covariant U @38
+              defaultType: dynamic
+          constructors
+            factory @53
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              redirectedConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::C::@constructor::new
+                substitution: {T: U, U: T}
+          methods
+            abstract B_ @70
+              reference: <testLibraryFragment>::@class::B::@method::B_
+              enclosingElement: <testLibraryFragment>::@class::B
+              returnType: dynamic
+        class C @84
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @86
+              defaultType: dynamic
+            covariant U @89
+              defaultType: dynamic
+          supertype: B<U, T>
+          constructors
+            @112
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+      typeAliases
+        A @8
+          reference: <testLibraryFragment>::@typeAlias::A
+          typeParameters
+            covariant T @10
+              defaultType: dynamic
+            covariant U @13
+              defaultType: dynamic
+          aliasedType: C<T, U>
+''');
+  }
+
+  test_class_constructor_redirected_factory_unnamed_imported() async {
+    addSource('$testPackageLibPath/foo.dart', '''
+import 'test.dart';
+class D extends C {
+  D() : super._();
+}
+''');
+    var library = await buildLibrary('''
+import 'foo.dart';
+class C {
+  factory C() = D;
+  C._();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @25
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            factory @39
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              redirectedConstructor: package:test/foo.dart::<fragment>::@class::D::@constructor::new
+            _ @52
+              reference: <testLibraryFragment>::@class::C::@constructor::_
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 51
+              nameEnd: 53
+''');
+  }
+
+  test_class_constructor_redirected_factory_unnamed_imported_generic() async {
+    addSource('$testPackageLibPath/foo.dart', '''
+import 'test.dart';
+class D<T, U> extends C<U, T> {
+  D() : super._();
+}
+''');
+    var library = await buildLibrary('''
+import 'foo.dart';
+class C<T, U> {
+  factory C() = D<U, T>;
+  C._();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @25
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @27
+              defaultType: dynamic
+            covariant U @30
+              defaultType: dynamic
+          constructors
+            factory @45
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              redirectedConstructor: ConstructorMember
+                base: package:test/foo.dart::<fragment>::@class::D::@constructor::new
+                substitution: {T: U, U: T}
+            _ @64
+              reference: <testLibraryFragment>::@class::C::@constructor::_
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 63
+              nameEnd: 65
+''');
+  }
+
+  test_class_constructor_redirected_factory_unnamed_imported_viaTypeAlias() async {
+    addSource('$testPackageLibPath/foo.dart', '''
+import 'test.dart';
+typedef A = B;
+class B extends C {
+  B() : super._();
+}
+''');
+    var library = await buildLibrary('''
+import 'foo.dart';
+class C {
+  factory C() = A;
+  C._();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @25
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            factory @39
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              redirectedConstructor: package:test/foo.dart::<fragment>::@class::B::@constructor::new
+            _ @52
+              reference: <testLibraryFragment>::@class::C::@constructor::_
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 51
+              nameEnd: 53
+''');
+  }
+
+  test_class_constructor_redirected_factory_unnamed_prefixed() async {
+    addSource('$testPackageLibPath/foo.dart', '''
+import 'test.dart';
+class D extends C {
+  D() : super._();
+}
+''');
+    var library = await buildLibrary('''
+import 'foo.dart' as foo;
+class C {
+  factory C() = foo.D;
+  C._();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo.dart as foo @21
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    foo @21
+      reference: <testLibraryFragment>::@prefix::foo
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo.dart as foo @21
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        foo @21
+          reference: <testLibraryFragment>::@prefix::foo
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @32
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            factory @46
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              redirectedConstructor: package:test/foo.dart::<fragment>::@class::D::@constructor::new
+            _ @63
+              reference: <testLibraryFragment>::@class::C::@constructor::_
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 62
+              nameEnd: 64
+''');
+  }
+
+  test_class_constructor_redirected_factory_unnamed_prefixed_generic() async {
+    addSource('$testPackageLibPath/foo.dart', '''
+import 'test.dart';
+class D<T, U> extends C<U, T> {
+  D() : super._();
+}
+''');
+    var library = await buildLibrary('''
+import 'foo.dart' as foo;
+class C<T, U> {
+  factory C() = foo.D<U, T>;
+  C._();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo.dart as foo @21
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    foo @21
+      reference: <testLibraryFragment>::@prefix::foo
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo.dart as foo @21
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        foo @21
+          reference: <testLibraryFragment>::@prefix::foo
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @32
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @34
+              defaultType: dynamic
+            covariant U @37
+              defaultType: dynamic
+          constructors
+            factory @52
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              redirectedConstructor: ConstructorMember
+                base: package:test/foo.dart::<fragment>::@class::D::@constructor::new
+                substitution: {T: U, U: T}
+            _ @75
+              reference: <testLibraryFragment>::@class::C::@constructor::_
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 74
+              nameEnd: 76
+''');
+  }
+
+  test_class_constructor_redirected_factory_unnamed_prefixed_viaTypeAlias() async {
+    addSource('$testPackageLibPath/foo.dart', '''
+import 'test.dart';
+typedef A = B;
+class B extends C {
+  B() : super._();
+}
+''');
+    var library = await buildLibrary('''
+import 'foo.dart' as foo;
+class C {
+  factory C() = foo.A;
+  C._();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo.dart as foo @21
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    foo @21
+      reference: <testLibraryFragment>::@prefix::foo
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo.dart as foo @21
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        foo @21
+          reference: <testLibraryFragment>::@prefix::foo
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @32
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            factory @46
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              redirectedConstructor: package:test/foo.dart::<fragment>::@class::B::@constructor::new
+            _ @63
+              reference: <testLibraryFragment>::@class::C::@constructor::_
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 62
+              nameEnd: 64
+''');
+  }
+
+  test_class_constructor_redirected_factory_unnamed_unresolved() async {
+    var library = await buildLibrary('''
+class C<E> {
+  factory C() = D<E>;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant E @8
+              defaultType: dynamic
+          constructors
+            factory @23
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_constructor_redirected_factory_unnamed_viaTypeAlias() async {
+    var library = await buildLibrary('''
+typedef A = C;
+class B {
+  factory B() = A;
+  B._();
+}
+class C extends B {
+  C() : super._();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class B @21
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          constructors
+            factory @35
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              redirectedConstructor: <testLibraryFragment>::@class::C::@constructor::new
+            _ @48
+              reference: <testLibraryFragment>::@class::B::@constructor::_
+              enclosingElement: <testLibraryFragment>::@class::B
+              periodOffset: 47
+              nameEnd: 49
+        class C @61
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: B
+          constructors
+            @77
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              superConstructor: <testLibraryFragment>::@class::B::@constructor::_
+      typeAliases
+        A @8
+          reference: <testLibraryFragment>::@typeAlias::A
+          aliasedType: C
+''');
+  }
+
+  test_class_constructor_redirected_thisInvocation_named() async {
+    var library = await buildLibrary('''
+class C {
+  const C.named();
+  const C() : this.named();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const named @20
+              reference: <testLibraryFragment>::@class::C::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 19
+              nameEnd: 25
+            const @37
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                RedirectingConstructorInvocation
+                  thisKeyword: this @43
+                  period: . @47
+                  constructorName: SimpleIdentifier
+                    token: named @48
+                    staticElement: <testLibraryFragment>::@class::C::@constructor::named
+                    staticType: null
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @53
+                    rightParenthesis: ) @54
+                  staticElement: <testLibraryFragment>::@class::C::@constructor::named
+              redirectedConstructor: <testLibraryFragment>::@class::C::@constructor::named
+''');
+  }
+
+  test_class_constructor_redirected_thisInvocation_named_generic() async {
+    var library = await buildLibrary('''
+class C<T> {
+  const C.named();
+  const C() : this.named();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            const named @23
+              reference: <testLibraryFragment>::@class::C::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 22
+              nameEnd: 28
+            const @40
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                RedirectingConstructorInvocation
+                  thisKeyword: this @46
+                  period: . @50
+                  constructorName: SimpleIdentifier
+                    token: named @51
+                    staticElement: <testLibraryFragment>::@class::C::@constructor::named
+                    staticType: null
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @56
+                    rightParenthesis: ) @57
+                  staticElement: <testLibraryFragment>::@class::C::@constructor::named
+              redirectedConstructor: <testLibraryFragment>::@class::C::@constructor::named
+''');
+  }
+
+  test_class_constructor_redirected_thisInvocation_named_notConst() async {
+    var library = await buildLibrary('''
+class C {
+  C.named();
+  C() : this.named();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            named @14
+              reference: <testLibraryFragment>::@class::C::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 13
+              nameEnd: 19
+            @25
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              redirectedConstructor: <testLibraryFragment>::@class::C::@constructor::named
+''');
+  }
+
+  test_class_constructor_redirected_thisInvocation_unnamed() async {
+    var library = await buildLibrary('''
+class C {
+  const C();
+  const C.named() : this();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const @18
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+            const named @33
+              reference: <testLibraryFragment>::@class::C::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 32
+              nameEnd: 38
+              constantInitializers
+                RedirectingConstructorInvocation
+                  thisKeyword: this @43
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @47
+                    rightParenthesis: ) @48
+                  staticElement: <testLibraryFragment>::@class::C::@constructor::new
+              redirectedConstructor: <testLibraryFragment>::@class::C::@constructor::new
+''');
+  }
+
+  test_class_constructor_redirected_thisInvocation_unnamed_generic() async {
+    var library = await buildLibrary('''
+class C<T> {
+  const C();
+  const C.named() : this();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            const @21
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+            const named @36
+              reference: <testLibraryFragment>::@class::C::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 35
+              nameEnd: 41
+              constantInitializers
+                RedirectingConstructorInvocation
+                  thisKeyword: this @46
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @50
+                    rightParenthesis: ) @51
+                  staticElement: <testLibraryFragment>::@class::C::@constructor::new
+              redirectedConstructor: <testLibraryFragment>::@class::C::@constructor::new
+''');
+  }
+
+  test_class_constructor_redirected_thisInvocation_unnamed_notConst() async {
+    var library = await buildLibrary('''
+class C {
+  C();
+  C.named() : this();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @12
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+            named @21
+              reference: <testLibraryFragment>::@class::C::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 20
+              nameEnd: 26
+              redirectedConstructor: <testLibraryFragment>::@class::C::@constructor::new
+''');
+  }
+
+  test_class_constructor_superConstructor_generic_named() async {
+    var library = await buildLibrary('''
+class A<T> {
+  A.named(T a);
+}
+class B extends A<int> {
+  B() : super.named(0);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            named @17
+              reference: <testLibraryFragment>::@class::A::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 16
+              nameEnd: 22
+              parameters
+                requiredPositional a @25
+                  type: T
+        class B @37
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A<int>
+          constructors
+            @58
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::A::@constructor::named
+                substitution: {T: int}
+''');
+  }
+
+  test_class_constructor_superConstructor_notGeneric_named() async {
+    var library = await buildLibrary('''
+class A {
+  A.named();
+}
+class B extends A {
+  B() : super.named();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            named @14
+              reference: <testLibraryFragment>::@class::A::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 13
+              nameEnd: 19
+        class B @31
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            @47
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::named
+''');
+  }
+
+  test_class_constructor_superConstructor_notGeneric_unnamed_explicit() async {
+    var library = await buildLibrary('''
+class A {}
+class B extends A {
+  B() : super();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class B @17
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            @33
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_constructor_superConstructor_notGeneric_unnamed_implicit() async {
+    var library = await buildLibrary('''
+class A {}
+class B extends A {
+  B();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class B @17
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            @33
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_constructor_superConstructor_notGeneric_unnamed_implicit2() async {
+    var library = await buildLibrary('''
+class A {}
+class B extends A {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class B @17
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_constructor_unnamed_implicit() async {
+    var library = await buildLibrary('class C {}');
+    configuration.withDisplayName = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              displayName: C
+''');
+  }
+
+  test_class_constructor_withCycles_const() async {
+    var library = await buildLibrary('''
+class C {
+  final x;
+  const C() : x = const D();
+}
+class D {
+  final x;
+  const D() : x = const C();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            final x @18
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            const @29
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                ConstructorFieldInitializer
+                  fieldName: SimpleIdentifier
+                    token: x @35
+                    staticElement: <testLibraryFragment>::@class::C::@field::x
+                    staticType: null
+                  equals: = @37
+                  expression: InstanceCreationExpression
+                    keyword: const @39
+                    constructorName: ConstructorName
+                      type: NamedType
+                        name: D @45
+                        element: <testLibraryFragment>::@class::D
+                        type: D
+                      staticElement: <testLibraryFragment>::@class::D::@constructor::new
+                    argumentList: ArgumentList
+                      leftParenthesis: ( @46
+                      rightParenthesis: ) @47
+                    staticType: D
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+        class D @58
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          fields
+            final x @70
+              reference: <testLibraryFragment>::@class::D::@field::x
+              enclosingElement: <testLibraryFragment>::@class::D
+              type: dynamic
+          constructors
+            const @81
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+              constantInitializers
+                ConstructorFieldInitializer
+                  fieldName: SimpleIdentifier
+                    token: x @87
+                    staticElement: <testLibraryFragment>::@class::D::@field::x
+                    staticType: null
+                  equals: = @89
+                  expression: InstanceCreationExpression
+                    keyword: const @91
+                    constructorName: ConstructorName
+                      type: NamedType
+                        name: C @97
+                        element: <testLibraryFragment>::@class::C
+                        type: C
+                      staticElement: <testLibraryFragment>::@class::C::@constructor::new
+                    argumentList: ArgumentList
+                      leftParenthesis: ( @98
+                      rightParenthesis: ) @99
+                    staticType: C
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::D::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::D
+              returnType: dynamic
+''');
+  }
+
+  test_class_constructor_withCycles_nonConst() async {
+    var library = await buildLibrary('''
+class C {
+  final x;
+  C() : x = new D();
+}
+class D {
+  final x;
+  D() : x = new C();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            final x @18
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            @23
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+        class D @50
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          fields
+            final x @62
+              reference: <testLibraryFragment>::@class::D::@field::x
+              enclosingElement: <testLibraryFragment>::@class::D
+              type: dynamic
+          constructors
+            @67
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::D::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::D
+              returnType: dynamic
+''');
+  }
+
+  test_class_constructors_named() async {
+    var library = await buildLibrary('''
+class C {
+  C.foo();
+}
+''');
+    configuration.withDisplayName = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            foo @14
+              reference: <testLibraryFragment>::@class::C::@constructor::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              displayName: C.foo
+              periodOffset: 13
+              nameEnd: 17
+''');
+  }
+
+  test_class_constructors_unnamed() async {
+    var library = await buildLibrary('''
+class C {
+  C();
+}
+''');
+    configuration.withDisplayName = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @12
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              displayName: C
+''');
+  }
+
+  test_class_constructors_unnamed_new() async {
+    var library = await buildLibrary('''
+class C {
+  C.new();
+}
+''');
+    configuration.withDisplayName = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @14
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              displayName: C
+              periodOffset: 13
+              nameEnd: 17
+''');
+  }
+
+  test_class_documented() async {
+    var library = await buildLibrary('''
+/**
+ * Docs
+ */
+class C {}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @22
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /**\n * Docs\n */
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_documented_mix() async {
+    var library = await buildLibrary('''
+/**
+ * aaa
+ */
+/**
+ * bbb
+ */
+class A {}
+
+/**
+ * aaa
+ */
+/// bbb
+/// ccc
+class B {}
+
+/// aaa
+/// bbb
+/**
+ * ccc
+ */
+class C {}
+
+/// aaa
+/// bbb
+/**
+ * ccc
+ */
+/// ddd
+class D {}
+
+/**
+ * aaa
+ */
+// bbb
+class E {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @36
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /**\n * bbb\n */
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class B @79
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// bbb\n/// ccc
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+        class C @122
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /**\n * ccc\n */
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+        class D @173
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// ddd
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+        class E @207
+          reference: <testLibraryFragment>::@class::E
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /**\n * aaa\n */
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::E
+''');
+  }
+
+  test_class_documented_tripleSlash() async {
+    var library = await buildLibrary('''
+/// first
+/// second
+/// third
+class C {}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @37
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// first\n/// second\n/// third
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_documented_with_references() async {
+    var library = await buildLibrary('''
+/**
+ * Docs referring to [D] and [E]
+ */
+class C {}
+
+class D {}
+class E {}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @47
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /**\n * Docs referring to [D] and [E]\n */
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+        class D @59
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+        class E @70
+          reference: <testLibraryFragment>::@class::E
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::E
+''');
+  }
+
+  test_class_documented_with_windows_line_endings() async {
+    var library = await buildLibrary('/**\r\n * Docs\r\n */\r\nclass C {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @25
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /**\n * Docs\n */
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_documented_withLeadingNotDocumentation() async {
+    var library = await buildLibrary('''
+// Extra comment so doc comment offset != 0
+/**
+ * Docs
+ */
+class C {}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @66
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /**\n * Docs\n */
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_documented_withMetadata() async {
+    var library = await buildLibrary('''
+/// Comment 1
+/// Comment 2
+@Annotation()
+class BeforeMeta {}
+
+/// Comment 1
+/// Comment 2
+@Annotation.named()
+class BeforeMetaNamed {}
+
+@Annotation()
+/// Comment 1
+/// Comment 2
+class AfterMeta {}
+
+/// Comment 1
+@Annotation()
+/// Comment 2
+class AroundMeta {}
+
+/// Doc comment.
+@Annotation()
+// Not doc comment.
+class DocBeforeMetaNotDocAfter {}
+
+class Annotation {
+  const Annotation();
+  const Annotation.named();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class BeforeMeta @48
+          reference: <testLibraryFragment>::@class::BeforeMeta
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 1\n/// Comment 2
+          metadata
+            Annotation
+              atSign: @ @28
+              name: SimpleIdentifier
+                token: Annotation @29
+                staticElement: <testLibraryFragment>::@class::Annotation
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @39
+                rightParenthesis: ) @40
+              element: <testLibraryFragment>::@class::Annotation::@constructor::new
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::BeforeMeta::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::BeforeMeta
+        class BeforeMetaNamed @117
+          reference: <testLibraryFragment>::@class::BeforeMetaNamed
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 1\n/// Comment 2
+          metadata
+            Annotation
+              atSign: @ @91
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: Annotation @92
+                  staticElement: <testLibraryFragment>::@class::Annotation
+                  staticType: null
+                period: . @102
+                identifier: SimpleIdentifier
+                  token: named @103
+                  staticElement: <testLibraryFragment>::@class::Annotation::@constructor::named
+                  staticType: null
+                staticElement: <testLibraryFragment>::@class::Annotation::@constructor::named
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @108
+                rightParenthesis: ) @109
+              element: <testLibraryFragment>::@class::Annotation::@constructor::named
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::BeforeMetaNamed::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::BeforeMetaNamed
+        class AfterMeta @185
+          reference: <testLibraryFragment>::@class::AfterMeta
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 1\n/// Comment 2
+          metadata
+            Annotation
+              atSign: @ @137
+              name: SimpleIdentifier
+                token: Annotation @138
+                staticElement: <testLibraryFragment>::@class::Annotation
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @148
+                rightParenthesis: ) @149
+              element: <testLibraryFragment>::@class::Annotation::@constructor::new
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::AfterMeta::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::AfterMeta
+        class AroundMeta @247
+          reference: <testLibraryFragment>::@class::AroundMeta
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 2
+          metadata
+            Annotation
+              atSign: @ @213
+              name: SimpleIdentifier
+                token: Annotation @214
+                staticElement: <testLibraryFragment>::@class::Annotation
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @224
+                rightParenthesis: ) @225
+              element: <testLibraryFragment>::@class::Annotation::@constructor::new
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::AroundMeta::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::AroundMeta
+        class DocBeforeMetaNotDocAfter @319
+          reference: <testLibraryFragment>::@class::DocBeforeMetaNotDocAfter
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Doc comment.
+          metadata
+            Annotation
+              atSign: @ @279
+              name: SimpleIdentifier
+                token: Annotation @280
+                staticElement: <testLibraryFragment>::@class::Annotation
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @290
+                rightParenthesis: ) @291
+              element: <testLibraryFragment>::@class::Annotation::@constructor::new
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::DocBeforeMetaNotDocAfter::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::DocBeforeMetaNotDocAfter
+        class Annotation @354
+          reference: <testLibraryFragment>::@class::Annotation
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const @375
+              reference: <testLibraryFragment>::@class::Annotation::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::Annotation
+            const named @408
+              reference: <testLibraryFragment>::@class::Annotation::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::Annotation
+              periodOffset: 407
+              nameEnd: 413
+''');
+  }
+
+  test_class_field_abstract() async {
+    var library = await buildLibrary('''
+abstract class C {
+  abstract int i;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        abstract class C @15
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            abstract i @34
+              reference: <testLibraryFragment>::@class::C::@field::i
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic abstract get i @-1
+              reference: <testLibraryFragment>::@class::C::@getter::i
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic abstract set i= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::i
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _i @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_field_const() async {
+    var library = await buildLibrary('class C { static const int i = 0; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            static const i @27
+              reference: <testLibraryFragment>::@class::C::@field::i
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: true
+              constantInitializer
+                IntegerLiteral
+                  literal: 0 @31
+                  staticType: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic static get i @-1
+              reference: <testLibraryFragment>::@class::C::@getter::i
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+''');
+  }
+
+  test_class_field_const_late() async {
+    var library =
+        await buildLibrary('class C { static late const int i = 0; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            static late const i @32
+              reference: <testLibraryFragment>::@class::C::@field::i
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: true
+              constantInitializer
+                IntegerLiteral
+                  literal: 0 @36
+                  staticType: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic static get i @-1
+              reference: <testLibraryFragment>::@class::C::@getter::i
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+''');
+  }
+
+  test_class_field_covariant() async {
+    var library = await buildLibrary('''
+class C {
+  covariant int x;
+}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            covariant x @26
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional covariant _x @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_field_documented() async {
+    var library = await buildLibrary('''
+class C {
+  /**
+   * Docs
+   */
+  var x;
+}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @38
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              documentationComment: /**\n   * Docs\n   */
+              type: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: dynamic
+              returnType: void
+''');
+  }
+
+  test_class_field_duplicate_getter() async {
+    var library = await buildLibrary('''
+class C {
+  int foo = 0;
+  int get foo => 0;
+}
+''');
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            foo @16
+              reference: <testLibraryFragment>::@class::C::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::C::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              id: field_1
+              getter: getter_1
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::C::@getter::foo::@def::0
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+            get foo @35
+              reference: <testLibraryFragment>::@class::C::@getter::foo::@def::1
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+              id: getter_1
+              variable: field_1
+''');
+  }
+
+  test_class_field_duplicate_setter() async {
+    var library = await buildLibrary('''
+class C {
+  int foo = 0;
+  set foo(int _) {}
+}
+''');
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            foo @16
+              reference: <testLibraryFragment>::@class::C::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::C::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              id: field_1
+              setter: setter_1
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::C::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::foo::@def::0
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+            set foo= @31
+              reference: <testLibraryFragment>::@class::C::@setter::foo::@def::1
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _ @39
+                  type: int
+              returnType: void
+              id: setter_1
+              variable: field_1
+''');
+  }
+
+  test_class_field_external() async {
+    var library = await buildLibrary('''
+abstract class C {
+  external int i;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        abstract class C @15
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            external i @34
+              reference: <testLibraryFragment>::@class::C::@field::i
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get i @-1
+              reference: <testLibraryFragment>::@class::C::@getter::i
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set i= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::i
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _i @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_field_final_hasInitializer_hasConstConstructor() async {
+    var library = await buildLibrary('''
+class C {
+  final x = 42;
+  const C();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            final x @18
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                IntegerLiteral
+                  literal: 42 @22
+                  staticType: int
+          constructors
+            const @34
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+''');
+  }
+
+  test_class_field_final_hasInitializer_hasConstConstructor_genericFunctionType() async {
+    var library = await buildLibrary('''
+class A<T> {
+  const A();
+}
+class B {
+  final f = const A<int Function(double a)>();
+  const B();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            const @21
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class B @34
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          fields
+            final f @46
+              reference: <testLibraryFragment>::@class::B::@field::f
+              enclosingElement: <testLibraryFragment>::@class::B
+              type: A<int Function(double)>
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  keyword: const @50
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: A @56
+                      typeArguments: TypeArgumentList
+                        leftBracket: < @57
+                        arguments
+                          GenericFunctionType
+                            returnType: NamedType
+                              name: int @58
+                              element: dart:core::<fragment>::@class::int
+                              type: int
+                            functionKeyword: Function @62
+                            parameters: FormalParameterList
+                              leftParenthesis: ( @70
+                              parameter: SimpleFormalParameter
+                                type: NamedType
+                                  name: double @71
+                                  element: dart:core::<fragment>::@class::double
+                                  type: double
+                                name: a @78
+                                declaredElement: a@78
+                                  type: double
+                              rightParenthesis: ) @79
+                            declaredElement: GenericFunctionTypeElement
+                              parameters
+                                a
+                                  kind: required positional
+                                  type: double
+                              returnType: int
+                              type: int Function(double)
+                            type: int Function(double)
+                        rightBracket: > @80
+                      element: <testLibraryFragment>::@class::A
+                      type: A<int Function(double)>
+                    staticElement: ConstructorMember
+                      base: <testLibraryFragment>::@class::A::@constructor::new
+                      substitution: {T: int Function(double)}
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @81
+                    rightParenthesis: ) @82
+                  staticType: A<int Function(double)>
+          constructors
+            const @93
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+          accessors
+            synthetic get f @-1
+              reference: <testLibraryFragment>::@class::B::@getter::f
+              enclosingElement: <testLibraryFragment>::@class::B
+              returnType: A<int Function(double)>
+''');
+  }
+
+  test_class_field_final_hasInitializer_noConstConstructor() async {
+    var library = await buildLibrary('''
+class C {
+  final x = 42;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            final x @18
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: false
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+''');
+  }
+
+  test_class_field_final_withSetter() async {
+    var library = await buildLibrary(r'''
+class A {
+  final int foo;
+  A(this.foo);
+  set foo(int newValue) {}
+}
+''');
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            final foo @22
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+          constructors
+            @29
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional final this.foo @36
+                  type: int
+                  field: <testLibraryFragment>::@class::A::@field::foo
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            set foo= @48
+              reference: <testLibraryFragment>::@class::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional newValue @56
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+''');
+  }
+
+  test_class_field_formal_param_inferred_type_implicit() async {
+    var library = await buildLibrary('class C extends D { var v; C(this.v); }'
+        ' abstract class D { int get v; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: D
+          fields
+            v @24
+              reference: <testLibraryFragment>::@class::C::@field::v
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            @27
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional final this.v @34
+                  type: int
+                  field: <testLibraryFragment>::@class::C::@field::v
+              superConstructor: <testLibraryFragment>::@class::D::@constructor::new
+          accessors
+            synthetic get v @-1
+              reference: <testLibraryFragment>::@class::C::@getter::v
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set v= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::v
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _v @-1
+                  type: int
+              returnType: void
+        abstract class D @55
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic v @-1
+              reference: <testLibraryFragment>::@class::D::@field::v
+              enclosingElement: <testLibraryFragment>::@class::D
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+          accessors
+            abstract get v @67
+              reference: <testLibraryFragment>::@class::D::@getter::v
+              enclosingElement: <testLibraryFragment>::@class::D
+              returnType: int
+''');
+  }
+
+  test_class_field_implicit_type() async {
+    var library = await buildLibrary('class C { var x; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @14
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: dynamic
+              returnType: void
+''');
+  }
+
+  test_class_field_implicit_type_late() async {
+    var library = await buildLibrary('class C { late var x; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            late x @19
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: dynamic
+              returnType: void
+''');
+  }
+
+  test_class_field_inferred_type_nonStatic_explicit_initialized() async {
+    var library = await buildLibrary('class C { num v = 0; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            v @14
+              reference: <testLibraryFragment>::@class::C::@field::v
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: num
+              shouldUseTypeForInitializerInference: true
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get v @-1
+              reference: <testLibraryFragment>::@class::C::@getter::v
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: num
+            synthetic set v= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::v
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _v @-1
+                  type: num
+              returnType: void
+''');
+  }
+
+  test_class_field_inferred_type_nonStatic_implicit_initialized() async {
+    var library = await buildLibrary('class C { var v = 0; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            v @14
+              reference: <testLibraryFragment>::@class::C::@field::v
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: false
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get v @-1
+              reference: <testLibraryFragment>::@class::C::@getter::v
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set v= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::v
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _v @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_field_inferred_type_nonStatic_implicit_uninitialized() async {
+    var library = await buildLibrary(
+        'class C extends D { var v; } abstract class D { int get v; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: D
+          fields
+            v @24
+              reference: <testLibraryFragment>::@class::C::@field::v
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              superConstructor: <testLibraryFragment>::@class::D::@constructor::new
+          accessors
+            synthetic get v @-1
+              reference: <testLibraryFragment>::@class::C::@getter::v
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set v= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::v
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _v @-1
+                  type: int
+              returnType: void
+        abstract class D @44
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic v @-1
+              reference: <testLibraryFragment>::@class::D::@field::v
+              enclosingElement: <testLibraryFragment>::@class::D
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+          accessors
+            abstract get v @56
+              reference: <testLibraryFragment>::@class::D::@getter::v
+              enclosingElement: <testLibraryFragment>::@class::D
+              returnType: int
+''');
+  }
+
+  test_class_field_inferred_type_nonStatic_inherited_resolveInitializer() async {
+    var library = await buildLibrary(r'''
+const a = 0;
+abstract class A {
+  const A();
+  List<int> get f;
+}
+class B extends A {
+  const B();
+  final f = [a];
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        abstract class A @28
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic f @-1
+              reference: <testLibraryFragment>::@class::A::@field::f
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: List<int>
+          constructors
+            const @40
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            abstract get f @61
+              reference: <testLibraryFragment>::@class::A::@getter::f
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: List<int>
+        class B @72
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          fields
+            final f @107
+              reference: <testLibraryFragment>::@class::B::@field::f
+              enclosingElement: <testLibraryFragment>::@class::B
+              type: List<int>
+              shouldUseTypeForInitializerInference: true
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @111
+                  elements
+                    SimpleIdentifier
+                      token: a @112
+                      staticElement: <testLibraryFragment>::@getter::a
+                      staticType: int
+                  rightBracket: ] @113
+                  staticType: List<int>
+          constructors
+            const @94
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+          accessors
+            synthetic get f @-1
+              reference: <testLibraryFragment>::@class::B::@getter::f
+              enclosingElement: <testLibraryFragment>::@class::B
+              returnType: List<int>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @10
+              staticType: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_class_field_inferred_type_static_implicit_initialized() async {
+    var library = await buildLibrary('class C { static var v = 0; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            static v @21
+              reference: <testLibraryFragment>::@class::C::@field::v
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: false
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@class::C::@getter::v
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic static set v= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::v
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _v @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_field_inheritedContextType_double() async {
+    var library = await buildLibrary('''
+abstract class A {
+  const A();
+  double get foo;
+}
+class B extends A {
+  const B();
+  final foo = 2;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        abstract class A @15
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: double
+          constructors
+            const @27
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            abstract get foo @45
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: double
+        class B @58
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          fields
+            final foo @93
+              reference: <testLibraryFragment>::@class::B::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::B
+              type: double
+              shouldUseTypeForInitializerInference: true
+              constantInitializer
+                IntegerLiteral
+                  literal: 2 @99
+                  staticType: double
+          constructors
+            const @80
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::B::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::B
+              returnType: double
+''');
+  }
+
+  test_class_field_isPromotable_hasGetter() async {
+    var library = await buildLibrary(r'''
+class A {
+  final int? _foo;
+  A(this._foo);
+}
+
+class B {
+  int? get _foo => 0;
+}
+''');
+
+    configuration.forPromotableFields(classNames: {'A'});
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            final _foo @23
+              reference: <testLibraryFragment>::@class::A::@field::_foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int?
+  fieldNameNonPromotabilityInfo
+    _foo
+      conflictingGetters
+        <testLibraryFragment>::@class::B::@getter::_foo
+''');
+  }
+
+  test_class_field_isPromotable_hasGetter_abstract() async {
+    var library = await buildLibrary(r'''
+class A {
+  final int? _foo;
+  A(this._foo);
+}
+
+abstract class B {
+  int? get _foo;
+}
+''');
+
+    configuration.forPromotableFields(classNames: {'A'});
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            final promotable _foo @23
+              reference: <testLibraryFragment>::@class::A::@field::_foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int?
+''');
+  }
+
+  test_class_field_isPromotable_hasGetter_inPart() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+part of 'test.dart';
+class B {
+  int? get _foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+part 'a.dart';
+class A {
+  final int? _foo;
+  A(this._foo);
+}
+''');
+
+    configuration.forPromotableFields(classNames: {'A'});
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @21
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            final _foo @38
+              reference: <testLibraryFragment>::@class::A::@field::_foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int?
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  fieldNameNonPromotabilityInfo
+    _foo
+      conflictingGetters
+        <testLibrary>::@fragment::package:test/a.dart::@class::B::@getter::_foo
+''');
+  }
+
+  test_class_field_isPromotable_hasGetter_static() async {
+    var library = await buildLibrary(r'''
+class A {
+  final int? _foo;
+  A(this._foo);
+}
+
+class B {
+  static int? get _foo => 0;
+}
+''');
+
+    configuration.forPromotableFields(classNames: {'A'});
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            final promotable _foo @23
+              reference: <testLibraryFragment>::@class::A::@field::_foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int?
+''');
+  }
+
+  test_class_field_isPromotable_hasNotFinalField() async {
+    var library = await buildLibrary(r'''
+class A {
+  final int? _foo;
+  A(this._foo);
+}
+
+class B {
+  int? _foo;
+}
+''');
+
+    configuration.forPromotableFields(classNames: {'A'});
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            final _foo @23
+              reference: <testLibraryFragment>::@class::A::@field::_foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int?
+  fieldNameNonPromotabilityInfo
+    _foo
+      conflictingFields
+        <testLibraryFragment>::@class::B::@field::_foo
+''');
+  }
+
+  test_class_field_isPromotable_hasNotFinalField_static() async {
+    var library = await buildLibrary(r'''
+class A {
+  final int? _foo;
+  A(this._foo);
+}
+
+class B {
+  static int? _foo;
+}
+''');
+
+    configuration.forPromotableFields(classNames: {'A'});
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            final promotable _foo @23
+              reference: <testLibraryFragment>::@class::A::@field::_foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int?
+''');
+  }
+
+  test_class_field_isPromotable_hasSetter() async {
+    var library = await buildLibrary(r'''
+class A {
+  final int? _foo;
+  A(this._foo);
+}
+
+class B {
+  set _field(int? _) {}
+}
+''');
+
+    configuration.forPromotableFields(classNames: {'A'});
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            final promotable _foo @23
+              reference: <testLibraryFragment>::@class::A::@field::_foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int?
+''');
+  }
+
+  test_class_field_isPromotable_language217() async {
+    var library = await buildLibrary(r'''
+// @dart = 2.19
+class A {
+  final int? _foo;
+  A(this._foo);
+}
+''');
+
+    configuration.forPromotableFields(classNames: {'A'});
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @22
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            final _foo @39
+              reference: <testLibraryFragment>::@class::A::@field::_foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int?
+''');
+  }
+
+  test_class_field_isPromotable_noSuchMethodForwarder_field() async {
+    var library = await buildLibrary(r'''
+class A {
+  final int? _foo;
+  A(this._foo);
+}
+
+class B {
+  final int? _foo = 0;
+}
+
+/// Implicitly implements `_foo` as a getter that forwards to [noSuchMethod].
+class C implements B {
+  dynamic noSuchMethod(Invocation invocation) {}
+}
+''');
+
+    configuration.forPromotableFields(classNames: {'A'});
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            final _foo @23
+              reference: <testLibraryFragment>::@class::A::@field::_foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int?
+  fieldNameNonPromotabilityInfo
+    _foo
+      conflictingNsmClasses
+        <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_field_isPromotable_noSuchMethodForwarder_field_implementedInMixin() async {
+    var library = await buildLibrary(r'''
+class A {
+  final int? _foo;
+  A(this._foo);
+}
+
+mixin M {
+  final int? _foo = 0;
+}
+
+class B {
+  final int? _foo = 0;
+}
+
+/// `_foo` is implemented in [M].
+class C with M implements B {
+  dynamic noSuchMethod(Invocation invocation) {}
+}
+''');
+
+    configuration.forPromotableFields(
+      classNames: {'A', 'B'},
+      mixinNames: {'M'},
+    );
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            final promotable _foo @23
+              reference: <testLibraryFragment>::@class::A::@field::_foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int?
+        class B @90
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          fields
+            final promotable _foo @107
+              reference: <testLibraryFragment>::@class::B::@field::_foo
+              enclosingElement: <testLibraryFragment>::@class::B
+              type: int?
+              shouldUseTypeForInitializerInference: true
+      mixins
+        mixin M @54
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+          fields
+            final promotable _foo @71
+              reference: <testLibraryFragment>::@mixin::M::@field::_foo
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              type: int?
+              shouldUseTypeForInitializerInference: true
+''');
+  }
+
+  test_class_field_isPromotable_noSuchMethodForwarder_field_implementedInSuperclass() async {
+    var library = await buildLibrary(r'''
+class A {
+  final int? _foo;
+  A(this._foo);
+}
+
+class B {
+  final int? _foo = 0;
+}
+
+class C {
+  final int? _foo = 0;
+}
+
+/// `_foo` is implemented in [B].
+class D extends B implements C {
+  dynamic noSuchMethod(Invocation invocation) {}
+}
+''');
+
+    configuration.forPromotableFields(
+      classNames: {'A', 'B'},
+    );
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            final promotable _foo @23
+              reference: <testLibraryFragment>::@class::A::@field::_foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int?
+        class B @54
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          fields
+            final promotable _foo @71
+              reference: <testLibraryFragment>::@class::B::@field::_foo
+              enclosingElement: <testLibraryFragment>::@class::B
+              type: int?
+              shouldUseTypeForInitializerInference: true
+''');
+  }
+
+  test_class_field_isPromotable_noSuchMethodForwarder_field_inClassTypeAlias() async {
+    var library = await buildLibrary(r'''
+class A {
+  final int? _foo;
+  A(this._foo);
+}
+
+class B {
+  final int? _foo = 0;
+}
+
+mixin M {
+  dynamic noSuchMethod(Invocation invocation) {}
+}
+
+/// Implicitly implements `_foo` as a getter that forwards to [noSuchMethod].
+class E = Object with M implements B;
+''');
+
+    configuration.forPromotableFields(classNames: {'A'});
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            final _foo @23
+              reference: <testLibraryFragment>::@class::A::@field::_foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int?
+  fieldNameNonPromotabilityInfo
+    _foo
+      conflictingNsmClasses
+        <testLibraryFragment>::@class::E
+''');
+  }
+
+  test_class_field_isPromotable_noSuchMethodForwarder_field_inEnum() async {
+    var library = await buildLibrary(r'''
+class A {
+  final int? _foo;
+  A(this._foo);
+}
+
+class B {
+  final int? _foo = 0;
+}
+
+/// Implicitly implements `_foo` as a getter that forwards to [noSuchMethod].
+enum E implements B {
+  v;
+  dynamic noSuchMethod(Invocation invocation) {}
+}
+''');
+
+    configuration.forPromotableFields(
+      classNames: {'A', 'B'},
+    );
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            final _foo @23
+              reference: <testLibraryFragment>::@class::A::@field::_foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int?
+        class B @54
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          fields
+            final _foo @71
+              reference: <testLibraryFragment>::@class::B::@field::_foo
+              enclosingElement: <testLibraryFragment>::@class::B
+              type: int?
+              shouldUseTypeForInitializerInference: true
+  fieldNameNonPromotabilityInfo
+    _foo
+      conflictingNsmClasses
+        <testLibraryFragment>::@enum::E
+''');
+  }
+
+  test_class_field_isPromotable_noSuchMethodForwarder_getter() async {
+    var library = await buildLibrary(r'''
+class A {
+  final int? _foo;
+  A(this._foo);
+}
+
+abstract class B {
+  int? get _foo;
+}
+
+/// Implicitly implements `_foo` as a getter that forwards to [noSuchMethod].
+class C implements B {
+  dynamic noSuchMethod(Invocation invocation) {}
+}
+''');
+
+    configuration.forPromotableFields(classNames: {'A'});
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            final _foo @23
+              reference: <testLibraryFragment>::@class::A::@field::_foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int?
+  fieldNameNonPromotabilityInfo
+    _foo
+      conflictingNsmClasses
+        <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_field_isPromotable_noSuchMethodForwarder_inDifferentLibrary() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class B {
+  int? get _foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import 'a.dart';
+
+class A {
+  final int? _foo;
+  A(this._foo);
+}
+
+/// Has a noSuchMethod thrower for B._field, but since private names in
+/// different libraries are distinct, this has no effect on promotion of
+/// C._field.
+class C implements B {
+  dynamic noSuchMethod(Invocation invocation) {}
+}
+''');
+
+    configuration.forPromotableFields(
+      classNames: {'A'},
+    );
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class A @24
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            final promotable _foo @41
+              reference: <testLibraryFragment>::@class::A::@field::_foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int?
+''');
+  }
+
+  test_class_field_isPromotable_noSuchMethodForwarder_inheritedInterface() async {
+    var library = await buildLibrary(r'''
+class A {
+  final int? _foo;
+  A(this._foo);
+}
+
+class B extends A {
+  A(super.value);
+}
+
+/// Implicitly implements `_foo` as a getter that forwards to [noSuchMethod].
+class C implements B {
+  dynamic noSuchMethod(Invocation invocation) {}
+}
+''');
+
+    configuration.forPromotableFields(classNames: {'A'});
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            final _foo @23
+              reference: <testLibraryFragment>::@class::A::@field::_foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int?
+  fieldNameNonPromotabilityInfo
+    _foo
+      conflictingNsmClasses
+        <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_field_isPromotable_noSuchMethodForwarder_mixedInterface() async {
+    var library = await buildLibrary(r'''
+class A {
+  final int? _foo;
+  A(this._foo);
+}
+
+mixin M {
+  final int? _foo = 0;
+}
+
+class B with M {}
+
+/// Implicitly implements `_foo` as a getter that forwards to [noSuchMethod].
+class C implements B {
+  dynamic noSuchMethod(Invocation invocation) {}
+}
+''');
+
+    configuration.forPromotableFields(
+      classNames: {'A'},
+      mixinNames: {'M'},
+    );
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            final _foo @23
+              reference: <testLibraryFragment>::@class::A::@field::_foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int?
+      mixins
+        mixin M @54
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+          fields
+            final _foo @71
+              reference: <testLibraryFragment>::@mixin::M::@field::_foo
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              type: int?
+              shouldUseTypeForInitializerInference: true
+  fieldNameNonPromotabilityInfo
+    _foo
+      conflictingNsmClasses
+        <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_field_isPromotable_noSuchMethodForwarder_unusedMixin() async {
+    // Mixins are implicitly abstract so the presence of a mixin that inherits
+    // a field into its interface, and doesn't implement it, doesn't mean that
+    // a noSuchMethod forwarder created for it. So,  this does not block that
+    // field from promoting.
+    var library = await buildLibrary(r'''
+class A {
+  final int? _foo;
+  A(this._foo);
+}
+
+mixin M implements A {
+  dynamic noSuchMethod(Invocation invocation) {}
+}
+''');
+
+    configuration.forPromotableFields(
+      classNames: {'A'},
+    );
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            final promotable _foo @23
+              reference: <testLibraryFragment>::@class::A::@field::_foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int?
+''');
+  }
+
+  test_class_field_isPromotable_notFinal() async {
+    var library = await buildLibrary(r'''
+class A {
+  int? _foo;
+}
+''');
+
+    configuration.forPromotableFields(classNames: {'A'});
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            _foo @17
+              reference: <testLibraryFragment>::@class::A::@field::_foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int?
+  fieldNameNonPromotabilityInfo
+    _foo
+      conflictingFields
+        <testLibraryFragment>::@class::A::@field::_foo
+''');
+  }
+
+  test_class_field_isPromotable_notPrivate() async {
+    var library = await buildLibrary(r'''
+class A {
+  int? field;
+}
+''');
+
+    configuration.forPromotableFields(classNames: {'A'});
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            field @17
+              reference: <testLibraryFragment>::@class::A::@field::field
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int?
+''');
+  }
+
+  test_class_field_isPromotable_typeInference() async {
+    // We decide that `_foo` is promotable before inferring the type of `bar`.
+    var library = await buildLibrary(r'''
+class A {
+  final int? _foo;
+  final bar = _foo != null ? _foo : 0;
+  A(this._foo);
+}
+''');
+
+    configuration.forPromotableFields(classNames: {'A'});
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            final promotable _foo @23
+              reference: <testLibraryFragment>::@class::A::@field::_foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int?
+            final bar @37
+              reference: <testLibraryFragment>::@class::A::@field::bar
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              shouldUseTypeForInitializerInference: false
+''');
+  }
+
+  test_class_field_propagatedType_const_noDep() async {
+    var library = await buildLibrary('''
+class C {
+  static const x = 0;
+}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            static const x @25
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                IntegerLiteral
+                  literal: 0 @29
+                  staticType: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic static get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+''');
+  }
+
+  test_class_field_propagatedType_final_dep_inLib() async {
+    addSource('$testPackageLibPath/a.dart', 'final a = 1;');
+    var library = await buildLibrary('''
+import "a.dart";
+class C {
+  final b = a / 2;
+}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @23
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            final b @35
+              reference: <testLibraryFragment>::@class::C::@field::b
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: double
+              shouldUseTypeForInitializerInference: false
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get b @-1
+              reference: <testLibraryFragment>::@class::C::@getter::b
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: double
+''');
+  }
+
+  test_class_field_propagatedType_final_dep_inPart() async {
+    addSource('$testPackageLibPath/a.dart', 'part of lib; final a = 1;');
+    var library = await buildLibrary('''
+library lib;
+part "a.dart";
+class C {
+  final b = a / 2;
+}''');
+    checkElementText(library, r'''
+library
+  name: lib
+  nameOffset: 8
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  parts
+    part_0
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      parts
+        part_0
+          uri: package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          unit: <testLibrary>::@fragment::package:test/a.dart
+      classes
+        class C @34
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            final b @46
+              reference: <testLibraryFragment>::@class::C::@field::b
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: double
+              shouldUseTypeForInitializerInference: false
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get b @-1
+              reference: <testLibraryFragment>::@class::C::@getter::b
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: double
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static final a @19
+          reference: <testLibrary>::@fragment::package:test/a.dart::@topLevelVariable::a
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          type: int
+          shouldUseTypeForInitializerInference: false
+      accessors
+        synthetic static get a @-1
+          reference: <testLibrary>::@fragment::package:test/a.dart::@getter::a
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          returnType: int
+''');
+  }
+
+  test_class_field_propagatedType_final_noDep_instance() async {
+    var library = await buildLibrary('''
+class C {
+  final x = 0;
+}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            final x @18
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: false
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+''');
+  }
+
+  test_class_field_propagatedType_final_noDep_static() async {
+    var library = await buildLibrary('''
+class C {
+  static final x = 0;
+}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            static final x @25
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: false
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic static get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+''');
+  }
+
+  test_class_field_static() async {
+    var library = await buildLibrary('class C { static int i; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            static i @21
+              reference: <testLibraryFragment>::@class::C::@field::i
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic static get i @-1
+              reference: <testLibraryFragment>::@class::C::@getter::i
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic static set i= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::i
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _i @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_field_static_final_hasConstConstructor() async {
+    var library = await buildLibrary('''
+class C {
+  static final f = 0;
+  const C();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            static final f @25
+              reference: <testLibraryFragment>::@class::C::@field::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: false
+          constructors
+            const @40
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic static get f @-1
+              reference: <testLibraryFragment>::@class::C::@getter::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+''');
+  }
+
+  test_class_field_static_final_untyped() async {
+    var library = await buildLibrary('class C { static final x = 0; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            static final x @23
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: false
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic static get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+''');
+  }
+
+  test_class_field_static_late() async {
+    var library = await buildLibrary('class C { static late int i; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            static late i @26
+              reference: <testLibraryFragment>::@class::C::@field::i
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic static get i @-1
+              reference: <testLibraryFragment>::@class::C::@getter::i
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic static set i= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::i
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _i @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_field_type_explicit() async {
+    var library = await buildLibrary(r'''
+class C {
+  int a = 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            a @16
+              reference: <testLibraryFragment>::@class::C::@field::a
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: true
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get a @-1
+              reference: <testLibraryFragment>::@class::C::@getter::a
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set a= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::a
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _a @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_field_type_inferred_fromInitializer() async {
+    var library = await buildLibrary(r'''
+class C {
+  var foo = 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            foo @16
+              reference: <testLibraryFragment>::@class::C::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: false
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::C::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_field_type_inferred_fromSuper() async {
+    var library = await buildLibrary(r'''
+abstract class A {
+  int get foo;
+}
+
+class B extends A {
+  final foo = 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        abstract class A @15
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            abstract get foo @29
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+        class B @43
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          fields
+            final foo @65
+              reference: <testLibraryFragment>::@class::B::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::B
+              type: int
+              shouldUseTypeForInitializerInference: true
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::B::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::B
+              returnType: int
+''');
+  }
+
+  test_class_field_type_inferred_Never() async {
+    var library = await buildLibrary(r'''
+class C {
+  var a = throw 42;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            a @16
+              reference: <testLibraryFragment>::@class::C::@field::a
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: Never
+              shouldUseTypeForInitializerInference: false
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get a @-1
+              reference: <testLibraryFragment>::@class::C::@getter::a
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: Never
+            synthetic set a= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::a
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _a @-1
+                  type: Never
+              returnType: void
+''');
+  }
+
+  test_class_field_typed() async {
+    var library = await buildLibrary('class C { int x = 0; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @14
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: true
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_field_untyped() async {
+    var library = await buildLibrary('class C { var x = 0; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @14
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: false
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_fields() async {
+    var library = await buildLibrary('class C { int i; int j; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            i @14
+              reference: <testLibraryFragment>::@class::C::@field::i
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+            j @21
+              reference: <testLibraryFragment>::@class::C::@field::j
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get i @-1
+              reference: <testLibraryFragment>::@class::C::@getter::i
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set i= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::i
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _i @-1
+                  type: int
+              returnType: void
+            synthetic get j @-1
+              reference: <testLibraryFragment>::@class::C::@getter::j
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set j= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::j
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _j @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_fields_late() async {
+    var library = await buildLibrary('''
+class C {
+  late int foo;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            late foo @21
+              reference: <testLibraryFragment>::@class::C::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::C::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_fields_late_final() async {
+    var library = await buildLibrary('''
+class C {
+  late final int foo;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            late final foo @27
+              reference: <testLibraryFragment>::@class::C::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::C::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_fields_late_final_initialized() async {
+    var library = await buildLibrary('''
+class C {
+  late final int foo = 0;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            late final foo @27
+              reference: <testLibraryFragment>::@class::C::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: true
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::C::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+''');
+  }
+
+  test_class_fields_late_inference_usingSuper_methodInvocation() async {
+    var library = await buildLibrary('''
+class A {
+  int foo() => 0;
+}
+
+class B extends A {
+  late var f = super.foo();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          methods
+            foo @16
+              reference: <testLibraryFragment>::@class::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+        class B @37
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          fields
+            late f @62
+              reference: <testLibraryFragment>::@class::B::@field::f
+              enclosingElement: <testLibraryFragment>::@class::B
+              type: int
+              shouldUseTypeForInitializerInference: false
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+          accessors
+            synthetic get f @-1
+              reference: <testLibraryFragment>::@class::B::@getter::f
+              enclosingElement: <testLibraryFragment>::@class::B
+              returnType: int
+            synthetic set f= @-1
+              reference: <testLibraryFragment>::@class::B::@setter::f
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                requiredPositional _f @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_fields_late_inference_usingSuper_propertyAccess() async {
+    var library = await buildLibrary('''
+class A {
+  int get foo => 0;
+}
+
+class B extends A {
+  late var f = super.foo;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            get foo @20
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+        class B @39
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          fields
+            late f @64
+              reference: <testLibraryFragment>::@class::B::@field::f
+              enclosingElement: <testLibraryFragment>::@class::B
+              type: int
+              shouldUseTypeForInitializerInference: false
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+          accessors
+            synthetic get f @-1
+              reference: <testLibraryFragment>::@class::B::@getter::f
+              enclosingElement: <testLibraryFragment>::@class::B
+              returnType: int
+            synthetic set f= @-1
+              reference: <testLibraryFragment>::@class::B::@setter::f
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                requiredPositional _f @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_final() async {
+    var library = await buildLibrary('final class C {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        final class C @12
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_getter_abstract() async {
+    var library = await buildLibrary('abstract class C { int get x; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        abstract class C @15
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic x @-1
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            abstract get x @27
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+''');
+  }
+
+  test_class_getter_external() async {
+    var library = await buildLibrary('class C { external int get x; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic x @-1
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            external get x @27
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+''');
+  }
+
+  test_class_getter_implicit_return_type() async {
+    var library = await buildLibrary('class C { get x => null; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic x @-1
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            get x @14
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+''');
+  }
+
+  test_class_getter_invokesSuperSelf_getter() async {
+    var library = await buildLibrary(r'''
+class A {
+  int get foo {
+    super.foo;
+  }
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            get foo @20 invokesSuperSelf
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+''');
+  }
+
+  test_class_getter_invokesSuperSelf_getter_nestedInAssignment() async {
+    var library = await buildLibrary(r'''
+class A {
+  int get foo {
+    (super.foo).foo = 0;
+  }
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            get foo @20 invokesSuperSelf
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+''');
+  }
+
+  test_class_getter_invokesSuperSelf_setter() async {
+    var library = await buildLibrary(r'''
+class A {
+  int get foo {
+    super.foo = 0;
+  }
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            get foo @20
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+''');
+  }
+
+  test_class_getter_native() async {
+    var library = await buildLibrary('''
+class C {
+  int get x() native;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic x @-1
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            external get x @20
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+''');
+  }
+
+  test_class_getter_static() async {
+    var library = await buildLibrary('class C { static int get x => null; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic static x @-1
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            static get x @25
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+''');
+  }
+
+  test_class_getters() async {
+    var library =
+        await buildLibrary('class C { int get x => null; get y => null; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic x @-1
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+            synthetic y @-1
+              reference: <testLibraryFragment>::@class::C::@field::y
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            get x @18
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            get y @33
+              reference: <testLibraryFragment>::@class::C::@getter::y
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+''');
+  }
+
+  test_class_implicitField_getterFirst() async {
+    var library = await buildLibrary('''
+class C {
+  int get x => 0;
+  void set x(int value) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic x @-1
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            get x @20
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            set x= @39
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional value @45
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_implicitField_setterFirst() async {
+    var library = await buildLibrary('''
+class C {
+  void set x(int value) {}
+  int get x => 0;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic x @-1
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            set x= @21
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional value @27
+                  type: int
+              returnType: void
+            get x @47
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+''');
+  }
+
+  test_class_interface() async {
+    var library = await buildLibrary('interface class C {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        interface class C @16
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_interfaces() async {
+    var library = await buildLibrary('''
+class C implements D, E {}
+class D {}
+class E {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          interfaces
+            D
+            E
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+        class D @33
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+        class E @44
+          reference: <testLibraryFragment>::@class::E
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::E
+''');
+  }
+
+  test_class_interfaces_extensionType() async {
+    var library = await buildLibrary('''
+class A {}
+extension type B(int it) {}
+class C {}
+class D implements A, B, C {}
+''');
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+        class C @45
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+        class D @56
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          interfaces
+            A
+            C
+      extensionTypes
+        B @26
+          reference: <testLibraryFragment>::@extensionType::B
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::B::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::B::@constructor::new
+          typeErasure: int
+          fields
+            final it @32
+              reference: <testLibraryFragment>::@extensionType::B::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::B::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              returnType: int
+''');
+  }
+
+  test_class_interfaces_Function() async {
+    var library = await buildLibrary('''
+class A {}
+class B {}
+class C implements A, Function, B {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class B @17
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+        class C @28
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          interfaces
+            A
+            B
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_interfaces_unresolved() async {
+    var library = await buildLibrary(
+        'class C implements X, Y, Z {} class X {} class Z {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          interfaces
+            X
+            Z
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+        class X @36
+          reference: <testLibraryFragment>::@class::X
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::X::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::X
+        class Z @47
+          reference: <testLibraryFragment>::@class::Z
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::Z::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::Z
+''');
+  }
+
+  test_class_method_abstract() async {
+    var library = await buildLibrary('abstract class C { f(); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        abstract class C @15
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            abstract f @19
+              reference: <testLibraryFragment>::@class::C::@method::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+''');
+  }
+
+  test_class_method_async() async {
+    var library = await buildLibrary(r'''
+import 'dart:async';
+class C {
+  Future f() async {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    dart:async
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        dart:async
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @27
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            f @40 async
+              reference: <testLibraryFragment>::@class::C::@method::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: Future<dynamic>
+''');
+  }
+
+  test_class_method_asyncStar() async {
+    var library = await buildLibrary(r'''
+import 'dart:async';
+class C {
+  Stream f() async* {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    dart:async
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        dart:async
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @27
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            f @40 async*
+              reference: <testLibraryFragment>::@class::C::@method::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: Stream<dynamic>
+''');
+  }
+
+  test_class_method_documented() async {
+    var library = await buildLibrary('''
+class C {
+  /**
+   * Docs
+   */
+  f() {}
+}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            f @34
+              reference: <testLibraryFragment>::@class::C::@method::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              documentationComment: /**\n   * Docs\n   */
+              returnType: dynamic
+''');
+  }
+
+  test_class_method_external() async {
+    var library = await buildLibrary('class C { external f(); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            external f @19
+              reference: <testLibraryFragment>::@class::C::@method::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+''');
+  }
+
+  test_class_method_hasImplicitReturnType_false() async {
+    var library = await buildLibrary('''
+class C {
+  int m() => 0;
+}
+''');
+    var c = library.definingCompilationUnit.classes.single;
+    var m = c.methods.single;
+    expect(m.hasImplicitReturnType, isFalse);
+  }
+
+  test_class_method_hasImplicitReturnType_true() async {
+    var library = await buildLibrary('''
+class C {
+  m() => 0;
+}
+''');
+    var c = library.definingCompilationUnit.classes.single;
+    var m = c.methods.single;
+    expect(m.hasImplicitReturnType, isTrue);
+  }
+
+  test_class_method_inferred_type_nonStatic_implicit_param() async {
+    var library = await buildLibrary('class C extends D { void f(value) {} }'
+        ' abstract class D { void f(int value); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: D
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              superConstructor: <testLibraryFragment>::@class::D::@constructor::new
+          methods
+            f @25
+              reference: <testLibraryFragment>::@class::C::@method::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional value @27
+                  type: int
+              returnType: void
+        abstract class D @54
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+          methods
+            abstract f @63
+              reference: <testLibraryFragment>::@class::D::@method::f
+              enclosingElement: <testLibraryFragment>::@class::D
+              parameters
+                requiredPositional value @69
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_method_inferred_type_nonStatic_implicit_return() async {
+    var library = await buildLibrary('''
+class C extends D {
+  f() => null;
+}
+abstract class D {
+  int f();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: D
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              superConstructor: <testLibraryFragment>::@class::D::@constructor::new
+          methods
+            f @22
+              reference: <testLibraryFragment>::@class::C::@method::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+        abstract class D @52
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+          methods
+            abstract f @62
+              reference: <testLibraryFragment>::@class::D::@method::f
+              enclosingElement: <testLibraryFragment>::@class::D
+              returnType: int
+''');
+  }
+
+  test_class_method_invokesSuperSelf() async {
+    var library = await buildLibrary(r'''
+class A {
+  void foo() {
+    super.foo();
+  }
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          methods
+            foo @17 invokesSuperSelf
+              reference: <testLibraryFragment>::@class::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: void
+''');
+  }
+
+  test_class_method_namedAsSupertype() async {
+    var library = await buildLibrary(r'''
+class A {}
+class B extends A {
+  void A() {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class B @17
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+          methods
+            A @38
+              reference: <testLibraryFragment>::@class::B::@method::A
+              enclosingElement: <testLibraryFragment>::@class::B
+              returnType: void
+''');
+  }
+
+  test_class_method_native() async {
+    var library = await buildLibrary('''
+class C {
+  int m() native;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            external m @16
+              reference: <testLibraryFragment>::@class::C::@method::m
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+''');
+  }
+
+  test_class_method_params() async {
+    var library = await buildLibrary('class C { f(x, y) {} }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            f @10
+              reference: <testLibraryFragment>::@class::C::@method::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional x @12
+                  type: dynamic
+                requiredPositional y @15
+                  type: dynamic
+              returnType: dynamic
+''');
+  }
+
+  test_class_method_static() async {
+    var library = await buildLibrary('class C { static f() {} }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            static f @17
+              reference: <testLibraryFragment>::@class::C::@method::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+''');
+  }
+
+  test_class_method_syncStar() async {
+    var library = await buildLibrary(r'''
+class C {
+  Iterable<int> f() sync* {
+    yield 42;
+  }
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            f @26 sync*
+              reference: <testLibraryFragment>::@class::C::@method::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: Iterable<int>
+''');
+  }
+
+  test_class_method_type_parameter() async {
+    var library = await buildLibrary('class C { T f<T, U>(U u) => null; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            f @12
+              reference: <testLibraryFragment>::@class::C::@method::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              typeParameters
+                covariant T @14
+                  defaultType: dynamic
+                covariant U @17
+                  defaultType: dynamic
+              parameters
+                requiredPositional u @22
+                  type: U
+              returnType: T
+''');
+  }
+
+  test_class_method_type_parameter_in_generic_class() async {
+    var library = await buildLibrary('''
+class C<T, U> {
+  V f<V, W>(T t, U u, W w) => null;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+            covariant U @11
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            f @20
+              reference: <testLibraryFragment>::@class::C::@method::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              typeParameters
+                covariant V @22
+                  defaultType: dynamic
+                covariant W @25
+                  defaultType: dynamic
+              parameters
+                requiredPositional t @30
+                  type: T
+                requiredPositional u @35
+                  type: U
+                requiredPositional w @40
+                  type: W
+              returnType: V
+''');
+  }
+
+  test_class_method_type_parameter_with_function_typed_parameter() async {
+    var library = await buildLibrary('class C { void f<T, U>(T x(U u)) {} }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            f @15
+              reference: <testLibraryFragment>::@class::C::@method::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              typeParameters
+                covariant T @17
+                  defaultType: dynamic
+                covariant U @20
+                  defaultType: dynamic
+              parameters
+                requiredPositional x @25
+                  type: T Function(U)
+                  parameters
+                    requiredPositional u @29
+                      type: U
+              returnType: void
+''');
+  }
+
+  test_class_methods() async {
+    var library = await buildLibrary('class C { f() {} g() {} }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            f @10
+              reference: <testLibraryFragment>::@class::C::@method::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+            g @17
+              reference: <testLibraryFragment>::@class::C::@method::g
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+''');
+  }
+
+  test_class_mixin_class() async {
+    var library = await buildLibrary('mixin class C {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        mixin class C @12
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_mixins() async {
+    var library = await buildLibrary('''
+class C extends D with E, F, G {}
+class D {}
+class E {}
+class F {}
+class G {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: D
+          mixins
+            E
+            F
+            G
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              superConstructor: <testLibraryFragment>::@class::D::@constructor::new
+        class D @40
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+        class E @51
+          reference: <testLibraryFragment>::@class::E
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::E
+        class F @62
+          reference: <testLibraryFragment>::@class::F
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::F::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::F
+        class G @73
+          reference: <testLibraryFragment>::@class::G
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::G::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::G
+''');
+  }
+
+  test_class_mixins_extensionType() async {
+    var library = await buildLibrary('''
+mixin A {}
+extension type B(int it) {}
+mixin C {}
+class D extends Object with A, B, C {}
+''');
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class D @56
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          supertype: Object
+          mixins
+            A
+            C
+      extensionTypes
+        B @26
+          reference: <testLibraryFragment>::@extensionType::B
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::B::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::B::@constructor::new
+          typeErasure: int
+          fields
+            final it @32
+              reference: <testLibraryFragment>::@extensionType::B::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::B::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              returnType: int
+      mixins
+        mixin A @6
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+        mixin C @45
+          reference: <testLibraryFragment>::@mixin::C
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_class_mixins_generic() async {
+    var library = await buildLibrary('''
+class Z extends A with B<int>, C<double> {}
+class A {}
+class B<B1> {}
+class C<C1> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class Z @6
+          reference: <testLibraryFragment>::@class::Z
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          mixins
+            B<int>
+            C<double>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::Z::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::Z
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+        class A @50
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class B @61
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant B1 @63
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+        class C @76
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant C1 @78
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_mixins_genericMixin_tooManyArguments() async {
+    var library = await buildLibrary('''
+mixin M<T> {}
+class A extends Object with M<int, String> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @20
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          supertype: Object
+          mixins
+            M<dynamic>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+      mixins
+        mixin M @6
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_class_mixins_typeParameter() async {
+    var library = await buildLibrary('''
+mixin M1 {}
+mixin M2 {}
+class A<T> extends Object with M1, T<int>, M2 {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @30
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @32
+              defaultType: dynamic
+          supertype: Object
+          mixins
+            M1
+            M2
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+      mixins
+        mixin M1 @6
+          reference: <testLibraryFragment>::@mixin::M1
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+        mixin M2 @18
+          reference: <testLibraryFragment>::@mixin::M2
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_class_mixins_unresolved() async {
+    var library = await buildLibrary(
+        'class C extends Object with X, Y, Z {} class X {} class Z {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: Object
+          mixins
+            X
+            Z
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+        class X @45
+          reference: <testLibraryFragment>::@class::X
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::X::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::X
+        class Z @56
+          reference: <testLibraryFragment>::@class::Z
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::Z::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::Z
+''');
+  }
+
+  test_class_notSimplyBounded_circularity_via_typeAlias_recordType() async {
+    var library = await buildLibrary('''
+class C<T extends A> {}
+typedef A = (C, int);
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              bound: dynamic
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+      typeAliases
+        notSimplyBounded A @32
+          reference: <testLibraryFragment>::@typeAlias::A
+          aliasedType: (C<dynamic>, int)
+''');
+  }
+
+  test_class_notSimplyBounded_circularity_via_typedef() async {
+    // C's type parameter T is not simply bounded because its bound, F, expands
+    // to `dynamic F(C)`, which refers to C.
+    var library = await buildLibrary('''
+class C<T extends F> {}
+typedef F(C value);
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              bound: dynamic
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+      typeAliases
+        functionTypeAliasBased notSimplyBounded F @32
+          reference: <testLibraryFragment>::@typeAlias::F
+          aliasedType: dynamic Function(C<dynamic>)
+          aliasedElement: GenericFunctionTypeElement
+            parameters
+              requiredPositional value @36
+                type: C<dynamic>
+            returnType: dynamic
+''');
+  }
+
+  test_class_notSimplyBounded_circularity_with_type_params() async {
+    // C's type parameter T is simply bounded because even though it refers to
+    // C, it specifies a bound.
+    var library = await buildLibrary('''
+class C<T extends C<dynamic>> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              bound: C<dynamic>
+              defaultType: C<dynamic>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_notSimplyBounded_complex_by_cycle_class() async {
+    var library = await buildLibrary('''
+class C<T extends D> {}
+class D<T extends C> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              bound: D<dynamic>
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+        notSimplyBounded class D @30
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @32
+              bound: C<dynamic>
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+''');
+  }
+
+  test_class_notSimplyBounded_complex_by_cycle_typedef_functionType() async {
+    var library = await buildLibrary('''
+typedef C<T extends D> = void Function();
+typedef D<T extends C> = void Function();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      typeAliases
+        notSimplyBounded C @8
+          reference: <testLibraryFragment>::@typeAlias::C
+          typeParameters
+            unrelated T @10
+              bound: dynamic
+              defaultType: dynamic
+          aliasedType: void Function()
+          aliasedElement: GenericFunctionTypeElement
+            returnType: void
+        notSimplyBounded D @50
+          reference: <testLibraryFragment>::@typeAlias::D
+          typeParameters
+            unrelated T @52
+              bound: dynamic
+              defaultType: dynamic
+          aliasedType: void Function()
+          aliasedElement: GenericFunctionTypeElement
+            returnType: void
+''');
+  }
+
+  test_class_notSimplyBounded_complex_by_cycle_typedef_interfaceType() async {
+    var library = await buildLibrary('''
+typedef C<T extends D> = List<T>;
+typedef D<T extends C> = List<T>;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      typeAliases
+        notSimplyBounded C @8
+          reference: <testLibraryFragment>::@typeAlias::C
+          typeParameters
+            covariant T @10
+              bound: dynamic
+              defaultType: dynamic
+          aliasedType: List<T>
+        notSimplyBounded D @42
+          reference: <testLibraryFragment>::@typeAlias::D
+          typeParameters
+            covariant T @44
+              bound: dynamic
+              defaultType: dynamic
+          aliasedType: List<T>
+''');
+  }
+
+  test_class_notSimplyBounded_complex_by_reference_to_cycle() async {
+    var library = await buildLibrary('''
+class C<T extends D> {}
+class D<T extends D> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              bound: D<dynamic>
+              defaultType: D<dynamic>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+        notSimplyBounded class D @30
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @32
+              bound: D<dynamic>
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+''');
+  }
+
+  test_class_notSimplyBounded_complex_by_use_of_parameter() async {
+    var library = await buildLibrary('''
+class C<T extends D<T>> {}
+class D<T> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              bound: D<T>
+              defaultType: D<dynamic>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+        class D @33
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @35
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+''');
+  }
+
+  test_class_notSimplyBounded_dependency_with_type_params() async {
+    // C's type parameter T is simply bounded because even though it refers to
+    // non-simply-bounded type D, it specifies a bound.
+    var library = await buildLibrary('''
+class C<T extends D<dynamic>> {}
+class D<T extends D<T>> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              bound: D<dynamic>
+              defaultType: D<dynamic>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+        notSimplyBounded class D @39
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @41
+              bound: D<T>
+              defaultType: D<dynamic>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+''');
+  }
+
+  test_class_notSimplyBounded_function_typed_bound_complex_via_parameter_type() async {
+    var library = await buildLibrary('''
+class C<T extends void Function(T)> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              bound: void Function(T)
+              defaultType: void Function(Never)
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_notSimplyBounded_function_typed_bound_complex_via_return_type() async {
+    var library = await buildLibrary('''
+class C<T extends T Function()> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              bound: T Function()
+              defaultType: dynamic Function()
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_notSimplyBounded_function_typed_bound_simple() async {
+    var library = await buildLibrary('''
+class C<T extends void Function()> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              bound: void Function()
+              defaultType: void Function()
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_notSimplyBounded_refers_to_circular_typedef() async {
+    // C's type parameter T has a bound of F, which is a circular typedef.  This
+    // is illegal in Dart, but we need to make sure it doesn't lead to a crash
+    // or infinite loop.
+    var library = await buildLibrary('''
+class C<T extends F> {}
+typedef F(G value);
+typedef G(F value);
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              bound: dynamic
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+      typeAliases
+        functionTypeAliasBased notSimplyBounded F @32
+          reference: <testLibraryFragment>::@typeAlias::F
+          aliasedType: dynamic Function(dynamic)
+          aliasedElement: GenericFunctionTypeElement
+            parameters
+              requiredPositional value @36
+                type: dynamic
+            returnType: dynamic
+        functionTypeAliasBased notSimplyBounded G @52
+          reference: <testLibraryFragment>::@typeAlias::G
+          aliasedType: dynamic Function(dynamic)
+          aliasedElement: GenericFunctionTypeElement
+            parameters
+              requiredPositional value @56
+                type: dynamic
+            returnType: dynamic
+''');
+  }
+
+  test_class_notSimplyBounded_self() async {
+    var library = await buildLibrary('''
+class C<T extends C> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              bound: C<dynamic>
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_notSimplyBounded_simple_because_non_generic() async {
+    // If no type parameters are specified, then the class is simply bounded, so
+    // there is no reason to assign it a slot.
+    var library = await buildLibrary('''
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_notSimplyBounded_simple_by_lack_of_cycles() async {
+    var library = await buildLibrary('''
+class C<T extends D> {}
+class D<T> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              bound: D<dynamic>
+              defaultType: D<dynamic>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+        class D @30
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @32
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+''');
+  }
+
+  test_class_notSimplyBounded_simple_by_syntax() async {
+    // If no bounds are specified, then the class is simply bounded by syntax
+    // alone, so there is no reason to assign it a slot.
+    var library = await buildLibrary('''
+class C<T> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_operator() async {
+    var library =
+        await buildLibrary('class C { C operator+(C other) => null; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            + @20
+              reference: <testLibraryFragment>::@class::C::@method::+
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional other @24
+                  type: C
+              returnType: C
+''');
+  }
+
+  test_class_operator_equal() async {
+    var library = await buildLibrary('''
+class C {
+  bool operator==(Object other) => false;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            == @25
+              reference: <testLibraryFragment>::@class::C::@method::==
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional other @35
+                  type: Object
+              returnType: bool
+''');
+  }
+
+  test_class_operator_external() async {
+    var library =
+        await buildLibrary('class C { external C operator+(C other); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            external + @29
+              reference: <testLibraryFragment>::@class::C::@method::+
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional other @33
+                  type: C
+              returnType: C
+''');
+  }
+
+  test_class_operator_greater_equal() async {
+    var library = await buildLibrary('''
+class C {
+  bool operator>=(C other) => false;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            >= @25
+              reference: <testLibraryFragment>::@class::C::@method::>=
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional other @30
+                  type: C
+              returnType: bool
+''');
+  }
+
+  test_class_operator_index() async {
+    var library =
+        await buildLibrary('class C { bool operator[](int i) => null; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            [] @23
+              reference: <testLibraryFragment>::@class::C::@method::[]
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional i @30
+                  type: int
+              returnType: bool
+''');
+  }
+
+  test_class_operator_index_set() async {
+    var library = await buildLibrary('''
+class C {
+  void operator[]=(int i, bool v) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            []= @25
+              reference: <testLibraryFragment>::@class::C::@method::[]=
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional i @33
+                  type: int
+                requiredPositional v @41
+                  type: bool
+              returnType: void
+''');
+  }
+
+  test_class_operator_less_equal() async {
+    var library = await buildLibrary('''
+class C {
+  bool operator<=(C other) => false;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            <= @25
+              reference: <testLibraryFragment>::@class::C::@method::<=
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional other @30
+                  type: C
+              returnType: bool
+''');
+  }
+
+  test_class_ref_nullability_none() async {
+    var library = await buildLibrary('''
+class C {}
+C c;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+      topLevelVariables
+        static c @13
+          reference: <testLibraryFragment>::@topLevelVariable::c
+          enclosingElement: <testLibraryFragment>
+          type: C
+      accessors
+        synthetic static get c @-1
+          reference: <testLibraryFragment>::@getter::c
+          enclosingElement: <testLibraryFragment>
+          returnType: C
+        synthetic static set c= @-1
+          reference: <testLibraryFragment>::@setter::c
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _c @-1
+              type: C
+          returnType: void
+''');
+  }
+
+  test_class_ref_nullability_question() async {
+    var library = await buildLibrary('''
+class C {}
+C? c;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+      topLevelVariables
+        static c @14
+          reference: <testLibraryFragment>::@topLevelVariable::c
+          enclosingElement: <testLibraryFragment>
+          type: C?
+      accessors
+        synthetic static get c @-1
+          reference: <testLibraryFragment>::@getter::c
+          enclosingElement: <testLibraryFragment>
+          returnType: C?
+        synthetic static set c= @-1
+          reference: <testLibraryFragment>::@setter::c
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _c @-1
+              type: C?
+          returnType: void
+''');
+  }
+
+  test_class_sealed() async {
+    var library = await buildLibrary('sealed class C {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        abstract sealed class C @13
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_sealed_induced_base_extends_base() async {
+    var library = await buildLibrary('''
+base class A {}
+sealed class B extends A {}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        base class A @11
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        abstract sealed base class B @29
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_sealed_induced_base_implements_base() async {
+    var library = await buildLibrary('''
+base class A {}
+sealed class B implements A {}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        base class A @11
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        abstract sealed base class B @29
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          interfaces
+            A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+''');
+  }
+
+  test_class_sealed_induced_base_implements_final() async {
+    var library = await buildLibrary('''
+final class A {}
+sealed class B implements A {}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        final class A @12
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        abstract sealed base class B @30
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          interfaces
+            A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+''');
+  }
+
+  test_class_sealed_induced_final_extends_final() async {
+    var library = await buildLibrary('''
+final class A {}
+sealed class B extends A {}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        final class A @12
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        abstract sealed final class B @30
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_sealed_induced_final_with_base_mixin() async {
+    var library = await buildLibrary('''
+base mixin A {}
+interface class B {}
+sealed class C extends B with A {}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        interface class B @32
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+        abstract sealed final class C @50
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: B
+          mixins
+            A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              superConstructor: <testLibraryFragment>::@class::B::@constructor::new
+      mixins
+        base mixin A @11
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_class_sealed_induced_interface_extends_interface() async {
+    var library = await buildLibrary('''
+interface class A {}
+sealed class B extends A {}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        interface class A @16
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        abstract sealed interface class B @34
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_class_sealed_induced_none_implements_interface() async {
+    var library = await buildLibrary('''
+interface class A {}
+sealed class B implements A {}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        interface class A @16
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        abstract sealed class B @34
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          interfaces
+            A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+''');
+  }
+
+  test_class_setter_abstract() async {
+    var library =
+        await buildLibrary('abstract class C { void set x(int value); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        abstract class C @15
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic x @-1
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            abstract set x= @28
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional value @34
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_setter_covariant() async {
+    var library =
+        await buildLibrary('class C { void set x(covariant int value); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic x @-1
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            abstract set x= @19
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional covariant value @35
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_setter_external() async {
+    var library =
+        await buildLibrary('class C { external void set x(int value); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic x @-1
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            external set x= @28
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional value @34
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_setter_implicit_param_type() async {
+    var library = await buildLibrary('class C { void set x(value) {} }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic x @-1
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            set x= @19
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional value @21
+                  type: dynamic
+              returnType: void
+''');
+  }
+
+  test_class_setter_implicit_return_type() async {
+    var library = await buildLibrary('class C { set x(int value) {} }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic x @-1
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            set x= @14
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional value @20
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_setter_inferred_type_conflictingInheritance() async {
+    var library = await buildLibrary('''
+class A {
+  int t;
+}
+class B extends A {
+  double t;
+}
+class C extends A implements B {
+}
+class D extends C {
+  void set t(p) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            t @16
+              reference: <testLibraryFragment>::@class::A::@field::t
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            synthetic get t @-1
+              reference: <testLibraryFragment>::@class::A::@getter::t
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+            synthetic set t= @-1
+              reference: <testLibraryFragment>::@class::A::@setter::t
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _t @-1
+                  type: int
+              returnType: void
+        class B @27
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          fields
+            t @50
+              reference: <testLibraryFragment>::@class::B::@field::t
+              enclosingElement: <testLibraryFragment>::@class::B
+              type: double
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+          accessors
+            synthetic get t @-1
+              reference: <testLibraryFragment>::@class::B::@getter::t
+              enclosingElement: <testLibraryFragment>::@class::B
+              returnType: double
+            synthetic set t= @-1
+              reference: <testLibraryFragment>::@class::B::@setter::t
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                requiredPositional _t @-1
+                  type: double
+              returnType: void
+        class C @61
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          interfaces
+            B
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+        class D @96
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          supertype: C
+          fields
+            synthetic t @-1
+              reference: <testLibraryFragment>::@class::D::@field::t
+              enclosingElement: <testLibraryFragment>::@class::D
+              type: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+              superConstructor: <testLibraryFragment>::@class::C::@constructor::new
+          accessors
+            set t= @121
+              reference: <testLibraryFragment>::@class::D::@setter::t
+              enclosingElement: <testLibraryFragment>::@class::D
+              parameters
+                requiredPositional p @123
+                  type: dynamic
+              returnType: void
+''');
+  }
+
+  test_class_setter_inferred_type_nonStatic_implicit_param() async {
+    var library =
+        await buildLibrary('class C extends D { void set f(value) {} }'
+            ' abstract class D { void set f(int value); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: D
+          fields
+            synthetic f @-1
+              reference: <testLibraryFragment>::@class::C::@field::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              superConstructor: <testLibraryFragment>::@class::D::@constructor::new
+          accessors
+            set f= @29
+              reference: <testLibraryFragment>::@class::C::@setter::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional value @31
+                  type: int
+              returnType: void
+        abstract class D @58
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic f @-1
+              reference: <testLibraryFragment>::@class::D::@field::f
+              enclosingElement: <testLibraryFragment>::@class::D
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+          accessors
+            abstract set f= @71
+              reference: <testLibraryFragment>::@class::D::@setter::f
+              enclosingElement: <testLibraryFragment>::@class::D
+              parameters
+                requiredPositional value @77
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_setter_inferred_type_static_implicit_return() async {
+    var library = await buildLibrary('''
+class C {
+  static set f(int value) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic static f @-1
+              reference: <testLibraryFragment>::@class::C::@field::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            static set f= @23
+              reference: <testLibraryFragment>::@class::C::@setter::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional value @29
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_setter_invalid_named_parameter() async {
+    var library = await buildLibrary('class C { void set x({a}) {} }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic x @-1
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            set x= @19
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                optionalNamed default a @22
+                  reference: <testLibraryFragment>::@class::C::@setter::x::@parameter::a
+                  type: dynamic
+              returnType: void
+''');
+  }
+
+  test_class_setter_invalid_no_parameter() async {
+    var library = await buildLibrary('class C { void set x() {} }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic x @-1
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            set x= @19
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: void
+''');
+  }
+
+  test_class_setter_invalid_optional_parameter() async {
+    var library = await buildLibrary('class C { void set x([a]) {} }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic x @-1
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            set x= @19
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                optionalPositional default a @22
+                  type: dynamic
+              returnType: void
+''');
+  }
+
+  test_class_setter_invalid_too_many_parameters() async {
+    var library = await buildLibrary('class C { void set x(a, b) {} }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic x @-1
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            set x= @19
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional a @21
+                  type: dynamic
+                requiredPositional b @24
+                  type: dynamic
+              returnType: void
+''');
+  }
+
+  test_class_setter_invokesSuperSelf_getter() async {
+    var library = await buildLibrary(r'''
+class A {
+  set foo(int _) {
+    super.foo;
+  }
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            set foo= @16
+              reference: <testLibraryFragment>::@class::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _ @24
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_setter_invokesSuperSelf_setter() async {
+    var library = await buildLibrary(r'''
+class A {
+  set foo(int _) {
+    super.foo = 0;
+  }
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            set foo= @16 invokesSuperSelf
+              reference: <testLibraryFragment>::@class::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _ @24
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_setter_native() async {
+    var library = await buildLibrary('''
+class C {
+  void set x(int value) native;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic x @-1
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            external set x= @21
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional value @27
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_setter_static() async {
+    var library =
+        await buildLibrary('class C { static void set x(int value) {} }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic static x @-1
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            static set x= @26
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional value @32
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_class_setters() async {
+    var library = await buildLibrary('''
+class C {
+  void set x(int value) {}
+  set y(value) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic x @-1
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+            synthetic y @-1
+              reference: <testLibraryFragment>::@class::C::@field::y
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            set x= @21
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional value @27
+                  type: int
+              returnType: void
+            set y= @43
+              reference: <testLibraryFragment>::@class::C::@setter::y
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional value @45
+                  type: dynamic
+              returnType: void
+''');
+  }
+
+  test_class_supertype() async {
+    var library = await buildLibrary('''
+class A {}
+class B extends A {}
+''');
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+        class B @17
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+''');
+  }
+
+  test_class_supertype_dynamic() async {
+    var library = await buildLibrary('''
+class A extends dynamic {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+''');
+  }
+
+  test_class_supertype_extensionType() async {
+    var library = await buildLibrary('''
+extension type A(int it) {}
+class B extends A {}
+''');
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class B @34
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @21
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+''');
+  }
+
+  test_class_supertype_genericClass() async {
+    var library = await buildLibrary('''
+class C extends D<int, double> {}
+class D<T1, T2> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: D<int, double>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              superConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::D::@constructor::new
+                substitution: {T1: int, T2: double}
+        class D @40
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T1 @42
+              defaultType: dynamic
+            covariant T2 @46
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+''');
+  }
+
+  test_class_supertype_genericClass_tooManyArguments() async {
+    var library = await buildLibrary('''
+class A<T> {}
+class B extends A<int, String> {}
+''');
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+        class B @20
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A<dynamic>
+''');
+  }
+
+  test_class_supertype_typeArguments_self() async {
+    var library = await buildLibrary('''
+class A<T> {}
+class B extends A<B> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class B @20
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A<B>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::A::@constructor::new
+                substitution: {T: B}
+''');
+  }
+
+  test_class_supertype_typeParameter() async {
+    var library = await buildLibrary('''
+class A<T> extends T<int> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+''');
+  }
+
+  test_class_supertype_unresolved() async {
+    var library = await buildLibrary('class C extends D {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_typeParameters() async {
+    var library = await buildLibrary('class C<T, U> {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+            covariant U @11
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_typeParameters_bound() async {
+    var library = await buildLibrary('''
+class C<T extends Object, U extends D> {}
+class D {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              bound: Object
+              defaultType: Object
+            covariant U @26
+              bound: D
+              defaultType: D
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+        class D @48
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+''');
+  }
+
+  test_class_typeParameters_cycle_1of1() async {
+    var library = await buildLibrary('class C<T extends T> {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              bound: dynamic
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_typeParameters_cycle_2of3() async {
+    var library = await buildLibrary(r'''
+class C<T extends V, U, V extends T> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              bound: dynamic
+              defaultType: dynamic
+            covariant U @21
+              defaultType: dynamic
+            covariant V @24
+              bound: dynamic
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_typeParameters_defaultType_cycle_genericFunctionType() async {
+    var library = await buildLibrary(r'''
+class A<T extends void Function(A)> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              bound: void Function(A<dynamic>)
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+''');
+  }
+
+  test_class_typeParameters_defaultType_cycle_genericFunctionType2() async {
+    var library = await buildLibrary(r'''
+class C<T extends void Function<U extends C>()> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              bound: void Function<U extends C<dynamic>>()
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_typeParameters_defaultType_functionTypeAlias_contravariant() async {
+    var library = await buildLibrary(r'''
+typedef F<X> = void Function(X);
+
+class A<X extends F<X>> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class A @40
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant X @42
+              bound: void Function(X)
+                alias: <testLibraryFragment>::@typeAlias::F
+                  typeArguments
+                    X
+              defaultType: void Function(Never)
+                alias: <testLibraryFragment>::@typeAlias::F
+                  typeArguments
+                    Never
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+      typeAliases
+        F @8
+          reference: <testLibraryFragment>::@typeAlias::F
+          typeParameters
+            contravariant X @10
+              defaultType: dynamic
+          aliasedType: void Function(X)
+          aliasedElement: GenericFunctionTypeElement
+            parameters
+              requiredPositional @-1
+                type: X
+            returnType: void
+''');
+  }
+
+  test_class_typeParameters_defaultType_functionTypeAlias_covariant() async {
+    var library = await buildLibrary(r'''
+typedef F<X> = X Function();
+
+class A<X extends F<X>> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class A @36
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant X @38
+              bound: X Function()
+                alias: <testLibraryFragment>::@typeAlias::F
+                  typeArguments
+                    X
+              defaultType: dynamic Function()
+                alias: <testLibraryFragment>::@typeAlias::F
+                  typeArguments
+                    dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+      typeAliases
+        F @8
+          reference: <testLibraryFragment>::@typeAlias::F
+          typeParameters
+            covariant X @10
+              defaultType: dynamic
+          aliasedType: X Function()
+          aliasedElement: GenericFunctionTypeElement
+            returnType: X
+''');
+  }
+
+  test_class_typeParameters_defaultType_functionTypeAlias_invariant() async {
+    var library = await buildLibrary(r'''
+typedef F<X> = X Function(X);
+
+class A<X extends F<X>> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class A @37
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant X @39
+              bound: X Function(X)
+                alias: <testLibraryFragment>::@typeAlias::F
+                  typeArguments
+                    X
+              defaultType: dynamic Function(dynamic)
+                alias: <testLibraryFragment>::@typeAlias::F
+                  typeArguments
+                    dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+      typeAliases
+        F @8
+          reference: <testLibraryFragment>::@typeAlias::F
+          typeParameters
+            invariant X @10
+              defaultType: dynamic
+          aliasedType: X Function(X)
+          aliasedElement: GenericFunctionTypeElement
+            parameters
+              requiredPositional @-1
+                type: X
+            returnType: X
+''');
+  }
+
+  test_class_typeParameters_defaultType_functionTypeAlias_invariant_legacy() async {
+    var library = await buildLibrary(r'''
+typedef F<X> = X Function(X);
+
+class A<X extends F<X>> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class A @37
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant X @39
+              bound: X Function(X)
+                alias: <testLibraryFragment>::@typeAlias::F
+                  typeArguments
+                    X
+              defaultType: dynamic Function(dynamic)
+                alias: <testLibraryFragment>::@typeAlias::F
+                  typeArguments
+                    dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+      typeAliases
+        F @8
+          reference: <testLibraryFragment>::@typeAlias::F
+          typeParameters
+            invariant X @10
+              defaultType: dynamic
+          aliasedType: X Function(X)
+          aliasedElement: GenericFunctionTypeElement
+            parameters
+              requiredPositional @-1
+                type: X
+            returnType: X
+''');
+  }
+
+  test_class_typeParameters_defaultType_genericFunctionType_both() async {
+    var library = await buildLibrary(r'''
+class A<X extends X Function(X)> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant X @8
+              bound: X Function(X)
+              defaultType: dynamic Function(Never)
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+''');
+  }
+
+  test_class_typeParameters_defaultType_genericFunctionType_contravariant() async {
+    var library = await buildLibrary(r'''
+class A<X extends void Function(X)> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant X @8
+              bound: void Function(X)
+              defaultType: void Function(Never)
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+''');
+  }
+
+  test_class_typeParameters_defaultType_genericFunctionType_covariant() async {
+    var library = await buildLibrary(r'''
+class A<X extends X Function()> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant X @8
+              bound: X Function()
+              defaultType: dynamic Function()
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+''');
+  }
+
+  test_class_typeParameters_defaultType_genericFunctionType_covariant_legacy() async {
+    var library = await buildLibrary(r'''
+class A<X extends X Function()> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant X @8
+              bound: X Function()
+              defaultType: dynamic Function()
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+''');
+  }
+
+  test_class_typeParameters_defaultType_typeAlias_interface_contravariant() async {
+    var library = await buildLibrary(r'''
+typedef A<X> = List<void Function(X)>;
+
+class B<X extends A<X>> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class B @46
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant X @48
+              bound: List<void Function(X)>
+                alias: <testLibraryFragment>::@typeAlias::A
+                  typeArguments
+                    X
+              defaultType: List<void Function(Never)>
+                alias: <testLibraryFragment>::@typeAlias::A
+                  typeArguments
+                    Never
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+      typeAliases
+        A @8
+          reference: <testLibraryFragment>::@typeAlias::A
+          typeParameters
+            contravariant X @10
+              defaultType: dynamic
+          aliasedType: List<void Function(X)>
+''');
+  }
+
+  test_class_typeParameters_defaultType_typeAlias_interface_covariant() async {
+    var library = await buildLibrary(r'''
+typedef A<X> = Map<X, int>;
+
+class B<X extends A<X>> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class B @35
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant X @37
+              bound: Map<X, int>
+                alias: <testLibraryFragment>::@typeAlias::A
+                  typeArguments
+                    X
+              defaultType: Map<dynamic, int>
+                alias: <testLibraryFragment>::@typeAlias::A
+                  typeArguments
+                    dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+      typeAliases
+        A @8
+          reference: <testLibraryFragment>::@typeAlias::A
+          typeParameters
+            covariant X @10
+              defaultType: dynamic
+          aliasedType: Map<X, int>
+''');
+  }
+
+  test_class_typeParameters_f_bound_complex() async {
+    var library = await buildLibrary('class C<T extends List<U>, U> {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              bound: List<U>
+              defaultType: List<dynamic>
+            covariant U @27
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_typeParameters_f_bound_simple() async {
+    var library = await buildLibrary('class C<T extends U, U> {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              bound: U
+              defaultType: dynamic
+            covariant U @21
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_typeParameters_variance_contravariant() async {
+    var library = await buildLibrary('class C<in T> {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            contravariant T @11
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_typeParameters_variance_covariant() async {
+    var library = await buildLibrary('class C<out T> {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @12
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_typeParameters_variance_invariant() async {
+    var library = await buildLibrary('class C<inout T> {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            invariant T @14
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_class_typeParameters_variance_multiple() async {
+    var library = await buildLibrary('class C<inout T, in U, out V> {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            invariant T @14
+              defaultType: dynamic
+            contravariant U @20
+              defaultType: dynamic
+            covariant V @27
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_classAlias() async {
+    var library = await buildLibrary('''
+class C = D with E, F, G;
+class D {}
+class E {}
+class F {}
+class G {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class alias C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: D
+          mixins
+            E
+            F
+            G
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::D::@constructor::new
+              superConstructor: <testLibraryFragment>::@class::D::@constructor::new
+        class D @32
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+        class E @43
+          reference: <testLibraryFragment>::@class::E
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::E
+        class F @54
+          reference: <testLibraryFragment>::@class::F
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::F::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::F
+        class G @65
+          reference: <testLibraryFragment>::@class::G
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::G::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::G
+''');
+  }
+
+  test_classAlias_abstract() async {
+    var library = await buildLibrary('''
+abstract class C = D with E;
+class D {}
+class E {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        abstract class alias C @15
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: D
+          mixins
+            E
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::D::@constructor::new
+              superConstructor: <testLibraryFragment>::@class::D::@constructor::new
+        class D @35
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+        class E @46
+          reference: <testLibraryFragment>::@class::E
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::E
+''');
+  }
+
+  test_classAlias_base() async {
+    var library = await buildLibrary('''
+base class C = Object with M;
+mixin M {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        base class alias C @11
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: Object
+          mixins
+            M
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: dart:core::<fragment>::@class::Object::@constructor::new
+      mixins
+        mixin M @36
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_classAlias_constructors_default() async {
+    var library = await buildLibrary('''
+class A {}
+mixin class M {}
+class X = A with M;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        mixin class M @23
+          reference: <testLibraryFragment>::@class::M
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::M::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::M
+        class alias X @34
+          reference: <testLibraryFragment>::@class::X
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          mixins
+            M
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::X::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::X
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::A::@constructor::new
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_classAlias_constructors_dependencies() async {
+    var library = await buildLibrary('''
+class A {
+  A(int i);
+}
+mixin class M1 {}
+mixin class M2 {}
+
+class C2 = C1 with M2;
+class C1 = A with M1;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @12
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional i @18
+                  type: int
+        mixin class M1 @36
+          reference: <testLibraryFragment>::@class::M1
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::M1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::M1
+        mixin class M2 @54
+          reference: <testLibraryFragment>::@class::M2
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::M2::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::M2
+        class alias C2 @67
+          reference: <testLibraryFragment>::@class::C2
+          enclosingElement: <testLibraryFragment>
+          supertype: C1
+          mixins
+            M2
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C2::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C2
+              parameters
+                requiredPositional i @-1
+                  type: int
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    arguments
+                      SimpleIdentifier
+                        token: i @-1
+                        staticElement: <testLibraryFragment>::@class::C2::@constructor::new::@parameter::i
+                        staticType: int
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::C1::@constructor::new
+              superConstructor: <testLibraryFragment>::@class::C1::@constructor::new
+        class alias C1 @90
+          reference: <testLibraryFragment>::@class::C1
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          mixins
+            M1
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C1
+              parameters
+                requiredPositional i @-1
+                  type: int
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    arguments
+                      SimpleIdentifier
+                        token: i @-1
+                        staticElement: <testLibraryFragment>::@class::C1::@constructor::new::@parameter::i
+                        staticType: int
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::A::@constructor::new
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_classAlias_constructors_optionalParameters() async {
+    var library = await buildLibrary('''
+class A {
+  A.c1(int a);
+  A.c2(int a, [int? b, int c = 0]);
+  A.c3(int a, {int? b, int c = 0});
+}
+
+mixin M {}
+
+class C = A with M;
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            c1 @14
+              reference: <testLibraryFragment>::@class::A::@constructor::c1
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 13
+              nameEnd: 16
+              parameters
+                requiredPositional a @21
+                  type: int
+            c2 @29
+              reference: <testLibraryFragment>::@class::A::@constructor::c2
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 28
+              nameEnd: 31
+              parameters
+                requiredPositional a @36
+                  type: int
+                optionalPositional default b @45
+                  type: int?
+                optionalPositional default c @52
+                  type: int
+                  constantInitializer
+                    IntegerLiteral
+                      literal: 0 @56
+                      staticType: int
+            c3 @65
+              reference: <testLibraryFragment>::@class::A::@constructor::c3
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 64
+              nameEnd: 67
+              parameters
+                requiredPositional a @72
+                  type: int
+                optionalNamed default b @81
+                  reference: <testLibraryFragment>::@class::A::@constructor::c3::@parameter::b
+                  type: int?
+                optionalNamed default c @88
+                  reference: <testLibraryFragment>::@class::A::@constructor::c3::@parameter::c
+                  type: int
+                  constantInitializer
+                    IntegerLiteral
+                      literal: 0 @92
+                      staticType: int
+        class alias C @118
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          mixins
+            M
+          constructors
+            synthetic c1 @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::c1
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional a @-1
+                  type: int
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  period: . @0
+                  constructorName: SimpleIdentifier
+                    token: c1 @-1
+                    staticElement: <testLibraryFragment>::@class::A::@constructor::c1
+                    staticType: null
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    arguments
+                      SimpleIdentifier
+                        token: a @-1
+                        staticElement: <testLibraryFragment>::@class::C::@constructor::c1::@parameter::a
+                        staticType: int
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::A::@constructor::c1
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::c1
+            synthetic c2 @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::c2
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional a @-1
+                  type: int
+                optionalPositional default b @-1
+                  type: int?
+                optionalPositional default c @-1
+                  type: int
+                  constantInitializer
+                    IntegerLiteral
+                      literal: 0 @56
+                      staticType: int
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  period: . @0
+                  constructorName: SimpleIdentifier
+                    token: c2 @-1
+                    staticElement: <testLibraryFragment>::@class::A::@constructor::c2
+                    staticType: null
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    arguments
+                      SimpleIdentifier
+                        token: a @-1
+                        staticElement: <testLibraryFragment>::@class::C::@constructor::c2::@parameter::a
+                        staticType: int
+                      SimpleIdentifier
+                        token: b @-1
+                        staticElement: <testLibraryFragment>::@class::C::@constructor::c2::@parameter::b
+                        staticType: int?
+                      SimpleIdentifier
+                        token: c @-1
+                        staticElement: <testLibraryFragment>::@class::C::@constructor::c2::@parameter::c
+                        staticType: int
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::A::@constructor::c2
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::c2
+            synthetic c3 @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::c3
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional a @-1
+                  type: int
+                optionalNamed default b @-1
+                  reference: <testLibraryFragment>::@class::C::@constructor::c3::@parameter::b
+                  type: int?
+                optionalNamed default c @-1
+                  reference: <testLibraryFragment>::@class::C::@constructor::c3::@parameter::c
+                  type: int
+                  constantInitializer
+                    IntegerLiteral
+                      literal: 0 @92
+                      staticType: int
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  period: . @0
+                  constructorName: SimpleIdentifier
+                    token: c3 @-1
+                    staticElement: <testLibraryFragment>::@class::A::@constructor::c3
+                    staticType: null
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    arguments
+                      SimpleIdentifier
+                        token: a @-1
+                        staticElement: <testLibraryFragment>::@class::C::@constructor::c3::@parameter::a
+                        staticType: int
+                      SimpleIdentifier
+                        token: b @-1
+                        staticElement: <testLibraryFragment>::@class::C::@constructor::c3::@parameter::b
+                        staticType: int?
+                      SimpleIdentifier
+                        token: c @-1
+                        staticElement: <testLibraryFragment>::@class::C::@constructor::c3::@parameter::c
+                        staticType: int
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::A::@constructor::c3
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::c3
+      mixins
+        mixin M @106
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_classAlias_constructors_requiredParameters() async {
+    var library = await buildLibrary('''
+class A<T extends num> {
+  A(T x, T y);
+}
+
+mixin M {}
+
+class B<E extends num> = A<E> with M;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              bound: num
+              defaultType: num
+          constructors
+            @27
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional x @31
+                  type: T
+                requiredPositional y @36
+                  type: T
+        class alias B @61
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant E @63
+              bound: num
+              defaultType: num
+          supertype: A<E>
+          mixins
+            M
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                requiredPositional x @-1
+                  type: E
+                requiredPositional y @-1
+                  type: E
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    arguments
+                      SimpleIdentifier
+                        token: x @-1
+                        staticElement: <testLibraryFragment>::@class::B::@constructor::new::@parameter::x
+                        staticType: E
+                      SimpleIdentifier
+                        token: y @-1
+                        staticElement: <testLibraryFragment>::@class::B::@constructor::new::@parameter::y
+                        staticType: E
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::A::@constructor::new
+              superConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::A::@constructor::new
+                substitution: {T: E}
+      mixins
+        mixin M @49
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_classAlias_documented() async {
+    var library = await buildLibrary('''
+/**
+ * Docs
+ */
+class C = D with E;
+
+class D {}
+class E {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class alias C @22
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /**\n * Docs\n */
+          supertype: D
+          mixins
+            E
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::D::@constructor::new
+              superConstructor: <testLibraryFragment>::@class::D::@constructor::new
+        class D @43
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+        class E @54
+          reference: <testLibraryFragment>::@class::E
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::E
+''');
+  }
+
+  test_classAlias_documented_tripleSlash() async {
+    var library = await buildLibrary('''
+/// aaa
+/// b
+/// cc
+class C = D with E;
+
+class D {}
+class E {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class alias C @27
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// aaa\n/// b\n/// cc
+          supertype: D
+          mixins
+            E
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::D::@constructor::new
+              superConstructor: <testLibraryFragment>::@class::D::@constructor::new
+        class D @48
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+        class E @59
+          reference: <testLibraryFragment>::@class::E
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::E
+''');
+  }
+
+  test_classAlias_documented_withLeadingNonDocumentation() async {
+    var library = await buildLibrary('''
+// Extra comment so doc comment offset != 0
+/**
+ * Docs
+ */
+class C = D with E;
+
+class D {}
+class E {}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class alias C @66
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /**\n * Docs\n */
+          supertype: D
+          mixins
+            E
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::D::@constructor::new
+              superConstructor: <testLibraryFragment>::@class::D::@constructor::new
+        class D @87
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+        class E @98
+          reference: <testLibraryFragment>::@class::E
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::E
+''');
+  }
+
+  test_classAlias_final() async {
+    var library = await buildLibrary('''
+final class C = Object with M;
+mixin M {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        final class alias C @12
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: Object
+          mixins
+            M
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: dart:core::<fragment>::@class::Object::@constructor::new
+      mixins
+        mixin M @37
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_classAlias_generic() async {
+    var library = await buildLibrary('''
+class Z = A with B<int>, C<double>;
+class A {}
+class B<B1> {}
+class C<C1> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class alias Z @6
+          reference: <testLibraryFragment>::@class::Z
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          mixins
+            B<int>
+            C<double>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::Z::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::Z
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::A::@constructor::new
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+        class A @42
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class B @53
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant B1 @55
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+        class C @68
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant C1 @70
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_classAlias_interface() async {
+    var library = await buildLibrary('''
+interface class C = Object with M;
+mixin M {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        interface class alias C @16
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: Object
+          mixins
+            M
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: dart:core::<fragment>::@class::Object::@constructor::new
+      mixins
+        mixin M @41
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_classAlias_invalid_extendsEnum() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+enum E { v }
+mixin M {}
+''');
+
+    var library = await buildLibrary('''
+import 'a.dart';
+class A = E with M;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class alias A @23
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          supertype: Object
+          mixins
+            M
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: dart:core::<fragment>::@class::Object::@constructor::new
+''');
+  }
+
+  test_classAlias_invalid_extendsMixin() async {
+    var library = await buildLibrary('''
+mixin M1 {}
+mixin M2 {}
+class A = M1 with M2;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class alias A @30
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          supertype: Object
+          mixins
+            M2
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: dart:core::<fragment>::@class::Object::@constructor::new
+      mixins
+        mixin M1 @6
+          reference: <testLibraryFragment>::@mixin::M1
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+        mixin M2 @18
+          reference: <testLibraryFragment>::@mixin::M2
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_classAlias_mixin_class() async {
+    var library = await buildLibrary('''
+mixin class C = Object with M;
+mixin M {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        mixin class alias C @12
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: Object
+          mixins
+            M
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: dart:core::<fragment>::@class::Object::@constructor::new
+      mixins
+        mixin M @37
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_classAlias_notSimplyBounded_self() async {
+    var library = await buildLibrary('''
+class C<T extends C> = D with E;
+class D {}
+class E {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class alias C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              bound: C<dynamic>
+              defaultType: dynamic
+          supertype: D
+          mixins
+            E
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::D::@constructor::new
+              superConstructor: <testLibraryFragment>::@class::D::@constructor::new
+        class D @39
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+        class E @50
+          reference: <testLibraryFragment>::@class::E
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::E
+''');
+  }
+
+  test_classAlias_notSimplyBounded_simple_no_type_parameter_bound() async {
+    // If no bounds are specified, then the class is simply bounded by syntax
+    // alone, so there is no reason to assign it a slot.
+    var library = await buildLibrary('''
+class C<T> = D with E;
+class D {}
+class E {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class alias C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          supertype: D
+          mixins
+            E
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::D::@constructor::new
+              superConstructor: <testLibraryFragment>::@class::D::@constructor::new
+        class D @29
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+        class E @40
+          reference: <testLibraryFragment>::@class::E
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::E
+''');
+  }
+
+  test_classAlias_notSimplyBounded_simple_non_generic() async {
+    // If no type parameters are specified, then the class is simply bounded, so
+    // there is no reason to assign it a slot.
+    var library = await buildLibrary('''
+class C = D with E;
+class D {}
+class E {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class alias C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: D
+          mixins
+            E
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::D::@constructor::new
+              superConstructor: <testLibraryFragment>::@class::D::@constructor::new
+        class D @26
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+        class E @37
+          reference: <testLibraryFragment>::@class::E
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::E
+''');
+  }
+
+  test_classAlias_sealed() async {
+    var library = await buildLibrary('''
+sealed class C = Object with M;
+mixin M {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        abstract sealed class alias C @13
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: Object
+          mixins
+            M
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: dart:core::<fragment>::@class::Object::@constructor::new
+      mixins
+        mixin M @38
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_classAlias_with_const_constructors() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class Base {
+  const Base._priv();
+  const Base();
+  const Base.named();
+}
+''');
+    var library = await buildLibrary('''
+import "a.dart";
+class M {}
+class MixinApp = Base with M;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class M @23
+          reference: <testLibraryFragment>::@class::M
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::M::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::M
+        class alias MixinApp @34
+          reference: <testLibraryFragment>::@class::MixinApp
+          enclosingElement: <testLibraryFragment>
+          supertype: Base
+          mixins
+            M
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@class::MixinApp::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::MixinApp
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: package:test/a.dart::<fragment>::@class::Base::@constructor::new
+              superConstructor: package:test/a.dart::<fragment>::@class::Base::@constructor::new
+            synthetic const named @-1
+              reference: <testLibraryFragment>::@class::MixinApp::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::MixinApp
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  period: . @0
+                  constructorName: SimpleIdentifier
+                    token: named @-1
+                    staticElement: package:test/a.dart::<fragment>::@class::Base::@constructor::named
+                    staticType: null
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: package:test/a.dart::<fragment>::@class::Base::@constructor::named
+              superConstructor: package:test/a.dart::<fragment>::@class::Base::@constructor::named
+''');
+  }
+
+  test_classAlias_with_forwarding_constructors() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class Base {
+  bool x = true;
+  Base._priv();
+  Base();
+  Base.noArgs();
+  Base.requiredArg(x);
+  Base.positionalArg([bool x = true]);
+  Base.positionalArg2([this.x = true]);
+  Base.namedArg({int x = 42});
+  Base.namedArg2({this.x = true});
+  factory Base.fact() => Base();
+  factory Base.fact2() = Base.noArgs;
+}
+''');
+    var library = await buildLibrary('''
+import "a.dart";
+class M {}
+class MixinApp = Base with M;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class M @23
+          reference: <testLibraryFragment>::@class::M
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::M::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::M
+        class alias MixinApp @34
+          reference: <testLibraryFragment>::@class::MixinApp
+          enclosingElement: <testLibraryFragment>
+          supertype: Base
+          mixins
+            M
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::MixinApp::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::MixinApp
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: package:test/a.dart::<fragment>::@class::Base::@constructor::new
+              superConstructor: package:test/a.dart::<fragment>::@class::Base::@constructor::new
+            synthetic noArgs @-1
+              reference: <testLibraryFragment>::@class::MixinApp::@constructor::noArgs
+              enclosingElement: <testLibraryFragment>::@class::MixinApp
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  period: . @0
+                  constructorName: SimpleIdentifier
+                    token: noArgs @-1
+                    staticElement: package:test/a.dart::<fragment>::@class::Base::@constructor::noArgs
+                    staticType: null
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: package:test/a.dart::<fragment>::@class::Base::@constructor::noArgs
+              superConstructor: package:test/a.dart::<fragment>::@class::Base::@constructor::noArgs
+            synthetic requiredArg @-1
+              reference: <testLibraryFragment>::@class::MixinApp::@constructor::requiredArg
+              enclosingElement: <testLibraryFragment>::@class::MixinApp
+              parameters
+                requiredPositional x @-1
+                  type: dynamic
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  period: . @0
+                  constructorName: SimpleIdentifier
+                    token: requiredArg @-1
+                    staticElement: package:test/a.dart::<fragment>::@class::Base::@constructor::requiredArg
+                    staticType: null
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    arguments
+                      SimpleIdentifier
+                        token: x @-1
+                        staticElement: <testLibraryFragment>::@class::MixinApp::@constructor::requiredArg::@parameter::x
+                        staticType: dynamic
+                    rightParenthesis: ) @0
+                  staticElement: package:test/a.dart::<fragment>::@class::Base::@constructor::requiredArg
+              superConstructor: package:test/a.dart::<fragment>::@class::Base::@constructor::requiredArg
+            synthetic positionalArg @-1
+              reference: <testLibraryFragment>::@class::MixinApp::@constructor::positionalArg
+              enclosingElement: <testLibraryFragment>::@class::MixinApp
+              parameters
+                optionalPositional default x @-1
+                  type: bool
+                  constantInitializer
+                    BooleanLiteral
+                      literal: true @127
+                      staticType: bool
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  period: . @0
+                  constructorName: SimpleIdentifier
+                    token: positionalArg @-1
+                    staticElement: package:test/a.dart::<fragment>::@class::Base::@constructor::positionalArg
+                    staticType: null
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    arguments
+                      SimpleIdentifier
+                        token: x @-1
+                        staticElement: <testLibraryFragment>::@class::MixinApp::@constructor::positionalArg::@parameter::x
+                        staticType: bool
+                    rightParenthesis: ) @0
+                  staticElement: package:test/a.dart::<fragment>::@class::Base::@constructor::positionalArg
+              superConstructor: package:test/a.dart::<fragment>::@class::Base::@constructor::positionalArg
+            synthetic positionalArg2 @-1
+              reference: <testLibraryFragment>::@class::MixinApp::@constructor::positionalArg2
+              enclosingElement: <testLibraryFragment>::@class::MixinApp
+              parameters
+                optionalPositional default final x @-1
+                  type: bool
+                  constantInitializer
+                    BooleanLiteral
+                      literal: true @167
+                      staticType: bool
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  period: . @0
+                  constructorName: SimpleIdentifier
+                    token: positionalArg2 @-1
+                    staticElement: package:test/a.dart::<fragment>::@class::Base::@constructor::positionalArg2
+                    staticType: null
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    arguments
+                      SimpleIdentifier
+                        token: x @-1
+                        staticElement: <testLibraryFragment>::@class::MixinApp::@constructor::positionalArg2::@parameter::x
+                        staticType: bool
+                    rightParenthesis: ) @0
+                  staticElement: package:test/a.dart::<fragment>::@class::Base::@constructor::positionalArg2
+              superConstructor: package:test/a.dart::<fragment>::@class::Base::@constructor::positionalArg2
+            synthetic namedArg @-1
+              reference: <testLibraryFragment>::@class::MixinApp::@constructor::namedArg
+              enclosingElement: <testLibraryFragment>::@class::MixinApp
+              parameters
+                optionalNamed default x @-1
+                  reference: <testLibraryFragment>::@class::MixinApp::@constructor::namedArg::@parameter::x
+                  type: int
+                  constantInitializer
+                    IntegerLiteral
+                      literal: 42 @200
+                      staticType: int
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  period: . @0
+                  constructorName: SimpleIdentifier
+                    token: namedArg @-1
+                    staticElement: package:test/a.dart::<fragment>::@class::Base::@constructor::namedArg
+                    staticType: null
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    arguments
+                      SimpleIdentifier
+                        token: x @-1
+                        staticElement: <testLibraryFragment>::@class::MixinApp::@constructor::namedArg::@parameter::x
+                        staticType: int
+                    rightParenthesis: ) @0
+                  staticElement: package:test/a.dart::<fragment>::@class::Base::@constructor::namedArg
+              superConstructor: package:test/a.dart::<fragment>::@class::Base::@constructor::namedArg
+            synthetic namedArg2 @-1
+              reference: <testLibraryFragment>::@class::MixinApp::@constructor::namedArg2
+              enclosingElement: <testLibraryFragment>::@class::MixinApp
+              parameters
+                optionalNamed default final x @-1
+                  reference: <testLibraryFragment>::@class::MixinApp::@constructor::namedArg2::@parameter::x
+                  type: bool
+                  constantInitializer
+                    BooleanLiteral
+                      literal: true @233
+                      staticType: bool
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  period: . @0
+                  constructorName: SimpleIdentifier
+                    token: namedArg2 @-1
+                    staticElement: package:test/a.dart::<fragment>::@class::Base::@constructor::namedArg2
+                    staticType: null
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    arguments
+                      SimpleIdentifier
+                        token: x @-1
+                        staticElement: <testLibraryFragment>::@class::MixinApp::@constructor::namedArg2::@parameter::x
+                        staticType: bool
+                    rightParenthesis: ) @0
+                  staticElement: package:test/a.dart::<fragment>::@class::Base::@constructor::namedArg2
+              superConstructor: package:test/a.dart::<fragment>::@class::Base::@constructor::namedArg2
+''');
+  }
+
+  test_classAlias_with_forwarding_constructors_type_substitution() async {
+    var library = await buildLibrary('''
+class Base<T> {
+  Base.ctor(T t, List<T> l);
+}
+class M {}
+class MixinApp = Base with M;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class Base @6
+          reference: <testLibraryFragment>::@class::Base
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @11
+              defaultType: dynamic
+          constructors
+            ctor @23
+              reference: <testLibraryFragment>::@class::Base::@constructor::ctor
+              enclosingElement: <testLibraryFragment>::@class::Base
+              periodOffset: 22
+              nameEnd: 27
+              parameters
+                requiredPositional t @30
+                  type: T
+                requiredPositional l @41
+                  type: List<T>
+        class M @53
+          reference: <testLibraryFragment>::@class::M
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::M::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::M
+        class alias MixinApp @64
+          reference: <testLibraryFragment>::@class::MixinApp
+          enclosingElement: <testLibraryFragment>
+          supertype: Base<dynamic>
+          mixins
+            M
+          constructors
+            synthetic ctor @-1
+              reference: <testLibraryFragment>::@class::MixinApp::@constructor::ctor
+              enclosingElement: <testLibraryFragment>::@class::MixinApp
+              parameters
+                requiredPositional t @-1
+                  type: dynamic
+                requiredPositional l @-1
+                  type: List<dynamic>
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  period: . @0
+                  constructorName: SimpleIdentifier
+                    token: ctor @-1
+                    staticElement: <testLibraryFragment>::@class::Base::@constructor::ctor
+                    staticType: null
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    arguments
+                      SimpleIdentifier
+                        token: t @-1
+                        staticElement: <testLibraryFragment>::@class::MixinApp::@constructor::ctor::@parameter::t
+                        staticType: dynamic
+                      SimpleIdentifier
+                        token: l @-1
+                        staticElement: <testLibraryFragment>::@class::MixinApp::@constructor::ctor::@parameter::l
+                        staticType: List<dynamic>
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::Base::@constructor::ctor
+              superConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::Base::@constructor::ctor
+                substitution: {T: dynamic}
+''');
+  }
+
+  test_classAlias_with_forwarding_constructors_type_substitution_complex() async {
+    var library = await buildLibrary('''
+class Base<T> {
+  Base.ctor(T t, List<T> l);
+}
+class M {}
+class MixinApp<U> = Base<List<U>> with M;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class Base @6
+          reference: <testLibraryFragment>::@class::Base
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @11
+              defaultType: dynamic
+          constructors
+            ctor @23
+              reference: <testLibraryFragment>::@class::Base::@constructor::ctor
+              enclosingElement: <testLibraryFragment>::@class::Base
+              periodOffset: 22
+              nameEnd: 27
+              parameters
+                requiredPositional t @30
+                  type: T
+                requiredPositional l @41
+                  type: List<T>
+        class M @53
+          reference: <testLibraryFragment>::@class::M
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::M::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::M
+        class alias MixinApp @64
+          reference: <testLibraryFragment>::@class::MixinApp
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant U @73
+              defaultType: dynamic
+          supertype: Base<List<U>>
+          mixins
+            M
+          constructors
+            synthetic ctor @-1
+              reference: <testLibraryFragment>::@class::MixinApp::@constructor::ctor
+              enclosingElement: <testLibraryFragment>::@class::MixinApp
+              parameters
+                requiredPositional t @-1
+                  type: List<U>
+                requiredPositional l @-1
+                  type: List<List<U>>
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  period: . @0
+                  constructorName: SimpleIdentifier
+                    token: ctor @-1
+                    staticElement: <testLibraryFragment>::@class::Base::@constructor::ctor
+                    staticType: null
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    arguments
+                      SimpleIdentifier
+                        token: t @-1
+                        staticElement: <testLibraryFragment>::@class::MixinApp::@constructor::ctor::@parameter::t
+                        staticType: List<U>
+                      SimpleIdentifier
+                        token: l @-1
+                        staticElement: <testLibraryFragment>::@class::MixinApp::@constructor::ctor::@parameter::l
+                        staticType: List<List<U>>
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::Base::@constructor::ctor
+              superConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::Base::@constructor::ctor
+                substitution: {T: List<U>}
+''');
+  }
+
+  test_classAlias_with_mixin_members() async {
+    var library = await buildLibrary('''
+class C = D with E;
+class D {}
+class E {
+  int get a => null;
+  void set b(int i) {}
+  void f() {}
+  int x;
+}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class alias C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: D
+          mixins
+            E
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::D::@constructor::new
+              superConstructor: <testLibraryFragment>::@class::D::@constructor::new
+        class D @26
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+        class E @37
+          reference: <testLibraryFragment>::@class::E
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @105
+              reference: <testLibraryFragment>::@class::E::@field::x
+              enclosingElement: <testLibraryFragment>::@class::E
+              type: int
+            synthetic a @-1
+              reference: <testLibraryFragment>::@class::E::@field::a
+              enclosingElement: <testLibraryFragment>::@class::E
+              type: int
+            synthetic b @-1
+              reference: <testLibraryFragment>::@class::E::@field::b
+              enclosingElement: <testLibraryFragment>::@class::E
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::E
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::E::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::E
+              returnType: int
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::E::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::E
+              parameters
+                requiredPositional _x @-1
+                  type: int
+              returnType: void
+            get a @51
+              reference: <testLibraryFragment>::@class::E::@getter::a
+              enclosingElement: <testLibraryFragment>::@class::E
+              returnType: int
+            set b= @73
+              reference: <testLibraryFragment>::@class::E::@setter::b
+              enclosingElement: <testLibraryFragment>::@class::E
+              parameters
+                requiredPositional i @79
+                  type: int
+              returnType: void
+          methods
+            f @92
+              reference: <testLibraryFragment>::@class::E::@method::f
+              enclosingElement: <testLibraryFragment>::@class::E
+              returnType: void
+''');
+  }
+
+  test_classes() async {
+    var library = await buildLibrary('class C {} class D {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+        class D @17
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+''');
+  }
+
+  test_implicitConstructor_named_const() async {
+    var library = await buildLibrary('''
+class C {
+  final Object x;
+  const C.named(this.x);
+}
+const x = C.named(42);
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            final x @25
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: Object
+          constructors
+            const named @38
+              reference: <testLibraryFragment>::@class::C::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 37
+              nameEnd: 43
+              parameters
+                requiredPositional final this.x @49
+                  type: Object
+                  field: <testLibraryFragment>::@class::C::@field::x
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: Object
+      topLevelVariables
+        static const x @61
+          reference: <testLibraryFragment>::@topLevelVariable::x
+          enclosingElement: <testLibraryFragment>
+          type: C
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              constructorName: ConstructorName
+                type: NamedType
+                  name: C @65
+                  element: <testLibraryFragment>::@class::C
+                  type: C
+                period: . @66
+                name: SimpleIdentifier
+                  token: named @67
+                  staticElement: <testLibraryFragment>::@class::C::@constructor::named
+                  staticType: null
+                staticElement: <testLibraryFragment>::@class::C::@constructor::named
+              argumentList: ArgumentList
+                leftParenthesis: ( @72
+                arguments
+                  IntegerLiteral
+                    literal: 42 @73
+                    staticType: int
+                rightParenthesis: ) @75
+              staticType: C
+      accessors
+        synthetic static get x @-1
+          reference: <testLibraryFragment>::@getter::x
+          enclosingElement: <testLibraryFragment>
+          returnType: C
+''');
+  }
+
+  test_invalid_setterParameter_fieldFormalParameter() async {
+    var library = await buildLibrary('''
+class C {
+  int foo;
+  void set bar(this.foo) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            foo @16
+              reference: <testLibraryFragment>::@class::C::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+            synthetic bar @-1
+              reference: <testLibraryFragment>::@class::C::@field::bar
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::C::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+            set bar= @32
+              reference: <testLibraryFragment>::@class::C::@setter::bar
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional final this.foo @41
+                  type: dynamic
+                  field: <null>
+              returnType: void
+''');
+  }
+
+  test_invalid_setterParameter_fieldFormalParameter_self() async {
+    var library = await buildLibrary('''
+class C {
+  set x(this.x) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic x @-1
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            set x= @16
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional final this.x @23
+                  type: dynamic
+                  field: <null>
+              returnType: void
+''');
+  }
+
+  test_unused_type_parameter() async {
+    var library = await buildLibrary('''
+class C<T> {
+  void f() {}
+}
+C<int> c;
+var v = c.f;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            f @20
+              reference: <testLibraryFragment>::@class::C::@method::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: void
+      topLevelVariables
+        static c @36
+          reference: <testLibraryFragment>::@topLevelVariable::c
+          enclosingElement: <testLibraryFragment>
+          type: C<int>
+        static v @43
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: void Function()
+          shouldUseTypeForInitializerInference: false
+      accessors
+        synthetic static get c @-1
+          reference: <testLibraryFragment>::@getter::c
+          enclosingElement: <testLibraryFragment>
+          returnType: C<int>
+        synthetic static set c= @-1
+          reference: <testLibraryFragment>::@setter::c
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _c @-1
+              type: C<int>
+          returnType: void
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: void Function()
+        synthetic static set v= @-1
+          reference: <testLibraryFragment>::@setter::v
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _v @-1
+              type: void Function()
+          returnType: void
+''');
+  }
+}
+
+abstract class ClassElementTest_augmentation extends ElementsBaseTest {
+  test_add_augment() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+
+class A {
+  void foo() {}
+}
+
+augment class A {
+  void bar() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class A @36
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::A::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::A
+          methods
+            foo @47
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::A::@method::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::A
+              returnType: void
+          augmented
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@class::A::@constructor::new
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@method::bar
+              <testLibrary>::@fragment::package:test/a.dart::@class::A::@method::foo
+        augment class A @73
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@class::A
+          methods
+            bar @84
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@method::bar
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: void
+''');
+  }
+
+  test_augmentation_constField_hasConstConstructor() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  static const int foo = 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  const A();
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            const @43
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          fields
+            static const foo @66
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              constantInitializer
+                IntegerLiteral
+                  literal: 0 @72
+                  staticType: int
+          accessors
+            synthetic static get foo @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getter::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: int
+''');
+  }
+
+  test_augmentation_constField_noConstConstructor() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  static const int foo = 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          fields
+            static const foo @66
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              constantInitializer
+                IntegerLiteral
+                  literal: 0 @72
+                  staticType: int
+          accessors
+            synthetic static get foo @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getter::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: int
+''');
+  }
+
+  test_augmentation_finalField_hasConstConstructor() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  final int foo = 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  const A();
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            const @43
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          fields
+            final foo @59
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              constantInitializer
+                IntegerLiteral
+                  literal: 0 @65
+                  staticType: int
+          accessors
+            synthetic get foo @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getter::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: int
+''');
+  }
+
+  test_augmentation_finalField_noConstConstructor() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  final int foo = 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          fields
+            final foo @59
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+          accessors
+            synthetic get foo @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getter::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: int
+''');
+  }
+
+  test_augmentationTarget() async {
+    newFile('$testPackageLibPath/a1.dart', r'''
+augment library 'test.dart';
+import augment 'a11.dart';
+import augment 'a12.dart';
+augment class A {}
+''');
+
+    newFile('$testPackageLibPath/a11.dart', r'''
+augment library 'a1.dart';
+augment class A {}
+''');
+
+    newFile('$testPackageLibPath/a12.dart', r'''
+augment library 'a1.dart';
+augment class A {}
+''');
+
+    newFile('$testPackageLibPath/a2.dart', r'''
+augment library 'test.dart';
+import augment 'a21.dart';
+import augment 'a22.dart';
+augment class A {}
+''');
+
+    newFile('$testPackageLibPath/a21.dart', r'''
+augment library 'a2.dart';
+augment class A {}
+''');
+
+    newFile('$testPackageLibPath/a22.dart', r'''
+augment library 'a2.dart';
+augment class A {}
+''');
+
+    configuration.withExportScope = true;
+    var library = await buildLibrary(r'''
+import augment 'a1.dart';
+import augment 'a2.dart';
+class A {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a1.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a1.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a1.dart
+      augmentationImports
+        package:test/a11.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a1.dart
+          reference: <testLibrary>::@augmentation::package:test/a11.dart
+          definingUnit: <testLibrary>::@fragment::package:test/a11.dart
+        package:test/a12.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a1.dart
+          reference: <testLibrary>::@augmentation::package:test/a12.dart
+          definingUnit: <testLibrary>::@fragment::package:test/a12.dart
+    package:test/a2.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a2.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a2.dart
+      augmentationImports
+        package:test/a21.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a2.dart
+          reference: <testLibrary>::@augmentation::package:test/a21.dart
+          definingUnit: <testLibrary>::@fragment::package:test/a21.dart
+        package:test/a22.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a2.dart
+          reference: <testLibrary>::@augmentation::package:test/a22.dart
+          definingUnit: <testLibrary>::@fragment::package:test/a22.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @58
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a1.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+    <testLibrary>::@fragment::package:test/a1.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a1.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @97
+          reference: <testLibrary>::@fragment::package:test/a1.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a1.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          augmentation: <testLibrary>::@fragment::package:test/a11.dart::@classAugmentation::A
+    <testLibrary>::@fragment::package:test/a11.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a11.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a1.dart
+      classes
+        augment class A @41
+          reference: <testLibrary>::@fragment::package:test/a11.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a11.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a1.dart::@classAugmentation::A
+          augmentation: <testLibrary>::@fragment::package:test/a12.dart::@classAugmentation::A
+    <testLibrary>::@fragment::package:test/a12.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a12.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a1.dart
+      classes
+        augment class A @41
+          reference: <testLibrary>::@fragment::package:test/a12.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a12.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a11.dart::@classAugmentation::A
+          augmentation: <testLibrary>::@fragment::package:test/a2.dart::@classAugmentation::A
+    <testLibrary>::@fragment::package:test/a2.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a2.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @97
+          reference: <testLibrary>::@fragment::package:test/a2.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a2.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a12.dart::@classAugmentation::A
+          augmentation: <testLibrary>::@fragment::package:test/a21.dart::@classAugmentation::A
+    <testLibrary>::@fragment::package:test/a21.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a21.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a2.dart
+      classes
+        augment class A @41
+          reference: <testLibrary>::@fragment::package:test/a21.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a21.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a2.dart::@classAugmentation::A
+          augmentation: <testLibrary>::@fragment::package:test/a22.dart::@classAugmentation::A
+    <testLibrary>::@fragment::package:test/a22.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a22.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a2.dart
+      classes
+        augment class A @41
+          reference: <testLibrary>::@fragment::package:test/a22.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a22.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a21.dart::@classAugmentation::A
+  exportedReferences
+    declared <testLibraryFragment>::@class::A
+  exportNamespace
+    A: <testLibraryFragment>::@class::A
+''');
+  }
+
+  test_augmentationTarget_augmentationThenDeclaration() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+
+augment class A {
+  void foo1() {}
+}
+
+class A {
+  void foo2() {}
+}
+
+augment class A {
+  void foo3() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @44
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::0
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::0::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::0
+          methods
+            foo1 @55
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::0::@method::foo1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::0
+              returnType: void
+        class A @74
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::1
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::A::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::A
+          methods
+            foo2 @85
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::A::@method::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::A
+              returnType: void
+          augmented
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@class::A::@constructor::new
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@class::A::@method::foo2
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::1::@method::foo3
+        augment class A @112
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::1
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@class::A
+          methods
+            foo3 @123
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::1::@method::foo3
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::1
+              returnType: void
+''');
+  }
+
+  test_augmentationTarget_no2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+import augment 'b.dart';
+augment class A {
+  void foo1() {}
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'a.dart';
+augment class A {
+  void foo2() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class B {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+      augmentationImports
+        package:test/b.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+          reference: <testLibrary>::@augmentation::package:test/b.dart
+          definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class B @31
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @68
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          methods
+            foo1 @79
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@method::foo1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: void
+          augmented
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructor::new
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@method::foo1
+              <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A::@method::foo2
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+      classes
+        augment class A @40
+          reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          methods
+            foo2 @51
+              reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A::@method::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+              returnType: void
+''');
+  }
+
+  test_augmented_constructor_augment_field() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment A.foo();
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  int foo = 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            foo @41
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@class::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+          augmented
+            fields
+              <testLibraryFragment>::@class::A::@field::foo
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructorAugmentation::foo
+            accessors
+              <testLibraryFragment>::@class::A::@getter::foo
+              <testLibraryFragment>::@class::A::@setter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          constructors
+            augment foo @59
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructorAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              periodOffset: 58
+              nameEnd: 62
+              augmentationTargetAny: <testLibraryFragment>::@class::A::@getter::foo
+''');
+  }
+
+  test_augmented_constructor_augment_getter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment A.foo();
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  int get foo => 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+          accessors
+            get foo @45
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+          augmented
+            fields
+              <testLibraryFragment>::@class::A::@field::foo
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructorAugmentation::foo
+            accessors
+              <testLibraryFragment>::@class::A::@getter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          constructors
+            augment foo @59
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructorAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              periodOffset: 58
+              nameEnd: 62
+              augmentationTargetAny: <testLibraryFragment>::@class::A::@getter::foo
+''');
+  }
+
+  test_augmented_constructor_augment_method() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment A.foo();
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  void foo() {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          methods
+            foo @42
+              reference: <testLibraryFragment>::@class::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: void
+          augmented
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructorAugmentation::foo
+            methods
+              <testLibraryFragment>::@class::A::@method::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          constructors
+            augment foo @59
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructorAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              periodOffset: 58
+              nameEnd: 62
+              augmentationTargetAny: <testLibraryFragment>::@class::A::@method::foo
+''');
+  }
+
+  test_augmented_constructor_augment_setter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment A.foo();
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  set foo(int _) {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+          accessors
+            set foo= @41
+              reference: <testLibraryFragment>::@class::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _ @49
+                  type: int
+              returnType: void
+          augmented
+            fields
+              <testLibraryFragment>::@class::A::@field::foo
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructorAugmentation::foo
+            accessors
+              <testLibraryFragment>::@class::A::@setter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          constructors
+            augment foo @59
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructorAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              periodOffset: 58
+              nameEnd: 62
+              augmentationTargetAny: <testLibraryFragment>::@class::A::@setter::foo
+''');
+  }
+
+  test_augmented_constructors_add_named() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  A.named();
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          augmented
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructor::named
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          constructors
+            named @51
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructor::named
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              periodOffset: 50
+              nameEnd: 56
+''');
+  }
+
+  test_augmented_constructors_add_named_generic() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A<T2> {
+  A.named(T2 a);
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A<T1> {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T1 @33
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          augmented
+            constructors
+              ConstructorMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructor::named
+                augmentationSubstitution: {T2: T1}
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @45
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@class::A
+          constructors
+            named @55
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructor::named
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              periodOffset: 54
+              nameEnd: 60
+              parameters
+                requiredPositional a @64
+                  type: T2
+''');
+  }
+
+  test_augmented_constructors_add_named_hasUnnamed() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  A.named();
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  A();
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            @37
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructor::named
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          constructors
+            named @51
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructor::named
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              periodOffset: 50
+              nameEnd: 56
+''');
+  }
+
+  test_augmented_constructors_add_unnamed() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  A();
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          augmented
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructor::new
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          constructors
+            @49
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+''');
+  }
+
+  test_augmented_constructors_add_unnamed_hasNamed() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  A();
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  A.named();
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            named @39
+              reference: <testLibraryFragment>::@class::A::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 38
+              nameEnd: 44
+          augmented
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructor::new
+              <testLibraryFragment>::@class::A::@constructor::named
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          constructors
+            @49
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+''');
+  }
+
+  test_augmented_constructors_add_useFieldFormal() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  A.named(this.f);
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  final int f;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            final f @47
+              reference: <testLibraryFragment>::@class::A::@field::f
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+          accessors
+            synthetic get f @-1
+              reference: <testLibraryFragment>::@class::A::@getter::f
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+          augmented
+            fields
+              <testLibraryFragment>::@class::A::@field::f
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructor::named
+            accessors
+              <testLibraryFragment>::@class::A::@getter::f
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          constructors
+            named @51
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructor::named
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              periodOffset: 50
+              nameEnd: 56
+              parameters
+                requiredPositional final this.f @62
+                  type: int
+                  field: <testLibraryFragment>::@class::A::@field::f
+''');
+  }
+
+  test_augmented_constructors_add_useFieldInitializer() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  const A.named() : f = 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  final int f;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            final f @47
+              reference: <testLibraryFragment>::@class::A::@field::f
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+          accessors
+            synthetic get f @-1
+              reference: <testLibraryFragment>::@class::A::@getter::f
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+          augmented
+            fields
+              <testLibraryFragment>::@class::A::@field::f
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructor::named
+            accessors
+              <testLibraryFragment>::@class::A::@getter::f
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          constructors
+            const named @57
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructor::named
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              periodOffset: 56
+              nameEnd: 62
+              constantInitializers
+                ConstructorFieldInitializer
+                  fieldName: SimpleIdentifier
+                    token: f @67
+                    staticElement: <testLibraryFragment>::@class::A::@field::f
+                    staticType: null
+                  equals: = @69
+                  expression: IntegerLiteral
+                    literal: 0 @71
+                    staticType: int
+''');
+  }
+
+  test_augmented_field_augment_constructor() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment int foo = 1;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  A.foo();
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            foo @39
+              reference: <testLibraryFragment>::@class::A::@constructor::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 38
+              nameEnd: 42
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          fields
+            augment foo @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              augmentationTargetAny: <testLibraryFragment>::@class::A::@constructor::foo
+''');
+  }
+
+  test_augmented_field_augment_field() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment int foo = 1;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            foo @41
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@class::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@class::A::@getter::foo
+              <testLibraryFragment>::@class::A::@setter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          fields
+            augment foo @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              augmentationTarget: <testLibraryFragment>::@class::A::@field::foo
+''');
+  }
+
+  test_augmented_field_augment_field2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment int foo = 1;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment int foo = 2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+class A {
+  int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @56
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            foo @66
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@class::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A::@fieldAugmentation::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@class::A::@getter::foo
+              <testLibraryFragment>::@class::A::@setter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          fields
+            augment foo @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              augmentationTarget: <testLibraryFragment>::@class::A::@field::foo
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A::@fieldAugmentation::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            augment foo @61
+              reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_2
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+''');
+  }
+
+  test_augmented_field_augment_field_afterGetter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment int get foo => 1;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment int foo = 2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+class A {
+  int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @56
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            foo @66
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A::@fieldAugmentation::foo
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@class::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A::@fieldAugmentation::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo
+              <testLibraryFragment>::@class::A::@setter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: int
+              id: getter_1
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@class::A::@getter::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            augment foo @61
+              reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              augmentationTarget: <testLibraryFragment>::@class::A::@field::foo
+''');
+  }
+
+  test_augmented_field_augment_field_afterSetter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment set foo(int _) {}
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment int foo = 2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+class A {
+  int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @56
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            foo @66
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A::@fieldAugmentation::foo
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@class::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@setterAugmentation::foo
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A::@fieldAugmentation::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@class::A::@getter::foo
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@setterAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          accessors
+            augment set foo= @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@setterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              parameters
+                requiredPositional _ @69
+                  type: int
+              returnType: void
+              id: setter_1
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@class::A::@setter::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            augment foo @61
+              reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              augmentationTarget: <testLibraryFragment>::@class::A::@field::foo
+''');
+  }
+
+  test_augmented_field_augment_field_augmentedInvocation() async {
+    // This is invalid code, but it should not crash.
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {;
+  augment static const int foo = augmented();
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  static const int foo = 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            static const foo @54
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              constantInitializer
+                IntegerLiteral
+                  literal: 0 @60
+                  staticType: int
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            synthetic static get foo @-1
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@class::A::@getter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          fields
+            augment static const foo @75
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              constantInitializer
+                AugmentedInvocation
+                  augmentedKeyword: augmented @81
+                  arguments: ArgumentList
+                    leftParenthesis: ( @90
+                    rightParenthesis: ) @91
+                  element: <null>
+                  staticType: InvalidType
+              augmentationTarget: <testLibraryFragment>::@class::A::@field::foo
+''');
+  }
+
+  test_augmented_field_augment_field_differentTypes() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment double foo = 1.2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            foo @41
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@class::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@class::A::@getter::foo
+              <testLibraryFragment>::@class::A::@setter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          fields
+            augment foo @64
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              type: double
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              augmentationTarget: <testLibraryFragment>::@class::A::@field::foo
+''');
+  }
+
+  test_augmented_field_augment_field_plus() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment final int foo = augmented + 1;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  final int foo = 0;
+  const A();
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            final foo @47
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              constantInitializer
+                IntegerLiteral
+                  literal: 0 @53
+                  staticType: int
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+          constructors
+            const @64
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@class::A::@getter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          fields
+            augment final foo @67
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              constantInitializer
+                BinaryExpression
+                  leftOperand: AugmentedExpression
+                    augmentedKeyword: augmented @73
+                    element: <testLibraryFragment>::@class::A::@field::foo
+                    staticType: int
+                  operator: + @83
+                  rightOperand: IntegerLiteral
+                    literal: 1 @85
+                    staticType: int
+                  staticElement: dart:core::<fragment>::@class::num::@method::+
+                  staticInvokeType: num Function(num)
+                  staticType: int
+              augmentationTarget: <testLibraryFragment>::@class::A::@field::foo
+''');
+  }
+
+  /// This is not allowed by the specification, but allowed syntactically,
+  /// so we need a way to handle it.
+  test_augmented_field_augment_getter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment int foo = 1;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  int get foo => 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              id: field_0
+              getter: getter_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            get foo @45
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@class::A::@getter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          fields
+            augment foo @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              augmentationTarget: <testLibraryFragment>::@class::A::@field::foo
+''');
+  }
+
+  test_augmented_field_augment_method() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment int foo = 1;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  void foo() {}
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          methods
+            foo @42
+              reference: <testLibraryFragment>::@class::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: void
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            methods
+              <testLibraryFragment>::@class::A::@method::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          fields
+            augment foo @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              augmentationTargetAny: <testLibraryFragment>::@class::A::@method::foo
+''');
+  }
+
+  /// This is not allowed by the specification, but allowed syntactically,
+  /// so we need a way to handle it.
+  test_augmented_field_augment_setter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment int foo = 1;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  set foo(int _) {}
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              id: field_0
+              setter: setter_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            set foo= @41
+              reference: <testLibraryFragment>::@class::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _ @49
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@class::A::@setter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          fields
+            augment foo @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              augmentationTarget: <testLibraryFragment>::@class::A::@field::foo
+''');
+  }
+
+  test_augmented_fields_add() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  int foo2 = 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  int foo1 = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            foo1 @41
+              reference: <testLibraryFragment>::@class::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            synthetic get foo1 @-1
+              reference: <testLibraryFragment>::@class::A::@getter::foo1
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic set foo1= @-1
+              reference: <testLibraryFragment>::@class::A::@setter::foo1
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _foo1 @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibraryFragment>::@class::A::@field::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo2
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@class::A::@getter::foo1
+              <testLibraryFragment>::@class::A::@setter::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getter::foo2
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@setter::foo2
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          fields
+            foo2 @53
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              getter: getter_1
+              setter: setter_1
+          accessors
+            synthetic get foo2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: int
+              id: getter_1
+              variable: field_1
+            synthetic set foo2= @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@setter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              parameters
+                requiredPositional _foo2 @-1
+                  type: int
+              returnType: void
+              id: setter_1
+              variable: field_1
+''');
+  }
+
+  test_augmented_fields_add_generic() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A<T2> {
+  T2 foo2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A<T1> {
+  T1 foo1;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T1 @33
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            foo1 @44
+              reference: <testLibraryFragment>::@class::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: T1
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            synthetic get foo1 @-1
+              reference: <testLibraryFragment>::@class::A::@getter::foo1
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: T1
+              id: getter_0
+              variable: field_0
+            synthetic set foo1= @-1
+              reference: <testLibraryFragment>::@class::A::@setter::foo1
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _foo1 @-1
+                  type: T1
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibraryFragment>::@class::A::@field::foo1
+              FieldMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo2
+                augmentationSubstitution: {T2: T1}
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@class::A::@getter::foo1
+              <testLibraryFragment>::@class::A::@setter::foo1
+              PropertyAccessorMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getter::foo2
+                augmentationSubstitution: {T2: T1}
+              PropertyAccessorMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@setter::foo2
+                augmentationSubstitution: {T2: T1}
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @45
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@class::A
+          fields
+            foo2 @56
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              type: T2
+              id: field_1
+              getter: getter_1
+              setter: setter_1
+          accessors
+            synthetic get foo2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: T2
+              id: getter_1
+              variable: field_1
+            synthetic set foo2= @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@setter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              parameters
+                requiredPositional _foo2 @-1
+                  type: T2
+              returnType: void
+              id: setter_1
+              variable: field_1
+''');
+  }
+
+  test_augmented_fields_add_useFieldFormal() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  final int foo;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  A(this.foo);
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            @37
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional final this.foo @44
+                  type: int
+                  field: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          fields
+            final foo @59
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              type: int
+          accessors
+            synthetic get foo @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getter::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: int
+''');
+  }
+
+  test_augmented_fields_add_useFieldInitializer() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  final int foo;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  const A() : foo = 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            const @43
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              constantInitializers
+                ConstructorFieldInitializer
+                  fieldName: SimpleIdentifier
+                    token: foo @49
+                    staticElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo
+                    staticType: null
+                  equals: = @53
+                  expression: IntegerLiteral
+                    literal: 0 @55
+                    staticType: int
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          fields
+            final foo @59
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              type: int
+          accessors
+            synthetic get foo @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getter::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: int
+''');
+  }
+
+  test_augmented_getter_augments_constructor() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment int get foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  A.foo();
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            foo @39
+              reference: <testLibraryFragment>::@class::A::@constructor::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 38
+              nameEnd: 42
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::foo
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: int
+              id: getter_0
+              variable: <null>
+              augmentationTargetAny: <testLibraryFragment>::@class::A::@constructor::foo
+''');
+  }
+
+  test_augmented_getter_augments_method() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment int get foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  void foo() {}
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          methods
+            foo @42
+              reference: <testLibraryFragment>::@class::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: void
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo
+            methods
+              <testLibraryFragment>::@class::A::@method::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: int
+              id: getter_0
+              variable: <null>
+              augmentationTargetAny: <testLibraryFragment>::@class::A::@method::foo
+''');
+  }
+
+  test_augmented_getter_augments_setter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment int get foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  set foo(int _) {}
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              id: field_0
+              setter: setter_0
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            set foo= @41
+              reference: <testLibraryFragment>::@class::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _ @49
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibraryFragment>::@class::A::@field::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo
+              <testLibraryFragment>::@class::A::@setter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: int
+              id: getter_0
+              variable: <null>
+              augmentationTargetAny: <testLibraryFragment>::@class::A::@setter::foo
+''');
+  }
+
+  test_augmented_getters_add() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  int get foo2 => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  int get foo1 => 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              id: field_0
+              getter: getter_0
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            get foo1 @45
+              reference: <testLibraryFragment>::@class::A::@getter::foo1
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibraryFragment>::@class::A::@field::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo2
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@class::A::@getter::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getter::foo2
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          fields
+            synthetic foo2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              type: int
+              id: field_1
+              getter: getter_1
+          accessors
+            get foo2 @57
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: int
+              id: getter_1
+              variable: field_1
+''');
+  }
+
+  test_augmented_getters_add_generic() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A<T2> {
+  T2 get foo2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A<T1> {
+  T1 get foo1;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T1 @33
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: T1
+              id: field_0
+              getter: getter_0
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            abstract get foo1 @48
+              reference: <testLibraryFragment>::@class::A::@getter::foo1
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: T1
+              id: getter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibraryFragment>::@class::A::@field::foo1
+              FieldMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo2
+                augmentationSubstitution: {T2: T1}
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@class::A::@getter::foo1
+              PropertyAccessorMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getter::foo2
+                augmentationSubstitution: {T2: T1}
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @45
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@class::A
+          fields
+            synthetic foo2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              type: T2
+              id: field_1
+              getter: getter_1
+          accessors
+            abstract get foo2 @60
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: T2
+              id: getter_1
+              variable: field_1
+''');
+  }
+
+  test_augmented_getters_augment_field() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment int get foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            foo @41
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@class::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibraryFragment>::@class::A::@field::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo
+              <testLibraryFragment>::@class::A::@setter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: int
+              id: getter_1
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@class::A::@getter::foo
+''');
+  }
+
+  test_augmented_getters_augment_field2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment int get foo => 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment int get foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+class A {
+  int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @56
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            foo @66
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@class::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibraryFragment>::@class::A::@field::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A::@getterAugmentation::foo
+              <testLibraryFragment>::@class::A::@setter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: int
+              id: getter_1
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@class::A::@getter::foo
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A::@getterAugmentation::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+              returnType: int
+              id: getter_2
+              variable: field_0
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo
+''');
+  }
+
+  test_augmented_getters_augment_getter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment int get foo1 => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  int get foo1 => 0;
+  int get foo2 => 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              id: field_0
+              getter: getter_0
+            synthetic foo2 @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo2
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              id: field_1
+              getter: getter_1
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            get foo1 @45
+              reference: <testLibraryFragment>::@class::A::@getter::foo1
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo1
+            get foo2 @66
+              reference: <testLibraryFragment>::@class::A::@getter::foo2
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+              id: getter_1
+              variable: field_1
+          augmented
+            fields
+              <testLibraryFragment>::@class::A::@field::foo1
+              <testLibraryFragment>::@class::A::@field::foo2
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo1
+              <testLibraryFragment>::@class::A::@getter::foo2
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          accessors
+            augment get foo1 @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: int
+              id: getter_2
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@class::A::@getter::foo1
+''');
+  }
+
+  test_augmented_getters_augment_getter2_oneLib_oneTop() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment int get foo => 0;
+  augment int get foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  int get foo => 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              id: field_0
+              getter: getter_0
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            get foo @45
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo::@def::0
+          augmented
+            fields
+              <testLibraryFragment>::@class::A::@field::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo::@def::1
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo::@def::0
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: int
+              id: getter_1
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@class::A::@getter::foo
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo::@def::1
+            augment get foo @93
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo::@def::1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: int
+              id: getter_2
+              variable: field_0
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo::@def::0
+''');
+  }
+
+  test_augmented_getters_augment_getter2_twoLib() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment int get foo => 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment int get foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+class A {
+  int get foo => 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @56
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              id: field_0
+              getter: getter_0
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            get foo @70
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo
+          augmented
+            fields
+              <testLibraryFragment>::@class::A::@field::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A::@getterAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: int
+              id: getter_1
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@class::A::@getter::foo
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A::@getterAugmentation::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+              returnType: int
+              id: getter_2
+              variable: field_0
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo
+''');
+  }
+
+  test_augmented_getters_augment_nothing() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment int get foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {}
+''');
+
+    configuration
+      ..withConstructors = false
+      ..withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          augmented
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: int
+              id: getter_0
+              variable: <null>
+''');
+  }
+
+  test_augmented_interfaces() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A implements I2 {}
+class I2 {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A implements I1 {}
+class I1 {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          interfaces
+            I1
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            interfaces
+              I1
+              I2
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+        class I1 @56
+          reference: <testLibraryFragment>::@class::I1
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::I1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::I1
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          interfaces
+            I2
+        class I2 @68
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+''');
+  }
+
+  test_augmented_interfaces_chain() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+import augment 'b.dart';
+augment class A implements I2 {}
+class I2 {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'a.dart';
+augment class A implements I3 {}
+class I3 {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A implements I1 {}
+class I1 {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+      augmentationImports
+        package:test/b.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+          reference: <testLibrary>::@augmentation::package:test/b.dart
+          definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          interfaces
+            I1
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            interfaces
+              I1
+              I2
+              I3
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+        class I1 @56
+          reference: <testLibraryFragment>::@class::I1
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::I1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::I1
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @68
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          interfaces
+            I2
+        class I2 @93
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+      classes
+        augment class A @40
+          reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          interfaces
+            I3
+        class I3 @65
+          reference: <testLibrary>::@fragment::package:test/b.dart::@class::I3
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/b.dart::@class::I3::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@class::I3
+''');
+  }
+
+  test_augmented_interfaces_generic() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A<T2> implements I2<T2> {}
+class I2<E> {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A<T> implements I1 {}
+class I1 {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @33
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          interfaces
+            I1
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            interfaces
+              I1
+              I2<T>
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+        class I1 @59
+          reference: <testLibraryFragment>::@class::I1
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::I1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::I1
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @45
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@class::A
+          interfaces
+            I2<T2>
+        class I2 @76
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant E @79
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+''');
+  }
+
+  test_augmented_interfaces_generic_mismatch() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A<T2, T3> implements I2<T2> {}
+class I2<E> {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A<T> implements I1 {}
+class I1 {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @33
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          interfaces
+            I1
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            interfaces
+              I1
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+        class I1 @59
+          reference: <testLibraryFragment>::@class::I1
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::I1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::I1
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @45
+              defaultType: dynamic
+            covariant T3 @49
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@class::A
+          interfaces
+            I2<T2>
+        class I2 @80
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant E @83
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+''');
+  }
+
+  test_augmented_method_augments_constructor() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment void foo() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  A.foo();
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            foo @39
+              reference: <testLibraryFragment>::@class::A::@constructor::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 38
+              nameEnd: 42
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::foo
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          methods
+            augment foo @62
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: void
+              augmentationTargetAny: <testLibraryFragment>::@class::A::@constructor::foo
+''');
+  }
+
+  test_augmented_method_augments_field() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment void foo() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  int foo = 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            foo @41
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@class::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+          augmented
+            fields
+              <testLibraryFragment>::@class::A::@field::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@class::A::@getter::foo
+              <testLibraryFragment>::@class::A::@setter::foo
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          methods
+            augment foo @62
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: void
+              augmentationTargetAny: <testLibraryFragment>::@class::A::@getter::foo
+''');
+  }
+
+  test_augmented_method_augments_getter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment void foo() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  int get foo => 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            get foo @45
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+          augmented
+            fields
+              <testLibraryFragment>::@class::A::@field::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@class::A::@getter::foo
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          methods
+            augment foo @62
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: void
+              augmentationTargetAny: <testLibraryFragment>::@class::A::@getter::foo
+''');
+  }
+
+  test_augmented_method_augments_setter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment void foo() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  set foo(int _) {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            set foo= @41
+              reference: <testLibraryFragment>::@class::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _ @49
+                  type: int
+              returnType: void
+          augmented
+            fields
+              <testLibraryFragment>::@class::A::@field::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@class::A::@setter::foo
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          methods
+            augment foo @62
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: void
+              augmentationTargetAny: <testLibraryFragment>::@class::A::@setter::foo
+''');
+  }
+
+  test_augmented_methods() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  void bar() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  void foo() {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          methods
+            foo @42
+              reference: <testLibraryFragment>::@class::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: void
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@method::bar
+              <testLibraryFragment>::@class::A::@method::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          methods
+            bar @54
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@method::bar
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: void
+''');
+  }
+
+  test_augmented_methods_add_withDefaultValue() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  void foo([int x = 42]) {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@method::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          methods
+            foo @54
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@method::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              parameters
+                optionalPositional default x @63
+                  type: int
+                  constantInitializer
+                    IntegerLiteral
+                      literal: 42 @67
+                      staticType: int
+              returnType: void
+''');
+  }
+
+  test_augmented_methods_augment() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment void foo1() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  void foo1() {}
+  void foo2() {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          methods
+            foo1 @42
+              reference: <testLibraryFragment>::@class::A::@method::foo1
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: void
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo1
+            foo2 @59
+              reference: <testLibraryFragment>::@class::A::@method::foo2
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: void
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo1
+              <testLibraryFragment>::@class::A::@method::foo2
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          methods
+            augment foo1 @62
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: void
+              augmentationTarget: <testLibraryFragment>::@class::A::@method::foo1
+''');
+  }
+
+  test_augmented_methods_augment2_oneLib_oneTop() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment void foo() {}
+  augment void foo() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  void foo() {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          methods
+            foo @42
+              reference: <testLibraryFragment>::@class::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: void
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo::@def::0
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo::@def::1
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          methods
+            augment foo @62
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo::@def::0
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: void
+              augmentationTarget: <testLibraryFragment>::@class::A::@method::foo
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo::@def::1
+            augment foo @86
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo::@def::1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: void
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo::@def::0
+''');
+  }
+
+  test_augmented_methods_augment2_oneLib_twoTop() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment void foo() {}
+}
+augment class A {
+  augment void foo() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  void foo() {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::0
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          methods
+            foo @42
+              reference: <testLibraryFragment>::@class::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: void
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::0::@methodAugmentation::foo
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::1::@methodAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::0
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::1
+          methods
+            augment foo @62
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::0::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::0
+              returnType: void
+              augmentationTarget: <testLibraryFragment>::@class::A::@method::foo
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::1::@methodAugmentation::foo
+        augment class A @87
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::1
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::0
+          methods
+            augment foo @106
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::1::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::1
+              returnType: void
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::0::@methodAugmentation::foo
+''');
+  }
+
+  test_augmented_methods_augment2_twoLib() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+import augment 'b.dart';
+augment class A {
+  augment void foo() {}
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'a.dart';
+augment class A {
+  augment void foo() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  void foo() {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+      augmentationImports
+        package:test/b.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+          reference: <testLibrary>::@augmentation::package:test/b.dart
+          definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          methods
+            foo @42
+              reference: <testLibraryFragment>::@class::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: void
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            methods
+              <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A::@methodAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @68
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          methods
+            augment foo @87
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: void
+              augmentationTarget: <testLibraryFragment>::@class::A::@method::foo
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A::@methodAugmentation::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+      classes
+        augment class A @40
+          reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          methods
+            augment foo @59
+              reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+              returnType: void
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo
+''');
+  }
+
+  test_augmented_methods_generic() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A<T2> {
+  T2 bar() => throw 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A<T> {
+  T foo() => throw 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @33
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          methods
+            foo @42
+              reference: <testLibraryFragment>::@class::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: T
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            methods
+              MethodMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@method::bar
+                augmentationSubstitution: {T2: T}
+              <testLibraryFragment>::@class::A::@method::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @45
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@class::A
+          methods
+            bar @56
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@method::bar
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: T2
+''');
+  }
+
+  test_augmented_methods_generic_augment() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A<T2> {
+  augment T2 foo() => throw 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A<T> {
+  T foo() => throw 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @33
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          methods
+            foo @42
+              reference: <testLibraryFragment>::@class::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: T
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            methods
+              MethodMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo
+                augmentationSubstitution: {T2: T}
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @45
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@class::A
+          methods
+            augment foo @64
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: T2
+              augmentationTarget: <testLibraryFragment>::@class::A::@method::foo
+''');
+  }
+
+  test_augmented_mixins() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A with M2 {}
+mixin M2 {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A with M1 {}
+mixin M1 {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          supertype: Object
+          mixins
+            M1
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            mixins
+              M1
+              M2
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+      mixins
+        mixin M1 @50
+          reference: <testLibraryFragment>::@mixin::M1
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          mixins
+            M2
+      mixins
+        mixin M2 @62
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixin::M2
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_augmented_mixins_inferredTypeArguments() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A<T2> with M2 {}
+mixin M2<U2> on M1<U2> {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment class A<T3> with M3 {}
+mixin M3<U3> on M2<U3> {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+class B<S> {}
+class A<T1> extends B<T1> with M1 {}
+mixin M1<U1> on B<U1> {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class B @56
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant S @58
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+        class A @70
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T1 @72
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          supertype: B<T1>
+          mixins
+            M1<T1>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              superConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::B::@constructor::new
+                substitution: {S: T1}
+          augmented
+            mixins
+              M1<T1>
+              M2<T1>
+              M3<T1>
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+      mixins
+        mixin M1 @107
+          reference: <testLibraryFragment>::@mixin::M1
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant U1 @110
+              defaultType: dynamic
+          superclassConstraints
+            B<U1>
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @45
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@class::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          mixins
+            M2<T2>
+      mixins
+        mixin M2 @66
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixin::M2
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant U2 @69
+              defaultType: dynamic
+          superclassConstraints
+            M1<U2>
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          typeParameters
+            covariant T3 @45
+              defaultType: dynamic
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          mixins
+            M3<T3>
+      mixins
+        mixin M3 @66
+          reference: <testLibrary>::@fragment::package:test/b.dart::@mixin::M3
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          typeParameters
+            covariant U3 @69
+              defaultType: dynamic
+          superclassConstraints
+            M2<U3>
+''');
+  }
+
+  test_augmented_setter_augments_constructor() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment set foo(int _) {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  A.foo();
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            foo @39
+              reference: <testLibraryFragment>::@class::A::@constructor::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 38
+              nameEnd: 42
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::foo
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@setterAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          accessors
+            augment set foo= @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@setterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              parameters
+                requiredPositional _ @69
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: <null>
+              augmentationTargetAny: <testLibraryFragment>::@class::A::@constructor::foo
+''');
+  }
+
+  test_augmented_setter_augments_getter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment set foo(int _) {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  int get foo => 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              id: field_0
+              getter: getter_0
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            get foo @45
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibraryFragment>::@class::A::@field::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@class::A::@getter::foo
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@setterAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          accessors
+            augment set foo= @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@setterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              parameters
+                requiredPositional _ @69
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: <null>
+              augmentationTargetAny: <testLibraryFragment>::@class::A::@getter::foo
+''');
+  }
+
+  test_augmented_setter_augments_method() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment set foo(int _) {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  void foo() {}
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          methods
+            foo @42
+              reference: <testLibraryFragment>::@class::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: void
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@setterAugmentation::foo
+            methods
+              <testLibraryFragment>::@class::A::@method::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          accessors
+            augment set foo= @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@setterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              parameters
+                requiredPositional _ @69
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: <null>
+              augmentationTargetAny: <testLibraryFragment>::@class::A::@method::foo
+''');
+  }
+
+  test_augmented_setters_add() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  set foo2(int _) {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  set foo1(int _) {}
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              id: field_0
+              setter: setter_0
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            set foo1= @41
+              reference: <testLibraryFragment>::@class::A::@setter::foo1
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _ @50
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibraryFragment>::@class::A::@field::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo2
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@class::A::@setter::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@setter::foo2
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          fields
+            synthetic foo2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@field::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              type: int
+              id: field_1
+              setter: setter_1
+          accessors
+            set foo2= @53
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@setter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              parameters
+                requiredPositional _ @62
+                  type: int
+              returnType: void
+              id: setter_1
+              variable: field_1
+''');
+  }
+
+  test_augmented_setters_augment_field() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment set foo(int _) {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            foo @41
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@class::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@setterAugmentation::foo
+          augmented
+            fields
+              <testLibraryFragment>::@class::A::@field::foo
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@class::A::@getter::foo
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@setterAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          accessors
+            augment set foo= @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@setterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              parameters
+                requiredPositional _ @69
+                  type: int
+              returnType: void
+              id: setter_1
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@class::A::@setter::foo
+''');
+  }
+
+  test_augmented_setters_augment_nothing() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment set foo(int _) {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {}
+''');
+
+    configuration
+      ..withConstructors = false
+      ..withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          augmented
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@setterAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          accessors
+            augment set foo= @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@setterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              parameters
+                requiredPositional _ @69
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: <null>
+''');
+  }
+
+  test_augmented_setters_augment_setter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment set foo1(int _) {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  set foo1(int _) {}
+  set foo2(int _) {}
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          fields
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              id: field_0
+              setter: setter_0
+            synthetic foo2 @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo2
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              id: field_1
+              setter: setter_1
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            set foo1= @41
+              reference: <testLibraryFragment>::@class::A::@setter::foo1
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _ @50
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@setterAugmentation::foo1
+            set foo2= @62
+              reference: <testLibraryFragment>::@class::A::@setter::foo2
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _ @71
+                  type: int
+              returnType: void
+              id: setter_1
+              variable: field_1
+          augmented
+            fields
+              <testLibraryFragment>::@class::A::@field::foo1
+              <testLibraryFragment>::@class::A::@field::foo2
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@setterAugmentation::foo1
+              <testLibraryFragment>::@class::A::@setter::foo2
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          accessors
+            augment set foo1= @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@setterAugmentation::foo1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              parameters
+                requiredPositional _ @70
+                  type: int
+              returnType: void
+              id: setter_2
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@class::A::@setter::foo1
+''');
+  }
+
+  /// Invalid augmentation of class with mixin does not "own" the name.
+  test_augmentedBy_mixin2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+
+augment mixin A {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+
+augment mixin A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+
+class A {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @57
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @44
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTargetAny: <testLibraryFragment>::@class::A
+          superclassConstraints
+            Object
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @44
+          reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTargetAny: <testLibraryFragment>::@class::A
+          superclassConstraints
+            Object
+''');
+  }
+
+  /// Invalid augmentation of class with mixin does not "own" the name.
+  /// When a valid class augmentation follows, it can use the name.
+  test_augmentedBy_mixin_class() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+
+augment mixin A {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+
+augment class A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+
+class A {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @57
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @44
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTargetAny: <testLibraryFragment>::@class::A
+          superclassConstraints
+            Object
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @44
+          reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+''');
+  }
+
+  test_constructors_augment2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment A.named();
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment A.named();
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+class A {
+  A.named();
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @56
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            named @64
+              reference: <testLibraryFragment>::@class::A::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 63
+              nameEnd: 69
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructorAugmentation::named
+          augmented
+            constructors
+              <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A::@constructorAugmentation::named
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          constructors
+            augment named @59
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructorAugmentation::named
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              periodOffset: 58
+              nameEnd: 64
+              augmentationTarget: <testLibraryFragment>::@class::A::@constructor::named
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A::@constructorAugmentation::named
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            augment named @59
+              reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A::@constructorAugmentation::named
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+              periodOffset: 58
+              nameEnd: 64
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructorAugmentation::named
+''');
+  }
+
+  test_constructors_augment_named() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment A.named();
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  A.named();
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            named @39
+              reference: <testLibraryFragment>::@class::A::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 38
+              nameEnd: 44
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructorAugmentation::named
+          augmented
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructorAugmentation::named
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          constructors
+            augment named @59
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructorAugmentation::named
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              periodOffset: 58
+              nameEnd: 64
+              augmentationTarget: <testLibraryFragment>::@class::A::@constructor::named
+''');
+  }
+
+  test_constructors_augment_unnamed() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {
+  augment A();
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  A();
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            @37
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructorAugmentation::new
+          augmented
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructorAugmentation::new
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+          constructors
+            augment @57
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructorAugmentation::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              augmentationTarget: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_inferTypes_method_ofAugment() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {
+  int foo(String a) => 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment class B {
+  foo(a) => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import 'a.dart';
+import augment 'b.dart';
+
+class B extends A {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class B @49
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::B
+          supertype: A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: package:test/a.dart::<fragment>::@class::A::@constructor::new
+          augmented
+            constructors
+              <testLibraryFragment>::@class::B::@constructor::new
+            methods
+              <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::B::@method::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class B @43
+          reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::B
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibraryFragment>::@class::B
+          methods
+            foo @49
+              reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::B::@method::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::B
+              parameters
+                requiredPositional a @53
+                  type: String
+              returnType: int
+''');
+  }
+
+  test_inferTypes_method_usingAugmentation_interface() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {
+  int foo(String a) => 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+import 'a.dart';
+augment class B implements A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'b.dart';
+
+class B {
+  foo(a) => 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class B @32
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::B
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+          methods
+            foo @38
+              reference: <testLibraryFragment>::@class::B::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                requiredPositional a @42
+                  type: String
+              returnType: int
+          augmented
+            interfaces
+              A
+            constructors
+              <testLibraryFragment>::@class::B::@constructor::new
+            methods
+              <testLibraryFragment>::@class::B::@method::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      classes
+        augment class B @60
+          reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::B
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibraryFragment>::@class::B
+          interfaces
+            A
+''');
+  }
+
+  test_inferTypes_method_usingAugmentation_mixin() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+mixin A {
+  int foo(String a) => 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+import 'a.dart';
+augment class B with A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'b.dart';
+
+class B {
+  foo(a) => 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class B @32
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::B
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+          methods
+            foo @38
+              reference: <testLibraryFragment>::@class::B::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                requiredPositional a @42
+                  type: String
+              returnType: int
+          augmented
+            mixins
+              A
+            constructors
+              <testLibraryFragment>::@class::B::@constructor::new
+            methods
+              <testLibraryFragment>::@class::B::@method::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      classes
+        augment class B @60
+          reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::B
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibraryFragment>::@class::B
+          mixins
+            A
+''');
+  }
+
+  test_inferTypes_method_withAugment() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {
+  int foo(String a) => 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment class B {
+  augment foo(a) => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import 'a.dart';
+import augment 'b.dart';
+
+class B extends A {
+  foo(a) => 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class B @49
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::B
+          supertype: A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: package:test/a.dart::<fragment>::@class::A::@constructor::new
+          methods
+            foo @65
+              reference: <testLibraryFragment>::@class::B::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                requiredPositional a @69
+                  type: String
+              returnType: int
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::B::@methodAugmentation::foo
+          augmented
+            constructors
+              <testLibraryFragment>::@class::B::@constructor::new
+            methods
+              <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::B::@methodAugmentation::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class B @43
+          reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::B
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibraryFragment>::@class::B
+          methods
+            augment foo @57
+              reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::B::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::B
+              parameters
+                requiredPositional a @61
+                  type: String
+              returnType: int
+              augmentationTarget: <testLibraryFragment>::@class::B::@method::foo
+''');
+  }
+
+  test_methods_typeParameterCountMismatch() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A<T> {
+  augment void foo() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  void foo() {}
+  void bar() {}
+}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          methods
+            foo @42
+              reference: <testLibraryFragment>::@class::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: void
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo
+            bar @58
+              reference: <testLibraryFragment>::@class::A::@method::bar
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: void
+          augmented
+            methods
+              <testLibraryFragment>::@class::A::@method::bar
+              MethodMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo
+                augmentationSubstitution: {T: InvalidType}
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T @45
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@class::A
+          methods
+            augment foo @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+              returnType: void
+              augmentationTarget: <testLibraryFragment>::@class::A::@method::foo
+''');
+  }
+
+  test_modifiers_abstract() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment abstract class A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+abstract class A {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        abstract class A @40
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment abstract class A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+''');
+  }
+
+  test_modifiers_base() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment base class A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+base class A {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        base class A @36
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment base class A @48
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+''');
+  }
+
+  test_modifiers_final() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment final class A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+final class A {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        final class A @37
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment final class A @49
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+''');
+  }
+
+  test_modifiers_interface() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment interface class A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+interface class A {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        interface class A @41
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment interface class A @53
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+''');
+  }
+
+  test_modifiers_macro() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment macro class A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+macro class A {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        macro class A @37
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment macro class A @49
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+''');
+  }
+
+  test_modifiers_mixin() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin class A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin class A {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        mixin class A @37
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment mixin class A @49
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+''');
+  }
+
+  test_modifiers_sealed() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment sealed class A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+sealed class A {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        abstract sealed class A @38
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment abstract sealed class A @50
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+''');
+  }
+
+  test_notAugmented_interfaces() async {
+    var library = await buildLibrary(r'''
+class A implements I {}
+class I {}
+''');
+
+    configuration.withAugmentedWithoutAugmentation = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          interfaces
+            I
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            interfaces
+              I
+        class I @30
+          reference: <testLibraryFragment>::@class::I
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::I::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::I
+          augmented
+''');
+  }
+
+  test_notAugmented_mixins() async {
+    var library = await buildLibrary(r'''
+class A implements M {}
+mixin M {}
+''');
+
+    configuration.withAugmentedWithoutAugmentation = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          interfaces
+            M
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            interfaces
+              M
+      mixins
+        mixin M @30
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+          augmented
+            superclassConstraints
+              Object
+''');
+  }
+
+  test_notSimplyBounded_self() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A<T extends A> {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A<T extends A> {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        notSimplyBounded class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @33
+              bound: A<dynamic>
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T @45
+              bound: A<dynamic>
+              defaultType: A<dynamic>
+          augmentationTarget: <testLibraryFragment>::@class::A
+''');
+  }
+
+  test_supertype_fromAugmentation() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class B<T2> extends A<T2> {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A<T> {}
+class B<T1> {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @33
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class B @45
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T1 @47
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::B
+          supertype: A<T1>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::A::@constructor::new
+                substitution: {T: T1}
+          augmented
+            constructors
+              <testLibraryFragment>::@class::B::@constructor::new
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class B @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::B
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @45
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@class::B
+''');
+  }
+
+  test_supertype_fromAugmentation2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class C extends A {}
+''');
+
+    // `extends B` should be ignored, we already have `extends A`
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment class C extends B {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+class A {}
+class B {}
+class C {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @56
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class B @67
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+        class C @78
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::C
+          supertype: A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+          augmented
+            constructors
+              <testLibraryFragment>::@class::C::@constructor::new
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class C @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::C
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::C
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::C
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class C @43
+          reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::C
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::C
+''');
+  }
+
+  test_typeParameters_defaultType() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A<T extends B> {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A<T extends B> {}
+class B {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @33
+              bound: B
+              defaultType: B
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+        class B @55
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T @45
+              bound: B
+              defaultType: B
+          augmentationTarget: <testLibraryFragment>::@class::A
+''');
+  }
+}
+
+@reflectiveTest
+class ClassElementTest_augmentation_fromBytes
+    extends ClassElementTest_augmentation {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class ClassElementTest_augmentation_keepLinking
+    extends ClassElementTest_augmentation {
+  @override
+  bool get keepLinkingLibraries => true;
+}
+
+@reflectiveTest
+class ClassElementTest_fromBytes extends ClassElementTest {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class ClassElementTest_keepLinking extends ClassElementTest {
+  @override
+  bool get keepLinkingLibraries => true;
+}
+
+// TODO(scheglov): This is duplicate.
+extension on ElementTextConfiguration {
+  void forPromotableFields({
+    Set<String> classNames = const {},
+    Set<String> enumNames = const {},
+    Set<String> extensionTypeNames = const {},
+    Set<String> mixinNames = const {},
+    Set<String> fieldNames = const {},
+  }) {
+    filter = (e) {
+      if (e is ClassElement) {
+        return classNames.contains(e.name);
+      } else if (e is ConstructorElement) {
+        return false;
+      } else if (e is EnumElement) {
+        return enumNames.contains(e.name);
+      } else if (e is ExtensionTypeElement) {
+        return extensionTypeNames.contains(e.name);
+      } else if (e is FieldElement) {
+        return fieldNames.isEmpty || fieldNames.contains(e.name);
+      } else if (e is MixinElement) {
+        return mixinNames.contains(e.name);
+      } else if (e is PartElement) {
+        return false;
+      } else if (e is PropertyAccessorElement) {
+        return false;
+      }
+      return true;
+    };
+  }
+}
diff --git a/pkg/analyzer/test/src/summary/elements/const_test.dart b/pkg/analyzer/test/src/summary/elements/const_test.dart
new file mode 100644
index 0000000..826c349
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/elements/const_test.dart
@@ -0,0 +1,8592 @@
+// Copyright (c) 2024, 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:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../dart/resolution/node_text_expectations.dart';
+import '../elements_base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConstElementTest_keepLinking);
+    defineReflectiveTests(ConstElementTest_fromBytes);
+    defineReflectiveTests(UpdateNodeTextExpectations);
+  });
+}
+
+abstract class ConstElementTest extends ElementsBaseTest {
+  test_const_asExpression() async {
+    var library = await buildLibrary('''
+const num a = 0;
+const b = a as int;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @10
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: num
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @14
+              staticType: int
+        static const b @23
+          reference: <testLibraryFragment>::@topLevelVariable::b
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            AsExpression
+              expression: SimpleIdentifier
+                token: a @27
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: num
+              asOperator: as @29
+              type: NamedType
+                name: int @32
+                element: dart:core::<fragment>::@class::int
+                type: int
+              staticType: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: num
+        synthetic static get b @-1
+          reference: <testLibraryFragment>::@getter::b
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_assignmentExpression() async {
+    var library = await buildLibrary(r'''
+const a = 0;
+const b = (a += 1);
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @10
+              staticType: int
+        static const b @19
+          reference: <testLibraryFragment>::@topLevelVariable::b
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            ParenthesizedExpression
+              leftParenthesis: ( @23
+              expression: AssignmentExpression
+                leftHandSide: SimpleIdentifier
+                  token: a @24
+                  staticElement: <null>
+                  staticType: null
+                operator: += @26
+                rightHandSide: IntegerLiteral
+                  literal: 1 @29
+                  staticType: int
+                readElement: <testLibraryFragment>::@getter::a
+                readType: int
+                writeElement: <testLibraryFragment>::@getter::a
+                writeType: InvalidType
+                staticElement: dart:core::<fragment>::@class::num::@method::+
+                staticType: int
+              rightParenthesis: ) @30
+              staticType: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get b @-1
+          reference: <testLibraryFragment>::@getter::b
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_cascadeExpression() async {
+    var library = await buildLibrary(r'''
+const a = 0..isEven..abs();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            CascadeExpression
+              target: IntegerLiteral
+                literal: 0 @10
+                staticType: int
+              cascadeSections
+                PropertyAccess
+                  operator: .. @11
+                  propertyName: SimpleIdentifier
+                    token: isEven @13
+                    staticElement: dart:core::<fragment>::@class::int::@getter::isEven
+                    staticType: bool
+                  staticType: bool
+                MethodInvocation
+                  operator: .. @19
+                  methodName: SimpleIdentifier
+                    token: abs @21
+                    staticElement: dart:core::<fragment>::@class::int::@method::abs
+                    staticType: int Function()
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @24
+                    rightParenthesis: ) @25
+                  staticInvokeType: int Function()
+                  staticType: int
+              staticType: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_classField() async {
+    var library = await buildLibrary(r'''
+class C {
+  static const int f1 = 1;
+  static const int f2 = C.f1, f3 = C.f2;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            static const f1 @29
+              reference: <testLibraryFragment>::@class::C::@field::f1
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: true
+              constantInitializer
+                IntegerLiteral
+                  literal: 1 @34
+                  staticType: int
+            static const f2 @56
+              reference: <testLibraryFragment>::@class::C::@field::f2
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: true
+              constantInitializer
+                PrefixedIdentifier
+                  prefix: SimpleIdentifier
+                    token: C @61
+                    staticElement: <testLibraryFragment>::@class::C
+                    staticType: null
+                  period: . @62
+                  identifier: SimpleIdentifier
+                    token: f1 @63
+                    staticElement: <testLibraryFragment>::@class::C::@getter::f1
+                    staticType: int
+                  staticElement: <testLibraryFragment>::@class::C::@getter::f1
+                  staticType: int
+            static const f3 @67
+              reference: <testLibraryFragment>::@class::C::@field::f3
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: true
+              constantInitializer
+                PrefixedIdentifier
+                  prefix: SimpleIdentifier
+                    token: C @72
+                    staticElement: <testLibraryFragment>::@class::C
+                    staticType: null
+                  period: . @73
+                  identifier: SimpleIdentifier
+                    token: f2 @74
+                    staticElement: <testLibraryFragment>::@class::C::@getter::f2
+                    staticType: int
+                  staticElement: <testLibraryFragment>::@class::C::@getter::f2
+                  staticType: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic static get f1 @-1
+              reference: <testLibraryFragment>::@class::C::@getter::f1
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic static get f2 @-1
+              reference: <testLibraryFragment>::@class::C::@getter::f2
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic static get f3 @-1
+              reference: <testLibraryFragment>::@class::C::@getter::f3
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+''');
+  }
+
+  test_const_constructor_inferred_args() async {
+    var library = await buildLibrary('''
+class C<T> {
+  final T t;
+  const C(this.t);
+  const C.named(this.t);
+}
+const Object x = const C(0);
+const Object y = const C.named(0);
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          fields
+            final t @23
+              reference: <testLibraryFragment>::@class::C::@field::t
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: T
+          constructors
+            const @34
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional final this.t @41
+                  type: T
+                  field: <testLibraryFragment>::@class::C::@field::t
+            const named @55
+              reference: <testLibraryFragment>::@class::C::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 54
+              nameEnd: 60
+              parameters
+                requiredPositional final this.t @66
+                  type: T
+                  field: <testLibraryFragment>::@class::C::@field::t
+          accessors
+            synthetic get t @-1
+              reference: <testLibraryFragment>::@class::C::@getter::t
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: T
+      topLevelVariables
+        static const x @85
+          reference: <testLibraryFragment>::@topLevelVariable::x
+          enclosingElement: <testLibraryFragment>
+          type: Object
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @89
+              constructorName: ConstructorName
+                type: NamedType
+                  name: C @95
+                  element: <testLibraryFragment>::@class::C
+                  type: C<int>
+                staticElement: ConstructorMember
+                  base: <testLibraryFragment>::@class::C::@constructor::new
+                  substitution: {T: int}
+              argumentList: ArgumentList
+                leftParenthesis: ( @96
+                arguments
+                  IntegerLiteral
+                    literal: 0 @97
+                    staticType: int
+                rightParenthesis: ) @98
+              staticType: C<int>
+        static const y @114
+          reference: <testLibraryFragment>::@topLevelVariable::y
+          enclosingElement: <testLibraryFragment>
+          type: Object
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @118
+              constructorName: ConstructorName
+                type: NamedType
+                  name: C @124
+                  element: <testLibraryFragment>::@class::C
+                  type: C<int>
+                period: . @125
+                name: SimpleIdentifier
+                  token: named @126
+                  staticElement: ConstructorMember
+                    base: <testLibraryFragment>::@class::C::@constructor::named
+                    substitution: {T: dynamic}
+                  staticType: null
+                staticElement: ConstructorMember
+                  base: <testLibraryFragment>::@class::C::@constructor::named
+                  substitution: {T: int}
+              argumentList: ArgumentList
+                leftParenthesis: ( @131
+                arguments
+                  IntegerLiteral
+                    literal: 0 @132
+                    staticType: int
+                rightParenthesis: ) @133
+              staticType: C<int>
+      accessors
+        synthetic static get x @-1
+          reference: <testLibraryFragment>::@getter::x
+          enclosingElement: <testLibraryFragment>
+          returnType: Object
+        synthetic static get y @-1
+          reference: <testLibraryFragment>::@getter::y
+          enclosingElement: <testLibraryFragment>
+          returnType: Object
+''');
+    var x = library.definingCompilationUnit.topLevelVariables[0];
+    var xExpr = x.constantInitializer as InstanceCreationExpression;
+    var xType = xExpr.constructorName.staticElement!.returnType;
+    _assertTypeStr(
+      xType,
+      'C<int>',
+    );
+    var y = library.definingCompilationUnit.topLevelVariables[0];
+    var yExpr = y.constantInitializer as InstanceCreationExpression;
+    var yType = yExpr.constructorName.staticElement!.returnType;
+    _assertTypeStr(yType, 'C<int>');
+  }
+
+  test_const_constructorReference() async {
+    var library = await buildLibrary(r'''
+class A {
+  A.named();
+}
+const v = A.named;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            named @14
+              reference: <testLibraryFragment>::@class::A::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 13
+              nameEnd: 19
+      topLevelVariables
+        static const v @31
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: A Function()
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            ConstructorReference
+              constructorName: ConstructorName
+                type: NamedType
+                  name: A @35
+                  element: <testLibraryFragment>::@class::A
+                  type: null
+                period: . @36
+                name: SimpleIdentifier
+                  token: named @37
+                  staticElement: <testLibraryFragment>::@class::A::@constructor::named
+                  staticType: null
+                staticElement: <testLibraryFragment>::@class::A::@constructor::named
+              staticType: A Function()
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: A Function()
+''');
+  }
+
+  test_const_finalField_hasConstConstructor() async {
+    var library = await buildLibrary(r'''
+class C {
+  final int f = 42;
+  const C();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            final f @22
+              reference: <testLibraryFragment>::@class::C::@field::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: true
+              constantInitializer
+                IntegerLiteral
+                  literal: 42 @26
+                  staticType: int
+          constructors
+            const @38
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get f @-1
+              reference: <testLibraryFragment>::@class::C::@getter::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+''');
+  }
+
+  test_const_functionExpression_typeArgumentTypes() async {
+    var library = await buildLibrary('''
+void f<T>(T a) {}
+
+const void Function(int) v = f;
+''');
+    checkElementText(library, '''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const v @44
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: void Function(int)
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            FunctionReference
+              function: SimpleIdentifier
+                token: f @48
+                staticElement: <testLibraryFragment>::@function::f
+                staticType: void Function<T>(T)
+              staticType: void Function(int)
+              typeArgumentTypes
+                int
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: void Function(int)
+      functions
+        f @5
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @7
+              defaultType: dynamic
+          parameters
+            requiredPositional a @12
+              type: T
+          returnType: void
+''');
+  }
+
+  test_const_functionReference() async {
+    var library = await buildLibrary(r'''
+void f<T>(T a) {}
+const v = f<int>;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const v @24
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: void Function(int)
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            FunctionReference
+              function: SimpleIdentifier
+                token: f @28
+                staticElement: <testLibraryFragment>::@function::f
+                staticType: void Function<T>(T)
+              typeArguments: TypeArgumentList
+                leftBracket: < @29
+                arguments
+                  NamedType
+                    name: int @30
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                rightBracket: > @33
+              staticType: void Function(int)
+              typeArgumentTypes
+                int
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: void Function(int)
+      functions
+        f @5
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @7
+              defaultType: dynamic
+          parameters
+            requiredPositional a @12
+              type: T
+          returnType: void
+''');
+  }
+
+  test_const_indexExpression() async {
+    var library = await buildLibrary(r'''
+const a = [0];
+const b = 0;
+const c = a[b];
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: List<int>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            ListLiteral
+              leftBracket: [ @10
+              elements
+                IntegerLiteral
+                  literal: 0 @11
+                  staticType: int
+              rightBracket: ] @12
+              staticType: List<int>
+        static const b @21
+          reference: <testLibraryFragment>::@topLevelVariable::b
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @25
+              staticType: int
+        static const c @34
+          reference: <testLibraryFragment>::@topLevelVariable::c
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IndexExpression
+              target: SimpleIdentifier
+                token: a @38
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: List<int>
+              leftBracket: [ @39
+              index: SimpleIdentifier
+                token: b @40
+                staticElement: <testLibraryFragment>::@getter::b
+                staticType: int
+              rightBracket: ] @41
+              staticElement: MethodMember
+                base: dart:core::<fragment>::@class::List::@method::[]
+                substitution: {E: int}
+              staticType: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: List<int>
+        synthetic static get b @-1
+          reference: <testLibraryFragment>::@getter::b
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get c @-1
+          reference: <testLibraryFragment>::@getter::c
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_inference_downward_list() async {
+    var library = await buildLibrary('''
+class P<T> {
+  const P();
+}
+
+class P1<T> extends P<T> {
+  const P1();
+}
+
+class P2<T> extends P<T> {
+  const P2();
+}
+
+const List<P> values = [
+  P1(),
+  P2<int>(),
+];
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class P @6
+          reference: <testLibraryFragment>::@class::P
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            const @21
+              reference: <testLibraryFragment>::@class::P::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::P
+        class P1 @35
+          reference: <testLibraryFragment>::@class::P1
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @38
+              defaultType: dynamic
+          supertype: P<T>
+          constructors
+            const @64
+              reference: <testLibraryFragment>::@class::P1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::P1
+              superConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::P::@constructor::new
+                substitution: {T: T}
+        class P2 @79
+          reference: <testLibraryFragment>::@class::P2
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @82
+              defaultType: dynamic
+          supertype: P<T>
+          constructors
+            const @108
+              reference: <testLibraryFragment>::@class::P2::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::P2
+              superConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::P::@constructor::new
+                substitution: {T: T}
+      topLevelVariables
+        static const values @131
+          reference: <testLibraryFragment>::@topLevelVariable::values
+          enclosingElement: <testLibraryFragment>
+          type: List<P<dynamic>>
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            ListLiteral
+              leftBracket: [ @140
+              elements
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: P1 @144
+                      element: <testLibraryFragment>::@class::P1
+                      type: P1<dynamic>
+                    staticElement: ConstructorMember
+                      base: <testLibraryFragment>::@class::P1::@constructor::new
+                      substitution: {T: dynamic}
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @146
+                    rightParenthesis: ) @147
+                  staticType: P1<dynamic>
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: P2 @152
+                      typeArguments: TypeArgumentList
+                        leftBracket: < @154
+                        arguments
+                          NamedType
+                            name: int @155
+                            element: dart:core::<fragment>::@class::int
+                            type: int
+                        rightBracket: > @158
+                      element: <testLibraryFragment>::@class::P2
+                      type: P2<int>
+                    staticElement: ConstructorMember
+                      base: <testLibraryFragment>::@class::P2::@constructor::new
+                      substitution: {T: int}
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @159
+                    rightParenthesis: ) @160
+                  staticType: P2<int>
+              rightBracket: ] @163
+              staticType: List<P<dynamic>>
+      accessors
+        synthetic static get values @-1
+          reference: <testLibraryFragment>::@getter::values
+          enclosingElement: <testLibraryFragment>
+          returnType: List<P<dynamic>>
+''');
+  }
+
+  test_const_invalid_field_const() async {
+    var library = await buildLibrary(r'''
+class C {
+  static const f = 1 + foo();
+}
+int foo() => 42;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            static const f @25
+              reference: <testLibraryFragment>::@class::C::@field::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                BinaryExpression
+                  leftOperand: IntegerLiteral
+                    literal: 1 @29
+                    staticType: int
+                  operator: + @31
+                  rightOperand: MethodInvocation
+                    methodName: SimpleIdentifier
+                      token: foo @33
+                      staticElement: <testLibraryFragment>::@function::foo
+                      staticType: int Function()
+                    argumentList: ArgumentList
+                      leftParenthesis: ( @36
+                      rightParenthesis: ) @37
+                    staticInvokeType: int Function()
+                    staticType: int
+                  staticElement: dart:core::<fragment>::@class::num::@method::+
+                  staticInvokeType: num Function(num)
+                  staticType: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic static get f @-1
+              reference: <testLibraryFragment>::@class::C::@getter::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+      functions
+        foo @46
+          reference: <testLibraryFragment>::@function::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_invalid_field_final() async {
+    var library = await buildLibrary(r'''
+class C {
+  final f = 1 + foo();
+}
+int foo() => 42;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            final f @18
+              reference: <testLibraryFragment>::@class::C::@field::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: false
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get f @-1
+              reference: <testLibraryFragment>::@class::C::@getter::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+      functions
+        foo @39
+          reference: <testLibraryFragment>::@function::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_invalid_functionExpression() async {
+    var library = await buildLibrary('''
+const v = () { return 0; };
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const v @6
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: int Function()
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SimpleIdentifier
+              token: _notSerializableExpression @-1
+              staticElement: <null>
+              staticType: null
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: int Function()
+''');
+  }
+
+  test_const_invalid_functionExpression_assertInitializer() async {
+    var library = await buildLibrary('''
+class A  {
+  const A() : assert((() => true)());
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const @19
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              constantInitializers
+                AssertInitializer
+                  assertKeyword: assert @25
+                  leftParenthesis: ( @31
+                  condition: SimpleIdentifier
+                    token: _notSerializableExpression @-1
+                    staticElement: <null>
+                    staticType: null
+                  rightParenthesis: ) @46
+''');
+  }
+
+  test_const_invalid_functionExpression_assertInitializer_message() async {
+    var library = await buildLibrary('''
+class A  {
+  const A() : assert(b, () => 0);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const @19
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              constantInitializers
+                AssertInitializer
+                  assertKeyword: assert @25
+                  leftParenthesis: ( @31
+                  condition: SimpleIdentifier
+                    token: b @32
+                    staticElement: <null>
+                    staticType: InvalidType
+                  comma: , @33
+                  message: SimpleIdentifier
+                    token: _notSerializableExpression @-1
+                    staticElement: <null>
+                    staticType: null
+                  rightParenthesis: ) @42
+''');
+  }
+
+  test_const_invalid_functionExpression_constructorFieldInitializer() async {
+    var library = await buildLibrary('''
+class A {
+  final Object? foo;
+  const A() : foo = (() => 0);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            final foo @26
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: Object?
+          constructors
+            const @39
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              constantInitializers
+                ConstructorFieldInitializer
+                  fieldName: SimpleIdentifier
+                    token: foo @45
+                    staticElement: <testLibraryFragment>::@class::A::@field::foo
+                    staticType: null
+                  equals: = @49
+                  expression: SimpleIdentifier
+                    token: _notSerializableExpression @-1
+                    staticElement: <null>
+                    staticType: null
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: Object?
+''');
+  }
+
+  test_const_invalid_functionExpression_nested() async {
+    var library = await buildLibrary('''
+const v = () { return 0; } + 2;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const v @6
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: InvalidType
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SimpleIdentifier
+              token: _notSerializableExpression @-1
+              staticElement: <null>
+              staticType: null
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: InvalidType
+''');
+  }
+
+  test_const_invalid_functionExpression_redirectingConstructorInvocation() async {
+    var library = await buildLibrary('''
+class A {
+  const A(Object a, Object b);
+  const A.named() : this(0, () => 0);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const @18
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional a @27
+                  type: Object
+                requiredPositional b @37
+                  type: Object
+            const named @51
+              reference: <testLibraryFragment>::@class::A::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 50
+              nameEnd: 56
+              constantInitializers
+                RedirectingConstructorInvocation
+                  thisKeyword: this @61
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @65
+                    arguments
+                      IntegerLiteral
+                        literal: 0 @66
+                        staticType: int
+                      SimpleIdentifier
+                        token: _notSerializableExpression @-1
+                        staticElement: <null>
+                        staticType: null
+                    rightParenthesis: ) @76
+                  staticElement: <testLibraryFragment>::@class::A::@constructor::new
+              redirectedConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_const_invalid_functionExpression_superConstructorInvocation() async {
+    var library = await buildLibrary('''
+class A {
+  const A(Object a, Object b);
+}
+class B extends A {
+  const B() : super(0, () => 0);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const @18
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional a @27
+                  type: Object
+                requiredPositional b @37
+                  type: Object
+        class B @49
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            const @71
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @77
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @82
+                    arguments
+                      IntegerLiteral
+                        literal: 0 @83
+                        staticType: int
+                      SimpleIdentifier
+                        token: _notSerializableExpression @-1
+                        staticElement: <null>
+                        staticType: null
+                    rightParenthesis: ) @93
+                  staticElement: <testLibraryFragment>::@class::A::@constructor::new
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  @SkippedTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
+  test_const_invalid_intLiteral() async {
+    var library = await buildLibrary(r'''
+const int x = 0x;
+''');
+    checkElementText(library, r'''
+const int x = 0;
+''');
+  }
+
+  test_const_invalid_methodInvocation() async {
+    var library = await buildLibrary(r'''
+const a = 'abc'.codeUnitAt(0);
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            MethodInvocation
+              target: SimpleStringLiteral
+                literal: 'abc' @10
+              operator: . @15
+              methodName: SimpleIdentifier
+                token: codeUnitAt @16
+                staticElement: dart:core::<fragment>::@class::String::@method::codeUnitAt
+                staticType: int Function(int)
+              argumentList: ArgumentList
+                leftParenthesis: ( @26
+                arguments
+                  IntegerLiteral
+                    literal: 0 @27
+                    staticType: int
+                rightParenthesis: ) @28
+              staticInvokeType: int Function(int)
+              staticType: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_invalid_patternAssignment() async {
+    var library = await buildLibrary('''
+const v = (a,) = (0,);
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const v @6
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: (int,)
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SimpleIdentifier
+              token: _notSerializableExpression @-1
+              staticElement: <null>
+              staticType: null
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: (int,)
+''');
+  }
+
+  test_const_invalid_topLevel() async {
+    var library = await buildLibrary(r'''
+const v = 1 + foo();
+int foo() => 42;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const v @6
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: IntegerLiteral
+                literal: 1 @10
+                staticType: int
+              operator: + @12
+              rightOperand: MethodInvocation
+                methodName: SimpleIdentifier
+                  token: foo @14
+                  staticElement: <testLibraryFragment>::@function::foo
+                  staticType: int Function()
+                argumentList: ArgumentList
+                  leftParenthesis: ( @17
+                  rightParenthesis: ) @18
+                staticInvokeType: int Function()
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::num::@method::+
+              staticInvokeType: num Function(num)
+              staticType: int
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+      functions
+        foo @25
+          reference: <testLibraryFragment>::@function::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_invalid_topLevel_switchExpression() async {
+    var library = await buildLibrary(r'''
+const a = 0 + switch (true) {_ => 1};
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SimpleIdentifier
+              token: _notSerializableExpression @-1
+              staticElement: <null>
+              staticType: null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_invalid_typeMismatch() async {
+    var library = await buildLibrary(r'''
+const int a = 0;
+const bool b = a + 5;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @10
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @14
+              staticType: int
+        static const b @28
+          reference: <testLibraryFragment>::@topLevelVariable::b
+          enclosingElement: <testLibraryFragment>
+          type: bool
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            BinaryExpression
+              leftOperand: SimpleIdentifier
+                token: a @32
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: int
+              operator: + @34
+              rightOperand: IntegerLiteral
+                literal: 5 @36
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::num::@method::+
+              staticInvokeType: num Function(num)
+              staticType: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get b @-1
+          reference: <testLibraryFragment>::@getter::b
+          enclosingElement: <testLibraryFragment>
+          returnType: bool
+''');
+  }
+
+  test_const_invokeConstructor_generic_named() async {
+    var library = await buildLibrary(r'''
+class C<K, V> {
+  const C.named(K k, V v);
+}
+const V = const C<int, String>.named(1, '222');
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant K @8
+              defaultType: dynamic
+            covariant V @11
+              defaultType: dynamic
+          constructors
+            const named @26
+              reference: <testLibraryFragment>::@class::C::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 25
+              nameEnd: 31
+              parameters
+                requiredPositional k @34
+                  type: K
+                requiredPositional v @39
+                  type: V
+      topLevelVariables
+        static const V @51
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: C<int, String>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @55
+              constructorName: ConstructorName
+                type: NamedType
+                  name: C @61
+                  typeArguments: TypeArgumentList
+                    leftBracket: < @62
+                    arguments
+                      NamedType
+                        name: int @63
+                        element: dart:core::<fragment>::@class::int
+                        type: int
+                      NamedType
+                        name: String @68
+                        element: dart:core::<fragment>::@class::String
+                        type: String
+                    rightBracket: > @74
+                  element: <testLibraryFragment>::@class::C
+                  type: C<int, String>
+                period: . @75
+                name: SimpleIdentifier
+                  token: named @76
+                  staticElement: ConstructorMember
+                    base: <testLibraryFragment>::@class::C::@constructor::named
+                    substitution: {K: int, V: String}
+                  staticType: null
+                staticElement: ConstructorMember
+                  base: <testLibraryFragment>::@class::C::@constructor::named
+                  substitution: {K: int, V: String}
+              argumentList: ArgumentList
+                leftParenthesis: ( @81
+                arguments
+                  IntegerLiteral
+                    literal: 1 @82
+                    staticType: int
+                  SimpleStringLiteral
+                    literal: '222' @85
+                rightParenthesis: ) @90
+              staticType: C<int, String>
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: C<int, String>
+''');
+  }
+
+  test_const_invokeConstructor_generic_named_imported() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class C<K, V> {
+  const C.named(K k, V v);
+}
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart';
+const V = const C<int, String>.named(1, '222');
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const V @23
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: C<int, String>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @27
+              constructorName: ConstructorName
+                type: NamedType
+                  name: C @33
+                  typeArguments: TypeArgumentList
+                    leftBracket: < @34
+                    arguments
+                      NamedType
+                        name: int @35
+                        element: dart:core::<fragment>::@class::int
+                        type: int
+                      NamedType
+                        name: String @40
+                        element: dart:core::<fragment>::@class::String
+                        type: String
+                    rightBracket: > @46
+                  element: package:test/a.dart::<fragment>::@class::C
+                  type: C<int, String>
+                period: . @47
+                name: SimpleIdentifier
+                  token: named @48
+                  staticElement: ConstructorMember
+                    base: package:test/a.dart::<fragment>::@class::C::@constructor::named
+                    substitution: {K: int, V: String}
+                  staticType: null
+                staticElement: ConstructorMember
+                  base: package:test/a.dart::<fragment>::@class::C::@constructor::named
+                  substitution: {K: int, V: String}
+              argumentList: ArgumentList
+                leftParenthesis: ( @53
+                arguments
+                  IntegerLiteral
+                    literal: 1 @54
+                    staticType: int
+                  SimpleStringLiteral
+                    literal: '222' @57
+                rightParenthesis: ) @62
+              staticType: C<int, String>
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: C<int, String>
+''');
+  }
+
+  test_const_invokeConstructor_generic_named_imported_withPrefix() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class C<K, V> {
+  const C.named(K k, V v);
+}
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart' as p;
+const V = const p.C<int, String>.named(1, '222');
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart as p @19
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    p @19
+      reference: <testLibraryFragment>::@prefix::p
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart as p @19
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        p @19
+          reference: <testLibraryFragment>::@prefix::p
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const V @28
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: C<int, String>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @32
+              constructorName: ConstructorName
+                type: NamedType
+                  importPrefix: ImportPrefixReference
+                    name: p @38
+                    period: . @39
+                    element: <testLibraryFragment>::@prefix::p
+                  name: C @40
+                  typeArguments: TypeArgumentList
+                    leftBracket: < @41
+                    arguments
+                      NamedType
+                        name: int @42
+                        element: dart:core::<fragment>::@class::int
+                        type: int
+                      NamedType
+                        name: String @47
+                        element: dart:core::<fragment>::@class::String
+                        type: String
+                    rightBracket: > @53
+                  element: package:test/a.dart::<fragment>::@class::C
+                  type: C<int, String>
+                period: . @54
+                name: SimpleIdentifier
+                  token: named @55
+                  staticElement: ConstructorMember
+                    base: package:test/a.dart::<fragment>::@class::C::@constructor::named
+                    substitution: {K: int, V: String}
+                  staticType: null
+                staticElement: ConstructorMember
+                  base: package:test/a.dart::<fragment>::@class::C::@constructor::named
+                  substitution: {K: int, V: String}
+              argumentList: ArgumentList
+                leftParenthesis: ( @60
+                arguments
+                  IntegerLiteral
+                    literal: 1 @61
+                    staticType: int
+                  SimpleStringLiteral
+                    literal: '222' @64
+                rightParenthesis: ) @69
+              staticType: C<int, String>
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: C<int, String>
+''');
+  }
+
+  test_const_invokeConstructor_generic_noTypeArguments() async {
+    var library = await buildLibrary(r'''
+class C<K, V> {
+  const C();
+}
+const V = const C();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant K @8
+              defaultType: dynamic
+            covariant V @11
+              defaultType: dynamic
+          constructors
+            const @24
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+      topLevelVariables
+        static const V @37
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: C<dynamic, dynamic>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @41
+              constructorName: ConstructorName
+                type: NamedType
+                  name: C @47
+                  element: <testLibraryFragment>::@class::C
+                  type: C<dynamic, dynamic>
+                staticElement: ConstructorMember
+                  base: <testLibraryFragment>::@class::C::@constructor::new
+                  substitution: {K: dynamic, V: dynamic}
+              argumentList: ArgumentList
+                leftParenthesis: ( @48
+                rightParenthesis: ) @49
+              staticType: C<dynamic, dynamic>
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: C<dynamic, dynamic>
+''');
+  }
+
+  test_const_invokeConstructor_generic_noTypeArguments_inferred() async {
+    var library = await buildLibrary(r'''
+class A<T> {
+  final T t;
+  const A(this.t);
+}
+const Object a = const A(0);
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          fields
+            final t @23
+              reference: <testLibraryFragment>::@class::A::@field::t
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: T
+          constructors
+            const @34
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional final this.t @41
+                  type: T
+                  field: <testLibraryFragment>::@class::A::@field::t
+          accessors
+            synthetic get t @-1
+              reference: <testLibraryFragment>::@class::A::@getter::t
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: T
+      topLevelVariables
+        static const a @60
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: Object
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @64
+              constructorName: ConstructorName
+                type: NamedType
+                  name: A @70
+                  element: <testLibraryFragment>::@class::A
+                  type: A<int>
+                staticElement: ConstructorMember
+                  base: <testLibraryFragment>::@class::A::@constructor::new
+                  substitution: {T: int}
+              argumentList: ArgumentList
+                leftParenthesis: ( @71
+                arguments
+                  IntegerLiteral
+                    literal: 0 @72
+                    staticType: int
+                rightParenthesis: ) @73
+              staticType: A<int>
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: Object
+''');
+  }
+
+  test_const_invokeConstructor_generic_unnamed() async {
+    var library = await buildLibrary(r'''
+class C<K, V> {
+  const C();
+}
+const V = const C<int, String>();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant K @8
+              defaultType: dynamic
+            covariant V @11
+              defaultType: dynamic
+          constructors
+            const @24
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+      topLevelVariables
+        static const V @37
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: C<int, String>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @41
+              constructorName: ConstructorName
+                type: NamedType
+                  name: C @47
+                  typeArguments: TypeArgumentList
+                    leftBracket: < @48
+                    arguments
+                      NamedType
+                        name: int @49
+                        element: dart:core::<fragment>::@class::int
+                        type: int
+                      NamedType
+                        name: String @54
+                        element: dart:core::<fragment>::@class::String
+                        type: String
+                    rightBracket: > @60
+                  element: <testLibraryFragment>::@class::C
+                  type: C<int, String>
+                staticElement: ConstructorMember
+                  base: <testLibraryFragment>::@class::C::@constructor::new
+                  substitution: {K: int, V: String}
+              argumentList: ArgumentList
+                leftParenthesis: ( @61
+                rightParenthesis: ) @62
+              staticType: C<int, String>
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: C<int, String>
+''');
+  }
+
+  test_const_invokeConstructor_generic_unnamed_imported() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class C<K, V> {
+  const C();
+}
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart';
+const V = const C<int, String>();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const V @23
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: C<int, String>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @27
+              constructorName: ConstructorName
+                type: NamedType
+                  name: C @33
+                  typeArguments: TypeArgumentList
+                    leftBracket: < @34
+                    arguments
+                      NamedType
+                        name: int @35
+                        element: dart:core::<fragment>::@class::int
+                        type: int
+                      NamedType
+                        name: String @40
+                        element: dart:core::<fragment>::@class::String
+                        type: String
+                    rightBracket: > @46
+                  element: package:test/a.dart::<fragment>::@class::C
+                  type: C<int, String>
+                staticElement: ConstructorMember
+                  base: package:test/a.dart::<fragment>::@class::C::@constructor::new
+                  substitution: {K: int, V: String}
+              argumentList: ArgumentList
+                leftParenthesis: ( @47
+                rightParenthesis: ) @48
+              staticType: C<int, String>
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: C<int, String>
+''');
+  }
+
+  test_const_invokeConstructor_generic_unnamed_imported_withPrefix() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class C<K, V> {
+  const C();
+}
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart' as p;
+const V = const p.C<int, String>();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart as p @19
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    p @19
+      reference: <testLibraryFragment>::@prefix::p
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart as p @19
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        p @19
+          reference: <testLibraryFragment>::@prefix::p
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const V @28
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: C<int, String>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @32
+              constructorName: ConstructorName
+                type: NamedType
+                  importPrefix: ImportPrefixReference
+                    name: p @38
+                    period: . @39
+                    element: <testLibraryFragment>::@prefix::p
+                  name: C @40
+                  typeArguments: TypeArgumentList
+                    leftBracket: < @41
+                    arguments
+                      NamedType
+                        name: int @42
+                        element: dart:core::<fragment>::@class::int
+                        type: int
+                      NamedType
+                        name: String @47
+                        element: dart:core::<fragment>::@class::String
+                        type: String
+                    rightBracket: > @53
+                  element: package:test/a.dart::<fragment>::@class::C
+                  type: C<int, String>
+                staticElement: ConstructorMember
+                  base: package:test/a.dart::<fragment>::@class::C::@constructor::new
+                  substitution: {K: int, V: String}
+              argumentList: ArgumentList
+                leftParenthesis: ( @54
+                rightParenthesis: ) @55
+              staticType: C<int, String>
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: C<int, String>
+''');
+  }
+
+  test_const_invokeConstructor_named() async {
+    var library = await buildLibrary(r'''
+class C {
+  const C.named(bool a, int b, int c, {String d, double e});
+}
+const V = const C.named(true, 1, 2, d: 'ccc', e: 3.4);
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const named @20
+              reference: <testLibraryFragment>::@class::C::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 19
+              nameEnd: 25
+              parameters
+                requiredPositional a @31
+                  type: bool
+                requiredPositional b @38
+                  type: int
+                requiredPositional c @45
+                  type: int
+                optionalNamed default d @56
+                  reference: <testLibraryFragment>::@class::C::@constructor::named::@parameter::d
+                  type: String
+                optionalNamed default e @66
+                  reference: <testLibraryFragment>::@class::C::@constructor::named::@parameter::e
+                  type: double
+      topLevelVariables
+        static const V @79
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: C
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @83
+              constructorName: ConstructorName
+                type: NamedType
+                  name: C @89
+                  element: <testLibraryFragment>::@class::C
+                  type: C
+                period: . @90
+                name: SimpleIdentifier
+                  token: named @91
+                  staticElement: <testLibraryFragment>::@class::C::@constructor::named
+                  staticType: null
+                staticElement: <testLibraryFragment>::@class::C::@constructor::named
+              argumentList: ArgumentList
+                leftParenthesis: ( @96
+                arguments
+                  BooleanLiteral
+                    literal: true @97
+                    staticType: bool
+                  IntegerLiteral
+                    literal: 1 @103
+                    staticType: int
+                  IntegerLiteral
+                    literal: 2 @106
+                    staticType: int
+                  NamedExpression
+                    name: Label
+                      label: SimpleIdentifier
+                        token: d @109
+                        staticElement: <testLibraryFragment>::@class::C::@constructor::named::@parameter::d
+                        staticType: null
+                      colon: : @110
+                    expression: SimpleStringLiteral
+                      literal: 'ccc' @112
+                  NamedExpression
+                    name: Label
+                      label: SimpleIdentifier
+                        token: e @119
+                        staticElement: <testLibraryFragment>::@class::C::@constructor::named::@parameter::e
+                        staticType: null
+                      colon: : @120
+                    expression: DoubleLiteral
+                      literal: 3.4 @122
+                      staticType: double
+                rightParenthesis: ) @125
+              staticType: C
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: C
+''');
+  }
+
+  test_const_invokeConstructor_named_imported() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class C {
+  const C.named();
+}
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart';
+const V = const C.named();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const V @23
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: C
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @27
+              constructorName: ConstructorName
+                type: NamedType
+                  name: C @33
+                  element: package:test/a.dart::<fragment>::@class::C
+                  type: C
+                period: . @34
+                name: SimpleIdentifier
+                  token: named @35
+                  staticElement: package:test/a.dart::<fragment>::@class::C::@constructor::named
+                  staticType: null
+                staticElement: package:test/a.dart::<fragment>::@class::C::@constructor::named
+              argumentList: ArgumentList
+                leftParenthesis: ( @40
+                rightParenthesis: ) @41
+              staticType: C
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: C
+''');
+  }
+
+  test_const_invokeConstructor_named_imported_withPrefix() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class C {
+  const C.named();
+}
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart' as p;
+const V = const p.C.named();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart as p @19
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    p @19
+      reference: <testLibraryFragment>::@prefix::p
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart as p @19
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        p @19
+          reference: <testLibraryFragment>::@prefix::p
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const V @28
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: C
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @32
+              constructorName: ConstructorName
+                type: NamedType
+                  importPrefix: ImportPrefixReference
+                    name: p @38
+                    period: . @39
+                    element: <testLibraryFragment>::@prefix::p
+                  name: C @40
+                  element: package:test/a.dart::<fragment>::@class::C
+                  type: C
+                period: . @41
+                name: SimpleIdentifier
+                  token: named @42
+                  staticElement: package:test/a.dart::<fragment>::@class::C::@constructor::named
+                  staticType: null
+                staticElement: package:test/a.dart::<fragment>::@class::C::@constructor::named
+              argumentList: ArgumentList
+                leftParenthesis: ( @47
+                rightParenthesis: ) @48
+              staticType: C
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: C
+''');
+  }
+
+  test_const_invokeConstructor_named_unresolved() async {
+    var library = await buildLibrary(r'''
+class C {}
+const V = const C.named();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+      topLevelVariables
+        static const V @17
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: C
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @21
+              constructorName: ConstructorName
+                type: NamedType
+                  name: C @27
+                  element: <testLibraryFragment>::@class::C
+                  type: C
+                period: . @28
+                name: SimpleIdentifier
+                  token: named @29
+                  staticElement: <null>
+                  staticType: null
+                staticElement: <null>
+              argumentList: ArgumentList
+                leftParenthesis: ( @34
+                rightParenthesis: ) @35
+              staticType: C
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: C
+''');
+  }
+
+  test_const_invokeConstructor_named_unresolved2() async {
+    var library = await buildLibrary(r'''
+const V = const C.named();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const V @6
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: InvalidType
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @10
+              constructorName: ConstructorName
+                type: NamedType
+                  importPrefix: ImportPrefixReference
+                    name: C @16
+                    period: . @17
+                    element: <null>
+                  name: named @18
+                  element: <null>
+                  type: InvalidType
+                staticElement: <null>
+              argumentList: ArgumentList
+                leftParenthesis: ( @23
+                rightParenthesis: ) @24
+              staticType: InvalidType
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: InvalidType
+''');
+  }
+
+  test_const_invokeConstructor_named_unresolved3() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class C {
+}
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart' as p;
+const V = const p.C.named();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart as p @19
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    p @19
+      reference: <testLibraryFragment>::@prefix::p
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart as p @19
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        p @19
+          reference: <testLibraryFragment>::@prefix::p
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const V @28
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: C
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @32
+              constructorName: ConstructorName
+                type: NamedType
+                  importPrefix: ImportPrefixReference
+                    name: p @38
+                    period: . @39
+                    element: <testLibraryFragment>::@prefix::p
+                  name: C @40
+                  element: package:test/a.dart::<fragment>::@class::C
+                  type: C
+                period: . @41
+                name: SimpleIdentifier
+                  token: named @42
+                  staticElement: <null>
+                  staticType: null
+                staticElement: <null>
+              argumentList: ArgumentList
+                leftParenthesis: ( @47
+                rightParenthesis: ) @48
+              staticType: C
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: C
+''');
+  }
+
+  test_const_invokeConstructor_named_unresolved4() async {
+    addSource('$testPackageLibPath/a.dart', '');
+    var library = await buildLibrary(r'''
+import 'a.dart' as p;
+const V = const p.C.named();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart as p @19
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    p @19
+      reference: <testLibraryFragment>::@prefix::p
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart as p @19
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        p @19
+          reference: <testLibraryFragment>::@prefix::p
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const V @28
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: InvalidType
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @32
+              constructorName: ConstructorName
+                type: NamedType
+                  importPrefix: ImportPrefixReference
+                    name: p @38
+                    period: . @39
+                    element: <testLibraryFragment>::@prefix::p
+                  name: C @40
+                  element: <null>
+                  type: InvalidType
+                period: . @41
+                name: SimpleIdentifier
+                  token: named @42
+                  staticElement: <null>
+                  staticType: null
+                staticElement: <null>
+              argumentList: ArgumentList
+                leftParenthesis: ( @47
+                rightParenthesis: ) @48
+              staticType: InvalidType
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: InvalidType
+''');
+  }
+
+  test_const_invokeConstructor_named_unresolved5() async {
+    var library = await buildLibrary(r'''
+const V = const p.C.named();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const V @6
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: InvalidType
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @10
+              constructorName: ConstructorName
+                type: NamedType
+                  importPrefix: ImportPrefixReference
+                    name: p @16
+                    period: . @17
+                    element: <null>
+                  name: C @18
+                  element: <null>
+                  type: InvalidType
+                period: . @19
+                name: SimpleIdentifier
+                  token: named @20
+                  staticElement: <null>
+                  staticType: null
+                staticElement: <null>
+              argumentList: ArgumentList
+                leftParenthesis: ( @25
+                rightParenthesis: ) @26
+              staticType: InvalidType
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: InvalidType
+''');
+  }
+
+  test_const_invokeConstructor_named_unresolved6() async {
+    var library = await buildLibrary(r'''
+class C<T> {}
+const V = const C.named();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+      topLevelVariables
+        static const V @20
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: C<dynamic>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @24
+              constructorName: ConstructorName
+                type: NamedType
+                  name: C @30
+                  element: <testLibraryFragment>::@class::C
+                  type: C<dynamic>
+                period: . @31
+                name: SimpleIdentifier
+                  token: named @32
+                  staticElement: <null>
+                  staticType: null
+                staticElement: <null>
+              argumentList: ArgumentList
+                leftParenthesis: ( @37
+                rightParenthesis: ) @38
+              staticType: C<dynamic>
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: C<dynamic>
+''');
+  }
+
+  test_const_invokeConstructor_unnamed() async {
+    var library = await buildLibrary(r'''
+class C {
+  const C();
+}
+const V = const C();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const @18
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+      topLevelVariables
+        static const V @31
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: C
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @35
+              constructorName: ConstructorName
+                type: NamedType
+                  name: C @41
+                  element: <testLibraryFragment>::@class::C
+                  type: C
+                staticElement: <testLibraryFragment>::@class::C::@constructor::new
+              argumentList: ArgumentList
+                leftParenthesis: ( @42
+                rightParenthesis: ) @43
+              staticType: C
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: C
+''');
+  }
+
+  test_const_invokeConstructor_unnamed_imported() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class C {
+  const C();
+}
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart';
+const V = const C();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const V @23
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: C
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @27
+              constructorName: ConstructorName
+                type: NamedType
+                  name: C @33
+                  element: package:test/a.dart::<fragment>::@class::C
+                  type: C
+                staticElement: package:test/a.dart::<fragment>::@class::C::@constructor::new
+              argumentList: ArgumentList
+                leftParenthesis: ( @34
+                rightParenthesis: ) @35
+              staticType: C
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: C
+''');
+  }
+
+  test_const_invokeConstructor_unnamed_imported_withPrefix() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class C {
+  const C();
+}
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart' as p;
+const V = const p.C();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart as p @19
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    p @19
+      reference: <testLibraryFragment>::@prefix::p
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart as p @19
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        p @19
+          reference: <testLibraryFragment>::@prefix::p
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const V @28
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: C
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @32
+              constructorName: ConstructorName
+                type: NamedType
+                  importPrefix: ImportPrefixReference
+                    name: p @38
+                    period: . @39
+                    element: <testLibraryFragment>::@prefix::p
+                  name: C @40
+                  element: package:test/a.dart::<fragment>::@class::C
+                  type: C
+                staticElement: package:test/a.dart::<fragment>::@class::C::@constructor::new
+              argumentList: ArgumentList
+                leftParenthesis: ( @41
+                rightParenthesis: ) @42
+              staticType: C
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: C
+''');
+  }
+
+  test_const_invokeConstructor_unnamed_unresolved() async {
+    var library = await buildLibrary(r'''
+const V = const C();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const V @6
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: InvalidType
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @10
+              constructorName: ConstructorName
+                type: NamedType
+                  name: C @16
+                  element: <null>
+                  type: InvalidType
+                staticElement: <null>
+              argumentList: ArgumentList
+                leftParenthesis: ( @17
+                rightParenthesis: ) @18
+              staticType: InvalidType
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: InvalidType
+''');
+  }
+
+  test_const_invokeConstructor_unnamed_unresolved2() async {
+    addSource('$testPackageLibPath/a.dart', '');
+    var library = await buildLibrary(r'''
+import 'a.dart' as p;
+const V = const p.C();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart as p @19
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    p @19
+      reference: <testLibraryFragment>::@prefix::p
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart as p @19
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        p @19
+          reference: <testLibraryFragment>::@prefix::p
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const V @28
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: InvalidType
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @32
+              constructorName: ConstructorName
+                type: NamedType
+                  importPrefix: ImportPrefixReference
+                    name: p @38
+                    period: . @39
+                    element: <testLibraryFragment>::@prefix::p
+                  name: C @40
+                  element: <null>
+                  type: InvalidType
+                staticElement: <null>
+              argumentList: ArgumentList
+                leftParenthesis: ( @41
+                rightParenthesis: ) @42
+              staticType: InvalidType
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: InvalidType
+''');
+  }
+
+  test_const_invokeConstructor_unnamed_unresolved3() async {
+    var library = await buildLibrary(r'''
+const V = const p.C();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const V @6
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: InvalidType
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              keyword: const @10
+              constructorName: ConstructorName
+                type: NamedType
+                  importPrefix: ImportPrefixReference
+                    name: p @16
+                    period: . @17
+                    element: <null>
+                  name: C @18
+                  element: <null>
+                  type: InvalidType
+                staticElement: <null>
+              argumentList: ArgumentList
+                leftParenthesis: ( @19
+                rightParenthesis: ) @20
+              staticType: InvalidType
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: InvalidType
+''');
+  }
+
+  test_const_isExpression() async {
+    var library = await buildLibrary('''
+const a = 0;
+const b = a is int;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @10
+              staticType: int
+        static const b @19
+          reference: <testLibraryFragment>::@topLevelVariable::b
+          enclosingElement: <testLibraryFragment>
+          type: bool
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IsExpression
+              expression: SimpleIdentifier
+                token: a @23
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: int
+              isOperator: is @25
+              type: NamedType
+                name: int @28
+                element: dart:core::<fragment>::@class::int
+                type: int
+              staticType: bool
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get b @-1
+          reference: <testLibraryFragment>::@getter::b
+          enclosingElement: <testLibraryFragment>
+          returnType: bool
+''');
+  }
+
+  test_const_length_ofClassConstField() async {
+    var library = await buildLibrary(r'''
+class C {
+  static const String F = '';
+}
+const int v = C.F.length;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            static const F @32
+              reference: <testLibraryFragment>::@class::C::@field::F
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: String
+              shouldUseTypeForInitializerInference: true
+              constantInitializer
+                SimpleStringLiteral
+                  literal: '' @36
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic static get F @-1
+              reference: <testLibraryFragment>::@class::C::@getter::F
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: String
+      topLevelVariables
+        static const v @52
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            PropertyAccess
+              target: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: C @56
+                  staticElement: <testLibraryFragment>::@class::C
+                  staticType: null
+                period: . @57
+                identifier: SimpleIdentifier
+                  token: F @58
+                  staticElement: <testLibraryFragment>::@class::C::@getter::F
+                  staticType: String
+                staticElement: <testLibraryFragment>::@class::C::@getter::F
+                staticType: String
+              operator: . @59
+              propertyName: SimpleIdentifier
+                token: length @60
+                staticElement: dart:core::<fragment>::@class::String::@getter::length
+                staticType: int
+              staticType: int
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_length_ofClassConstField_imported() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class C {
+  static const String F = '';
+}
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart';
+const int v = C.F.length;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const v @27
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            PropertyAccess
+              target: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: C @31
+                  staticElement: package:test/a.dart::<fragment>::@class::C
+                  staticType: null
+                period: . @32
+                identifier: SimpleIdentifier
+                  token: F @33
+                  staticElement: package:test/a.dart::<fragment>::@class::C::@getter::F
+                  staticType: String
+                staticElement: package:test/a.dart::<fragment>::@class::C::@getter::F
+                staticType: String
+              operator: . @34
+              propertyName: SimpleIdentifier
+                token: length @35
+                staticElement: dart:core::<fragment>::@class::String::@getter::length
+                staticType: int
+              staticType: int
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_length_ofClassConstField_imported_withPrefix() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class C {
+  static const String F = '';
+}
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart' as p;
+const int v = p.C.F.length;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart as p @19
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    p @19
+      reference: <testLibraryFragment>::@prefix::p
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart as p @19
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        p @19
+          reference: <testLibraryFragment>::@prefix::p
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const v @32
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            PropertyAccess
+              target: PropertyAccess
+                target: PrefixedIdentifier
+                  prefix: SimpleIdentifier
+                    token: p @36
+                    staticElement: <testLibraryFragment>::@prefix::p
+                    staticType: null
+                  period: . @37
+                  identifier: SimpleIdentifier
+                    token: C @38
+                    staticElement: package:test/a.dart::<fragment>::@class::C
+                    staticType: null
+                  staticElement: package:test/a.dart::<fragment>::@class::C
+                  staticType: null
+                operator: . @39
+                propertyName: SimpleIdentifier
+                  token: F @40
+                  staticElement: package:test/a.dart::<fragment>::@class::C::@getter::F
+                  staticType: String
+                staticType: String
+              operator: . @41
+              propertyName: SimpleIdentifier
+                token: length @42
+                staticElement: dart:core::<fragment>::@class::String::@getter::length
+                staticType: int
+              staticType: int
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_length_ofStringLiteral() async {
+    var library = await buildLibrary(r'''
+const v = 'abc'.length;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const v @6
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PropertyAccess
+              target: SimpleStringLiteral
+                literal: 'abc' @10
+              operator: . @15
+              propertyName: SimpleIdentifier
+                token: length @16
+                staticElement: dart:core::<fragment>::@class::String::@getter::length
+                staticType: int
+              staticType: int
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_length_ofTopLevelVariable() async {
+    var library = await buildLibrary(r'''
+const String S = 'abc';
+const v = S.length;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const S @13
+          reference: <testLibraryFragment>::@topLevelVariable::S
+          enclosingElement: <testLibraryFragment>
+          type: String
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            SimpleStringLiteral
+              literal: 'abc' @17
+        static const v @30
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PrefixedIdentifier
+              prefix: SimpleIdentifier
+                token: S @34
+                staticElement: <testLibraryFragment>::@getter::S
+                staticType: String
+              period: . @35
+              identifier: SimpleIdentifier
+                token: length @36
+                staticElement: dart:core::<fragment>::@class::String::@getter::length
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::String::@getter::length
+              staticType: int
+      accessors
+        synthetic static get S @-1
+          reference: <testLibraryFragment>::@getter::S
+          enclosingElement: <testLibraryFragment>
+          returnType: String
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_length_ofTopLevelVariable_imported() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+const String S = 'abc';
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart';
+const v = S.length;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const v @23
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PrefixedIdentifier
+              prefix: SimpleIdentifier
+                token: S @27
+                staticElement: package:test/a.dart::<fragment>::@getter::S
+                staticType: String
+              period: . @28
+              identifier: SimpleIdentifier
+                token: length @29
+                staticElement: dart:core::<fragment>::@class::String::@getter::length
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::String::@getter::length
+              staticType: int
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_length_ofTopLevelVariable_imported_withPrefix() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+const String S = 'abc';
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart' as p;
+const v = p.S.length;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart as p @19
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    p @19
+      reference: <testLibraryFragment>::@prefix::p
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart as p @19
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        p @19
+          reference: <testLibraryFragment>::@prefix::p
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const v @28
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PropertyAccess
+              target: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: p @32
+                  staticElement: <testLibraryFragment>::@prefix::p
+                  staticType: null
+                period: . @33
+                identifier: SimpleIdentifier
+                  token: S @34
+                  staticElement: package:test/a.dart::<fragment>::@getter::S
+                  staticType: String
+                staticElement: package:test/a.dart::<fragment>::@getter::S
+                staticType: String
+              operator: . @35
+              propertyName: SimpleIdentifier
+                token: length @36
+                staticElement: dart:core::<fragment>::@class::String::@getter::length
+                staticType: int
+              staticType: int
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_length_staticMethod() async {
+    var library = await buildLibrary(r'''
+class C {
+  static int length() => 42;
+}
+const v = C.length;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            static length @23
+              reference: <testLibraryFragment>::@class::C::@method::length
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+      topLevelVariables
+        static const v @47
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: int Function()
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PrefixedIdentifier
+              prefix: SimpleIdentifier
+                token: C @51
+                staticElement: <testLibraryFragment>::@class::C
+                staticType: null
+              period: . @52
+              identifier: SimpleIdentifier
+                token: length @53
+                staticElement: <testLibraryFragment>::@class::C::@method::length
+                staticType: int Function()
+              staticElement: <testLibraryFragment>::@class::C::@method::length
+              staticType: int Function()
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: int Function()
+''');
+  }
+
+  test_const_list_if() async {
+    var library = await buildLibrary('''
+const Object x = const <int>[if (true) 1];
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const x @13
+          reference: <testLibraryFragment>::@topLevelVariable::x
+          enclosingElement: <testLibraryFragment>
+          type: Object
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            ListLiteral
+              constKeyword: const @17
+              typeArguments: TypeArgumentList
+                leftBracket: < @23
+                arguments
+                  NamedType
+                    name: int @24
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                rightBracket: > @27
+              leftBracket: [ @28
+              elements
+                IfElement
+                  ifKeyword: if @29
+                  leftParenthesis: ( @32
+                  expression: BooleanLiteral
+                    literal: true @33
+                    staticType: bool
+                  rightParenthesis: ) @37
+                  thenElement: IntegerLiteral
+                    literal: 1 @39
+                    staticType: int
+              rightBracket: ] @40
+              staticType: List<int>
+      accessors
+        synthetic static get x @-1
+          reference: <testLibraryFragment>::@getter::x
+          enclosingElement: <testLibraryFragment>
+          returnType: Object
+''');
+  }
+
+  test_const_list_if_else() async {
+    var library = await buildLibrary('''
+const Object x = const <int>[if (true) 1 else 2];
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const x @13
+          reference: <testLibraryFragment>::@topLevelVariable::x
+          enclosingElement: <testLibraryFragment>
+          type: Object
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            ListLiteral
+              constKeyword: const @17
+              typeArguments: TypeArgumentList
+                leftBracket: < @23
+                arguments
+                  NamedType
+                    name: int @24
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                rightBracket: > @27
+              leftBracket: [ @28
+              elements
+                IfElement
+                  ifKeyword: if @29
+                  leftParenthesis: ( @32
+                  expression: BooleanLiteral
+                    literal: true @33
+                    staticType: bool
+                  rightParenthesis: ) @37
+                  thenElement: IntegerLiteral
+                    literal: 1 @39
+                    staticType: int
+                  elseKeyword: else @41
+                  elseElement: IntegerLiteral
+                    literal: 2 @46
+                    staticType: int
+              rightBracket: ] @47
+              staticType: List<int>
+      accessors
+        synthetic static get x @-1
+          reference: <testLibraryFragment>::@getter::x
+          enclosingElement: <testLibraryFragment>
+          returnType: Object
+''');
+  }
+
+  test_const_list_inferredType() async {
+    // The summary needs to contain enough information so that when the constant
+    // is resynthesized, the constant value can get the type that was computed
+    // by type inference.
+    var library = await buildLibrary('''
+const Object x = const [1];
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const x @13
+          reference: <testLibraryFragment>::@topLevelVariable::x
+          enclosingElement: <testLibraryFragment>
+          type: Object
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            ListLiteral
+              constKeyword: const @17
+              leftBracket: [ @23
+              elements
+                IntegerLiteral
+                  literal: 1 @24
+                  staticType: int
+              rightBracket: ] @25
+              staticType: List<int>
+      accessors
+        synthetic static get x @-1
+          reference: <testLibraryFragment>::@getter::x
+          enclosingElement: <testLibraryFragment>
+          returnType: Object
+''');
+  }
+
+  test_const_list_spread() async {
+    var library = await buildLibrary('''
+const Object x = const <int>[...<int>[1]];
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const x @13
+          reference: <testLibraryFragment>::@topLevelVariable::x
+          enclosingElement: <testLibraryFragment>
+          type: Object
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            ListLiteral
+              constKeyword: const @17
+              typeArguments: TypeArgumentList
+                leftBracket: < @23
+                arguments
+                  NamedType
+                    name: int @24
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                rightBracket: > @27
+              leftBracket: [ @28
+              elements
+                SpreadElement
+                  spreadOperator: ... @29
+                  expression: ListLiteral
+                    typeArguments: TypeArgumentList
+                      leftBracket: < @32
+                      arguments
+                        NamedType
+                          name: int @33
+                          element: dart:core::<fragment>::@class::int
+                          type: int
+                      rightBracket: > @36
+                    leftBracket: [ @37
+                    elements
+                      IntegerLiteral
+                        literal: 1 @38
+                        staticType: int
+                    rightBracket: ] @39
+                    staticType: List<int>
+              rightBracket: ] @40
+              staticType: List<int>
+      accessors
+        synthetic static get x @-1
+          reference: <testLibraryFragment>::@getter::x
+          enclosingElement: <testLibraryFragment>
+          returnType: Object
+''');
+  }
+
+  test_const_list_spread_null_aware() async {
+    var library = await buildLibrary('''
+const Object x = const <int>[...?<int>[1]];
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const x @13
+          reference: <testLibraryFragment>::@topLevelVariable::x
+          enclosingElement: <testLibraryFragment>
+          type: Object
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            ListLiteral
+              constKeyword: const @17
+              typeArguments: TypeArgumentList
+                leftBracket: < @23
+                arguments
+                  NamedType
+                    name: int @24
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                rightBracket: > @27
+              leftBracket: [ @28
+              elements
+                SpreadElement
+                  spreadOperator: ...? @29
+                  expression: ListLiteral
+                    typeArguments: TypeArgumentList
+                      leftBracket: < @33
+                      arguments
+                        NamedType
+                          name: int @34
+                          element: dart:core::<fragment>::@class::int
+                          type: int
+                      rightBracket: > @37
+                    leftBracket: [ @38
+                    elements
+                      IntegerLiteral
+                        literal: 1 @39
+                        staticType: int
+                    rightBracket: ] @40
+                    staticType: List<int>
+              rightBracket: ] @41
+              staticType: List<int>
+      accessors
+        synthetic static get x @-1
+          reference: <testLibraryFragment>::@getter::x
+          enclosingElement: <testLibraryFragment>
+          returnType: Object
+''');
+  }
+
+  test_const_map_if() async {
+    var library = await buildLibrary('''
+const Object x = const <int, int>{if (true) 1: 2};
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const x @13
+          reference: <testLibraryFragment>::@topLevelVariable::x
+          enclosingElement: <testLibraryFragment>
+          type: Object
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            SetOrMapLiteral
+              constKeyword: const @17
+              typeArguments: TypeArgumentList
+                leftBracket: < @23
+                arguments
+                  NamedType
+                    name: int @24
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                  NamedType
+                    name: int @29
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                rightBracket: > @32
+              leftBracket: { @33
+              elements
+                IfElement
+                  ifKeyword: if @34
+                  leftParenthesis: ( @37
+                  expression: BooleanLiteral
+                    literal: true @38
+                    staticType: bool
+                  rightParenthesis: ) @42
+                  thenElement: MapLiteralEntry
+                    key: IntegerLiteral
+                      literal: 1 @44
+                      staticType: int
+                    separator: : @45
+                    value: IntegerLiteral
+                      literal: 2 @47
+                      staticType: int
+              rightBracket: } @48
+              isMap: true
+              staticType: Map<int, int>
+      accessors
+        synthetic static get x @-1
+          reference: <testLibraryFragment>::@getter::x
+          enclosingElement: <testLibraryFragment>
+          returnType: Object
+''');
+  }
+
+  test_const_map_inferredType() async {
+    // The summary needs to contain enough information so that when the constant
+    // is resynthesized, the constant value can get the type that was computed
+    // by type inference.
+    var library = await buildLibrary('''
+const Object x = const {1: 1.0};
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const x @13
+          reference: <testLibraryFragment>::@topLevelVariable::x
+          enclosingElement: <testLibraryFragment>
+          type: Object
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            SetOrMapLiteral
+              constKeyword: const @17
+              leftBracket: { @23
+              elements
+                MapLiteralEntry
+                  key: IntegerLiteral
+                    literal: 1 @24
+                    staticType: int
+                  separator: : @25
+                  value: DoubleLiteral
+                    literal: 1.0 @27
+                    staticType: double
+              rightBracket: } @30
+              isMap: true
+              staticType: Map<int, double>
+      accessors
+        synthetic static get x @-1
+          reference: <testLibraryFragment>::@getter::x
+          enclosingElement: <testLibraryFragment>
+          returnType: Object
+''');
+  }
+
+  test_const_map_spread() async {
+    var library = await buildLibrary('''
+const Object x = const <int, int>{...<int, int>{1: 2}};
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const x @13
+          reference: <testLibraryFragment>::@topLevelVariable::x
+          enclosingElement: <testLibraryFragment>
+          type: Object
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            SetOrMapLiteral
+              constKeyword: const @17
+              typeArguments: TypeArgumentList
+                leftBracket: < @23
+                arguments
+                  NamedType
+                    name: int @24
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                  NamedType
+                    name: int @29
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                rightBracket: > @32
+              leftBracket: { @33
+              elements
+                SpreadElement
+                  spreadOperator: ... @34
+                  expression: SetOrMapLiteral
+                    typeArguments: TypeArgumentList
+                      leftBracket: < @37
+                      arguments
+                        NamedType
+                          name: int @38
+                          element: dart:core::<fragment>::@class::int
+                          type: int
+                        NamedType
+                          name: int @43
+                          element: dart:core::<fragment>::@class::int
+                          type: int
+                      rightBracket: > @46
+                    leftBracket: { @47
+                    elements
+                      MapLiteralEntry
+                        key: IntegerLiteral
+                          literal: 1 @48
+                          staticType: int
+                        separator: : @49
+                        value: IntegerLiteral
+                          literal: 2 @51
+                          staticType: int
+                    rightBracket: } @52
+                    isMap: true
+                    staticType: Map<int, int>
+              rightBracket: } @53
+              isMap: true
+              staticType: Map<int, int>
+      accessors
+        synthetic static get x @-1
+          reference: <testLibraryFragment>::@getter::x
+          enclosingElement: <testLibraryFragment>
+          returnType: Object
+''');
+  }
+
+  test_const_map_spread_null_aware() async {
+    var library = await buildLibrary('''
+const Object x = const <int, int>{...?<int, int>{1: 2}};
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const x @13
+          reference: <testLibraryFragment>::@topLevelVariable::x
+          enclosingElement: <testLibraryFragment>
+          type: Object
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            SetOrMapLiteral
+              constKeyword: const @17
+              typeArguments: TypeArgumentList
+                leftBracket: < @23
+                arguments
+                  NamedType
+                    name: int @24
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                  NamedType
+                    name: int @29
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                rightBracket: > @32
+              leftBracket: { @33
+              elements
+                SpreadElement
+                  spreadOperator: ...? @34
+                  expression: SetOrMapLiteral
+                    typeArguments: TypeArgumentList
+                      leftBracket: < @38
+                      arguments
+                        NamedType
+                          name: int @39
+                          element: dart:core::<fragment>::@class::int
+                          type: int
+                        NamedType
+                          name: int @44
+                          element: dart:core::<fragment>::@class::int
+                          type: int
+                      rightBracket: > @47
+                    leftBracket: { @48
+                    elements
+                      MapLiteralEntry
+                        key: IntegerLiteral
+                          literal: 1 @49
+                          staticType: int
+                        separator: : @50
+                        value: IntegerLiteral
+                          literal: 2 @52
+                          staticType: int
+                    rightBracket: } @53
+                    isMap: true
+                    staticType: Map<int, int>
+              rightBracket: } @54
+              isMap: true
+              staticType: Map<int, int>
+      accessors
+        synthetic static get x @-1
+          reference: <testLibraryFragment>::@getter::x
+          enclosingElement: <testLibraryFragment>
+          returnType: Object
+''');
+  }
+
+  test_const_methodInvocation() async {
+    var library = await buildLibrary(r'''
+T f<T>(T a) => a;
+const b = f<int>(0);
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const b @24
+          reference: <testLibraryFragment>::@topLevelVariable::b
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            MethodInvocation
+              methodName: SimpleIdentifier
+                token: f @28
+                staticElement: <testLibraryFragment>::@function::f
+                staticType: T Function<T>(T)
+              typeArguments: TypeArgumentList
+                leftBracket: < @29
+                arguments
+                  NamedType
+                    name: int @30
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                rightBracket: > @33
+              argumentList: ArgumentList
+                leftParenthesis: ( @34
+                arguments
+                  IntegerLiteral
+                    literal: 0 @35
+                    staticType: int
+                rightParenthesis: ) @36
+              staticInvokeType: int Function(int)
+              staticType: int
+              typeArgumentTypes
+                int
+      accessors
+        synthetic static get b @-1
+          reference: <testLibraryFragment>::@getter::b
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+      functions
+        f @2
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @4
+              defaultType: dynamic
+          parameters
+            requiredPositional a @9
+              type: T
+          returnType: T
+''');
+  }
+
+  test_const_parameterDefaultValue_initializingFormal_functionTyped() async {
+    var library = await buildLibrary(r'''
+class C {
+  final x;
+  const C({this.x: foo});
+}
+int foo() => 42;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            final x @18
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            const @29
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                optionalNamed default final this.x @37
+                  reference: <testLibraryFragment>::@class::C::@constructor::new::@parameter::x
+                  type: dynamic
+                  constantInitializer
+                    SimpleIdentifier
+                      token: foo @40
+                      staticElement: <testLibraryFragment>::@function::foo
+                      staticType: int Function()
+                  field: <testLibraryFragment>::@class::C::@field::x
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+      functions
+        foo @53
+          reference: <testLibraryFragment>::@function::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_parameterDefaultValue_initializingFormal_named() async {
+    var library = await buildLibrary(r'''
+class C {
+  final x;
+  const C({this.x: 1 + 2});
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            final x @18
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            const @29
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                optionalNamed default final this.x @37
+                  reference: <testLibraryFragment>::@class::C::@constructor::new::@parameter::x
+                  type: dynamic
+                  constantInitializer
+                    BinaryExpression
+                      leftOperand: IntegerLiteral
+                        literal: 1 @40
+                        staticType: int
+                      operator: + @42
+                      rightOperand: IntegerLiteral
+                        literal: 2 @44
+                        staticType: int
+                      staticElement: dart:core::<fragment>::@class::num::@method::+
+                      staticInvokeType: num Function(num)
+                      staticType: int
+                  field: <testLibraryFragment>::@class::C::@field::x
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+''');
+  }
+
+  test_const_parameterDefaultValue_initializingFormal_positional() async {
+    var library = await buildLibrary(r'''
+class C {
+  final x;
+  const C([this.x = 1 + 2]);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            final x @18
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            const @29
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                optionalPositional default final this.x @37
+                  type: dynamic
+                  constantInitializer
+                    BinaryExpression
+                      leftOperand: IntegerLiteral
+                        literal: 1 @41
+                        staticType: int
+                      operator: + @43
+                      rightOperand: IntegerLiteral
+                        literal: 2 @45
+                        staticType: int
+                      staticElement: dart:core::<fragment>::@class::num::@method::+
+                      staticInvokeType: num Function(num)
+                      staticType: int
+                  field: <testLibraryFragment>::@class::C::@field::x
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+''');
+  }
+
+  test_const_parameterDefaultValue_normal() async {
+    var library = await buildLibrary(r'''
+class C {
+  const C.positional([p = 1 + 2]);
+  const C.named({p: 1 + 2});
+  void methodPositional([p = 1 + 2]) {}
+  void methodPositionalWithoutDefault([p]) {}
+  void methodNamed({p: 1 + 2}) {}
+  void methodNamedWithoutDefault({p}) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const positional @20
+              reference: <testLibraryFragment>::@class::C::@constructor::positional
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 19
+              nameEnd: 30
+              parameters
+                optionalPositional default p @32
+                  type: dynamic
+                  constantInitializer
+                    BinaryExpression
+                      leftOperand: IntegerLiteral
+                        literal: 1 @36
+                        staticType: int
+                      operator: + @38
+                      rightOperand: IntegerLiteral
+                        literal: 2 @40
+                        staticType: int
+                      staticElement: dart:core::<fragment>::@class::num::@method::+
+                      staticInvokeType: num Function(num)
+                      staticType: int
+            const named @55
+              reference: <testLibraryFragment>::@class::C::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 54
+              nameEnd: 60
+              parameters
+                optionalNamed default p @62
+                  reference: <testLibraryFragment>::@class::C::@constructor::named::@parameter::p
+                  type: dynamic
+                  constantInitializer
+                    BinaryExpression
+                      leftOperand: IntegerLiteral
+                        literal: 1 @65
+                        staticType: int
+                      operator: + @67
+                      rightOperand: IntegerLiteral
+                        literal: 2 @69
+                        staticType: int
+                      staticElement: dart:core::<fragment>::@class::num::@method::+
+                      staticInvokeType: num Function(num)
+                      staticType: int
+          methods
+            methodPositional @81
+              reference: <testLibraryFragment>::@class::C::@method::methodPositional
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                optionalPositional default p @99
+                  type: dynamic
+                  constantInitializer
+                    BinaryExpression
+                      leftOperand: IntegerLiteral
+                        literal: 1 @103
+                        staticType: int
+                      operator: + @105
+                      rightOperand: IntegerLiteral
+                        literal: 2 @107
+                        staticType: int
+                      staticElement: dart:core::<fragment>::@class::num::@method::+
+                      staticInvokeType: num Function(num)
+                      staticType: int
+              returnType: void
+            methodPositionalWithoutDefault @121
+              reference: <testLibraryFragment>::@class::C::@method::methodPositionalWithoutDefault
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                optionalPositional default p @153
+                  type: dynamic
+              returnType: void
+            methodNamed @167
+              reference: <testLibraryFragment>::@class::C::@method::methodNamed
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                optionalNamed default p @180
+                  reference: <testLibraryFragment>::@class::C::@method::methodNamed::@parameter::p
+                  type: dynamic
+                  constantInitializer
+                    BinaryExpression
+                      leftOperand: IntegerLiteral
+                        literal: 1 @183
+                        staticType: int
+                      operator: + @185
+                      rightOperand: IntegerLiteral
+                        literal: 2 @187
+                        staticType: int
+                      staticElement: dart:core::<fragment>::@class::num::@method::+
+                      staticInvokeType: num Function(num)
+                      staticType: int
+              returnType: void
+            methodNamedWithoutDefault @201
+              reference: <testLibraryFragment>::@class::C::@method::methodNamedWithoutDefault
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                optionalNamed default p @228
+                  reference: <testLibraryFragment>::@class::C::@method::methodNamedWithoutDefault::@parameter::p
+                  type: dynamic
+              returnType: void
+''');
+  }
+
+  test_const_postfixExpression_increment() async {
+    var library = await buildLibrary(r'''
+const a = 0;
+const b = a++;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @10
+              staticType: int
+        static const b @19
+          reference: <testLibraryFragment>::@topLevelVariable::b
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PostfixExpression
+              operand: SimpleIdentifier
+                token: a @23
+                staticElement: <null>
+                staticType: null
+              operator: ++ @24
+              readElement: <testLibraryFragment>::@getter::a
+              readType: int
+              writeElement: <testLibraryFragment>::@getter::a
+              writeType: InvalidType
+              staticElement: dart:core::<fragment>::@class::num::@method::+
+              staticType: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get b @-1
+          reference: <testLibraryFragment>::@getter::b
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_postfixExpression_nullCheck() async {
+    var library = await buildLibrary(r'''
+const int? a = 0;
+const b = a!;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @11
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int?
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @15
+              staticType: int
+        static const b @24
+          reference: <testLibraryFragment>::@topLevelVariable::b
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PostfixExpression
+              operand: SimpleIdentifier
+                token: a @28
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: int?
+              operator: ! @29
+              staticElement: <null>
+              staticType: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int?
+        synthetic static get b @-1
+          reference: <testLibraryFragment>::@getter::b
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_prefixExpression_class_unaryMinus() async {
+    var library = await buildLibrary(r'''
+const a = 0;
+const b = -a;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @10
+              staticType: int
+        static const b @19
+          reference: <testLibraryFragment>::@topLevelVariable::b
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PrefixExpression
+              operator: - @23
+              operand: SimpleIdentifier
+                token: a @24
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::int::@method::unary-
+              staticType: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get b @-1
+          reference: <testLibraryFragment>::@getter::b
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_prefixExpression_extension_unaryMinus() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+extension E on Object {
+  int operator -() => 0;
+}
+const a = const Object();
+''');
+    var library = await buildLibrary('''
+import 'a.dart';
+const b = -a;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const b @23
+          reference: <testLibraryFragment>::@topLevelVariable::b
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PrefixExpression
+              operator: - @27
+              operand: SimpleIdentifier
+                token: a @28
+                staticElement: package:test/a.dart::<fragment>::@getter::a
+                staticType: Object
+              staticElement: package:test/a.dart::<fragment>::@extension::E::@method::unary-
+              staticType: int
+      accessors
+        synthetic static get b @-1
+          reference: <testLibraryFragment>::@getter::b
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_prefixExpression_increment() async {
+    var library = await buildLibrary(r'''
+const a = 0;
+const b = ++a;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @10
+              staticType: int
+        static const b @19
+          reference: <testLibraryFragment>::@topLevelVariable::b
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PrefixExpression
+              operator: ++ @23
+              operand: SimpleIdentifier
+                token: a @25
+                staticElement: <null>
+                staticType: null
+              readElement: <testLibraryFragment>::@getter::a
+              readType: int
+              writeElement: <testLibraryFragment>::@getter::a
+              writeType: InvalidType
+              staticElement: dart:core::<fragment>::@class::num::@method::+
+              staticType: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get b @-1
+          reference: <testLibraryFragment>::@getter::b
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  void test_const_recordLiteral() async {
+    var library = await buildLibrary('''
+const a = 0;
+const b = (a, a: a);
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @10
+              staticType: int
+        static const b @19
+          reference: <testLibraryFragment>::@topLevelVariable::b
+          enclosingElement: <testLibraryFragment>
+          type: (int, {int a})
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            RecordLiteral
+              leftParenthesis: ( @23
+              fields
+                SimpleIdentifier
+                  token: a @24
+                  staticElement: <testLibraryFragment>::@getter::a
+                  staticType: int
+                NamedExpression
+                  name: Label
+                    label: SimpleIdentifier
+                      token: a @27
+                      staticElement: <null>
+                      staticType: null
+                    colon: : @28
+                  expression: SimpleIdentifier
+                    token: a @30
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: int
+              rightParenthesis: ) @31
+              staticType: (int, {int a})
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get b @-1
+          reference: <testLibraryFragment>::@getter::b
+          enclosingElement: <testLibraryFragment>
+          returnType: (int, {int a})
+''');
+  }
+
+  void test_const_recordLiteral_explicitConst() async {
+    var library = await buildLibrary('''
+const a = 0;
+const b = const (a, a: a);
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @10
+              staticType: int
+        static const b @19
+          reference: <testLibraryFragment>::@topLevelVariable::b
+          enclosingElement: <testLibraryFragment>
+          type: (int, {int a})
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            RecordLiteral
+              constKeyword: const @23
+              leftParenthesis: ( @29
+              fields
+                SimpleIdentifier
+                  token: a @30
+                  staticElement: <testLibraryFragment>::@getter::a
+                  staticType: int
+                NamedExpression
+                  name: Label
+                    label: SimpleIdentifier
+                      token: a @33
+                      staticElement: <null>
+                      staticType: null
+                    colon: : @34
+                  expression: SimpleIdentifier
+                    token: a @36
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: int
+              rightParenthesis: ) @37
+              staticType: (int, {int a})
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get b @-1
+          reference: <testLibraryFragment>::@getter::b
+          enclosingElement: <testLibraryFragment>
+          returnType: (int, {int a})
+''');
+  }
+
+  test_const_reference_staticField() async {
+    var library = await buildLibrary(r'''
+class C {
+  static const int F = 42;
+}
+const V = C.F;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            static const F @29
+              reference: <testLibraryFragment>::@class::C::@field::F
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: true
+              constantInitializer
+                IntegerLiteral
+                  literal: 42 @33
+                  staticType: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic static get F @-1
+              reference: <testLibraryFragment>::@class::C::@getter::F
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+      topLevelVariables
+        static const V @45
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PrefixedIdentifier
+              prefix: SimpleIdentifier
+                token: C @49
+                staticElement: <testLibraryFragment>::@class::C
+                staticType: null
+              period: . @50
+              identifier: SimpleIdentifier
+                token: F @51
+                staticElement: <testLibraryFragment>::@class::C::@getter::F
+                staticType: int
+              staticElement: <testLibraryFragment>::@class::C::@getter::F
+              staticType: int
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_reference_staticField_imported() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class C {
+  static const int F = 42;
+}
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart';
+const V = C.F;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const V @23
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PrefixedIdentifier
+              prefix: SimpleIdentifier
+                token: C @27
+                staticElement: package:test/a.dart::<fragment>::@class::C
+                staticType: null
+              period: . @28
+              identifier: SimpleIdentifier
+                token: F @29
+                staticElement: package:test/a.dart::<fragment>::@class::C::@getter::F
+                staticType: int
+              staticElement: package:test/a.dart::<fragment>::@class::C::@getter::F
+              staticType: int
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_reference_staticField_imported_withPrefix() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class C {
+  static const int F = 42;
+}
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart' as p;
+const V = p.C.F;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart as p @19
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    p @19
+      reference: <testLibraryFragment>::@prefix::p
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart as p @19
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        p @19
+          reference: <testLibraryFragment>::@prefix::p
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const V @28
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PropertyAccess
+              target: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: p @32
+                  staticElement: <testLibraryFragment>::@prefix::p
+                  staticType: null
+                period: . @33
+                identifier: SimpleIdentifier
+                  token: C @34
+                  staticElement: package:test/a.dart::<fragment>::@class::C
+                  staticType: null
+                staticElement: package:test/a.dart::<fragment>::@class::C
+                staticType: null
+              operator: . @35
+              propertyName: SimpleIdentifier
+                token: F @36
+                staticElement: package:test/a.dart::<fragment>::@class::C::@getter::F
+                staticType: int
+              staticType: int
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_reference_staticMethod() async {
+    var library = await buildLibrary(r'''
+class C {
+  static int m(int a, String b) => 42;
+}
+const V = C.m;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            static m @23
+              reference: <testLibraryFragment>::@class::C::@method::m
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional a @29
+                  type: int
+                requiredPositional b @39
+                  type: String
+              returnType: int
+      topLevelVariables
+        static const V @57
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: int Function(int, String)
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PrefixedIdentifier
+              prefix: SimpleIdentifier
+                token: C @61
+                staticElement: <testLibraryFragment>::@class::C
+                staticType: null
+              period: . @62
+              identifier: SimpleIdentifier
+                token: m @63
+                staticElement: <testLibraryFragment>::@class::C::@method::m
+                staticType: int Function(int, String)
+              staticElement: <testLibraryFragment>::@class::C::@method::m
+              staticType: int Function(int, String)
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: int Function(int, String)
+''');
+  }
+
+  test_const_reference_staticMethod_imported() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class C {
+  static int m(int a, String b) => 42;
+}
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart';
+const V = C.m;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const V @23
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: int Function(int, String)
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PrefixedIdentifier
+              prefix: SimpleIdentifier
+                token: C @27
+                staticElement: package:test/a.dart::<fragment>::@class::C
+                staticType: null
+              period: . @28
+              identifier: SimpleIdentifier
+                token: m @29
+                staticElement: package:test/a.dart::<fragment>::@class::C::@method::m
+                staticType: int Function(int, String)
+              staticElement: package:test/a.dart::<fragment>::@class::C::@method::m
+              staticType: int Function(int, String)
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: int Function(int, String)
+''');
+  }
+
+  test_const_reference_staticMethod_imported_withPrefix() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class C {
+  static int m(int a, String b) => 42;
+}
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart' as p;
+const V = p.C.m;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart as p @19
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    p @19
+      reference: <testLibraryFragment>::@prefix::p
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart as p @19
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        p @19
+          reference: <testLibraryFragment>::@prefix::p
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const V @28
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: int Function(int, String)
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PropertyAccess
+              target: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: p @32
+                  staticElement: <testLibraryFragment>::@prefix::p
+                  staticType: null
+                period: . @33
+                identifier: SimpleIdentifier
+                  token: C @34
+                  staticElement: package:test/a.dart::<fragment>::@class::C
+                  staticType: null
+                staticElement: package:test/a.dart::<fragment>::@class::C
+                staticType: null
+              operator: . @35
+              propertyName: SimpleIdentifier
+                token: m @36
+                staticElement: package:test/a.dart::<fragment>::@class::C::@method::m
+                staticType: int Function(int, String)
+              staticType: int Function(int, String)
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: int Function(int, String)
+''');
+  }
+
+  test_const_reference_staticMethod_ofExtension() async {
+    var library = await buildLibrary('''
+class A {}
+extension E on A {
+  static void f() {}
+}
+const x = E.f;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+      extensions
+        E @21
+          reference: <testLibraryFragment>::@extension::E
+          enclosingElement: <testLibraryFragment>
+          extendedType: A
+          methods
+            static f @44
+              reference: <testLibraryFragment>::@extension::E::@method::f
+              enclosingElement: <testLibraryFragment>::@extension::E
+              returnType: void
+      topLevelVariables
+        static const x @59
+          reference: <testLibraryFragment>::@topLevelVariable::x
+          enclosingElement: <testLibraryFragment>
+          type: void Function()
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PrefixedIdentifier
+              prefix: SimpleIdentifier
+                token: E @63
+                staticElement: <testLibraryFragment>::@extension::E
+                staticType: null
+              period: . @64
+              identifier: SimpleIdentifier
+                token: f @65
+                staticElement: <testLibraryFragment>::@extension::E::@method::f
+                staticType: void Function()
+              staticElement: <testLibraryFragment>::@extension::E::@method::f
+              staticType: void Function()
+      accessors
+        synthetic static get x @-1
+          reference: <testLibraryFragment>::@getter::x
+          enclosingElement: <testLibraryFragment>
+          returnType: void Function()
+''');
+  }
+
+  test_const_reference_topLevelFunction() async {
+    var library = await buildLibrary(r'''
+foo() {}
+const V = foo;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const V @15
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: dynamic Function()
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SimpleIdentifier
+              token: foo @19
+              staticElement: <testLibraryFragment>::@function::foo
+              staticType: dynamic Function()
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic Function()
+      functions
+        foo @0
+          reference: <testLibraryFragment>::@function::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_const_reference_topLevelFunction_generic() async {
+    var library = await buildLibrary(r'''
+R foo<P, R>(P p) {}
+const V = foo;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const V @26
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: R Function<P, R>(P)
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SimpleIdentifier
+              token: foo @30
+              staticElement: <testLibraryFragment>::@function::foo
+              staticType: R Function<P, R>(P)
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: R Function<P, R>(P)
+      functions
+        foo @2
+          reference: <testLibraryFragment>::@function::foo
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant P @6
+              defaultType: dynamic
+            covariant R @9
+              defaultType: dynamic
+          parameters
+            requiredPositional p @14
+              type: P
+          returnType: R
+''');
+  }
+
+  test_const_reference_topLevelFunction_imported() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+foo() {}
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart';
+const V = foo;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const V @23
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: dynamic Function()
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SimpleIdentifier
+              token: foo @27
+              staticElement: package:test/a.dart::<fragment>::@function::foo
+              staticType: dynamic Function()
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic Function()
+''');
+  }
+
+  test_const_reference_topLevelFunction_imported_withPrefix() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+foo() {}
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart' as p;
+const V = p.foo;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart as p @19
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    p @19
+      reference: <testLibraryFragment>::@prefix::p
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart as p @19
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        p @19
+          reference: <testLibraryFragment>::@prefix::p
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const V @28
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: dynamic Function()
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PrefixedIdentifier
+              prefix: SimpleIdentifier
+                token: p @32
+                staticElement: <testLibraryFragment>::@prefix::p
+                staticType: null
+              period: . @33
+              identifier: SimpleIdentifier
+                token: foo @34
+                staticElement: package:test/a.dart::<fragment>::@function::foo
+                staticType: dynamic Function()
+              staticElement: package:test/a.dart::<fragment>::@function::foo
+              staticType: dynamic Function()
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic Function()
+''');
+  }
+
+  test_const_reference_topLevelVariable() async {
+    var library = await buildLibrary(r'''
+const A = 1;
+const B = A + 2;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const A @6
+          reference: <testLibraryFragment>::@topLevelVariable::A
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 1 @10
+              staticType: int
+        static const B @19
+          reference: <testLibraryFragment>::@topLevelVariable::B
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: SimpleIdentifier
+                token: A @23
+                staticElement: <testLibraryFragment>::@getter::A
+                staticType: int
+              operator: + @25
+              rightOperand: IntegerLiteral
+                literal: 2 @27
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::num::@method::+
+              staticInvokeType: num Function(num)
+              staticType: int
+      accessors
+        synthetic static get A @-1
+          reference: <testLibraryFragment>::@getter::A
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get B @-1
+          reference: <testLibraryFragment>::@getter::B
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_reference_topLevelVariable_imported() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+const A = 1;
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart';
+const B = A + 2;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const B @23
+          reference: <testLibraryFragment>::@topLevelVariable::B
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: SimpleIdentifier
+                token: A @27
+                staticElement: package:test/a.dart::<fragment>::@getter::A
+                staticType: int
+              operator: + @29
+              rightOperand: IntegerLiteral
+                literal: 2 @31
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::num::@method::+
+              staticInvokeType: num Function(num)
+              staticType: int
+      accessors
+        synthetic static get B @-1
+          reference: <testLibraryFragment>::@getter::B
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_reference_topLevelVariable_imported_withPrefix() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+const A = 1;
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart' as p;
+const B = p.A + 2;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart as p @19
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    p @19
+      reference: <testLibraryFragment>::@prefix::p
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart as p @19
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        p @19
+          reference: <testLibraryFragment>::@prefix::p
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const B @28
+          reference: <testLibraryFragment>::@topLevelVariable::B
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: p @32
+                  staticElement: <testLibraryFragment>::@prefix::p
+                  staticType: null
+                period: . @33
+                identifier: SimpleIdentifier
+                  token: A @34
+                  staticElement: package:test/a.dart::<fragment>::@getter::A
+                  staticType: int
+                staticElement: package:test/a.dart::<fragment>::@getter::A
+                staticType: int
+              operator: + @36
+              rightOperand: IntegerLiteral
+                literal: 2 @38
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::num::@method::+
+              staticInvokeType: num Function(num)
+              staticType: int
+      accessors
+        synthetic static get B @-1
+          reference: <testLibraryFragment>::@getter::B
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_reference_type() async {
+    var library = await buildLibrary(r'''
+class C {}
+class D<T> {}
+enum E {a, b, c}
+typedef F(int a, String b);
+const vDynamic = dynamic;
+const vNull = Null;
+const vObject = Object;
+const vClass = C;
+const vGenericClass = D;
+const vEnum = E;
+const vFunctionTypeAlias = F;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+        class D @17
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @19
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+      enums
+        enum E @30
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant a @33
+              reference: <testLibraryFragment>::@enum::E::@field::a
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            static const enumConstant b @36
+              reference: <testLibraryFragment>::@enum::E::@field::b
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            static const enumConstant c @39
+              reference: <testLibraryFragment>::@enum::E::@field::c
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: a @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::a
+                      staticType: E
+                    SimpleIdentifier
+                      token: b @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::b
+                      staticType: E
+                    SimpleIdentifier
+                      token: c @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::c
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get a @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::a
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get b @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::b
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get c @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::c
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+      typeAliases
+        functionTypeAliasBased F @50
+          reference: <testLibraryFragment>::@typeAlias::F
+          aliasedType: dynamic Function(int, String)
+          aliasedElement: GenericFunctionTypeElement
+            parameters
+              requiredPositional a @56
+                type: int
+              requiredPositional b @66
+                type: String
+            returnType: dynamic
+      topLevelVariables
+        static const vDynamic @76
+          reference: <testLibraryFragment>::@topLevelVariable::vDynamic
+          enclosingElement: <testLibraryFragment>
+          type: Type
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SimpleIdentifier
+              token: dynamic @87
+              staticElement: dynamic@-1
+              staticType: Type
+        static const vNull @102
+          reference: <testLibraryFragment>::@topLevelVariable::vNull
+          enclosingElement: <testLibraryFragment>
+          type: Type
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SimpleIdentifier
+              token: Null @110
+              staticElement: dart:core::<fragment>::@class::Null
+              staticType: Type
+        static const vObject @122
+          reference: <testLibraryFragment>::@topLevelVariable::vObject
+          enclosingElement: <testLibraryFragment>
+          type: Type
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SimpleIdentifier
+              token: Object @132
+              staticElement: dart:core::<fragment>::@class::Object
+              staticType: Type
+        static const vClass @146
+          reference: <testLibraryFragment>::@topLevelVariable::vClass
+          enclosingElement: <testLibraryFragment>
+          type: Type
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SimpleIdentifier
+              token: C @155
+              staticElement: <testLibraryFragment>::@class::C
+              staticType: Type
+        static const vGenericClass @164
+          reference: <testLibraryFragment>::@topLevelVariable::vGenericClass
+          enclosingElement: <testLibraryFragment>
+          type: Type
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SimpleIdentifier
+              token: D @180
+              staticElement: <testLibraryFragment>::@class::D
+              staticType: Type
+        static const vEnum @189
+          reference: <testLibraryFragment>::@topLevelVariable::vEnum
+          enclosingElement: <testLibraryFragment>
+          type: Type
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SimpleIdentifier
+              token: E @197
+              staticElement: <testLibraryFragment>::@enum::E
+              staticType: Type
+        static const vFunctionTypeAlias @206
+          reference: <testLibraryFragment>::@topLevelVariable::vFunctionTypeAlias
+          enclosingElement: <testLibraryFragment>
+          type: Type
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SimpleIdentifier
+              token: F @227
+              staticElement: <testLibraryFragment>::@typeAlias::F
+              staticType: Type
+      accessors
+        synthetic static get vDynamic @-1
+          reference: <testLibraryFragment>::@getter::vDynamic
+          enclosingElement: <testLibraryFragment>
+          returnType: Type
+        synthetic static get vNull @-1
+          reference: <testLibraryFragment>::@getter::vNull
+          enclosingElement: <testLibraryFragment>
+          returnType: Type
+        synthetic static get vObject @-1
+          reference: <testLibraryFragment>::@getter::vObject
+          enclosingElement: <testLibraryFragment>
+          returnType: Type
+        synthetic static get vClass @-1
+          reference: <testLibraryFragment>::@getter::vClass
+          enclosingElement: <testLibraryFragment>
+          returnType: Type
+        synthetic static get vGenericClass @-1
+          reference: <testLibraryFragment>::@getter::vGenericClass
+          enclosingElement: <testLibraryFragment>
+          returnType: Type
+        synthetic static get vEnum @-1
+          reference: <testLibraryFragment>::@getter::vEnum
+          enclosingElement: <testLibraryFragment>
+          returnType: Type
+        synthetic static get vFunctionTypeAlias @-1
+          reference: <testLibraryFragment>::@getter::vFunctionTypeAlias
+          enclosingElement: <testLibraryFragment>
+          returnType: Type
+''');
+  }
+
+  test_const_reference_type_functionType() async {
+    var library = await buildLibrary(r'''
+typedef F();
+class C {
+  final f = <F>[];
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @19
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            final f @31
+              reference: <testLibraryFragment>::@class::C::@field::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: List<dynamic Function()>
+              shouldUseTypeForInitializerInference: false
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get f @-1
+              reference: <testLibraryFragment>::@class::C::@getter::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: List<dynamic Function()>
+      typeAliases
+        functionTypeAliasBased F @8
+          reference: <testLibraryFragment>::@typeAlias::F
+          aliasedType: dynamic Function()
+          aliasedElement: GenericFunctionTypeElement
+            returnType: dynamic
+''');
+  }
+
+  test_const_reference_type_imported() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class C {}
+enum E {a, b, c}
+typedef F(int a, String b);
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart';
+const vClass = C;
+const vEnum = E;
+const vFunctionTypeAlias = F;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const vClass @23
+          reference: <testLibraryFragment>::@topLevelVariable::vClass
+          enclosingElement: <testLibraryFragment>
+          type: Type
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SimpleIdentifier
+              token: C @32
+              staticElement: package:test/a.dart::<fragment>::@class::C
+              staticType: Type
+        static const vEnum @41
+          reference: <testLibraryFragment>::@topLevelVariable::vEnum
+          enclosingElement: <testLibraryFragment>
+          type: Type
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SimpleIdentifier
+              token: E @49
+              staticElement: package:test/a.dart::<fragment>::@enum::E
+              staticType: Type
+        static const vFunctionTypeAlias @58
+          reference: <testLibraryFragment>::@topLevelVariable::vFunctionTypeAlias
+          enclosingElement: <testLibraryFragment>
+          type: Type
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SimpleIdentifier
+              token: F @79
+              staticElement: package:test/a.dart::<fragment>::@typeAlias::F
+              staticType: Type
+      accessors
+        synthetic static get vClass @-1
+          reference: <testLibraryFragment>::@getter::vClass
+          enclosingElement: <testLibraryFragment>
+          returnType: Type
+        synthetic static get vEnum @-1
+          reference: <testLibraryFragment>::@getter::vEnum
+          enclosingElement: <testLibraryFragment>
+          returnType: Type
+        synthetic static get vFunctionTypeAlias @-1
+          reference: <testLibraryFragment>::@getter::vFunctionTypeAlias
+          enclosingElement: <testLibraryFragment>
+          returnType: Type
+''');
+  }
+
+  test_const_reference_type_imported_withPrefix() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class C {}
+enum E {a, b, c}
+typedef F(int a, String b);
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart' as p;
+const vClass = p.C;
+const vEnum = p.E;
+const vFunctionTypeAlias = p.F;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart as p @19
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    p @19
+      reference: <testLibraryFragment>::@prefix::p
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart as p @19
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        p @19
+          reference: <testLibraryFragment>::@prefix::p
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const vClass @28
+          reference: <testLibraryFragment>::@topLevelVariable::vClass
+          enclosingElement: <testLibraryFragment>
+          type: Type
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PrefixedIdentifier
+              prefix: SimpleIdentifier
+                token: p @37
+                staticElement: <testLibraryFragment>::@prefix::p
+                staticType: null
+              period: . @38
+              identifier: SimpleIdentifier
+                token: C @39
+                staticElement: package:test/a.dart::<fragment>::@class::C
+                staticType: Type
+              staticElement: package:test/a.dart::<fragment>::@class::C
+              staticType: Type
+        static const vEnum @48
+          reference: <testLibraryFragment>::@topLevelVariable::vEnum
+          enclosingElement: <testLibraryFragment>
+          type: Type
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PrefixedIdentifier
+              prefix: SimpleIdentifier
+                token: p @56
+                staticElement: <testLibraryFragment>::@prefix::p
+                staticType: null
+              period: . @57
+              identifier: SimpleIdentifier
+                token: E @58
+                staticElement: package:test/a.dart::<fragment>::@enum::E
+                staticType: Type
+              staticElement: package:test/a.dart::<fragment>::@enum::E
+              staticType: Type
+        static const vFunctionTypeAlias @67
+          reference: <testLibraryFragment>::@topLevelVariable::vFunctionTypeAlias
+          enclosingElement: <testLibraryFragment>
+          type: Type
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PrefixedIdentifier
+              prefix: SimpleIdentifier
+                token: p @88
+                staticElement: <testLibraryFragment>::@prefix::p
+                staticType: null
+              period: . @89
+              identifier: SimpleIdentifier
+                token: F @90
+                staticElement: package:test/a.dart::<fragment>::@typeAlias::F
+                staticType: Type
+              staticElement: package:test/a.dart::<fragment>::@typeAlias::F
+              staticType: Type
+      accessors
+        synthetic static get vClass @-1
+          reference: <testLibraryFragment>::@getter::vClass
+          enclosingElement: <testLibraryFragment>
+          returnType: Type
+        synthetic static get vEnum @-1
+          reference: <testLibraryFragment>::@getter::vEnum
+          enclosingElement: <testLibraryFragment>
+          returnType: Type
+        synthetic static get vFunctionTypeAlias @-1
+          reference: <testLibraryFragment>::@getter::vFunctionTypeAlias
+          enclosingElement: <testLibraryFragment>
+          returnType: Type
+''');
+  }
+
+  test_const_reference_type_typeParameter() async {
+    var library = await buildLibrary(r'''
+class C<T> {
+  final f = <T>[];
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          fields
+            final f @21
+              reference: <testLibraryFragment>::@class::C::@field::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: List<T>
+              shouldUseTypeForInitializerInference: false
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get f @-1
+              reference: <testLibraryFragment>::@class::C::@getter::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: List<T>
+''');
+  }
+
+  test_const_reference_unresolved_prefix0() async {
+    var library = await buildLibrary(r'''
+const V = foo;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const V @6
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: InvalidType
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SimpleIdentifier
+              token: foo @10
+              staticElement: <null>
+              staticType: InvalidType
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: InvalidType
+''');
+  }
+
+  test_const_reference_unresolved_prefix1() async {
+    var library = await buildLibrary(r'''
+class C {}
+const V = C.foo;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+      topLevelVariables
+        static const V @17
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: InvalidType
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PrefixedIdentifier
+              prefix: SimpleIdentifier
+                token: C @21
+                staticElement: <testLibraryFragment>::@class::C
+                staticType: null
+              period: . @22
+              identifier: SimpleIdentifier
+                token: foo @23
+                staticElement: <null>
+                staticType: InvalidType
+              staticElement: <null>
+              staticType: InvalidType
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: InvalidType
+''');
+  }
+
+  test_const_reference_unresolved_prefix2() async {
+    addSource('$testPackageLibPath/foo.dart', '''
+class C {}
+''');
+    var library = await buildLibrary(r'''
+import 'foo.dart' as p;
+const V = p.C.foo;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo.dart as p @21
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    p @21
+      reference: <testLibraryFragment>::@prefix::p
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo.dart as p @21
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        p @21
+          reference: <testLibraryFragment>::@prefix::p
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const V @30
+          reference: <testLibraryFragment>::@topLevelVariable::V
+          enclosingElement: <testLibraryFragment>
+          type: InvalidType
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PropertyAccess
+              target: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: p @34
+                  staticElement: <testLibraryFragment>::@prefix::p
+                  staticType: null
+                period: . @35
+                identifier: SimpleIdentifier
+                  token: C @36
+                  staticElement: package:test/foo.dart::<fragment>::@class::C
+                  staticType: null
+                staticElement: package:test/foo.dart::<fragment>::@class::C
+                staticType: null
+              operator: . @37
+              propertyName: SimpleIdentifier
+                token: foo @38
+                staticElement: <null>
+                staticType: InvalidType
+              staticType: InvalidType
+      accessors
+        synthetic static get V @-1
+          reference: <testLibraryFragment>::@getter::V
+          enclosingElement: <testLibraryFragment>
+          returnType: InvalidType
+''');
+  }
+
+  test_const_set_if() async {
+    var library = await buildLibrary('''
+const Object x = const <int>{if (true) 1};
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const x @13
+          reference: <testLibraryFragment>::@topLevelVariable::x
+          enclosingElement: <testLibraryFragment>
+          type: Object
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            SetOrMapLiteral
+              constKeyword: const @17
+              typeArguments: TypeArgumentList
+                leftBracket: < @23
+                arguments
+                  NamedType
+                    name: int @24
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                rightBracket: > @27
+              leftBracket: { @28
+              elements
+                IfElement
+                  ifKeyword: if @29
+                  leftParenthesis: ( @32
+                  expression: BooleanLiteral
+                    literal: true @33
+                    staticType: bool
+                  rightParenthesis: ) @37
+                  thenElement: IntegerLiteral
+                    literal: 1 @39
+                    staticType: int
+              rightBracket: } @40
+              isMap: false
+              staticType: Set<int>
+      accessors
+        synthetic static get x @-1
+          reference: <testLibraryFragment>::@getter::x
+          enclosingElement: <testLibraryFragment>
+          returnType: Object
+''');
+  }
+
+  test_const_set_inferredType() async {
+    // The summary needs to contain enough information so that when the constant
+    // is resynthesized, the constant value can get the type that was computed
+    // by type inference.
+    var library = await buildLibrary('''
+const Object x = const {1};
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const x @13
+          reference: <testLibraryFragment>::@topLevelVariable::x
+          enclosingElement: <testLibraryFragment>
+          type: Object
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            SetOrMapLiteral
+              constKeyword: const @17
+              leftBracket: { @23
+              elements
+                IntegerLiteral
+                  literal: 1 @24
+                  staticType: int
+              rightBracket: } @25
+              isMap: false
+              staticType: Set<int>
+      accessors
+        synthetic static get x @-1
+          reference: <testLibraryFragment>::@getter::x
+          enclosingElement: <testLibraryFragment>
+          returnType: Object
+''');
+  }
+
+  test_const_set_spread() async {
+    var library = await buildLibrary('''
+const Object x = const <int>{...<int>{1}};
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const x @13
+          reference: <testLibraryFragment>::@topLevelVariable::x
+          enclosingElement: <testLibraryFragment>
+          type: Object
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            SetOrMapLiteral
+              constKeyword: const @17
+              typeArguments: TypeArgumentList
+                leftBracket: < @23
+                arguments
+                  NamedType
+                    name: int @24
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                rightBracket: > @27
+              leftBracket: { @28
+              elements
+                SpreadElement
+                  spreadOperator: ... @29
+                  expression: SetOrMapLiteral
+                    typeArguments: TypeArgumentList
+                      leftBracket: < @32
+                      arguments
+                        NamedType
+                          name: int @33
+                          element: dart:core::<fragment>::@class::int
+                          type: int
+                      rightBracket: > @36
+                    leftBracket: { @37
+                    elements
+                      IntegerLiteral
+                        literal: 1 @38
+                        staticType: int
+                    rightBracket: } @39
+                    isMap: false
+                    staticType: Set<int>
+              rightBracket: } @40
+              isMap: false
+              staticType: Set<int>
+      accessors
+        synthetic static get x @-1
+          reference: <testLibraryFragment>::@getter::x
+          enclosingElement: <testLibraryFragment>
+          returnType: Object
+''');
+  }
+
+  test_const_set_spread_null_aware() async {
+    var library = await buildLibrary('''
+const Object x = const <int>{...?<int>{1}};
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const x @13
+          reference: <testLibraryFragment>::@topLevelVariable::x
+          enclosingElement: <testLibraryFragment>
+          type: Object
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            SetOrMapLiteral
+              constKeyword: const @17
+              typeArguments: TypeArgumentList
+                leftBracket: < @23
+                arguments
+                  NamedType
+                    name: int @24
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                rightBracket: > @27
+              leftBracket: { @28
+              elements
+                SpreadElement
+                  spreadOperator: ...? @29
+                  expression: SetOrMapLiteral
+                    typeArguments: TypeArgumentList
+                      leftBracket: < @33
+                      arguments
+                        NamedType
+                          name: int @34
+                          element: dart:core::<fragment>::@class::int
+                          type: int
+                      rightBracket: > @37
+                    leftBracket: { @38
+                    elements
+                      IntegerLiteral
+                        literal: 1 @39
+                        staticType: int
+                    rightBracket: } @40
+                    isMap: false
+                    staticType: Set<int>
+              rightBracket: } @41
+              isMap: false
+              staticType: Set<int>
+      accessors
+        synthetic static get x @-1
+          reference: <testLibraryFragment>::@getter::x
+          enclosingElement: <testLibraryFragment>
+          returnType: Object
+''');
+  }
+
+  test_const_topLevel_binary() async {
+    var library = await buildLibrary(r'''
+const vEqual = 1 == 2;
+const vAnd = true && false;
+const vOr = false || true;
+const vBitXor = 1 ^ 2;
+const vBitAnd = 1 & 2;
+const vBitOr = 1 | 2;
+const vBitShiftLeft = 1 << 2;
+const vBitShiftRight = 1 >> 2;
+const vAdd = 1 + 2;
+const vSubtract = 1 - 2;
+const vMiltiply = 1 * 2;
+const vDivide = 1 / 2;
+const vFloorDivide = 1 ~/ 2;
+const vModulo = 1 % 2;
+const vGreater = 1 > 2;
+const vGreaterEqual = 1 >= 2;
+const vLess = 1 < 2;
+const vLessEqual = 1 <= 2;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const vEqual @6
+          reference: <testLibraryFragment>::@topLevelVariable::vEqual
+          enclosingElement: <testLibraryFragment>
+          type: bool
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: IntegerLiteral
+                literal: 1 @15
+                staticType: int
+              operator: == @17
+              rightOperand: IntegerLiteral
+                literal: 2 @20
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::num::@method::==
+              staticInvokeType: bool Function(Object)
+              staticType: bool
+        static const vAnd @29
+          reference: <testLibraryFragment>::@topLevelVariable::vAnd
+          enclosingElement: <testLibraryFragment>
+          type: bool
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: BooleanLiteral
+                literal: true @36
+                staticType: bool
+              operator: && @41
+              rightOperand: BooleanLiteral
+                literal: false @44
+                staticType: bool
+              staticElement: <null>
+              staticInvokeType: null
+              staticType: bool
+        static const vOr @57
+          reference: <testLibraryFragment>::@topLevelVariable::vOr
+          enclosingElement: <testLibraryFragment>
+          type: bool
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: BooleanLiteral
+                literal: false @63
+                staticType: bool
+              operator: || @69
+              rightOperand: BooleanLiteral
+                literal: true @72
+                staticType: bool
+              staticElement: <null>
+              staticInvokeType: null
+              staticType: bool
+        static const vBitXor @84
+          reference: <testLibraryFragment>::@topLevelVariable::vBitXor
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: IntegerLiteral
+                literal: 1 @94
+                staticType: int
+              operator: ^ @96
+              rightOperand: IntegerLiteral
+                literal: 2 @98
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::int::@method::^
+              staticInvokeType: int Function(int)
+              staticType: int
+        static const vBitAnd @107
+          reference: <testLibraryFragment>::@topLevelVariable::vBitAnd
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: IntegerLiteral
+                literal: 1 @117
+                staticType: int
+              operator: & @119
+              rightOperand: IntegerLiteral
+                literal: 2 @121
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::int::@method::&
+              staticInvokeType: int Function(int)
+              staticType: int
+        static const vBitOr @130
+          reference: <testLibraryFragment>::@topLevelVariable::vBitOr
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: IntegerLiteral
+                literal: 1 @139
+                staticType: int
+              operator: | @141
+              rightOperand: IntegerLiteral
+                literal: 2 @143
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::int::@method::|
+              staticInvokeType: int Function(int)
+              staticType: int
+        static const vBitShiftLeft @152
+          reference: <testLibraryFragment>::@topLevelVariable::vBitShiftLeft
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: IntegerLiteral
+                literal: 1 @168
+                staticType: int
+              operator: << @170
+              rightOperand: IntegerLiteral
+                literal: 2 @173
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::int::@method::<<
+              staticInvokeType: int Function(int)
+              staticType: int
+        static const vBitShiftRight @182
+          reference: <testLibraryFragment>::@topLevelVariable::vBitShiftRight
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: IntegerLiteral
+                literal: 1 @199
+                staticType: int
+              operator: >> @201
+              rightOperand: IntegerLiteral
+                literal: 2 @204
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::int::@method::>>
+              staticInvokeType: int Function(int)
+              staticType: int
+        static const vAdd @213
+          reference: <testLibraryFragment>::@topLevelVariable::vAdd
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: IntegerLiteral
+                literal: 1 @220
+                staticType: int
+              operator: + @222
+              rightOperand: IntegerLiteral
+                literal: 2 @224
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::num::@method::+
+              staticInvokeType: num Function(num)
+              staticType: int
+        static const vSubtract @233
+          reference: <testLibraryFragment>::@topLevelVariable::vSubtract
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: IntegerLiteral
+                literal: 1 @245
+                staticType: int
+              operator: - @247
+              rightOperand: IntegerLiteral
+                literal: 2 @249
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::num::@method::-
+              staticInvokeType: num Function(num)
+              staticType: int
+        static const vMiltiply @258
+          reference: <testLibraryFragment>::@topLevelVariable::vMiltiply
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: IntegerLiteral
+                literal: 1 @270
+                staticType: int
+              operator: * @272
+              rightOperand: IntegerLiteral
+                literal: 2 @274
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::num::@method::*
+              staticInvokeType: num Function(num)
+              staticType: int
+        static const vDivide @283
+          reference: <testLibraryFragment>::@topLevelVariable::vDivide
+          enclosingElement: <testLibraryFragment>
+          type: double
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: IntegerLiteral
+                literal: 1 @293
+                staticType: int
+              operator: / @295
+              rightOperand: IntegerLiteral
+                literal: 2 @297
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::num::@method::/
+              staticInvokeType: double Function(num)
+              staticType: double
+        static const vFloorDivide @306
+          reference: <testLibraryFragment>::@topLevelVariable::vFloorDivide
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: IntegerLiteral
+                literal: 1 @321
+                staticType: int
+              operator: ~/ @323
+              rightOperand: IntegerLiteral
+                literal: 2 @326
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::num::@method::~/
+              staticInvokeType: int Function(num)
+              staticType: int
+        static const vModulo @335
+          reference: <testLibraryFragment>::@topLevelVariable::vModulo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: IntegerLiteral
+                literal: 1 @345
+                staticType: int
+              operator: % @347
+              rightOperand: IntegerLiteral
+                literal: 2 @349
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::num::@method::%
+              staticInvokeType: num Function(num)
+              staticType: int
+        static const vGreater @358
+          reference: <testLibraryFragment>::@topLevelVariable::vGreater
+          enclosingElement: <testLibraryFragment>
+          type: bool
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: IntegerLiteral
+                literal: 1 @369
+                staticType: int
+              operator: > @371
+              rightOperand: IntegerLiteral
+                literal: 2 @373
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::num::@method::>
+              staticInvokeType: bool Function(num)
+              staticType: bool
+        static const vGreaterEqual @382
+          reference: <testLibraryFragment>::@topLevelVariable::vGreaterEqual
+          enclosingElement: <testLibraryFragment>
+          type: bool
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: IntegerLiteral
+                literal: 1 @398
+                staticType: int
+              operator: >= @400
+              rightOperand: IntegerLiteral
+                literal: 2 @403
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::num::@method::>=
+              staticInvokeType: bool Function(num)
+              staticType: bool
+        static const vLess @412
+          reference: <testLibraryFragment>::@topLevelVariable::vLess
+          enclosingElement: <testLibraryFragment>
+          type: bool
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: IntegerLiteral
+                literal: 1 @420
+                staticType: int
+              operator: < @422
+              rightOperand: IntegerLiteral
+                literal: 2 @424
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::num::@method::<
+              staticInvokeType: bool Function(num)
+              staticType: bool
+        static const vLessEqual @433
+          reference: <testLibraryFragment>::@topLevelVariable::vLessEqual
+          enclosingElement: <testLibraryFragment>
+          type: bool
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: IntegerLiteral
+                literal: 1 @446
+                staticType: int
+              operator: <= @448
+              rightOperand: IntegerLiteral
+                literal: 2 @451
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::num::@method::<=
+              staticInvokeType: bool Function(num)
+              staticType: bool
+      accessors
+        synthetic static get vEqual @-1
+          reference: <testLibraryFragment>::@getter::vEqual
+          enclosingElement: <testLibraryFragment>
+          returnType: bool
+        synthetic static get vAnd @-1
+          reference: <testLibraryFragment>::@getter::vAnd
+          enclosingElement: <testLibraryFragment>
+          returnType: bool
+        synthetic static get vOr @-1
+          reference: <testLibraryFragment>::@getter::vOr
+          enclosingElement: <testLibraryFragment>
+          returnType: bool
+        synthetic static get vBitXor @-1
+          reference: <testLibraryFragment>::@getter::vBitXor
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get vBitAnd @-1
+          reference: <testLibraryFragment>::@getter::vBitAnd
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get vBitOr @-1
+          reference: <testLibraryFragment>::@getter::vBitOr
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get vBitShiftLeft @-1
+          reference: <testLibraryFragment>::@getter::vBitShiftLeft
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get vBitShiftRight @-1
+          reference: <testLibraryFragment>::@getter::vBitShiftRight
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get vAdd @-1
+          reference: <testLibraryFragment>::@getter::vAdd
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get vSubtract @-1
+          reference: <testLibraryFragment>::@getter::vSubtract
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get vMiltiply @-1
+          reference: <testLibraryFragment>::@getter::vMiltiply
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get vDivide @-1
+          reference: <testLibraryFragment>::@getter::vDivide
+          enclosingElement: <testLibraryFragment>
+          returnType: double
+        synthetic static get vFloorDivide @-1
+          reference: <testLibraryFragment>::@getter::vFloorDivide
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get vModulo @-1
+          reference: <testLibraryFragment>::@getter::vModulo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get vGreater @-1
+          reference: <testLibraryFragment>::@getter::vGreater
+          enclosingElement: <testLibraryFragment>
+          returnType: bool
+        synthetic static get vGreaterEqual @-1
+          reference: <testLibraryFragment>::@getter::vGreaterEqual
+          enclosingElement: <testLibraryFragment>
+          returnType: bool
+        synthetic static get vLess @-1
+          reference: <testLibraryFragment>::@getter::vLess
+          enclosingElement: <testLibraryFragment>
+          returnType: bool
+        synthetic static get vLessEqual @-1
+          reference: <testLibraryFragment>::@getter::vLessEqual
+          enclosingElement: <testLibraryFragment>
+          returnType: bool
+''');
+  }
+
+  test_const_topLevel_conditional() async {
+    var library = await buildLibrary(r'''
+const vConditional = (1 == 2) ? 11 : 22;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const vConditional @6
+          reference: <testLibraryFragment>::@topLevelVariable::vConditional
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            ConditionalExpression
+              condition: ParenthesizedExpression
+                leftParenthesis: ( @21
+                expression: BinaryExpression
+                  leftOperand: IntegerLiteral
+                    literal: 1 @22
+                    staticType: int
+                  operator: == @24
+                  rightOperand: IntegerLiteral
+                    literal: 2 @27
+                    staticType: int
+                  staticElement: dart:core::<fragment>::@class::num::@method::==
+                  staticInvokeType: bool Function(Object)
+                  staticType: bool
+                rightParenthesis: ) @28
+                staticType: bool
+              question: ? @30
+              thenExpression: IntegerLiteral
+                literal: 11 @32
+                staticType: int
+              colon: : @35
+              elseExpression: IntegerLiteral
+                literal: 22 @37
+                staticType: int
+              staticType: int
+      accessors
+        synthetic static get vConditional @-1
+          reference: <testLibraryFragment>::@getter::vConditional
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_topLevel_identical() async {
+    var library = await buildLibrary(r'''
+const vIdentical = (1 == 2) ? 11 : 22;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const vIdentical @6
+          reference: <testLibraryFragment>::@topLevelVariable::vIdentical
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            ConditionalExpression
+              condition: ParenthesizedExpression
+                leftParenthesis: ( @19
+                expression: BinaryExpression
+                  leftOperand: IntegerLiteral
+                    literal: 1 @20
+                    staticType: int
+                  operator: == @22
+                  rightOperand: IntegerLiteral
+                    literal: 2 @25
+                    staticType: int
+                  staticElement: dart:core::<fragment>::@class::num::@method::==
+                  staticInvokeType: bool Function(Object)
+                  staticType: bool
+                rightParenthesis: ) @26
+                staticType: bool
+              question: ? @28
+              thenExpression: IntegerLiteral
+                literal: 11 @30
+                staticType: int
+              colon: : @33
+              elseExpression: IntegerLiteral
+                literal: 22 @35
+                staticType: int
+              staticType: int
+      accessors
+        synthetic static get vIdentical @-1
+          reference: <testLibraryFragment>::@getter::vIdentical
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_topLevel_ifNull() async {
+    var library = await buildLibrary(r'''
+const vIfNull = 1 ?? 2.0;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const vIfNull @6
+          reference: <testLibraryFragment>::@topLevelVariable::vIfNull
+          enclosingElement: <testLibraryFragment>
+          type: num
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: IntegerLiteral
+                literal: 1 @16
+                staticType: int
+              operator: ?? @18
+              rightOperand: DoubleLiteral
+                literal: 2.0 @21
+                staticType: double
+              staticElement: <null>
+              staticInvokeType: null
+              staticType: num
+      accessors
+        synthetic static get vIfNull @-1
+          reference: <testLibraryFragment>::@getter::vIfNull
+          enclosingElement: <testLibraryFragment>
+          returnType: num
+''');
+  }
+
+  test_const_topLevel_literal() async {
+    var library = await buildLibrary(r'''
+const vNull = null;
+const vBoolFalse = false;
+const vBoolTrue = true;
+const vIntPositive = 1;
+const vIntNegative = -2;
+const vIntLong1 = 0x7FFFFFFFFFFFFFFF;
+const vIntLong2 = 0xFFFFFFFFFFFFFFFF;
+const vIntLong3 = 0x8000000000000000;
+const vDouble = 2.3;
+const vString = 'abc';
+const vStringConcat = 'aaa' 'bbb';
+const vStringInterpolation = 'aaa ${true} ${42} bbb';
+const vSymbol = #aaa.bbb.ccc;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const vNull @6
+          reference: <testLibraryFragment>::@topLevelVariable::vNull
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @14
+              staticType: Null
+        static const vBoolFalse @26
+          reference: <testLibraryFragment>::@topLevelVariable::vBoolFalse
+          enclosingElement: <testLibraryFragment>
+          type: bool
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BooleanLiteral
+              literal: false @39
+              staticType: bool
+        static const vBoolTrue @52
+          reference: <testLibraryFragment>::@topLevelVariable::vBoolTrue
+          enclosingElement: <testLibraryFragment>
+          type: bool
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BooleanLiteral
+              literal: true @64
+              staticType: bool
+        static const vIntPositive @76
+          reference: <testLibraryFragment>::@topLevelVariable::vIntPositive
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 1 @91
+              staticType: int
+        static const vIntNegative @100
+          reference: <testLibraryFragment>::@topLevelVariable::vIntNegative
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PrefixExpression
+              operator: - @115
+              operand: IntegerLiteral
+                literal: 2 @116
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::int::@method::unary-
+              staticType: int
+        static const vIntLong1 @125
+          reference: <testLibraryFragment>::@topLevelVariable::vIntLong1
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0x7FFFFFFFFFFFFFFF @137
+              staticType: int
+        static const vIntLong2 @163
+          reference: <testLibraryFragment>::@topLevelVariable::vIntLong2
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0xFFFFFFFFFFFFFFFF @175
+              staticType: int
+        static const vIntLong3 @201
+          reference: <testLibraryFragment>::@topLevelVariable::vIntLong3
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0x8000000000000000 @213
+              staticType: int
+        static const vDouble @239
+          reference: <testLibraryFragment>::@topLevelVariable::vDouble
+          enclosingElement: <testLibraryFragment>
+          type: double
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            DoubleLiteral
+              literal: 2.3 @249
+              staticType: double
+        static const vString @260
+          reference: <testLibraryFragment>::@topLevelVariable::vString
+          enclosingElement: <testLibraryFragment>
+          type: String
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SimpleStringLiteral
+              literal: 'abc' @270
+        static const vStringConcat @283
+          reference: <testLibraryFragment>::@topLevelVariable::vStringConcat
+          enclosingElement: <testLibraryFragment>
+          type: String
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            AdjacentStrings
+              strings
+                SimpleStringLiteral
+                  literal: 'aaa' @299
+                SimpleStringLiteral
+                  literal: 'bbb' @305
+              staticType: String
+              stringValue: aaabbb
+        static const vStringInterpolation @318
+          reference: <testLibraryFragment>::@topLevelVariable::vStringInterpolation
+          enclosingElement: <testLibraryFragment>
+          type: String
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            StringInterpolation
+              elements
+                InterpolationString
+                  contents: 'aaa  @341
+                InterpolationExpression
+                  leftBracket: ${ @346
+                  expression: BooleanLiteral
+                    literal: true @348
+                    staticType: bool
+                  rightBracket: } @352
+                InterpolationString
+                  contents:   @353
+                InterpolationExpression
+                  leftBracket: ${ @354
+                  expression: IntegerLiteral
+                    literal: 42 @356
+                    staticType: int
+                  rightBracket: } @358
+                InterpolationString
+                  contents:  bbb' @359
+              staticType: String
+              stringValue: null
+        static const vSymbol @372
+          reference: <testLibraryFragment>::@topLevelVariable::vSymbol
+          enclosingElement: <testLibraryFragment>
+          type: Symbol
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SymbolLiteral
+              poundSign: # @382
+              components
+                aaa
+                  offset: 383
+                bbb
+                  offset: 387
+                ccc
+                  offset: 391
+      accessors
+        synthetic static get vNull @-1
+          reference: <testLibraryFragment>::@getter::vNull
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+        synthetic static get vBoolFalse @-1
+          reference: <testLibraryFragment>::@getter::vBoolFalse
+          enclosingElement: <testLibraryFragment>
+          returnType: bool
+        synthetic static get vBoolTrue @-1
+          reference: <testLibraryFragment>::@getter::vBoolTrue
+          enclosingElement: <testLibraryFragment>
+          returnType: bool
+        synthetic static get vIntPositive @-1
+          reference: <testLibraryFragment>::@getter::vIntPositive
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get vIntNegative @-1
+          reference: <testLibraryFragment>::@getter::vIntNegative
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get vIntLong1 @-1
+          reference: <testLibraryFragment>::@getter::vIntLong1
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get vIntLong2 @-1
+          reference: <testLibraryFragment>::@getter::vIntLong2
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get vIntLong3 @-1
+          reference: <testLibraryFragment>::@getter::vIntLong3
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get vDouble @-1
+          reference: <testLibraryFragment>::@getter::vDouble
+          enclosingElement: <testLibraryFragment>
+          returnType: double
+        synthetic static get vString @-1
+          reference: <testLibraryFragment>::@getter::vString
+          enclosingElement: <testLibraryFragment>
+          returnType: String
+        synthetic static get vStringConcat @-1
+          reference: <testLibraryFragment>::@getter::vStringConcat
+          enclosingElement: <testLibraryFragment>
+          returnType: String
+        synthetic static get vStringInterpolation @-1
+          reference: <testLibraryFragment>::@getter::vStringInterpolation
+          enclosingElement: <testLibraryFragment>
+          returnType: String
+        synthetic static get vSymbol @-1
+          reference: <testLibraryFragment>::@getter::vSymbol
+          enclosingElement: <testLibraryFragment>
+          returnType: Symbol
+''');
+  }
+
+  test_const_topLevel_methodInvocation_questionPeriod() async {
+    var library = await buildLibrary(r'''
+const int? a = 0;
+const b = a?.toString();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @11
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int?
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @15
+              staticType: int
+        static const b @24
+          reference: <testLibraryFragment>::@topLevelVariable::b
+          enclosingElement: <testLibraryFragment>
+          type: String?
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            MethodInvocation
+              target: SimpleIdentifier
+                token: a @28
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: int?
+              operator: ?. @29
+              methodName: SimpleIdentifier
+                token: toString @31
+                staticElement: dart:core::<fragment>::@class::int::@method::toString
+                staticType: String Function()
+              argumentList: ArgumentList
+                leftParenthesis: ( @39
+                rightParenthesis: ) @40
+              staticInvokeType: String Function()
+              staticType: String?
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int?
+        synthetic static get b @-1
+          reference: <testLibraryFragment>::@getter::b
+          enclosingElement: <testLibraryFragment>
+          returnType: String?
+''');
+  }
+
+  test_const_topLevel_methodInvocation_questionPeriodPeriod() async {
+    var library = await buildLibrary(r'''
+const int? a = 0;
+const b = a?..toString();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @11
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int?
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @15
+              staticType: int
+        static const b @24
+          reference: <testLibraryFragment>::@topLevelVariable::b
+          enclosingElement: <testLibraryFragment>
+          type: int?
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            CascadeExpression
+              target: SimpleIdentifier
+                token: a @28
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: int?
+              cascadeSections
+                MethodInvocation
+                  operator: ?.. @29
+                  methodName: SimpleIdentifier
+                    token: toString @32
+                    staticElement: dart:core::<fragment>::@class::int::@method::toString
+                    staticType: String Function()
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @40
+                    rightParenthesis: ) @41
+                  staticInvokeType: String Function()
+                  staticType: String
+              staticType: int?
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int?
+        synthetic static get b @-1
+          reference: <testLibraryFragment>::@getter::b
+          enclosingElement: <testLibraryFragment>
+          returnType: int?
+''');
+  }
+
+  test_const_topLevel_nullAware_propertyAccess() async {
+    var library = await buildLibrary(r'''
+const String? a = '';
+
+const List<int?> b = [
+  a?.length,
+];
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @14
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: String?
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            SimpleStringLiteral
+              literal: '' @18
+        static const b @40
+          reference: <testLibraryFragment>::@topLevelVariable::b
+          enclosingElement: <testLibraryFragment>
+          type: List<int?>
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            ListLiteral
+              leftBracket: [ @44
+              elements
+                PropertyAccess
+                  target: SimpleIdentifier
+                    token: a @48
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: String?
+                  operator: ?. @49
+                  propertyName: SimpleIdentifier
+                    token: length @51
+                    staticElement: dart:core::<fragment>::@class::String::@getter::length
+                    staticType: int
+                  staticType: int?
+              rightBracket: ] @59
+              staticType: List<int?>
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: String?
+        synthetic static get b @-1
+          reference: <testLibraryFragment>::@getter::b
+          enclosingElement: <testLibraryFragment>
+          returnType: List<int?>
+''');
+  }
+
+  test_const_topLevel_parenthesis() async {
+    var library = await buildLibrary(r'''
+const int v1 = (1 + 2) * 3;
+const int v2 = -(1 + 2);
+const int v3 = ('aaa' + 'bbb').length;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const v1 @10
+          reference: <testLibraryFragment>::@topLevelVariable::v1
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            BinaryExpression
+              leftOperand: ParenthesizedExpression
+                leftParenthesis: ( @15
+                expression: BinaryExpression
+                  leftOperand: IntegerLiteral
+                    literal: 1 @16
+                    staticType: int
+                  operator: + @18
+                  rightOperand: IntegerLiteral
+                    literal: 2 @20
+                    staticType: int
+                  staticElement: dart:core::<fragment>::@class::num::@method::+
+                  staticInvokeType: num Function(num)
+                  staticType: int
+                rightParenthesis: ) @21
+                staticType: int
+              operator: * @23
+              rightOperand: IntegerLiteral
+                literal: 3 @25
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::num::@method::*
+              staticInvokeType: num Function(num)
+              staticType: int
+        static const v2 @38
+          reference: <testLibraryFragment>::@topLevelVariable::v2
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            PrefixExpression
+              operator: - @43
+              operand: ParenthesizedExpression
+                leftParenthesis: ( @44
+                expression: BinaryExpression
+                  leftOperand: IntegerLiteral
+                    literal: 1 @45
+                    staticType: int
+                  operator: + @47
+                  rightOperand: IntegerLiteral
+                    literal: 2 @49
+                    staticType: int
+                  staticElement: dart:core::<fragment>::@class::num::@method::+
+                  staticInvokeType: num Function(num)
+                  staticType: int
+                rightParenthesis: ) @50
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::int::@method::unary-
+              staticType: int
+        static const v3 @63
+          reference: <testLibraryFragment>::@topLevelVariable::v3
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            PropertyAccess
+              target: ParenthesizedExpression
+                leftParenthesis: ( @68
+                expression: BinaryExpression
+                  leftOperand: SimpleStringLiteral
+                    literal: 'aaa' @69
+                  operator: + @75
+                  rightOperand: SimpleStringLiteral
+                    literal: 'bbb' @77
+                  staticElement: dart:core::<fragment>::@class::String::@method::+
+                  staticInvokeType: String Function(String)
+                  staticType: String
+                rightParenthesis: ) @82
+                staticType: String
+              operator: . @83
+              propertyName: SimpleIdentifier
+                token: length @84
+                staticElement: dart:core::<fragment>::@class::String::@getter::length
+                staticType: int
+              staticType: int
+      accessors
+        synthetic static get v1 @-1
+          reference: <testLibraryFragment>::@getter::v1
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get v2 @-1
+          reference: <testLibraryFragment>::@getter::v2
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get v3 @-1
+          reference: <testLibraryFragment>::@getter::v3
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_topLevel_prefix() async {
+    var library = await buildLibrary(r'''
+const vNotEqual = 1 != 2;
+const vNot = !true;
+const vNegate = -1;
+const vComplement = ~1;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const vNotEqual @6
+          reference: <testLibraryFragment>::@topLevelVariable::vNotEqual
+          enclosingElement: <testLibraryFragment>
+          type: bool
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            BinaryExpression
+              leftOperand: IntegerLiteral
+                literal: 1 @18
+                staticType: int
+              operator: != @20
+              rightOperand: IntegerLiteral
+                literal: 2 @23
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::num::@method::==
+              staticInvokeType: bool Function(Object)
+              staticType: bool
+        static const vNot @32
+          reference: <testLibraryFragment>::@topLevelVariable::vNot
+          enclosingElement: <testLibraryFragment>
+          type: bool
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PrefixExpression
+              operator: ! @39
+              operand: BooleanLiteral
+                literal: true @40
+                staticType: bool
+              staticElement: <null>
+              staticType: bool
+        static const vNegate @52
+          reference: <testLibraryFragment>::@topLevelVariable::vNegate
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PrefixExpression
+              operator: - @62
+              operand: IntegerLiteral
+                literal: 1 @63
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::int::@method::unary-
+              staticType: int
+        static const vComplement @72
+          reference: <testLibraryFragment>::@topLevelVariable::vComplement
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PrefixExpression
+              operator: ~ @86
+              operand: IntegerLiteral
+                literal: 1 @87
+                staticType: int
+              staticElement: dart:core::<fragment>::@class::int::@method::~
+              staticType: int
+      accessors
+        synthetic static get vNotEqual @-1
+          reference: <testLibraryFragment>::@getter::vNotEqual
+          enclosingElement: <testLibraryFragment>
+          returnType: bool
+        synthetic static get vNot @-1
+          reference: <testLibraryFragment>::@getter::vNot
+          enclosingElement: <testLibraryFragment>
+          returnType: bool
+        synthetic static get vNegate @-1
+          reference: <testLibraryFragment>::@getter::vNegate
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get vComplement @-1
+          reference: <testLibraryFragment>::@getter::vComplement
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_const_topLevel_super() async {
+    var library = await buildLibrary(r'''
+const vSuper = super;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const vSuper @6
+          reference: <testLibraryFragment>::@topLevelVariable::vSuper
+          enclosingElement: <testLibraryFragment>
+          type: InvalidType
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SuperExpression
+              superKeyword: super @15
+              staticType: InvalidType
+      accessors
+        synthetic static get vSuper @-1
+          reference: <testLibraryFragment>::@getter::vSuper
+          enclosingElement: <testLibraryFragment>
+          returnType: InvalidType
+''');
+  }
+
+  test_const_topLevel_this() async {
+    var library = await buildLibrary(r'''
+const vThis = this;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const vThis @6
+          reference: <testLibraryFragment>::@topLevelVariable::vThis
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            ThisExpression
+              thisKeyword: this @14
+              staticType: dynamic
+      accessors
+        synthetic static get vThis @-1
+          reference: <testLibraryFragment>::@getter::vThis
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_const_topLevel_throw() async {
+    var library = await buildLibrary(r'''
+const c = throw 42;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const c @6
+          reference: <testLibraryFragment>::@topLevelVariable::c
+          enclosingElement: <testLibraryFragment>
+          type: Never
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            ThrowExpression
+              throwKeyword: throw @10
+              expression: IntegerLiteral
+                literal: 42 @16
+                staticType: int
+              staticType: Never
+      accessors
+        synthetic static get c @-1
+          reference: <testLibraryFragment>::@getter::c
+          enclosingElement: <testLibraryFragment>
+          returnType: Never
+''');
+  }
+
+  test_const_topLevel_typedList() async {
+    var library = await buildLibrary(r'''
+const vNull = const <Null>[];
+const vDynamic = const <dynamic>[1, 2, 3];
+const vInterfaceNoTypeParameters = const <int>[1, 2, 3];
+const vInterfaceNoTypeArguments = const <List>[];
+const vInterfaceWithTypeArguments = const <List<String>>[];
+const vInterfaceWithTypeArguments2 = const <Map<int, List<String>>>[];
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const vNull @6
+          reference: <testLibraryFragment>::@topLevelVariable::vNull
+          enclosingElement: <testLibraryFragment>
+          type: List<Null>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            ListLiteral
+              constKeyword: const @14
+              typeArguments: TypeArgumentList
+                leftBracket: < @20
+                arguments
+                  NamedType
+                    name: Null @21
+                    element: dart:core::<fragment>::@class::Null
+                    type: Null
+                rightBracket: > @25
+              leftBracket: [ @26
+              rightBracket: ] @27
+              staticType: List<Null>
+        static const vDynamic @36
+          reference: <testLibraryFragment>::@topLevelVariable::vDynamic
+          enclosingElement: <testLibraryFragment>
+          type: List<dynamic>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            ListLiteral
+              constKeyword: const @47
+              typeArguments: TypeArgumentList
+                leftBracket: < @53
+                arguments
+                  NamedType
+                    name: dynamic @54
+                    element: dynamic@-1
+                    type: dynamic
+                rightBracket: > @61
+              leftBracket: [ @62
+              elements
+                IntegerLiteral
+                  literal: 1 @63
+                  staticType: int
+                IntegerLiteral
+                  literal: 2 @66
+                  staticType: int
+                IntegerLiteral
+                  literal: 3 @69
+                  staticType: int
+              rightBracket: ] @70
+              staticType: List<dynamic>
+        static const vInterfaceNoTypeParameters @79
+          reference: <testLibraryFragment>::@topLevelVariable::vInterfaceNoTypeParameters
+          enclosingElement: <testLibraryFragment>
+          type: List<int>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            ListLiteral
+              constKeyword: const @108
+              typeArguments: TypeArgumentList
+                leftBracket: < @114
+                arguments
+                  NamedType
+                    name: int @115
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                rightBracket: > @118
+              leftBracket: [ @119
+              elements
+                IntegerLiteral
+                  literal: 1 @120
+                  staticType: int
+                IntegerLiteral
+                  literal: 2 @123
+                  staticType: int
+                IntegerLiteral
+                  literal: 3 @126
+                  staticType: int
+              rightBracket: ] @127
+              staticType: List<int>
+        static const vInterfaceNoTypeArguments @136
+          reference: <testLibraryFragment>::@topLevelVariable::vInterfaceNoTypeArguments
+          enclosingElement: <testLibraryFragment>
+          type: List<List<dynamic>>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            ListLiteral
+              constKeyword: const @164
+              typeArguments: TypeArgumentList
+                leftBracket: < @170
+                arguments
+                  NamedType
+                    name: List @171
+                    element: dart:core::<fragment>::@class::List
+                    type: List<dynamic>
+                rightBracket: > @175
+              leftBracket: [ @176
+              rightBracket: ] @177
+              staticType: List<List<dynamic>>
+        static const vInterfaceWithTypeArguments @186
+          reference: <testLibraryFragment>::@topLevelVariable::vInterfaceWithTypeArguments
+          enclosingElement: <testLibraryFragment>
+          type: List<List<String>>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            ListLiteral
+              constKeyword: const @216
+              typeArguments: TypeArgumentList
+                leftBracket: < @222
+                arguments
+                  NamedType
+                    name: List @223
+                    typeArguments: TypeArgumentList
+                      leftBracket: < @227
+                      arguments
+                        NamedType
+                          name: String @228
+                          element: dart:core::<fragment>::@class::String
+                          type: String
+                      rightBracket: > @234
+                    element: dart:core::<fragment>::@class::List
+                    type: List<String>
+                rightBracket: > @235
+              leftBracket: [ @236
+              rightBracket: ] @237
+              staticType: List<List<String>>
+        static const vInterfaceWithTypeArguments2 @246
+          reference: <testLibraryFragment>::@topLevelVariable::vInterfaceWithTypeArguments2
+          enclosingElement: <testLibraryFragment>
+          type: List<Map<int, List<String>>>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            ListLiteral
+              constKeyword: const @277
+              typeArguments: TypeArgumentList
+                leftBracket: < @283
+                arguments
+                  NamedType
+                    name: Map @284
+                    typeArguments: TypeArgumentList
+                      leftBracket: < @287
+                      arguments
+                        NamedType
+                          name: int @288
+                          element: dart:core::<fragment>::@class::int
+                          type: int
+                        NamedType
+                          name: List @293
+                          typeArguments: TypeArgumentList
+                            leftBracket: < @297
+                            arguments
+                              NamedType
+                                name: String @298
+                                element: dart:core::<fragment>::@class::String
+                                type: String
+                            rightBracket: > @304
+                          element: dart:core::<fragment>::@class::List
+                          type: List<String>
+                      rightBracket: > @305
+                    element: dart:core::<fragment>::@class::Map
+                    type: Map<int, List<String>>
+                rightBracket: > @306
+              leftBracket: [ @307
+              rightBracket: ] @308
+              staticType: List<Map<int, List<String>>>
+      accessors
+        synthetic static get vNull @-1
+          reference: <testLibraryFragment>::@getter::vNull
+          enclosingElement: <testLibraryFragment>
+          returnType: List<Null>
+        synthetic static get vDynamic @-1
+          reference: <testLibraryFragment>::@getter::vDynamic
+          enclosingElement: <testLibraryFragment>
+          returnType: List<dynamic>
+        synthetic static get vInterfaceNoTypeParameters @-1
+          reference: <testLibraryFragment>::@getter::vInterfaceNoTypeParameters
+          enclosingElement: <testLibraryFragment>
+          returnType: List<int>
+        synthetic static get vInterfaceNoTypeArguments @-1
+          reference: <testLibraryFragment>::@getter::vInterfaceNoTypeArguments
+          enclosingElement: <testLibraryFragment>
+          returnType: List<List<dynamic>>
+        synthetic static get vInterfaceWithTypeArguments @-1
+          reference: <testLibraryFragment>::@getter::vInterfaceWithTypeArguments
+          enclosingElement: <testLibraryFragment>
+          returnType: List<List<String>>
+        synthetic static get vInterfaceWithTypeArguments2 @-1
+          reference: <testLibraryFragment>::@getter::vInterfaceWithTypeArguments2
+          enclosingElement: <testLibraryFragment>
+          returnType: List<Map<int, List<String>>>
+''');
+  }
+
+  test_const_topLevel_typedList_imported() async {
+    addSource('$testPackageLibPath/a.dart', 'class C {}');
+    var library = await buildLibrary(r'''
+import 'a.dart';
+const v = const <C>[];
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const v @23
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: List<C>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            ListLiteral
+              constKeyword: const @27
+              typeArguments: TypeArgumentList
+                leftBracket: < @33
+                arguments
+                  NamedType
+                    name: C @34
+                    element: package:test/a.dart::<fragment>::@class::C
+                    type: C
+                rightBracket: > @35
+              leftBracket: [ @36
+              rightBracket: ] @37
+              staticType: List<C>
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: List<C>
+''');
+  }
+
+  test_const_topLevel_typedList_importedWithPrefix() async {
+    addSource('$testPackageLibPath/a.dart', 'class C {}');
+    var library = await buildLibrary(r'''
+import 'a.dart' as p;
+const v = const <p.C>[];
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart as p @19
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    p @19
+      reference: <testLibraryFragment>::@prefix::p
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart as p @19
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        p @19
+          reference: <testLibraryFragment>::@prefix::p
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const v @28
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: List<C>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            ListLiteral
+              constKeyword: const @32
+              typeArguments: TypeArgumentList
+                leftBracket: < @38
+                arguments
+                  NamedType
+                    importPrefix: ImportPrefixReference
+                      name: p @39
+                      period: . @40
+                      element: <testLibraryFragment>::@prefix::p
+                    name: C @41
+                    element: package:test/a.dart::<fragment>::@class::C
+                    type: C
+                rightBracket: > @42
+              leftBracket: [ @43
+              rightBracket: ] @44
+              staticType: List<C>
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: List<C>
+''');
+  }
+
+  test_const_topLevel_typedList_typedefArgument() async {
+    var library = await buildLibrary(r'''
+typedef int F(String id);
+const v = const <F>[];
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      typeAliases
+        functionTypeAliasBased F @12
+          reference: <testLibraryFragment>::@typeAlias::F
+          aliasedType: int Function(String)
+          aliasedElement: GenericFunctionTypeElement
+            parameters
+              requiredPositional id @21
+                type: String
+            returnType: int
+      topLevelVariables
+        static const v @32
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: List<int Function(String)>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            ListLiteral
+              constKeyword: const @36
+              typeArguments: TypeArgumentList
+                leftBracket: < @42
+                arguments
+                  NamedType
+                    name: F @43
+                    element: <testLibraryFragment>::@typeAlias::F
+                    type: int Function(String)
+                      alias: <testLibraryFragment>::@typeAlias::F
+                rightBracket: > @44
+              leftBracket: [ @45
+              rightBracket: ] @46
+              staticType: List<int Function(String)>
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: List<int Function(String)>
+''');
+  }
+
+  test_const_topLevel_typedMap() async {
+    var library = await buildLibrary(r'''
+const vDynamic1 = const <dynamic, int>{};
+const vDynamic2 = const <int, dynamic>{};
+const vInterface = const <int, String>{};
+const vInterfaceWithTypeArguments = const <int, List<String>>{};
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const vDynamic1 @6
+          reference: <testLibraryFragment>::@topLevelVariable::vDynamic1
+          enclosingElement: <testLibraryFragment>
+          type: Map<dynamic, int>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SetOrMapLiteral
+              constKeyword: const @18
+              typeArguments: TypeArgumentList
+                leftBracket: < @24
+                arguments
+                  NamedType
+                    name: dynamic @25
+                    element: dynamic@-1
+                    type: dynamic
+                  NamedType
+                    name: int @34
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                rightBracket: > @37
+              leftBracket: { @38
+              rightBracket: } @39
+              isMap: true
+              staticType: Map<dynamic, int>
+        static const vDynamic2 @48
+          reference: <testLibraryFragment>::@topLevelVariable::vDynamic2
+          enclosingElement: <testLibraryFragment>
+          type: Map<int, dynamic>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SetOrMapLiteral
+              constKeyword: const @60
+              typeArguments: TypeArgumentList
+                leftBracket: < @66
+                arguments
+                  NamedType
+                    name: int @67
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                  NamedType
+                    name: dynamic @72
+                    element: dynamic@-1
+                    type: dynamic
+                rightBracket: > @79
+              leftBracket: { @80
+              rightBracket: } @81
+              isMap: true
+              staticType: Map<int, dynamic>
+        static const vInterface @90
+          reference: <testLibraryFragment>::@topLevelVariable::vInterface
+          enclosingElement: <testLibraryFragment>
+          type: Map<int, String>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SetOrMapLiteral
+              constKeyword: const @103
+              typeArguments: TypeArgumentList
+                leftBracket: < @109
+                arguments
+                  NamedType
+                    name: int @110
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                  NamedType
+                    name: String @115
+                    element: dart:core::<fragment>::@class::String
+                    type: String
+                rightBracket: > @121
+              leftBracket: { @122
+              rightBracket: } @123
+              isMap: true
+              staticType: Map<int, String>
+        static const vInterfaceWithTypeArguments @132
+          reference: <testLibraryFragment>::@topLevelVariable::vInterfaceWithTypeArguments
+          enclosingElement: <testLibraryFragment>
+          type: Map<int, List<String>>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SetOrMapLiteral
+              constKeyword: const @162
+              typeArguments: TypeArgumentList
+                leftBracket: < @168
+                arguments
+                  NamedType
+                    name: int @169
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                  NamedType
+                    name: List @174
+                    typeArguments: TypeArgumentList
+                      leftBracket: < @178
+                      arguments
+                        NamedType
+                          name: String @179
+                          element: dart:core::<fragment>::@class::String
+                          type: String
+                      rightBracket: > @185
+                    element: dart:core::<fragment>::@class::List
+                    type: List<String>
+                rightBracket: > @186
+              leftBracket: { @187
+              rightBracket: } @188
+              isMap: true
+              staticType: Map<int, List<String>>
+      accessors
+        synthetic static get vDynamic1 @-1
+          reference: <testLibraryFragment>::@getter::vDynamic1
+          enclosingElement: <testLibraryFragment>
+          returnType: Map<dynamic, int>
+        synthetic static get vDynamic2 @-1
+          reference: <testLibraryFragment>::@getter::vDynamic2
+          enclosingElement: <testLibraryFragment>
+          returnType: Map<int, dynamic>
+        synthetic static get vInterface @-1
+          reference: <testLibraryFragment>::@getter::vInterface
+          enclosingElement: <testLibraryFragment>
+          returnType: Map<int, String>
+        synthetic static get vInterfaceWithTypeArguments @-1
+          reference: <testLibraryFragment>::@getter::vInterfaceWithTypeArguments
+          enclosingElement: <testLibraryFragment>
+          returnType: Map<int, List<String>>
+''');
+  }
+
+  test_const_topLevel_typedSet() async {
+    var library = await buildLibrary(r'''
+const vDynamic1 = const <dynamic>{};
+const vInterface = const <int>{};
+const vInterfaceWithTypeArguments = const <List<String>>{};
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const vDynamic1 @6
+          reference: <testLibraryFragment>::@topLevelVariable::vDynamic1
+          enclosingElement: <testLibraryFragment>
+          type: Set<dynamic>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SetOrMapLiteral
+              constKeyword: const @18
+              typeArguments: TypeArgumentList
+                leftBracket: < @24
+                arguments
+                  NamedType
+                    name: dynamic @25
+                    element: dynamic@-1
+                    type: dynamic
+                rightBracket: > @32
+              leftBracket: { @33
+              rightBracket: } @34
+              isMap: false
+              staticType: Set<dynamic>
+        static const vInterface @43
+          reference: <testLibraryFragment>::@topLevelVariable::vInterface
+          enclosingElement: <testLibraryFragment>
+          type: Set<int>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SetOrMapLiteral
+              constKeyword: const @56
+              typeArguments: TypeArgumentList
+                leftBracket: < @62
+                arguments
+                  NamedType
+                    name: int @63
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                rightBracket: > @66
+              leftBracket: { @67
+              rightBracket: } @68
+              isMap: false
+              staticType: Set<int>
+        static const vInterfaceWithTypeArguments @77
+          reference: <testLibraryFragment>::@topLevelVariable::vInterfaceWithTypeArguments
+          enclosingElement: <testLibraryFragment>
+          type: Set<List<String>>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SetOrMapLiteral
+              constKeyword: const @107
+              typeArguments: TypeArgumentList
+                leftBracket: < @113
+                arguments
+                  NamedType
+                    name: List @114
+                    typeArguments: TypeArgumentList
+                      leftBracket: < @118
+                      arguments
+                        NamedType
+                          name: String @119
+                          element: dart:core::<fragment>::@class::String
+                          type: String
+                      rightBracket: > @125
+                    element: dart:core::<fragment>::@class::List
+                    type: List<String>
+                rightBracket: > @126
+              leftBracket: { @127
+              rightBracket: } @128
+              isMap: false
+              staticType: Set<List<String>>
+      accessors
+        synthetic static get vDynamic1 @-1
+          reference: <testLibraryFragment>::@getter::vDynamic1
+          enclosingElement: <testLibraryFragment>
+          returnType: Set<dynamic>
+        synthetic static get vInterface @-1
+          reference: <testLibraryFragment>::@getter::vInterface
+          enclosingElement: <testLibraryFragment>
+          returnType: Set<int>
+        synthetic static get vInterfaceWithTypeArguments @-1
+          reference: <testLibraryFragment>::@getter::vInterfaceWithTypeArguments
+          enclosingElement: <testLibraryFragment>
+          returnType: Set<List<String>>
+''');
+  }
+
+  test_const_topLevel_untypedList() async {
+    var library = await buildLibrary(r'''
+const v = const [1, 2, 3];
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const v @6
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: List<int>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            ListLiteral
+              constKeyword: const @10
+              leftBracket: [ @16
+              elements
+                IntegerLiteral
+                  literal: 1 @17
+                  staticType: int
+                IntegerLiteral
+                  literal: 2 @20
+                  staticType: int
+                IntegerLiteral
+                  literal: 3 @23
+                  staticType: int
+              rightBracket: ] @24
+              staticType: List<int>
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: List<int>
+''');
+  }
+
+  test_const_topLevel_untypedMap() async {
+    var library = await buildLibrary(r'''
+const v = const {0: 'aaa', 1: 'bbb', 2: 'ccc'};
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const v @6
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: Map<int, String>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SetOrMapLiteral
+              constKeyword: const @10
+              leftBracket: { @16
+              elements
+                MapLiteralEntry
+                  key: IntegerLiteral
+                    literal: 0 @17
+                    staticType: int
+                  separator: : @18
+                  value: SimpleStringLiteral
+                    literal: 'aaa' @20
+                MapLiteralEntry
+                  key: IntegerLiteral
+                    literal: 1 @27
+                    staticType: int
+                  separator: : @28
+                  value: SimpleStringLiteral
+                    literal: 'bbb' @30
+                MapLiteralEntry
+                  key: IntegerLiteral
+                    literal: 2 @37
+                    staticType: int
+                  separator: : @38
+                  value: SimpleStringLiteral
+                    literal: 'ccc' @40
+              rightBracket: } @45
+              isMap: true
+              staticType: Map<int, String>
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: Map<int, String>
+''');
+  }
+
+  test_const_topLevel_untypedSet() async {
+    var library = await buildLibrary(r'''
+const v = const {0, 1, 2};
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const v @6
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: Set<int>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SetOrMapLiteral
+              constKeyword: const @10
+              leftBracket: { @16
+              elements
+                IntegerLiteral
+                  literal: 0 @17
+                  staticType: int
+                IntegerLiteral
+                  literal: 1 @20
+                  staticType: int
+                IntegerLiteral
+                  literal: 2 @23
+                  staticType: int
+              rightBracket: } @24
+              isMap: false
+              staticType: Set<int>
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: Set<int>
+''');
+  }
+
+  test_const_typeLiteral() async {
+    var library = await buildLibrary(r'''
+const v = List<int>;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const v @6
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: Type
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            TypeLiteral
+              type: NamedType
+                name: List @10
+                typeArguments: TypeArgumentList
+                  leftBracket: < @14
+                  arguments
+                    NamedType
+                      name: int @15
+                      element: dart:core::<fragment>::@class::int
+                      type: int
+                  rightBracket: > @18
+                element: dart:core::<fragment>::@class::List
+                type: List<int>
+              staticType: Type
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: Type
+''');
+  }
+
+  test_constExpr_pushReference_enum_field() async {
+    var library = await buildLibrary('''
+enum E {a, b, c}
+final vValue = E.a;
+final vValues = E.values;
+final vIndex = E.a.index;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant a @8
+              reference: <testLibraryFragment>::@enum::E::@field::a
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            static const enumConstant b @11
+              reference: <testLibraryFragment>::@enum::E::@field::b
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            static const enumConstant c @14
+              reference: <testLibraryFragment>::@enum::E::@field::c
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: a @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::a
+                      staticType: E
+                    SimpleIdentifier
+                      token: b @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::b
+                      staticType: E
+                    SimpleIdentifier
+                      token: c @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::c
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get a @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::a
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get b @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::b
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get c @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::c
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+      topLevelVariables
+        static final vValue @23
+          reference: <testLibraryFragment>::@topLevelVariable::vValue
+          enclosingElement: <testLibraryFragment>
+          type: E
+          shouldUseTypeForInitializerInference: false
+        static final vValues @43
+          reference: <testLibraryFragment>::@topLevelVariable::vValues
+          enclosingElement: <testLibraryFragment>
+          type: List<E>
+          shouldUseTypeForInitializerInference: false
+        static final vIndex @69
+          reference: <testLibraryFragment>::@topLevelVariable::vIndex
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+      accessors
+        synthetic static get vValue @-1
+          reference: <testLibraryFragment>::@getter::vValue
+          enclosingElement: <testLibraryFragment>
+          returnType: E
+        synthetic static get vValues @-1
+          reference: <testLibraryFragment>::@getter::vValues
+          enclosingElement: <testLibraryFragment>
+          returnType: List<E>
+        synthetic static get vIndex @-1
+          reference: <testLibraryFragment>::@getter::vIndex
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_constExpr_pushReference_enum_method() async {
+    var library = await buildLibrary('''
+enum E {a}
+final vToString = E.a.toString();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant a @8
+              reference: <testLibraryFragment>::@enum::E::@field::a
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: a @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::a
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get a @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::a
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+      topLevelVariables
+        static final vToString @17
+          reference: <testLibraryFragment>::@topLevelVariable::vToString
+          enclosingElement: <testLibraryFragment>
+          type: String
+          shouldUseTypeForInitializerInference: false
+      accessors
+        synthetic static get vToString @-1
+          reference: <testLibraryFragment>::@getter::vToString
+          enclosingElement: <testLibraryFragment>
+          returnType: String
+''');
+  }
+
+  test_constExpr_pushReference_field_simpleIdentifier() async {
+    var library = await buildLibrary('''
+class C {
+  static const a = b;
+  static const b = null;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            static const a @25
+              reference: <testLibraryFragment>::@class::C::@field::a
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                SimpleIdentifier
+                  token: b @29
+                  staticElement: <testLibraryFragment>::@class::C::@getter::b
+                  staticType: dynamic
+            static const b @47
+              reference: <testLibraryFragment>::@class::C::@field::b
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                NullLiteral
+                  literal: null @51
+                  staticType: Null
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic static get a @-1
+              reference: <testLibraryFragment>::@class::C::@getter::a
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+            synthetic static get b @-1
+              reference: <testLibraryFragment>::@class::C::@getter::b
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+''');
+  }
+
+  test_constExpr_pushReference_staticMethod_simpleIdentifier() async {
+    var library = await buildLibrary('''
+class C {
+  static const a = m;
+  static m() {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            static const a @25
+              reference: <testLibraryFragment>::@class::C::@field::a
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic Function()
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                SimpleIdentifier
+                  token: m @29
+                  staticElement: <testLibraryFragment>::@class::C::@method::m
+                  staticType: dynamic Function()
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic static get a @-1
+              reference: <testLibraryFragment>::@class::C::@getter::a
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic Function()
+          methods
+            static m @41
+              reference: <testLibraryFragment>::@class::C::@method::m
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+''');
+  }
+
+  // TODO(scheglov): This is duplicate.
+  void _assertTypeStr(DartType type, String expected) {
+    var typeStr = type.getDisplayString();
+    expect(typeStr, expected);
+  }
+}
+
+@reflectiveTest
+class ConstElementTest_fromBytes extends ConstElementTest {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class ConstElementTest_keepLinking extends ConstElementTest {
+  @override
+  bool get keepLinkingLibraries => true;
+}
diff --git a/pkg/analyzer/test/src/summary/elements/default_value_test.dart b/pkg/analyzer/test/src/summary/elements/default_value_test.dart
new file mode 100644
index 0000000..af8e5a5
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/elements/default_value_test.dart
@@ -0,0 +1,954 @@
+// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../dart/resolution/node_text_expectations.dart';
+import '../elements_base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DefaultValueElementTest_keepLinking);
+    defineReflectiveTests(DefaultValueElementTest_fromBytes);
+    defineReflectiveTests(UpdateNodeTextExpectations);
+  });
+}
+
+abstract class DefaultValueElementTest extends ElementsBaseTest {
+  test_defaultValue_eliminateTypeParameters() async {
+    var library = await buildLibrary('''
+class A<T> {
+  const X({List<T> a = const []});
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          methods
+            abstract X @21
+              reference: <testLibraryFragment>::@class::A::@method::X
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                optionalNamed default a @32
+                  reference: <testLibraryFragment>::@class::A::@method::X::@parameter::a
+                  type: List<T>
+                  constantInitializer
+                    ListLiteral
+                      constKeyword: const @36
+                      leftBracket: [ @42
+                      rightBracket: ] @43
+                      staticType: List<Never>
+              returnType: dynamic
+''');
+  }
+
+  test_defaultValue_genericFunction() async {
+    var library = await buildLibrary('''
+typedef void F<T>(T v);
+
+void defaultF<T>(T v) {}
+
+class X {
+  final F f;
+  const X({this.f: defaultF});
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class X @57
+          reference: <testLibraryFragment>::@class::X
+          enclosingElement: <testLibraryFragment>
+          fields
+            final f @71
+              reference: <testLibraryFragment>::@class::X::@field::f
+              enclosingElement: <testLibraryFragment>::@class::X
+              type: void Function(dynamic)
+                alias: <testLibraryFragment>::@typeAlias::F
+                  typeArguments
+                    dynamic
+          constructors
+            const @82
+              reference: <testLibraryFragment>::@class::X::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::X
+              parameters
+                optionalNamed default final this.f @90
+                  reference: <testLibraryFragment>::@class::X::@constructor::new::@parameter::f
+                  type: void Function(dynamic)
+                    alias: <testLibraryFragment>::@typeAlias::F
+                      typeArguments
+                        dynamic
+                  constantInitializer
+                    FunctionReference
+                      function: SimpleIdentifier
+                        token: defaultF @93
+                        staticElement: <testLibraryFragment>::@function::defaultF
+                        staticType: void Function<T>(T)
+                      staticType: void Function(dynamic)
+                      typeArgumentTypes
+                        dynamic
+                  field: <testLibraryFragment>::@class::X::@field::f
+          accessors
+            synthetic get f @-1
+              reference: <testLibraryFragment>::@class::X::@getter::f
+              enclosingElement: <testLibraryFragment>::@class::X
+              returnType: void Function(dynamic)
+                alias: <testLibraryFragment>::@typeAlias::F
+                  typeArguments
+                    dynamic
+      typeAliases
+        functionTypeAliasBased F @13
+          reference: <testLibraryFragment>::@typeAlias::F
+          typeParameters
+            contravariant T @15
+              defaultType: dynamic
+          aliasedType: void Function(T)
+          aliasedElement: GenericFunctionTypeElement
+            parameters
+              requiredPositional v @20
+                type: T
+            returnType: void
+      functions
+        defaultF @30
+          reference: <testLibraryFragment>::@function::defaultF
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @39
+              defaultType: dynamic
+          parameters
+            requiredPositional v @44
+              type: T
+          returnType: void
+''');
+  }
+
+  test_defaultValue_genericFunctionType() async {
+    var library = await buildLibrary('''
+class A<T> {
+  const A();
+}
+class B {
+  void foo({a: const A<Function()>()}) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            const @21
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class B @34
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+          methods
+            foo @45
+              reference: <testLibraryFragment>::@class::B::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                optionalNamed default a @50
+                  reference: <testLibraryFragment>::@class::B::@method::foo::@parameter::a
+                  type: dynamic
+                  constantInitializer
+                    InstanceCreationExpression
+                      keyword: const @53
+                      constructorName: ConstructorName
+                        type: NamedType
+                          name: A @59
+                          typeArguments: TypeArgumentList
+                            leftBracket: < @60
+                            arguments
+                              GenericFunctionType
+                                functionKeyword: Function @61
+                                parameters: FormalParameterList
+                                  leftParenthesis: ( @69
+                                  rightParenthesis: ) @70
+                                declaredElement: GenericFunctionTypeElement
+                                  parameters
+                                  returnType: dynamic
+                                  type: dynamic Function()
+                                type: dynamic Function()
+                            rightBracket: > @71
+                          element: <testLibraryFragment>::@class::A
+                          type: A<dynamic Function()>
+                        staticElement: ConstructorMember
+                          base: <testLibraryFragment>::@class::A::@constructor::new
+                          substitution: {T: dynamic Function()}
+                      argumentList: ArgumentList
+                        leftParenthesis: ( @72
+                        rightParenthesis: ) @73
+                      staticType: A<dynamic Function()>
+              returnType: void
+''');
+  }
+
+  test_defaultValue_inFunctionTypedFormalParameter() async {
+    var library = await buildLibrary('''
+void f( g({a: 0 is int}) ) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        f @5
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional g @8
+              type: dynamic Function({dynamic a})
+              parameters
+                optionalNamed a @11
+                  type: dynamic
+          returnType: void
+''');
+  }
+
+  test_defaultValue_methodMember() async {
+    var library = await buildLibrary('''
+void f([Comparator<T> compare = Comparable.compare]) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        f @5
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          parameters
+            optionalPositional default compare @22
+              type: int Function(InvalidType, InvalidType)
+                alias: dart:core::<fragment>::@typeAlias::Comparator
+                  typeArguments
+                    InvalidType
+              constantInitializer
+                PrefixedIdentifier
+                  prefix: SimpleIdentifier
+                    token: Comparable @32
+                    staticElement: dart:core::<fragment>::@class::Comparable
+                    staticType: null
+                  period: . @42
+                  identifier: SimpleIdentifier
+                    token: compare @43
+                    staticElement: dart:core::<fragment>::@class::Comparable::@method::compare
+                    staticType: int Function(Comparable<dynamic>, Comparable<dynamic>)
+                  staticElement: dart:core::<fragment>::@class::Comparable::@method::compare
+                  staticType: int Function(Comparable<dynamic>, Comparable<dynamic>)
+          returnType: void
+''');
+  }
+
+  test_defaultValue_recordLiteral_named() async {
+    var library = await buildLibrary('''
+void f({({int f1, bool f2}) x = (f1: 1, f2: true)}) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        f @5
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          parameters
+            optionalNamed default x @28
+              reference: <testLibraryFragment>::@function::f::@parameter::x
+              type: ({int f1, bool f2})
+              constantInitializer
+                RecordLiteral
+                  leftParenthesis: ( @32
+                  fields
+                    NamedExpression
+                      name: Label
+                        label: SimpleIdentifier
+                          token: f1 @33
+                          staticElement: <null>
+                          staticType: null
+                        colon: : @35
+                      expression: IntegerLiteral
+                        literal: 1 @37
+                        staticType: int
+                    NamedExpression
+                      name: Label
+                        label: SimpleIdentifier
+                          token: f2 @40
+                          staticElement: <null>
+                          staticType: null
+                        colon: : @42
+                      expression: BooleanLiteral
+                        literal: true @44
+                        staticType: bool
+                  rightParenthesis: ) @48
+                  staticType: ({int f1, bool f2})
+          returnType: void
+''');
+  }
+
+  test_defaultValue_recordLiteral_named_const() async {
+    var library = await buildLibrary('''
+void f({({int f1, bool f2}) x = const (f1: 1, f2: true)}) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        f @5
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          parameters
+            optionalNamed default x @28
+              reference: <testLibraryFragment>::@function::f::@parameter::x
+              type: ({int f1, bool f2})
+              constantInitializer
+                RecordLiteral
+                  constKeyword: const @32
+                  leftParenthesis: ( @38
+                  fields
+                    NamedExpression
+                      name: Label
+                        label: SimpleIdentifier
+                          token: f1 @39
+                          staticElement: <null>
+                          staticType: null
+                        colon: : @41
+                      expression: IntegerLiteral
+                        literal: 1 @43
+                        staticType: int
+                    NamedExpression
+                      name: Label
+                        label: SimpleIdentifier
+                          token: f2 @46
+                          staticElement: <null>
+                          staticType: null
+                        colon: : @48
+                      expression: BooleanLiteral
+                        literal: true @50
+                        staticType: bool
+                  rightParenthesis: ) @54
+                  staticType: ({int f1, bool f2})
+          returnType: void
+''');
+  }
+
+  test_defaultValue_recordLiteral_positional() async {
+    var library = await buildLibrary('''
+void f({(int, bool) x = (1, true)}) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        f @5
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          parameters
+            optionalNamed default x @20
+              reference: <testLibraryFragment>::@function::f::@parameter::x
+              type: (int, bool)
+              constantInitializer
+                RecordLiteral
+                  leftParenthesis: ( @24
+                  fields
+                    IntegerLiteral
+                      literal: 1 @25
+                      staticType: int
+                    BooleanLiteral
+                      literal: true @28
+                      staticType: bool
+                  rightParenthesis: ) @32
+                  staticType: (int, bool)
+          returnType: void
+''');
+  }
+
+  void test_defaultValue_recordLiteral_positional_const() async {
+    var library = await buildLibrary('''
+void f({(int, bool) x = const (1, true)}) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        f @5
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          parameters
+            optionalNamed default x @20
+              reference: <testLibraryFragment>::@function::f::@parameter::x
+              type: (int, bool)
+              constantInitializer
+                RecordLiteral
+                  constKeyword: const @24
+                  leftParenthesis: ( @30
+                  fields
+                    IntegerLiteral
+                      literal: 1 @31
+                      staticType: int
+                    BooleanLiteral
+                      literal: true @34
+                      staticType: bool
+                  rightParenthesis: ) @38
+                  staticType: (int, bool)
+          returnType: void
+''');
+  }
+
+  test_defaultValue_refersToExtension_method_inside() async {
+    var library = await buildLibrary('''
+class A {}
+extension E on A {
+  static void f() {}
+  static void g([Object p = f]) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+      extensions
+        E @21
+          reference: <testLibraryFragment>::@extension::E
+          enclosingElement: <testLibraryFragment>
+          extendedType: A
+          methods
+            static f @44
+              reference: <testLibraryFragment>::@extension::E::@method::f
+              enclosingElement: <testLibraryFragment>::@extension::E
+              returnType: void
+            static g @65
+              reference: <testLibraryFragment>::@extension::E::@method::g
+              enclosingElement: <testLibraryFragment>::@extension::E
+              parameters
+                optionalPositional default p @75
+                  type: Object
+                  constantInitializer
+                    SimpleIdentifier
+                      token: f @79
+                      staticElement: <testLibraryFragment>::@extension::E::@method::f
+                      staticType: void Function()
+              returnType: void
+''');
+  }
+
+  test_defaultValue_refersToGenericClass() async {
+    var library = await buildLibrary('''
+class B<T1, T2> {
+  const B();
+}
+class C {
+  void foo([B<int, double> b = const B()]) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class B @6
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T1 @8
+              defaultType: dynamic
+            covariant T2 @12
+              defaultType: dynamic
+          constructors
+            const @26
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+        class C @39
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            foo @50
+              reference: <testLibraryFragment>::@class::C::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                optionalPositional default b @70
+                  type: B<int, double>
+                  constantInitializer
+                    InstanceCreationExpression
+                      keyword: const @74
+                      constructorName: ConstructorName
+                        type: NamedType
+                          name: B @80
+                          element: <testLibraryFragment>::@class::B
+                          type: B<int, double>
+                        staticElement: ConstructorMember
+                          base: <testLibraryFragment>::@class::B::@constructor::new
+                          substitution: {T1: int, T2: double}
+                      argumentList: ArgumentList
+                        leftParenthesis: ( @81
+                        rightParenthesis: ) @82
+                      staticType: B<int, double>
+              returnType: void
+''');
+  }
+
+  test_defaultValue_refersToGenericClass_constructor() async {
+    var library = await buildLibrary('''
+class B<T> {
+  const B();
+}
+class C<T> {
+  const C([B<T> b = const B()]);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class B @6
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            const @21
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+        class C @34
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @36
+              defaultType: dynamic
+          constructors
+            const @49
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                optionalPositional default b @57
+                  type: B<T>
+                  constantInitializer
+                    InstanceCreationExpression
+                      keyword: const @61
+                      constructorName: ConstructorName
+                        type: NamedType
+                          name: B @67
+                          element: <testLibraryFragment>::@class::B
+                          type: B<Never>
+                        staticElement: ConstructorMember
+                          base: <testLibraryFragment>::@class::B::@constructor::new
+                          substitution: {T: Never}
+                      argumentList: ArgumentList
+                        leftParenthesis: ( @68
+                        rightParenthesis: ) @69
+                      staticType: B<Never>
+''');
+  }
+
+  test_defaultValue_refersToGenericClass_constructor2() async {
+    var library = await buildLibrary('''
+abstract class A<T> {}
+class B<T> implements A<T> {
+  const B();
+}
+class C<T> implements A<Iterable<T>> {
+  const C([A<T> a = const B()]);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        abstract class A @15
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @17
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class B @29
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @31
+              defaultType: dynamic
+          interfaces
+            A<T>
+          constructors
+            const @60
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+        class C @73
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @75
+              defaultType: dynamic
+          interfaces
+            A<Iterable<T>>
+          constructors
+            const @114
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                optionalPositional default a @122
+                  type: A<T>
+                  constantInitializer
+                    InstanceCreationExpression
+                      keyword: const @126
+                      constructorName: ConstructorName
+                        type: NamedType
+                          name: B @132
+                          element: <testLibraryFragment>::@class::B
+                          type: B<Never>
+                        staticElement: ConstructorMember
+                          base: <testLibraryFragment>::@class::B::@constructor::new
+                          substitution: {T: Never}
+                      argumentList: ArgumentList
+                        leftParenthesis: ( @133
+                        rightParenthesis: ) @134
+                      staticType: B<Never>
+''');
+  }
+
+  test_defaultValue_refersToGenericClass_functionG() async {
+    var library = await buildLibrary('''
+class B<T> {
+  const B();
+}
+void foo<T>([B<T> b = const B()]) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class B @6
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            const @21
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+      functions
+        foo @33
+          reference: <testLibraryFragment>::@function::foo
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @37
+              defaultType: dynamic
+          parameters
+            optionalPositional default b @46
+              type: B<T>
+              constantInitializer
+                InstanceCreationExpression
+                  keyword: const @50
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: B @56
+                      element: <testLibraryFragment>::@class::B
+                      type: B<Never>
+                    staticElement: ConstructorMember
+                      base: <testLibraryFragment>::@class::B::@constructor::new
+                      substitution: {T: Never}
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @57
+                    rightParenthesis: ) @58
+                  staticType: B<Never>
+          returnType: void
+''');
+  }
+
+  test_defaultValue_refersToGenericClass_methodG() async {
+    var library = await buildLibrary('''
+class B<T> {
+  const B();
+}
+class C {
+  void foo<T>([B<T> b = const B()]) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class B @6
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            const @21
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+        class C @34
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            foo @45
+              reference: <testLibraryFragment>::@class::C::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              typeParameters
+                covariant T @49
+                  defaultType: dynamic
+              parameters
+                optionalPositional default b @58
+                  type: B<T>
+                  constantInitializer
+                    InstanceCreationExpression
+                      keyword: const @62
+                      constructorName: ConstructorName
+                        type: NamedType
+                          name: B @68
+                          element: <testLibraryFragment>::@class::B
+                          type: B<Never>
+                        staticElement: ConstructorMember
+                          base: <testLibraryFragment>::@class::B::@constructor::new
+                          substitution: {T: Never}
+                      argumentList: ArgumentList
+                        leftParenthesis: ( @69
+                        rightParenthesis: ) @70
+                      staticType: B<Never>
+              returnType: void
+''');
+  }
+
+  test_defaultValue_refersToGenericClass_methodG_classG() async {
+    var library = await buildLibrary('''
+class B<T1, T2> {
+  const B();
+}
+class C<E1> {
+  void foo<E2>([B<E1, E2> b = const B()]) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class B @6
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T1 @8
+              defaultType: dynamic
+            covariant T2 @12
+              defaultType: dynamic
+          constructors
+            const @26
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+        class C @39
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant E1 @41
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            foo @54
+              reference: <testLibraryFragment>::@class::C::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              typeParameters
+                covariant E2 @58
+                  defaultType: dynamic
+              parameters
+                optionalPositional default b @73
+                  type: B<E1, E2>
+                  constantInitializer
+                    InstanceCreationExpression
+                      keyword: const @77
+                      constructorName: ConstructorName
+                        type: NamedType
+                          name: B @83
+                          element: <testLibraryFragment>::@class::B
+                          type: B<Never, Never>
+                        staticElement: ConstructorMember
+                          base: <testLibraryFragment>::@class::B::@constructor::new
+                          substitution: {T1: Never, T2: Never}
+                      argumentList: ArgumentList
+                        leftParenthesis: ( @84
+                        rightParenthesis: ) @85
+                      staticType: B<Never, Never>
+              returnType: void
+''');
+  }
+
+  test_defaultValue_refersToGenericClass_methodNG() async {
+    var library = await buildLibrary('''
+class B<T> {
+  const B();
+}
+class C<T> {
+  void foo([B<T> b = const B()]) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class B @6
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            const @21
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+        class C @34
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @36
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            foo @48
+              reference: <testLibraryFragment>::@class::C::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                optionalPositional default b @58
+                  type: B<T>
+                  constantInitializer
+                    InstanceCreationExpression
+                      keyword: const @62
+                      constructorName: ConstructorName
+                        type: NamedType
+                          name: B @68
+                          element: <testLibraryFragment>::@class::B
+                          type: B<Never>
+                        staticElement: ConstructorMember
+                          base: <testLibraryFragment>::@class::B::@constructor::new
+                          substitution: {T: Never}
+                      argumentList: ArgumentList
+                        leftParenthesis: ( @69
+                        rightParenthesis: ) @70
+                      staticType: B<Never>
+              returnType: void
+''');
+  }
+}
+
+@reflectiveTest
+class DefaultValueElementTest_fromBytes extends DefaultValueElementTest {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class DefaultValueElementTest_keepLinking extends DefaultValueElementTest {
+  @override
+  bool get keepLinkingLibraries => true;
+}
diff --git a/pkg/analyzer/test/src/summary/elements/duplicate_declaration_test.dart b/pkg/analyzer/test/src/summary/elements/duplicate_declaration_test.dart
new file mode 100644
index 0000000..dd2b41a
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/elements/duplicate_declaration_test.dart
@@ -0,0 +1,1064 @@
+// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../dart/resolution/node_text_expectations.dart';
+import '../elements_base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DuplicateDeclarationElementTest_keepLinking);
+    defineReflectiveTests(DuplicateDeclarationElementTest_fromBytes);
+    defineReflectiveTests(UpdateNodeTextExpectations);
+  });
+}
+
+abstract class DuplicateDeclarationElementTest extends ElementsBaseTest {
+  test_duplicateDeclaration_class() async {
+    var library = await buildLibrary(r'''
+class A {
+  static const f01 = 0;
+  static const f02 = f01;
+}
+
+class A {
+  static const f11 = 0;
+  static const f12 = f11;
+}
+
+class A {
+  static const f21 = 0;
+  static const f22 = f21;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A::@def::0
+          enclosingElement: <testLibraryFragment>
+          fields
+            static const f01 @25
+              reference: <testLibraryFragment>::@class::A::@def::0::@field::f01
+              enclosingElement: <testLibraryFragment>::@class::A::@def::0
+              type: int
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                IntegerLiteral
+                  literal: 0 @31
+                  staticType: int
+            static const f02 @49
+              reference: <testLibraryFragment>::@class::A::@def::0::@field::f02
+              enclosingElement: <testLibraryFragment>::@class::A::@def::0
+              type: int
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                SimpleIdentifier
+                  token: f01 @55
+                  staticElement: <testLibraryFragment>::@class::A::@def::0::@getter::f01
+                  staticType: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@def::0::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A::@def::0
+          accessors
+            synthetic static get f01 @-1
+              reference: <testLibraryFragment>::@class::A::@def::0::@getter::f01
+              enclosingElement: <testLibraryFragment>::@class::A::@def::0
+              returnType: int
+            synthetic static get f02 @-1
+              reference: <testLibraryFragment>::@class::A::@def::0::@getter::f02
+              enclosingElement: <testLibraryFragment>::@class::A::@def::0
+              returnType: int
+        class A @69
+          reference: <testLibraryFragment>::@class::A::@def::1
+          enclosingElement: <testLibraryFragment>
+          fields
+            static const f11 @88
+              reference: <testLibraryFragment>::@class::A::@def::1::@field::f11
+              enclosingElement: <testLibraryFragment>::@class::A::@def::1
+              type: int
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                IntegerLiteral
+                  literal: 0 @94
+                  staticType: int
+            static const f12 @112
+              reference: <testLibraryFragment>::@class::A::@def::1::@field::f12
+              enclosingElement: <testLibraryFragment>::@class::A::@def::1
+              type: int
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                SimpleIdentifier
+                  token: f11 @118
+                  staticElement: <testLibraryFragment>::@class::A::@def::1::@getter::f11
+                  staticType: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@def::1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A::@def::1
+          accessors
+            synthetic static get f11 @-1
+              reference: <testLibraryFragment>::@class::A::@def::1::@getter::f11
+              enclosingElement: <testLibraryFragment>::@class::A::@def::1
+              returnType: int
+            synthetic static get f12 @-1
+              reference: <testLibraryFragment>::@class::A::@def::1::@getter::f12
+              enclosingElement: <testLibraryFragment>::@class::A::@def::1
+              returnType: int
+        class A @132
+          reference: <testLibraryFragment>::@class::A::@def::2
+          enclosingElement: <testLibraryFragment>
+          fields
+            static const f21 @151
+              reference: <testLibraryFragment>::@class::A::@def::2::@field::f21
+              enclosingElement: <testLibraryFragment>::@class::A::@def::2
+              type: int
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                IntegerLiteral
+                  literal: 0 @157
+                  staticType: int
+            static const f22 @175
+              reference: <testLibraryFragment>::@class::A::@def::2::@field::f22
+              enclosingElement: <testLibraryFragment>::@class::A::@def::2
+              type: int
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                SimpleIdentifier
+                  token: f21 @181
+                  staticElement: <testLibraryFragment>::@class::A::@def::2::@getter::f21
+                  staticType: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@def::2::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A::@def::2
+          accessors
+            synthetic static get f21 @-1
+              reference: <testLibraryFragment>::@class::A::@def::2::@getter::f21
+              enclosingElement: <testLibraryFragment>::@class::A::@def::2
+              returnType: int
+            synthetic static get f22 @-1
+              reference: <testLibraryFragment>::@class::A::@def::2::@getter::f22
+              enclosingElement: <testLibraryFragment>::@class::A::@def::2
+              returnType: int
+''');
+  }
+
+  test_duplicateDeclaration_class_constructor_unnamed() async {
+    var library = await buildLibrary(r'''
+class A {
+  A.named();
+  A.named();
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            named @14
+              reference: <testLibraryFragment>::@class::A::@constructor::named::@def::0
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 13
+              nameEnd: 19
+            named @27
+              reference: <testLibraryFragment>::@class::A::@constructor::named::@def::1
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 26
+              nameEnd: 32
+''');
+  }
+
+  test_duplicateDeclaration_class_field() async {
+    var library = await buildLibrary(r'''
+class A {
+  int foo;
+  double foo;
+}
+''');
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            foo @16
+              reference: <testLibraryFragment>::@class::A::@field::foo::@def::0
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+            foo @30
+              reference: <testLibraryFragment>::@class::A::@field::foo::@def::1
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: double
+              id: field_1
+              getter: getter_1
+              setter: setter_1
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::A::@getter::foo::@def::0
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@class::A::@setter::foo::@def::0
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::A::@getter::foo::@def::1
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: double
+              id: getter_1
+              variable: field_1
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@class::A::@setter::foo::@def::1
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _foo @-1
+                  type: double
+              returnType: void
+              id: setter_1
+              variable: field_1
+''');
+  }
+
+  test_duplicateDeclaration_class_method() async {
+    var library = await buildLibrary(r'''
+class A {
+  void foo() {}
+  void foo() {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          methods
+            foo @17
+              reference: <testLibraryFragment>::@class::A::@method::foo::@def::0
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: void
+            foo @33
+              reference: <testLibraryFragment>::@class::A::@method::foo::@def::1
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: void
+''');
+  }
+
+  test_duplicateDeclaration_classTypeAlias() async {
+    var library = await buildLibrary(r'''
+class A {}
+class B {}
+class X = A with M;
+class X = B with M;
+mixin M {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class B @17
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+        class alias X @28
+          reference: <testLibraryFragment>::@class::X::@def::0
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          mixins
+            M
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::X::@def::0::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::X::@def::0
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::A::@constructor::new
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+        class alias X @48
+          reference: <testLibraryFragment>::@class::X::@def::1
+          enclosingElement: <testLibraryFragment>
+          supertype: B
+          mixins
+            M
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::X::@def::1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::X::@def::1
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::B::@constructor::new
+              superConstructor: <testLibraryFragment>::@class::B::@constructor::new
+      mixins
+        mixin M @68
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_duplicateDeclaration_enum() async {
+    var library = await buildLibrary(r'''
+enum E {a, b}
+enum E {c, d, e}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E::@def::0
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant a @8
+              reference: <testLibraryFragment>::@enum::E::@def::0::@field::a
+              enclosingElement: <testLibraryFragment>::@enum::E::@def::0
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E::@def::0
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@def::0::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            static const enumConstant b @11
+              reference: <testLibraryFragment>::@enum::E::@def::0::@field::b
+              enclosingElement: <testLibraryFragment>::@enum::E::@def::0
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E::@def::0
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@def::0::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@def::0::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E::@def::0
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: a @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@def::0::@getter::a
+                      staticType: E
+                    SimpleIdentifier
+                      token: b @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@def::0::@getter::b
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@def::0::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E::@def::0
+          accessors
+            synthetic static get a @-1
+              reference: <testLibraryFragment>::@enum::E::@def::0::@getter::a
+              enclosingElement: <testLibraryFragment>::@enum::E::@def::0
+              returnType: E
+            synthetic static get b @-1
+              reference: <testLibraryFragment>::@enum::E::@def::0::@getter::b
+              enclosingElement: <testLibraryFragment>::@enum::E::@def::0
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@def::0::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E::@def::0
+              returnType: List<E>
+        enum E @19
+          reference: <testLibraryFragment>::@enum::E::@def::1
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant c @22
+              reference: <testLibraryFragment>::@enum::E::@def::1::@field::c
+              enclosingElement: <testLibraryFragment>::@enum::E::@def::1
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E::@def::0
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@def::0::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            static const enumConstant d @25
+              reference: <testLibraryFragment>::@enum::E::@def::1::@field::d
+              enclosingElement: <testLibraryFragment>::@enum::E::@def::1
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E::@def::0
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@def::0::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            static const enumConstant e @28
+              reference: <testLibraryFragment>::@enum::E::@def::1::@field::e
+              enclosingElement: <testLibraryFragment>::@enum::E::@def::1
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E::@def::0
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@def::0::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@def::1::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E::@def::1
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: c @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@def::1::@getter::c
+                      staticType: E
+                    SimpleIdentifier
+                      token: d @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@def::1::@getter::d
+                      staticType: E
+                    SimpleIdentifier
+                      token: e @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@def::1::@getter::e
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@def::1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E::@def::1
+          accessors
+            synthetic static get c @-1
+              reference: <testLibraryFragment>::@enum::E::@def::1::@getter::c
+              enclosingElement: <testLibraryFragment>::@enum::E::@def::1
+              returnType: E
+            synthetic static get d @-1
+              reference: <testLibraryFragment>::@enum::E::@def::1::@getter::d
+              enclosingElement: <testLibraryFragment>::@enum::E::@def::1
+              returnType: E
+            synthetic static get e @-1
+              reference: <testLibraryFragment>::@enum::E::@def::1::@getter::e
+              enclosingElement: <testLibraryFragment>::@enum::E::@def::1
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@def::1::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E::@def::1
+              returnType: List<E>
+''');
+  }
+
+  test_duplicateDeclaration_extension() async {
+    var library = await buildLibrary(r'''
+extension E on int {}
+extension E on int {
+  static var x;
+}
+extension E on int {
+  static var y = 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        E @10
+          reference: <testLibraryFragment>::@extension::E::@def::0
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+        E @32
+          reference: <testLibraryFragment>::@extension::E::@def::1
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          fields
+            static x @56
+              reference: <testLibraryFragment>::@extension::E::@def::1::@field::x
+              enclosingElement: <testLibraryFragment>::@extension::E::@def::1
+              type: dynamic
+          accessors
+            synthetic static get x @-1
+              reference: <testLibraryFragment>::@extension::E::@def::1::@getter::x
+              enclosingElement: <testLibraryFragment>::@extension::E::@def::1
+              returnType: dynamic
+            synthetic static set x= @-1
+              reference: <testLibraryFragment>::@extension::E::@def::1::@setter::x
+              enclosingElement: <testLibraryFragment>::@extension::E::@def::1
+              parameters
+                requiredPositional _x @-1
+                  type: dynamic
+              returnType: void
+        E @71
+          reference: <testLibraryFragment>::@extension::E::@def::2
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          fields
+            static y @95
+              reference: <testLibraryFragment>::@extension::E::@def::2::@field::y
+              enclosingElement: <testLibraryFragment>::@extension::E::@def::2
+              type: int
+              shouldUseTypeForInitializerInference: false
+          accessors
+            synthetic static get y @-1
+              reference: <testLibraryFragment>::@extension::E::@def::2::@getter::y
+              enclosingElement: <testLibraryFragment>::@extension::E::@def::2
+              returnType: int
+            synthetic static set y= @-1
+              reference: <testLibraryFragment>::@extension::E::@def::2::@setter::y
+              enclosingElement: <testLibraryFragment>::@extension::E::@def::2
+              parameters
+                requiredPositional _y @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_duplicateDeclaration_extensionType() async {
+    var library = await buildLibrary(r'''
+extension type E(int it) {}
+extension type E(double it) {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        E @15
+          reference: <testLibraryFragment>::@extensionType::E::@def::0
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::E::@def::0::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::E::@def::0::@constructor::new
+          typeErasure: int
+          fields
+            final it @21
+              reference: <testLibraryFragment>::@extensionType::E::@def::0::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::E::@def::0
+              type: int
+          constructors
+            @15
+              reference: <testLibraryFragment>::@extensionType::E::@def::0::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::E::@def::0
+              parameters
+                requiredPositional final this.it @21
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::E::@def::0::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::E::@def::0::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::E::@def::0
+              returnType: int
+        E @43
+          reference: <testLibraryFragment>::@extensionType::E::@def::1
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::E::@def::1::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::E::@def::1::@constructor::new
+          typeErasure: double
+          fields
+            final it @52
+              reference: <testLibraryFragment>::@extensionType::E::@def::1::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::E::@def::1
+              type: double
+          constructors
+            @43
+              reference: <testLibraryFragment>::@extensionType::E::@def::1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::E::@def::1
+              parameters
+                requiredPositional final this.it @52
+                  type: double
+                  field: <testLibraryFragment>::@extensionType::E::@def::1::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::E::@def::1::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::E::@def::1
+              returnType: double
+''');
+  }
+
+  test_duplicateDeclaration_function() async {
+    var library = await buildLibrary(r'''
+void f() {}
+void f(int a) {}
+void f([int b, double c]) {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        f @5
+          reference: <testLibraryFragment>::@function::f::@def::0
+          enclosingElement: <testLibraryFragment>
+          returnType: void
+        f @17
+          reference: <testLibraryFragment>::@function::f::@def::1
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional a @23
+              type: int
+          returnType: void
+        f @34
+          reference: <testLibraryFragment>::@function::f::@def::2
+          enclosingElement: <testLibraryFragment>
+          parameters
+            optionalPositional default b @41
+              type: int
+            optionalPositional default c @51
+              type: double
+          returnType: void
+''');
+  }
+
+  test_duplicateDeclaration_function_namedParameter() async {
+    var library = await buildLibrary(r'''
+void f({int a, double a}) {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        f @5
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          parameters
+            optionalNamed default a @12
+              reference: <testLibraryFragment>::@function::f::@parameter::a::@def::0
+              type: int
+            optionalNamed default a @22
+              reference: <testLibraryFragment>::@function::f::@parameter::a::@def::1
+              type: double
+          returnType: void
+''');
+  }
+
+  test_duplicateDeclaration_functionTypeAlias() async {
+    var library = await buildLibrary(r'''
+typedef void F();
+typedef void F(int a);
+typedef void F([int b, double c]);
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      typeAliases
+        functionTypeAliasBased F @13
+          reference: <testLibraryFragment>::@typeAlias::F::@def::0
+          aliasedType: void Function()
+          aliasedElement: GenericFunctionTypeElement
+            returnType: void
+        functionTypeAliasBased F @31
+          reference: <testLibraryFragment>::@typeAlias::F::@def::1
+          aliasedType: void Function(int)
+          aliasedElement: GenericFunctionTypeElement
+            parameters
+              requiredPositional a @37
+                type: int
+            returnType: void
+        functionTypeAliasBased F @54
+          reference: <testLibraryFragment>::@typeAlias::F::@def::2
+          aliasedType: void Function([int, double])
+          aliasedElement: GenericFunctionTypeElement
+            parameters
+              optionalPositional b @61
+                type: int
+              optionalPositional c @71
+                type: double
+            returnType: void
+''');
+  }
+
+  test_duplicateDeclaration_mixin() async {
+    var library = await buildLibrary(r'''
+mixin A {}
+mixin A {
+  var x;
+}
+mixin A {
+  var y = 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @6
+          reference: <testLibraryFragment>::@mixin::A::@def::0
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+        mixin A @17
+          reference: <testLibraryFragment>::@mixin::A::@def::1
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+          fields
+            x @27
+              reference: <testLibraryFragment>::@mixin::A::@def::1::@field::x
+              enclosingElement: <testLibraryFragment>::@mixin::A::@def::1
+              type: dynamic
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@mixin::A::@def::1::@getter::x
+              enclosingElement: <testLibraryFragment>::@mixin::A::@def::1
+              returnType: dynamic
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@mixin::A::@def::1::@setter::x
+              enclosingElement: <testLibraryFragment>::@mixin::A::@def::1
+              parameters
+                requiredPositional _x @-1
+                  type: dynamic
+              returnType: void
+        mixin A @38
+          reference: <testLibraryFragment>::@mixin::A::@def::2
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+          fields
+            y @48
+              reference: <testLibraryFragment>::@mixin::A::@def::2::@field::y
+              enclosingElement: <testLibraryFragment>::@mixin::A::@def::2
+              type: int
+              shouldUseTypeForInitializerInference: false
+          accessors
+            synthetic get y @-1
+              reference: <testLibraryFragment>::@mixin::A::@def::2::@getter::y
+              enclosingElement: <testLibraryFragment>::@mixin::A::@def::2
+              returnType: int
+            synthetic set y= @-1
+              reference: <testLibraryFragment>::@mixin::A::@def::2::@setter::y
+              enclosingElement: <testLibraryFragment>::@mixin::A::@def::2
+              parameters
+                requiredPositional _y @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_duplicateDeclaration_topLevelVariable() async {
+    var library = await buildLibrary(r'''
+bool x;
+var x;
+final x = 1;
+var x = 2.3;
+''');
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static x @5
+          reference: <testLibraryFragment>::@topLevelVariable::x::@def::0
+          enclosingElement: <testLibraryFragment>
+          type: bool
+          id: variable_0
+          getter: getter_0
+          setter: setter_0
+        static x @12
+          reference: <testLibraryFragment>::@topLevelVariable::x::@def::1
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          id: variable_1
+          getter: getter_1
+          setter: setter_1
+        static final x @21
+          reference: <testLibraryFragment>::@topLevelVariable::x::@def::2
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          id: variable_2
+          getter: getter_2
+        static x @32
+          reference: <testLibraryFragment>::@topLevelVariable::x::@def::3
+          enclosingElement: <testLibraryFragment>
+          type: double
+          shouldUseTypeForInitializerInference: false
+          id: variable_3
+          getter: getter_3
+          setter: setter_2
+      accessors
+        synthetic static get x @-1
+          reference: <testLibraryFragment>::@getter::x::@def::0
+          enclosingElement: <testLibraryFragment>
+          returnType: bool
+          id: getter_0
+          variable: variable_0
+        synthetic static set x= @-1
+          reference: <testLibraryFragment>::@setter::x::@def::0
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _x @-1
+              type: bool
+          returnType: void
+          id: setter_0
+          variable: variable_0
+        synthetic static get x @-1
+          reference: <testLibraryFragment>::@getter::x::@def::1
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+          id: getter_1
+          variable: variable_1
+        synthetic static set x= @-1
+          reference: <testLibraryFragment>::@setter::x::@def::1
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _x @-1
+              type: dynamic
+          returnType: void
+          id: setter_1
+          variable: variable_1
+        synthetic static get x @-1
+          reference: <testLibraryFragment>::@getter::x::@def::2
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+          id: getter_2
+          variable: variable_2
+        synthetic static get x @-1
+          reference: <testLibraryFragment>::@getter::x::@def::3
+          enclosingElement: <testLibraryFragment>
+          returnType: double
+          id: getter_3
+          variable: variable_3
+        synthetic static set x= @-1
+          reference: <testLibraryFragment>::@setter::x::@def::2
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _x @-1
+              type: double
+          returnType: void
+          id: setter_2
+          variable: variable_3
+''');
+  }
+
+  test_duplicateDeclaration_unit_getter() async {
+    var library = await buildLibrary(r'''
+int get foo {}
+double get foo {}
+''');
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        synthetic static foo @-1
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: double
+          id: variable_0
+          getter: getter_0
+      accessors
+        static get foo @8
+          reference: <testLibraryFragment>::@getter::foo::@def::0
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+          id: getter_1
+          variable: variable_0
+        static get foo @26
+          reference: <testLibraryFragment>::@getter::foo::@def::1
+          enclosingElement: <testLibraryFragment>
+          returnType: double
+          id: getter_0
+          variable: variable_0
+''');
+  }
+
+  test_duplicateDeclaration_unit_setter() async {
+    var library = await buildLibrary(r'''
+set foo(int _) {}
+set foo(double _) {}
+''');
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        synthetic static foo @-1
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: double
+          id: variable_0
+          setter: setter_0
+      accessors
+        static set foo= @4
+          reference: <testLibraryFragment>::@setter::foo::@def::0
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _ @12
+              type: int
+          returnType: void
+          id: setter_1
+          variable: variable_0
+        static set foo= @22
+          reference: <testLibraryFragment>::@setter::foo::@def::1
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _ @33
+              type: double
+          returnType: void
+          id: setter_0
+          variable: variable_0
+''');
+  }
+}
+
+@reflectiveTest
+class DuplicateDeclarationElementTest_fromBytes
+    extends DuplicateDeclarationElementTest {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class DuplicateDeclarationElementTest_keepLinking
+    extends DuplicateDeclarationElementTest {
+  @override
+  bool get keepLinkingLibraries => true;
+}
diff --git a/pkg/analyzer/test/src/summary/elements/enum_test.dart b/pkg/analyzer/test/src/summary/elements/enum_test.dart
new file mode 100644
index 0000000..c547132
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/elements/enum_test.dart
@@ -0,0 +1,11874 @@
+// Copyright (c) 2024, 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:analyzer/dart/element/element.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../dart/resolution/node_text_expectations.dart';
+import '../element_text.dart';
+import '../elements_base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(EnumElementTest_keepLinking);
+    defineReflectiveTests(EnumElementTest_fromBytes);
+    defineReflectiveTests(EnumElementTest_augmentation_keepLinking);
+    defineReflectiveTests(EnumElementTest_augmentation_fromBytes);
+    defineReflectiveTests(UpdateNodeTextExpectations);
+  });
+}
+
+abstract class EnumElementTest extends ElementsBaseTest {
+  test_codeRange_enum() async {
+    var library = await buildLibrary('''
+enum E {
+  aaa, bbb, ccc
+}
+''');
+    configuration.withCodeRanges = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 0
+          codeLength: 26
+          supertype: Enum
+          fields
+            static const enumConstant aaa @11
+              reference: <testLibraryFragment>::@enum::E::@field::aaa
+              enclosingElement: <testLibraryFragment>::@enum::E
+              codeOffset: 11
+              codeLength: 3
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            static const enumConstant bbb @16
+              reference: <testLibraryFragment>::@enum::E::@field::bbb
+              enclosingElement: <testLibraryFragment>::@enum::E
+              codeOffset: 16
+              codeLength: 3
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            static const enumConstant ccc @21
+              reference: <testLibraryFragment>::@enum::E::@field::ccc
+              enclosingElement: <testLibraryFragment>::@enum::E
+              codeOffset: 21
+              codeLength: 3
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: aaa @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::aaa
+                      staticType: E
+                    SimpleIdentifier
+                      token: bbb @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::bbb
+                      staticType: E
+                    SimpleIdentifier
+                      token: ccc @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::ccc
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get aaa @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::aaa
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get bbb @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::bbb
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get ccc @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::ccc
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+''');
+  }
+
+  test_enum_constant_inference() async {
+    var library = await buildLibrary(r'''
+enum E<T> {
+  int(1), string('2');
+  const E(T a);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @7
+              defaultType: dynamic
+          supertype: Enum
+          fields
+            static const enumConstant int @14
+              reference: <testLibraryFragment>::@enum::E::@field::int
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E<int>
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E<int>
+                    staticElement: ConstructorMember
+                      base: <testLibraryFragment>::@enum::E::@constructor::new
+                      substitution: {T: int}
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    arguments
+                      IntegerLiteral
+                        literal: 1 @18
+                        staticType: int
+                    rightParenthesis: ) @0
+                  staticType: E<int>
+            static const enumConstant string @22
+              reference: <testLibraryFragment>::@enum::E::@field::string
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E<String>
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E<String>
+                    staticElement: ConstructorMember
+                      base: <testLibraryFragment>::@enum::E::@constructor::new
+                      substitution: {T: String}
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    arguments
+                      SimpleStringLiteral
+                        literal: '2' @29
+                    rightParenthesis: ) @0
+                  staticType: E<String>
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E<dynamic>>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: int @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::int
+                      staticType: E<int>
+                    SimpleIdentifier
+                      token: string @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::string
+                      staticType: E<String>
+                  rightBracket: ] @0
+                  staticType: List<E<dynamic>>
+          constructors
+            const @43
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+              parameters
+                requiredPositional a @47
+                  type: T
+          accessors
+            synthetic static get int @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::int
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E<int>
+            synthetic static get string @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::string
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E<String>
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E<dynamic>>
+''');
+  }
+
+  /// Test that a constant named `_name` renames the synthetic `name` field.
+  test_enum_constant_name() async {
+    var library = await buildLibrary(r'''
+enum E {
+  _name;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant _name @11
+              reference: <testLibraryFragment>::@enum::E::@field::_name
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: _name @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::_name
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get _name @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::_name
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+''');
+  }
+
+  test_enum_constant_typeArguments() async {
+    var library = await buildLibrary(r'''
+enum E<T> {
+  v<double>(42);
+  const E(T a);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @7
+              defaultType: dynamic
+          supertype: Enum
+          fields
+            static const enumConstant v @14
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E<double>
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      typeArguments: TypeArgumentList
+                        leftBracket: < @15
+                        arguments
+                          NamedType
+                            name: double @16
+                            element: dart:core::<fragment>::@class::double
+                            type: double
+                        rightBracket: > @22
+                      element: <testLibraryFragment>::@enum::E
+                      type: E<double>
+                    staticElement: ConstructorMember
+                      base: <testLibraryFragment>::@enum::E::@constructor::new
+                      substitution: {T: double}
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    arguments
+                      IntegerLiteral
+                        literal: 42 @24
+                        staticType: double
+                    rightParenthesis: ) @0
+                  staticType: E<double>
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E<dynamic>>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E<double>
+                  rightBracket: ] @0
+                  staticType: List<E<dynamic>>
+          constructors
+            const @37
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+              parameters
+                requiredPositional a @41
+                  type: T
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E<double>
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E<dynamic>>
+''');
+  }
+
+  test_enum_constant_underscore() async {
+    var library = await buildLibrary('''
+enum E {
+  _
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant _ @11
+              reference: <testLibraryFragment>::@enum::E::@field::_
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: _ @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::_
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get _ @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::_
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+''');
+  }
+
+  test_enum_constructor_factory_named() async {
+    var library = await buildLibrary(r'''
+enum E {
+  v;
+  factory E.named() => v;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant v @11
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            factory named @26
+              reference: <testLibraryFragment>::@enum::E::@constructor::named
+              enclosingElement: <testLibraryFragment>::@enum::E
+              periodOffset: 25
+              nameEnd: 31
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+''');
+  }
+
+  test_enum_constructor_factory_unnamed() async {
+    var library = await buildLibrary(r'''
+enum E {
+  v;
+  factory E() => v;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant v @11
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            factory @24
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+''');
+  }
+
+  test_enum_constructor_fieldFormal_functionTyped_withReturnType() async {
+    var library = await buildLibrary(r'''
+enum E {
+  v;
+  final x;
+  const E(int this.x(double a));
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant v @11
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+            final x @22
+              reference: <testLibraryFragment>::@enum::E::@field::x
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: dynamic
+          constructors
+            const @33
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+              parameters
+                requiredPositional final this.x @44
+                  type: int Function(double)
+                  parameters
+                    requiredPositional a @53
+                      type: double
+                  field: <testLibraryFragment>::@enum::E::@field::x
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::x
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: dynamic
+''');
+  }
+
+  test_enum_constructor_fieldFormal_multiple_matching_fields() async {
+    var library = await buildLibrary('''
+enum E {
+  v;
+  final int x;
+  final String x;
+  const E(this.x);
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant v @11
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+            final x @26
+              reference: <testLibraryFragment>::@enum::E::@field::x::@def::0
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: int
+            final x @44
+              reference: <testLibraryFragment>::@enum::E::@field::x::@def::1
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: String
+          constructors
+            const @55
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+              parameters
+                requiredPositional final this.x @62
+                  type: int
+                  field: <testLibraryFragment>::@enum::E::@field::x::@def::0
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::x::@def::0
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: int
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::x::@def::1
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: String
+''');
+  }
+
+  test_enum_constructor_fieldFormal_no_matching_field() async {
+    var library = await buildLibrary('''
+enum E {
+  v;
+  const E(this.x);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant v @11
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            const @22
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+              parameters
+                requiredPositional final this.x @29
+                  type: dynamic
+                  field: <null>
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+''');
+  }
+
+  test_enum_constructor_fieldFormal_optionalNamed_defaultValue() async {
+    var library = await buildLibrary(r'''
+enum E {
+  v;
+  final int x;
+  const E({this.x = 1 + 2});
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant v @11
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+            final x @26
+              reference: <testLibraryFragment>::@enum::E::@field::x
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: int
+          constructors
+            const @37
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+              parameters
+                optionalNamed default final this.x @45
+                  reference: <testLibraryFragment>::@enum::E::@constructor::new::@parameter::x
+                  type: int
+                  constantInitializer
+                    BinaryExpression
+                      leftOperand: IntegerLiteral
+                        literal: 1 @49
+                        staticType: int
+                      operator: + @51
+                      rightOperand: IntegerLiteral
+                        literal: 2 @53
+                        staticType: int
+                      staticElement: dart:core::<fragment>::@class::num::@method::+
+                      staticInvokeType: num Function(num)
+                      staticType: int
+                  field: <testLibraryFragment>::@enum::E::@field::x
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::x
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: int
+''');
+  }
+
+  test_enum_constructor_fieldFormal_typed_typed() async {
+    var library = await buildLibrary('''
+enum E {
+  v;
+  final num x;
+  const E(int this.x);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant v @11
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+            final x @26
+              reference: <testLibraryFragment>::@enum::E::@field::x
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: num
+          constructors
+            const @37
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+              parameters
+                requiredPositional final this.x @48
+                  type: int
+                  field: <testLibraryFragment>::@enum::E::@field::x
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::x
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: num
+''');
+  }
+
+  test_enum_constructor_fieldFormal_untyped_typed() async {
+    var library = await buildLibrary(r'''
+enum E {
+  v;
+  final x;
+  E(int this.x);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant v @11
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+            final x @22
+              reference: <testLibraryFragment>::@enum::E::@field::x
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: dynamic
+          constructors
+            @27
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+              parameters
+                requiredPositional final this.x @38
+                  type: int
+                  field: <testLibraryFragment>::@enum::E::@field::x
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::x
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: dynamic
+''');
+  }
+
+  test_enum_constructor_fieldFormal_untyped_untyped() async {
+    var library = await buildLibrary(r'''
+enum E {
+  v;
+  final x;
+  E(this.x);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant v @11
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+            final x @22
+              reference: <testLibraryFragment>::@enum::E::@field::x
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: dynamic
+          constructors
+            @27
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+              parameters
+                requiredPositional final this.x @34
+                  type: dynamic
+                  field: <testLibraryFragment>::@enum::E::@field::x
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::x
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: dynamic
+''');
+  }
+
+  test_enum_constructor_generative_named() async {
+    var library = await buildLibrary(r'''
+enum E {
+  v.named(42);
+  const E.named(int a);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant v @11
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    period: . @0
+                    name: SimpleIdentifier
+                      token: named @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@constructor::named
+                      staticType: null
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::named
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    arguments
+                      IntegerLiteral
+                        literal: 42 @19
+                        staticType: int
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            const named @34
+              reference: <testLibraryFragment>::@enum::E::@constructor::named
+              enclosingElement: <testLibraryFragment>::@enum::E
+              periodOffset: 33
+              nameEnd: 39
+              parameters
+                requiredPositional a @44
+                  type: int
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+''');
+  }
+
+  test_enum_constructor_generative_unnamed() async {
+    var library = await buildLibrary(r'''
+enum E {
+  v(42);
+  const E(int a);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant v @11
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    arguments
+                      IntegerLiteral
+                        literal: 42 @13
+                        staticType: int
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            const @26
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+              parameters
+                requiredPositional a @32
+                  type: int
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+''');
+  }
+
+  test_enum_constructor_initializer() async {
+    var library = await buildLibrary(r'''
+enum E<T> {
+  v;
+  final int x;
+  const E(T? a) : assert(a is T), x = 0;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @7
+              defaultType: dynamic
+          supertype: Enum
+          fields
+            static const enumConstant v @14
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E<dynamic>
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E<dynamic>
+                    staticElement: ConstructorMember
+                      base: <testLibraryFragment>::@enum::E::@constructor::new
+                      substitution: {T: dynamic}
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E<dynamic>
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E<dynamic>>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E<dynamic>
+                  rightBracket: ] @0
+                  staticType: List<E<dynamic>>
+            final x @29
+              reference: <testLibraryFragment>::@enum::E::@field::x
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: int
+          constructors
+            const @40
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+              parameters
+                requiredPositional a @45
+                  type: T?
+              constantInitializers
+                AssertInitializer
+                  assertKeyword: assert @50
+                  leftParenthesis: ( @56
+                  condition: IsExpression
+                    expression: SimpleIdentifier
+                      token: a @57
+                      staticElement: <testLibraryFragment>::@enum::E::@constructor::new::@parameter::a
+                      staticType: T?
+                    isOperator: is @59
+                    type: NamedType
+                      name: T @62
+                      element: T@7
+                      type: T
+                    staticType: bool
+                  rightParenthesis: ) @63
+                ConstructorFieldInitializer
+                  fieldName: SimpleIdentifier
+                    token: x @66
+                    staticElement: <testLibraryFragment>::@enum::E::@field::x
+                    staticType: null
+                  equals: = @68
+                  expression: IntegerLiteral
+                    literal: 0 @70
+                    staticType: int
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E<dynamic>
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E<dynamic>>
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::x
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: int
+''');
+  }
+
+  test_enum_documented() async {
+    var library = await buildLibrary('''
+// Extra comment so doc comment offset != 0
+/**
+ * Docs
+ */
+enum E { v }''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @65
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /**\n * Docs\n */
+          supertype: Enum
+          fields
+            static const enumConstant v @69
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+''');
+  }
+
+  test_enum_field() async {
+    var library = await buildLibrary(r'''
+enum E {
+  v;
+  final foo = 42;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant v @11
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+            final foo @22
+              reference: <testLibraryFragment>::@enum::E::@field::foo
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: int
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                IntegerLiteral
+                  literal: 42 @28
+                  staticType: int
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::foo
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: int
+''');
+  }
+
+  test_enum_field_isPromotable() async {
+    var library = await buildLibrary(r'''
+enum E {
+  v(null);
+  final int? _foo;
+  E(this._foo);
+}
+''');
+    configuration.forPromotableFields(
+      enumNames: {'E'},
+      fieldNames: {'_foo'},
+    );
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            final promotable _foo @33
+              reference: <testLibraryFragment>::@enum::E::@field::_foo
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: int?
+''');
+  }
+
+  test_enum_getter() async {
+    var library = await buildLibrary(r'''
+enum E{
+  v;
+  int get foo => 0;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant v @10
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@enum::E::@field::foo
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: int
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+            get foo @23
+              reference: <testLibraryFragment>::@enum::E::@getter::foo
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: int
+''');
+  }
+
+  test_enum_interfaces() async {
+    var library = await buildLibrary(r'''
+class I {}
+enum E implements I {
+  v;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class I @6
+          reference: <testLibraryFragment>::@class::I
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::I::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::I
+      enums
+        enum E @16
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          interfaces
+            I
+          fields
+            static const enumConstant v @35
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+''');
+  }
+
+  test_enum_interfaces_extensionType() async {
+    var library = await buildLibrary(r'''
+class A {}
+extension type B(int it) {}
+class C {}
+enum E implements A, B, C { v }
+''');
+    configuration
+      ..withConstructors = false
+      ..withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+        class C @45
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+      enums
+        enum E @55
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          interfaces
+            A
+            C
+          fields
+            static const enumConstant v @78
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+      extensionTypes
+        B @26
+          reference: <testLibraryFragment>::@extensionType::B
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::B::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::B::@constructor::new
+          typeErasure: int
+          fields
+            final it @32
+              reference: <testLibraryFragment>::@extensionType::B::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::B::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              returnType: int
+''');
+  }
+
+  test_enum_interfaces_generic() async {
+    var library = await buildLibrary(r'''
+class I<T> {}
+enum E<U> implements I<U> {
+  v;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class I @6
+          reference: <testLibraryFragment>::@class::I
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::I::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::I
+      enums
+        enum E @19
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant U @21
+              defaultType: dynamic
+          supertype: Enum
+          interfaces
+            I<U>
+          fields
+            static const enumConstant v @44
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E<dynamic>
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E<dynamic>
+                    staticElement: ConstructorMember
+                      base: <testLibraryFragment>::@enum::E::@constructor::new
+                      substitution: {U: dynamic}
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E<dynamic>
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E<dynamic>>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E<dynamic>
+                  rightBracket: ] @0
+                  staticType: List<E<dynamic>>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E<dynamic>
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E<dynamic>>
+''');
+  }
+
+  test_enum_interfaces_unresolved() async {
+    var library = await buildLibrary('''
+class X {}
+class Z {}
+enum E implements X, Y, Z {
+  v
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class X @6
+          reference: <testLibraryFragment>::@class::X
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::X::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::X
+        class Z @17
+          reference: <testLibraryFragment>::@class::Z
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::Z::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::Z
+      enums
+        enum E @27
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          interfaces
+            X
+            Z
+          fields
+            static const enumConstant v @52
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+''');
+  }
+
+  test_enum_method() async {
+    var library = await buildLibrary(r'''
+enum E<T> {
+  v;
+  int foo<U>(T t, U u) => 0;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @7
+              defaultType: dynamic
+          supertype: Enum
+          fields
+            static const enumConstant v @14
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E<dynamic>
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E<dynamic>
+                    staticElement: ConstructorMember
+                      base: <testLibraryFragment>::@enum::E::@constructor::new
+                      substitution: {T: dynamic}
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E<dynamic>
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E<dynamic>>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E<dynamic>
+                  rightBracket: ] @0
+                  staticType: List<E<dynamic>>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E<dynamic>
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E<dynamic>>
+          methods
+            foo @23
+              reference: <testLibraryFragment>::@enum::E::@method::foo
+              enclosingElement: <testLibraryFragment>::@enum::E
+              typeParameters
+                covariant U @27
+                  defaultType: dynamic
+              parameters
+                requiredPositional t @32
+                  type: T
+                requiredPositional u @37
+                  type: U
+              returnType: int
+''');
+  }
+
+  test_enum_method_toString() async {
+    var library = await buildLibrary(r'''
+enum E {
+  v;
+  String toString() => 'E';
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant v @11
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+          methods
+            toString @23
+              reference: <testLibraryFragment>::@enum::E::@method::toString
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: String
+''');
+  }
+
+  test_enum_mixins() async {
+    var library = await buildLibrary(r'''
+mixin M {}
+enum E with M {
+  v;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @16
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          mixins
+            M
+          fields
+            static const enumConstant v @29
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+      mixins
+        mixin M @6
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_enum_mixins_extensionType() async {
+    var library = await buildLibrary(r'''
+class A {}
+extension type B(int it) {}
+class C {}
+enum E with A, B, C { v }
+''');
+    configuration
+      ..withConstructors = false
+      ..withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+        class C @45
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+      enums
+        enum E @55
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          mixins
+            A
+            C
+          fields
+            static const enumConstant v @72
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+      extensionTypes
+        B @26
+          reference: <testLibraryFragment>::@extensionType::B
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::B::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::B::@constructor::new
+          typeErasure: int
+          fields
+            final it @32
+              reference: <testLibraryFragment>::@extensionType::B::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::B::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              returnType: int
+''');
+  }
+
+  test_enum_mixins_inference() async {
+    var library = await buildLibrary(r'''
+mixin M1<T> {}
+mixin M2<T> on M1<T> {}
+enum E with M1<int>, M2 {
+  v;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @44
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          mixins
+            M1<int>
+            M2<int>
+          fields
+            static const enumConstant v @67
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+      mixins
+        mixin M1 @6
+          reference: <testLibraryFragment>::@mixin::M1
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @9
+              defaultType: dynamic
+          superclassConstraints
+            Object
+        mixin M2 @21
+          reference: <testLibraryFragment>::@mixin::M2
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @24
+              defaultType: dynamic
+          superclassConstraints
+            M1<T>
+''');
+  }
+
+  test_enum_setter() async {
+    var library = await buildLibrary(r'''
+enum E{
+  v;
+  set foo(int _) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant v @10
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@enum::E::@field::foo
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: int
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+            set foo= @19
+              reference: <testLibraryFragment>::@enum::E::@setter::foo
+              enclosingElement: <testLibraryFragment>::@enum::E
+              parameters
+                requiredPositional _ @27
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_enum_typeParameters() async {
+    var library = await buildLibrary('''
+enum E<T> {
+  v
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @7
+              defaultType: dynamic
+          supertype: Enum
+          fields
+            static const enumConstant v @14
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E<dynamic>
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E<dynamic>
+                    staticElement: ConstructorMember
+                      base: <testLibraryFragment>::@enum::E::@constructor::new
+                      substitution: {T: dynamic}
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E<dynamic>
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E<dynamic>>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E<dynamic>
+                  rightBracket: ] @0
+                  staticType: List<E<dynamic>>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E<dynamic>
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E<dynamic>>
+''');
+  }
+
+  test_enum_typeParameters_bound() async {
+    var library = await buildLibrary('''
+enum E<T extends num, U extends T> {
+  v
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        notSimplyBounded enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @7
+              bound: num
+              defaultType: num
+            covariant U @22
+              bound: T
+              defaultType: num
+          supertype: Enum
+          fields
+            static const enumConstant v @39
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E<num, num>
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E<num, num>
+                    staticElement: ConstructorMember
+                      base: <testLibraryFragment>::@enum::E::@constructor::new
+                      substitution: {T: num, U: num}
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E<num, num>
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E<num, num>>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E<num, num>
+                  rightBracket: ] @0
+                  staticType: List<E<num, num>>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E<num, num>
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E<num, num>>
+''');
+  }
+
+  test_enum_typeParameters_cycle_1of1() async {
+    var library = await buildLibrary('''
+enum E<T extends T> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        notSimplyBounded enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @7
+              bound: dynamic
+              defaultType: dynamic
+          supertype: Enum
+          fields
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E<dynamic>>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  rightBracket: ] @0
+                  staticType: List<E<dynamic>>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E<dynamic>>
+''');
+  }
+
+  test_enum_typeParameters_cycle_2of3() async {
+    var library = await buildLibrary(r'''
+enum E<T extends V, U extends num, V extends T> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        notSimplyBounded enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @7
+              bound: dynamic
+              defaultType: dynamic
+            covariant U @20
+              bound: num
+              defaultType: num
+            covariant V @35
+              bound: dynamic
+              defaultType: dynamic
+          supertype: Enum
+          fields
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E<dynamic, num, dynamic>>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  rightBracket: ] @0
+                  staticType: List<E<dynamic, num, dynamic>>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E<dynamic, num, dynamic>>
+''');
+  }
+
+  test_enum_typeParameters_defaultType_cycle_genericFunctionType() async {
+    var library = await buildLibrary(r'''
+enum E<T extends void Function(E)> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        notSimplyBounded enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @7
+              bound: void Function(E<dynamic>)
+              defaultType: dynamic
+          supertype: Enum
+          fields
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E<dynamic>>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  rightBracket: ] @0
+                  staticType: List<E<dynamic>>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E<dynamic>>
+''');
+  }
+
+  test_enum_typeParameters_variance_contravariant() async {
+    var library = await buildLibrary('''
+enum E<in T> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            contravariant T @10
+              defaultType: dynamic
+          supertype: Enum
+          fields
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E<dynamic>>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  rightBracket: ] @0
+                  staticType: List<E<dynamic>>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E<dynamic>>
+''');
+  }
+
+  test_enum_typeParameters_variance_covariant() async {
+    var library = await buildLibrary('''
+enum E<out T> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @11
+              defaultType: dynamic
+          supertype: Enum
+          fields
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E<dynamic>>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  rightBracket: ] @0
+                  staticType: List<E<dynamic>>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E<dynamic>>
+''');
+  }
+
+  test_enum_typeParameters_variance_invariant() async {
+    var library = await buildLibrary('''
+enum E<inout T> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            invariant T @13
+              defaultType: dynamic
+          supertype: Enum
+          fields
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E<dynamic>>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  rightBracket: ] @0
+                  staticType: List<E<dynamic>>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E<dynamic>>
+''');
+  }
+
+  test_enum_typeParameters_variance_multiple() async {
+    var library = await buildLibrary('''
+enum E<inout T, in U, out V> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            invariant T @13
+              defaultType: dynamic
+            contravariant U @19
+              defaultType: dynamic
+            covariant V @26
+              defaultType: dynamic
+          supertype: Enum
+          fields
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E<dynamic, dynamic, dynamic>>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  rightBracket: ] @0
+                  staticType: List<E<dynamic, dynamic, dynamic>>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E<dynamic, dynamic, dynamic>>
+''');
+  }
+
+  test_enum_value_documented() async {
+    var library = await buildLibrary('''
+enum E {
+  /**
+   * aaa
+   */
+  a,
+  /// bbb
+  b
+}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant a @32
+              reference: <testLibraryFragment>::@enum::E::@field::a
+              enclosingElement: <testLibraryFragment>::@enum::E
+              documentationComment: /**\n   * aaa\n   */
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            static const enumConstant b @47
+              reference: <testLibraryFragment>::@enum::E::@field::b
+              enclosingElement: <testLibraryFragment>::@enum::E
+              documentationComment: /// bbb
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: a @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::a
+                      staticType: E
+                    SimpleIdentifier
+                      token: b @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::b
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get a @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::a
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get b @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::b
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+''');
+  }
+
+  test_enum_value_documented_withMetadata() async {
+    var library = await buildLibrary('''
+enum E {
+  /**
+   * aaa
+   */
+  @annotation
+  a,
+  /// bbb
+  @annotation
+  b,
+}
+
+const int annotation = 0;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant a @46
+              reference: <testLibraryFragment>::@enum::E::@field::a
+              enclosingElement: <testLibraryFragment>::@enum::E
+              documentationComment: /**\n   * aaa\n   */
+              metadata
+                Annotation
+                  atSign: @ @32
+                  name: SimpleIdentifier
+                    token: annotation @33
+                    staticElement: <testLibraryFragment>::@getter::annotation
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::annotation
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            static const enumConstant b @75
+              reference: <testLibraryFragment>::@enum::E::@field::b
+              enclosingElement: <testLibraryFragment>::@enum::E
+              documentationComment: /// bbb
+              metadata
+                Annotation
+                  atSign: @ @61
+                  name: SimpleIdentifier
+                    token: annotation @62
+                    staticElement: <testLibraryFragment>::@getter::annotation
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::annotation
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: a @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::a
+                      staticType: E
+                    SimpleIdentifier
+                      token: b @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::b
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get a @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::a
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get b @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::b
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+      topLevelVariables
+        static const annotation @91
+          reference: <testLibraryFragment>::@topLevelVariable::annotation
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: true
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @104
+              staticType: int
+      accessors
+        synthetic static get annotation @-1
+          reference: <testLibraryFragment>::@getter::annotation
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_enum_values() async {
+    var library = await buildLibrary('enum E { v1, v2 }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant v1 @9
+              reference: <testLibraryFragment>::@enum::E::@field::v1
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            static const enumConstant v2 @13
+              reference: <testLibraryFragment>::@enum::E::@field::v2
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v1 @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v1
+                      staticType: E
+                    SimpleIdentifier
+                      token: v2 @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v2
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get v1 @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v1
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get v2 @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v2
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+''');
+  }
+
+  test_enums() async {
+    var library = await buildLibrary('enum E1 { v1 } enum E2 { v2 }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E1 @5
+          reference: <testLibraryFragment>::@enum::E1
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant v1 @10
+              reference: <testLibraryFragment>::@enum::E1::@field::v1
+              enclosingElement: <testLibraryFragment>::@enum::E1
+              type: E1
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E1 @-1
+                      element: <testLibraryFragment>::@enum::E1
+                      type: E1
+                    staticElement: <testLibraryFragment>::@enum::E1::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E1
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E1::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E1
+              type: List<E1>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v1 @-1
+                      staticElement: <testLibraryFragment>::@enum::E1::@getter::v1
+                      staticType: E1
+                  rightBracket: ] @0
+                  staticType: List<E1>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E1
+          accessors
+            synthetic static get v1 @-1
+              reference: <testLibraryFragment>::@enum::E1::@getter::v1
+              enclosingElement: <testLibraryFragment>::@enum::E1
+              returnType: E1
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E1::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E1
+              returnType: List<E1>
+        enum E2 @20
+          reference: <testLibraryFragment>::@enum::E2
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant v2 @25
+              reference: <testLibraryFragment>::@enum::E2::@field::v2
+              enclosingElement: <testLibraryFragment>::@enum::E2
+              type: E2
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E2 @-1
+                      element: <testLibraryFragment>::@enum::E2
+                      type: E2
+                    staticElement: <testLibraryFragment>::@enum::E2::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E2
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E2::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E2
+              type: List<E2>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v2 @-1
+                      staticElement: <testLibraryFragment>::@enum::E2::@getter::v2
+                      staticType: E2
+                  rightBracket: ] @0
+                  staticType: List<E2>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E2::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E2
+          accessors
+            synthetic static get v2 @-1
+              reference: <testLibraryFragment>::@enum::E2::@getter::v2
+              enclosingElement: <testLibraryFragment>::@enum::E2
+              returnType: E2
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E2::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E2
+              returnType: List<E2>
+''');
+  }
+
+  test_error_extendsEnum() async {
+    var library = await buildLibrary('''
+enum E {a, b, c}
+
+class M {}
+
+class A extends E {
+  foo() {}
+}
+
+class B implements E, M {
+  foo() {}
+}
+
+class C extends Object with E, M {
+  foo() {}
+}
+
+class D = Object with M, E;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class M @24
+          reference: <testLibraryFragment>::@class::M
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::M::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::M
+        class A @36
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          methods
+            foo @52
+              reference: <testLibraryFragment>::@class::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: dynamic
+        class B @70
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          interfaces
+            M
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+          methods
+            foo @92
+              reference: <testLibraryFragment>::@class::B::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::B
+              returnType: dynamic
+        class C @110
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: Object
+          mixins
+            M
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            foo @141
+              reference: <testLibraryFragment>::@class::C::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+        class alias D @159
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          supertype: Object
+          mixins
+            M
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: dart:core::<fragment>::@class::Object::@constructor::new
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant a @8
+              reference: <testLibraryFragment>::@enum::E::@field::a
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            static const enumConstant b @11
+              reference: <testLibraryFragment>::@enum::E::@field::b
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            static const enumConstant c @14
+              reference: <testLibraryFragment>::@enum::E::@field::c
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: a @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::a
+                      staticType: E
+                    SimpleIdentifier
+                      token: b @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::b
+                      staticType: E
+                    SimpleIdentifier
+                      token: c @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::c
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get a @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::a
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get b @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::b
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get c @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::c
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+''');
+  }
+
+  test_metadata_enum_constant() async {
+    var library = await buildLibrary('const a = 42; enum E { @a v }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @19
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant v @26
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              metadata
+                Annotation
+                  atSign: @ @23
+                  name: SimpleIdentifier
+                    token: a @24
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::a
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 42 @10
+              staticType: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_enum_constant_instanceCreation() async {
+    var library = await buildLibrary('''
+class A {
+  final dynamic value;
+  const A(this.value);
+}
+
+enum E {
+  @A(100) a,
+  b,
+  @A(300) c,
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            final value @26
+              reference: <testLibraryFragment>::@class::A::@field::value
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: dynamic
+          constructors
+            const @41
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional final this.value @48
+                  type: dynamic
+                  field: <testLibraryFragment>::@class::A::@field::value
+          accessors
+            synthetic get value @-1
+              reference: <testLibraryFragment>::@class::A::@getter::value
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: dynamic
+      enums
+        enum E @64
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant a @78
+              reference: <testLibraryFragment>::@enum::E::@field::a
+              enclosingElement: <testLibraryFragment>::@enum::E
+              metadata
+                Annotation
+                  atSign: @ @70
+                  name: SimpleIdentifier
+                    token: A @71
+                    staticElement: <testLibraryFragment>::@class::A
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @72
+                    arguments
+                      IntegerLiteral
+                        literal: 100 @73
+                        staticType: int
+                    rightParenthesis: ) @76
+                  element: <testLibraryFragment>::@class::A::@constructor::new
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            static const enumConstant b @83
+              reference: <testLibraryFragment>::@enum::E::@field::b
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            static const enumConstant c @96
+              reference: <testLibraryFragment>::@enum::E::@field::c
+              enclosingElement: <testLibraryFragment>::@enum::E
+              metadata
+                Annotation
+                  atSign: @ @88
+                  name: SimpleIdentifier
+                    token: A @89
+                    staticElement: <testLibraryFragment>::@class::A
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @90
+                    arguments
+                      IntegerLiteral
+                        literal: 300 @91
+                        staticType: int
+                    rightParenthesis: ) @94
+                  element: <testLibraryFragment>::@class::A::@constructor::new
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: a @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::a
+                      staticType: E
+                    SimpleIdentifier
+                      token: b @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::b
+                      staticType: E
+                    SimpleIdentifier
+                      token: c @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::c
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get a @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::a
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get b @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::b
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get c @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::c
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+''');
+  }
+
+  test_metadata_enum_constant_self() async {
+    var library = await buildLibrary(r'''
+enum E {
+  @v
+  v
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant v @16
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              metadata
+                Annotation
+                  atSign: @ @11
+                  name: SimpleIdentifier
+                    token: v @12
+                    staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                    staticType: null
+                  element: <testLibraryFragment>::@enum::E::@getter::v
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+''');
+  }
+
+  test_metadata_enum_constructor() async {
+    var library = await buildLibrary(r'''
+const a = 42;
+enum E {
+  v;
+  @a
+  const E();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @19
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant v @25
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            const @41
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+              metadata
+                Annotation
+                  atSign: @ @30
+                  name: SimpleIdentifier
+                    token: a @31
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::a
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 42 @10
+              staticType: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_enum_method() async {
+    var library = await buildLibrary(r'''
+const a = 42;
+enum E {
+  v;
+  @a
+  void foo() {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @19
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant v @25
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+          methods
+            foo @40
+              reference: <testLibraryFragment>::@enum::E::@method::foo
+              enclosingElement: <testLibraryFragment>::@enum::E
+              metadata
+                Annotation
+                  atSign: @ @30
+                  name: SimpleIdentifier
+                    token: a @31
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::a
+              returnType: void
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 42 @10
+              staticType: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_enum_scope() async {
+    var library = await buildLibrary(r'''
+const foo = 0;
+
+@foo
+enum E<@foo T> {
+  v;
+  static const foo = 1;
+  @foo
+  void bar() {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @26
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @16
+              name: SimpleIdentifier
+                token: foo @17
+                staticElement: <testLibraryFragment>::@getter::foo
+                staticType: null
+              element: <testLibraryFragment>::@getter::foo
+          typeParameters
+            covariant T @33
+              defaultType: dynamic
+              metadata
+                Annotation
+                  atSign: @ @28
+                  name: SimpleIdentifier
+                    token: foo @29
+                    staticElement: <testLibraryFragment>::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::foo
+          supertype: Enum
+          fields
+            static const enumConstant v @40
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E<dynamic>
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E<dynamic>
+                    staticElement: ConstructorMember
+                      base: <testLibraryFragment>::@enum::E::@constructor::new
+                      substitution: {T: dynamic}
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E<dynamic>
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E<dynamic>>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E<dynamic>
+                  rightBracket: ] @0
+                  staticType: List<E<dynamic>>
+            static const foo @58
+              reference: <testLibraryFragment>::@enum::E::@field::foo
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: int
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                IntegerLiteral
+                  literal: 1 @64
+                  staticType: int
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E<dynamic>
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E<dynamic>>
+            synthetic static get foo @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::foo
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: int
+          methods
+            bar @81
+              reference: <testLibraryFragment>::@enum::E::@method::bar
+              enclosingElement: <testLibraryFragment>::@enum::E
+              metadata
+                Annotation
+                  atSign: @ @69
+                  name: SimpleIdentifier
+                    token: foo @70
+                    staticElement: <testLibraryFragment>::@enum::E::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@enum::E::@getter::foo
+              returnType: void
+      topLevelVariables
+        static const foo @6
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @12
+              staticType: int
+      accessors
+        synthetic static get foo @-1
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_enum_typeParameter() async {
+    var library = await buildLibrary('''
+const a = 42;
+enum E<@a T> {
+  v
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @19
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @24
+              defaultType: dynamic
+              metadata
+                Annotation
+                  atSign: @ @21
+                  name: SimpleIdentifier
+                    token: a @22
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::a
+          supertype: Enum
+          fields
+            static const enumConstant v @31
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E<dynamic>
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E<dynamic>
+                    staticElement: ConstructorMember
+                      base: <testLibraryFragment>::@enum::E::@constructor::new
+                      substitution: {T: dynamic}
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E<dynamic>
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E<dynamic>>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E<dynamic>
+                  rightBracket: ] @0
+                  staticType: List<E<dynamic>>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E<dynamic>
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E<dynamic>>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 42 @10
+              staticType: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_enumDeclaration() async {
+    var library = await buildLibrary('const a = 42; @a enum E { v }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @22
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @14
+              name: SimpleIdentifier
+                token: a @15
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: null
+              element: <testLibraryFragment>::@getter::a
+          supertype: Enum
+          fields
+            static const enumConstant v @26
+              reference: <testLibraryFragment>::@enum::E::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::v
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 42 @10
+              staticType: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+}
+
+abstract class EnumElementTest_augmentation extends ElementsBaseTest {
+  test_add_augment() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+
+enum A {
+  v;
+  void foo() {}
+}
+
+augment enum A {;
+  void bar() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        enum A @35
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enum::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @41
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enum::A::@field::v
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enum::A::@field::values
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enum::A
+              type: List<A>
+          constructors
+            synthetic const @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enum::A::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enum::A::@getter::v
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enum::A::@getter::values
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enum::A
+              returnType: List<A>
+          methods
+            foo @51
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enum::A::@method::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enum::A
+              returnType: void
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@enum::A::@field::v
+              <testLibrary>::@fragment::package:test/a.dart::@enum::A::@field::values
+            constants
+              <testLibrary>::@fragment::package:test/a.dart::@enum::A::@field::v
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@enum::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@enum::A::@getter::v
+              <testLibrary>::@fragment::package:test/a.dart::@enum::A::@getter::values
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@method::bar
+              <testLibrary>::@fragment::package:test/a.dart::@enum::A::@method::foo
+        augment enum A @76
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@enum::A
+          methods
+            bar @88
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@method::bar
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: void
+''');
+  }
+
+  test_augmentationTarget() async {
+    newFile('$testPackageLibPath/a1.dart', r'''
+augment library 'test.dart';
+import augment 'a11.dart';
+import augment 'a12.dart';
+augment enum A {}
+''');
+
+    newFile('$testPackageLibPath/a11.dart', r'''
+augment library 'a1.dart';
+augment enum A {}
+''');
+
+    newFile('$testPackageLibPath/a12.dart', r'''
+augment library 'a1.dart';
+augment enum A {}
+''');
+
+    newFile('$testPackageLibPath/a2.dart', r'''
+augment library 'test.dart';
+import augment 'a21.dart';
+import augment 'a22.dart';
+augment enum A {}
+''');
+
+    newFile('$testPackageLibPath/a21.dart', r'''
+augment library 'a2.dart';
+augment enum A {}
+''');
+
+    newFile('$testPackageLibPath/a22.dart', r'''
+augment library 'a2.dart';
+augment enum A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a1.dart';
+import augment 'a2.dart';
+enum A {
+  v
+}
+''');
+
+    configuration
+      ..withConstantInitializers = false
+      ..withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a1.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a1.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a1.dart
+      augmentationImports
+        package:test/a11.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a1.dart
+          reference: <testLibrary>::@augmentation::package:test/a11.dart
+          definingUnit: <testLibrary>::@fragment::package:test/a11.dart
+        package:test/a12.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a1.dart
+          reference: <testLibrary>::@augmentation::package:test/a12.dart
+          definingUnit: <testLibrary>::@fragment::package:test/a12.dart
+    package:test/a2.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a2.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a2.dart
+      augmentationImports
+        package:test/a21.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a2.dart
+          reference: <testLibrary>::@augmentation::package:test/a21.dart
+          definingUnit: <testLibrary>::@fragment::package:test/a21.dart
+        package:test/a22.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a2.dart
+          reference: <testLibrary>::@augmentation::package:test/a22.dart
+          definingUnit: <testLibrary>::@fragment::package:test/a22.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @57
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a1.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @63
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a1.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a1.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @96
+          reference: <testLibrary>::@fragment::package:test/a1.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a1.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          augmentation: <testLibrary>::@fragment::package:test/a11.dart::@enumAugmentation::A
+    <testLibrary>::@fragment::package:test/a11.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a11.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a1.dart
+      enums
+        augment enum A @40
+          reference: <testLibrary>::@fragment::package:test/a11.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a11.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a1.dart::@enumAugmentation::A
+          augmentation: <testLibrary>::@fragment::package:test/a12.dart::@enumAugmentation::A
+    <testLibrary>::@fragment::package:test/a12.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a12.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a1.dart
+      enums
+        augment enum A @40
+          reference: <testLibrary>::@fragment::package:test/a12.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a12.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a11.dart::@enumAugmentation::A
+          augmentation: <testLibrary>::@fragment::package:test/a2.dart::@enumAugmentation::A
+    <testLibrary>::@fragment::package:test/a2.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a2.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @96
+          reference: <testLibrary>::@fragment::package:test/a2.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a2.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a12.dart::@enumAugmentation::A
+          augmentation: <testLibrary>::@fragment::package:test/a21.dart::@enumAugmentation::A
+    <testLibrary>::@fragment::package:test/a21.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a21.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a2.dart
+      enums
+        augment enum A @40
+          reference: <testLibrary>::@fragment::package:test/a21.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a21.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a2.dart::@enumAugmentation::A
+          augmentation: <testLibrary>::@fragment::package:test/a22.dart::@enumAugmentation::A
+    <testLibrary>::@fragment::package:test/a22.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a22.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a2.dart
+      enums
+        augment enum A @40
+          reference: <testLibrary>::@fragment::package:test/a22.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a22.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a21.dart::@enumAugmentation::A
+  exportedReferences
+    declared <testLibraryFragment>::@enum::A
+  exportNamespace
+    A: <testLibraryFragment>::@enum::A
+''');
+  }
+
+  test_augmentationTarget_augmentationThenDeclaration() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+
+augment enum A {;
+  void foo1() {}
+}
+
+enum A {
+  v;
+  void foo2() {}
+}
+
+augment enum A {;
+  void foo3() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::0
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          fields
+            synthetic static const values @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::0::@field::values
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::0
+              type: List<A>
+          constructors
+            synthetic const @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::0::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::0
+          accessors
+            synthetic static get values @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::0::@getter::values
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::0
+              returnType: List<A>
+          methods
+            foo1 @55
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::0::@method::foo1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::0
+              returnType: void
+        enum A @73
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enum::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::1
+          supertype: Enum
+          fields
+            static const enumConstant v @79
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enum::A::@field::v
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enum::A::@field::values
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enum::A
+              type: List<A>
+          constructors
+            synthetic const @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enum::A::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enum::A::@getter::v
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enum::A::@getter::values
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enum::A
+              returnType: List<A>
+          methods
+            foo2 @89
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enum::A::@method::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enum::A
+              returnType: void
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@enum::A::@field::v
+              <testLibrary>::@fragment::package:test/a.dart::@enum::A::@field::values
+            constants
+              <testLibrary>::@fragment::package:test/a.dart::@enum::A::@field::v
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@enum::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@enum::A::@getter::v
+              <testLibrary>::@fragment::package:test/a.dart::@enum::A::@getter::values
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@enum::A::@method::foo2
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::1::@method::foo3
+        augment enum A @115
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::1
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@enum::A
+          methods
+            foo3 @127
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::1::@method::foo3
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::1
+              returnType: void
+''');
+  }
+
+  test_augmentationTarget_no2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+import augment 'b.dart';
+augment enum A {;
+  void foo1() {}
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'a.dart';
+augment enum A {;
+  void foo2() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+      augmentationImports
+        package:test/b.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+          reference: <testLibrary>::@augmentation::package:test/b.dart
+          definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @67
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          fields
+            synthetic static const values @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::values
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              type: List<A>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  rightBracket: ] @0
+                  staticType: List<A>
+          constructors
+            synthetic const @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          accessors
+            synthetic static get values @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getter::values
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: List<A>
+          methods
+            foo1 @79
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@method::foo1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: void
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::values
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getter::values
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@method::foo1
+              <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@method::foo2
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+      enums
+        augment enum A @39
+          reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          methods
+            foo2 @51
+              reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@method::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+              returnType: void
+''');
+  }
+
+  test_augmented_constants_add() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {
+  v2
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v1
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v1 @36
+              reference: <testLibraryFragment>::@enum::A::@field::v1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: A @-1
+                      element: <testLibraryFragment>::@enum::A
+                      type: A
+                    staticElement: <testLibraryFragment>::@enum::A::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: A
+              id: field_0
+              getter: getter_0
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v1 @-1
+                      staticElement: <testLibraryFragment>::@enum::A::@getter::v1
+                      staticType: A
+                    SimpleIdentifier
+                      token: v2 @-1
+                      staticElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getter::v2
+                      staticType: A
+                  rightBracket: ] @0
+                  staticType: List<A>
+              id: field_1
+              getter: getter_1
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v1 @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_0
+              variable: field_0
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+              id: getter_1
+              variable: field_1
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v1
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::v2
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v1
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::v2
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v1
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getter::v2
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          fields
+            static const enumConstant v2 @48
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::v2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: A @-1
+                      element: <testLibraryFragment>::@enum::A
+                      type: A
+                    staticElement: <testLibraryFragment>::@enum::A::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: A
+              id: field_2
+              getter: getter_2
+          accessors
+            synthetic static get v2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getter::v2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: A
+              id: getter_2
+              variable: field_2
+''');
+  }
+
+  test_augmented_constants_add2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {
+  v2
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment enum A {
+  v3
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+enum A {
+  v1
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @55
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v1 @61
+              reference: <testLibraryFragment>::@enum::A::@field::v1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: A @-1
+                      element: <testLibraryFragment>::@enum::A
+                      type: A
+                    staticElement: <testLibraryFragment>::@enum::A::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: A
+              id: field_0
+              getter: getter_0
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v1 @-1
+                      staticElement: <testLibraryFragment>::@enum::A::@getter::v1
+                      staticType: A
+                    SimpleIdentifier
+                      token: v2 @-1
+                      staticElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getter::v2
+                      staticType: A
+                    SimpleIdentifier
+                      token: v3 @-1
+                      staticElement: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@getter::v3
+                      staticType: A
+                  rightBracket: ] @0
+                  staticType: List<A>
+              id: field_1
+              getter: getter_1
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v1 @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_0
+              variable: field_0
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+              id: getter_1
+              variable: field_1
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v1
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::v2
+              <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@field::v3
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v1
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::v2
+              <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@field::v3
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v1
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getter::v2
+              <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@getter::v3
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          fields
+            static const enumConstant v2 @48
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::v2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: A @-1
+                      element: <testLibraryFragment>::@enum::A
+                      type: A
+                    staticElement: <testLibraryFragment>::@enum::A::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: A
+              id: field_2
+              getter: getter_2
+          accessors
+            synthetic static get v2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getter::v2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: A
+              id: getter_2
+              variable: field_2
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          fields
+            static const enumConstant v3 @48
+              reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@field::v3
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: A @-1
+                      element: <testLibraryFragment>::@enum::A
+                      type: A
+                    staticElement: <testLibraryFragment>::@enum::A::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: A
+              id: field_3
+              getter: getter_3
+          accessors
+            synthetic static get v3 @-1
+              reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@getter::v3
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+              returnType: A
+              id: getter_3
+              variable: field_3
+''');
+  }
+
+  test_augmented_constants_add_augment() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {
+  v2,
+  augment v2
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v1
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v1 @36
+              reference: <testLibraryFragment>::@enum::A::@field::v1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: A @-1
+                      element: <testLibraryFragment>::@enum::A
+                      type: A
+                    staticElement: <testLibraryFragment>::@enum::A::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: A
+              id: field_0
+              getter: getter_0
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v1 @-1
+                      staticElement: <testLibraryFragment>::@enum::A::@getter::v1
+                      staticType: A
+                    SimpleIdentifier
+                      token: v2 @-1
+                      staticElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getter::v2
+                      staticType: A
+                  rightBracket: ] @0
+                  staticType: List<A>
+              id: field_1
+              getter: getter_1
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v1 @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_0
+              variable: field_0
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+              id: getter_1
+              variable: field_1
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v1
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v2
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v1
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v2
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v1
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getter::v2
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          fields
+            static const enumConstant v2 @48
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::v2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: A @-1
+                      element: <testLibraryFragment>::@enum::A
+                      type: A
+                    staticElement: <testLibraryFragment>::@enum::A::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: A
+              id: field_2
+              getter: getter_2
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v2
+            augment static const enumConstant v2 @62
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: A @-1
+                      element: <testLibraryFragment>::@enum::A
+                      type: A
+                    staticElement: <testLibraryFragment>::@enum::A::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: A
+              id: field_3
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::v2
+          accessors
+            synthetic static get v2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getter::v2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: A
+              id: getter_2
+              variable: field_2
+''');
+  }
+
+  test_augmented_constants_augment() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {
+  augment v2
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v1, v2, v3
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v1 @36
+              reference: <testLibraryFragment>::@enum::A::@field::v1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: A @-1
+                      element: <testLibraryFragment>::@enum::A
+                      type: A
+                    staticElement: <testLibraryFragment>::@enum::A::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: A
+              id: field_0
+              getter: getter_0
+            static const enumConstant v2 @40
+              reference: <testLibraryFragment>::@enum::A::@field::v2
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: A @-1
+                      element: <testLibraryFragment>::@enum::A
+                      type: A
+                    staticElement: <testLibraryFragment>::@enum::A::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: A
+              id: field_1
+              getter: getter_1
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v2
+            static const enumConstant v3 @44
+              reference: <testLibraryFragment>::@enum::A::@field::v3
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: A @-1
+                      element: <testLibraryFragment>::@enum::A
+                      type: A
+                    staticElement: <testLibraryFragment>::@enum::A::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: A
+              id: field_2
+              getter: getter_2
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v1 @-1
+                      staticElement: <testLibraryFragment>::@enum::A::@getter::v1
+                      staticType: A
+                    SimpleIdentifier
+                      token: v2 @-1
+                      staticElement: <testLibraryFragment>::@enum::A::@getter::v2
+                      staticType: A
+                    SimpleIdentifier
+                      token: v3 @-1
+                      staticElement: <testLibraryFragment>::@enum::A::@getter::v3
+                      staticType: A
+                  rightBracket: ] @0
+                  staticType: List<A>
+              id: field_3
+              getter: getter_3
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v1 @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_0
+              variable: field_0
+            synthetic static get v2 @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v2
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_1
+              variable: field_1
+            synthetic static get v3 @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v3
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_2
+              variable: field_2
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+              id: getter_3
+              variable: field_3
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v1
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v2
+              <testLibraryFragment>::@enum::A::@field::v3
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v1
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v2
+              <testLibraryFragment>::@enum::A::@field::v3
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v1
+              <testLibraryFragment>::@enum::A::@getter::v2
+              <testLibraryFragment>::@enum::A::@getter::v3
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          fields
+            augment static const enumConstant v2 @56
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: A @-1
+                      element: <testLibraryFragment>::@enum::A
+                      type: A
+                    staticElement: <testLibraryFragment>::@enum::A::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: A
+              id: field_4
+              augmentationTarget: <testLibraryFragment>::@enum::A::@field::v2
+''');
+  }
+
+  test_augmented_constants_augment_withArguments() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {
+  augment v1(3)
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v1(1), v2(2);
+  const A(int value);
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v1 @36
+              reference: <testLibraryFragment>::@enum::A::@field::v1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: A @-1
+                      element: <testLibraryFragment>::@enum::A
+                      type: A
+                    staticElement: <testLibraryFragment>::@enum::A::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    arguments
+                      IntegerLiteral
+                        literal: 1 @39
+                        staticType: int
+                    rightParenthesis: ) @0
+                  staticType: A
+              id: field_0
+              getter: getter_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v1
+            static const enumConstant v2 @43
+              reference: <testLibraryFragment>::@enum::A::@field::v2
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: A @-1
+                      element: <testLibraryFragment>::@enum::A
+                      type: A
+                    staticElement: <testLibraryFragment>::@enum::A::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    arguments
+                      IntegerLiteral
+                        literal: 2 @46
+                        staticType: int
+                    rightParenthesis: ) @0
+                  staticType: A
+              id: field_1
+              getter: getter_1
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v1 @-1
+                      staticElement: <testLibraryFragment>::@enum::A::@getter::v1
+                      staticType: A
+                    SimpleIdentifier
+                      token: v2 @-1
+                      staticElement: <testLibraryFragment>::@enum::A::@getter::v2
+                      staticType: A
+                  rightBracket: ] @0
+                  staticType: List<A>
+              id: field_2
+              getter: getter_2
+          constructors
+            const @58
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+              parameters
+                requiredPositional value @64
+                  type: int
+          accessors
+            synthetic static get v1 @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_0
+              variable: field_0
+            synthetic static get v2 @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v2
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_1
+              variable: field_1
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+              id: getter_2
+              variable: field_2
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v1
+              <testLibraryFragment>::@enum::A::@field::v2
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v1
+              <testLibraryFragment>::@enum::A::@field::v2
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v1
+              <testLibraryFragment>::@enum::A::@getter::v2
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          fields
+            augment static const enumConstant v1 @56
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: A @-1
+                      element: <testLibraryFragment>::@enum::A
+                      type: A
+                    staticElement: <testLibraryFragment>::@enum::A::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    arguments
+                      IntegerLiteral
+                        literal: 3 @59
+                        staticType: int
+                    rightParenthesis: ) @0
+                  staticType: A
+              id: field_3
+              augmentationTarget: <testLibraryFragment>::@enum::A::@field::v1
+''');
+  }
+
+  test_augmented_constants_typeParameterCountMismatch() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A<T> {
+  augment v
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v, v2
+}
+''');
+
+    configuration
+      ..withConstructors = false
+      ..withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v
+            static const enumConstant v2 @39
+              reference: <testLibraryFragment>::@enum::A::@field::v2
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get v2 @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v2
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+          augmented
+            fields
+              FieldMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v
+                augmentationSubstitution: {T: InvalidType}
+              <testLibraryFragment>::@enum::A::@field::v2
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              FieldMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v
+                augmentationSubstitution: {T: InvalidType}
+              <testLibraryFragment>::@enum::A::@field::v2
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::v2
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T @44
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          fields
+            augment static const enumConstant v @59
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              augmentationTarget: <testLibraryFragment>::@enum::A::@field::v
+''');
+  }
+
+  test_augmented_constructors_add_named() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  const A.named();
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v.named();
+}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructor::named
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          constructors
+            const named @57
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructor::named
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              periodOffset: 56
+              nameEnd: 62
+''');
+  }
+
+  test_augmented_constructors_add_named_generic() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A<T2> {;
+  const A.named(T2 a);
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A<T1> {
+  v<int>.named()
+}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T1 @32
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @40
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A<int>
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A<dynamic>>
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A<int>
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A<dynamic>>
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              ConstructorMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructor::named
+                augmentationSubstitution: {T2: T1}
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @44
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          constructors
+            const named @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructor::named
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              periodOffset: 60
+              nameEnd: 66
+              parameters
+                requiredPositional a @70
+                  type: T2
+''');
+  }
+
+  test_augmented_constructors_add_named_hasUnnamed() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  const A.named();
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v;
+  const A();
+}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+          constructors
+            const @47
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructor::named
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          constructors
+            const named @57
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructor::named
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              periodOffset: 56
+              nameEnd: 62
+''');
+  }
+
+  test_augmented_constructors_add_unnamed() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  const A();
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v;
+}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          constructors
+            const @55
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+''');
+  }
+
+  test_augmented_constructors_add_unnamed_hasNamed() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  const A();
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v;
+  const A.named();
+}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+          constructors
+            const named @49
+              reference: <testLibraryFragment>::@enum::A::@constructor::named
+              enclosingElement: <testLibraryFragment>::@enum::A
+              periodOffset: 48
+              nameEnd: 54
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructor::new
+              <testLibraryFragment>::@enum::A::@constructor::named
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          constructors
+            const @55
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+''');
+  }
+
+  test_augmented_constructors_add_useFieldFormal() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  const A.named(this.f);
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v(0);
+  final int f;
+}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+            final f @54
+              reference: <testLibraryFragment>::@enum::A::@field::f
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: int
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+            synthetic get f @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::f
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: int
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::f
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructor::named
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::f
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          constructors
+            const named @57
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructor::named
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              periodOffset: 56
+              nameEnd: 62
+              parameters
+                requiredPositional final this.f @68
+                  type: int
+                  field: <testLibraryFragment>::@enum::A::@field::f
+''');
+  }
+
+  test_augmented_constructors_add_useFieldInitializer() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  const A.named() : f = 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v;
+  final int f;
+}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+            final f @51
+              reference: <testLibraryFragment>::@enum::A::@field::f
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: int
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+            synthetic get f @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::f
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: int
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::f
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructor::named
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::f
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          constructors
+            const named @57
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructor::named
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              periodOffset: 56
+              nameEnd: 62
+              constantInitializers
+                ConstructorFieldInitializer
+                  fieldName: SimpleIdentifier
+                    token: f @67
+                    staticElement: <testLibraryFragment>::@enum::A::@field::f
+                    staticType: null
+                  equals: = @69
+                  expression: IntegerLiteral
+                    literal: 0 @71
+                    staticType: int
+''');
+  }
+
+  test_augmented_field_augment_field() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment final int foo = 1;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v;
+  final int foo = 0;
+}
+''');
+
+    configuration
+      ..withConstantInitializers = false
+      ..withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              id: field_0
+              getter: getter_0
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              id: field_1
+              getter: getter_1
+            final foo @51
+              reference: <testLibraryFragment>::@enum::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_2
+              getter: getter_2
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::foo
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_0
+              variable: field_0
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+              id: getter_1
+              variable: field_1
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: int
+              id: getter_2
+              variable: field_2
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::foo
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::foo
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          fields
+            augment final foo @67
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_3
+              augmentationTarget: <testLibraryFragment>::@enum::A::@field::foo
+''');
+  }
+
+  test_augmented_field_augment_field2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment final int foo = 1;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment final int foo = 2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+enum A {
+  v;
+  final int foo = 0;
+}
+''');
+
+    configuration
+      ..withConstantInitializers = false
+      ..withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @55
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @61
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              id: field_0
+              getter: getter_0
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              id: field_1
+              getter: getter_1
+            final foo @76
+              reference: <testLibraryFragment>::@enum::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_2
+              getter: getter_2
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::foo
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_0
+              variable: field_0
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+              id: getter_1
+              variable: field_1
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: int
+              id: getter_2
+              variable: field_2
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@fieldAugmentation::foo
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::foo
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          fields
+            augment final foo @67
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_3
+              augmentationTarget: <testLibraryFragment>::@enum::A::@field::foo
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@fieldAugmentation::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          fields
+            augment final foo @67
+              reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_4
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::foo
+''');
+  }
+
+  test_augmented_field_augment_field_afterGetter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment int get foo => 1;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment final int foo = 2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+enum A {
+  v;
+  final int foo = 0;
+}
+''');
+
+    configuration
+      ..withConstantInitializers = false
+      ..withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @55
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @61
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              id: field_0
+              getter: getter_0
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              id: field_1
+              getter: getter_1
+            final foo @76
+              reference: <testLibraryFragment>::@enum::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_2
+              getter: getter_2
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@fieldAugmentation::foo
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_0
+              variable: field_0
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+              id: getter_1
+              variable: field_1
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: int
+              id: getter_2
+              variable: field_2
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getterAugmentation::foo
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@fieldAugmentation::foo
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getterAugmentation::foo
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: int
+              id: getter_3
+              variable: field_2
+              augmentationTarget: <testLibraryFragment>::@enum::A::@getter::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          fields
+            augment final foo @67
+              reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_3
+              augmentationTarget: <testLibraryFragment>::@enum::A::@field::foo
+''');
+  }
+
+  test_augmented_field_augment_field_afterSetter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment set foo(int _) {}
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment final int foo = 2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+enum A {
+  v;
+  final int foo = 0;
+}
+''');
+
+    configuration
+      ..withConstantInitializers = false
+      ..withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @55
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @61
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              id: field_0
+              getter: getter_0
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              id: field_1
+              getter: getter_1
+            final foo @76
+              reference: <testLibraryFragment>::@enum::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_2
+              getter: getter_2
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@fieldAugmentation::foo
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_0
+              variable: field_0
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+              id: getter_1
+              variable: field_1
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: int
+              id: getter_2
+              variable: field_2
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@fieldAugmentation::foo
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::foo
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@setterAugmentation::foo
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          accessors
+            augment set foo= @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@setterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              parameters
+                requiredPositional _ @69
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: <null>
+              augmentationTargetAny: <testLibraryFragment>::@enum::A::@getter::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          fields
+            augment final foo @67
+              reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_3
+              augmentationTarget: <testLibraryFragment>::@enum::A::@field::foo
+''');
+  }
+
+  test_augmented_field_augment_field_differentTypes() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment final double foo = 1.2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v;
+  final int foo = 0;
+}
+''');
+
+    configuration
+      ..withConstantInitializers = false
+      ..withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              id: field_0
+              getter: getter_0
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              id: field_1
+              getter: getter_1
+            final foo @51
+              reference: <testLibraryFragment>::@enum::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_2
+              getter: getter_2
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::foo
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_0
+              variable: field_0
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+              id: getter_1
+              variable: field_1
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: int
+              id: getter_2
+              variable: field_2
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::foo
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::foo
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          fields
+            augment final foo @70
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              type: double
+              shouldUseTypeForInitializerInference: true
+              id: field_3
+              augmentationTarget: <testLibraryFragment>::@enum::A::@field::foo
+''');
+  }
+
+  test_augmented_field_augment_field_functionExpression() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment final int Function() foo = () {
+    return augmented() + 1;
+  };
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v;
+  final int Function() foo = () {
+    return 0;
+  };
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: A @-1
+                      element: <testLibraryFragment>::@enum::A
+                      type: A
+                    staticElement: <testLibraryFragment>::@enum::A::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: A
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::A::@getter::v
+                      staticType: A
+                  rightBracket: ] @0
+                  staticType: List<A>
+            final foo @62
+              reference: <testLibraryFragment>::@enum::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: int Function()
+              shouldUseTypeForInitializerInference: true
+              constantInitializer
+                SimpleIdentifier
+                  token: _notSerializableExpression @-1
+                  staticElement: <null>
+                  staticType: null
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::foo
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: int Function()
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::foo
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::foo
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          fields
+            augment final foo @78
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              type: int Function()
+              shouldUseTypeForInitializerInference: true
+              constantInitializer
+                SimpleIdentifier
+                  token: _notSerializableExpression @-1
+                  staticElement: <null>
+                  staticType: null
+              augmentationTarget: <testLibraryFragment>::@enum::A::@field::foo
+''');
+  }
+
+  /// This is not allowed by the specification, but allowed syntactically,
+  /// so we need a way to handle it.
+  test_augmented_field_augment_getter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment final int foo = 1;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v;
+  int get foo => 0;
+}
+''');
+
+    configuration
+      ..withConstantInitializers = false
+      ..withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              id: field_0
+              getter: getter_0
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              id: field_1
+              getter: getter_1
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@enum::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: int
+              id: field_2
+              getter: getter_2
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::foo
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_0
+              variable: field_0
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+              id: getter_1
+              variable: field_1
+            get foo @49
+              reference: <testLibraryFragment>::@enum::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: int
+              id: getter_2
+              variable: field_2
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::foo
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::foo
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          fields
+            augment final foo @67
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_3
+              augmentationTarget: <testLibraryFragment>::@enum::A::@field::foo
+''');
+  }
+
+  test_augmented_fields_add() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  final int foo2 = 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v;
+  final int foo1 = 0;
+}
+''');
+
+    configuration
+      ..withConstantInitializers = false
+      ..withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              id: field_0
+              getter: getter_0
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              id: field_1
+              getter: getter_1
+            final foo1 @51
+              reference: <testLibraryFragment>::@enum::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_2
+              getter: getter_2
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_0
+              variable: field_0
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+              id: getter_1
+              variable: field_1
+            synthetic get foo1 @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::foo1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: int
+              id: getter_2
+              variable: field_2
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::foo2
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getter::foo2
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          fields
+            final foo2 @59
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_3
+              getter: getter_3
+          accessors
+            synthetic get foo2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: int
+              id: getter_3
+              variable: field_3
+''');
+  }
+
+  test_augmented_fields_add_generic() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A<T2> {;
+  final T2 foo2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A<T1> {
+  v<int>();
+  final T1 foo1;
+}
+''');
+
+    configuration
+      ..withConstantInitializers = false
+      ..withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T1 @32
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @40
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A<int>
+              shouldUseTypeForInitializerInference: false
+              id: field_0
+              getter: getter_0
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A<dynamic>>
+              id: field_1
+              getter: getter_1
+            final foo1 @61
+              reference: <testLibraryFragment>::@enum::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: T1
+              id: field_2
+              getter: getter_2
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A<int>
+              id: getter_0
+              variable: field_0
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A<dynamic>>
+              id: getter_1
+              variable: field_1
+            synthetic get foo1 @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::foo1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: T1
+              id: getter_2
+              variable: field_2
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::foo1
+              FieldMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::foo2
+                augmentationSubstitution: {T2: T1}
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::foo1
+              PropertyAccessorMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getter::foo2
+                augmentationSubstitution: {T2: T1}
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @44
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          fields
+            final foo2 @62
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              type: T2
+              id: field_3
+              getter: getter_3
+          accessors
+            synthetic get foo2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: T2
+              id: getter_3
+              variable: field_3
+''');
+  }
+
+  test_augmented_fields_add_useFieldFormal() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  final int foo;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v(0);
+  const A(this.foo);
+}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+          constructors
+            const @50
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+              parameters
+                requiredPositional final this.foo @57
+                  type: int
+                  field: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::foo
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::foo
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getter::foo
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          fields
+            final foo @59
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              type: int
+          accessors
+            synthetic get foo @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getter::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: int
+''');
+  }
+
+  test_augmented_fields_add_useFieldInitializer() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  final int foo;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v;
+  const A() : foo = 0;
+}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+          constructors
+            const @47
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+              constantInitializers
+                ConstructorFieldInitializer
+                  fieldName: SimpleIdentifier
+                    token: foo @53
+                    staticElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::foo
+                    staticType: null
+                  equals: = @57
+                  expression: IntegerLiteral
+                    literal: 0 @59
+                    staticType: int
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::foo
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getter::foo
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          fields
+            final foo @59
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              type: int
+          accessors
+            synthetic get foo @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getter::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: int
+''');
+  }
+
+  test_augmented_getters_add() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  int get foo2 => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v;
+  int get foo1 => 0;
+}
+''');
+
+    configuration
+      ..withConstantInitializers = false
+      ..withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              id: field_0
+              getter: getter_0
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              id: field_1
+              getter: getter_1
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@enum::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: int
+              id: field_2
+              getter: getter_2
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_0
+              variable: field_0
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+              id: getter_1
+              variable: field_1
+            get foo1 @49
+              reference: <testLibraryFragment>::@enum::A::@getter::foo1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: int
+              id: getter_2
+              variable: field_2
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::foo2
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getter::foo2
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          fields
+            synthetic foo2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              type: int
+              id: field_3
+              getter: getter_3
+          accessors
+            get foo2 @57
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: int
+              id: getter_3
+              variable: field_3
+''');
+  }
+
+  test_augmented_getters_add_generic() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A<T2> {;
+  T2 get foo2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A<T1> {
+  v<int>();
+  T1 get foo1;
+}
+''');
+
+    configuration
+      ..withConstantInitializers = false
+      ..withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T1 @32
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @40
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A<int>
+              shouldUseTypeForInitializerInference: false
+              id: field_0
+              getter: getter_0
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A<dynamic>>
+              id: field_1
+              getter: getter_1
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@enum::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: T1
+              id: field_2
+              getter: getter_2
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A<int>
+              id: getter_0
+              variable: field_0
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A<dynamic>>
+              id: getter_1
+              variable: field_1
+            abstract get foo1 @59
+              reference: <testLibraryFragment>::@enum::A::@getter::foo1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: T1
+              id: getter_2
+              variable: field_2
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::foo1
+              FieldMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::foo2
+                augmentationSubstitution: {T2: T1}
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::foo1
+              PropertyAccessorMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getter::foo2
+                augmentationSubstitution: {T2: T1}
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @44
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          fields
+            synthetic foo2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              type: T2
+              id: field_3
+              getter: getter_3
+          accessors
+            abstract get foo2 @60
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: T2
+              id: getter_3
+              variable: field_3
+''');
+  }
+
+  test_augmented_getters_augment_field() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment int get foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v;
+  final int foo = 0;
+}
+''');
+
+    configuration
+      ..withConstantInitializers = false
+      ..withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              id: field_0
+              getter: getter_0
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              id: field_1
+              getter: getter_1
+            final foo @51
+              reference: <testLibraryFragment>::@enum::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_2
+              getter: getter_2
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_0
+              variable: field_0
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+              id: getter_1
+              variable: field_1
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: int
+              id: getter_2
+              variable: field_2
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getterAugmentation::foo
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::foo
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getterAugmentation::foo
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: int
+              id: getter_3
+              variable: field_2
+              augmentationTarget: <testLibraryFragment>::@enum::A::@getter::foo
+''');
+  }
+
+  test_augmented_getters_augment_field2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment int get foo => 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment int get foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+enum A {
+  v;
+  final int foo = 0;
+}
+''');
+
+    configuration
+      ..withConstantInitializers = false
+      ..withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @55
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @61
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              id: field_0
+              getter: getter_0
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              id: field_1
+              getter: getter_1
+            final foo @76
+              reference: <testLibraryFragment>::@enum::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_2
+              getter: getter_2
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_0
+              variable: field_0
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+              id: getter_1
+              variable: field_1
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: int
+              id: getter_2
+              variable: field_2
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getterAugmentation::foo
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::foo
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@getterAugmentation::foo
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: int
+              id: getter_3
+              variable: field_2
+              augmentationTarget: <testLibraryFragment>::@enum::A::@getter::foo
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@getterAugmentation::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+              returnType: int
+              id: getter_4
+              variable: field_2
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getterAugmentation::foo
+''');
+  }
+
+  test_augmented_getters_augment_getter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment int get foo1 => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v;
+  int get foo1 => 0;
+  int get foo2 => 0;
+}
+''');
+
+    configuration
+      ..withConstantInitializers = false
+      ..withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              id: field_0
+              getter: getter_0
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              id: field_1
+              getter: getter_1
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@enum::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: int
+              id: field_2
+              getter: getter_2
+            synthetic foo2 @-1
+              reference: <testLibraryFragment>::@enum::A::@field::foo2
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: int
+              id: field_3
+              getter: getter_3
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_0
+              variable: field_0
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+              id: getter_1
+              variable: field_1
+            get foo1 @49
+              reference: <testLibraryFragment>::@enum::A::@getter::foo1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: int
+              id: getter_2
+              variable: field_2
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getterAugmentation::foo1
+            get foo2 @70
+              reference: <testLibraryFragment>::@enum::A::@getter::foo2
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: int
+              id: getter_3
+              variable: field_3
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::foo1
+              <testLibraryFragment>::@enum::A::@field::foo2
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getterAugmentation::foo1
+              <testLibraryFragment>::@enum::A::@getter::foo2
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          accessors
+            augment get foo1 @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getterAugmentation::foo1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: int
+              id: getter_4
+              variable: field_2
+              augmentationTarget: <testLibraryFragment>::@enum::A::@getter::foo1
+''');
+  }
+
+  test_augmented_getters_augment_getter2_oneLib_oneTop() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment int get foo => 0;
+  augment int get foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v;
+  int get foo => 0;
+}
+''');
+
+    configuration
+      ..withConstantInitializers = false
+      ..withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              id: field_0
+              getter: getter_0
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              id: field_1
+              getter: getter_1
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@enum::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: int
+              id: field_2
+              getter: getter_2
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_0
+              variable: field_0
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+              id: getter_1
+              variable: field_1
+            get foo @49
+              reference: <testLibraryFragment>::@enum::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: int
+              id: getter_2
+              variable: field_2
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getterAugmentation::foo::@def::0
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::foo
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getterAugmentation::foo::@def::1
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getterAugmentation::foo::@def::0
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: int
+              id: getter_3
+              variable: field_2
+              augmentationTarget: <testLibraryFragment>::@enum::A::@getter::foo
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getterAugmentation::foo::@def::1
+            augment get foo @93
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getterAugmentation::foo::@def::1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: int
+              id: getter_4
+              variable: field_2
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getterAugmentation::foo::@def::0
+''');
+  }
+
+  test_augmented_getters_augment_getter2_twoLib() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment int get foo => 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment int get foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+enum A {
+  v;
+  int get foo => 0;
+}
+''');
+
+    configuration
+      ..withConstantInitializers = false
+      ..withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @55
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @61
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              id: field_0
+              getter: getter_0
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              id: field_1
+              getter: getter_1
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@enum::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: int
+              id: field_2
+              getter: getter_2
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_0
+              variable: field_0
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+              id: getter_1
+              variable: field_1
+            get foo @74
+              reference: <testLibraryFragment>::@enum::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: int
+              id: getter_2
+              variable: field_2
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getterAugmentation::foo
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::foo
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@getterAugmentation::foo
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: int
+              id: getter_3
+              variable: field_2
+              augmentationTarget: <testLibraryFragment>::@enum::A::@getter::foo
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@getterAugmentation::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+              returnType: int
+              id: getter_4
+              variable: field_2
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getterAugmentation::foo
+''');
+  }
+
+  test_augmented_getters_augment_nothing() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment int get foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v
+}
+''');
+
+    configuration
+      ..withConstantInitializers = false
+      ..withConstructors = false
+      ..withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              id: field_0
+              getter: getter_0
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              id: field_1
+              getter: getter_1
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_0
+              variable: field_0
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+              id: getter_1
+              variable: field_1
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getterAugmentation::foo
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: int
+              id: getter_2
+              variable: <null>
+''');
+  }
+
+  test_augmented_interfaces() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A implements I2 {}
+class I2 {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A implements I1 {
+  v
+}
+class I1 {}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class I1 @60
+          reference: <testLibraryFragment>::@class::I1
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::I1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::I1
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          interfaces
+            I1
+          fields
+            static const enumConstant v @50
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+          augmented
+            interfaces
+              I1
+              I2
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class I2 @67
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          interfaces
+            I2
+''');
+  }
+
+  test_augmented_interfaces_chain() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+import augment 'b.dart';
+augment enum A implements I2 {}
+class I2 {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'a.dart';
+augment enum A implements I3 {}
+class I3 {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A implements I1 {
+  v
+}
+class I1 {}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+      augmentationImports
+        package:test/b.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+          reference: <testLibrary>::@augmentation::package:test/b.dart
+          definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class I1 @60
+          reference: <testLibraryFragment>::@class::I1
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::I1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::I1
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          interfaces
+            I1
+          fields
+            static const enumConstant v @50
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+          augmented
+            interfaces
+              I1
+              I2
+              I3
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class I2 @92
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+      enums
+        augment enum A @67
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          interfaces
+            I2
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+      classes
+        class I3 @64
+          reference: <testLibrary>::@fragment::package:test/b.dart::@class::I3
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/b.dart::@class::I3::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@class::I3
+      enums
+        augment enum A @39
+          reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          interfaces
+            I3
+''');
+  }
+
+  test_augmented_interfaces_generic() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A<T2> implements I2<T2> {}
+class I2<E> {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A<T> implements I1 {
+  v<int>()
+}
+class I1 {}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class I1 @70
+          reference: <testLibraryFragment>::@class::I1
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::I1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::I1
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @32
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          interfaces
+            I1
+          fields
+            static const enumConstant v @53
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A<int>
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A<dynamic>>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A<int>
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A<dynamic>>
+          augmented
+            interfaces
+              I1
+              I2<T>
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class I2 @75
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant E @78
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @44
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          interfaces
+            I2<T2>
+''');
+  }
+
+  test_augmented_interfaces_generic_mismatch() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A<T2, T3> implements I2<T2> {}
+class I2<E> {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A<T> implements I1 {
+  v
+}
+class I1 {}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class I1 @63
+          reference: <testLibraryFragment>::@class::I1
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::I1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::I1
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @32
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          interfaces
+            I1
+          fields
+            static const enumConstant v @53
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A<dynamic>
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A<dynamic>>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A<dynamic>
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A<dynamic>>
+          augmented
+            interfaces
+              I1
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class I2 @79
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant E @82
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @44
+              defaultType: dynamic
+            covariant T3 @48
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          interfaces
+            I2<T2>
+''');
+  }
+
+  test_augmented_methods() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  void bar() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v;
+  void foo() {}
+}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+          methods
+            foo @46
+              reference: <testLibraryFragment>::@enum::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: void
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@method::bar
+              <testLibraryFragment>::@enum::A::@method::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          methods
+            bar @54
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@method::bar
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: void
+''');
+  }
+
+  test_augmented_methods_add_withDefaultValue() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  void foo([int x = 42]) {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: A @-1
+                      element: <testLibraryFragment>::@enum::A
+                      type: A
+                    staticElement: <testLibraryFragment>::@enum::A::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: A
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::A::@getter::v
+                      staticType: A
+                  rightBracket: ] @0
+                  staticType: List<A>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@method::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          methods
+            foo @54
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@method::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              parameters
+                optionalPositional default x @63
+                  type: int
+                  constantInitializer
+                    IntegerLiteral
+                      literal: 42 @67
+                      staticType: int
+              returnType: void
+''');
+  }
+
+  test_augmented_methods_augment() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment void foo1() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v;
+  void foo1() {}
+  void foo2() {}
+}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+          methods
+            foo1 @46
+              reference: <testLibraryFragment>::@enum::A::@method::foo1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: void
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@methodAugmentation::foo1
+            foo2 @63
+              reference: <testLibraryFragment>::@enum::A::@method::foo2
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: void
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@methodAugmentation::foo1
+              <testLibraryFragment>::@enum::A::@method::foo2
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          methods
+            augment foo1 @62
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@methodAugmentation::foo1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: void
+              augmentationTarget: <testLibraryFragment>::@enum::A::@method::foo1
+''');
+  }
+
+  test_augmented_methods_augment2_oneLib_oneTop() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment void foo() {}
+  augment void foo() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v;
+  void foo() {}
+}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+          methods
+            foo @46
+              reference: <testLibraryFragment>::@enum::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: void
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@methodAugmentation::foo::@def::0
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@methodAugmentation::foo::@def::1
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          methods
+            augment foo @62
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@methodAugmentation::foo::@def::0
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: void
+              augmentationTarget: <testLibraryFragment>::@enum::A::@method::foo
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@methodAugmentation::foo::@def::1
+            augment foo @86
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@methodAugmentation::foo::@def::1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: void
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@methodAugmentation::foo::@def::0
+''');
+  }
+
+  test_augmented_methods_augment2_oneLib_twoTop() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment void foo() {}
+}
+augment enum A {;
+  augment void foo() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v;
+  void foo() {}
+}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::0
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+          methods
+            foo @46
+              reference: <testLibraryFragment>::@enum::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: void
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::0::@methodAugmentation::foo
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::1::@methodAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::0
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::1
+          methods
+            augment foo @62
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::0::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::0
+              returnType: void
+              augmentationTarget: <testLibraryFragment>::@enum::A::@method::foo
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::1::@methodAugmentation::foo
+        augment enum A @86
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::1
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::0
+          methods
+            augment foo @106
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::1::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::1
+              returnType: void
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@def::0::@methodAugmentation::foo
+''');
+  }
+
+  test_augmented_methods_augment2_twoLib() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+import augment 'b.dart';
+augment enum A {;
+  augment void foo() {}
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'a.dart';
+augment enum A {;
+  augment void foo() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v;
+  void foo() {}
+}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+      augmentationImports
+        package:test/b.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+          reference: <testLibrary>::@augmentation::package:test/b.dart
+          definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+          methods
+            foo @46
+              reference: <testLibraryFragment>::@enum::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: void
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@methodAugmentation::foo
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+            methods
+              <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@methodAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @67
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          methods
+            augment foo @87
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: void
+              augmentationTarget: <testLibraryFragment>::@enum::A::@method::foo
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@methodAugmentation::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+      enums
+        augment enum A @39
+          reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          methods
+            augment foo @59
+              reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+              returnType: void
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@methodAugmentation::foo
+''');
+  }
+
+  test_augmented_methods_generic() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A<T2> {;
+  T2 bar() => throw 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A<T> {
+  v<int>();
+  T foo() => throw 0;
+}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @32
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @39
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A<int>
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A<dynamic>>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A<int>
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A<dynamic>>
+          methods
+            foo @53
+              reference: <testLibraryFragment>::@enum::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: T
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+            methods
+              MethodMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@method::bar
+                augmentationSubstitution: {T2: T}
+              <testLibraryFragment>::@enum::A::@method::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @44
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          methods
+            bar @56
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@method::bar
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: T2
+''');
+  }
+
+  test_augmented_methods_generic_augment() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A<T2> {;
+  augment T2 foo() => throw 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A<T> {
+  v<int>();
+  T foo() => throw 0;
+}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @32
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @39
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A<int>
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A<dynamic>>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A<int>
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A<dynamic>>
+          methods
+            foo @53
+              reference: <testLibraryFragment>::@enum::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: T
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@methodAugmentation::foo
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+            methods
+              MethodMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@methodAugmentation::foo
+                augmentationSubstitution: {T2: T}
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @44
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          methods
+            augment foo @64
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              returnType: T2
+              augmentationTarget: <testLibraryFragment>::@enum::A::@method::foo
+''');
+  }
+
+  test_augmented_mixins() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A with M2 {}
+mixin M2 {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A with M1 {
+  v
+}
+mixin M1 {}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          mixins
+            M1
+          fields
+            static const enumConstant v @44
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+          augmented
+            mixins
+              M1
+              M2
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+      mixins
+        mixin M1 @54
+          reference: <testLibraryFragment>::@mixin::M1
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          mixins
+            M2
+      mixins
+        mixin M2 @61
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixin::M2
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_augmented_mixins_inferredTypeArguments() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A<T2> with M2 {}
+mixin M2<U2> on M1<U2> {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment enum A<T3> with M3 {}
+mixin M3<U3> on M2<U3> {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+enum A<T1> with M1<T1> {
+  v<int>()
+}
+mixin M1<U1> {}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @55
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T1 @57
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          mixins
+            M1<T1>
+          fields
+            static const enumConstant v @77
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A<int>
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A<dynamic>>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A<int>
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A<dynamic>>
+          augmented
+            mixins
+              M1<T1>
+              M2<T1>
+              M3<T1>
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+      mixins
+        mixin M1 @94
+          reference: <testLibraryFragment>::@mixin::M1
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant U1 @97
+              defaultType: dynamic
+          superclassConstraints
+            Object
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @44
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          mixins
+            M2<T2>
+      mixins
+        mixin M2 @65
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixin::M2
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant U2 @68
+              defaultType: dynamic
+          superclassConstraints
+            M1<U2>
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          typeParameters
+            covariant T3 @44
+              defaultType: dynamic
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          mixins
+            M3<T3>
+      mixins
+        mixin M3 @65
+          reference: <testLibrary>::@fragment::package:test/b.dart::@mixin::M3
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          typeParameters
+            covariant U3 @68
+              defaultType: dynamic
+          superclassConstraints
+            M2<U3>
+''');
+  }
+
+  test_augmented_setters_add() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  set foo2(int _) {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v;
+  set foo1(int _) {}
+}
+''');
+
+    configuration
+      ..withConstantInitializers = false
+      ..withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              id: field_0
+              getter: getter_0
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              id: field_1
+              getter: getter_1
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@enum::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: int
+              id: field_2
+              setter: setter_0
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_0
+              variable: field_0
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+              id: getter_1
+              variable: field_1
+            set foo1= @45
+              reference: <testLibraryFragment>::@enum::A::@setter::foo1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              parameters
+                requiredPositional _ @54
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_2
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::foo2
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@setter::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@setter::foo2
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          fields
+            synthetic foo2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@field::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              type: int
+              id: field_3
+              setter: setter_1
+          accessors
+            set foo2= @53
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@setter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              parameters
+                requiredPositional _ @62
+                  type: int
+              returnType: void
+              id: setter_1
+              variable: field_3
+''');
+  }
+
+  test_augmented_setters_augment_field() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment set foo(int _) {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v;
+  final int foo = 0;
+}
+''');
+
+    configuration
+      ..withConstantInitializers = false
+      ..withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              id: field_0
+              getter: getter_0
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              id: field_1
+              getter: getter_1
+            final foo @51
+              reference: <testLibraryFragment>::@enum::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_2
+              getter: getter_2
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_0
+              variable: field_0
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+              id: getter_1
+              variable: field_1
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: int
+              id: getter_2
+              variable: field_2
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::foo
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::foo
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@setterAugmentation::foo
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          accessors
+            augment set foo= @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@setterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              parameters
+                requiredPositional _ @69
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: <null>
+              augmentationTargetAny: <testLibraryFragment>::@enum::A::@getter::foo
+''');
+  }
+
+  test_augmented_setters_augment_nothing() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment set foo(int _) {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v
+}
+''');
+
+    configuration
+      ..withConstantInitializers = false
+      ..withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              id: field_0
+              getter: getter_0
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              id: field_1
+              getter: getter_1
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_0
+              variable: field_0
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+              id: getter_1
+              variable: field_1
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@setterAugmentation::foo
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          accessors
+            augment set foo= @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@setterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              parameters
+                requiredPositional _ @69
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: <null>
+''');
+  }
+
+  test_augmented_setters_augment_setter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment set foo1(int _) {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v;
+  set foo1(int _) {}
+  set foo2(int _) {}
+}
+''');
+
+    configuration
+      ..withConstantInitializers = false
+      ..withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              id: field_0
+              getter: getter_0
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              id: field_1
+              getter: getter_1
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@enum::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: int
+              id: field_2
+              setter: setter_0
+            synthetic foo2 @-1
+              reference: <testLibraryFragment>::@enum::A::@field::foo2
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: int
+              id: field_3
+              setter: setter_1
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+              id: getter_0
+              variable: field_0
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+              id: getter_1
+              variable: field_1
+            set foo1= @45
+              reference: <testLibraryFragment>::@enum::A::@setter::foo1
+              enclosingElement: <testLibraryFragment>::@enum::A
+              parameters
+                requiredPositional _ @54
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_2
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@setterAugmentation::foo1
+            set foo2= @66
+              reference: <testLibraryFragment>::@enum::A::@setter::foo2
+              enclosingElement: <testLibraryFragment>::@enum::A
+              parameters
+                requiredPositional _ @75
+                  type: int
+              returnType: void
+              id: setter_1
+              variable: field_3
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::foo1
+              <testLibraryFragment>::@enum::A::@field::foo2
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@setterAugmentation::foo1
+              <testLibraryFragment>::@enum::A::@setter::foo2
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          accessors
+            augment set foo1= @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@setterAugmentation::foo1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              parameters
+                requiredPositional _ @70
+                  type: int
+              returnType: void
+              id: setter_2
+              variable: field_2
+              augmentationTarget: <testLibraryFragment>::@enum::A::@setter::foo1
+''');
+  }
+
+  test_augmentedBy_class2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+
+augment class A {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+
+augment class A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+
+enum A {v}
+''');
+
+    configuration
+      ..withConstantInitializers = false
+      ..withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @56
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant v @59
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @44
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTargetAny: <testLibraryFragment>::@enum::A
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @44
+          reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTargetAny: <testLibraryFragment>::@enum::A
+''');
+  }
+
+  test_augmentedBy_class_enum() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+
+augment class A {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+
+augment enum A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+
+enum A {v}
+''');
+
+    configuration
+      ..withConstantInitializers = false
+      ..withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @56
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @59
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @44
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTargetAny: <testLibraryFragment>::@enum::A
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @43
+          reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+''');
+  }
+
+  test_constructors_augment2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment const A.named();
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment const A.named();
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+enum A {
+  v.named();
+  const A.named();
+}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @55
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @61
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+          constructors
+            const named @82
+              reference: <testLibraryFragment>::@enum::A::@constructor::named
+              enclosingElement: <testLibraryFragment>::@enum::A
+              periodOffset: 81
+              nameEnd: 87
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructorAugmentation::named
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@constructorAugmentation::named
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          constructors
+            augment const named @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructorAugmentation::named
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              periodOffset: 64
+              nameEnd: 70
+              augmentationTarget: <testLibraryFragment>::@enum::A::@constructor::named
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@constructorAugmentation::named
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          constructors
+            augment const named @65
+              reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A::@constructorAugmentation::named
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::A
+              periodOffset: 64
+              nameEnd: 70
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructorAugmentation::named
+''');
+  }
+
+  test_constructors_augment_named() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment const A.named();
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v.named();
+  const A.named();
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: A @-1
+                      element: <testLibraryFragment>::@enum::A
+                      type: A
+                    period: . @0
+                    name: SimpleIdentifier
+                      token: named @-1
+                      staticElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructorAugmentation::named
+                      staticType: null
+                    staticElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructorAugmentation::named
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: A
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::A::@getter::v
+                      staticType: A
+                  rightBracket: ] @0
+                  staticType: List<A>
+          constructors
+            const named @57
+              reference: <testLibraryFragment>::@enum::A::@constructor::named
+              enclosingElement: <testLibraryFragment>::@enum::A
+              periodOffset: 56
+              nameEnd: 62
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructorAugmentation::named
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructorAugmentation::named
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          constructors
+            augment const named @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructorAugmentation::named
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              periodOffset: 64
+              nameEnd: 70
+              augmentationTarget: <testLibraryFragment>::@enum::A::@constructor::named
+''');
+  }
+
+  test_constructors_augment_unnamed() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A {;
+  augment const A();
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v;
+  const A();
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @36
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: A @-1
+                      element: <testLibraryFragment>::@enum::A
+                      type: A
+                    staticElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructorAugmentation::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: A
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: v @-1
+                      staticElement: <testLibraryFragment>::@enum::A::@getter::v
+                      staticType: A
+                  rightBracket: ] @0
+                  staticType: List<A>
+          constructors
+            const @47
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructorAugmentation::new
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A>
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructorAugmentation::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@enum::A
+          constructors
+            augment const @63
+              reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A::@constructorAugmentation::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+              augmentationTarget: <testLibraryFragment>::@enum::A::@constructor::new
+''');
+  }
+
+  test_inferTypes_method_ofAugment() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+abstract class A {
+  int foo(String a);
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment enum B {;
+  foo(a) => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import 'a.dart';
+import augment 'b.dart';
+
+enum B implements A {
+  v
+}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      enums
+        enum B @48
+          reference: <testLibraryFragment>::@enum::B
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::B
+          supertype: Enum
+          interfaces
+            A
+          fields
+            static const enumConstant v @67
+              reference: <testLibraryFragment>::@enum::B::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::B
+              type: B
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::B::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::B
+              type: List<B>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::B
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::B::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::B
+              returnType: B
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::B::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::B
+              returnType: List<B>
+          augmented
+            interfaces
+              A
+            fields
+              <testLibraryFragment>::@enum::B::@field::v
+              <testLibraryFragment>::@enum::B::@field::values
+            constants
+              <testLibraryFragment>::@enum::B::@field::v
+            constructors
+              <testLibraryFragment>::@enum::B::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::B::@getter::v
+              <testLibraryFragment>::@enum::B::@getter::values
+            methods
+              <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::B::@method::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum B @42
+          reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::B
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibraryFragment>::@enum::B
+          methods
+            foo @49
+              reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::B::@method::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::B
+              parameters
+                requiredPositional a @53
+                  type: String
+              returnType: int
+''');
+  }
+
+  test_inferTypes_method_usingAugmentation_interface() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {
+  int foo(String a) => 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+import 'a.dart';
+augment enum B implements A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'b.dart';
+
+enum B {
+  v;
+  foo(a) => 0;
+}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum B @31
+          reference: <testLibraryFragment>::@enum::B
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::B
+          supertype: Enum
+          fields
+            static const enumConstant v @37
+              reference: <testLibraryFragment>::@enum::B::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::B
+              type: B
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::B::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::B
+              type: List<B>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::B
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::B::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::B
+              returnType: B
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::B::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::B
+              returnType: List<B>
+          methods
+            foo @42
+              reference: <testLibraryFragment>::@enum::B::@method::foo
+              enclosingElement: <testLibraryFragment>::@enum::B
+              parameters
+                requiredPositional a @46
+                  type: String
+              returnType: int
+          augmented
+            interfaces
+              A
+            fields
+              <testLibraryFragment>::@enum::B::@field::v
+              <testLibraryFragment>::@enum::B::@field::values
+            constants
+              <testLibraryFragment>::@enum::B::@field::v
+            constructors
+              <testLibraryFragment>::@enum::B::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::B::@getter::v
+              <testLibraryFragment>::@enum::B::@getter::values
+            methods
+              <testLibraryFragment>::@enum::B::@method::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      enums
+        augment enum B @59
+          reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::B
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibraryFragment>::@enum::B
+          interfaces
+            A
+''');
+  }
+
+  test_inferTypes_method_usingAugmentation_mixin() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+mixin A {
+  int foo(String a) => 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+import 'a.dart';
+augment enum B with A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'b.dart';
+
+enum B {
+  v;
+  foo(a) => 0;
+}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum B @31
+          reference: <testLibraryFragment>::@enum::B
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::B
+          supertype: Enum
+          fields
+            static const enumConstant v @37
+              reference: <testLibraryFragment>::@enum::B::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::B
+              type: B
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::B::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::B
+              type: List<B>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::B
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::B::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::B
+              returnType: B
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::B::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::B
+              returnType: List<B>
+          methods
+            foo @42
+              reference: <testLibraryFragment>::@enum::B::@method::foo
+              enclosingElement: <testLibraryFragment>::@enum::B
+              parameters
+                requiredPositional a @46
+                  type: String
+              returnType: int
+          augmented
+            mixins
+              A
+            fields
+              <testLibraryFragment>::@enum::B::@field::v
+              <testLibraryFragment>::@enum::B::@field::values
+            constants
+              <testLibraryFragment>::@enum::B::@field::v
+            constructors
+              <testLibraryFragment>::@enum::B::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::B::@getter::v
+              <testLibraryFragment>::@enum::B::@getter::values
+            methods
+              <testLibraryFragment>::@enum::B::@method::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      enums
+        augment enum B @59
+          reference: <testLibrary>::@fragment::package:test/b.dart::@enumAugmentation::B
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibraryFragment>::@enum::B
+          mixins
+            A
+''');
+  }
+
+  test_typeParameters_defaultType() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A<T extends B> {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A<T extends B> {
+  v
+}
+class B {}
+''');
+
+    configuration.withConstantInitializers = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class B @59
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+      enums
+        enum A @30
+          reference: <testLibraryFragment>::@enum::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @32
+              bound: B
+              defaultType: B
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          supertype: Enum
+          fields
+            static const enumConstant v @49
+              reference: <testLibraryFragment>::@enum::A::@field::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: A<B>
+              shouldUseTypeForInitializerInference: false
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::A::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              type: List<A<B>>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::A
+          accessors
+            synthetic static get v @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::v
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: A<B>
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::A::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::A
+              returnType: List<A<B>>
+          augmented
+            fields
+              <testLibraryFragment>::@enum::A::@field::v
+              <testLibraryFragment>::@enum::A::@field::values
+            constants
+              <testLibraryFragment>::@enum::A::@field::v
+            constructors
+              <testLibraryFragment>::@enum::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@enum::A::@getter::v
+              <testLibraryFragment>::@enum::A::@getter::values
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      enums
+        augment enum A @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@enumAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T @44
+              bound: B
+              defaultType: B
+          augmentationTarget: <testLibraryFragment>::@enum::A
+''');
+  }
+}
+
+@reflectiveTest
+class EnumElementTest_augmentation_fromBytes
+    extends EnumElementTest_augmentation {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class EnumElementTest_augmentation_keepLinking
+    extends EnumElementTest_augmentation {
+  @override
+  bool get keepLinkingLibraries => true;
+}
+
+@reflectiveTest
+class EnumElementTest_fromBytes extends EnumElementTest {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class EnumElementTest_keepLinking extends EnumElementTest {
+  @override
+  bool get keepLinkingLibraries => true;
+}
+
+// TODO(scheglov): This is duplicate.
+extension on ElementTextConfiguration {
+  void forPromotableFields({
+    Set<String> classNames = const {},
+    Set<String> enumNames = const {},
+    Set<String> extensionTypeNames = const {},
+    Set<String> mixinNames = const {},
+    Set<String> fieldNames = const {},
+  }) {
+    filter = (e) {
+      if (e is ClassElement) {
+        return classNames.contains(e.name);
+      } else if (e is ConstructorElement) {
+        return false;
+      } else if (e is EnumElement) {
+        return enumNames.contains(e.name);
+      } else if (e is ExtensionTypeElement) {
+        return extensionTypeNames.contains(e.name);
+      } else if (e is FieldElement) {
+        return fieldNames.isEmpty || fieldNames.contains(e.name);
+      } else if (e is MixinElement) {
+        return mixinNames.contains(e.name);
+      } else if (e is PartElement) {
+        return false;
+      } else if (e is PropertyAccessorElement) {
+        return false;
+      }
+      return true;
+    };
+  }
+}
diff --git a/pkg/analyzer/test/src/summary/elements/extension_test.dart b/pkg/analyzer/test/src/summary/elements/extension_test.dart
new file mode 100644
index 0000000..a557870
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/elements/extension_test.dart
@@ -0,0 +1,2577 @@
+// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../dart/resolution/node_text_expectations.dart';
+import '../elements_base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ExtensionElementTest_keepLinking);
+    defineReflectiveTests(ExtensionElementTest_fromBytes);
+    defineReflectiveTests(ExtensionElementTest_augmentation_keepLinking);
+    defineReflectiveTests(ExtensionElementTest_augmentation_fromBytes);
+    defineReflectiveTests(UpdateNodeTextExpectations);
+  });
+}
+
+abstract class ExtensionElementTest extends ElementsBaseTest {
+  test_extension_documented_tripleSlash() async {
+    var library = await buildLibrary('''
+/// aaa
+/// bbbb
+/// cc
+extension E on int {}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        E @34
+          reference: <testLibraryFragment>::@extension::E
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// aaa\n/// bbbb\n/// cc
+          extendedType: int
+''');
+  }
+
+  test_extension_field_inferredType_const() async {
+    var library = await buildLibrary('''
+extension E on int {
+  static const x = 0;
+}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        E @10
+          reference: <testLibraryFragment>::@extension::E
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          fields
+            static const x @36
+              reference: <testLibraryFragment>::@extension::E::@field::x
+              enclosingElement: <testLibraryFragment>::@extension::E
+              type: int
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                IntegerLiteral
+                  literal: 0 @40
+                  staticType: int
+          accessors
+            synthetic static get x @-1
+              reference: <testLibraryFragment>::@extension::E::@getter::x
+              enclosingElement: <testLibraryFragment>::@extension::E
+              returnType: int
+''');
+  }
+
+  test_extension_typeParameters_hasBound() async {
+    var library = await buildLibrary('''
+extension E<T extends num> on int {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        E @10
+          reference: <testLibraryFragment>::@extension::E
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @12
+              bound: num
+              defaultType: num
+          extendedType: int
+''');
+  }
+
+  test_extension_typeParameters_noBound() async {
+    var library = await buildLibrary('''
+extension E<T> on int {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        E @10
+          reference: <testLibraryFragment>::@extension::E
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @12
+              defaultType: dynamic
+          extendedType: int
+''');
+  }
+
+  test_metadata_extension_scope() async {
+    var library = await buildLibrary(r'''
+const foo = 0;
+
+@foo
+extension E<@foo T> on int {
+  static const foo = 1;
+  @foo
+  void bar() {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        E @31
+          reference: <testLibraryFragment>::@extension::E
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @16
+              name: SimpleIdentifier
+                token: foo @17
+                staticElement: <testLibraryFragment>::@getter::foo
+                staticType: null
+              element: <testLibraryFragment>::@getter::foo
+          typeParameters
+            covariant T @38
+              defaultType: dynamic
+              metadata
+                Annotation
+                  atSign: @ @33
+                  name: SimpleIdentifier
+                    token: foo @34
+                    staticElement: <testLibraryFragment>::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::foo
+          extendedType: int
+          fields
+            static const foo @65
+              reference: <testLibraryFragment>::@extension::E::@field::foo
+              enclosingElement: <testLibraryFragment>::@extension::E
+              type: int
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                IntegerLiteral
+                  literal: 1 @71
+                  staticType: int
+          accessors
+            synthetic static get foo @-1
+              reference: <testLibraryFragment>::@extension::E::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extension::E
+              returnType: int
+          methods
+            bar @88
+              reference: <testLibraryFragment>::@extension::E::@method::bar
+              enclosingElement: <testLibraryFragment>::@extension::E
+              metadata
+                Annotation
+                  atSign: @ @76
+                  name: SimpleIdentifier
+                    token: foo @77
+                    staticElement: <testLibraryFragment>::@extension::E::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@extension::E::@getter::foo
+              returnType: void
+      topLevelVariables
+        static const foo @6
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @12
+              staticType: int
+      accessors
+        synthetic static get foo @-1
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_extensionDeclaration() async {
+    var library = await buildLibrary(r'''
+const a = null;
+class A {}
+@a
+@Object()
+extension E on A {}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @22
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+      extensions
+        E @50
+          reference: <testLibraryFragment>::@extension::E
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @27
+              name: SimpleIdentifier
+                token: a @28
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: null
+              element: <testLibraryFragment>::@getter::a
+            Annotation
+              atSign: @ @30
+              name: SimpleIdentifier
+                token: Object @31
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @37
+                rightParenthesis: ) @38
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          extendedType: A
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_nonSynthetic_extension_getter() async {
+    var library = await buildLibrary(r'''
+extension E on int {
+  int get foo => 0;
+}
+''');
+    configuration.withNonSynthetic = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        E @10
+          reference: <testLibraryFragment>::@extension::E
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@extension::E::@field::foo
+              enclosingElement: <testLibraryFragment>::@extension::E
+              type: int
+              nonSynthetic: <testLibraryFragment>::@extension::E::@getter::foo
+          accessors
+            get foo @31
+              reference: <testLibraryFragment>::@extension::E::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extension::E
+              returnType: int
+              nonSynthetic: <testLibraryFragment>::@extension::E::@getter::foo
+''');
+  }
+
+  test_nonSynthetic_extension_setter() async {
+    var library = await buildLibrary(r'''
+extension E on int {
+  set foo(int value) {}
+}
+''');
+    configuration.withNonSynthetic = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        E @10
+          reference: <testLibraryFragment>::@extension::E
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@extension::E::@field::foo
+              enclosingElement: <testLibraryFragment>::@extension::E
+              type: int
+              nonSynthetic: <testLibraryFragment>::@extension::E::@setter::foo
+          accessors
+            set foo= @27
+              reference: <testLibraryFragment>::@extension::E::@setter::foo
+              enclosingElement: <testLibraryFragment>::@extension::E
+              parameters
+                requiredPositional value @35
+                  type: int
+                  nonSynthetic: <testLibraryFragment>::@extension::E::@setter::foo::@parameter::value
+              returnType: void
+              nonSynthetic: <testLibraryFragment>::@extension::E::@setter::foo
+''');
+  }
+}
+
+abstract class ExtensionElementTest_augmentation extends ElementsBaseTest {
+  test_augmentationTarget() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+import augment 'b.dart';
+augment extension A {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'a.dart';
+augment extension A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension A on int {}
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+      augmentationImports
+        package:test/b.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+          reference: <testLibrary>::@augmentation::package:test/b.dart
+          definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @35
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          augmented
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @72
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extension::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+      extensions
+        augment A @44
+          reference: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+  exportedReferences
+    declared <testLibraryFragment>::@extension::A
+  exportNamespace
+    A: <testLibraryFragment>::@extension::A
+''');
+  }
+
+  test_augmentationTarget_no2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+import augment 'b.dart';
+augment extension A {
+  void foo1() {}
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'a.dart';
+augment extension A {
+  void foo2() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+      augmentationImports
+        package:test/b.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+          reference: <testLibrary>::@augmentation::package:test/b.dart
+          definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @72
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          extendedType: InvalidType
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+          methods
+            foo1 @83
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@method::foo1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              returnType: void
+          augmented
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@method::foo1
+              <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A::@method::foo2
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+      extensions
+        augment A @44
+          reference: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          methods
+            foo2 @55
+              reference: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A::@method::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+              returnType: void
+''');
+  }
+
+  test_augmented_field_augment_field() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension A {
+  augment static int foo = 1;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension A on int {
+  static int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @35
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          fields
+            static foo @59
+              reference: <testLibraryFragment>::@extension::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@fieldAugmentation::foo
+          accessors
+            synthetic static get foo @-1
+              reference: <testLibraryFragment>::@extension::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic static set foo= @-1
+              reference: <testLibraryFragment>::@extension::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@fieldAugmentation::foo
+            accessors
+              <testLibraryFragment>::@extension::A::@getter::foo
+              <testLibraryFragment>::@extension::A::@setter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extension::A
+          fields
+            augment static foo @72
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              augmentationTarget: <testLibraryFragment>::@extension::A::@field::foo
+''');
+  }
+
+  test_augmented_field_augment_field2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension A {
+  augment static int foo = 1;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment extension A {
+  augment static int foo = 2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+extension A on int {
+  static int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @60
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          fields
+            static foo @84
+              reference: <testLibraryFragment>::@extension::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@fieldAugmentation::foo
+          accessors
+            synthetic static get foo @-1
+              reference: <testLibraryFragment>::@extension::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic static set foo= @-1
+              reference: <testLibraryFragment>::@extension::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A::@fieldAugmentation::foo
+            accessors
+              <testLibraryFragment>::@extension::A::@getter::foo
+              <testLibraryFragment>::@extension::A::@setter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extension::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+          fields
+            augment static foo @72
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              augmentationTarget: <testLibraryFragment>::@extension::A::@field::foo
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A::@fieldAugmentation::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          fields
+            augment static foo @72
+              reference: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_2
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@fieldAugmentation::foo
+''');
+  }
+
+  test_augmented_field_augment_field_afterGetter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension A {
+  augment static int get foo => 1;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment extension A {
+  augment static int foo = 2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+extension A on int {
+  static int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @60
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          fields
+            static foo @84
+              reference: <testLibraryFragment>::@extension::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A::@fieldAugmentation::foo
+          accessors
+            synthetic static get foo @-1
+              reference: <testLibraryFragment>::@extension::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@getterAugmentation::foo
+            synthetic static set foo= @-1
+              reference: <testLibraryFragment>::@extension::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A::@fieldAugmentation::foo
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@getterAugmentation::foo
+              <testLibraryFragment>::@extension::A::@setter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extension::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+          accessors
+            augment static get foo @76
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              returnType: int
+              id: getter_1
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@extension::A::@getter::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          fields
+            augment static foo @72
+              reference: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              augmentationTarget: <testLibraryFragment>::@extension::A::@field::foo
+''');
+  }
+
+  test_augmented_field_augment_field_afterSetter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension A {
+  augment static set foo(int _) {}
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment extension A {
+  augment static int foo = 2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+extension A on int {
+  static int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @60
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          fields
+            static foo @84
+              reference: <testLibraryFragment>::@extension::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A::@fieldAugmentation::foo
+          accessors
+            synthetic static get foo @-1
+              reference: <testLibraryFragment>::@extension::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic static set foo= @-1
+              reference: <testLibraryFragment>::@extension::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@setterAugmentation::foo
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A::@fieldAugmentation::foo
+            accessors
+              <testLibraryFragment>::@extension::A::@getter::foo
+              <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@setterAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extension::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+          accessors
+            augment static set foo= @72
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@setterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              parameters
+                requiredPositional _ @80
+                  type: int
+              returnType: void
+              id: setter_1
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@extension::A::@setter::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          fields
+            augment static foo @72
+              reference: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              augmentationTarget: <testLibraryFragment>::@extension::A::@field::foo
+''');
+  }
+
+  test_augmented_field_augment_field_differentTypes() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension A {
+  augment static double foo = 1.2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension A on int {
+  static int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @35
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          fields
+            static foo @59
+              reference: <testLibraryFragment>::@extension::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@fieldAugmentation::foo
+          accessors
+            synthetic static get foo @-1
+              reference: <testLibraryFragment>::@extension::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic static set foo= @-1
+              reference: <testLibraryFragment>::@extension::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@fieldAugmentation::foo
+            accessors
+              <testLibraryFragment>::@extension::A::@getter::foo
+              <testLibraryFragment>::@extension::A::@setter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extension::A
+          fields
+            augment static foo @75
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              type: double
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              augmentationTarget: <testLibraryFragment>::@extension::A::@field::foo
+''');
+  }
+
+  /// This is not allowed by the specification, but allowed syntactically,
+  /// so we need a way to handle it.
+  test_augmented_field_augment_getter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension A {
+  augment static int foo = 1;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension A on int {
+  static int get foo => 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @35
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          fields
+            synthetic static foo @-1
+              reference: <testLibraryFragment>::@extension::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              type: int
+              id: field_0
+              getter: getter_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@fieldAugmentation::foo
+          accessors
+            static get foo @63
+              reference: <testLibraryFragment>::@extension::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@fieldAugmentation::foo
+            accessors
+              <testLibraryFragment>::@extension::A::@getter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extension::A
+          fields
+            augment static foo @72
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              augmentationTarget: <testLibraryFragment>::@extension::A::@field::foo
+''');
+  }
+
+  test_augmented_fields_add() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension A {
+  static int foo2 = 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension A on int {
+  static int foo1 = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @35
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          fields
+            static foo1 @59
+              reference: <testLibraryFragment>::@extension::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@extension::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+          accessors
+            synthetic static get foo1 @-1
+              reference: <testLibraryFragment>::@extension::A::@getter::foo1
+              enclosingElement: <testLibraryFragment>::@extension::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic static set foo1= @-1
+              reference: <testLibraryFragment>::@extension::A::@setter::foo1
+              enclosingElement: <testLibraryFragment>::@extension::A
+              parameters
+                requiredPositional _foo1 @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibraryFragment>::@extension::A::@field::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@field::foo2
+            accessors
+              <testLibraryFragment>::@extension::A::@getter::foo1
+              <testLibraryFragment>::@extension::A::@setter::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@getter::foo2
+              <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@setter::foo2
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extension::A
+          fields
+            static foo2 @64
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@field::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              getter: getter_1
+              setter: setter_1
+          accessors
+            synthetic static get foo2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@getter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              returnType: int
+              id: getter_1
+              variable: field_1
+            synthetic static set foo2= @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@setter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              parameters
+                requiredPositional _foo2 @-1
+                  type: int
+              returnType: void
+              id: setter_1
+              variable: field_1
+''');
+  }
+
+  test_augmented_getters_add() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension A {
+  int get foo2 => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension A on int {
+  int get foo1 => 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @35
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          fields
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@extension::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@extension::A
+              type: int
+              id: field_0
+              getter: getter_0
+          accessors
+            get foo1 @56
+              reference: <testLibraryFragment>::@extension::A::@getter::foo1
+              enclosingElement: <testLibraryFragment>::@extension::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibraryFragment>::@extension::A::@field::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@field::foo2
+            accessors
+              <testLibraryFragment>::@extension::A::@getter::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@getter::foo2
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extension::A
+          fields
+            synthetic foo2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@field::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              type: int
+              id: field_1
+              getter: getter_1
+          accessors
+            get foo2 @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@getter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              returnType: int
+              id: getter_1
+              variable: field_1
+''');
+  }
+
+  test_augmented_getters_add_generic() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension A<T2> {
+  T2 get foo2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension A<T1> on int {
+  T1 get foo1;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @35
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T1 @37
+              defaultType: dynamic
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          fields
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@extension::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@extension::A
+              type: T1
+              id: field_0
+              getter: getter_0
+          accessors
+            abstract get foo1 @59
+              reference: <testLibraryFragment>::@extension::A::@getter::foo1
+              enclosingElement: <testLibraryFragment>::@extension::A
+              returnType: T1
+              id: getter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibraryFragment>::@extension::A::@field::foo1
+              FieldMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@field::foo2
+                augmentationSubstitution: {T2: T1}
+            accessors
+              <testLibraryFragment>::@extension::A::@getter::foo1
+              PropertyAccessorMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@getter::foo2
+                augmentationSubstitution: {T2: T1}
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @49
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@extension::A
+          fields
+            synthetic foo2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@field::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              type: T2
+              id: field_1
+              getter: getter_1
+          accessors
+            abstract get foo2 @64
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@getter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              returnType: T2
+              id: getter_1
+              variable: field_1
+''');
+  }
+
+  test_augmented_getters_augment_field() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension A {
+  augment static int get foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension A on int {
+  static int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @35
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          fields
+            static foo @59
+              reference: <testLibraryFragment>::@extension::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+          accessors
+            synthetic static get foo @-1
+              reference: <testLibraryFragment>::@extension::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@getterAugmentation::foo
+            synthetic static set foo= @-1
+              reference: <testLibraryFragment>::@extension::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibraryFragment>::@extension::A::@field::foo
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@getterAugmentation::foo
+              <testLibraryFragment>::@extension::A::@setter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extension::A
+          accessors
+            augment static get foo @76
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              returnType: int
+              id: getter_1
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@extension::A::@getter::foo
+''');
+  }
+
+  test_augmented_getters_augment_field2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension A {
+  augment static int get foo => 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment extension A {
+  augment static int get foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+extension A on int {
+  static int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @60
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          fields
+            static foo @84
+              reference: <testLibraryFragment>::@extension::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+          accessors
+            synthetic static get foo @-1
+              reference: <testLibraryFragment>::@extension::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@getterAugmentation::foo
+            synthetic static set foo= @-1
+              reference: <testLibraryFragment>::@extension::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibraryFragment>::@extension::A::@field::foo
+            accessors
+              <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A::@getterAugmentation::foo
+              <testLibraryFragment>::@extension::A::@setter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extension::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+          accessors
+            augment static get foo @76
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              returnType: int
+              id: getter_1
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@extension::A::@getter::foo
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A::@getterAugmentation::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          accessors
+            augment static get foo @76
+              reference: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+              returnType: int
+              id: getter_2
+              variable: field_0
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@getterAugmentation::foo
+''');
+  }
+
+  test_augmented_getters_augment_getter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension A {
+  augment int get foo1 => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension A on int {
+  int get foo1 => 0;
+  int get foo2 => 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @35
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          fields
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@extension::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@extension::A
+              type: int
+              id: field_0
+              getter: getter_0
+            synthetic foo2 @-1
+              reference: <testLibraryFragment>::@extension::A::@field::foo2
+              enclosingElement: <testLibraryFragment>::@extension::A
+              type: int
+              id: field_1
+              getter: getter_1
+          accessors
+            get foo1 @56
+              reference: <testLibraryFragment>::@extension::A::@getter::foo1
+              enclosingElement: <testLibraryFragment>::@extension::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@getterAugmentation::foo1
+            get foo2 @77
+              reference: <testLibraryFragment>::@extension::A::@getter::foo2
+              enclosingElement: <testLibraryFragment>::@extension::A
+              returnType: int
+              id: getter_1
+              variable: field_1
+          augmented
+            fields
+              <testLibraryFragment>::@extension::A::@field::foo1
+              <testLibraryFragment>::@extension::A::@field::foo2
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@getterAugmentation::foo1
+              <testLibraryFragment>::@extension::A::@getter::foo2
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extension::A
+          accessors
+            augment get foo1 @69
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@getterAugmentation::foo1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              returnType: int
+              id: getter_2
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@extension::A::@getter::foo1
+''');
+  }
+
+  test_augmented_getters_augment_getter2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension A {
+  augment int get foo => 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment extension A {
+  augment int get foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+extension A on int {
+  int get foo => 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @60
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@extension::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              type: int
+              id: field_0
+              getter: getter_0
+          accessors
+            get foo @81
+              reference: <testLibraryFragment>::@extension::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@getterAugmentation::foo
+          augmented
+            fields
+              <testLibraryFragment>::@extension::A::@field::foo
+            accessors
+              <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A::@getterAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extension::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+          accessors
+            augment get foo @69
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              returnType: int
+              id: getter_1
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@extension::A::@getter::foo
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A::@getterAugmentation::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          accessors
+            augment get foo @69
+              reference: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+              returnType: int
+              id: getter_2
+              variable: field_0
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@getterAugmentation::foo
+''');
+  }
+
+  test_augmented_methods() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension A {
+  void bar() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension A on int {
+  void foo() {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @35
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          methods
+            foo @53
+              reference: <testLibraryFragment>::@extension::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              returnType: void
+          augmented
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@method::bar
+              <testLibraryFragment>::@extension::A::@method::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extension::A
+          methods
+            bar @58
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@method::bar
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              returnType: void
+''');
+  }
+
+  test_augmented_methods_augment() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension A {
+  augment void foo1() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension A on int {
+  void foo1() {}
+  void foo2() {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @35
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          methods
+            foo1 @53
+              reference: <testLibraryFragment>::@extension::A::@method::foo1
+              enclosingElement: <testLibraryFragment>::@extension::A
+              returnType: void
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@methodAugmentation::foo1
+            foo2 @70
+              reference: <testLibraryFragment>::@extension::A::@method::foo2
+              enclosingElement: <testLibraryFragment>::@extension::A
+              returnType: void
+          augmented
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@methodAugmentation::foo1
+              <testLibraryFragment>::@extension::A::@method::foo2
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extension::A
+          methods
+            augment foo1 @66
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@methodAugmentation::foo1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              returnType: void
+              augmentationTarget: <testLibraryFragment>::@extension::A::@method::foo1
+''');
+  }
+
+  test_augmented_methods_augment2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+import augment 'b.dart';
+augment extension A {
+  augment void foo() {}
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'a.dart';
+augment extension A {
+  augment void foo() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension A on int {
+  void foo() {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+      augmentationImports
+        package:test/b.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+          reference: <testLibrary>::@augmentation::package:test/b.dart
+          definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @35
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          methods
+            foo @53
+              reference: <testLibraryFragment>::@extension::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              returnType: void
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@methodAugmentation::foo
+          augmented
+            methods
+              <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A::@methodAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @72
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extension::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+          methods
+            augment foo @91
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              returnType: void
+              augmentationTarget: <testLibraryFragment>::@extension::A::@method::foo
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A::@methodAugmentation::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+      extensions
+        augment A @44
+          reference: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          methods
+            augment foo @63
+              reference: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+              returnType: void
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@methodAugmentation::foo
+''');
+  }
+
+  test_augmented_methods_generic() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension A<T2> {
+  T2 bar() => throw 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension A<T> on int {
+  T foo() => throw 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @35
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @37
+              defaultType: dynamic
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          methods
+            foo @53
+              reference: <testLibraryFragment>::@extension::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              returnType: T
+          augmented
+            methods
+              MethodMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@method::bar
+                augmentationSubstitution: {T2: T}
+              <testLibraryFragment>::@extension::A::@method::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @49
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@extension::A
+          methods
+            bar @60
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@method::bar
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              returnType: T2
+''');
+  }
+
+  test_augmented_methods_generic_augment() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension A<T2> {
+  augment T2 foo() => throw 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension A<T> on int {
+  T foo() => throw 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @35
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @37
+              defaultType: dynamic
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          methods
+            foo @53
+              reference: <testLibraryFragment>::@extension::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              returnType: T
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@methodAugmentation::foo
+          augmented
+            methods
+              MethodMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@methodAugmentation::foo
+                augmentationSubstitution: {T2: T}
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @49
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@extension::A
+          methods
+            augment foo @68
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              returnType: T2
+              augmentationTarget: <testLibraryFragment>::@extension::A::@method::foo
+''');
+  }
+
+  test_augmented_methods_typeParameterCountMismatch() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension A<T> {
+  augment void foo() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension A on int {
+  void foo() {}
+  void bar() {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @35
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          methods
+            foo @53
+              reference: <testLibraryFragment>::@extension::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              returnType: void
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@methodAugmentation::foo
+            bar @69
+              reference: <testLibraryFragment>::@extension::A::@method::bar
+              enclosingElement: <testLibraryFragment>::@extension::A
+              returnType: void
+          augmented
+            methods
+              <testLibraryFragment>::@extension::A::@method::bar
+              MethodMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@methodAugmentation::foo
+                augmentationSubstitution: {T: InvalidType}
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T @49
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@extension::A
+          methods
+            augment foo @69
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              returnType: void
+              augmentationTarget: <testLibraryFragment>::@extension::A::@method::foo
+''');
+  }
+
+  test_augmented_setters_add() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension A {
+  set foo2(int _) {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension A on int {
+  set foo1(int _) {}
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @35
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          fields
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@extension::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@extension::A
+              type: int
+              id: field_0
+              setter: setter_0
+          accessors
+            set foo1= @52
+              reference: <testLibraryFragment>::@extension::A::@setter::foo1
+              enclosingElement: <testLibraryFragment>::@extension::A
+              parameters
+                requiredPositional _ @61
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            fields
+              <testLibraryFragment>::@extension::A::@field::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@field::foo2
+            accessors
+              <testLibraryFragment>::@extension::A::@setter::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@setter::foo2
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extension::A
+          fields
+            synthetic foo2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@field::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              type: int
+              id: field_1
+              setter: setter_1
+          accessors
+            set foo2= @57
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@setter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              parameters
+                requiredPositional _ @66
+                  type: int
+              returnType: void
+              id: setter_1
+              variable: field_1
+''');
+  }
+
+  test_augmented_setters_augment_field() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension A {
+  augment static set foo(int _) {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension A on int {
+  static int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @35
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          fields
+            static foo @59
+              reference: <testLibraryFragment>::@extension::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+          accessors
+            synthetic static get foo @-1
+              reference: <testLibraryFragment>::@extension::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic static set foo= @-1
+              reference: <testLibraryFragment>::@extension::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@extension::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@setterAugmentation::foo
+          augmented
+            fields
+              <testLibraryFragment>::@extension::A::@field::foo
+            accessors
+              <testLibraryFragment>::@extension::A::@getter::foo
+              <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@setterAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extension::A
+          accessors
+            augment static set foo= @72
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@setterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              parameters
+                requiredPositional _ @80
+                  type: int
+              returnType: void
+              id: setter_1
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@extension::A::@setter::foo
+''');
+  }
+
+  test_augmented_setters_augment_setter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension A {
+  augment set foo1(int _) {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension A on int {
+  set foo1(int _) {}
+  set foo2(int _) {}
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @35
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          fields
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@extension::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@extension::A
+              type: int
+              id: field_0
+              setter: setter_0
+            synthetic foo2 @-1
+              reference: <testLibraryFragment>::@extension::A::@field::foo2
+              enclosingElement: <testLibraryFragment>::@extension::A
+              type: int
+              id: field_1
+              setter: setter_1
+          accessors
+            set foo1= @52
+              reference: <testLibraryFragment>::@extension::A::@setter::foo1
+              enclosingElement: <testLibraryFragment>::@extension::A
+              parameters
+                requiredPositional _ @61
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@setterAugmentation::foo1
+            set foo2= @73
+              reference: <testLibraryFragment>::@extension::A::@setter::foo2
+              enclosingElement: <testLibraryFragment>::@extension::A
+              parameters
+                requiredPositional _ @82
+                  type: int
+              returnType: void
+              id: setter_1
+              variable: field_1
+          augmented
+            fields
+              <testLibraryFragment>::@extension::A::@field::foo1
+              <testLibraryFragment>::@extension::A::@field::foo2
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@setterAugmentation::foo1
+              <testLibraryFragment>::@extension::A::@setter::foo2
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @47
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extension::A
+          accessors
+            augment set foo1= @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A::@setterAugmentation::foo1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionAugmentation::A
+              parameters
+                requiredPositional _ @74
+                  type: int
+              returnType: void
+              id: setter_2
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@extension::A::@setter::foo1
+''');
+  }
+
+  test_augmentedBy_class2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+
+augment class A {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+
+augment class A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+
+extension A on int {}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @61
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @44
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTargetAny: <testLibraryFragment>::@extension::A
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @44
+          reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTargetAny: <testLibraryFragment>::@extension::A
+''');
+  }
+
+  test_augmentedBy_class_extension() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+
+augment class A {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+
+augment extension A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+
+extension A on int {}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        A @61
+          reference: <testLibraryFragment>::@extension::A
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+          augmented
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @44
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTargetAny: <testLibraryFragment>::@extension::A
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      extensions
+        augment A @48
+          reference: <testLibrary>::@fragment::package:test/b.dart::@extensionAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibraryFragment>::@extension::A
+''');
+  }
+}
+
+@reflectiveTest
+class ExtensionElementTest_augmentation_fromBytes
+    extends ExtensionElementTest_augmentation {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class ExtensionElementTest_augmentation_keepLinking
+    extends ExtensionElementTest_augmentation {
+  @override
+  bool get keepLinkingLibraries => true;
+}
+
+@reflectiveTest
+class ExtensionElementTest_fromBytes extends ExtensionElementTest {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class ExtensionElementTest_keepLinking extends ExtensionElementTest {
+  @override
+  bool get keepLinkingLibraries => true;
+}
diff --git a/pkg/analyzer/test/src/summary/elements/extension_type_test.dart b/pkg/analyzer/test/src/summary/elements/extension_type_test.dart
new file mode 100644
index 0000000..4dbd7e7
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/elements/extension_type_test.dart
@@ -0,0 +1,5343 @@
+// Copyright (c) 2024, 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:analyzer/dart/element/element.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../dart/resolution/node_text_expectations.dart';
+import '../element_text.dart';
+import '../elements_base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ExtensionTypeElementTest_keepLinking);
+    defineReflectiveTests(ExtensionTypeElementTest_fromBytes);
+    defineReflectiveTests(ExtensionTypeElementTest_augmentation_keepLinking);
+    defineReflectiveTests(ExtensionTypeElementTest_augmentation_fromBytes);
+    defineReflectiveTests(UpdateNodeTextExpectations);
+  });
+}
+
+mixin ExtensionTypeElementMixin on ElementsBaseTest {
+  test_constructor_const() async {
+    var library = await buildLibrary(r'''
+extension type const A(int it) {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @21
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @27
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          constructors
+            const @21
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @27
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+''');
+  }
+
+  test_constructor_named() async {
+    var library = await buildLibrary(r'''
+extension type A.named(int it) {}
+''');
+
+    configuration.withCodeRanges = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 0
+          codeLength: 33
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::named
+          typeErasure: int
+          fields
+            final it @27
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              codeOffset: 23
+              codeLength: 6
+              type: int
+          constructors
+            named @17
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::named
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              codeOffset: 16
+              codeLength: 14
+              periodOffset: 16
+              nameEnd: 22
+              parameters
+                requiredPositional final this.it @27
+                  type: int
+                  codeOffset: 23
+                  codeLength: 6
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+''');
+  }
+
+  test_constructor_secondary_fieldFormalParameter() async {
+    var library = await buildLibrary(r'''
+extension type A(num it) {
+  A.named(this.it);
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: num
+          fields
+            final it @21
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: num
+          constructors
+            @15
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @21
+                  type: num
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+            named @31
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::named
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              periodOffset: 30
+              nameEnd: 36
+              parameters
+                requiredPositional final this.it @42
+                  type: num
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: num
+''');
+  }
+
+  test_constructor_secondary_fieldFormalParameter_typed() async {
+    var library = await buildLibrary(r'''
+extension type A(num it) {
+  A.named(int this.it);
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: num
+          fields
+            final it @21
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: num
+          constructors
+            @15
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @21
+                  type: num
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+            named @31
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::named
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              periodOffset: 30
+              nameEnd: 36
+              parameters
+                requiredPositional final this.it @46
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: num
+''');
+  }
+
+  test_constructor_secondary_fieldInitializer() async {
+    var library = await buildLibrary(r'''
+extension type A(num it) {
+  const A.named(int a) : it = a;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: num
+          fields
+            final it @21
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: num
+          constructors
+            @15
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @21
+                  type: num
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+            const named @37
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::named
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              periodOffset: 36
+              nameEnd: 42
+              parameters
+                requiredPositional a @47
+                  type: int
+              constantInitializers
+                ConstructorFieldInitializer
+                  fieldName: SimpleIdentifier
+                    token: it @52
+                    staticElement: <testLibraryFragment>::@extensionType::A::@field::it
+                    staticType: null
+                  equals: = @55
+                  expression: SimpleIdentifier
+                    token: a @57
+                    staticElement: <testLibraryFragment>::@extensionType::A::@constructor::named::@parameter::a
+                    staticType: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: num
+''');
+  }
+
+  test_constructor_unnamed() async {
+    var library = await buildLibrary(r'''
+extension type A(int it) {}
+''');
+
+    configuration.withCodeRanges = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 0
+          codeLength: 27
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @21
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              codeOffset: 17
+              codeLength: 6
+              type: int
+          constructors
+            @15
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              codeOffset: 16
+              codeLength: 8
+              parameters
+                requiredPositional final this.it @21
+                  type: int
+                  codeOffset: 17
+                  codeLength: 6
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+''');
+  }
+
+  test_documentation() async {
+    var library = await buildLibrary(r'''
+/// Docs
+extension type A(int it) {
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @24
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Docs
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @30
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          constructors
+            @24
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @30
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+''');
+  }
+
+  test_field_const_typed() async {
+    var library = await buildLibrary(r'''
+extension type A(int it) {
+  static const int foo = 0;
+}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @21
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+            static const foo @46
+              reference: <testLibraryFragment>::@extensionType::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              constantInitializer
+                IntegerLiteral
+                  literal: 0 @52
+                  staticType: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+            synthetic static get foo @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+''');
+  }
+
+  test_field_const_untyped() async {
+    var library = await buildLibrary(r'''
+extension type A(int it) {
+  static const foo = 0;
+}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @21
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+            static const foo @42
+              reference: <testLibraryFragment>::@extensionType::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                IntegerLiteral
+                  literal: 0 @48
+                  staticType: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+            synthetic static get foo @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+''');
+  }
+
+  test_field_instance_untyped() async {
+    var library = await buildLibrary(r'''
+extension type A(int it) {
+  final foo = 0;
+}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @21
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+            final foo @35
+              reference: <testLibraryFragment>::@extensionType::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              shouldUseTypeForInitializerInference: false
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+''');
+  }
+
+  test_field_metadata() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+const foo = 0;
+''');
+
+    var library = await buildLibrary(r'''
+import 'a.dart';
+extension type A(@foo int it) {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        A @32
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @43
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              metadata
+                Annotation
+                  atSign: @ @34
+                  name: SimpleIdentifier
+                    token: foo @35
+                    staticElement: package:test/a.dart::<fragment>::@getter::foo
+                    staticType: null
+                  element: package:test/a.dart::<fragment>::@getter::foo
+              type: int
+          constructors
+            @32
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @43
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+''');
+  }
+
+  test_getter() async {
+    var library = await buildLibrary(r'''
+extension type A(int it) {
+  int get foo => 0;
+}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @21
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@extensionType::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+            get foo @37
+              reference: <testLibraryFragment>::@extensionType::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+''');
+  }
+
+  test_interfaces_class() async {
+    var library = await buildLibrary(r'''
+class A {}
+class B {}
+class C implements A, B {}
+extension type X(C it) implements A, B {}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+        class B @17
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+        class C @28
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          interfaces
+            A
+            B
+      extensionTypes
+        X @64
+          reference: <testLibraryFragment>::@extensionType::X
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::X::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::X::@constructor::new
+          typeErasure: C
+          interfaces
+            A
+            B
+          fields
+            final it @68
+              reference: <testLibraryFragment>::@extensionType::X::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::X
+              type: C
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::X::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::X
+              returnType: C
+''');
+  }
+
+  test_interfaces_cycle2() async {
+    var library = await buildLibrary(r'''
+extension type A(int it) implements B {}
+extension type B(int it) implements A {}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        hasImplementsSelfReference A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          interfaces
+            Object
+          fields
+            final it @21
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+        hasImplementsSelfReference B @56
+          reference: <testLibraryFragment>::@extensionType::B
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::B::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::B::@constructor::new
+          typeErasure: int
+          interfaces
+            Object
+          fields
+            final it @62
+              reference: <testLibraryFragment>::@extensionType::B::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::B::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              returnType: int
+''');
+  }
+
+  test_interfaces_cycle_self() async {
+    var library = await buildLibrary(r'''
+extension type A(int it) implements A {}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        hasImplementsSelfReference A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          interfaces
+            Object
+          fields
+            final it @21
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+''');
+  }
+
+  test_interfaces_extensionType() async {
+    var library = await buildLibrary(r'''
+extension type A(num it) {}
+extension type B(int it) implements A {}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: num
+          fields
+            final it @21
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: num
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: num
+        B @43
+          reference: <testLibraryFragment>::@extensionType::B
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::B::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::B::@constructor::new
+          typeErasure: int
+          interfaces
+            A
+          fields
+            final it @49
+              reference: <testLibraryFragment>::@extensionType::B::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::B::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              returnType: int
+''');
+  }
+
+  test_interfaces_futureOr() async {
+    var library = await buildLibrary(r'''
+extension type A(int it) implements num, FutureOr<int> {}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          interfaces
+            num
+          fields
+            final it @21
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+''');
+  }
+
+  test_interfaces_implicitObjectQuestion() async {
+    var library = await buildLibrary(r'''
+extension type X(int? it) {}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        X @15
+          reference: <testLibraryFragment>::@extensionType::X
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::X::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::X::@constructor::new
+          typeErasure: int?
+          fields
+            final it @22
+              reference: <testLibraryFragment>::@extensionType::X::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::X
+              type: int?
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::X::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::X
+              returnType: int?
+''');
+  }
+
+  test_interfaces_implicitObjectQuestion_fromTypeParameter() async {
+    var library = await buildLibrary(r'''
+extension type A<T>(T it) {}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @17
+              defaultType: dynamic
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: T
+          fields
+            final it @22
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: T
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: T
+''');
+  }
+
+  test_interfaces_void() async {
+    var library = await buildLibrary(r'''
+typedef A = void;
+extension type X(int it) implements A, num {}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        X @33
+          reference: <testLibraryFragment>::@extensionType::X
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::X::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::X::@constructor::new
+          typeErasure: int
+          interfaces
+            num
+          fields
+            final it @39
+              reference: <testLibraryFragment>::@extensionType::X::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::X
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::X::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::X
+              returnType: int
+      typeAliases
+        A @8
+          reference: <testLibraryFragment>::@typeAlias::A
+          aliasedType: void
+''');
+  }
+
+  test_isPromotable_representationField_private() async {
+    var library = await buildLibrary(r'''
+extension type A(int? _it) {}
+
+class B {
+  int _it = 0;
+}
+
+class C {
+  int get _it => 0;
+}
+''');
+
+    configuration
+      ..forPromotableFields(extensionTypeNames: {'A'})
+      ..withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::_it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int?
+          fields
+            final promotable _it @22
+              reference: <testLibraryFragment>::@extensionType::A::@field::_it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int?
+  fieldNameNonPromotabilityInfo
+    _it
+      conflictingFields
+        <testLibraryFragment>::@class::B::@field::_it
+      conflictingGetters
+        <testLibraryFragment>::@class::C::@getter::_it
+''');
+  }
+
+  test_metadata() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+const foo = 0;
+''');
+
+    var library = await buildLibrary(r'''
+import 'a.dart';
+@foo
+extension type A(int it) {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        A @37
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @17
+              name: SimpleIdentifier
+                token: foo @18
+                staticElement: package:test/a.dart::<fragment>::@getter::foo
+                staticType: null
+              element: package:test/a.dart::<fragment>::@getter::foo
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @43
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          constructors
+            @37
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @43
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+''');
+  }
+
+  test_method() async {
+    var library = await buildLibrary(r'''
+extension type A(int it) {
+  void foo(int a) {}
+}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @21
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+          methods
+            foo @34
+              reference: <testLibraryFragment>::@extensionType::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional a @42
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_method_defaultFormalParameter_defaultValue() async {
+    var library = await buildLibrary(r'''
+extension type A(int it) {
+  void foo({int a = 0}) {}
+}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @21
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+          methods
+            foo @34
+              reference: <testLibraryFragment>::@extensionType::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                optionalNamed default a @43
+                  reference: <testLibraryFragment>::@extensionType::A::@method::foo::@parameter::a
+                  type: int
+                  constantInitializer
+                    IntegerLiteral
+                      literal: 0 @47
+                      staticType: int
+              returnType: void
+''');
+  }
+
+  test_noField() async {
+    var library = await buildLibrary(r'''
+extension type A() {}
+''');
+
+    configuration.withCodeRanges = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 0
+          codeLength: 21
+          representation: <testLibraryFragment>::@extensionType::A::@field::<empty>
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: InvalidType
+          fields
+            final <empty> @17
+              reference: <testLibraryFragment>::@extensionType::A::@field::<empty>
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              codeOffset: 17
+              codeLength: 0
+              type: InvalidType
+          constructors
+            @15
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              codeOffset: 16
+              codeLength: 2
+              parameters
+                requiredPositional final this.<empty> @17
+                  type: InvalidType
+                  codeOffset: 17
+                  codeLength: 0
+                  field: <testLibraryFragment>::@extensionType::A::@field::<empty>
+          accessors
+            synthetic get <empty> @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::<empty>
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: InvalidType
+''');
+  }
+
+  test_notSimplyBounded_self() async {
+    var library = await buildLibrary(r'''
+extension type A<T extends A>(int it) {}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        notSimplyBounded A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @17
+              bound: A<dynamic>
+              defaultType: dynamic
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @34
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+''');
+  }
+
+  test_setter() async {
+    var library = await buildLibrary(r'''
+extension type A(int it) {
+  set foo(double _) {}
+}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @21
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@extensionType::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: double
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+            set foo= @33
+              reference: <testLibraryFragment>::@extensionType::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional _ @44
+                  type: double
+              returnType: void
+''');
+  }
+
+  test_typeErasure_hasExtension_cycle2_direct() async {
+    var library = await buildLibrary(r'''
+extension type A(B it) {}
+
+extension type B(A it) {}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        hasRepresentationSelfReference A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: InvalidType
+          fields
+            final it @19
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: InvalidType
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: InvalidType
+        hasRepresentationSelfReference B @42
+          reference: <testLibraryFragment>::@extensionType::B
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::B::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::B::@constructor::new
+          typeErasure: InvalidType
+          fields
+            final it @46
+              reference: <testLibraryFragment>::@extensionType::B::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              type: InvalidType
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::B::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              returnType: InvalidType
+''');
+  }
+
+  test_typeErasure_hasExtension_cycle2_typeArgument() async {
+    var library = await buildLibrary(r'''
+extension type A(B it) {}
+
+extension type B(List<B> it) {}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: InvalidType
+          fields
+            final it @19
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: B
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: B
+        hasRepresentationSelfReference B @42
+          reference: <testLibraryFragment>::@extensionType::B
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::B::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::B::@constructor::new
+          typeErasure: InvalidType
+          fields
+            final it @52
+              reference: <testLibraryFragment>::@extensionType::B::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              type: InvalidType
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::B::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              returnType: InvalidType
+''');
+  }
+
+  test_typeErasure_hasExtension_cycle_self() async {
+    var library = await buildLibrary(r'''
+extension type A(A it) {}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        hasRepresentationSelfReference A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: InvalidType
+          fields
+            final it @19
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: InvalidType
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: InvalidType
+''');
+  }
+
+  test_typeErasure_hasExtension_functionType() async {
+    var library = await buildLibrary(r'''
+extension type A(int it) {}
+
+extension type B(A Function(A a) it) {}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @21
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+        B @44
+          reference: <testLibraryFragment>::@extensionType::B
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::B::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::B::@constructor::new
+          typeErasure: int Function(int)
+          fields
+            final it @62
+              reference: <testLibraryFragment>::@extensionType::B::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              type: A Function(A)
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::B::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              returnType: A Function(A)
+''');
+  }
+
+  test_typeErasure_hasExtension_interfaceType() async {
+    var library = await buildLibrary(r'''
+extension type A<T>(T it) {}
+
+extension type B(A<double> it) {}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @17
+              defaultType: dynamic
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: T
+          fields
+            final it @22
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: T
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: T
+        B @45
+          reference: <testLibraryFragment>::@extensionType::B
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::B::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::B::@constructor::new
+          typeErasure: double
+          fields
+            final it @57
+              reference: <testLibraryFragment>::@extensionType::B::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              type: A<double>
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::B::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              returnType: A<double>
+''');
+  }
+
+  test_typeErasure_hasExtension_interfaceType_typeArgument() async {
+    var library = await buildLibrary(r'''
+extension type A(int it) {}
+
+extension type B(List<A> it) {}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @21
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+        B @44
+          reference: <testLibraryFragment>::@extensionType::B
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::B::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::B::@constructor::new
+          typeErasure: List<int>
+          fields
+            final it @54
+              reference: <testLibraryFragment>::@extensionType::B::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              type: List<A>
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::B::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              returnType: List<A>
+''');
+  }
+
+  test_typeErasure_notExtension() async {
+    var library = await buildLibrary(r'''
+extension type A(int it) {}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @21
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+''');
+  }
+
+  test_typeParameters() async {
+    var library = await buildLibrary(r'''
+extension type A<T extends num, U>(Map<T, U> it) {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @15
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @17
+              bound: num
+              defaultType: num
+            covariant U @32
+              defaultType: dynamic
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: Map<T, U>
+          fields
+            final it @45
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: Map<T, U>
+          constructors
+            @15
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @45
+                  type: Map<T, U>
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: Map<T, U>
+''');
+  }
+}
+
+abstract class ExtensionTypeElementTest_augmentation extends ElementsBaseTest {
+  test_augmentationTarget() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+import augment 'b.dart';
+augment extension type A(int it) {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'a.dart';
+augment extension type A(int it) {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A(int it) {}
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+      augmentationImports
+        package:test/b.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+          reference: <testLibrary>::@augmentation::package:test/b.dart
+          definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @46
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          constructors
+            @40
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @46
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+          augmented
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::it
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @77
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+      extensionTypes
+        augment A @49
+          reference: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+  exportedReferences
+    declared <testLibraryFragment>::@extensionType::A
+  exportNamespace
+    A: <testLibraryFragment>::@extensionType::A
+''');
+  }
+
+  test_augmentationTarget_no2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+import augment 'b.dart';
+augment extension type A(int it) {
+  void foo1() {}
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'a.dart';
+augment extension type A(int it) {
+  void foo2() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+      augmentationImports
+        package:test/b.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+          reference: <testLibrary>::@augmentation::package:test/b.dart
+          definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @77
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+          representation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@field::it
+          primaryConstructor: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@constructorAugmentation::new
+          typeErasure: int
+          fields
+            final it @83
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@field::it
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              type: int
+          constructors
+            augment @77
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@constructorAugmentation::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              parameters
+                requiredPositional final this.it @83
+                  type: int
+                  field: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@getter::it
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              returnType: int
+          methods
+            foo1 @96
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@method::foo1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              returnType: void
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@field::it
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@constructorAugmentation::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@getter::it
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@method::foo1
+              <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A::@method::foo2
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+      extensionTypes
+        augment A @49
+          reference: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          methods
+            foo2 @68
+              reference: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A::@method::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+              returnType: void
+''');
+  }
+
+  test_augmented_constructors_add_named() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  A.named();
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A(int it) {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @46
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          constructors
+            @40
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @46
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+          augmented
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@constructor::named
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::it
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          constructors
+            named @68
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@constructor::named
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              periodOffset: 67
+              nameEnd: 73
+''');
+  }
+
+  test_augmented_constructors_add_named_generic() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A<T2>(int it) {
+  A.named(T2 a);
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A<T1>(int it) {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T1 @42
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @50
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          constructors
+            @40
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @50
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+          augmented
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+              ConstructorMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@constructor::named
+                augmentationSubstitution: {T2: T1}
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::it
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @54
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          constructors
+            named @72
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@constructor::named
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              periodOffset: 71
+              nameEnd: 77
+              parameters
+                requiredPositional a @81
+                  type: T2
+''');
+  }
+
+  test_augmented_constructors_add_unnamed_hasNamed() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  A();
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A.named(int it) {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::named
+          typeErasure: int
+          fields
+            final it @52
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          constructors
+            named @42
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::named
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              periodOffset: 41
+              nameEnd: 47
+              parameters
+                requiredPositional final this.it @52
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+          augmented
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@constructor::new
+              <testLibraryFragment>::@extensionType::A::@constructor::named
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::it
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          constructors
+            @66
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+''');
+  }
+
+  test_augmented_field_augment_field() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  augment static int foo = 1;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A(int it) {
+  static int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @46
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_0
+              getter: getter_0
+            static foo @65
+              reference: <testLibraryFragment>::@extensionType::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              getter: getter_1
+              setter: setter_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@fieldAugmentation::foo
+          constructors
+            @40
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @46
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic static get foo @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_1
+              variable: field_1
+            synthetic static set foo= @-1
+              reference: <testLibraryFragment>::@extensionType::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_1
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@fieldAugmentation::foo
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::foo
+              <testLibraryFragment>::@extensionType::A::@setter::foo
+              <testLibraryFragment>::@extensionType::A::@getter::it
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          fields
+            augment static foo @85
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_2
+              augmentationTarget: <testLibraryFragment>::@extensionType::A::@field::foo
+''');
+  }
+
+  test_augmented_field_augment_field2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  augment static int foo = 1;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  augment static int foo = 2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+extension type A(int it) {
+  static int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @65
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @71
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_0
+              getter: getter_0
+            static foo @90
+              reference: <testLibraryFragment>::@extensionType::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              getter: getter_1
+              setter: setter_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@fieldAugmentation::foo
+          constructors
+            @65
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @71
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic static get foo @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_1
+              variable: field_1
+            synthetic static set foo= @-1
+              reference: <testLibraryFragment>::@extensionType::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_1
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A::@fieldAugmentation::foo
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::foo
+              <testLibraryFragment>::@extensionType::A::@setter::foo
+              <testLibraryFragment>::@extensionType::A::@getter::it
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+          fields
+            augment static foo @85
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_2
+              augmentationTarget: <testLibraryFragment>::@extensionType::A::@field::foo
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A::@fieldAugmentation::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          fields
+            augment static foo @85
+              reference: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_3
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@fieldAugmentation::foo
+''');
+  }
+
+  test_augmented_field_augment_field_afterGetter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  augment static int get foo => 1;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  augment static int foo = 2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+extension type A(int it) {
+  static int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @65
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @71
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_0
+              getter: getter_0
+            static foo @90
+              reference: <testLibraryFragment>::@extensionType::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              getter: getter_1
+              setter: setter_0
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A::@fieldAugmentation::foo
+          constructors
+            @65
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @71
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic static get foo @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_1
+              variable: field_1
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@getterAugmentation::foo
+            synthetic static set foo= @-1
+              reference: <testLibraryFragment>::@extensionType::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_1
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A::@fieldAugmentation::foo
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@getterAugmentation::foo
+              <testLibraryFragment>::@extensionType::A::@setter::foo
+              <testLibraryFragment>::@extensionType::A::@getter::it
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+          accessors
+            augment static get foo @89
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              returnType: int
+              id: getter_2
+              variable: field_1
+              augmentationTarget: <testLibraryFragment>::@extensionType::A::@getter::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          fields
+            augment static foo @85
+              reference: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_2
+              augmentationTarget: <testLibraryFragment>::@extensionType::A::@field::foo
+''');
+  }
+
+  test_augmented_field_augment_field_afterSetter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  augment static set foo(int _) {}
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  augment static int foo = 2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+extension type A(int it) {
+  static int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @65
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @71
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_0
+              getter: getter_0
+            static foo @90
+              reference: <testLibraryFragment>::@extensionType::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              getter: getter_1
+              setter: setter_0
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A::@fieldAugmentation::foo
+          constructors
+            @65
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @71
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic static get foo @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_1
+              variable: field_1
+            synthetic static set foo= @-1
+              reference: <testLibraryFragment>::@extensionType::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_1
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@setterAugmentation::foo
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A::@fieldAugmentation::foo
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::foo
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@setterAugmentation::foo
+              <testLibraryFragment>::@extensionType::A::@getter::it
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+          accessors
+            augment static set foo= @85
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@setterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              parameters
+                requiredPositional _ @93
+                  type: int
+              returnType: void
+              id: setter_1
+              variable: field_1
+              augmentationTarget: <testLibraryFragment>::@extensionType::A::@setter::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          fields
+            augment static foo @85
+              reference: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_2
+              augmentationTarget: <testLibraryFragment>::@extensionType::A::@field::foo
+''');
+  }
+
+  test_augmented_field_augment_field_differentTypes() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  augment static double foo = 1.2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A(int it) {
+  static int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @46
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_0
+              getter: getter_0
+            static foo @65
+              reference: <testLibraryFragment>::@extensionType::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              getter: getter_1
+              setter: setter_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@fieldAugmentation::foo
+          constructors
+            @40
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @46
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic static get foo @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_1
+              variable: field_1
+            synthetic static set foo= @-1
+              reference: <testLibraryFragment>::@extensionType::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_1
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@fieldAugmentation::foo
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::foo
+              <testLibraryFragment>::@extensionType::A::@setter::foo
+              <testLibraryFragment>::@extensionType::A::@getter::it
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          fields
+            augment static foo @88
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              type: double
+              shouldUseTypeForInitializerInference: true
+              id: field_2
+              augmentationTarget: <testLibraryFragment>::@extensionType::A::@field::foo
+''');
+  }
+
+  /// This is not allowed by the specification, but allowed syntactically,
+  /// so we need a way to handle it.
+  test_augmented_field_augment_getter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  augment static int foo = 1;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A(int it) {
+  static int get foo => 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @46
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_0
+              getter: getter_0
+            synthetic static foo @-1
+              reference: <testLibraryFragment>::@extensionType::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_1
+              getter: getter_1
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@fieldAugmentation::foo
+          constructors
+            @40
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @46
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            static get foo @69
+              reference: <testLibraryFragment>::@extensionType::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_1
+              variable: field_1
+          augmented
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@fieldAugmentation::foo
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::foo
+              <testLibraryFragment>::@extensionType::A::@getter::it
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          fields
+            augment static foo @85
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_2
+              augmentationTarget: <testLibraryFragment>::@extensionType::A::@field::foo
+''');
+  }
+
+  test_augmented_fields_add() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  static int foo2 = 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A(int it) {
+  static int foo1 = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @46
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_0
+              getter: getter_0
+            static foo1 @65
+              reference: <testLibraryFragment>::@extensionType::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              getter: getter_1
+              setter: setter_0
+          constructors
+            @40
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @46
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic static get foo1 @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::foo1
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_1
+              variable: field_1
+            synthetic static set foo1= @-1
+              reference: <testLibraryFragment>::@extensionType::A::@setter::foo1
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional _foo1 @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_1
+          augmented
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@field::foo2
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::foo1
+              <testLibraryFragment>::@extensionType::A::@setter::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@getter::foo2
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@setter::foo2
+              <testLibraryFragment>::@extensionType::A::@getter::it
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          fields
+            static foo2 @77
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@field::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_2
+              getter: getter_2
+              setter: setter_1
+          accessors
+            synthetic static get foo2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@getter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              returnType: int
+              id: getter_2
+              variable: field_2
+            synthetic static set foo2= @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@setter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              parameters
+                requiredPositional _foo2 @-1
+                  type: int
+              returnType: void
+              id: setter_1
+              variable: field_2
+''');
+  }
+
+  test_augmented_getters_add() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  int get foo2 => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A(int it) {
+  int get foo1 => 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @46
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_0
+              getter: getter_0
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@extensionType::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_1
+              getter: getter_1
+          constructors
+            @40
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @46
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            get foo1 @62
+              reference: <testLibraryFragment>::@extensionType::A::@getter::foo1
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_1
+              variable: field_1
+          augmented
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@field::foo2
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@getter::foo2
+              <testLibraryFragment>::@extensionType::A::@getter::it
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          fields
+            synthetic foo2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@field::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              type: int
+              id: field_2
+              getter: getter_2
+          accessors
+            get foo2 @74
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@getter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              returnType: int
+              id: getter_2
+              variable: field_2
+''');
+  }
+
+  test_augmented_getters_add_generic() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A<T2>(int it) {
+  T2 get foo2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A<T1>(int it) {
+  T1 get foo1;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T1 @42
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @50
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_0
+              getter: getter_0
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@extensionType::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: T1
+              id: field_1
+              getter: getter_1
+          constructors
+            @40
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @50
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            abstract get foo1 @65
+              reference: <testLibraryFragment>::@extensionType::A::@getter::foo1
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: T1
+              id: getter_1
+              variable: field_1
+          augmented
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::foo1
+              FieldMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@field::foo2
+                augmentationSubstitution: {T2: T1}
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::foo1
+              PropertyAccessorMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@getter::foo2
+                augmentationSubstitution: {T2: T1}
+              <testLibraryFragment>::@extensionType::A::@getter::it
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @54
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          fields
+            synthetic foo2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@field::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              type: T2
+              id: field_2
+              getter: getter_2
+          accessors
+            abstract get foo2 @77
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@getter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              returnType: T2
+              id: getter_2
+              variable: field_2
+''');
+  }
+
+  test_augmented_getters_augment_field() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  augment static int get foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A(int it) {
+  static int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @46
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_0
+              getter: getter_0
+            static foo @65
+              reference: <testLibraryFragment>::@extensionType::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              getter: getter_1
+              setter: setter_0
+          constructors
+            @40
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @46
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic static get foo @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_1
+              variable: field_1
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@getterAugmentation::foo
+            synthetic static set foo= @-1
+              reference: <testLibraryFragment>::@extensionType::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_1
+          augmented
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::foo
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@getterAugmentation::foo
+              <testLibraryFragment>::@extensionType::A::@setter::foo
+              <testLibraryFragment>::@extensionType::A::@getter::it
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          accessors
+            augment static get foo @89
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              returnType: int
+              id: getter_2
+              variable: field_1
+              augmentationTarget: <testLibraryFragment>::@extensionType::A::@getter::foo
+''');
+  }
+
+  test_augmented_getters_augment_field2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  augment static int get foo => 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  augment static int get foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+extension type A(int it) {
+  static int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @65
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @71
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_0
+              getter: getter_0
+            static foo @90
+              reference: <testLibraryFragment>::@extensionType::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              getter: getter_1
+              setter: setter_0
+          constructors
+            @65
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @71
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic static get foo @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_1
+              variable: field_1
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@getterAugmentation::foo
+            synthetic static set foo= @-1
+              reference: <testLibraryFragment>::@extensionType::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_1
+          augmented
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::foo
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A::@getterAugmentation::foo
+              <testLibraryFragment>::@extensionType::A::@setter::foo
+              <testLibraryFragment>::@extensionType::A::@getter::it
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+          accessors
+            augment static get foo @89
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              returnType: int
+              id: getter_2
+              variable: field_1
+              augmentationTarget: <testLibraryFragment>::@extensionType::A::@getter::foo
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A::@getterAugmentation::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          accessors
+            augment static get foo @89
+              reference: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+              returnType: int
+              id: getter_3
+              variable: field_1
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@getterAugmentation::foo
+''');
+  }
+
+  test_augmented_getters_augment_getter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  augment int get foo1 => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A(int it) {
+  int get foo1 => 0;
+  int get foo2 => 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @46
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_0
+              getter: getter_0
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@extensionType::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_1
+              getter: getter_1
+            synthetic foo2 @-1
+              reference: <testLibraryFragment>::@extensionType::A::@field::foo2
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_2
+              getter: getter_2
+          constructors
+            @40
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @46
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            get foo1 @62
+              reference: <testLibraryFragment>::@extensionType::A::@getter::foo1
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_1
+              variable: field_1
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@getterAugmentation::foo1
+            get foo2 @83
+              reference: <testLibraryFragment>::@extensionType::A::@getter::foo2
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_2
+              variable: field_2
+          augmented
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::foo1
+              <testLibraryFragment>::@extensionType::A::@field::foo2
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@getterAugmentation::foo1
+              <testLibraryFragment>::@extensionType::A::@getter::foo2
+              <testLibraryFragment>::@extensionType::A::@getter::it
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          accessors
+            augment get foo1 @82
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@getterAugmentation::foo1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              returnType: int
+              id: getter_3
+              variable: field_1
+              augmentationTarget: <testLibraryFragment>::@extensionType::A::@getter::foo1
+''');
+  }
+
+  test_augmented_getters_augment_getter2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  augment int get foo => 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  augment int get foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+extension type A(int it) {
+  int get foo => 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @65
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @71
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_0
+              getter: getter_0
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@extensionType::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_1
+              getter: getter_1
+          constructors
+            @65
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @71
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            get foo @87
+              reference: <testLibraryFragment>::@extensionType::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_1
+              variable: field_1
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@getterAugmentation::foo
+          augmented
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::foo
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A::@getterAugmentation::foo
+              <testLibraryFragment>::@extensionType::A::@getter::it
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+          accessors
+            augment get foo @82
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              returnType: int
+              id: getter_2
+              variable: field_1
+              augmentationTarget: <testLibraryFragment>::@extensionType::A::@getter::foo
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A::@getterAugmentation::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          accessors
+            augment get foo @82
+              reference: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+              returnType: int
+              id: getter_3
+              variable: field_1
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@getterAugmentation::foo
+''');
+  }
+
+  test_augmented_interfaces() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) implements I2 {}
+extension type I2(int it) {}
+''');
+
+    configuration.withConstructors = false;
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A(int it) implements I1 {}
+extension type I1(int it) {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          interfaces
+            I1
+          fields
+            final it @46
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+          augmented
+            interfaces
+              I1
+              I2
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::it
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::it
+        I1 @82
+          reference: <testLibraryFragment>::@extensionType::I1
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::I1::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::I1::@constructor::new
+          typeErasure: int
+          fields
+            final it @89
+              reference: <testLibraryFragment>::@extensionType::I1::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::I1
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::I1::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::I1
+              returnType: int
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          interfaces
+            I2
+        I2 @94
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          representation: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2::@field::it
+          primaryConstructor: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2::@constructor::new
+          typeErasure: int
+          fields
+            final it @101
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2::@field::it
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2::@getter::it
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2
+              returnType: int
+''');
+  }
+
+  test_augmented_interfaces_chain() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+import augment 'b.dart';
+augment extension type A(int it) implements I2 {}
+extension type I2(int it) {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'a.dart';
+augment extension type A(int it) implements I3 {}
+extension type I3(int it) {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A(int it) implements I1 {}
+extension type I1(int it) {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+      augmentationImports
+        package:test/b.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+          reference: <testLibrary>::@augmentation::package:test/b.dart
+          definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          interfaces
+            I1
+          fields
+            final it @46
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          constructors
+            @40
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @46
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+          augmented
+            interfaces
+              I1
+              I2
+              I3
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::it
+        I1 @82
+          reference: <testLibraryFragment>::@extensionType::I1
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::I1::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::I1::@constructor::new
+          typeErasure: int
+          fields
+            final it @89
+              reference: <testLibraryFragment>::@extensionType::I1::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::I1
+              type: int
+          constructors
+            @82
+              reference: <testLibraryFragment>::@extensionType::I1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::I1
+              parameters
+                requiredPositional final this.it @89
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::I1::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::I1::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::I1
+              returnType: int
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @77
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+          interfaces
+            I2
+        I2 @119
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          representation: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2::@field::it
+          primaryConstructor: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2::@constructor::new
+          typeErasure: int
+          fields
+            final it @126
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2::@field::it
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2
+              type: int
+          constructors
+            @119
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2
+              parameters
+                requiredPositional final this.it @126
+                  type: int
+                  field: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2::@getter::it
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2
+              returnType: int
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+      extensionTypes
+        augment A @49
+          reference: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          interfaces
+            I3
+        I3 @91
+          reference: <testLibrary>::@fragment::package:test/b.dart::@extensionType::I3
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          representation: <testLibrary>::@fragment::package:test/b.dart::@extensionType::I3::@field::it
+          primaryConstructor: <testLibrary>::@fragment::package:test/b.dart::@extensionType::I3::@constructor::new
+          typeErasure: int
+          fields
+            final it @98
+              reference: <testLibrary>::@fragment::package:test/b.dart::@extensionType::I3::@field::it
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@extensionType::I3
+              type: int
+          constructors
+            @91
+              reference: <testLibrary>::@fragment::package:test/b.dart::@extensionType::I3::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@extensionType::I3
+              parameters
+                requiredPositional final this.it @98
+                  type: int
+                  field: <testLibrary>::@fragment::package:test/b.dart::@extensionType::I3::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibrary>::@fragment::package:test/b.dart::@extensionType::I3::@getter::it
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@extensionType::I3
+              returnType: int
+''');
+  }
+
+  test_augmented_interfaces_generic() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A<T2>(int it) implements I2<T2> {}
+extension type I2<E>(int it) {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A<T>(int it) implements I1 {}
+extension type I1(int it) {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @42
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          interfaces
+            I1
+          fields
+            final it @49
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          constructors
+            @40
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @49
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+          augmented
+            interfaces
+              I1
+              I2<T>
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::it
+        I1 @85
+          reference: <testLibraryFragment>::@extensionType::I1
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::I1::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::I1::@constructor::new
+          typeErasure: int
+          fields
+            final it @92
+              reference: <testLibraryFragment>::@extensionType::I1::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::I1
+              type: int
+          constructors
+            @85
+              reference: <testLibraryFragment>::@extensionType::I1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::I1
+              parameters
+                requiredPositional final this.it @92
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::I1::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::I1::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::I1
+              returnType: int
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @54
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          interfaces
+            I2<T2>
+        I2 @102
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant E @105
+              defaultType: dynamic
+          representation: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2::@field::it
+          primaryConstructor: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2::@constructor::new
+          typeErasure: int
+          fields
+            final it @112
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2::@field::it
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2
+              type: int
+          constructors
+            @102
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2
+              parameters
+                requiredPositional final this.it @112
+                  type: int
+                  field: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2::@getter::it
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2
+              returnType: int
+''');
+  }
+
+  test_augmented_interfaces_generic_mismatch() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A<T2, T3>(int it) implements I2<T2> {}
+extension type I2<E>(int it) {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A<T>(int it) implements I1 {}
+extension type I1(int it) {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @42
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          interfaces
+            I1
+          fields
+            final it @49
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          constructors
+            @40
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @49
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+          augmented
+            interfaces
+              I1
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::it
+        I1 @85
+          reference: <testLibraryFragment>::@extensionType::I1
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::I1::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::I1::@constructor::new
+          typeErasure: int
+          fields
+            final it @92
+              reference: <testLibraryFragment>::@extensionType::I1::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::I1
+              type: int
+          constructors
+            @85
+              reference: <testLibraryFragment>::@extensionType::I1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::I1
+              parameters
+                requiredPositional final this.it @92
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::I1::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::I1::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::I1
+              returnType: int
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @54
+              defaultType: dynamic
+            covariant T3 @58
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          interfaces
+            I2<T2>
+        I2 @106
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant E @109
+              defaultType: dynamic
+          representation: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2::@field::it
+          primaryConstructor: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2::@constructor::new
+          typeErasure: int
+          fields
+            final it @116
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2::@field::it
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2
+              type: int
+          constructors
+            @106
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2
+              parameters
+                requiredPositional final this.it @116
+                  type: int
+                  field: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2::@getter::it
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionType::I2
+              returnType: int
+''');
+  }
+
+  test_augmented_methods() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  void bar() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A(int it) {
+  void foo() {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @46
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          constructors
+            @40
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @46
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+          methods
+            foo @59
+              reference: <testLibraryFragment>::@extensionType::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: void
+          augmented
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::it
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@method::bar
+              <testLibraryFragment>::@extensionType::A::@method::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          methods
+            bar @71
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@method::bar
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              returnType: void
+''');
+  }
+
+  test_augmented_methods_augment() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  augment void foo1() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A(int it) {
+  void foo1() {}
+  void foo2() {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @46
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          constructors
+            @40
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @46
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+          methods
+            foo1 @59
+              reference: <testLibraryFragment>::@extensionType::A::@method::foo1
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: void
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@methodAugmentation::foo1
+            foo2 @76
+              reference: <testLibraryFragment>::@extensionType::A::@method::foo2
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: void
+          augmented
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::it
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@methodAugmentation::foo1
+              <testLibraryFragment>::@extensionType::A::@method::foo2
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          methods
+            augment foo1 @79
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@methodAugmentation::foo1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              returnType: void
+              augmentationTarget: <testLibraryFragment>::@extensionType::A::@method::foo1
+''');
+  }
+
+  test_augmented_methods_augment2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+import augment 'b.dart';
+augment extension type A(int it) {
+  augment void foo() {}
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'a.dart';
+augment extension type A(int it) {
+  augment void foo() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A(int it) {
+  void foo() {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+      augmentationImports
+        package:test/b.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+          reference: <testLibrary>::@augmentation::package:test/b.dart
+          definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @46
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          constructors
+            @40
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @46
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+          methods
+            foo @59
+              reference: <testLibraryFragment>::@extensionType::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: void
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@methodAugmentation::foo
+          augmented
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::it
+            methods
+              <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A::@methodAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @77
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+          methods
+            augment foo @104
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              returnType: void
+              augmentationTarget: <testLibraryFragment>::@extensionType::A::@method::foo
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A::@methodAugmentation::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+      extensionTypes
+        augment A @49
+          reference: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          methods
+            augment foo @76
+              reference: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+              returnType: void
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@methodAugmentation::foo
+''');
+  }
+
+  test_augmented_methods_generic() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A<T2>(int it) {
+  T2 bar() => throw 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A<T>(int it) {
+  T foo() => throw 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @42
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @49
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          constructors
+            @40
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @49
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+          methods
+            foo @59
+              reference: <testLibraryFragment>::@extensionType::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: T
+          augmented
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::it
+            methods
+              MethodMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@method::bar
+                augmentationSubstitution: {T2: T}
+              <testLibraryFragment>::@extensionType::A::@method::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @54
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          methods
+            bar @73
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@method::bar
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              returnType: T2
+''');
+  }
+
+  test_augmented_methods_generic_augment() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A<T2>(int it) {
+  augment T2 foo() => throw 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A<T>(int it) {
+  T foo() => throw 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @42
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @49
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          constructors
+            @40
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @49
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+          methods
+            foo @59
+              reference: <testLibraryFragment>::@extensionType::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: T
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@methodAugmentation::foo
+          augmented
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::it
+            methods
+              MethodMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@methodAugmentation::foo
+                augmentationSubstitution: {T2: T}
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @54
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          methods
+            augment foo @81
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              returnType: T2
+              augmentationTarget: <testLibraryFragment>::@extensionType::A::@method::foo
+''');
+  }
+
+  test_augmented_methods_typeParameterCountMismatch() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A<T>(int it) {
+  augment void foo() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A(int it) {
+  void foo() {}
+  void bar() {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @46
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          constructors
+            @40
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @46
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+          methods
+            foo @59
+              reference: <testLibraryFragment>::@extensionType::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: void
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@methodAugmentation::foo
+            bar @75
+              reference: <testLibraryFragment>::@extensionType::A::@method::bar
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: void
+          augmented
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::it
+            methods
+              <testLibraryFragment>::@extensionType::A::@method::bar
+              MethodMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@methodAugmentation::foo
+                augmentationSubstitution: {T: InvalidType}
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T @54
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          methods
+            augment foo @82
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              returnType: void
+              augmentationTarget: <testLibraryFragment>::@extensionType::A::@method::foo
+''');
+  }
+
+  test_augmented_setters_add() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  set foo2(int _) {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A(int it) {
+  set foo1(int _) {}
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @46
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_0
+              getter: getter_0
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@extensionType::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_1
+              setter: setter_0
+          constructors
+            @40
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @46
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            set foo1= @58
+              reference: <testLibraryFragment>::@extensionType::A::@setter::foo1
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional _ @67
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_1
+          augmented
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@field::foo2
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@extensionType::A::@setter::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@setter::foo2
+              <testLibraryFragment>::@extensionType::A::@getter::it
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          fields
+            synthetic foo2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@field::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              type: int
+              id: field_2
+              setter: setter_1
+          accessors
+            set foo2= @70
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@setter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              parameters
+                requiredPositional _ @79
+                  type: int
+              returnType: void
+              id: setter_1
+              variable: field_2
+''');
+  }
+
+  test_augmented_setters_augment_field() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  augment static set foo(int _) {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A(int it) {
+  static int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @46
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_0
+              getter: getter_0
+            static foo @65
+              reference: <testLibraryFragment>::@extensionType::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              getter: getter_1
+              setter: setter_0
+          constructors
+            @40
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @46
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic static get foo @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_1
+              variable: field_1
+            synthetic static set foo= @-1
+              reference: <testLibraryFragment>::@extensionType::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_1
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@setterAugmentation::foo
+          augmented
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::foo
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::foo
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@setterAugmentation::foo
+              <testLibraryFragment>::@extensionType::A::@getter::it
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          accessors
+            augment static set foo= @85
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@setterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              parameters
+                requiredPositional _ @93
+                  type: int
+              returnType: void
+              id: setter_1
+              variable: field_1
+              augmentationTarget: <testLibraryFragment>::@extensionType::A::@setter::foo
+''');
+  }
+
+  test_augmented_setters_augment_setter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A(int it) {
+  augment set foo1(int _) {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A(int it) {
+  set foo1(int _) {}
+  set foo2(int _) {}
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @40
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @46
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_0
+              getter: getter_0
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@extensionType::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_1
+              setter: setter_0
+            synthetic foo2 @-1
+              reference: <testLibraryFragment>::@extensionType::A::@field::foo2
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+              id: field_2
+              setter: setter_1
+          constructors
+            @40
+              reference: <testLibraryFragment>::@extensionType::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional final this.it @46
+                  type: int
+                  field: <testLibraryFragment>::@extensionType::A::@field::it
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            set foo1= @58
+              reference: <testLibraryFragment>::@extensionType::A::@setter::foo1
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional _ @67
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_1
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@setterAugmentation::foo1
+            set foo2= @79
+              reference: <testLibraryFragment>::@extensionType::A::@setter::foo2
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              parameters
+                requiredPositional _ @88
+                  type: int
+              returnType: void
+              id: setter_1
+              variable: field_2
+          augmented
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::foo1
+              <testLibraryFragment>::@extensionType::A::@field::foo2
+              <testLibraryFragment>::@extensionType::A::@field::it
+            constructors
+              <testLibraryFragment>::@extensionType::A::@constructor::new
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@setterAugmentation::foo1
+              <testLibraryFragment>::@extensionType::A::@setter::foo2
+              <testLibraryFragment>::@extensionType::A::@getter::it
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @52
+          reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+          accessors
+            augment set foo1= @78
+              reference: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A::@setterAugmentation::foo1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@extensionTypeAugmentation::A
+              parameters
+                requiredPositional _ @87
+                  type: int
+              returnType: void
+              id: setter_2
+              variable: field_1
+              augmentationTarget: <testLibraryFragment>::@extensionType::A::@setter::foo1
+''');
+  }
+
+  test_augmentedBy_class2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+
+augment class A {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+
+augment class A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+
+extension type A(int it) {}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @66
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @72
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @44
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTargetAny: <testLibraryFragment>::@extensionType::A
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @44
+          reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTargetAny: <testLibraryFragment>::@extensionType::A
+''');
+  }
+
+  test_augmentedBy_class_extensionType() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+
+augment class A {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+
+augment extension type A(int it) {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+
+extension type A(int it) {}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensionTypes
+        A @66
+          reference: <testLibraryFragment>::@extensionType::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+          representation: <testLibraryFragment>::@extensionType::A::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::A::@constructor::new
+          typeErasure: int
+          fields
+            final it @72
+              reference: <testLibraryFragment>::@extensionType::A::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::A::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::A
+              returnType: int
+          augmented
+            fields
+              <testLibraryFragment>::@extensionType::A::@field::it
+            accessors
+              <testLibraryFragment>::@extensionType::A::@getter::it
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @44
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTargetAny: <testLibraryFragment>::@extensionType::A
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      extensionTypes
+        augment A @53
+          reference: <testLibrary>::@fragment::package:test/b.dart::@extensionTypeAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibraryFragment>::@extensionType::A
+''');
+  }
+}
+
+@reflectiveTest
+class ExtensionTypeElementTest_augmentation_fromBytes
+    extends ExtensionTypeElementTest_augmentation {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class ExtensionTypeElementTest_augmentation_keepLinking
+    extends ExtensionTypeElementTest_augmentation {
+  @override
+  bool get keepLinkingLibraries => true;
+}
+
+@reflectiveTest
+class ExtensionTypeElementTest_fromBytes extends ElementsBaseTest
+    with ExtensionTypeElementMixin {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class ExtensionTypeElementTest_keepLinking extends ElementsBaseTest
+    with ExtensionTypeElementMixin {
+  @override
+  bool get keepLinkingLibraries => true;
+}
+
+// TODO(scheglov): This is duplicate.
+extension on ElementTextConfiguration {
+  void forPromotableFields({
+    Set<String> classNames = const {},
+    Set<String> enumNames = const {},
+    Set<String> extensionTypeNames = const {},
+    Set<String> mixinNames = const {},
+    Set<String> fieldNames = const {},
+  }) {
+    filter = (e) {
+      if (e is ClassElement) {
+        return classNames.contains(e.name);
+      } else if (e is ConstructorElement) {
+        return false;
+      } else if (e is EnumElement) {
+        return enumNames.contains(e.name);
+      } else if (e is ExtensionTypeElement) {
+        return extensionTypeNames.contains(e.name);
+      } else if (e is FieldElement) {
+        return fieldNames.isEmpty || fieldNames.contains(e.name);
+      } else if (e is MixinElement) {
+        return mixinNames.contains(e.name);
+      } else if (e is PartElement) {
+        return false;
+      } else if (e is PropertyAccessorElement) {
+        return false;
+      }
+      return true;
+    };
+  }
+}
diff --git a/pkg/analyzer/test/src/summary/elements/formal_parameter_test.dart b/pkg/analyzer/test/src/summary/elements/formal_parameter_test.dart
new file mode 100644
index 0000000..f0e8a2b
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/elements/formal_parameter_test.dart
@@ -0,0 +1,626 @@
+// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../dart/resolution/node_text_expectations.dart';
+import '../elements_base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FormalParameterElementTest_keepLinking);
+    defineReflectiveTests(FormalParameterElementTest_fromBytes);
+    defineReflectiveTests(UpdateNodeTextExpectations);
+  });
+}
+
+abstract class FormalParameterElementTest extends ElementsBaseTest {
+  test_parameter() async {
+    var library = await buildLibrary('void main(int p) {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        main @5
+          reference: <testLibraryFragment>::@function::main
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional p @14
+              type: int
+          returnType: void
+''');
+  }
+
+  test_parameter_covariant_explicit_named() async {
+    var library = await buildLibrary('''
+class A {
+  void m({covariant A a}) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          methods
+            m @17
+              reference: <testLibraryFragment>::@class::A::@method::m
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                optionalNamed default covariant a @32
+                  reference: <testLibraryFragment>::@class::A::@method::m::@parameter::a
+                  type: A
+              returnType: void
+''');
+  }
+
+  test_parameter_covariant_explicit_positional() async {
+    var library = await buildLibrary('''
+class A {
+  void m([covariant A a]) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          methods
+            m @17
+              reference: <testLibraryFragment>::@class::A::@method::m
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                optionalPositional default covariant a @32
+                  type: A
+              returnType: void
+''');
+  }
+
+  test_parameter_covariant_explicit_required() async {
+    var library = await buildLibrary('''
+class A {
+  void m(covariant A a) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          methods
+            m @17
+              reference: <testLibraryFragment>::@class::A::@method::m
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional covariant a @31
+                  type: A
+              returnType: void
+''');
+  }
+
+  test_parameter_covariant_inherited() async {
+    var library = await buildLibrary(r'''
+class A<T> {
+  void f(covariant T t) {}
+}
+class B<T> extends A<T> {
+  void f(T t) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          methods
+            f @20
+              reference: <testLibraryFragment>::@class::A::@method::f
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional covariant t @34
+                  type: T
+              returnType: void
+        class B @48
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @50
+              defaultType: dynamic
+          supertype: A<T>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::A::@constructor::new
+                substitution: {T: T}
+          methods
+            f @75
+              reference: <testLibraryFragment>::@class::B::@method::f
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                requiredPositional covariant t @79
+                  type: T
+              returnType: void
+''');
+  }
+
+  test_parameter_covariant_inherited_named() async {
+    var library = await buildLibrary('''
+class A {
+  void m({covariant A a}) {}
+}
+class B extends A {
+  void m({B a}) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          methods
+            m @17
+              reference: <testLibraryFragment>::@class::A::@method::m
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                optionalNamed default covariant a @32
+                  reference: <testLibraryFragment>::@class::A::@method::m::@parameter::a
+                  type: A
+              returnType: void
+        class B @47
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+          methods
+            m @68
+              reference: <testLibraryFragment>::@class::B::@method::m
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                optionalNamed default covariant a @73
+                  reference: <testLibraryFragment>::@class::B::@method::m::@parameter::a
+                  type: B
+              returnType: void
+''');
+  }
+
+  test_parameter_parameters() async {
+    var library = await buildLibrary('class C { f(g(x, y)) {} }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            f @10
+              reference: <testLibraryFragment>::@class::C::@method::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional g @12
+                  type: dynamic Function(dynamic, dynamic)
+                  parameters
+                    requiredPositional x @14
+                      type: dynamic
+                    requiredPositional y @17
+                      type: dynamic
+              returnType: dynamic
+''');
+  }
+
+  test_parameter_parameters_in_generic_class() async {
+    var library = await buildLibrary('class C<A, B> { f(A g(B x)) {} }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant A @8
+              defaultType: dynamic
+            covariant B @11
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            f @16
+              reference: <testLibraryFragment>::@class::C::@method::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional g @20
+                  type: A Function(B)
+                  parameters
+                    requiredPositional x @24
+                      type: B
+              returnType: dynamic
+''');
+  }
+
+  test_parameter_return_type() async {
+    var library = await buildLibrary('class C { f(int g()) {} }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            f @10
+              reference: <testLibraryFragment>::@class::C::@method::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional g @16
+                  type: int Function()
+              returnType: dynamic
+''');
+  }
+
+  test_parameter_return_type_void() async {
+    var library = await buildLibrary('class C { f(void g()) {} }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            f @10
+              reference: <testLibraryFragment>::@class::C::@method::f
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional g @17
+                  type: void Function()
+              returnType: dynamic
+''');
+  }
+
+  test_parameter_typeParameters() async {
+    var library = await buildLibrary(r'''
+void f(T a<T, U>(U u)) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        f @5
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional a @9
+              type: T Function<T, U>(U)
+              typeParameters
+                covariant T @11
+                covariant U @14
+              parameters
+                requiredPositional u @19
+                  type: U
+          returnType: void
+''');
+  }
+
+  test_parameterTypeNotInferred_constructor() async {
+    // Strong mode doesn't do type inference on constructor parameters, so it's
+    // ok that we don't store inferred type info for them in summaries.
+    var library = await buildLibrary('''
+class C {
+  C.positional([x = 1]);
+  C.named({x: 1});
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            positional @14
+              reference: <testLibraryFragment>::@class::C::@constructor::positional
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 13
+              nameEnd: 24
+              parameters
+                optionalPositional default x @26
+                  type: dynamic
+                  constantInitializer
+                    IntegerLiteral
+                      literal: 1 @30
+                      staticType: int
+            named @39
+              reference: <testLibraryFragment>::@class::C::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 38
+              nameEnd: 44
+              parameters
+                optionalNamed default x @46
+                  reference: <testLibraryFragment>::@class::C::@constructor::named::@parameter::x
+                  type: dynamic
+                  constantInitializer
+                    IntegerLiteral
+                      literal: 1 @49
+                      staticType: int
+''');
+  }
+
+  test_parameterTypeNotInferred_initializingFormal() async {
+    // Strong mode doesn't do type inference on initializing formals, so it's
+    // ok that we don't store inferred type info for them in summaries.
+    var library = await buildLibrary('''
+class C {
+  var x;
+  C.positional([this.x = 1]);
+  C.named({this.x: 1});
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @16
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            positional @23
+              reference: <testLibraryFragment>::@class::C::@constructor::positional
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 22
+              nameEnd: 33
+              parameters
+                optionalPositional default final this.x @40
+                  type: dynamic
+                  constantInitializer
+                    IntegerLiteral
+                      literal: 1 @44
+                      staticType: int
+                  field: <testLibraryFragment>::@class::C::@field::x
+            named @53
+              reference: <testLibraryFragment>::@class::C::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::C
+              periodOffset: 52
+              nameEnd: 58
+              parameters
+                optionalNamed default final this.x @65
+                  reference: <testLibraryFragment>::@class::C::@constructor::named::@parameter::x
+                  type: dynamic
+                  constantInitializer
+                    IntegerLiteral
+                      literal: 1 @68
+                      staticType: int
+                  field: <testLibraryFragment>::@class::C::@field::x
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: dynamic
+              returnType: void
+''');
+  }
+
+  test_parameterTypeNotInferred_staticMethod() async {
+    // Strong mode doesn't do type inference on parameters of static methods,
+    // so it's ok that we don't store inferred type info for them in summaries.
+    var library = await buildLibrary('''
+class C {
+  static void positional([x = 1]) {}
+  static void named({x: 1}) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            static positional @24
+              reference: <testLibraryFragment>::@class::C::@method::positional
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                optionalPositional default x @36
+                  type: dynamic
+                  constantInitializer
+                    IntegerLiteral
+                      literal: 1 @40
+                      staticType: int
+              returnType: void
+            static named @61
+              reference: <testLibraryFragment>::@class::C::@method::named
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                optionalNamed default x @68
+                  reference: <testLibraryFragment>::@class::C::@method::named::@parameter::x
+                  type: dynamic
+                  constantInitializer
+                    IntegerLiteral
+                      literal: 1 @71
+                      staticType: int
+              returnType: void
+''');
+  }
+
+  test_parameterTypeNotInferred_topLevelFunction() async {
+    // Strong mode doesn't do type inference on parameters of top level
+    // functions, so it's ok that we don't store inferred type info for them in
+    // summaries.
+    var library = await buildLibrary('''
+void positional([x = 1]) {}
+void named({x: 1}) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        positional @5
+          reference: <testLibraryFragment>::@function::positional
+          enclosingElement: <testLibraryFragment>
+          parameters
+            optionalPositional default x @17
+              type: dynamic
+              constantInitializer
+                IntegerLiteral
+                  literal: 1 @21
+                  staticType: int
+          returnType: void
+        named @33
+          reference: <testLibraryFragment>::@function::named
+          enclosingElement: <testLibraryFragment>
+          parameters
+            optionalNamed default x @40
+              reference: <testLibraryFragment>::@function::named::@parameter::x
+              type: dynamic
+              constantInitializer
+                IntegerLiteral
+                  literal: 1 @43
+                  staticType: int
+          returnType: void
+''');
+  }
+}
+
+@reflectiveTest
+class FormalParameterElementTest_fromBytes extends FormalParameterElementTest {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class FormalParameterElementTest_keepLinking
+    extends FormalParameterElementTest {
+  @override
+  bool get keepLinkingLibraries => true;
+}
diff --git a/pkg/analyzer/test/src/summary/elements/function_type_annotation_test.dart b/pkg/analyzer/test/src/summary/elements/function_type_annotation_test.dart
new file mode 100644
index 0000000..fd58279
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/elements/function_type_annotation_test.dart
@@ -0,0 +1,876 @@
+// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../dart/resolution/node_text_expectations.dart';
+import '../elements_base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FunctionTypeAnnotationElementTest_keepLinking);
+    defineReflectiveTests(FunctionTypeAnnotationElementTest_fromBytes);
+    defineReflectiveTests(UpdateNodeTextExpectations);
+  });
+}
+
+abstract class FunctionTypeAnnotationElementTest extends ElementsBaseTest {
+  test_generic_function_type_nullability_none() async {
+    var library = await buildLibrary('''
+void Function() f;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static f @16
+          reference: <testLibraryFragment>::@topLevelVariable::f
+          enclosingElement: <testLibraryFragment>
+          type: void Function()
+      accessors
+        synthetic static get f @-1
+          reference: <testLibraryFragment>::@getter::f
+          enclosingElement: <testLibraryFragment>
+          returnType: void Function()
+        synthetic static set f= @-1
+          reference: <testLibraryFragment>::@setter::f
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _f @-1
+              type: void Function()
+          returnType: void
+''');
+  }
+
+  test_generic_function_type_nullability_question() async {
+    var library = await buildLibrary('''
+void Function()? f;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static f @17
+          reference: <testLibraryFragment>::@topLevelVariable::f
+          enclosingElement: <testLibraryFragment>
+          type: void Function()?
+      accessors
+        synthetic static get f @-1
+          reference: <testLibraryFragment>::@getter::f
+          enclosingElement: <testLibraryFragment>
+          returnType: void Function()?
+        synthetic static set f= @-1
+          reference: <testLibraryFragment>::@setter::f
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _f @-1
+              type: void Function()?
+          returnType: void
+''');
+  }
+
+  test_genericFunction_asFunctionReturnType() async {
+    var library = await buildLibrary(r'''
+int Function(int a, String b) f() => null;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        f @30
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          returnType: int Function(int, String)
+''');
+  }
+
+  test_genericFunction_asFunctionTypedParameterReturnType() async {
+    var library = await buildLibrary(r'''
+void f(int Function(int a, String b) p(num c)) => null;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        f @5
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional p @37
+              type: int Function(int, String) Function(num)
+              parameters
+                requiredPositional c @43
+                  type: num
+          returnType: void
+''');
+  }
+
+  test_genericFunction_asGenericFunctionReturnType() async {
+    var library = await buildLibrary(r'''
+typedef F = void Function(String a) Function(int b);
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      typeAliases
+        F @8
+          reference: <testLibraryFragment>::@typeAlias::F
+          aliasedType: void Function(String) Function(int)
+          aliasedElement: GenericFunctionTypeElement
+            parameters
+              requiredPositional b @49
+                type: int
+            returnType: void Function(String)
+''');
+  }
+
+  test_genericFunction_asMethodReturnType() async {
+    var library = await buildLibrary(r'''
+class C {
+  int Function(int a, String b) m() => null;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            m @42
+              reference: <testLibraryFragment>::@class::C::@method::m
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int Function(int, String)
+''');
+  }
+
+  test_genericFunction_asParameterType() async {
+    var library = await buildLibrary(r'''
+void f(int Function(int a, String b) p) => null;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        f @5
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional p @37
+              type: int Function(int, String)
+          returnType: void
+''');
+  }
+
+  test_genericFunction_asTopLevelVariableType() async {
+    var library = await buildLibrary(r'''
+int Function(int a, String b) v;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static v @30
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: int Function(int, String)
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: int Function(int, String)
+        synthetic static set v= @-1
+          reference: <testLibraryFragment>::@setter::v
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _v @-1
+              type: int Function(int, String)
+          returnType: void
+''');
+  }
+
+  test_genericFunction_asTypeArgument_ofAnnotation_class() async {
+    var library = await buildLibrary(r'''
+class A<T> {
+  const A();
+}
+
+@A<int Function(String a)>()
+class B {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            const @21
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class B @64
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @29
+              name: SimpleIdentifier
+                token: A @30
+                staticElement: <testLibraryFragment>::@class::A
+                staticType: null
+              typeArguments: TypeArgumentList
+                leftBracket: < @31
+                arguments
+                  GenericFunctionType
+                    returnType: NamedType
+                      name: int @32
+                      element: dart:core::<fragment>::@class::int
+                      type: int
+                    functionKeyword: Function @36
+                    parameters: FormalParameterList
+                      leftParenthesis: ( @44
+                      parameter: SimpleFormalParameter
+                        type: NamedType
+                          name: String @45
+                          element: dart:core::<fragment>::@class::String
+                          type: String
+                        name: a @52
+                        declaredElement: a@52
+                          type: String
+                      rightParenthesis: ) @53
+                    declaredElement: GenericFunctionTypeElement
+                      parameters
+                        a
+                          kind: required positional
+                          type: String
+                      returnType: int
+                      type: int Function(String)
+                    type: int Function(String)
+                rightBracket: > @54
+              arguments: ArgumentList
+                leftParenthesis: ( @55
+                rightParenthesis: ) @56
+              element: ConstructorMember
+                base: <testLibraryFragment>::@class::A::@constructor::new
+                substitution: {T: int Function(String)}
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+''');
+  }
+
+  test_genericFunction_asTypeArgument_ofAnnotation_topLevelVariable() async {
+    var library = await buildLibrary(r'''
+class A<T> {
+  const A();
+}
+
+@A<int Function(String a)>()
+var v = 0;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            const @21
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+      topLevelVariables
+        static v @62
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @29
+              name: SimpleIdentifier
+                token: A @30
+                staticElement: <testLibraryFragment>::@class::A
+                staticType: null
+              typeArguments: TypeArgumentList
+                leftBracket: < @31
+                arguments
+                  GenericFunctionType
+                    returnType: NamedType
+                      name: int @32
+                      element: dart:core::<fragment>::@class::int
+                      type: int
+                    functionKeyword: Function @36
+                    parameters: FormalParameterList
+                      leftParenthesis: ( @44
+                      parameter: SimpleFormalParameter
+                        type: NamedType
+                          name: String @45
+                          element: dart:core::<fragment>::@class::String
+                          type: String
+                        name: a @52
+                        declaredElement: a@52
+                          type: String
+                      rightParenthesis: ) @53
+                    declaredElement: GenericFunctionTypeElement
+                      parameters
+                        a
+                          kind: required positional
+                          type: String
+                      returnType: int
+                      type: int Function(String)
+                    type: int Function(String)
+                rightBracket: > @54
+              arguments: ArgumentList
+                leftParenthesis: ( @55
+                rightParenthesis: ) @56
+              element: ConstructorMember
+                base: <testLibraryFragment>::@class::A::@constructor::new
+                substitution: {T: int Function(String)}
+          type: int
+          shouldUseTypeForInitializerInference: false
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static set v= @-1
+          reference: <testLibraryFragment>::@setter::v
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _v @-1
+              type: int
+          returnType: void
+''');
+  }
+
+  test_genericFunction_asTypeArgument_parameters_optionalNamed() async {
+    var library = await buildLibrary(r'''
+class A<T> {
+  const A();
+}
+
+const v = A<String Function({int? a})>();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            const @21
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+      topLevelVariables
+        static const v @35
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: A<String Function({int? a})>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              constructorName: ConstructorName
+                type: NamedType
+                  name: A @39
+                  typeArguments: TypeArgumentList
+                    leftBracket: < @40
+                    arguments
+                      GenericFunctionType
+                        returnType: NamedType
+                          name: String @41
+                          element: dart:core::<fragment>::@class::String
+                          type: String
+                        functionKeyword: Function @48
+                        parameters: FormalParameterList
+                          leftParenthesis: ( @56
+                          leftDelimiter: { @57
+                          parameter: DefaultFormalParameter
+                            parameter: SimpleFormalParameter
+                              type: NamedType
+                                name: int @58
+                                question: ? @61
+                                element: dart:core::<fragment>::@class::int
+                                type: int?
+                              name: a @63
+                              declaredElement: a@63
+                                type: int?
+                            declaredElement: a@63
+                              type: int?
+                          rightDelimiter: } @64
+                          rightParenthesis: ) @65
+                        declaredElement: GenericFunctionTypeElement
+                          parameters
+                            a
+                              kind: optional named
+                              type: int?
+                          returnType: String
+                          type: String Function({int? a})
+                        type: String Function({int? a})
+                    rightBracket: > @66
+                  element: <testLibraryFragment>::@class::A
+                  type: A<String Function({int? a})>
+                staticElement: ConstructorMember
+                  base: <testLibraryFragment>::@class::A::@constructor::new
+                  substitution: {T: String Function({int? a})}
+              argumentList: ArgumentList
+                leftParenthesis: ( @67
+                rightParenthesis: ) @68
+              staticType: A<String Function({int? a})>
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: A<String Function({int? a})>
+''');
+  }
+
+  test_genericFunction_asTypeArgument_parameters_optionalPositional() async {
+    var library = await buildLibrary(r'''
+class A<T> {
+  const A();
+}
+
+const v = A<String Function([int? a])>();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            const @21
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+      topLevelVariables
+        static const v @35
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: A<String Function([int?])>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              constructorName: ConstructorName
+                type: NamedType
+                  name: A @39
+                  typeArguments: TypeArgumentList
+                    leftBracket: < @40
+                    arguments
+                      GenericFunctionType
+                        returnType: NamedType
+                          name: String @41
+                          element: dart:core::<fragment>::@class::String
+                          type: String
+                        functionKeyword: Function @48
+                        parameters: FormalParameterList
+                          leftParenthesis: ( @56
+                          leftDelimiter: [ @57
+                          parameter: DefaultFormalParameter
+                            parameter: SimpleFormalParameter
+                              type: NamedType
+                                name: int @58
+                                question: ? @61
+                                element: dart:core::<fragment>::@class::int
+                                type: int?
+                              name: a @63
+                              declaredElement: a@63
+                                type: int?
+                            declaredElement: a@63
+                              type: int?
+                          rightDelimiter: ] @64
+                          rightParenthesis: ) @65
+                        declaredElement: GenericFunctionTypeElement
+                          parameters
+                            a
+                              kind: optional positional
+                              type: int?
+                          returnType: String
+                          type: String Function([int?])
+                        type: String Function([int?])
+                    rightBracket: > @66
+                  element: <testLibraryFragment>::@class::A
+                  type: A<String Function([int?])>
+                staticElement: ConstructorMember
+                  base: <testLibraryFragment>::@class::A::@constructor::new
+                  substitution: {T: String Function([int?])}
+              argumentList: ArgumentList
+                leftParenthesis: ( @67
+                rightParenthesis: ) @68
+              staticType: A<String Function([int?])>
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: A<String Function([int?])>
+''');
+  }
+
+  test_genericFunction_asTypeArgument_parameters_requiredNamed() async {
+    var library = await buildLibrary(r'''
+class A<T> {
+  const A();
+}
+
+const v = A<String Function({required int a})>();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            const @21
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+      topLevelVariables
+        static const v @35
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: A<String Function({required int a})>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              constructorName: ConstructorName
+                type: NamedType
+                  name: A @39
+                  typeArguments: TypeArgumentList
+                    leftBracket: < @40
+                    arguments
+                      GenericFunctionType
+                        returnType: NamedType
+                          name: String @41
+                          element: dart:core::<fragment>::@class::String
+                          type: String
+                        functionKeyword: Function @48
+                        parameters: FormalParameterList
+                          leftParenthesis: ( @56
+                          leftDelimiter: { @57
+                          parameter: DefaultFormalParameter
+                            parameter: SimpleFormalParameter
+                              requiredKeyword: required @58
+                              type: NamedType
+                                name: int @67
+                                element: dart:core::<fragment>::@class::int
+                                type: int
+                              name: a @71
+                              declaredElement: a@71
+                                type: int
+                            declaredElement: a@71
+                              type: int
+                          rightDelimiter: } @72
+                          rightParenthesis: ) @73
+                        declaredElement: GenericFunctionTypeElement
+                          parameters
+                            a
+                              kind: required named
+                              type: int
+                          returnType: String
+                          type: String Function({required int a})
+                        type: String Function({required int a})
+                    rightBracket: > @74
+                  element: <testLibraryFragment>::@class::A
+                  type: A<String Function({required int a})>
+                staticElement: ConstructorMember
+                  base: <testLibraryFragment>::@class::A::@constructor::new
+                  substitution: {T: String Function({required int a})}
+              argumentList: ArgumentList
+                leftParenthesis: ( @75
+                rightParenthesis: ) @76
+              staticType: A<String Function({required int a})>
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: A<String Function({required int a})>
+''');
+  }
+
+  test_genericFunction_asTypeArgument_parameters_requiredPositional() async {
+    var library = await buildLibrary(r'''
+class A<T> {
+  const A();
+}
+
+const v = A<String Function(int a)>();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            const @21
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+      topLevelVariables
+        static const v @35
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: A<String Function(int)>
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              constructorName: ConstructorName
+                type: NamedType
+                  name: A @39
+                  typeArguments: TypeArgumentList
+                    leftBracket: < @40
+                    arguments
+                      GenericFunctionType
+                        returnType: NamedType
+                          name: String @41
+                          element: dart:core::<fragment>::@class::String
+                          type: String
+                        functionKeyword: Function @48
+                        parameters: FormalParameterList
+                          leftParenthesis: ( @56
+                          parameter: SimpleFormalParameter
+                            type: NamedType
+                              name: int @57
+                              element: dart:core::<fragment>::@class::int
+                              type: int
+                            name: a @61
+                            declaredElement: a@61
+                              type: int
+                          rightParenthesis: ) @62
+                        declaredElement: GenericFunctionTypeElement
+                          parameters
+                            a
+                              kind: required positional
+                              type: int
+                          returnType: String
+                          type: String Function(int)
+                        type: String Function(int)
+                    rightBracket: > @63
+                  element: <testLibraryFragment>::@class::A
+                  type: A<String Function(int)>
+                staticElement: ConstructorMember
+                  base: <testLibraryFragment>::@class::A::@constructor::new
+                  substitution: {T: String Function(int)}
+              argumentList: ArgumentList
+                leftParenthesis: ( @64
+                rightParenthesis: ) @65
+              staticType: A<String Function(int)>
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: A<String Function(int)>
+''');
+  }
+
+  test_genericFunction_boundOf_typeParameter_ofMixin() async {
+    var library = await buildLibrary(r'''
+mixin B<X extends void Function()> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin B @6
+          reference: <testLibraryFragment>::@mixin::B
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant X @8
+              bound: void Function()
+              defaultType: void Function()
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_genericFunction_typeArgument_ofSuperclass_ofClassAlias() async {
+    var library = await buildLibrary(r'''
+class A<T> {}
+mixin M {}
+class B = A<void Function()> with M;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class alias B @31
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A<void Function()>
+          mixins
+            M
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::A::@constructor::new
+              superConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::A::@constructor::new
+                substitution: {T: void Function()}
+      mixins
+        mixin M @20
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_genericFunction_typeParameter_asTypedefArgument() async {
+    var library = await buildLibrary(r'''
+typedef F1 = Function<V1>(F2<V1>);
+typedef F2<V2> = V2 Function();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      typeAliases
+        F1 @8
+          reference: <testLibraryFragment>::@typeAlias::F1
+          aliasedType: dynamic Function<V1>(V1 Function())
+          aliasedElement: GenericFunctionTypeElement
+            typeParameters
+              covariant V1 @22
+            parameters
+              requiredPositional @-1
+                type: V1 Function()
+                  alias: <testLibraryFragment>::@typeAlias::F2
+                    typeArguments
+                      V1
+            returnType: dynamic
+        F2 @43
+          reference: <testLibraryFragment>::@typeAlias::F2
+          typeParameters
+            covariant V2 @46
+              defaultType: dynamic
+          aliasedType: V2 Function()
+          aliasedElement: GenericFunctionTypeElement
+            returnType: V2
+''');
+  }
+}
+
+@reflectiveTest
+class FunctionTypeAnnotationElementTest_fromBytes
+    extends FunctionTypeAnnotationElementTest {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class FunctionTypeAnnotationElementTest_keepLinking
+    extends FunctionTypeAnnotationElementTest {
+  @override
+  bool get keepLinkingLibraries => true;
+}
diff --git a/pkg/analyzer/test/src/summary/elements/library_augmentation_test.dart b/pkg/analyzer/test/src/summary/elements/library_augmentation_test.dart
new file mode 100644
index 0000000..3b6817f
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/elements/library_augmentation_test.dart
@@ -0,0 +1,1295 @@
+// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../dart/resolution/node_text_expectations.dart';
+import '../elements_base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(LibraryAugmentationElementTest_keepLinking);
+    defineReflectiveTests(LibraryAugmentationElementTest_fromBytes);
+    defineReflectiveTests(UpdateNodeTextExpectations);
+  });
+}
+
+abstract class LibraryAugmentationElementTest extends ElementsBaseTest {
+  test_augmentation_augmentationImports_augmentation() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+import augment 'b.dart';
+class A {}
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'a.dart';
+class B {}
+''');
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+      augmentationImports
+        package:test/b.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+          reference: <testLibrary>::@augmentation::package:test/b.dart
+          definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @31
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class A @60
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::A::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::A
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+      classes
+        class B @32
+          reference: <testLibrary>::@fragment::package:test/b.dart::@class::B
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/b.dart::@class::B::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@class::B
+''');
+  }
+
+  test_augmentation_class_constructor_superConstructor_generic_named() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+class B extends A<int> {
+  B() : super.named(0);
+}
+''');
+    var library = await buildLibrary('''
+import augment 'a.dart';
+class A<T> {
+  A.named(T a);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @33
+              defaultType: dynamic
+          constructors
+            named @42
+              reference: <testLibraryFragment>::@class::A::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 41
+              nameEnd: 47
+              parameters
+                requiredPositional a @50
+                  type: T
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class B @35
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::B
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          supertype: A<int>
+          constructors
+            @56
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::B::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::B
+              superConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::A::@constructor::named
+                substitution: {T: int}
+''');
+  }
+
+  test_augmentation_class_constructor_superConstructor_notGeneric_named() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+class B extends A {
+  B() : super.named();
+}
+''');
+    var library = await buildLibrary('''
+import augment 'a.dart';
+class A {
+  A.named();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            named @39
+              reference: <testLibraryFragment>::@class::A::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 38
+              nameEnd: 44
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class B @35
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::B
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          supertype: A
+          constructors
+            @51
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::B::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::B
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::named
+''');
+  }
+
+  test_augmentation_class_constructor_superConstructor_notGeneric_unnamed_explicit() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+class B extends A {
+  B() : super();
+}
+''');
+    var library = await buildLibrary('''
+import augment 'a.dart';
+class A {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class B @35
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::B
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          supertype: A
+          constructors
+            @51
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::B::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::B
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+''');
+  }
+
+  test_augmentation_class_notSimplyBounded_circularity_via_typedef() async {
+    // C's type parameter T is not simply bounded because its bound, F, expands
+    // to `dynamic F(C)`, which refers to C.
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+class C<T extends F> {}
+''');
+    var library = await buildLibrary('''
+import augment 'a.dart';
+typedef F(C value);
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      typeAliases
+        functionTypeAliasBased notSimplyBounded F @33
+          reference: <testLibraryFragment>::@typeAlias::F
+          aliasedType: dynamic Function(C<dynamic>)
+          aliasedElement: GenericFunctionTypeElement
+            parameters
+              requiredPositional value @37
+                type: C<dynamic>
+            returnType: dynamic
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        notSimplyBounded class C @35
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::C
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T @37
+              bound: dynamic
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::C::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::C
+''');
+  }
+
+  test_augmentation_class_notSimplyBounded_self() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+class C<T extends C> {}
+''');
+    var library = await buildLibrary('''
+import augment 'a.dart';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        notSimplyBounded class C @35
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::C
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T @37
+              bound: C<dynamic>
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::C::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::C
+''');
+  }
+
+  test_augmentation_defaultValue_class_field() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {
+  static const a = 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+import 'a.dart';
+void f({int x = A.a}) {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'b.dart';
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      functions
+        f @51
+          reference: <testLibrary>::@fragment::package:test/b.dart::@function::f
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          parameters
+            optionalNamed default x @58
+              reference: <testLibrary>::@fragment::package:test/b.dart::@function::f::@parameter::x
+              type: int
+              constantInitializer
+                PrefixedIdentifier
+                  prefix: SimpleIdentifier
+                    token: A @62
+                    staticElement: package:test/a.dart::<fragment>::@class::A
+                    staticType: null
+                  period: . @63
+                  identifier: SimpleIdentifier
+                    token: a @64
+                    staticElement: package:test/a.dart::<fragment>::@class::A::@getter::a
+                    staticType: int
+                  staticElement: package:test/a.dart::<fragment>::@class::A::@getter::a
+                  staticType: int
+          returnType: void
+''');
+  }
+
+  test_augmentation_defaultValue_prefix_class_field() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {
+  static const a = 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+import 'a.dart' as prefix;
+void f({int x = prefix.A.a}) {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'b.dart';
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      libraryImports
+        package:test/a.dart as prefix @48
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      prefixes
+        prefix @48
+          reference: <testLibrary>::@fragment::package:test/b.dart::@prefix::prefix
+          enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryImports
+        package:test/a.dart as prefix @48
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      libraryImportPrefixes
+        prefix @48
+          reference: <testLibrary>::@fragment::package:test/b.dart::@prefix::prefix
+          enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      functions
+        f @61
+          reference: <testLibrary>::@fragment::package:test/b.dart::@function::f
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          parameters
+            optionalNamed default x @68
+              reference: <testLibrary>::@fragment::package:test/b.dart::@function::f::@parameter::x
+              type: int
+              constantInitializer
+                PropertyAccess
+                  target: PrefixedIdentifier
+                    prefix: SimpleIdentifier
+                      token: prefix @72
+                      staticElement: <testLibrary>::@fragment::package:test/b.dart::@prefix::prefix
+                      staticType: null
+                    period: . @78
+                    identifier: SimpleIdentifier
+                      token: A @79
+                      staticElement: package:test/a.dart::<fragment>::@class::A
+                      staticType: null
+                    staticElement: package:test/a.dart::<fragment>::@class::A
+                    staticType: null
+                  operator: . @80
+                  propertyName: SimpleIdentifier
+                    token: a @81
+                    staticElement: package:test/a.dart::<fragment>::@class::A::@getter::a
+                    staticType: int
+                  staticType: int
+          returnType: void
+''');
+  }
+
+  test_augmentation_importScope_constant() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+final a = 0;
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+import 'a.dart';
+const b = a;
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'b.dart';
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      topLevelVariables
+        static const b @52
+          reference: <testLibrary>::@fragment::package:test/b.dart::@topLevelVariable::b
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            SimpleIdentifier
+              token: a @56
+              staticElement: package:test/a.dart::<fragment>::@getter::a
+              staticType: int
+      accessors
+        synthetic static get b @-1
+          reference: <testLibrary>::@fragment::package:test/b.dart::@getter::b
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          returnType: int
+''');
+  }
+
+  test_augmentation_importScope_constant_class_field() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {
+  static const a = 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+import 'a.dart';
+const b = A.a;
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'b.dart';
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      topLevelVariables
+        static const b @52
+          reference: <testLibrary>::@fragment::package:test/b.dart::@topLevelVariable::b
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PrefixedIdentifier
+              prefix: SimpleIdentifier
+                token: A @56
+                staticElement: package:test/a.dart::<fragment>::@class::A
+                staticType: null
+              period: . @57
+              identifier: SimpleIdentifier
+                token: a @58
+                staticElement: package:test/a.dart::<fragment>::@class::A::@getter::a
+                staticType: int
+              staticElement: package:test/a.dart::<fragment>::@class::A::@getter::a
+              staticType: int
+      accessors
+        synthetic static get b @-1
+          reference: <testLibrary>::@fragment::package:test/b.dart::@getter::b
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          returnType: int
+''');
+  }
+
+  test_augmentation_importScope_constant_instanceCreation() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {
+  const A {};
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+import 'a.dart';
+const a = A();
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'b.dart';
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      topLevelVariables
+        static const a @52
+          reference: <testLibrary>::@fragment::package:test/b.dart::@topLevelVariable::a
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          type: A
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            InstanceCreationExpression
+              constructorName: ConstructorName
+                type: NamedType
+                  name: A @56
+                  element: package:test/a.dart::<fragment>::@class::A
+                  type: A
+                staticElement: package:test/a.dart::<fragment>::@class::A::@constructor::new
+              argumentList: ArgumentList
+                leftParenthesis: ( @57
+                rightParenthesis: ) @58
+              staticType: A
+      accessors
+        synthetic static get a @-1
+          reference: <testLibrary>::@fragment::package:test/b.dart::@getter::a
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          returnType: A
+''');
+  }
+
+  test_augmentation_importScope_constant_prefix_class_field() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {
+  static const a = 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+import 'a.dart' as prefix;
+const b = prefix.A.a;
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'b.dart';
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      libraryImports
+        package:test/a.dart as prefix @48
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      prefixes
+        prefix @48
+          reference: <testLibrary>::@fragment::package:test/b.dart::@prefix::prefix
+          enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryImports
+        package:test/a.dart as prefix @48
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      libraryImportPrefixes
+        prefix @48
+          reference: <testLibrary>::@fragment::package:test/b.dart::@prefix::prefix
+          enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      topLevelVariables
+        static const b @62
+          reference: <testLibrary>::@fragment::package:test/b.dart::@topLevelVariable::b
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            PropertyAccess
+              target: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: prefix @66
+                  staticElement: <testLibrary>::@fragment::package:test/b.dart::@prefix::prefix
+                  staticType: null
+                period: . @72
+                identifier: SimpleIdentifier
+                  token: A @73
+                  staticElement: package:test/a.dart::<fragment>::@class::A
+                  staticType: null
+                staticElement: package:test/a.dart::<fragment>::@class::A
+                staticType: null
+              operator: . @74
+              propertyName: SimpleIdentifier
+                token: a @75
+                staticElement: package:test/a.dart::<fragment>::@class::A::@getter::a
+                staticType: int
+              staticType: int
+      accessors
+        synthetic static get b @-1
+          reference: <testLibrary>::@fragment::package:test/b.dart::@getter::b
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          returnType: int
+''');
+  }
+
+  test_augmentation_importScope_prefixed_metadata() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {
+  const A();
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+import 'a.dart' as prefix;
+
+@prefix.A()
+void f() {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'b.dart';
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      libraryImports
+        package:test/a.dart as prefix @48
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      prefixes
+        prefix @48
+          reference: <testLibrary>::@fragment::package:test/b.dart::@prefix::prefix
+          enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryImports
+        package:test/a.dart as prefix @48
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      libraryImportPrefixes
+        prefix @48
+          reference: <testLibrary>::@fragment::package:test/b.dart::@prefix::prefix
+          enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      functions
+        f @74
+          reference: <testLibrary>::@fragment::package:test/b.dart::@function::f
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          metadata
+            Annotation
+              atSign: @ @57
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: prefix @58
+                  staticElement: <testLibrary>::@fragment::package:test/b.dart::@prefix::prefix
+                  staticType: null
+                period: . @64
+                identifier: SimpleIdentifier
+                  token: A @65
+                  staticElement: package:test/a.dart::<fragment>::@class::A
+                  staticType: null
+                staticElement: package:test/a.dart::<fragment>::@class::A
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @66
+                rightParenthesis: ) @67
+              element: package:test/a.dart::<fragment>::@class::A::@constructor::new
+          returnType: void
+''');
+  }
+
+  test_augmentation_importScope_prefixed_typeAnnotation() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+import 'a.dart' as prefix;
+prefix.A f() {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'b.dart';
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      libraryImports
+        package:test/a.dart as prefix @48
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      prefixes
+        prefix @48
+          reference: <testLibrary>::@fragment::package:test/b.dart::@prefix::prefix
+          enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryImports
+        package:test/a.dart as prefix @48
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      libraryImportPrefixes
+        prefix @48
+          reference: <testLibrary>::@fragment::package:test/b.dart::@prefix::prefix
+          enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      functions
+        f @65
+          reference: <testLibrary>::@fragment::package:test/b.dart::@function::f
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          returnType: A
+''');
+  }
+
+  test_augmentation_importScope_topInference() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+final a = 0;
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+import 'a.dart';
+final b = a;
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'b.dart';
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      topLevelVariables
+        static final b @52
+          reference: <testLibrary>::@fragment::package:test/b.dart::@topLevelVariable::b
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          type: int
+          shouldUseTypeForInitializerInference: false
+      accessors
+        synthetic static get b @-1
+          reference: <testLibrary>::@fragment::package:test/b.dart::@getter::b
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          returnType: int
+''');
+  }
+
+  test_augmentation_importScope_types_augmentation() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+import 'a.dart';
+A f() {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'b.dart';
+A f() {}
+''');
+
+    // The augmentation imports `a.dart`, so can resolve `A`.
+    // But the library does not import, so there `A` is unresolved.
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        f @27
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          returnType: InvalidType
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      functions
+        f @48
+          reference: <testLibrary>::@fragment::package:test/b.dart::@function::f
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          returnType: A
+''');
+  }
+
+  test_augmentation_importScope_types_library() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+A f() {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'b.dart';
+import 'a.dart';
+A f() {}
+''');
+
+    // The library imports `a.dart`, so can resolve `A`.
+    // But the augmentation does not import, so there `A` is unresolved.
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      functions
+        f @44
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          returnType: A
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      functions
+        f @31
+          reference: <testLibrary>::@fragment::package:test/b.dart::@function::f
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          returnType: InvalidType
+''');
+  }
+
+  test_augmentation_libraryExports_library() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+export 'dart:async';
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+export 'dart:collection';
+export 'dart:math';
+''');
+    var library = await buildLibrary(r'''
+import 'dart:io';
+import augment 'a.dart';
+import augment 'b.dart';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    dart:io
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      libraryExports
+        dart:async
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      libraryExports
+        dart:collection
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+        dart:math
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        dart:io
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryExports
+        dart:async
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryExports
+        dart:collection
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+        dart:math
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+''');
+  }
+
+  test_augmentation_libraryImports_library() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+import 'dart:async';
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+import 'dart:collection';
+import 'dart:math';
+''');
+    var library = await buildLibrary(r'''
+import 'dart:io';
+import augment 'a.dart';
+import augment 'b.dart';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    dart:io
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      libraryImports
+        dart:async
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      libraryImports
+        dart:collection
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+        dart:math
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        dart:io
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryImports
+        dart:async
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryImports
+        dart:collection
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+        dart:math
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+''');
+  }
+
+  test_augmentation_topScope_augmentation() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+class A {}
+A f() {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+A f() {}
+''');
+
+    // The augmentation declares `A`, and can it be used in the library.
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        f @27
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          returnType: A
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class A @35
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::A::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::A
+      functions
+        f @42
+          reference: <testLibrary>::@fragment::package:test/a.dart::@function::f
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          returnType: A
+''');
+  }
+
+  test_augmentation_topScope_library() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+A f() {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {}
+A f() {}
+''');
+
+    // The library declares `A`, and can it be used in the augmentation.
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+      functions
+        f @38
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          returnType: A
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      functions
+        f @31
+          reference: <testLibrary>::@fragment::package:test/a.dart::@function::f
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          returnType: A
+''');
+  }
+}
+
+@reflectiveTest
+class LibraryAugmentationElementTest_fromBytes
+    extends LibraryAugmentationElementTest {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class LibraryAugmentationElementTest_keepLinking
+    extends LibraryAugmentationElementTest {
+  @override
+  bool get keepLinkingLibraries => true;
+}
diff --git a/pkg/analyzer/test/src/summary/elements/library_export_test.dart b/pkg/analyzer/test/src/summary/elements/library_export_test.dart
new file mode 100644
index 0000000..fe9ef46
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/elements/library_export_test.dart
@@ -0,0 +1,1622 @@
+// Copyright (c) 2024, 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:analyzer/dart/element/element.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../dart/resolution/node_text_expectations.dart';
+import '../elements_base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(LibraryExportElementTest_keepLinking);
+    defineReflectiveTests(LibraryExportElementTest_fromBytes);
+    defineReflectiveTests(UpdateNodeTextExpectations);
+  });
+}
+
+abstract class LibraryExportElementTest extends ElementsBaseTest {
+  test_export_class() async {
+    addSource('$testPackageLibPath/a.dart', 'class C {}');
+    var library = await buildLibrary('export "a.dart";');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+  exportedReferences
+    exported[(0, 0)] package:test/a.dart::<fragment>::@class::C
+  exportNamespace
+    C: package:test/a.dart::<fragment>::@class::C
+''');
+  }
+
+  test_export_class_type_alias() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class C = _D with _E;
+class _D {}
+class _E {}
+''');
+    var library = await buildLibrary('export "a.dart";');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+  exportedReferences
+    exported[(0, 0)] package:test/a.dart::<fragment>::@class::C
+  exportNamespace
+    C: package:test/a.dart::<fragment>::@class::C
+''');
+  }
+
+  test_export_configurations_useDefault() async {
+    declaredVariables = {
+      'dart.library.io': 'false',
+    };
+    addSource('$testPackageLibPath/foo.dart', 'class A {}');
+    addSource('$testPackageLibPath/foo_io.dart', 'class A {}');
+    addSource('$testPackageLibPath/foo_html.dart', 'class A {}');
+    var library = await buildLibrary(r'''
+export 'foo.dart'
+  if (dart.library.io) 'foo_io.dart'
+  if (dart.library.html) 'foo_html.dart';
+''');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    package:test/foo.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        package:test/foo.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+  exportedReferences
+    exported[(0, 0)] package:test/foo.dart::<fragment>::@class::A
+  exportNamespace
+    A: package:test/foo.dart::<fragment>::@class::A
+''');
+    expect(library.libraryExports[0].exportedLibrary!.source.shortName,
+        'foo.dart');
+  }
+
+  test_export_configurations_useFirst() async {
+    declaredVariables = {
+      'dart.library.io': 'true',
+      'dart.library.html': 'true',
+    };
+    addSource('$testPackageLibPath/foo.dart', 'class A {}');
+    addSource('$testPackageLibPath/foo_io.dart', 'class A {}');
+    addSource('$testPackageLibPath/foo_html.dart', 'class A {}');
+    var library = await buildLibrary(r'''
+export 'foo.dart'
+  if (dart.library.io) 'foo_io.dart'
+  if (dart.library.html) 'foo_html.dart';
+''');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    package:test/foo_io.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        package:test/foo_io.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+  exportedReferences
+    exported[(0, 0)] package:test/foo_io.dart::<fragment>::@class::A
+  exportNamespace
+    A: package:test/foo_io.dart::<fragment>::@class::A
+''');
+    expect(library.libraryExports[0].exportedLibrary!.source.shortName,
+        'foo_io.dart');
+  }
+
+  test_export_configurations_useSecond() async {
+    declaredVariables = {
+      'dart.library.io': 'false',
+      'dart.library.html': 'true',
+    };
+    addSource('$testPackageLibPath/foo.dart', 'class A {}');
+    addSource('$testPackageLibPath/foo_io.dart', 'class A {}');
+    addSource('$testPackageLibPath/foo_html.dart', 'class A {}');
+    var library = await buildLibrary(r'''
+export 'foo.dart'
+  if (dart.library.io) 'foo_io.dart'
+  if (dart.library.html) 'foo_html.dart';
+''');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    package:test/foo_html.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        package:test/foo_html.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+  exportedReferences
+    exported[(0, 0)] package:test/foo_html.dart::<fragment>::@class::A
+  exportNamespace
+    A: package:test/foo_html.dart::<fragment>::@class::A
+''');
+    var export = library.libraryExports[0];
+    expect(export.exportedLibrary!.source.shortName, 'foo_html.dart');
+  }
+
+  test_export_cycle() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+export 'test.dart';
+class A {}
+''');
+
+    var library = await buildLibrary(r'''
+export 'a.dart';
+class X {}
+''');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class X @23
+          reference: <testLibraryFragment>::@class::X
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::X::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::X
+  exportedReferences
+    exported[(0, 0)] package:test/a.dart::<fragment>::@class::A
+    declared <testLibraryFragment>::@class::X
+  exportNamespace
+    A: package:test/a.dart::<fragment>::@class::A
+    X: <testLibraryFragment>::@class::X
+''');
+  }
+
+  test_export_function() async {
+    addSource('$testPackageLibPath/a.dart', 'f() {}');
+    var library = await buildLibrary('export "a.dart";');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+  exportedReferences
+    exported[(0, 0)] package:test/a.dart::<fragment>::@function::f
+  exportNamespace
+    f: package:test/a.dart::<fragment>::@function::f
+''');
+  }
+
+  test_export_getter() async {
+    addSource('$testPackageLibPath/a.dart', 'get f() => null;');
+    var library = await buildLibrary('export "a.dart";');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_export_hide() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class A {}
+class B {}
+class C {}
+class D {}
+''');
+    var library = await buildLibrary(r'''
+export 'a.dart' hide A, C;
+''');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+      combinators
+        hide: A, C
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          combinators
+            hide: A, C
+  exportedReferences
+    exported[(0, 0)] package:test/a.dart::<fragment>::@class::B
+    exported[(0, 0)] package:test/a.dart::<fragment>::@class::D
+  exportNamespace
+    B: package:test/a.dart::<fragment>::@class::B
+    D: package:test/a.dart::<fragment>::@class::D
+''');
+  }
+
+  test_export_multiple_combinators() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class A {}
+class B {}
+class C {}
+class D {}
+''');
+    var library = await buildLibrary(r'''
+export 'a.dart' hide A show C;
+''');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+      combinators
+        hide: A
+        show: C
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          combinators
+            hide: A
+            show: C
+  exportedReferences
+    exported[(0, 0)] package:test/a.dart::<fragment>::@class::C
+  exportNamespace
+    C: package:test/a.dart::<fragment>::@class::C
+''');
+  }
+
+  test_export_reexport() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class A {}
+''');
+
+    addSource('$testPackageLibPath/b.dart', r'''
+export 'a.dart';
+class B {}
+''');
+
+    addSource('$testPackageLibPath/c.dart', r'''
+export 'a.dart';
+class C {}
+''');
+
+    var library = await buildLibrary(r'''
+export 'b.dart';
+export 'c.dart';
+class X {}
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+    package:test/c.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        package:test/b.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+        package:test/c.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class X @40
+          reference: <testLibraryFragment>::@class::X
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::X::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::X
+  exportedReferences
+    exported[(0, 0), (0, 1)] package:test/a.dart::<fragment>::@class::A
+    exported[(0, 0)] package:test/b.dart::<fragment>::@class::B
+    exported[(0, 1)] package:test/c.dart::<fragment>::@class::C
+    declared <testLibraryFragment>::@class::X
+  exportNamespace
+    A: package:test/a.dart::<fragment>::@class::A
+    B: package:test/b.dart::<fragment>::@class::B
+    C: package:test/c.dart::<fragment>::@class::C
+    X: <testLibraryFragment>::@class::X
+''');
+  }
+
+  test_export_setter() async {
+    addSource('$testPackageLibPath/a.dart', 'void set f(value) {}');
+    var library = await buildLibrary('export "a.dart";');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+  exportedReferences
+    exported[(0, 0)] package:test/a.dart::<fragment>::@setter::f
+  exportNamespace
+    f=: package:test/a.dart::<fragment>::@setter::f
+''');
+  }
+
+  test_export_show() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class A {}
+class B {}
+class C {}
+class D {}
+''');
+    var library = await buildLibrary(r'''
+export 'a.dart' show A, C;
+''');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+      combinators
+        show: A, C
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          combinators
+            show: A, C
+  exportedReferences
+    exported[(0, 0)] package:test/a.dart::<fragment>::@class::A
+    exported[(0, 0)] package:test/a.dart::<fragment>::@class::C
+  exportNamespace
+    A: package:test/a.dart::<fragment>::@class::A
+    C: package:test/a.dart::<fragment>::@class::C
+''');
+  }
+
+  test_export_show_getter_setter() async {
+    addSource('$testPackageLibPath/a.dart', '''
+get f => null;
+void set f(value) {}
+''');
+    var library = await buildLibrary('export "a.dart" show f;');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+      combinators
+        show: f
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          combinators
+            show: f
+  exportedReferences
+    exported[(0, 0)] package:test/a.dart::<fragment>::@getter::f
+    exported[(0, 0)] package:test/a.dart::<fragment>::@setter::f
+  exportNamespace
+    f: package:test/a.dart::<fragment>::@getter::f
+    f=: package:test/a.dart::<fragment>::@setter::f
+''');
+  }
+
+  test_export_typedef() async {
+    addSource('$testPackageLibPath/a.dart', 'typedef F();');
+    var library = await buildLibrary('export "a.dart";');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+  exportedReferences
+    exported[(0, 0)] package:test/a.dart::<fragment>::@typeAlias::F
+  exportNamespace
+    F: package:test/a.dart::<fragment>::@typeAlias::F
+''');
+  }
+
+  test_export_uri() async {
+    var library = await buildLibrary('''
+export 'foo.dart';
+''');
+
+    var uri = library.libraryExports[0].uri as DirectiveUriWithLibrary;
+    expect(uri.relativeUriString, 'foo.dart');
+  }
+
+  test_export_variable() async {
+    addSource('$testPackageLibPath/a.dart', 'var x;');
+    var library = await buildLibrary('export "a.dart";');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+  exportedReferences
+    exported[(0, 0)] package:test/a.dart::<fragment>::@getter::x
+    exported[(0, 0)] package:test/a.dart::<fragment>::@setter::x
+  exportNamespace
+    x: package:test/a.dart::<fragment>::@getter::x
+    x=: package:test/a.dart::<fragment>::@setter::x
+''');
+  }
+
+  test_export_variable_const() async {
+    addSource('$testPackageLibPath/a.dart', 'const x = 0;');
+    var library = await buildLibrary('export "a.dart";');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+  exportedReferences
+    exported[(0, 0)] package:test/a.dart::<fragment>::@getter::x
+  exportNamespace
+    x: package:test/a.dart::<fragment>::@getter::x
+''');
+  }
+
+  test_export_variable_final() async {
+    addSource('$testPackageLibPath/a.dart', 'final x = 0;');
+    var library = await buildLibrary('export "a.dart";');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+  exportedReferences
+    exported[(0, 0)] package:test/a.dart::<fragment>::@getter::x
+  exportNamespace
+    x: package:test/a.dart::<fragment>::@getter::x
+''');
+  }
+
+  test_exportImport_configurations_useDefault() async {
+    declaredVariables = {
+      'dart.library.io': 'false',
+    };
+    addSource('$testPackageLibPath/foo.dart', 'class A {}');
+    addSource('$testPackageLibPath/foo_io.dart', 'class A {}');
+    addSource('$testPackageLibPath/foo_html.dart', 'class A {}');
+    addSource('$testPackageLibPath/bar.dart', r'''
+export 'foo.dart'
+  if (dart.library.io) 'foo_io.dart'
+  if (dart.library.html) 'foo_html.dart';
+''');
+    var library = await buildLibrary(r'''
+import 'bar.dart';
+class B extends A {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/bar.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/bar.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class B @25
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: package:test/foo.dart::<fragment>::@class::A::@constructor::new
+''');
+    var typeA = library.definingCompilationUnit.getClass('B')!.supertype!;
+    expect(typeA.element.source.shortName, 'foo.dart');
+  }
+
+  test_exportImport_configurations_useFirst() async {
+    declaredVariables = {
+      'dart.library.io': 'true',
+      'dart.library.html': 'false',
+    };
+    addSource('$testPackageLibPath/foo.dart', 'class A {}');
+    addSource('$testPackageLibPath/foo_io.dart', 'class A {}');
+    addSource('$testPackageLibPath/foo_html.dart', 'class A {}');
+    addSource('$testPackageLibPath/bar.dart', r'''
+export 'foo.dart'
+  if (dart.library.io) 'foo_io.dart'
+  if (dart.library.html) 'foo_html.dart';
+''');
+    var library = await buildLibrary(r'''
+import 'bar.dart';
+class B extends A {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/bar.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/bar.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class B @25
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: package:test/foo_io.dart::<fragment>::@class::A::@constructor::new
+''');
+    var typeA = library.definingCompilationUnit.getClass('B')!.supertype!;
+    expect(typeA.element.source.shortName, 'foo_io.dart');
+  }
+
+  test_exportImport_configurations_useSecond() async {
+    declaredVariables = {
+      'dart.library.io': 'false',
+      'dart.library.html': 'true',
+    };
+    addSource('$testPackageLibPath/foo.dart', 'class A {}');
+    addSource('$testPackageLibPath/foo_io.dart', 'class A {}');
+    addSource('$testPackageLibPath/foo_html.dart', 'class A {}');
+    addSource('$testPackageLibPath/bar.dart', r'''
+export 'foo.dart'
+  if (dart.library.io) 'foo_io.dart'
+  if (dart.library.html) 'foo_html.dart';
+''');
+    var library = await buildLibrary(r'''
+import 'bar.dart';
+class B extends A {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/bar.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/bar.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class B @25
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: package:test/foo_html.dart::<fragment>::@class::A::@constructor::new
+''');
+    var typeA = library.definingCompilationUnit.getClass('B')!.supertype!;
+    expect(typeA.element.source.shortName, 'foo_html.dart');
+  }
+
+  test_exports() async {
+    addSource('$testPackageLibPath/a.dart', 'library a;');
+    addSource('$testPackageLibPath/b.dart', 'library b;');
+    var library = await buildLibrary('export "a.dart"; export "b.dart";');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+        package:test/b.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+  exportedReferences
+  exportNamespace
+''');
+  }
+
+  test_exportScope_augmentation_class() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {}
+class B {}
+''');
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {}
+''');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          augmented
+            constructors
+              <testLibraryFragment>::@class::A::@constructor::new
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@class::A
+        class B @54
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::B
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::B::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::B
+  exportedReferences
+    declared <testLibrary>::@fragment::package:test/a.dart::@class::B
+    declared <testLibraryFragment>::@class::A
+  exportNamespace
+    A: <testLibraryFragment>::@class::A
+    B: <testLibrary>::@fragment::package:test/a.dart::@class::B
+''');
+  }
+
+  test_exportScope_augmentation_export() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+class B1 {}
+class B2 {}
+''');
+    newFile('$testPackageLibPath/c.dart', r'''
+class C {}
+''');
+    newFile('$testPackageLibPath/d.dart', r'''
+augment library 'test.dart';
+export 'a.dart';
+''');
+    newFile('$testPackageLibPath/e.dart', r'''
+augment library 'test.dart';
+export 'b.dart';
+export 'c.dart';
+''');
+    var library = await buildLibrary(r'''
+import augment 'd.dart';
+import augment 'e.dart';
+class X {}
+''');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/d.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/d.dart
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/d.dart
+      definingUnit: <testLibrary>::@fragment::package:test/d.dart
+    package:test/e.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/e.dart
+      libraryExports
+        package:test/b.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/e.dart
+        package:test/c.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/e.dart
+      definingUnit: <testLibrary>::@fragment::package:test/e.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class X @56
+          reference: <testLibraryFragment>::@class::X
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::X::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::X
+    <testLibrary>::@fragment::package:test/d.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/d.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/d.dart
+    <testLibrary>::@fragment::package:test/e.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/e.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryExports
+        package:test/b.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/e.dart
+        package:test/c.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/e.dart
+  exportedReferences
+    exported[(1, 0)] package:test/a.dart::<fragment>::@class::A
+    exported[(2, 0)] package:test/b.dart::<fragment>::@class::B1
+    exported[(2, 0)] package:test/b.dart::<fragment>::@class::B2
+    exported[(2, 1)] package:test/c.dart::<fragment>::@class::C
+    declared <testLibraryFragment>::@class::X
+  exportNamespace
+    A: package:test/a.dart::<fragment>::@class::A
+    B1: package:test/b.dart::<fragment>::@class::B1
+    B2: package:test/b.dart::<fragment>::@class::B2
+    C: package:test/c.dart::<fragment>::@class::C
+    X: <testLibraryFragment>::@class::X
+''');
+  }
+
+  test_exportScope_augmentation_export_hide() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A1 {}
+class A2 {}
+class A3 {}
+class A4 {}
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+export 'a.dart' hide A2, A4;
+''');
+    var library = await buildLibrary(r'''
+import augment 'b.dart';
+class X {}
+''');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+          combinators
+            hide: A2, A4
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class X @31
+          reference: <testLibraryFragment>::@class::X
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::X::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::X
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+          combinators
+            hide: A2, A4
+  exportedReferences
+    exported[(1, 0)] package:test/a.dart::<fragment>::@class::A1
+    exported[(1, 0)] package:test/a.dart::<fragment>::@class::A3
+    declared <testLibraryFragment>::@class::X
+  exportNamespace
+    A1: package:test/a.dart::<fragment>::@class::A1
+    A3: package:test/a.dart::<fragment>::@class::A3
+    X: <testLibraryFragment>::@class::X
+''');
+  }
+
+  test_exportScope_augmentation_export_show() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A1 {}
+class A2 {}
+class A3 {}
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+export 'a.dart' show A1, A3;
+''');
+    var library = await buildLibrary(r'''
+import augment 'b.dart';
+class X {}
+''');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+          combinators
+            show: A1, A3
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class X @31
+          reference: <testLibraryFragment>::@class::X
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::X::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::X
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+          combinators
+            show: A1, A3
+  exportedReferences
+    exported[(1, 0)] package:test/a.dart::<fragment>::@class::A1
+    exported[(1, 0)] package:test/a.dart::<fragment>::@class::A3
+    declared <testLibraryFragment>::@class::X
+  exportNamespace
+    A1: package:test/a.dart::<fragment>::@class::A1
+    A3: package:test/a.dart::<fragment>::@class::A3
+    X: <testLibraryFragment>::@class::X
+''');
+  }
+
+  test_exportScope_augmentation_mixin() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A {}
+mixin B {}
+''');
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A {}
+''');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          augmented
+            superclassConstraints
+              Object
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+        mixin B @54
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixin::B
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          superclassConstraints
+            Object
+  exportedReferences
+    declared <testLibrary>::@fragment::package:test/a.dart::@mixin::B
+    declared <testLibraryFragment>::@mixin::A
+  exportNamespace
+    A: <testLibraryFragment>::@mixin::A
+    B: <testLibrary>::@fragment::package:test/a.dart::@mixin::B
+''');
+  }
+
+  test_exportScope_augmentation_nested_class() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+import augment 'b.dart';
+class A {}
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'a.dart';
+class B {}
+''');
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class C {}
+''');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+      augmentationImports
+        package:test/b.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+          reference: <testLibrary>::@augmentation::package:test/b.dart
+          definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @31
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class A @60
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::A::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::A
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+      classes
+        class B @32
+          reference: <testLibrary>::@fragment::package:test/b.dart::@class::B
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/b.dart::@class::B::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@class::B
+  exportedReferences
+    declared <testLibrary>::@fragment::package:test/a.dart::@class::A
+    declared <testLibrary>::@fragment::package:test/b.dart::@class::B
+    declared <testLibraryFragment>::@class::C
+  exportNamespace
+    A: <testLibrary>::@fragment::package:test/a.dart::@class::A
+    B: <testLibrary>::@fragment::package:test/b.dart::@class::B
+    C: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_exportScope_augmentation_nested_export() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+class B {}
+''');
+    newFile('$testPackageLibPath/c.dart', r'''
+augment library 'test.dart';
+import augment 'd.dart';
+export 'a.dart';
+''');
+    newFile('$testPackageLibPath/d.dart', r'''
+augment library 'c.dart';
+export 'b.dart';
+''');
+    var library = await buildLibrary(r'''
+import augment 'c.dart';
+class X {}
+''');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/c.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/c.dart
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/c.dart
+      definingUnit: <testLibrary>::@fragment::package:test/c.dart
+      augmentationImports
+        package:test/d.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/c.dart
+          reference: <testLibrary>::@augmentation::package:test/d.dart
+          libraryExports
+            package:test/b.dart
+              enclosingElement: <testLibrary>
+              enclosingElement3: <testLibrary>::@fragment::package:test/d.dart
+          definingUnit: <testLibrary>::@fragment::package:test/d.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class X @31
+          reference: <testLibraryFragment>::@class::X
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::X::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::X
+    <testLibrary>::@fragment::package:test/c.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/c.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/c.dart
+    <testLibrary>::@fragment::package:test/d.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/d.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/c.dart
+      libraryExports
+        package:test/b.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/d.dart
+  exportedReferences
+    exported[(1, 0)] package:test/a.dart::<fragment>::@class::A
+    exported[(2, 0)] package:test/b.dart::<fragment>::@class::B
+    declared <testLibraryFragment>::@class::X
+  exportNamespace
+    A: package:test/a.dart::<fragment>::@class::A
+    B: package:test/b.dart::<fragment>::@class::B
+    X: <testLibraryFragment>::@class::X
+''');
+  }
+
+  test_exportScope_augmentation_variable() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+int a = 0;
+''');
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+''');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static a @33
+          reference: <testLibrary>::@fragment::package:test/a.dart::@topLevelVariable::a
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          type: int
+          shouldUseTypeForInitializerInference: true
+      accessors
+        synthetic static get a @-1
+          reference: <testLibrary>::@fragment::package:test/a.dart::@getter::a
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          returnType: int
+        synthetic static set a= @-1
+          reference: <testLibrary>::@fragment::package:test/a.dart::@setter::a
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          parameters
+            requiredPositional _a @-1
+              type: int
+          returnType: void
+  exportedReferences
+    declared <testLibrary>::@fragment::package:test/a.dart::@getter::a
+    declared <testLibrary>::@fragment::package:test/a.dart::@setter::a
+  exportNamespace
+    a: <testLibrary>::@fragment::package:test/a.dart::@getter::a
+    a=: <testLibrary>::@fragment::package:test/a.dart::@setter::a
+''');
+  }
+
+  test_exportScope_augmentation_variable_const() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+const a = 0;
+''');
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+''');
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static const a @35
+          reference: <testLibrary>::@fragment::package:test/a.dart::@topLevelVariable::a
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @39
+              staticType: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibrary>::@fragment::package:test/a.dart::@getter::a
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          returnType: int
+  exportedReferences
+    declared <testLibrary>::@fragment::package:test/a.dart::@getter::a
+  exportNamespace
+    a: <testLibrary>::@fragment::package:test/a.dart::@getter::a
+''');
+  }
+
+  test_library_exports_noRelativeUriStr() async {
+    var library = await buildLibrary(r'''
+export '${'foo'}.dart';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    noRelativeUriString
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        noRelativeUriString
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_library_exports_withRelativeUri_emptyUriSelf() async {
+    var library = await buildLibrary(r'''
+export '';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    package:test/test.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        package:test/test.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_library_exports_withRelativeUri_noSource() async {
+    var library = await buildLibrary(r'''
+export 'foo:bar';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    relativeUri 'foo:bar'
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        relativeUri 'foo:bar'
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_library_exports_withRelativeUri_notExists() async {
+    var library = await buildLibrary(r'''
+export 'a.dart';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_library_exports_withRelativeUri_notLibrary_augmentation() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+''');
+    var library = await buildLibrary(r'''
+export 'a.dart';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    source 'package:test/a.dart'
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        source 'package:test/a.dart'
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_library_exports_withRelativeUri_notLibrary_part() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+part of other.lib;
+''');
+    var library = await buildLibrary(r'''
+export 'a.dart';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    source 'package:test/a.dart'
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        source 'package:test/a.dart'
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_library_exports_withRelativeUriString() async {
+    var library = await buildLibrary(r'''
+export ':';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    relativeUriString ':'
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        relativeUriString ':'
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_libraryExports_part() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+part of 'test.dart';
+export 'dart:math';
+''');
+
+    var library = await buildLibrary(r'''
+export 'dart:io';
+part 'a.dart';
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    dart:io
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  parts
+    part_0
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        dart:io
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      parts
+        part_0
+          uri: package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          unit: <testLibrary>::@fragment::package:test/a.dart
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+      libraryExports
+        dart:math
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+''');
+  }
+
+  test_unresolved_export() async {
+    var library = await buildLibrary("export 'foo.dart';");
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryExports
+    package:test/foo.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        package:test/foo.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+''');
+  }
+}
+
+@reflectiveTest
+class LibraryExportElementTest_fromBytes extends LibraryExportElementTest {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class LibraryExportElementTest_keepLinking extends LibraryExportElementTest {
+  @override
+  bool get keepLinkingLibraries => true;
+}
diff --git a/pkg/analyzer/test/src/summary/elements/library_import_test.dart b/pkg/analyzer/test/src/summary/elements/library_import_test.dart
new file mode 100644
index 0000000..c97fdb9
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/elements/library_import_test.dart
@@ -0,0 +1,1318 @@
+// Copyright (c) 2024, 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:analyzer/dart/element/element.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../dart/resolution/node_text_expectations.dart';
+import '../elements_base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(LibraryImportElementTest_keepLinking);
+    defineReflectiveTests(LibraryImportElementTest_fromBytes);
+    defineReflectiveTests(UpdateNodeTextExpectations);
+  });
+}
+
+abstract class LibraryImportElementTest extends ElementsBaseTest {
+  test_import_configurations_useDefault() async {
+    declaredVariables = {
+      'dart.library.io': 'false',
+    };
+    addSource('$testPackageLibPath/foo.dart', 'class A {}');
+    addSource('$testPackageLibPath/foo_io.dart', 'class A {}');
+    addSource('$testPackageLibPath/foo_html.dart', 'class A {}');
+    var library = await buildLibrary(r'''
+import 'foo.dart'
+  if (dart.library.io) 'foo_io.dart'
+  if (dart.library.html) 'foo_html.dart';
+
+class B extends A {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class B @104
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: package:test/foo.dart::<fragment>::@class::A::@constructor::new
+''');
+    var typeA = library.definingCompilationUnit.getClass('B')!.supertype!;
+    expect(typeA.element.source.shortName, 'foo.dart');
+  }
+
+  test_import_configurations_useFirst() async {
+    declaredVariables = {
+      'dart.library.io': 'true',
+      'dart.library.html': 'true',
+    };
+    addSource('$testPackageLibPath/foo.dart', 'class A {}');
+    addSource('$testPackageLibPath/foo_io.dart', 'class A {}');
+    addSource('$testPackageLibPath/foo_html.dart', 'class A {}');
+    var library = await buildLibrary(r'''
+import 'foo.dart'
+  if (dart.library.io) 'foo_io.dart'
+  if (dart.library.html) 'foo_html.dart';
+
+class B extends A {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo_io.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo_io.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class B @104
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: package:test/foo_io.dart::<fragment>::@class::A::@constructor::new
+''');
+    var typeA = library.definingCompilationUnit.getClass('B')!.supertype!;
+    expect(typeA.element.source.shortName, 'foo_io.dart');
+  }
+
+  test_import_configurations_useFirst_eqTrue() async {
+    declaredVariables = {
+      'dart.library.io': 'true',
+      'dart.library.html': 'true',
+    };
+    addSource('$testPackageLibPath/foo.dart', 'class A {}');
+    addSource('$testPackageLibPath/foo_io.dart', 'class A {}');
+    addSource('$testPackageLibPath/foo_html.dart', 'class A {}');
+    var library = await buildLibrary(r'''
+import 'foo.dart'
+  if (dart.library.io == 'true') 'foo_io.dart'
+  if (dart.library.html == 'true') 'foo_html.dart';
+
+class B extends A {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo_io.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo_io.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class B @124
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: package:test/foo_io.dart::<fragment>::@class::A::@constructor::new
+''');
+    var typeA = library.definingCompilationUnit.getClass('B')!.supertype!;
+    expect(typeA.element.source.shortName, 'foo_io.dart');
+  }
+
+  test_import_configurations_useSecond() async {
+    declaredVariables = {
+      'dart.library.io': 'false',
+      'dart.library.html': 'true',
+    };
+    addSource('$testPackageLibPath/foo.dart', 'class A {}');
+    addSource('$testPackageLibPath/foo_io.dart', 'class A {}');
+    addSource('$testPackageLibPath/foo_html.dart', 'class A {}');
+    var library = await buildLibrary(r'''
+import 'foo.dart'
+  if (dart.library.io) 'foo_io.dart'
+  if (dart.library.html) 'foo_html.dart';
+
+class B extends A {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo_html.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo_html.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class B @104
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: package:test/foo_html.dart::<fragment>::@class::A::@constructor::new
+''');
+    var typeA = library.definingCompilationUnit.getClass('B')!.supertype!;
+    expect(typeA.element.source.shortName, 'foo_html.dart');
+  }
+
+  test_import_configurations_useSecond_eqTrue() async {
+    declaredVariables = {
+      'dart.library.io': 'false',
+      'dart.library.html': 'true',
+    };
+    addSource('$testPackageLibPath/foo.dart', 'class A {}');
+    addSource('$testPackageLibPath/foo_io.dart', 'class A {}');
+    addSource('$testPackageLibPath/foo_html.dart', 'class A {}');
+    var library = await buildLibrary(r'''
+import 'foo.dart'
+  if (dart.library.io == 'true') 'foo_io.dart'
+  if (dart.library.html == 'true') 'foo_html.dart';
+
+class B extends A {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo_html.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo_html.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class B @124
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: package:test/foo_html.dart::<fragment>::@class::A::@constructor::new
+''');
+    var typeA = library.definingCompilationUnit.getClass('B')!.supertype!;
+    expect(typeA.element.source.shortName, 'foo_html.dart');
+  }
+
+  test_import_dartCore_explicit() async {
+    var library = await buildLibrary('''
+import 'dart:core';
+import 'dart:math';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    dart:core
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+    dart:math
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        dart:core
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+        dart:math
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_import_dartCore_implicit() async {
+    var library = await buildLibrary('''
+import 'dart:math';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    dart:math
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        dart:math
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_import_deferred() async {
+    addSource('$testPackageLibPath/a.dart', 'f() {}');
+    var library = await buildLibrary('''
+import 'a.dart' deferred as p;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart deferred as p @28
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    p @28
+      reference: <testLibraryFragment>::@prefix::p
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart deferred as p @28
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        p @28
+          reference: <testLibraryFragment>::@prefix::p
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_import_export() async {
+    var library = await buildLibrary('''
+import 'dart:async' as i1;
+export 'dart:math';
+import 'dart:async' as i2;
+export 'dart:math';
+import 'dart:async' as i3;
+export 'dart:math';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    dart:async as i1 @23
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+    dart:async as i2 @70
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+    dart:async as i3 @117
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    i1 @23
+      reference: <testLibraryFragment>::@prefix::i1
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+    i2 @70
+      reference: <testLibraryFragment>::@prefix::i2
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+    i3 @117
+      reference: <testLibraryFragment>::@prefix::i3
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  libraryExports
+    dart:math
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+    dart:math
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+    dart:math
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        dart:async as i1 @23
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+        dart:async as i2 @70
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+        dart:async as i3 @117
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        i1 @23
+          reference: <testLibraryFragment>::@prefix::i1
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+        i2 @70
+          reference: <testLibraryFragment>::@prefix::i2
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+        i3 @117
+          reference: <testLibraryFragment>::@prefix::i3
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryExports
+        dart:math
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+        dart:math
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+        dart:math
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_import_hide() async {
+    var library = await buildLibrary('''
+import 'dart:async' hide Stream, Completer; Future f;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    dart:async
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+      combinators
+        hide: Stream, Completer
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        dart:async
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          combinators
+            hide: Stream, Completer
+      topLevelVariables
+        static f @51
+          reference: <testLibraryFragment>::@topLevelVariable::f
+          enclosingElement: <testLibraryFragment>
+          type: Future<dynamic>
+      accessors
+        synthetic static get f @-1
+          reference: <testLibraryFragment>::@getter::f
+          enclosingElement: <testLibraryFragment>
+          returnType: Future<dynamic>
+        synthetic static set f= @-1
+          reference: <testLibraryFragment>::@setter::f
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _f @-1
+              type: Future<dynamic>
+          returnType: void
+''');
+  }
+
+  test_import_hide_offsetEnd() async {
+    var library = await buildLibrary('''
+import "dart:math" hide e, pi;
+''');
+    var import = library.libraryImports[0];
+    var combinator = import.combinators[0] as HideElementCombinator;
+    expect(combinator.offset, 19);
+    expect(combinator.end, 29);
+  }
+
+  test_import_invalidUri_metadata() async {
+    var library = await buildLibrary('''
+@foo
+import 'ht:';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  metadata
+    Annotation
+      atSign: @ @0
+      name: SimpleIdentifier
+        token: foo @1
+        staticElement: <null>
+        staticType: null
+      element: <null>
+  libraryImports
+    relativeUri 'ht:'
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+      metadata
+        Annotation
+          atSign: @ @0
+          name: SimpleIdentifier
+            token: foo @1
+            staticElement: <null>
+            staticType: null
+          element: <null>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        relativeUri 'ht:'
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @0
+              name: SimpleIdentifier
+                token: foo @1
+                staticElement: <null>
+                staticType: null
+              element: <null>
+''');
+  }
+
+  test_import_multiple_combinators() async {
+    var library = await buildLibrary('''
+import "dart:async" hide Stream show Future;
+Future f;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    dart:async
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+      combinators
+        hide: Stream
+        show: Future
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        dart:async
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          combinators
+            hide: Stream
+            show: Future
+      topLevelVariables
+        static f @52
+          reference: <testLibraryFragment>::@topLevelVariable::f
+          enclosingElement: <testLibraryFragment>
+          type: Future<dynamic>
+      accessors
+        synthetic static get f @-1
+          reference: <testLibraryFragment>::@getter::f
+          enclosingElement: <testLibraryFragment>
+          returnType: Future<dynamic>
+        synthetic static set f= @-1
+          reference: <testLibraryFragment>::@setter::f
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _f @-1
+              type: Future<dynamic>
+          returnType: void
+''');
+  }
+
+  test_import_prefixed() async {
+    addSource('$testPackageLibPath/a.dart', 'library a; class C {}');
+    var library = await buildLibrary('import "a.dart" as a; a.C c;');
+
+    var prefixElement = library.libraryImports[0].prefix!.element;
+    expect(prefixElement.nameOffset, 19);
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart as a @19
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    a @19
+      reference: <testLibraryFragment>::@prefix::a
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart as a @19
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        a @19
+          reference: <testLibraryFragment>::@prefix::a
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static c @26
+          reference: <testLibraryFragment>::@topLevelVariable::c
+          enclosingElement: <testLibraryFragment>
+          type: C
+      accessors
+        synthetic static get c @-1
+          reference: <testLibraryFragment>::@getter::c
+          enclosingElement: <testLibraryFragment>
+          returnType: C
+        synthetic static set c= @-1
+          reference: <testLibraryFragment>::@setter::c
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _c @-1
+              type: C
+          returnType: void
+''');
+  }
+
+  test_import_self() async {
+    var library = await buildLibrary('''
+import 'test.dart' as p;
+class C {}
+class D extends p.C {} // Prevent "unused import" warning
+''');
+    expect(library.libraryImports, hasLength(2));
+    expect(
+        library.libraryImports[0].importedLibrary!.location, library.location);
+    expect(library.libraryImports[1].importedLibrary!.isDartCore, true);
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/test.dart as p @22
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    p @22
+      reference: <testLibraryFragment>::@prefix::p
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/test.dart as p @22
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        p @22
+          reference: <testLibraryFragment>::@prefix::p
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @31
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+        class D @42
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          supertype: C
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+              superConstructor: <testLibraryFragment>::@class::C::@constructor::new
+''');
+  }
+
+  test_import_show() async {
+    var library = await buildLibrary('''
+import "dart:async" show Future, Stream;
+Future f;
+Stream s;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    dart:async
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+      combinators
+        show: Future, Stream
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        dart:async
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          combinators
+            show: Future, Stream
+      topLevelVariables
+        static f @48
+          reference: <testLibraryFragment>::@topLevelVariable::f
+          enclosingElement: <testLibraryFragment>
+          type: Future<dynamic>
+        static s @58
+          reference: <testLibraryFragment>::@topLevelVariable::s
+          enclosingElement: <testLibraryFragment>
+          type: Stream<dynamic>
+      accessors
+        synthetic static get f @-1
+          reference: <testLibraryFragment>::@getter::f
+          enclosingElement: <testLibraryFragment>
+          returnType: Future<dynamic>
+        synthetic static set f= @-1
+          reference: <testLibraryFragment>::@setter::f
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _f @-1
+              type: Future<dynamic>
+          returnType: void
+        synthetic static get s @-1
+          reference: <testLibraryFragment>::@getter::s
+          enclosingElement: <testLibraryFragment>
+          returnType: Stream<dynamic>
+        synthetic static set s= @-1
+          reference: <testLibraryFragment>::@setter::s
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _s @-1
+              type: Stream<dynamic>
+          returnType: void
+''');
+  }
+
+  test_import_show_offsetEnd() async {
+    var library = await buildLibrary('''
+import "dart:math" show e, pi;
+''');
+    var import = library.libraryImports[0];
+    var combinator = import.combinators[0] as ShowElementCombinator;
+    expect(combinator.offset, 19);
+    expect(combinator.end, 29);
+  }
+
+  test_import_uri() async {
+    var library = await buildLibrary('''
+import 'foo.dart';
+''');
+
+    var uri = library.libraryImports[0].uri as DirectiveUriWithLibrary;
+    expect(uri.relativeUriString, 'foo.dart');
+  }
+
+  test_imports() async {
+    addSource('$testPackageLibPath/a.dart', 'library a; class C {}');
+    addSource('$testPackageLibPath/b.dart', 'library b; class D {}');
+    var library =
+        await buildLibrary('import "a.dart"; import "b.dart"; C c; D d;');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+        package:test/b.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static c @36
+          reference: <testLibraryFragment>::@topLevelVariable::c
+          enclosingElement: <testLibraryFragment>
+          type: C
+        static d @41
+          reference: <testLibraryFragment>::@topLevelVariable::d
+          enclosingElement: <testLibraryFragment>
+          type: D
+      accessors
+        synthetic static get c @-1
+          reference: <testLibraryFragment>::@getter::c
+          enclosingElement: <testLibraryFragment>
+          returnType: C
+        synthetic static set c= @-1
+          reference: <testLibraryFragment>::@setter::c
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _c @-1
+              type: C
+          returnType: void
+        synthetic static get d @-1
+          reference: <testLibraryFragment>::@getter::d
+          enclosingElement: <testLibraryFragment>
+          returnType: D
+        synthetic static set d= @-1
+          reference: <testLibraryFragment>::@setter::d
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _d @-1
+              type: D
+          returnType: void
+''');
+  }
+
+  test_library_imports_noRelativeUriStr() async {
+    var library = await buildLibrary(r'''
+import '${'foo'}.dart';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    noRelativeUriString
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        noRelativeUriString
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_library_imports_prefix_importedLibraries() async {
+    var library = await buildLibrary(r'''
+import 'dart:async' as p1;
+import 'dart:collection' as p2;
+import 'dart:math' as p1;
+''');
+    var p1 = library.prefixes.singleWhere((prefix) => prefix.name == 'p1');
+    var import_async = library.libraryImports[0];
+    var import_math = library.libraryImports[2];
+    expect(p1.imports, unorderedEquals([import_async, import_math]));
+  }
+
+  test_library_imports_syntheticDartCore() async {
+    var library = await buildLibrary('');
+    configuration.withSyntheticDartCoreImport = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    dart:core synthetic
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        dart:core synthetic
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_library_imports_withRelativeUri_emptyUriSelf() async {
+    var library = await buildLibrary(r'''
+import '';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/test.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/test.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_library_imports_withRelativeUri_noSource() async {
+    var library = await buildLibrary(r'''
+import 'foo:bar';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    relativeUri 'foo:bar'
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        relativeUri 'foo:bar'
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_library_imports_withRelativeUri_notExists() async {
+    var library = await buildLibrary(r'''
+import 'a.dart';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_library_imports_withRelativeUri_notLibrary_augmentation() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    source 'package:test/a.dart'
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        source 'package:test/a.dart'
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_library_imports_withRelativeUri_notLibrary_part() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+part of other.lib;
+''');
+    var library = await buildLibrary(r'''
+import 'a.dart';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    source 'package:test/a.dart'
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        source 'package:test/a.dart'
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_library_imports_withRelativeUriString() async {
+    var library = await buildLibrary(r'''
+import ':';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    relativeUriString ':'
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        relativeUriString ':'
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_library_prefixes() async {
+    var library = await buildLibrary(r'''
+import 'dart:async' as p1;
+import 'dart:collection' as p2;
+import 'dart:math' as p1;
+''');
+    var prefixNames = library.prefixes.map((e) => e.name).toList();
+    expect(prefixNames, unorderedEquals(['p1', 'p2']));
+  }
+
+  test_libraryImports_part() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+part of 'test.dart';
+import 'dart:math';
+''');
+
+    var library = await buildLibrary(r'''
+import 'dart:io';
+part 'a.dart';
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    dart:io
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  parts
+    part_0
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        dart:io
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      parts
+        part_0
+          uri: package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          unit: <testLibrary>::@fragment::package:test/a.dart
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+      libraryImports
+        dart:math
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+''');
+  }
+
+  test_libraryImports_part_metadata() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+part of 'test.dart';
+@deprecated
+import 'dart:math';
+''');
+
+    var library = await buildLibrary(r'''
+part 'a.dart';
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  parts
+    part_0
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      parts
+        part_0
+          uri: package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          unit: <testLibrary>::@fragment::package:test/a.dart
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+      libraryImports
+        dart:math
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+          metadata
+            Annotation
+              atSign: @ @21
+              name: SimpleIdentifier
+                token: deprecated @22
+                staticElement: dart:core::<fragment>::@getter::deprecated
+                staticType: null
+              element: dart:core::<fragment>::@getter::deprecated
+''');
+  }
+
+  test_metadata_importDirective() async {
+    var library = await buildLibrary('''
+@a
+import "dart:math";
+const a = 0;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  metadata
+    Annotation
+      atSign: @ @0
+      name: SimpleIdentifier
+        token: a @1
+        staticElement: <testLibraryFragment>::@getter::a
+        staticType: null
+      element: <testLibraryFragment>::@getter::a
+  libraryImports
+    dart:math
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+      metadata
+        Annotation
+          atSign: @ @0
+          name: SimpleIdentifier
+            token: a @1
+            staticElement: <testLibraryFragment>::@getter::a
+            staticType: null
+          element: <testLibraryFragment>::@getter::a
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        dart:math
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @0
+              name: SimpleIdentifier
+                token: a @1
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: null
+              element: <testLibraryFragment>::@getter::a
+      topLevelVariables
+        static const a @29
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @33
+              staticType: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_importDirective_hasShow() async {
+    var library = await buildLibrary(r'''
+@a
+import "dart:math" show Random;
+
+const a = 0;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  metadata
+    Annotation
+      atSign: @ @0
+      name: SimpleIdentifier
+        token: a @1
+        staticElement: <testLibraryFragment>::@getter::a
+        staticType: null
+      element: <testLibraryFragment>::@getter::a
+  libraryImports
+    dart:math
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+      metadata
+        Annotation
+          atSign: @ @0
+          name: SimpleIdentifier
+            token: a @1
+            staticElement: <testLibraryFragment>::@getter::a
+            staticType: null
+          element: <testLibraryFragment>::@getter::a
+      combinators
+        show: Random
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        dart:math
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @0
+              name: SimpleIdentifier
+                token: a @1
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: null
+              element: <testLibraryFragment>::@getter::a
+          combinators
+            show: Random
+      topLevelVariables
+        static const a @42
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @46
+              staticType: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_nameConflict_importWithRelativeUri_exportWithAbsolute() async {
+    if (resourceProvider.pathContext.separator != '/') {
+      return;
+    }
+
+    addSource('$testPackageLibPath/a.dart', 'class A {}');
+    addSource('$testPackageLibPath/b.dart', 'export "/a.dart";');
+    var library = await buildLibrary('''
+import 'a.dart';
+import 'b.dart';
+A v = null;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+        package:test/b.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      topLevelVariables
+        static v @36
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          type: A
+          shouldUseTypeForInitializerInference: true
+      accessors
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: A
+        synthetic static set v= @-1
+          reference: <testLibraryFragment>::@setter::v
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _v @-1
+              type: A
+          returnType: void
+''');
+  }
+
+  test_unresolved_import() async {
+    var library = await buildLibrary("import 'foo.dart';");
+    var importedLibrary = library.libraryImports[0].importedLibrary!;
+    expect(importedLibrary.loadLibraryFunction, isNotNull);
+    expect(importedLibrary.publicNamespace, isNotNull);
+    expect(importedLibrary.exportNamespace, isNotNull);
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+''');
+  }
+}
+
+@reflectiveTest
+class LibraryImportElementTest_fromBytes extends LibraryImportElementTest {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class LibraryImportElementTest_keepLinking extends LibraryImportElementTest {
+  @override
+  bool get keepLinkingLibraries => true;
+}
diff --git a/pkg/analyzer/test/src/summary/elements/library_test.dart b/pkg/analyzer/test/src/summary/elements/library_test.dart
new file mode 100644
index 0000000..6381e4f
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/elements/library_test.dart
@@ -0,0 +1,109 @@
+// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../dart/resolution/node_text_expectations.dart';
+import '../elements_base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(LibraryElementTest_keepLinking);
+    defineReflectiveTests(LibraryElementTest_fromBytes);
+    defineReflectiveTests(UpdateNodeTextExpectations);
+  });
+}
+
+abstract class LibraryElementTest extends ElementsBaseTest {
+  test_library() async {
+    var library = await buildLibrary('');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+''');
+  }
+
+  test_library_documented_lines() async {
+    var library = await buildLibrary('''
+/// aaa
+/// bbb
+library test;
+''');
+    checkElementText(library, r'''
+library
+  name: test
+  nameOffset: 24
+  reference: <testLibrary>
+  documentationComment: /// aaa\n/// bbb
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+''');
+  }
+
+  test_library_documented_stars() async {
+    var library = await buildLibrary('''
+/**
+ * aaa
+ * bbb
+ */
+library test;''');
+    checkElementText(library, r'''
+library
+  name: test
+  nameOffset: 30
+  reference: <testLibrary>
+  documentationComment: /**\n * aaa\n * bbb\n */
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+''');
+  }
+
+  test_library_name_with_spaces() async {
+    var library = await buildLibrary('library foo . bar ;');
+    checkElementText(library, r'''
+library
+  name: foo.bar
+  nameOffset: 8
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+''');
+  }
+
+  test_library_named() async {
+    var library = await buildLibrary('library foo.bar;');
+    checkElementText(library, r'''
+library
+  name: foo.bar
+  nameOffset: 8
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+''');
+  }
+}
+
+@reflectiveTest
+class LibraryElementTest_fromBytes extends LibraryElementTest {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class LibraryElementTest_keepLinking extends LibraryElementTest {
+  @override
+  bool get keepLinkingLibraries => true;
+}
diff --git a/pkg/analyzer/test/src/summary/elements/local_declarations_test.dart b/pkg/analyzer/test/src/summary/elements/local_declarations_test.dart
new file mode 100644
index 0000000..1bdad95
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/elements/local_declarations_test.dart
@@ -0,0 +1,229 @@
+// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../dart/resolution/node_text_expectations.dart';
+import '../elements_base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(LocalDeclarationElementTest_keepLinking);
+    defineReflectiveTests(LocalDeclarationElementTest_fromBytes);
+    defineReflectiveTests(UpdateNodeTextExpectations);
+  });
+}
+
+abstract class LocalDeclarationElementTest extends ElementsBaseTest {
+  test_localFunctions() async {
+    var library = await buildLibrary(r'''
+f() {
+  f1() {}
+  {
+    f2() {}
+  }
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        f @0
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_localFunctions_inConstructor() async {
+    var library = await buildLibrary(r'''
+class C {
+  C() {
+    f() {}
+  }
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @12
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_localFunctions_inMethod() async {
+    var library = await buildLibrary(r'''
+class C {
+  m() {
+    f() {}
+  }
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            m @12
+              reference: <testLibraryFragment>::@class::C::@method::m
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+''');
+  }
+
+  test_localFunctions_inTopLevelGetter() async {
+    var library = await buildLibrary(r'''
+get g {
+  f() {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        synthetic static g @-1
+          reference: <testLibraryFragment>::@topLevelVariable::g
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+      accessors
+        static get g @4
+          reference: <testLibraryFragment>::@getter::g
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_localLabels_inConstructor() async {
+    var library = await buildLibrary(r'''
+class C {
+  C() {
+    aaa: while (true) {}
+    bbb: switch (42) {
+      ccc: case 0:
+        break;
+    }
+  }
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @12
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_localLabels_inMethod() async {
+    var library = await buildLibrary(r'''
+class C {
+  m() {
+    aaa: while (true) {}
+    bbb: switch (42) {
+      ccc: case 0:
+        break;
+    }
+  }
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            m @12
+              reference: <testLibraryFragment>::@class::C::@method::m
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+''');
+  }
+
+  test_localLabels_inTopLevelFunction() async {
+    var library = await buildLibrary(r'''
+main() {
+  aaa: while (true) {}
+  bbb: switch (42) {
+    ccc: case 0:
+      break;
+  }
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        main @0
+          reference: <testLibraryFragment>::@function::main
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+}
+
+@reflectiveTest
+class LocalDeclarationElementTest_fromBytes
+    extends LocalDeclarationElementTest {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class LocalDeclarationElementTest_keepLinking
+    extends LocalDeclarationElementTest {
+  @override
+  bool get keepLinkingLibraries => true;
+}
diff --git a/pkg/analyzer/test/src/summary/elements/metadata_test.dart b/pkg/analyzer/test/src/summary/elements/metadata_test.dart
new file mode 100644
index 0000000..2b798c2
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/elements/metadata_test.dart
@@ -0,0 +1,6301 @@
+// Copyright (c) 2024, 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:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../dart/resolution/node_text_expectations.dart';
+import '../elements_base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MetadataElementTest_keepLinking);
+    defineReflectiveTests(MetadataElementTest_fromBytes);
+    defineReflectiveTests(UpdateNodeTextExpectations);
+  });
+}
+
+abstract class MetadataElementTest extends ElementsBaseTest {
+  test_annotationArgument_recordLiteral() async {
+    var library = await buildLibrary('''
+@A((2, a: 3))
+class C {}
+class A {
+  const A(o);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @20
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @0
+              name: SimpleIdentifier
+                token: A @1
+                staticElement: <testLibraryFragment>::@class::A
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @2
+                arguments
+                  RecordLiteral
+                    leftParenthesis: ( @3
+                    fields
+                      IntegerLiteral
+                        literal: 2 @4
+                        staticType: int
+                      NamedExpression
+                        name: Label
+                          label: SimpleIdentifier
+                            token: a @7
+                            staticElement: <null>
+                            staticType: null
+                          colon: : @8
+                        expression: IntegerLiteral
+                          literal: 3 @10
+                          staticType: int
+                    rightParenthesis: ) @11
+                    staticType: (int, {int a})
+                rightParenthesis: ) @12
+              element: <testLibraryFragment>::@class::A::@constructor::new
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+        class A @31
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const @43
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional o @45
+                  type: dynamic
+''');
+  }
+
+  test_annotationArgument_recordLiteral_withConst() async {
+    var library = await buildLibrary('''
+@A(const ('',))
+class C {}
+class A {
+  const A(o);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @22
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @0
+              name: SimpleIdentifier
+                token: A @1
+                staticElement: <testLibraryFragment>::@class::A
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @2
+                arguments
+                  RecordLiteral
+                    constKeyword: const @3
+                    leftParenthesis: ( @9
+                    fields
+                      SimpleStringLiteral
+                        literal: '' @10
+                    rightParenthesis: ) @13
+                    staticType: (String,)
+                rightParenthesis: ) @14
+              element: <testLibraryFragment>::@class::A::@constructor::new
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+        class A @33
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const @45
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional o @47
+                  type: dynamic
+''');
+  }
+
+  test_invalid_annotation_prefixed_constructor() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class A {
+  const A.named();
+}
+''');
+    var library = await buildLibrary('''
+import "a.dart" as a;
+@a.A.named
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart as a @19
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    a @19
+      reference: <testLibraryFragment>::@prefix::a
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart as a @19
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        a @19
+          reference: <testLibraryFragment>::@prefix::a
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @39
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @22
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: a @23
+                  staticElement: <testLibraryFragment>::@prefix::a
+                  staticType: null
+                period: . @24
+                identifier: SimpleIdentifier
+                  token: A @25
+                  staticElement: package:test/a.dart::<fragment>::@class::A
+                  staticType: null
+                staticElement: package:test/a.dart::<fragment>::@class::A
+                staticType: null
+              period: . @26
+              constructorName: SimpleIdentifier
+                token: named @27
+                staticElement: package:test/a.dart::<fragment>::@class::A::@constructor::named
+                staticType: null
+              element: package:test/a.dart::<fragment>::@class::A::@constructor::named
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_invalid_annotation_unprefixed_constructor() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class A {
+  const A.named();
+}
+''');
+    var library = await buildLibrary('''
+import "a.dart";
+@A.named
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @32
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @17
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: A @18
+                  staticElement: package:test/a.dart::<fragment>::@class::A
+                  staticType: null
+                period: . @19
+                identifier: SimpleIdentifier
+                  token: named @20
+                  staticElement: package:test/a.dart::<fragment>::@class::A::@constructor::named
+                  staticType: null
+                staticElement: package:test/a.dart::<fragment>::@class::A::@constructor::named
+                staticType: null
+              element: package:test/a.dart::<fragment>::@class::A::@constructor::named
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_metadata_augmentation_class() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+@deprecated
+class A {}
+''');
+    var library = await buildLibrary('''
+import augment 'a.dart';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class A @47
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          metadata
+            Annotation
+              atSign: @ @29
+              name: SimpleIdentifier
+                token: deprecated @30
+                staticElement: dart:core::<fragment>::@getter::deprecated
+                staticType: null
+              element: dart:core::<fragment>::@getter::deprecated
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::A::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::A
+''');
+  }
+
+  test_metadata_augmentation_exportLibrary() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+@deprecated
+export 'dart:math';
+''');
+    var library = await buildLibrary('''
+import augment 'a.dart';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      libraryExports
+        dart:math
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+          metadata
+            Annotation
+              atSign: @ @29
+              name: SimpleIdentifier
+                token: deprecated @30
+                staticElement: dart:core::<fragment>::@getter::deprecated
+                staticType: null
+              element: dart:core::<fragment>::@getter::deprecated
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryExports
+        dart:math
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+          metadata
+            Annotation
+              atSign: @ @29
+              name: SimpleIdentifier
+                token: deprecated @30
+                staticElement: dart:core::<fragment>::@getter::deprecated
+                staticType: null
+              element: dart:core::<fragment>::@getter::deprecated
+''');
+  }
+
+  test_metadata_augmentation_importAugmentation() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'b.dart';
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+@deprecated
+import augment 'a.dart';
+''');
+    var library = await buildLibrary('''
+import augment 'b.dart';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+      augmentationImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+          metadata
+            Annotation
+              atSign: @ @29
+              name: SimpleIdentifier
+                token: deprecated @30
+                staticElement: dart:core::<fragment>::@getter::deprecated
+                staticType: null
+              element: dart:core::<fragment>::@getter::deprecated
+          reference: <testLibrary>::@augmentation::package:test/a.dart
+          definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+''');
+  }
+
+  test_metadata_augmentation_importLibrary() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+@deprecated
+import 'dart:math';
+''');
+    var library = await buildLibrary('''
+import augment 'a.dart';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      libraryImports
+        dart:math
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+          metadata
+            Annotation
+              atSign: @ @29
+              name: SimpleIdentifier
+                token: deprecated @30
+                staticElement: dart:core::<fragment>::@getter::deprecated
+                staticType: null
+              element: dart:core::<fragment>::@getter::deprecated
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryImports
+        dart:math
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+          metadata
+            Annotation
+              atSign: @ @29
+              name: SimpleIdentifier
+                token: deprecated @30
+                staticElement: dart:core::<fragment>::@getter::deprecated
+                staticType: null
+              element: dart:core::<fragment>::@getter::deprecated
+''');
+  }
+
+  test_metadata_class_field_first() async {
+    var library = await buildLibrary(r'''
+const a = 0;
+class C {
+  @a
+  int x = 0;
+}
+''');
+    // Check metadata without asking any other properties.
+    var x = _elementOfDefiningUnit(library, ['@class', 'C', '@field', 'x'])
+        as FieldElement;
+    expect(x.metadata, hasLength(1));
+    // Check details.
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @19
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @34
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              metadata
+                Annotation
+                  atSign: @ @25
+                  name: SimpleIdentifier
+                    token: a @26
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::a
+              type: int
+              shouldUseTypeForInitializerInference: true
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: int
+              returnType: void
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @10
+              staticType: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_class_scope() async {
+    var library = await buildLibrary(r'''
+const foo = 0;
+
+@foo
+class C<@foo T> {
+  static const foo = 1;
+  @foo
+  void bar() {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @27
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @16
+              name: SimpleIdentifier
+                token: foo @17
+                staticElement: <testLibraryFragment>::@getter::foo
+                staticType: null
+              element: <testLibraryFragment>::@getter::foo
+          typeParameters
+            covariant T @34
+              defaultType: dynamic
+              metadata
+                Annotation
+                  atSign: @ @29
+                  name: SimpleIdentifier
+                    token: foo @30
+                    staticElement: <testLibraryFragment>::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::foo
+          fields
+            static const foo @54
+              reference: <testLibraryFragment>::@class::C::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                IntegerLiteral
+                  literal: 1 @60
+                  staticType: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic static get foo @-1
+              reference: <testLibraryFragment>::@class::C::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+          methods
+            bar @77
+              reference: <testLibraryFragment>::@class::C::@method::bar
+              enclosingElement: <testLibraryFragment>::@class::C
+              metadata
+                Annotation
+                  atSign: @ @65
+                  name: SimpleIdentifier
+                    token: foo @66
+                    staticElement: <testLibraryFragment>::@class::C::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@class::C::@getter::foo
+              returnType: void
+      topLevelVariables
+        static const foo @6
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @12
+              staticType: int
+      accessors
+        synthetic static get foo @-1
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_classDeclaration() async {
+    var library = await buildLibrary(r'''
+const a = null;
+const b = null;
+@a
+@b
+class C {}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @44
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @32
+              name: SimpleIdentifier
+                token: a @33
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: null
+              element: <testLibraryFragment>::@getter::a
+            Annotation
+              atSign: @ @35
+              name: SimpleIdentifier
+                token: b @36
+                staticElement: <testLibraryFragment>::@getter::b
+                staticType: null
+              element: <testLibraryFragment>::@getter::b
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+        static const b @22
+          reference: <testLibraryFragment>::@topLevelVariable::b
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @26
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+        synthetic static get b @-1
+          reference: <testLibraryFragment>::@getter::b
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_classTypeAlias() async {
+    var library = await buildLibrary(
+        'const a = null; @a class C = D with E; class D {} class E {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class alias C @25
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @16
+              name: SimpleIdentifier
+                token: a @17
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: null
+              element: <testLibraryFragment>::@getter::a
+          supertype: D
+          mixins
+            E
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::D::@constructor::new
+              superConstructor: <testLibraryFragment>::@class::D::@constructor::new
+        class D @45
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+        class E @56
+          reference: <testLibraryFragment>::@class::E
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::E
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_constructor_call_named() async {
+    var library = await buildLibrary('''
+class A {
+  const A.named(int _);
+}
+@A.named(0)
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const named @20
+              reference: <testLibraryFragment>::@class::A::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 19
+              nameEnd: 25
+              parameters
+                requiredPositional _ @30
+                  type: int
+        class C @54
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @36
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: A @37
+                  staticElement: <testLibraryFragment>::@class::A
+                  staticType: null
+                period: . @38
+                identifier: SimpleIdentifier
+                  token: named @39
+                  staticElement: <testLibraryFragment>::@class::A::@constructor::named
+                  staticType: null
+                staticElement: <testLibraryFragment>::@class::A::@constructor::named
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @44
+                arguments
+                  IntegerLiteral
+                    literal: 0 @45
+                    staticType: int
+                rightParenthesis: ) @46
+              element: <testLibraryFragment>::@class::A::@constructor::named
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_metadata_constructor_call_named_generic_inference() async {
+    var library = await buildLibrary('''
+class A<T> {
+  const A.named(T _);
+}
+
+@A.named(0)
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            const named @23
+              reference: <testLibraryFragment>::@class::A::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 22
+              nameEnd: 28
+              parameters
+                requiredPositional _ @31
+                  type: T
+        class C @56
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @38
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: A @39
+                  staticElement: <testLibraryFragment>::@class::A
+                  staticType: null
+                period: . @40
+                identifier: SimpleIdentifier
+                  token: named @41
+                  staticElement: ConstructorMember
+                    base: <testLibraryFragment>::@class::A::@constructor::named
+                    substitution: {T: int}
+                  staticType: null
+                staticElement: ConstructorMember
+                  base: <testLibraryFragment>::@class::A::@constructor::named
+                  substitution: {T: int}
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @46
+                arguments
+                  IntegerLiteral
+                    literal: 0 @47
+                    staticType: int
+                rightParenthesis: ) @48
+              element: ConstructorMember
+                base: <testLibraryFragment>::@class::A::@constructor::named
+                substitution: {T: int}
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_metadata_constructor_call_named_generic_typeArguments() async {
+    var library = await buildLibrary('''
+class A<T> {
+  const A.named();
+}
+
+@A<int>.named()
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            const named @23
+              reference: <testLibraryFragment>::@class::A::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 22
+              nameEnd: 28
+        class C @57
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @35
+              name: SimpleIdentifier
+                token: A @36
+                staticElement: <testLibraryFragment>::@class::A
+                staticType: null
+              typeArguments: TypeArgumentList
+                leftBracket: < @37
+                arguments
+                  NamedType
+                    name: int @38
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                rightBracket: > @41
+              period: . @42
+              constructorName: SimpleIdentifier
+                token: named @43
+                staticElement: ConstructorMember
+                  base: <testLibraryFragment>::@class::A::@constructor::named
+                  substitution: {T: int}
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @48
+                rightParenthesis: ) @49
+              element: ConstructorMember
+                base: <testLibraryFragment>::@class::A::@constructor::named
+                substitution: {T: int}
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_metadata_constructor_call_named_generic_typeArguments_disabledGenericMetadata() async {
+    var library = await buildLibrary('''
+class A<T> {
+  const A.named();
+}
+
+@A<int>.named()
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            const named @23
+              reference: <testLibraryFragment>::@class::A::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 22
+              nameEnd: 28
+        class C @57
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @35
+              name: SimpleIdentifier
+                token: A @36
+                staticElement: <testLibraryFragment>::@class::A
+                staticType: null
+              typeArguments: TypeArgumentList
+                leftBracket: < @37
+                arguments
+                  NamedType
+                    name: int @38
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                rightBracket: > @41
+              period: . @42
+              constructorName: SimpleIdentifier
+                token: named @43
+                staticElement: ConstructorMember
+                  base: <testLibraryFragment>::@class::A::@constructor::named
+                  substitution: {T: int}
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @48
+                rightParenthesis: ) @49
+              element: ConstructorMember
+                base: <testLibraryFragment>::@class::A::@constructor::named
+                substitution: {T: int}
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_metadata_constructor_call_named_prefixed() async {
+    addSource('$testPackageLibPath/foo.dart', '''
+class A {
+  const A.named(int _);
+}
+''');
+    var library = await buildLibrary('''
+import 'foo.dart' as foo;
+@foo.A.named(0)
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo.dart as foo @21
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    foo @21
+      reference: <testLibraryFragment>::@prefix::foo
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo.dart as foo @21
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        foo @21
+          reference: <testLibraryFragment>::@prefix::foo
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @48
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @26
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: foo @27
+                  staticElement: <testLibraryFragment>::@prefix::foo
+                  staticType: null
+                period: . @30
+                identifier: SimpleIdentifier
+                  token: A @31
+                  staticElement: package:test/foo.dart::<fragment>::@class::A
+                  staticType: null
+                staticElement: package:test/foo.dart::<fragment>::@class::A
+                staticType: null
+              period: . @32
+              constructorName: SimpleIdentifier
+                token: named @33
+                staticElement: package:test/foo.dart::<fragment>::@class::A::@constructor::named
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @38
+                arguments
+                  IntegerLiteral
+                    literal: 0 @39
+                    staticType: int
+                rightParenthesis: ) @40
+              element: package:test/foo.dart::<fragment>::@class::A::@constructor::named
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_metadata_constructor_call_named_prefixed_generic_inference() async {
+    addSource('$testPackageLibPath/foo.dart', '''
+class A<T> {
+  const A.named(T _);
+}
+''');
+    var library = await buildLibrary('''
+import "foo.dart" as foo;
+@foo.A.named(0)
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo.dart as foo @21
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    foo @21
+      reference: <testLibraryFragment>::@prefix::foo
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo.dart as foo @21
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        foo @21
+          reference: <testLibraryFragment>::@prefix::foo
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @48
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @26
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: foo @27
+                  staticElement: <testLibraryFragment>::@prefix::foo
+                  staticType: null
+                period: . @30
+                identifier: SimpleIdentifier
+                  token: A @31
+                  staticElement: package:test/foo.dart::<fragment>::@class::A
+                  staticType: null
+                staticElement: package:test/foo.dart::<fragment>::@class::A
+                staticType: null
+              period: . @32
+              constructorName: SimpleIdentifier
+                token: named @33
+                staticElement: ConstructorMember
+                  base: package:test/foo.dart::<fragment>::@class::A::@constructor::named
+                  substitution: {T: int}
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @38
+                arguments
+                  IntegerLiteral
+                    literal: 0 @39
+                    staticType: int
+                rightParenthesis: ) @40
+              element: ConstructorMember
+                base: package:test/foo.dart::<fragment>::@class::A::@constructor::named
+                substitution: {T: int}
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_metadata_constructor_call_named_prefixed_generic_typeArguments() async {
+    addSource('$testPackageLibPath/foo.dart', '''
+class A<T> {
+  const A.named();
+}
+''');
+    var library = await buildLibrary('''
+import "foo.dart" as foo;
+@foo.A<int>.named()
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo.dart as foo @21
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    foo @21
+      reference: <testLibraryFragment>::@prefix::foo
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo.dart as foo @21
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        foo @21
+          reference: <testLibraryFragment>::@prefix::foo
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @52
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @26
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: foo @27
+                  staticElement: <testLibraryFragment>::@prefix::foo
+                  staticType: null
+                period: . @30
+                identifier: SimpleIdentifier
+                  token: A @31
+                  staticElement: package:test/foo.dart::<fragment>::@class::A
+                  staticType: null
+                staticElement: package:test/foo.dart::<fragment>::@class::A
+                staticType: null
+              typeArguments: TypeArgumentList
+                leftBracket: < @32
+                arguments
+                  NamedType
+                    name: int @33
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                rightBracket: > @36
+              period: . @37
+              constructorName: SimpleIdentifier
+                token: named @38
+                staticElement: ConstructorMember
+                  base: package:test/foo.dart::<fragment>::@class::A::@constructor::named
+                  substitution: {T: int}
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @43
+                rightParenthesis: ) @44
+              element: ConstructorMember
+                base: package:test/foo.dart::<fragment>::@class::A::@constructor::named
+                substitution: {T: int}
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_metadata_constructor_call_named_synthetic_ofClassAlias_generic() async {
+    var library = await buildLibrary('''
+class A {
+  const A.named();
+}
+
+mixin B {}
+
+class C<T> = A with B;
+
+@C.named()
+class D {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const named @20
+              reference: <testLibraryFragment>::@class::A::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 19
+              nameEnd: 25
+        class alias C @50
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @52
+              defaultType: dynamic
+          supertype: A
+          mixins
+            B
+          constructors
+            synthetic const named @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  period: . @0
+                  constructorName: SimpleIdentifier
+                    token: named @-1
+                    staticElement: <testLibraryFragment>::@class::A::@constructor::named
+                    staticType: null
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::A::@constructor::named
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::named
+        class D @85
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @68
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: C @69
+                  staticElement: <testLibraryFragment>::@class::C
+                  staticType: null
+                period: . @70
+                identifier: SimpleIdentifier
+                  token: named @71
+                  staticElement: ConstructorMember
+                    base: <testLibraryFragment>::@class::C::@constructor::named
+                    substitution: {T: dynamic}
+                  staticType: null
+                staticElement: ConstructorMember
+                  base: <testLibraryFragment>::@class::C::@constructor::named
+                  substitution: {T: dynamic}
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @76
+                rightParenthesis: ) @77
+              element: ConstructorMember
+                base: <testLibraryFragment>::@class::C::@constructor::named
+                substitution: {T: dynamic}
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+      mixins
+        mixin B @38
+          reference: <testLibraryFragment>::@mixin::B
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_metadata_constructor_call_unnamed() async {
+    var library = await buildLibrary('''
+class A {
+  const A(int _);
+}
+@A(0)
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const @18
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _ @24
+                  type: int
+        class C @42
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @30
+              name: SimpleIdentifier
+                token: A @31
+                staticElement: <testLibraryFragment>::@class::A
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @32
+                arguments
+                  IntegerLiteral
+                    literal: 0 @33
+                    staticType: int
+                rightParenthesis: ) @34
+              element: <testLibraryFragment>::@class::A::@constructor::new
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_metadata_constructor_call_unnamed_generic_inference() async {
+    var library = await buildLibrary('''
+class A<T> {
+  const A(T _);
+}
+
+@A(0)
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            const @21
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _ @25
+                  type: T
+        class C @44
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @32
+              name: SimpleIdentifier
+                token: A @33
+                staticElement: <testLibraryFragment>::@class::A
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @34
+                arguments
+                  IntegerLiteral
+                    literal: 0 @35
+                    staticType: int
+                rightParenthesis: ) @36
+              element: ConstructorMember
+                base: <testLibraryFragment>::@class::A::@constructor::new
+                substitution: {T: int}
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_metadata_constructor_call_unnamed_generic_typeArguments() async {
+    var library = await buildLibrary('''
+class A<T> {
+  const A();
+}
+
+@A<int>()
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            const @21
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class C @45
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @29
+              name: SimpleIdentifier
+                token: A @30
+                staticElement: <testLibraryFragment>::@class::A
+                staticType: null
+              typeArguments: TypeArgumentList
+                leftBracket: < @31
+                arguments
+                  NamedType
+                    name: int @32
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                rightBracket: > @35
+              arguments: ArgumentList
+                leftParenthesis: ( @36
+                rightParenthesis: ) @37
+              element: ConstructorMember
+                base: <testLibraryFragment>::@class::A::@constructor::new
+                substitution: {T: int}
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_metadata_constructor_call_unnamed_prefixed() async {
+    addSource('$testPackageLibPath/foo.dart', 'class A { const A(_); }');
+    var library =
+        await buildLibrary('import "foo.dart" as foo; @foo.A(0) class C {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo.dart as foo @21
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    foo @21
+      reference: <testLibraryFragment>::@prefix::foo
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo.dart as foo @21
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        foo @21
+          reference: <testLibraryFragment>::@prefix::foo
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @42
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @26
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: foo @27
+                  staticElement: <testLibraryFragment>::@prefix::foo
+                  staticType: null
+                period: . @30
+                identifier: SimpleIdentifier
+                  token: A @31
+                  staticElement: package:test/foo.dart::<fragment>::@class::A
+                  staticType: null
+                staticElement: package:test/foo.dart::<fragment>::@class::A
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @32
+                arguments
+                  IntegerLiteral
+                    literal: 0 @33
+                    staticType: int
+                rightParenthesis: ) @34
+              element: package:test/foo.dart::<fragment>::@class::A::@constructor::new
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_metadata_constructor_call_unnamed_prefixed_generic_inference() async {
+    addSource('$testPackageLibPath/foo.dart', '''
+class A<T> {
+  const A(T _);
+}
+''');
+    var library = await buildLibrary('''
+import "foo.dart" as foo;
+@foo.A(0)
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo.dart as foo @21
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    foo @21
+      reference: <testLibraryFragment>::@prefix::foo
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo.dart as foo @21
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        foo @21
+          reference: <testLibraryFragment>::@prefix::foo
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @42
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @26
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: foo @27
+                  staticElement: <testLibraryFragment>::@prefix::foo
+                  staticType: null
+                period: . @30
+                identifier: SimpleIdentifier
+                  token: A @31
+                  staticElement: package:test/foo.dart::<fragment>::@class::A
+                  staticType: null
+                staticElement: package:test/foo.dart::<fragment>::@class::A
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @32
+                arguments
+                  IntegerLiteral
+                    literal: 0 @33
+                    staticType: int
+                rightParenthesis: ) @34
+              element: ConstructorMember
+                base: package:test/foo.dart::<fragment>::@class::A::@constructor::new
+                substitution: {T: int}
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_metadata_constructor_call_unnamed_prefixed_generic_typeArguments() async {
+    addSource('$testPackageLibPath/foo.dart', '''
+class A<T> {
+  const A();
+}
+''');
+    var library = await buildLibrary('''
+import "foo.dart" as foo;
+@foo.A<int>()
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo.dart as foo @21
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    foo @21
+      reference: <testLibraryFragment>::@prefix::foo
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo.dart as foo @21
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        foo @21
+          reference: <testLibraryFragment>::@prefix::foo
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @46
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @26
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: foo @27
+                  staticElement: <testLibraryFragment>::@prefix::foo
+                  staticType: null
+                period: . @30
+                identifier: SimpleIdentifier
+                  token: A @31
+                  staticElement: package:test/foo.dart::<fragment>::@class::A
+                  staticType: null
+                staticElement: package:test/foo.dart::<fragment>::@class::A
+                staticType: null
+              typeArguments: TypeArgumentList
+                leftBracket: < @32
+                arguments
+                  NamedType
+                    name: int @33
+                    element: dart:core::<fragment>::@class::int
+                    type: int
+                rightBracket: > @36
+              arguments: ArgumentList
+                leftParenthesis: ( @37
+                rightParenthesis: ) @38
+              element: ConstructorMember
+                base: package:test/foo.dart::<fragment>::@class::A::@constructor::new
+                substitution: {T: int}
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_metadata_constructor_call_unnamed_synthetic_ofClassAlias_generic() async {
+    var library = await buildLibrary('''
+class A {
+  const A();
+}
+
+mixin B {}
+
+class C<T> = A with B;
+
+@C()
+class D {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const @18
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class alias C @44
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @46
+              defaultType: dynamic
+          supertype: A
+          mixins
+            B
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::A::@constructor::new
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+        class D @73
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @62
+              name: SimpleIdentifier
+                token: C @63
+                staticElement: <testLibraryFragment>::@class::C
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @64
+                rightParenthesis: ) @65
+              element: ConstructorMember
+                base: <testLibraryFragment>::@class::C::@constructor::new
+                substitution: {T: dynamic}
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+      mixins
+        mixin B @32
+          reference: <testLibraryFragment>::@mixin::B
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_metadata_constructor_call_with_args() async {
+    var library =
+        await buildLibrary('class A { const A(x); } @A(null) class C {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const @16
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional x @18
+                  type: dynamic
+        class C @39
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @24
+              name: SimpleIdentifier
+                token: A @25
+                staticElement: <testLibraryFragment>::@class::A
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @26
+                arguments
+                  NullLiteral
+                    literal: null @27
+                    staticType: Null
+                rightParenthesis: ) @31
+              element: <testLibraryFragment>::@class::A::@constructor::new
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_metadata_constructorDeclaration_named() async {
+    var library =
+        await buildLibrary('const a = null; class C { @a C.named(); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @22
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            named @31
+              reference: <testLibraryFragment>::@class::C::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::C
+              metadata
+                Annotation
+                  atSign: @ @26
+                  name: SimpleIdentifier
+                    token: a @27
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::a
+              periodOffset: 30
+              nameEnd: 36
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_constructorDeclaration_unnamed() async {
+    var library = await buildLibrary('const a = null; class C { @a C(); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @22
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @29
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              metadata
+                Annotation
+                  atSign: @ @26
+                  name: SimpleIdentifier
+                    token: a @27
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::a
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_exportDirective() async {
+    addSource('$testPackageLibPath/foo.dart', '');
+    var library = await buildLibrary('@a export "foo.dart"; const a = null;');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  metadata
+    Annotation
+      atSign: @ @0
+      name: SimpleIdentifier
+        token: a @1
+        staticElement: <testLibraryFragment>::@getter::a
+        staticType: null
+      element: <testLibraryFragment>::@getter::a
+  libraryExports
+    package:test/foo.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+      metadata
+        Annotation
+          atSign: @ @0
+          name: SimpleIdentifier
+            token: a @1
+            staticElement: <testLibraryFragment>::@getter::a
+            staticType: null
+          element: <testLibraryFragment>::@getter::a
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryExports
+        package:test/foo.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @0
+              name: SimpleIdentifier
+                token: a @1
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: null
+              element: <testLibraryFragment>::@getter::a
+      topLevelVariables
+        static const a @28
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @32
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_fieldDeclaration() async {
+    var library = await buildLibrary('const a = null; class C { @a int x; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @22
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @33
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              metadata
+                Annotation
+                  atSign: @ @26
+                  name: SimpleIdentifier
+                    token: a @27
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::a
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: int
+              returnType: void
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_fieldFormalParameter() async {
+    var library = await buildLibrary('''
+const a = null;
+class C {
+  var x;
+  C(@a this.x);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @22
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @32
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            @37
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional final this.x @47
+                  type: dynamic
+                  metadata
+                    Annotation
+                      atSign: @ @39
+                      name: SimpleIdentifier
+                        token: a @40
+                        staticElement: <testLibraryFragment>::@getter::a
+                        staticType: null
+                      element: <testLibraryFragment>::@getter::a
+                  field: <testLibraryFragment>::@class::C::@field::x
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: dynamic
+              returnType: void
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_fieldFormalParameter_withDefault() async {
+    var library = await buildLibrary(
+        'const a = null; class C { var x; C([@a this.x = null]); }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @22
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            x @30
+              reference: <testLibraryFragment>::@class::C::@field::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            @33
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                optionalPositional default final this.x @44
+                  type: dynamic
+                  metadata
+                    Annotation
+                      atSign: @ @36
+                      name: SimpleIdentifier
+                        token: a @37
+                        staticElement: <testLibraryFragment>::@getter::a
+                        staticType: null
+                      element: <testLibraryFragment>::@getter::a
+                  constantInitializer
+                    NullLiteral
+                      literal: null @48
+                      staticType: Null
+                  field: <testLibraryFragment>::@class::C::@field::x
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@class::C::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: dynamic
+            synthetic set x= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::x
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _x @-1
+                  type: dynamic
+              returnType: void
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_functionDeclaration_function() async {
+    var library = await buildLibrary('''
+const a = null;
+@a
+f() {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+      functions
+        f @19
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @16
+              name: SimpleIdentifier
+                token: a @17
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: null
+              element: <testLibraryFragment>::@getter::a
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_functionDeclaration_getter() async {
+    var library = await buildLibrary('const a = null; @a get f => null;');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+        synthetic static f @-1
+          reference: <testLibraryFragment>::@topLevelVariable::f
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+        static get f @23
+          reference: <testLibraryFragment>::@getter::f
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @16
+              name: SimpleIdentifier
+                token: a @17
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: null
+              element: <testLibraryFragment>::@getter::a
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_functionDeclaration_setter() async {
+    var library = await buildLibrary('const a = null; @a set f(value) {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+        synthetic static f @-1
+          reference: <testLibraryFragment>::@topLevelVariable::f
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+        static set f= @23
+          reference: <testLibraryFragment>::@setter::f
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @16
+              name: SimpleIdentifier
+                token: a @17
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: null
+              element: <testLibraryFragment>::@getter::a
+          parameters
+            requiredPositional value @25
+              type: dynamic
+          returnType: void
+''');
+  }
+
+  test_metadata_functionTypeAlias() async {
+    var library = await buildLibrary('const a = null; @a typedef F();');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      typeAliases
+        functionTypeAliasBased F @27
+          reference: <testLibraryFragment>::@typeAlias::F
+          metadata
+            Annotation
+              atSign: @ @16
+              name: SimpleIdentifier
+                token: a @17
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: null
+              element: <testLibraryFragment>::@getter::a
+          aliasedType: dynamic Function()
+          aliasedElement: GenericFunctionTypeElement
+            returnType: dynamic
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_functionTypedFormalParameter() async {
+    var library = await buildLibrary('const a = null; f(@a g()) {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+      functions
+        f @16
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional g @21
+              type: dynamic Function()
+              metadata
+                Annotation
+                  atSign: @ @18
+                  name: SimpleIdentifier
+                    token: a @19
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::a
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_functionTypedFormalParameter_withDefault() async {
+    var library = await buildLibrary('const a = null; f([@a g() = null]) {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+      functions
+        f @16
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          parameters
+            optionalPositional default g @22
+              type: dynamic Function()
+              metadata
+                Annotation
+                  atSign: @ @19
+                  name: SimpleIdentifier
+                    token: a @20
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::a
+              constantInitializer
+                NullLiteral
+                  literal: null @28
+                  staticType: null
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_genericTypeAlias() async {
+    var library = await buildLibrary(r'''
+const a = null;
+const b = null;
+@a
+@b
+typedef F = void Function();''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      typeAliases
+        F @46
+          reference: <testLibraryFragment>::@typeAlias::F
+          metadata
+            Annotation
+              atSign: @ @32
+              name: SimpleIdentifier
+                token: a @33
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: null
+              element: <testLibraryFragment>::@getter::a
+            Annotation
+              atSign: @ @35
+              name: SimpleIdentifier
+                token: b @36
+                staticElement: <testLibraryFragment>::@getter::b
+                staticType: null
+              element: <testLibraryFragment>::@getter::b
+          aliasedType: void Function()
+          aliasedElement: GenericFunctionTypeElement
+            returnType: void
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+        static const b @22
+          reference: <testLibraryFragment>::@topLevelVariable::b
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @26
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+        synthetic static get b @-1
+          reference: <testLibraryFragment>::@getter::b
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_inAliasedElement_formalParameter() async {
+    var library = await buildLibrary('''
+const a = 42;
+typedef F = void Function(@a int first)
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      typeAliases
+        F @22
+          reference: <testLibraryFragment>::@typeAlias::F
+          aliasedType: void Function(int)
+          aliasedElement: GenericFunctionTypeElement
+            parameters
+              requiredPositional first @47
+                type: int
+                metadata
+                  Annotation
+                    atSign: @ @40
+                    name: SimpleIdentifier
+                      token: a @41
+                      staticElement: <testLibraryFragment>::@getter::a
+                      staticType: null
+                    element: <testLibraryFragment>::@getter::a
+            returnType: void
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 42 @10
+              staticType: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_inAliasedElement_formalParameter2() async {
+    var library = await buildLibrary('''
+const a = 42;
+typedef F = void Function(int foo(@a int bar))
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      typeAliases
+        F @22
+          reference: <testLibraryFragment>::@typeAlias::F
+          aliasedType: void Function(int Function(int))
+          aliasedElement: GenericFunctionTypeElement
+            parameters
+              requiredPositional foo @44
+                type: int Function(int)
+                parameters
+                  requiredPositional bar @55
+                    type: int
+                    metadata
+                      Annotation
+                        atSign: @ @48
+                        name: SimpleIdentifier
+                          token: a @49
+                          staticElement: <testLibraryFragment>::@getter::a
+                          staticType: null
+                        element: <testLibraryFragment>::@getter::a
+            returnType: void
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 42 @10
+              staticType: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_inAliasedElement_typeParameter() async {
+    var library = await buildLibrary('''
+const a = 42;
+typedef F = void Function<@a T>(int first)
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      typeAliases
+        F @22
+          reference: <testLibraryFragment>::@typeAlias::F
+          aliasedType: void Function<T>(int)
+          aliasedElement: GenericFunctionTypeElement
+            typeParameters
+              covariant T @43
+                metadata
+                  Annotation
+                    atSign: @ @40
+                    name: SimpleIdentifier
+                      token: a @41
+                      staticElement: <testLibraryFragment>::@getter::a
+                      staticType: null
+                    element: <testLibraryFragment>::@getter::a
+            parameters
+              requiredPositional first @50
+                type: int
+            returnType: void
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 42 @10
+              staticType: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_invalid_classDeclaration() async {
+    var library = await buildLibrary('f(_) {} @f(42) class C {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @21
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @8
+              name: SimpleIdentifier
+                token: f @9
+                staticElement: <testLibraryFragment>::@function::f
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @10
+                arguments
+                  IntegerLiteral
+                    literal: 42 @11
+                    staticType: int
+                rightParenthesis: ) @13
+              element: <testLibraryFragment>::@function::f
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+      functions
+        f @0
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _ @2
+              type: dynamic
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_library_importAugmentation_augmentation() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+''');
+    var library = await buildLibrary('''
+@deprecated
+import augment 'a.dart';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      metadata
+        Annotation
+          atSign: @ @0
+          name: SimpleIdentifier
+            token: deprecated @1
+            staticElement: dart:core::<fragment>::@getter::deprecated
+            staticType: null
+          element: dart:core::<fragment>::@getter::deprecated
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  /// Even though the target is not an augmentation, metadata is available.
+  test_metadata_library_importAugmentation_notAugmentation_library() async {
+    var library = await buildLibrary('''
+@deprecated
+import augment 'dart:math';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    source 'dart:math'
+      enclosingElement: <testLibrary>
+      metadata
+        Annotation
+          atSign: @ @0
+          name: SimpleIdentifier
+            token: deprecated @1
+            staticElement: dart:core::<fragment>::@getter::deprecated
+            staticType: null
+          element: dart:core::<fragment>::@getter::deprecated
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+''');
+  }
+
+  test_metadata_libraryDirective() async {
+    var library = await buildLibrary('@a library L; const a = null;');
+    checkElementText(library, r'''
+library
+  name: L
+  nameOffset: 11
+  reference: <testLibrary>
+  metadata
+    Annotation
+      atSign: @ @0
+      name: SimpleIdentifier
+        token: a @1
+        staticElement: <testLibraryFragment>::@getter::a
+        staticType: null
+      element: <testLibraryFragment>::@getter::a
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @20
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @24
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_methodDeclaration_getter() async {
+    var library =
+        await buildLibrary('const a = null; class C { @a get m => null; }');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @22
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic m @-1
+              reference: <testLibraryFragment>::@class::C::@field::m
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            get m @33
+              reference: <testLibraryFragment>::@class::C::@getter::m
+              enclosingElement: <testLibraryFragment>::@class::C
+              metadata
+                Annotation
+                  atSign: @ @26
+                  name: SimpleIdentifier
+                    token: a @27
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::a
+              returnType: dynamic
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_methodDeclaration_method() async {
+    var library = await buildLibrary(r'''
+const a = null;
+const b = null;
+class C {
+  @a
+  @b
+  m() {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @38
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            m @54
+              reference: <testLibraryFragment>::@class::C::@method::m
+              enclosingElement: <testLibraryFragment>::@class::C
+              metadata
+                Annotation
+                  atSign: @ @44
+                  name: SimpleIdentifier
+                    token: a @45
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::a
+                Annotation
+                  atSign: @ @49
+                  name: SimpleIdentifier
+                    token: b @50
+                    staticElement: <testLibraryFragment>::@getter::b
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::b
+              returnType: dynamic
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+        static const b @22
+          reference: <testLibraryFragment>::@topLevelVariable::b
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @26
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+        synthetic static get b @-1
+          reference: <testLibraryFragment>::@getter::b
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_methodDeclaration_method_mixin() async {
+    var library = await buildLibrary(r'''
+const a = null;
+const b = null;
+mixin M {
+  @a
+  @b
+  m() {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin M @38
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+          methods
+            m @54
+              reference: <testLibraryFragment>::@mixin::M::@method::m
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              metadata
+                Annotation
+                  atSign: @ @44
+                  name: SimpleIdentifier
+                    token: a @45
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::a
+                Annotation
+                  atSign: @ @49
+                  name: SimpleIdentifier
+                    token: b @50
+                    staticElement: <testLibraryFragment>::@getter::b
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::b
+              returnType: dynamic
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+        static const b @22
+          reference: <testLibraryFragment>::@topLevelVariable::b
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @26
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+        synthetic static get b @-1
+          reference: <testLibraryFragment>::@getter::b
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_methodDeclaration_setter() async {
+    var library = await buildLibrary('''
+const a = null;
+class C {
+  @a
+  set m(value) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @22
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic m @-1
+              reference: <testLibraryFragment>::@class::C::@field::m
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            set m= @37
+              reference: <testLibraryFragment>::@class::C::@setter::m
+              enclosingElement: <testLibraryFragment>::@class::C
+              metadata
+                Annotation
+                  atSign: @ @28
+                  name: SimpleIdentifier
+                    token: a @29
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::a
+              parameters
+                requiredPositional value @39
+                  type: dynamic
+              returnType: void
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_mixin_scope() async {
+    var library = await buildLibrary(r'''
+const foo = 0;
+
+@foo
+mixin M<@foo T> {
+  static const foo = 1;
+  @foo
+  void bar() {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin M @27
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @16
+              name: SimpleIdentifier
+                token: foo @17
+                staticElement: <testLibraryFragment>::@getter::foo
+                staticType: null
+              element: <testLibraryFragment>::@getter::foo
+          typeParameters
+            covariant T @34
+              defaultType: dynamic
+              metadata
+                Annotation
+                  atSign: @ @29
+                  name: SimpleIdentifier
+                    token: foo @30
+                    staticElement: <testLibraryFragment>::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::foo
+          superclassConstraints
+            Object
+          fields
+            static const foo @54
+              reference: <testLibraryFragment>::@mixin::M::@field::foo
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              type: int
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                IntegerLiteral
+                  literal: 1 @60
+                  staticType: int
+          accessors
+            synthetic static get foo @-1
+              reference: <testLibraryFragment>::@mixin::M::@getter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              returnType: int
+          methods
+            bar @77
+              reference: <testLibraryFragment>::@mixin::M::@method::bar
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              metadata
+                Annotation
+                  atSign: @ @65
+                  name: SimpleIdentifier
+                    token: foo @66
+                    staticElement: <testLibraryFragment>::@mixin::M::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@mixin::M::@getter::foo
+              returnType: void
+      topLevelVariables
+        static const foo @6
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @12
+              staticType: int
+      accessors
+        synthetic static get foo @-1
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_mixinDeclaration() async {
+    var library = await buildLibrary(r'''
+const a = null;
+const b = null;
+@a
+@b
+mixin M {}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin M @44
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @32
+              name: SimpleIdentifier
+                token: a @33
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: null
+              element: <testLibraryFragment>::@getter::a
+            Annotation
+              atSign: @ @35
+              name: SimpleIdentifier
+                token: b @36
+                staticElement: <testLibraryFragment>::@getter::b
+                staticType: null
+              element: <testLibraryFragment>::@getter::b
+          superclassConstraints
+            Object
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+        static const b @22
+          reference: <testLibraryFragment>::@topLevelVariable::b
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @26
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+        synthetic static get b @-1
+          reference: <testLibraryFragment>::@getter::b
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_offsets_onClass() async {
+    var library = await buildLibrary(r'''
+const foo = 0;
+
+@foo
+class A<@foo T> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @27
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @16
+              name: SimpleIdentifier
+                token: foo @17
+                staticElement: <testLibraryFragment>::@getter::foo
+                staticType: null
+              element: <testLibraryFragment>::@getter::foo
+          typeParameters
+            covariant T @34
+              defaultType: dynamic
+              metadata
+                Annotation
+                  atSign: @ @29
+                  name: SimpleIdentifier
+                    token: foo @30
+                    staticElement: <testLibraryFragment>::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::foo
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+      topLevelVariables
+        static const foo @6
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @12
+              staticType: int
+      accessors
+        synthetic static get foo @-1
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_offsets_onClassConstructor() async {
+    var library = await buildLibrary(r'''
+const foo = 0;
+
+class A {
+  @foo
+  A(@foo int a);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @22
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @35
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              metadata
+                Annotation
+                  atSign: @ @28
+                  name: SimpleIdentifier
+                    token: foo @29
+                    staticElement: <testLibraryFragment>::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::foo
+              parameters
+                requiredPositional a @46
+                  type: int
+                  metadata
+                    Annotation
+                      atSign: @ @37
+                      name: SimpleIdentifier
+                        token: foo @38
+                        staticElement: <testLibraryFragment>::@getter::foo
+                        staticType: null
+                      element: <testLibraryFragment>::@getter::foo
+      topLevelVariables
+        static const foo @6
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @12
+              staticType: int
+      accessors
+        synthetic static get foo @-1
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_offsets_onClassGetter() async {
+    var library = await buildLibrary(r'''
+const foo = 0;
+
+class A {
+  @foo
+  int get getter => 0;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @22
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic getter @-1
+              reference: <testLibraryFragment>::@class::A::@field::getter
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            get getter @43
+              reference: <testLibraryFragment>::@class::A::@getter::getter
+              enclosingElement: <testLibraryFragment>::@class::A
+              metadata
+                Annotation
+                  atSign: @ @28
+                  name: SimpleIdentifier
+                    token: foo @29
+                    staticElement: <testLibraryFragment>::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::foo
+              returnType: int
+      topLevelVariables
+        static const foo @6
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @12
+              staticType: int
+      accessors
+        synthetic static get foo @-1
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_offsets_onClassMethod() async {
+    var library = await buildLibrary(r'''
+const foo = 0;
+
+class A {
+  @foo
+  void method<@foo T>(@foo int a) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @22
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          methods
+            method @40
+              reference: <testLibraryFragment>::@class::A::@method::method
+              enclosingElement: <testLibraryFragment>::@class::A
+              metadata
+                Annotation
+                  atSign: @ @28
+                  name: SimpleIdentifier
+                    token: foo @29
+                    staticElement: <testLibraryFragment>::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::foo
+              typeParameters
+                covariant T @52
+                  defaultType: dynamic
+                  metadata
+                    Annotation
+                      atSign: @ @47
+                      name: SimpleIdentifier
+                        token: foo @48
+                        staticElement: <testLibraryFragment>::@getter::foo
+                        staticType: null
+                      element: <testLibraryFragment>::@getter::foo
+              parameters
+                requiredPositional a @64
+                  type: int
+                  metadata
+                    Annotation
+                      atSign: @ @55
+                      name: SimpleIdentifier
+                        token: foo @56
+                        staticElement: <testLibraryFragment>::@getter::foo
+                        staticType: null
+                      element: <testLibraryFragment>::@getter::foo
+              returnType: void
+      topLevelVariables
+        static const foo @6
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @12
+              staticType: int
+      accessors
+        synthetic static get foo @-1
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_offsets_onClassSetter() async {
+    var library = await buildLibrary(r'''
+const foo = 0;
+
+class A {
+  @foo
+  set setter(@foo int a) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @22
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic setter @-1
+              reference: <testLibraryFragment>::@class::A::@field::setter
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            set setter= @39
+              reference: <testLibraryFragment>::@class::A::@setter::setter
+              enclosingElement: <testLibraryFragment>::@class::A
+              metadata
+                Annotation
+                  atSign: @ @28
+                  name: SimpleIdentifier
+                    token: foo @29
+                    staticElement: <testLibraryFragment>::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::foo
+              parameters
+                requiredPositional a @55
+                  type: int
+                  metadata
+                    Annotation
+                      atSign: @ @46
+                      name: SimpleIdentifier
+                        token: foo @47
+                        staticElement: <testLibraryFragment>::@getter::foo
+                        staticType: null
+                      element: <testLibraryFragment>::@getter::foo
+              returnType: void
+      topLevelVariables
+        static const foo @6
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @12
+              staticType: int
+      accessors
+        synthetic static get foo @-1
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_offsets_onClassTypeAlias() async {
+    var library = await buildLibrary(r'''
+const foo = 0;
+
+class A {}
+mixin M {}
+
+@foo
+class B<@foo T> = A with M;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @22
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class alias B @50
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @39
+              name: SimpleIdentifier
+                token: foo @40
+                staticElement: <testLibraryFragment>::@getter::foo
+                staticType: null
+              element: <testLibraryFragment>::@getter::foo
+          typeParameters
+            covariant T @57
+              defaultType: dynamic
+              metadata
+                Annotation
+                  atSign: @ @52
+                  name: SimpleIdentifier
+                    token: foo @53
+                    staticElement: <testLibraryFragment>::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::foo
+          supertype: A
+          mixins
+            M
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::A::@constructor::new
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+      mixins
+        mixin M @33
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+      topLevelVariables
+        static const foo @6
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @12
+              staticType: int
+      accessors
+        synthetic static get foo @-1
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_offsets_onEnum() async {
+    var library = await buildLibrary(r'''
+const foo = 0;
+
+@foo
+enum E {
+  @foo e1,
+  e2,
+  @foo e3,
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @26
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @16
+              name: SimpleIdentifier
+                token: foo @17
+                staticElement: <testLibraryFragment>::@getter::foo
+                staticType: null
+              element: <testLibraryFragment>::@getter::foo
+          supertype: Enum
+          fields
+            static const enumConstant e1 @37
+              reference: <testLibraryFragment>::@enum::E::@field::e1
+              enclosingElement: <testLibraryFragment>::@enum::E
+              metadata
+                Annotation
+                  atSign: @ @32
+                  name: SimpleIdentifier
+                    token: foo @33
+                    staticElement: <testLibraryFragment>::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::foo
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            static const enumConstant e2 @43
+              reference: <testLibraryFragment>::@enum::E::@field::e2
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            static const enumConstant e3 @54
+              reference: <testLibraryFragment>::@enum::E::@field::e3
+              enclosingElement: <testLibraryFragment>::@enum::E
+              metadata
+                Annotation
+                  atSign: @ @49
+                  name: SimpleIdentifier
+                    token: foo @50
+                    staticElement: <testLibraryFragment>::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::foo
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: e1 @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::e1
+                      staticType: E
+                    SimpleIdentifier
+                      token: e2 @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::e2
+                      staticType: E
+                    SimpleIdentifier
+                      token: e3 @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::e3
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get e1 @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::e1
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get e2 @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::e2
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get e3 @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::e3
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+      topLevelVariables
+        static const foo @6
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @12
+              staticType: int
+      accessors
+        synthetic static get foo @-1
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_offsets_onExtension() async {
+    var library = await buildLibrary(r'''
+const foo = 0;
+
+@foo
+extension E<@foo T> on List<T> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        E @31
+          reference: <testLibraryFragment>::@extension::E
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @16
+              name: SimpleIdentifier
+                token: foo @17
+                staticElement: <testLibraryFragment>::@getter::foo
+                staticType: null
+              element: <testLibraryFragment>::@getter::foo
+          typeParameters
+            covariant T @38
+              defaultType: dynamic
+              metadata
+                Annotation
+                  atSign: @ @33
+                  name: SimpleIdentifier
+                    token: foo @34
+                    staticElement: <testLibraryFragment>::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::foo
+          extendedType: List<T>
+      topLevelVariables
+        static const foo @6
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @12
+              staticType: int
+      accessors
+        synthetic static get foo @-1
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_offsets_onFieldDeclaration() async {
+    var library = await buildLibrary(r'''
+const foo = 0;
+
+class A {
+  @foo
+  static isStatic = 1;
+
+  @foo
+  static const isStaticConst = 2;
+
+  @foo
+  var isInstance = 3;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @22
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            static isStatic @42
+              reference: <testLibraryFragment>::@class::A::@field::isStatic
+              enclosingElement: <testLibraryFragment>::@class::A
+              metadata
+                Annotation
+                  atSign: @ @28
+                  name: SimpleIdentifier
+                    token: foo @29
+                    staticElement: <testLibraryFragment>::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::foo
+              type: int
+              shouldUseTypeForInitializerInference: false
+            static const isStaticConst @79
+              reference: <testLibraryFragment>::@class::A::@field::isStaticConst
+              enclosingElement: <testLibraryFragment>::@class::A
+              metadata
+                Annotation
+                  atSign: @ @59
+                  name: SimpleIdentifier
+                    token: foo @60
+                    staticElement: <testLibraryFragment>::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::foo
+              type: int
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                IntegerLiteral
+                  literal: 2 @95
+                  staticType: int
+            isInstance @112
+              reference: <testLibraryFragment>::@class::A::@field::isInstance
+              enclosingElement: <testLibraryFragment>::@class::A
+              metadata
+                Annotation
+                  atSign: @ @101
+                  name: SimpleIdentifier
+                    token: foo @102
+                    staticElement: <testLibraryFragment>::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::foo
+              type: int
+              shouldUseTypeForInitializerInference: false
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            synthetic static get isStatic @-1
+              reference: <testLibraryFragment>::@class::A::@getter::isStatic
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+            synthetic static set isStatic= @-1
+              reference: <testLibraryFragment>::@class::A::@setter::isStatic
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _isStatic @-1
+                  type: int
+              returnType: void
+            synthetic static get isStaticConst @-1
+              reference: <testLibraryFragment>::@class::A::@getter::isStaticConst
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+            synthetic get isInstance @-1
+              reference: <testLibraryFragment>::@class::A::@getter::isInstance
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+            synthetic set isInstance= @-1
+              reference: <testLibraryFragment>::@class::A::@setter::isInstance
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _isInstance @-1
+                  type: int
+              returnType: void
+      topLevelVariables
+        static const foo @6
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @12
+              staticType: int
+      accessors
+        synthetic static get foo @-1
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_offsets_onLibrary() async {
+    var library = await buildLibrary('''
+/// Some documentation.
+@foo
+library my.lib;
+
+const foo = 0;
+''');
+    checkElementText(library, r'''
+library
+  name: my.lib
+  nameOffset: 37
+  reference: <testLibrary>
+  documentationComment: /// Some documentation.
+  metadata
+    Annotation
+      atSign: @ @24
+      name: SimpleIdentifier
+        token: foo @25
+        staticElement: <testLibraryFragment>::@getter::foo
+        staticType: null
+      element: <testLibraryFragment>::@getter::foo
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const foo @52
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @58
+              staticType: int
+      accessors
+        synthetic static get foo @-1
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_offsets_onMixin() async {
+    var library = await buildLibrary(r'''
+const foo = 0;
+
+@foo
+mixin A<@foo T> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @27
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @16
+              name: SimpleIdentifier
+                token: foo @17
+                staticElement: <testLibraryFragment>::@getter::foo
+                staticType: null
+              element: <testLibraryFragment>::@getter::foo
+          typeParameters
+            covariant T @34
+              defaultType: dynamic
+              metadata
+                Annotation
+                  atSign: @ @29
+                  name: SimpleIdentifier
+                    token: foo @30
+                    staticElement: <testLibraryFragment>::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::foo
+          superclassConstraints
+            Object
+      topLevelVariables
+        static const foo @6
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @12
+              staticType: int
+      accessors
+        synthetic static get foo @-1
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_offsets_onTypeAlias_classic() async {
+    var library = await buildLibrary(r'''
+const foo = 0;
+
+@foo
+typedef void F<@foo T>(@foo int a);
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      typeAliases
+        functionTypeAliasBased F @34
+          reference: <testLibraryFragment>::@typeAlias::F
+          metadata
+            Annotation
+              atSign: @ @16
+              name: SimpleIdentifier
+                token: foo @17
+                staticElement: <testLibraryFragment>::@getter::foo
+                staticType: null
+              element: <testLibraryFragment>::@getter::foo
+          typeParameters
+            unrelated T @41
+              defaultType: dynamic
+              metadata
+                Annotation
+                  atSign: @ @36
+                  name: SimpleIdentifier
+                    token: foo @37
+                    staticElement: <testLibraryFragment>::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::foo
+          aliasedType: void Function(int)
+          aliasedElement: GenericFunctionTypeElement
+            parameters
+              requiredPositional a @53
+                type: int
+                metadata
+                  Annotation
+                    atSign: @ @44
+                    name: SimpleIdentifier
+                      token: foo @45
+                      staticElement: <testLibraryFragment>::@getter::foo
+                      staticType: null
+                    element: <testLibraryFragment>::@getter::foo
+            returnType: void
+      topLevelVariables
+        static const foo @6
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @12
+              staticType: int
+      accessors
+        synthetic static get foo @-1
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_offsets_onTypeAlias_genericFunctionType() async {
+    var library = await buildLibrary(r'''
+const foo = 0;
+
+@foo
+typedef A<@foo T> = void Function<@foo U>(@foo int a);
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      typeAliases
+        A @29
+          reference: <testLibraryFragment>::@typeAlias::A
+          metadata
+            Annotation
+              atSign: @ @16
+              name: SimpleIdentifier
+                token: foo @17
+                staticElement: <testLibraryFragment>::@getter::foo
+                staticType: null
+              element: <testLibraryFragment>::@getter::foo
+          typeParameters
+            unrelated T @36
+              defaultType: dynamic
+              metadata
+                Annotation
+                  atSign: @ @31
+                  name: SimpleIdentifier
+                    token: foo @32
+                    staticElement: <testLibraryFragment>::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::foo
+          aliasedType: void Function<U>(int)
+          aliasedElement: GenericFunctionTypeElement
+            typeParameters
+              covariant U @60
+                metadata
+                  Annotation
+                    atSign: @ @55
+                    name: SimpleIdentifier
+                      token: foo @56
+                      staticElement: <testLibraryFragment>::@getter::foo
+                      staticType: null
+                    element: <testLibraryFragment>::@getter::foo
+            parameters
+              requiredPositional a @72
+                type: int
+                metadata
+                  Annotation
+                    atSign: @ @63
+                    name: SimpleIdentifier
+                      token: foo @64
+                      staticElement: <testLibraryFragment>::@getter::foo
+                      staticType: null
+                    element: <testLibraryFragment>::@getter::foo
+            returnType: void
+      topLevelVariables
+        static const foo @6
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @12
+              staticType: int
+      accessors
+        synthetic static get foo @-1
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_offsets_onUnit() async {
+    addSource('$testPackageLibPath/a.dart', '''
+part of my.lib;
+''');
+
+    addSource('$testPackageLibPath/b.dart', '''
+part of my.lib;
+''');
+
+    var library = await buildLibrary('''
+library my.lib;
+
+@foo
+part 'a.dart';
+
+@foo
+part 'b.dart';
+
+const foo = 0;
+''');
+    checkElementText(library, r'''
+library
+  name: my.lib
+  nameOffset: 8
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  parts
+    part_0
+    part_1
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      parts
+        part_0
+          uri: package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @17
+              name: SimpleIdentifier
+                token: foo @18
+                staticElement: <testLibraryFragment>::@getter::foo
+                staticType: null
+              element: <testLibraryFragment>::@getter::foo
+          unit: <testLibrary>::@fragment::package:test/a.dart
+        part_1
+          uri: package:test/b.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @38
+              name: SimpleIdentifier
+                token: foo @39
+                staticElement: <testLibraryFragment>::@getter::foo
+                staticType: null
+              element: <testLibraryFragment>::@getter::foo
+          unit: <testLibrary>::@fragment::package:test/b.dart
+      topLevelVariables
+        static const foo @65
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @71
+              staticType: int
+      accessors
+        synthetic static get foo @-1
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_metadata_offsets_onUnitFunction() async {
+    var library = await buildLibrary(r'''
+const foo = 0;
+
+@foo
+void f<@foo T>({@foo int? a = 42}) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const foo @6
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @12
+              staticType: int
+      accessors
+        synthetic static get foo @-1
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+      functions
+        f @26
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @16
+              name: SimpleIdentifier
+                token: foo @17
+                staticElement: <testLibraryFragment>::@getter::foo
+                staticType: null
+              element: <testLibraryFragment>::@getter::foo
+          typeParameters
+            covariant T @33
+              defaultType: dynamic
+              metadata
+                Annotation
+                  atSign: @ @28
+                  name: SimpleIdentifier
+                    token: foo @29
+                    staticElement: <testLibraryFragment>::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::foo
+          parameters
+            optionalNamed default a @47
+              reference: <testLibraryFragment>::@function::f::@parameter::a
+              type: int?
+              metadata
+                Annotation
+                  atSign: @ @37
+                  name: SimpleIdentifier
+                    token: foo @38
+                    staticElement: <testLibraryFragment>::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::foo
+              constantInitializer
+                IntegerLiteral
+                  literal: 42 @51
+                  staticType: int
+          returnType: void
+''');
+  }
+
+  test_metadata_offsets_onUnitGetter() async {
+    var library = await buildLibrary(r'''
+const foo = 0;
+
+@foo
+int get getter => 0;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const foo @6
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @12
+              staticType: int
+        synthetic static getter @-1
+          reference: <testLibraryFragment>::@topLevelVariable::getter
+          enclosingElement: <testLibraryFragment>
+          type: int
+      accessors
+        synthetic static get foo @-1
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        static get getter @29
+          reference: <testLibraryFragment>::@getter::getter
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @16
+              name: SimpleIdentifier
+                token: foo @17
+                staticElement: <testLibraryFragment>::@getter::foo
+                staticType: null
+              element: <testLibraryFragment>::@getter::foo
+          returnType: int
+''');
+  }
+
+  test_metadata_offsets_onUnitSetter() async {
+    var library = await buildLibrary(r'''
+const foo = 0;
+
+@foo
+set setter(@foo int a) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const foo @6
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @12
+              staticType: int
+        synthetic static setter @-1
+          reference: <testLibraryFragment>::@topLevelVariable::setter
+          enclosingElement: <testLibraryFragment>
+          type: int
+      accessors
+        synthetic static get foo @-1
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        static set setter= @25
+          reference: <testLibraryFragment>::@setter::setter
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @16
+              name: SimpleIdentifier
+                token: foo @17
+                staticElement: <testLibraryFragment>::@getter::foo
+                staticType: null
+              element: <testLibraryFragment>::@getter::foo
+          parameters
+            requiredPositional a @41
+              type: int
+              metadata
+                Annotation
+                  atSign: @ @32
+                  name: SimpleIdentifier
+                    token: foo @33
+                    staticElement: <testLibraryFragment>::@getter::foo
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::foo
+          returnType: void
+''');
+  }
+
+  test_metadata_offsets_onUnitVariable() async {
+    var library = await buildLibrary(r'''
+const foo = 0;
+
+@foo
+var isNotConst = 1;
+
+@foo
+const isConst = 2;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const foo @6
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @12
+              staticType: int
+        static isNotConst @25
+          reference: <testLibraryFragment>::@topLevelVariable::isNotConst
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @16
+              name: SimpleIdentifier
+                token: foo @17
+                staticElement: <testLibraryFragment>::@getter::foo
+                staticType: null
+              element: <testLibraryFragment>::@getter::foo
+          type: int
+          shouldUseTypeForInitializerInference: false
+        static const isConst @53
+          reference: <testLibraryFragment>::@topLevelVariable::isConst
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @42
+              name: SimpleIdentifier
+                token: foo @43
+                staticElement: <testLibraryFragment>::@getter::foo
+                staticType: null
+              element: <testLibraryFragment>::@getter::foo
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 2 @63
+              staticType: int
+      accessors
+        synthetic static get foo @-1
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get isNotConst @-1
+          reference: <testLibraryFragment>::@getter::isNotConst
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static set isNotConst= @-1
+          reference: <testLibraryFragment>::@setter::isNotConst
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _isNotConst @-1
+              type: int
+          returnType: void
+        synthetic static get isConst @-1
+          reference: <testLibraryFragment>::@getter::isConst
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+
+  test_metadata_partDirective() async {
+    addSource('$testPackageLibPath/foo.dart', 'part of L;');
+    var library = await buildLibrary('''
+library L;
+@a
+part 'foo.dart';
+const a = null;''');
+    checkElementText(library, r'''
+library
+  name: L
+  nameOffset: 8
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  parts
+    part_0
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      parts
+        part_0
+          uri: package:test/foo.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @11
+              name: SimpleIdentifier
+                token: a @12
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: null
+              element: <testLibraryFragment>::@getter::a
+          unit: <testLibrary>::@fragment::package:test/foo.dart
+      topLevelVariables
+        static const a @37
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @41
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+    <testLibrary>::@fragment::package:test/foo.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_metadata_partDirective2() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+part of 'test.dart';
+''');
+    addSource('$testPackageLibPath/b.dart', r'''
+part of 'test.dart';
+''');
+    var library = await buildLibrary('''
+part 'a.dart';
+part 'b.dart';
+''');
+
+    // The difference with the test above is that we ask the part first.
+    // There was a bug that we were not loading library directives.
+    expect(library.parts[0].metadata, isEmpty);
+  }
+
+  test_metadata_prefixed_variable() async {
+    addSource('$testPackageLibPath/a.dart', 'const b = null;');
+    var library = await buildLibrary('import "a.dart" as a; @a.b class C {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart as a @19
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    a @19
+      reference: <testLibraryFragment>::@prefix::a
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart as a @19
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        a @19
+          reference: <testLibraryFragment>::@prefix::a
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @33
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @22
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: a @23
+                  staticElement: <testLibraryFragment>::@prefix::a
+                  staticType: null
+                period: . @24
+                identifier: SimpleIdentifier
+                  token: b @25
+                  staticElement: package:test/a.dart::<fragment>::@getter::b
+                  staticType: null
+                staticElement: package:test/a.dart::<fragment>::@getter::b
+                staticType: null
+              element: package:test/a.dart::<fragment>::@getter::b
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_metadata_simpleFormalParameter() async {
+    var library = await buildLibrary('const a = null; f(@a x) {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+      functions
+        f @16
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional x @21
+              type: dynamic
+              metadata
+                Annotation
+                  atSign: @ @18
+                  name: SimpleIdentifier
+                    token: a @19
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::a
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_simpleFormalParameter_method() async {
+    var library = await buildLibrary('''
+const a = null;
+
+class C {
+  m(@a x) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @23
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            m @29
+              reference: <testLibraryFragment>::@class::C::@method::m
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional x @34
+                  type: dynamic
+                  metadata
+                    Annotation
+                      atSign: @ @31
+                      name: SimpleIdentifier
+                        token: a @32
+                        staticElement: <testLibraryFragment>::@getter::a
+                        staticType: null
+                      element: <testLibraryFragment>::@getter::a
+              returnType: dynamic
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_simpleFormalParameter_unit_setter() async {
+    var library = await buildLibrary('''
+const a = null;
+
+set foo(@a int x) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+        synthetic static foo @-1
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+        static set foo= @21
+          reference: <testLibraryFragment>::@setter::foo
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional x @32
+              type: int
+              metadata
+                Annotation
+                  atSign: @ @25
+                  name: SimpleIdentifier
+                    token: a @26
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::a
+          returnType: void
+''');
+  }
+
+  test_metadata_simpleFormalParameter_withDefault() async {
+    var library = await buildLibrary('const a = null; f([@a x = null]) {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+      functions
+        f @16
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          parameters
+            optionalPositional default x @22
+              type: dynamic
+              metadata
+                Annotation
+                  atSign: @ @19
+                  name: SimpleIdentifier
+                    token: a @20
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::a
+              constantInitializer
+                NullLiteral
+                  literal: null @26
+                  staticType: Null
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_superFormalParameter() async {
+    var library = await buildLibrary('''
+const a = null;
+
+class A {
+  A(int x);
+}
+
+class B extends A {
+  B(@a super.x);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @23
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @29
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional x @35
+                  type: int
+        class B @48
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A
+          constructors
+            @64
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              parameters
+                requiredPositional final super.x @75
+                  type: int
+                  metadata
+                    Annotation
+                      atSign: @ @66
+                      name: SimpleIdentifier
+                        token: a @67
+                        staticElement: <testLibraryFragment>::@getter::a
+                        staticType: null
+                      element: <testLibraryFragment>::@getter::a
+                  superConstructorParameter: <testLibraryFragment>::@class::A::@constructor::new::@parameter::x
+              superConstructor: <testLibraryFragment>::@class::A::@constructor::new
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_topLevelVariableDeclaration() async {
+    var library = await buildLibrary('const a = null; @a int v;');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+        static v @23
+          reference: <testLibraryFragment>::@topLevelVariable::v
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @16
+              name: SimpleIdentifier
+                token: a @17
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: null
+              element: <testLibraryFragment>::@getter::a
+          type: int
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+        synthetic static get v @-1
+          reference: <testLibraryFragment>::@getter::v
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static set v= @-1
+          reference: <testLibraryFragment>::@setter::v
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _v @-1
+              type: int
+          returnType: void
+''');
+  }
+
+  test_metadata_typeParameter_ofClass() async {
+    var library = await buildLibrary('const a = null; class C<@a T> {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @22
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @27
+              defaultType: dynamic
+              metadata
+                Annotation
+                  atSign: @ @24
+                  name: SimpleIdentifier
+                    token: a @25
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::a
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_typeParameter_ofClassTypeAlias() async {
+    var library = await buildLibrary('''
+const a = null;
+class C<@a T> = D with E;
+class D {}
+class E {}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class alias C @22
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @27
+              defaultType: dynamic
+              metadata
+                Annotation
+                  atSign: @ @24
+                  name: SimpleIdentifier
+                    token: a @25
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::a
+          supertype: D
+          mixins
+            E
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::D::@constructor::new
+              superConstructor: <testLibraryFragment>::@class::D::@constructor::new
+        class D @48
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+        class E @59
+          reference: <testLibraryFragment>::@class::E
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::E
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_typeParameter_ofFunction() async {
+    var library = await buildLibrary('const a = null; f<@a T>() {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+      functions
+        f @16
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @21
+              defaultType: dynamic
+              metadata
+                Annotation
+                  atSign: @ @18
+                  name: SimpleIdentifier
+                    token: a @19
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::a
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_typeParameter_ofTypedef() async {
+    var library = await buildLibrary('const a = null; typedef F<@a T>();');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      typeAliases
+        functionTypeAliasBased F @24
+          reference: <testLibraryFragment>::@typeAlias::F
+          typeParameters
+            unrelated T @29
+              defaultType: dynamic
+              metadata
+                Annotation
+                  atSign: @ @26
+                  name: SimpleIdentifier
+                    token: a @27
+                    staticElement: <testLibraryFragment>::@getter::a
+                    staticType: null
+                  element: <testLibraryFragment>::@getter::a
+          aliasedType: dynamic Function()
+          aliasedElement: GenericFunctionTypeElement
+            returnType: dynamic
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: dynamic
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            NullLiteral
+              literal: null @10
+              staticType: Null
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: dynamic
+''');
+  }
+
+  test_metadata_unit_topLevelVariable_first() async {
+    var library = await buildLibrary(r'''
+const a = 0;
+@a
+int x = 0;
+''');
+    // Check metadata without asking any other properties.
+    var x = _elementOfDefiningUnit(library, ['@topLevelVariable', 'x'])
+        as TopLevelVariableElement;
+    expect(x.metadata, hasLength(1));
+    // Check details.
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static const a @6
+          reference: <testLibraryFragment>::@topLevelVariable::a
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: false
+          constantInitializer
+            IntegerLiteral
+              literal: 0 @10
+              staticType: int
+        static x @20
+          reference: <testLibraryFragment>::@topLevelVariable::x
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @13
+              name: SimpleIdentifier
+                token: a @14
+                staticElement: <testLibraryFragment>::@getter::a
+                staticType: null
+              element: <testLibraryFragment>::@getter::a
+          type: int
+          shouldUseTypeForInitializerInference: true
+      accessors
+        synthetic static get a @-1
+          reference: <testLibraryFragment>::@getter::a
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static get x @-1
+          reference: <testLibraryFragment>::@getter::x
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static set x= @-1
+          reference: <testLibraryFragment>::@setter::x
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _x @-1
+              type: int
+          returnType: void
+''');
+  }
+
+  test_metadata_value_class_staticField() async {
+    var library = await buildLibrary('''
+class A {
+  static const x = 0;
+}
+@A.x
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            static const x @25
+              reference: <testLibraryFragment>::@class::A::@field::x
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                IntegerLiteral
+                  literal: 0 @29
+                  staticType: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            synthetic static get x @-1
+              reference: <testLibraryFragment>::@class::A::@getter::x
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+        class C @45
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @34
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: A @35
+                  staticElement: <testLibraryFragment>::@class::A
+                  staticType: null
+                period: . @36
+                identifier: SimpleIdentifier
+                  token: x @37
+                  staticElement: <testLibraryFragment>::@class::A::@getter::x
+                  staticType: null
+                staticElement: <testLibraryFragment>::@class::A::@getter::x
+                staticType: null
+              element: <testLibraryFragment>::@class::A::@getter::x
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_metadata_value_enum_constant() async {
+    var library = await buildLibrary('''
+enum E {a, b, c}
+@E.b
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @28
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @17
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: E @18
+                  staticElement: <testLibraryFragment>::@enum::E
+                  staticType: null
+                period: . @19
+                identifier: SimpleIdentifier
+                  token: b @20
+                  staticElement: <testLibraryFragment>::@enum::E::@getter::b
+                  staticType: null
+                staticElement: <testLibraryFragment>::@enum::E::@getter::b
+                staticType: null
+              element: <testLibraryFragment>::@enum::E::@getter::b
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant a @8
+              reference: <testLibraryFragment>::@enum::E::@field::a
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            static const enumConstant b @11
+              reference: <testLibraryFragment>::@enum::E::@field::b
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            static const enumConstant c @14
+              reference: <testLibraryFragment>::@enum::E::@field::c
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: a @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::a
+                      staticType: E
+                    SimpleIdentifier
+                      token: b @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::b
+                      staticType: E
+                    SimpleIdentifier
+                      token: c @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::c
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get a @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::a
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get b @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::b
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get c @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::c
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+''');
+  }
+
+  test_metadata_value_extension_staticField() async {
+    var library = await buildLibrary('''
+extension E on int {
+  static const x = 0;
+}
+@E.x
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @56
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @45
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: E @46
+                  staticElement: <testLibraryFragment>::@extension::E
+                  staticType: null
+                period: . @47
+                identifier: SimpleIdentifier
+                  token: x @48
+                  staticElement: <testLibraryFragment>::@extension::E::@getter::x
+                  staticType: null
+                staticElement: <testLibraryFragment>::@extension::E::@getter::x
+                staticType: null
+              element: <testLibraryFragment>::@extension::E::@getter::x
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+      extensions
+        E @10
+          reference: <testLibraryFragment>::@extension::E
+          enclosingElement: <testLibraryFragment>
+          extendedType: int
+          fields
+            static const x @36
+              reference: <testLibraryFragment>::@extension::E::@field::x
+              enclosingElement: <testLibraryFragment>::@extension::E
+              type: int
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                IntegerLiteral
+                  literal: 0 @40
+                  staticType: int
+          accessors
+            synthetic static get x @-1
+              reference: <testLibraryFragment>::@extension::E::@getter::x
+              enclosingElement: <testLibraryFragment>::@extension::E
+              returnType: int
+''');
+  }
+
+  test_metadata_value_prefix_extension_staticField() async {
+    addSource('$testPackageLibPath/foo.dart', '''
+extension E on int {
+  static const x = 0;
+}
+''');
+    var library = await buildLibrary('''
+import 'foo.dart' as foo;
+@foo.E.x
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/foo.dart as foo @21
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    foo @21
+      reference: <testLibraryFragment>::@prefix::foo
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/foo.dart as foo @21
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        foo @21
+          reference: <testLibraryFragment>::@prefix::foo
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @41
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @26
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: foo @27
+                  staticElement: <testLibraryFragment>::@prefix::foo
+                  staticType: null
+                period: . @30
+                identifier: SimpleIdentifier
+                  token: E @31
+                  staticElement: package:test/foo.dart::<fragment>::@extension::E
+                  staticType: null
+                staticElement: package:test/foo.dart::<fragment>::@extension::E
+                staticType: null
+              period: . @32
+              constructorName: SimpleIdentifier
+                token: x @33
+                staticElement: package:test/foo.dart::<fragment>::@extension::E::@getter::x
+                staticType: null
+              element: package:test/foo.dart::<fragment>::@extension::E::@getter::x
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_unresolved_annotation_instanceCreation_argument_super() async {
+    var library = await buildLibrary('''
+class A {
+  const A(_);
+}
+
+@A(super)
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const @18
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _ @20
+                  type: dynamic
+        class C @43
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @27
+              name: SimpleIdentifier
+                token: A @28
+                staticElement: <testLibraryFragment>::@class::A
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @29
+                arguments
+                  SuperExpression
+                    superKeyword: super @30
+                    staticType: InvalidType
+                rightParenthesis: ) @35
+              element: <testLibraryFragment>::@class::A::@constructor::new
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_unresolved_annotation_instanceCreation_argument_this() async {
+    var library = await buildLibrary('''
+class A {
+  const A(_);
+}
+
+@A(this)
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            const @18
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _ @20
+                  type: dynamic
+        class C @42
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @27
+              name: SimpleIdentifier
+                token: A @28
+                staticElement: <testLibraryFragment>::@class::A
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @29
+                arguments
+                  ThisExpression
+                    thisKeyword: this @30
+                    staticType: dynamic
+                rightParenthesis: ) @34
+              element: <testLibraryFragment>::@class::A::@constructor::new
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_unresolved_annotation_namedConstructorCall_noClass() async {
+    var library = await buildLibrary('@foo.bar() class C {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @17
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @0
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: foo @1
+                  staticElement: <null>
+                  staticType: null
+                period: . @4
+                identifier: SimpleIdentifier
+                  token: bar @5
+                  staticElement: <null>
+                  staticType: null
+                staticElement: <null>
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @8
+                rightParenthesis: ) @9
+              element: <null>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_unresolved_annotation_namedConstructorCall_noConstructor() async {
+    var library = await buildLibrary('@String.foo() class C {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @20
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @0
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: String @1
+                  staticElement: dart:core::<fragment>::@class::String
+                  staticType: null
+                period: . @7
+                identifier: SimpleIdentifier
+                  token: foo @8
+                  staticElement: <null>
+                  staticType: null
+                staticElement: <null>
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @11
+                rightParenthesis: ) @12
+              element: <null>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_unresolved_annotation_prefixedIdentifier_badPrefix() async {
+    var library = await buildLibrary('@foo.bar class C {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @15
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @0
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: foo @1
+                  staticElement: <null>
+                  staticType: null
+                period: . @4
+                identifier: SimpleIdentifier
+                  token: bar @5
+                  staticElement: <null>
+                  staticType: null
+                staticElement: <null>
+                staticType: null
+              element: <null>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_unresolved_annotation_prefixedIdentifier_noDeclaration() async {
+    var library =
+        await buildLibrary('import "dart:async" as foo; @foo.bar class C {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    dart:async as foo @23
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    foo @23
+      reference: <testLibraryFragment>::@prefix::foo
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        dart:async as foo @23
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        foo @23
+          reference: <testLibraryFragment>::@prefix::foo
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @43
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @28
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: foo @29
+                  staticElement: <testLibraryFragment>::@prefix::foo
+                  staticType: null
+                period: . @32
+                identifier: SimpleIdentifier
+                  token: bar @33
+                  staticElement: <null>
+                  staticType: null
+                staticElement: <null>
+                staticType: null
+              element: <null>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_unresolved_annotation_prefixedNamedConstructorCall_badPrefix() async {
+    var library = await buildLibrary('@foo.bar.baz() class C {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @21
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @0
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: foo @1
+                  staticElement: <null>
+                  staticType: null
+                period: . @4
+                identifier: SimpleIdentifier
+                  token: bar @5
+                  staticElement: <null>
+                  staticType: null
+                staticElement: <null>
+                staticType: null
+              period: . @8
+              constructorName: SimpleIdentifier
+                token: baz @9
+                staticElement: <null>
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @12
+                rightParenthesis: ) @13
+              element: <null>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_unresolved_annotation_prefixedNamedConstructorCall_noClass() async {
+    var library = await buildLibrary(
+        'import "dart:async" as foo; @foo.bar.baz() class C {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    dart:async as foo @23
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    foo @23
+      reference: <testLibraryFragment>::@prefix::foo
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        dart:async as foo @23
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        foo @23
+          reference: <testLibraryFragment>::@prefix::foo
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @49
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @28
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: foo @29
+                  staticElement: <testLibraryFragment>::@prefix::foo
+                  staticType: null
+                period: . @32
+                identifier: SimpleIdentifier
+                  token: bar @33
+                  staticElement: <null>
+                  staticType: null
+                staticElement: <null>
+                staticType: null
+              period: . @36
+              constructorName: SimpleIdentifier
+                token: baz @37
+                staticElement: <null>
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @40
+                rightParenthesis: ) @41
+              element: <null>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_unresolved_annotation_prefixedNamedConstructorCall_noConstructor() async {
+    var library = await buildLibrary(
+        'import "dart:async" as foo; @foo.Future.bar() class C {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    dart:async as foo @23
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    foo @23
+      reference: <testLibraryFragment>::@prefix::foo
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        dart:async as foo @23
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        foo @23
+          reference: <testLibraryFragment>::@prefix::foo
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @52
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @28
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: foo @29
+                  staticElement: <testLibraryFragment>::@prefix::foo
+                  staticType: null
+                period: . @32
+                identifier: SimpleIdentifier
+                  token: Future @33
+                  staticElement: dart:async::<fragment>::@class::Future
+                  staticType: null
+                staticElement: dart:async::<fragment>::@class::Future
+                staticType: null
+              period: . @39
+              constructorName: SimpleIdentifier
+                token: bar @40
+                staticElement: <null>
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @43
+                rightParenthesis: ) @44
+              element: <null>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_unresolved_annotation_prefixedUnnamedConstructorCall_badPrefix() async {
+    var library = await buildLibrary('@foo.bar() class C {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @17
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @0
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: foo @1
+                  staticElement: <null>
+                  staticType: null
+                period: . @4
+                identifier: SimpleIdentifier
+                  token: bar @5
+                  staticElement: <null>
+                  staticType: null
+                staticElement: <null>
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @8
+                rightParenthesis: ) @9
+              element: <null>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_unresolved_annotation_prefixedUnnamedConstructorCall_noClass() async {
+    var library =
+        await buildLibrary('import "dart:async" as foo; @foo.bar() class C {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    dart:async as foo @23
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  prefixes
+    foo @23
+      reference: <testLibraryFragment>::@prefix::foo
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        dart:async as foo @23
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      libraryImportPrefixes
+        foo @23
+          reference: <testLibraryFragment>::@prefix::foo
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @45
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @28
+              name: PrefixedIdentifier
+                prefix: SimpleIdentifier
+                  token: foo @29
+                  staticElement: <testLibraryFragment>::@prefix::foo
+                  staticType: null
+                period: . @32
+                identifier: SimpleIdentifier
+                  token: bar @33
+                  staticElement: <null>
+                  staticType: null
+                staticElement: <null>
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @36
+                rightParenthesis: ) @37
+              element: <null>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_unresolved_annotation_simpleIdentifier() async {
+    var library = await buildLibrary('@foo class C {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @11
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @0
+              name: SimpleIdentifier
+                token: foo @1
+                staticElement: <null>
+                staticType: null
+              element: <null>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_unresolved_annotation_simpleIdentifier_multiplyDefined() async {
+    addSource('$testPackageLibPath/a.dart', 'const v = 0;');
+    addSource('$testPackageLibPath/b.dart', 'const v = 0;');
+    var library = await buildLibrary('''
+import 'a.dart';
+import 'b.dart';
+
+@v
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+        package:test/b.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      classes
+        class C @44
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @35
+              name: SimpleIdentifier
+                token: v @36
+                staticElement: <null>
+                staticType: null
+              element: <null>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  test_unresolved_annotation_unnamedConstructorCall_noClass() async {
+    var library = await buildLibrary('@foo() class C {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @13
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @0
+              name: SimpleIdentifier
+                token: foo @1
+                staticElement: <null>
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @4
+                rightParenthesis: ) @5
+              element: <null>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+''');
+  }
+
+  // TODO(scheglov): This is duplicate.
+  Element _elementOfDefiningUnit(
+      LibraryElementImpl library, List<String> names) {
+    var reference = library.definingCompilationUnit.reference!;
+    for (var name in names) {
+      reference = reference.getChild(name);
+    }
+
+    var element = reference.element;
+    if (element != null) {
+      return element;
+    }
+
+    var elementFactory = library.linkedData!.elementFactory;
+    return elementFactory.elementOfReference(reference)!;
+  }
+}
+
+@reflectiveTest
+class MetadataElementTest_fromBytes extends MetadataElementTest {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class MetadataElementTest_keepLinking extends MetadataElementTest {
+  @override
+  bool get keepLinkingLibraries => true;
+}
diff --git a/pkg/analyzer/test/src/summary/elements/mixin_test.dart b/pkg/analyzer/test/src/summary/elements/mixin_test.dart
new file mode 100644
index 0000000..6e353b7
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/elements/mixin_test.dart
@@ -0,0 +1,4697 @@
+// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../dart/resolution/node_text_expectations.dart';
+import '../elements_base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MixinElementTest_keepLinking);
+    defineReflectiveTests(MixinElementTest_fromBytes);
+    defineReflectiveTests(MixinElementTest_augmentation_fromBytes);
+    defineReflectiveTests(MixinElementTest_augmentation_keepLinking);
+    defineReflectiveTests(UpdateNodeTextExpectations);
+  });
+}
+
+abstract class MixinElementTest extends ElementsBaseTest {
+  test_mixin() async {
+    var library = await buildLibrary(r'''
+class A {}
+class B {}
+class C {}
+class D {}
+
+mixin M<T extends num, U> on A, B implements C, D {
+  T f;
+  U get g => 0;
+  set s(int v) {}
+  int m(double v) => 0;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class B @17
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+        class C @28
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+        class D @39
+          reference: <testLibraryFragment>::@class::D
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::D::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::D
+      mixins
+        mixin M @51
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @53
+              bound: num
+              defaultType: num
+            covariant U @68
+              defaultType: dynamic
+          superclassConstraints
+            A
+            B
+          interfaces
+            C
+            D
+          fields
+            f @101
+              reference: <testLibraryFragment>::@mixin::M::@field::f
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              type: T
+            synthetic g @-1
+              reference: <testLibraryFragment>::@mixin::M::@field::g
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              type: U
+            synthetic s @-1
+              reference: <testLibraryFragment>::@mixin::M::@field::s
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              type: int
+          accessors
+            synthetic get f @-1
+              reference: <testLibraryFragment>::@mixin::M::@getter::f
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              returnType: T
+            synthetic set f= @-1
+              reference: <testLibraryFragment>::@mixin::M::@setter::f
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              parameters
+                requiredPositional _f @-1
+                  type: T
+              returnType: void
+            get g @112
+              reference: <testLibraryFragment>::@mixin::M::@getter::g
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              returnType: U
+            set s= @126
+              reference: <testLibraryFragment>::@mixin::M::@setter::s
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              parameters
+                requiredPositional v @132
+                  type: int
+              returnType: void
+          methods
+            m @144
+              reference: <testLibraryFragment>::@mixin::M::@method::m
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              parameters
+                requiredPositional v @153
+                  type: double
+              returnType: int
+''');
+  }
+
+  test_mixin_base() async {
+    var library = await buildLibrary(r'''
+base mixin M on A {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        base mixin M @11
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_mixin_field_inferredType_final() async {
+    var library = await buildLibrary('''
+mixin M {
+  final x = 0;
+}''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin M @6
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+          fields
+            final x @18
+              reference: <testLibraryFragment>::@mixin::M::@field::x
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              type: int
+              shouldUseTypeForInitializerInference: false
+          accessors
+            synthetic get x @-1
+              reference: <testLibraryFragment>::@mixin::M::@getter::x
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              returnType: int
+''');
+  }
+
+  test_mixin_first() async {
+    var library = await buildLibrary(r'''
+mixin M {}
+''');
+
+    // We intentionally ask `mixins` directly, to check that we can ask them
+    // separately, without asking classes.
+    var mixins = library.definingCompilationUnit.mixins;
+    expect(mixins, hasLength(1));
+    expect(mixins[0].name, 'M');
+  }
+
+  test_mixin_getter_invokesSuperSelf_getter() async {
+    var library = await buildLibrary(r'''
+mixin M on A {
+  int get foo {
+    super.foo;
+  }
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin M @6
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@mixin::M::@field::foo
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              type: int
+          accessors
+            get foo @25 invokesSuperSelf
+              reference: <testLibraryFragment>::@mixin::M::@getter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              returnType: int
+''');
+  }
+
+  test_mixin_getter_invokesSuperSelf_getter_nestedInAssignment() async {
+    var library = await buildLibrary(r'''
+mixin M on A {
+  int get foo {
+    (super.foo).foo = 0;
+  }
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin M @6
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@mixin::M::@field::foo
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              type: int
+          accessors
+            get foo @25 invokesSuperSelf
+              reference: <testLibraryFragment>::@mixin::M::@getter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              returnType: int
+''');
+  }
+
+  test_mixin_getter_invokesSuperSelf_setter() async {
+    var library = await buildLibrary(r'''
+mixin M on A {
+  int get foo {
+    super.foo = 0;
+  }
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin M @6
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@mixin::M::@field::foo
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              type: int
+          accessors
+            get foo @25
+              reference: <testLibraryFragment>::@mixin::M::@getter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              returnType: int
+''');
+  }
+
+  test_mixin_implicitObjectSuperclassConstraint() async {
+    var library = await buildLibrary(r'''
+mixin M {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin M @6
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_mixin_inference() async {
+    var library = await buildLibrary(r'''
+class A<T> {}
+mixin M<U> on A<U> {}
+class B extends A<int> with M {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class B @42
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: A<int>
+          mixins
+            M<int>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              superConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::A::@constructor::new
+                substitution: {T: int}
+      mixins
+        mixin M @20
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant U @22
+              defaultType: dynamic
+          superclassConstraints
+            A<U>
+''');
+  }
+
+  test_mixin_inference_classAlias_oneMixin() async {
+    // In the code below, B's superclass constraints don't include A, because
+    // superclass constraints are determined from the mixin's superclass, and
+    // B's superclass is Object.  So no mixin type inference is attempted, and
+    // "with B" is interpreted as "with B<dynamic>".
+    var library = await buildLibrary(r'''
+class A<T> {}
+class B<T> = Object with A<T>;
+class C = A<int> with B;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class alias B @20
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @22
+              defaultType: dynamic
+          supertype: Object
+          mixins
+            A<T>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: dart:core::<fragment>::@class::Object::@constructor::new
+        class alias C @51
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: A<int>
+          mixins
+            B<dynamic>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::A::@constructor::new
+              superConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::A::@constructor::new
+                substitution: {T: int}
+''');
+  }
+
+  test_mixin_inference_classAlias_twoMixins() async {
+    // In the code below, `B` has a single superclass constraint, A1, because
+    // superclass constraints are determined from the mixin's superclass, and
+    // B's superclass is "Object with A1<T>".  So mixin type inference succeeds
+    // (since C's base class implements A1<int>), and "with B" is interpreted as
+    // "with B<int>".
+    var library = await buildLibrary(r'''
+class A1<T> {}
+class A2<T> {}
+class B<T> = Object with A1<T>, A2<T>;
+class Base implements A1<int> {}
+class C = Base with B;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A1 @6
+          reference: <testLibraryFragment>::@class::A1
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @9
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A1
+        class A2 @21
+          reference: <testLibraryFragment>::@class::A2
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @24
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A2::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A2
+        class alias B @36
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @38
+              defaultType: dynamic
+          supertype: Object
+          mixins
+            A1<T>
+            A2<T>
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: dart:core::<fragment>::@class::Object::@constructor::new
+        class Base @75
+          reference: <testLibraryFragment>::@class::Base
+          enclosingElement: <testLibraryFragment>
+          interfaces
+            A1<int>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::Base::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::Base
+        class alias C @108
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: Base
+          mixins
+            B<int>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::Base::@constructor::new
+              superConstructor: <testLibraryFragment>::@class::Base::@constructor::new
+''');
+  }
+
+  test_mixin_inference_nested_functionType() async {
+    var library = await buildLibrary(r'''
+class A<T> {}
+mixin M<T, U> on A<T Function(U)> {}
+class C extends A<int Function(String)> with M {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class C @57
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: A<int Function(String)>
+          mixins
+            M<int, String>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              superConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::A::@constructor::new
+                substitution: {T: int Function(String)}
+      mixins
+        mixin M @20
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @22
+              defaultType: dynamic
+            covariant U @25
+              defaultType: dynamic
+          superclassConstraints
+            A<T Function(U)>
+''');
+  }
+
+  test_mixin_inference_nested_interfaceType() async {
+    var library = await buildLibrary(r'''
+abstract class A<T> {}
+mixin M<T> on A<List<T>> {}
+class C extends A<List<int>> with M {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        abstract class A @15
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @17
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class C @57
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          supertype: A<List<int>>
+          mixins
+            M<int>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              superConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::A::@constructor::new
+                substitution: {T: List<int>}
+      mixins
+        mixin M @29
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @31
+              defaultType: dynamic
+          superclassConstraints
+            A<List<T>>
+''');
+  }
+
+  test_mixin_inference_twoMixins() async {
+    // Both `M1` and `M2` have their type arguments inferred.
+    var library = await buildLibrary(r'''
+class I<X> {}
+mixin M1<T> on I<T> {}
+mixin M2<T> on I<T> {}
+class A = I<int> with M1, M2;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class I @6
+          reference: <testLibraryFragment>::@class::I
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant X @8
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::I::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::I
+        class alias A @66
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          supertype: I<int>
+          mixins
+            M1<int>
+            M2<int>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: <testLibraryFragment>::@class::I::@constructor::new
+              superConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::I::@constructor::new
+                substitution: {X: int}
+      mixins
+        mixin M1 @20
+          reference: <testLibraryFragment>::@mixin::M1
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @23
+              defaultType: dynamic
+          superclassConstraints
+            I<T>
+        mixin M2 @43
+          reference: <testLibraryFragment>::@mixin::M2
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @46
+              defaultType: dynamic
+          superclassConstraints
+            I<T>
+''');
+  }
+
+  test_mixin_inference_viaTypeAlias() async {
+    var library = await buildLibrary(r'''
+mixin M<T, U> on S<T> {}
+
+typedef M2<T2> = M<T2, int>;
+
+class S<T3> {}
+
+class X extends S<String> with M2 {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class S @62
+          reference: <testLibraryFragment>::@class::S
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T3 @64
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::S::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::S
+        class X @78
+          reference: <testLibraryFragment>::@class::X
+          enclosingElement: <testLibraryFragment>
+          supertype: S<String>
+          mixins
+            M<String, int>
+              alias: <testLibraryFragment>::@typeAlias::M2
+                typeArguments
+                  String
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::X::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::X
+              superConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::S::@constructor::new
+                substitution: {T3: String}
+      mixins
+        mixin M @6
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+            covariant U @11
+              defaultType: dynamic
+          superclassConstraints
+            S<T>
+      typeAliases
+        M2 @34
+          reference: <testLibraryFragment>::@typeAlias::M2
+          typeParameters
+            covariant T2 @37
+              defaultType: dynamic
+          aliasedType: M<T2, int>
+''');
+  }
+
+  test_mixin_inference_viaTypeAlias2() async {
+    var library = await buildLibrary(r'''
+mixin M<T, U> on S<T> {}
+
+typedef M2<T2> = M<T2, int>;
+
+typedef M3<T3> = M2<T3>;
+
+class S<T4> {}
+
+class X extends S<String> with M3 {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class S @88
+          reference: <testLibraryFragment>::@class::S
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T4 @90
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::S::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::S
+        class X @104
+          reference: <testLibraryFragment>::@class::X
+          enclosingElement: <testLibraryFragment>
+          supertype: S<String>
+          mixins
+            M<String, int>
+              alias: <testLibraryFragment>::@typeAlias::M3
+                typeArguments
+                  String
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::X::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::X
+              superConstructor: ConstructorMember
+                base: <testLibraryFragment>::@class::S::@constructor::new
+                substitution: {T4: String}
+      mixins
+        mixin M @6
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+            covariant U @11
+              defaultType: dynamic
+          superclassConstraints
+            S<T>
+      typeAliases
+        M2 @34
+          reference: <testLibraryFragment>::@typeAlias::M2
+          typeParameters
+            covariant T2 @37
+              defaultType: dynamic
+          aliasedType: M<T2, int>
+        M3 @64
+          reference: <testLibraryFragment>::@typeAlias::M3
+          typeParameters
+            covariant T3 @67
+              defaultType: dynamic
+          aliasedType: M<T3, int>
+            alias: <testLibraryFragment>::@typeAlias::M2
+              typeArguments
+                T3
+''');
+  }
+
+  test_mixin_interfaces_extensionType() async {
+    var library = await buildLibrary(r'''
+class A {}
+extension type B(int it) {}
+class C {}
+mixin M implements A, B, C {}
+''');
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+        class C @45
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+      extensionTypes
+        B @26
+          reference: <testLibraryFragment>::@extensionType::B
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::B::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::B::@constructor::new
+          typeErasure: int
+          fields
+            final it @32
+              reference: <testLibraryFragment>::@extensionType::B::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::B::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              returnType: int
+      mixins
+        mixin M @56
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+          interfaces
+            A
+            C
+''');
+  }
+
+  test_mixin_method_invokesSuperSelf() async {
+    var library = await buildLibrary(r'''
+mixin M on A {
+  void foo() {
+    super.foo();
+  }
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin M @6
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+          methods
+            foo @22 invokesSuperSelf
+              reference: <testLibraryFragment>::@mixin::M::@method::foo
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              returnType: void
+''');
+  }
+
+  test_mixin_method_namedAsConstraint() async {
+    var library = await buildLibrary(r'''
+class A {}
+mixin B on A {
+  void A() {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+      mixins
+        mixin B @17
+          reference: <testLibraryFragment>::@mixin::B
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            A
+          methods
+            A @33
+              reference: <testLibraryFragment>::@mixin::B::@method::A
+              enclosingElement: <testLibraryFragment>::@mixin::B
+              returnType: void
+''');
+  }
+
+  test_mixin_setter_invokesSuperSelf_getter() async {
+    var library = await buildLibrary(r'''
+mixin M on A {
+  set foo(int _) {
+    super.foo;
+  }
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin M @6
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@mixin::M::@field::foo
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              type: int
+          accessors
+            set foo= @21
+              reference: <testLibraryFragment>::@mixin::M::@setter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              parameters
+                requiredPositional _ @29
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_mixin_setter_invokesSuperSelf_setter() async {
+    var library = await buildLibrary(r'''
+mixin M on A {
+  set foo(int _) {
+    super.foo = 0;
+  }
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin M @6
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@mixin::M::@field::foo
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              type: int
+          accessors
+            set foo= @21 invokesSuperSelf
+              reference: <testLibraryFragment>::@mixin::M::@setter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              parameters
+                requiredPositional _ @29
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_mixin_superclassConstraints_extensionType() async {
+    var library = await buildLibrary(r'''
+class A {}
+extension type B(int it) {}
+class C {}
+mixin M on A, B, C {}
+''');
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+        class C @45
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+      extensionTypes
+        B @26
+          reference: <testLibraryFragment>::@extensionType::B
+          enclosingElement: <testLibraryFragment>
+          representation: <testLibraryFragment>::@extensionType::B::@field::it
+          primaryConstructor: <testLibraryFragment>::@extensionType::B::@constructor::new
+          typeErasure: int
+          fields
+            final it @32
+              reference: <testLibraryFragment>::@extensionType::B::@field::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              type: int
+          accessors
+            synthetic get it @-1
+              reference: <testLibraryFragment>::@extensionType::B::@getter::it
+              enclosingElement: <testLibraryFragment>::@extensionType::B
+              returnType: int
+      mixins
+        mixin M @56
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            A
+            C
+''');
+  }
+
+  test_mixin_typeParameters_variance_contravariant() async {
+    var library = await buildLibrary('mixin M<in T> {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin M @6
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            contravariant T @11
+              defaultType: dynamic
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_mixin_typeParameters_variance_covariant() async {
+    var library = await buildLibrary('mixin M<out T> {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin M @6
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @12
+              defaultType: dynamic
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_mixin_typeParameters_variance_invariant() async {
+    var library = await buildLibrary('mixin M<inout T> {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin M @6
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            invariant T @14
+              defaultType: dynamic
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_mixin_typeParameters_variance_multiple() async {
+    var library = await buildLibrary('mixin M<inout T, in U, out V> {}');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin M @6
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            invariant T @14
+              defaultType: dynamic
+            contravariant U @20
+              defaultType: dynamic
+            covariant V @27
+              defaultType: dynamic
+          superclassConstraints
+            Object
+''');
+  }
+}
+
+abstract class MixinElementTest_augmentation extends ElementsBaseTest {
+  test_allSupertypes() async {
+    var library = await buildLibrary(r'''
+mixin M {}
+class A with M {}
+''');
+
+    configuration
+      ..withAllSupertypes = true
+      ..withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @17
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          supertype: Object
+          mixins
+            M
+          allSupertypes
+            M
+            Object
+      mixins
+        mixin M @6
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+          allSupertypes
+            Object
+''');
+  }
+
+  test_allSupertypes_hasSuperclassConstraints() async {
+    var library = await buildLibrary(r'''
+class A {}
+mixin M on A {}
+class B with M {}
+''');
+
+    configuration
+      ..withAllSupertypes = true
+      ..withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          allSupertypes
+            Object
+        class B @33
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          supertype: Object
+          mixins
+            M
+          allSupertypes
+            A
+            M
+            Object
+      mixins
+        mixin M @17
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            A
+          allSupertypes
+            A
+            Object
+''');
+  }
+
+  test_augmentationTarget() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+import augment 'b.dart';
+augment mixin A {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'a.dart';
+augment mixin A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A {}
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+      augmentationImports
+        package:test/b.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+          reference: <testLibrary>::@augmentation::package:test/b.dart
+          definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          augmented
+            superclassConstraints
+              Object
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @68
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+      mixins
+        augment mixin A @40
+          reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+  exportedReferences
+    declared <testLibraryFragment>::@mixin::A
+  exportNamespace
+    A: <testLibraryFragment>::@mixin::A
+''');
+  }
+
+  test_augmentationTarget_augmentationThenDeclaration() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+
+augment class A {
+  void foo1() {}
+}
+
+class A {
+  void foo2() {}
+}
+
+augment class A {
+  void foo3() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @44
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::0
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::0::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::0
+          methods
+            foo1 @55
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::0::@method::foo1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::0
+              returnType: void
+        class A @74
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::1
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::A::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::A
+          methods
+            foo2 @85
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::A::@method::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::A
+              returnType: void
+          augmented
+            constructors
+              <testLibrary>::@fragment::package:test/a.dart::@class::A::@constructor::new
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@class::A::@method::foo2
+              <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::1::@method::foo3
+        augment class A @112
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::1
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@class::A
+          methods
+            foo3 @123
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::1::@method::foo3
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@def::1
+              returnType: void
+''');
+  }
+
+  test_augmentationTarget_no2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+import augment 'b.dart';
+augment mixin A {
+  void foo1() {}
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'a.dart';
+augment mixin A {
+  void foo2() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin B {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+      augmentationImports
+        package:test/b.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+          reference: <testLibrary>::@augmentation::package:test/b.dart
+          definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin B @31
+          reference: <testLibraryFragment>::@mixin::B
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @68
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          methods
+            foo1 @79
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@method::foo1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              returnType: void
+          augmented
+            superclassConstraints
+              Object
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@method::foo1
+              <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A::@method::foo2
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+      mixins
+        augment mixin A @40
+          reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          methods
+            foo2 @51
+              reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A::@method::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+              returnType: void
+''');
+  }
+
+  test_augmented_field_augment_field() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A {
+  augment int foo = 1;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A {
+  int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          fields
+            foo @41
+              reference: <testLibraryFragment>::@mixin::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@fieldAugmentation::foo
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@mixin::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@mixin::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            superclassConstraints
+              Object
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@fieldAugmentation::foo
+            accessors
+              <testLibraryFragment>::@mixin::A::@getter::foo
+              <testLibraryFragment>::@mixin::A::@setter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          fields
+            augment foo @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              augmentationTarget: <testLibraryFragment>::@mixin::A::@field::foo
+''');
+  }
+
+  test_augmented_field_augment_field2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A {
+  augment int foo = 1;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment mixin A {
+  augment int foo = 2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+mixin A {
+  int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @56
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          fields
+            foo @66
+              reference: <testLibraryFragment>::@mixin::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@fieldAugmentation::foo
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@mixin::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@mixin::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            superclassConstraints
+              Object
+            fields
+              <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A::@fieldAugmentation::foo
+            accessors
+              <testLibraryFragment>::@mixin::A::@getter::foo
+              <testLibraryFragment>::@mixin::A::@setter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+          fields
+            augment foo @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              augmentationTarget: <testLibraryFragment>::@mixin::A::@field::foo
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A::@fieldAugmentation::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          fields
+            augment foo @61
+              reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_2
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@fieldAugmentation::foo
+''');
+  }
+
+  test_augmented_field_augment_field_afterGetter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A {
+  augment int get foo => 1;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment mixin A {
+  augment int foo = 2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+mixin A {
+  int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @56
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          fields
+            foo @66
+              reference: <testLibraryFragment>::@mixin::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A::@fieldAugmentation::foo
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@mixin::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@getterAugmentation::foo
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@mixin::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            superclassConstraints
+              Object
+            fields
+              <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A::@fieldAugmentation::foo
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@getterAugmentation::foo
+              <testLibraryFragment>::@mixin::A::@setter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              returnType: int
+              id: getter_1
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@mixin::A::@getter::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          fields
+            augment foo @61
+              reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              augmentationTarget: <testLibraryFragment>::@mixin::A::@field::foo
+''');
+  }
+
+  test_augmented_field_augment_field_afterSetter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A {
+  augment set foo(int _) {}
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment mixin A {
+  augment int foo = 2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+mixin A {
+  int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @56
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          fields
+            foo @66
+              reference: <testLibraryFragment>::@mixin::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A::@fieldAugmentation::foo
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@mixin::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@mixin::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@setterAugmentation::foo
+          augmented
+            superclassConstraints
+              Object
+            fields
+              <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A::@fieldAugmentation::foo
+            accessors
+              <testLibraryFragment>::@mixin::A::@getter::foo
+              <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@setterAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+          accessors
+            augment set foo= @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@setterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              parameters
+                requiredPositional _ @69
+                  type: int
+              returnType: void
+              id: setter_1
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@mixin::A::@setter::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          fields
+            augment foo @61
+              reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              augmentationTarget: <testLibraryFragment>::@mixin::A::@field::foo
+''');
+  }
+
+  test_augmented_field_augment_field_differentTypes() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A {
+  augment double foo = 1.2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A {
+  int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          fields
+            foo @41
+              reference: <testLibraryFragment>::@mixin::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@fieldAugmentation::foo
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@mixin::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@mixin::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            superclassConstraints
+              Object
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@fieldAugmentation::foo
+            accessors
+              <testLibraryFragment>::@mixin::A::@getter::foo
+              <testLibraryFragment>::@mixin::A::@setter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          fields
+            augment foo @64
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              type: double
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              augmentationTarget: <testLibraryFragment>::@mixin::A::@field::foo
+''');
+  }
+
+  /// This is not allowed by the specification, but allowed syntactically,
+  /// so we need a way to handle it.
+  test_augmented_field_augment_getter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A {
+  augment int foo = 1;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A {
+  int get foo => 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@mixin::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              type: int
+              id: field_0
+              getter: getter_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@fieldAugmentation::foo
+          accessors
+            get foo @45
+              reference: <testLibraryFragment>::@mixin::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+          augmented
+            superclassConstraints
+              Object
+            fields
+              <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@fieldAugmentation::foo
+            accessors
+              <testLibraryFragment>::@mixin::A::@getter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          fields
+            augment foo @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@fieldAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              augmentationTarget: <testLibraryFragment>::@mixin::A::@field::foo
+''');
+  }
+
+  test_augmented_fields_add() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A {
+  int foo2 = 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A {
+  int foo1 = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          fields
+            foo1 @41
+              reference: <testLibraryFragment>::@mixin::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+          accessors
+            synthetic get foo1 @-1
+              reference: <testLibraryFragment>::@mixin::A::@getter::foo1
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic set foo1= @-1
+              reference: <testLibraryFragment>::@mixin::A::@setter::foo1
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              parameters
+                requiredPositional _foo1 @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            superclassConstraints
+              Object
+            fields
+              <testLibraryFragment>::@mixin::A::@field::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@field::foo2
+            accessors
+              <testLibraryFragment>::@mixin::A::@getter::foo1
+              <testLibraryFragment>::@mixin::A::@setter::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@getter::foo2
+              <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@setter::foo2
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          fields
+            foo2 @53
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@field::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_1
+              getter: getter_1
+              setter: setter_1
+          accessors
+            synthetic get foo2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@getter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              returnType: int
+              id: getter_1
+              variable: field_1
+            synthetic set foo2= @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@setter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              parameters
+                requiredPositional _foo2 @-1
+                  type: int
+              returnType: void
+              id: setter_1
+              variable: field_1
+''');
+  }
+
+  test_augmented_fields_add_generic() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A<T2> {
+  T2 foo2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A<T1> {
+  T1 foo1;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T1 @33
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          fields
+            foo1 @44
+              reference: <testLibraryFragment>::@mixin::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              type: T1
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+          accessors
+            synthetic get foo1 @-1
+              reference: <testLibraryFragment>::@mixin::A::@getter::foo1
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: T1
+              id: getter_0
+              variable: field_0
+            synthetic set foo1= @-1
+              reference: <testLibraryFragment>::@mixin::A::@setter::foo1
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              parameters
+                requiredPositional _foo1 @-1
+                  type: T1
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            superclassConstraints
+              Object
+            fields
+              <testLibraryFragment>::@mixin::A::@field::foo1
+              FieldMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@field::foo2
+                augmentationSubstitution: {T2: T1}
+            accessors
+              <testLibraryFragment>::@mixin::A::@getter::foo1
+              <testLibraryFragment>::@mixin::A::@setter::foo1
+              PropertyAccessorMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@getter::foo2
+                augmentationSubstitution: {T2: T1}
+              PropertyAccessorMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@setter::foo2
+                augmentationSubstitution: {T2: T1}
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @45
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          fields
+            foo2 @56
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@field::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              type: T2
+              id: field_1
+              getter: getter_1
+              setter: setter_1
+          accessors
+            synthetic get foo2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@getter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              returnType: T2
+              id: getter_1
+              variable: field_1
+            synthetic set foo2= @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@setter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              parameters
+                requiredPositional _foo2 @-1
+                  type: T2
+              returnType: void
+              id: setter_1
+              variable: field_1
+''');
+  }
+
+  test_augmented_getters_add() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A {
+  int get foo2 => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A {
+  int get foo1 => 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          fields
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@mixin::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              type: int
+              id: field_0
+              getter: getter_0
+          accessors
+            get foo1 @45
+              reference: <testLibraryFragment>::@mixin::A::@getter::foo1
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+          augmented
+            superclassConstraints
+              Object
+            fields
+              <testLibraryFragment>::@mixin::A::@field::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@field::foo2
+            accessors
+              <testLibraryFragment>::@mixin::A::@getter::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@getter::foo2
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          fields
+            synthetic foo2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@field::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              type: int
+              id: field_1
+              getter: getter_1
+          accessors
+            get foo2 @57
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@getter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              returnType: int
+              id: getter_1
+              variable: field_1
+''');
+  }
+
+  test_augmented_getters_add_generic() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A<T2> {
+  T2 get foo2;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A<T1> {
+  T1 get foo1;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T1 @33
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          fields
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@mixin::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              type: T1
+              id: field_0
+              getter: getter_0
+          accessors
+            abstract get foo1 @48
+              reference: <testLibraryFragment>::@mixin::A::@getter::foo1
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: T1
+              id: getter_0
+              variable: field_0
+          augmented
+            superclassConstraints
+              Object
+            fields
+              <testLibraryFragment>::@mixin::A::@field::foo1
+              FieldMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@field::foo2
+                augmentationSubstitution: {T2: T1}
+            accessors
+              <testLibraryFragment>::@mixin::A::@getter::foo1
+              PropertyAccessorMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@getter::foo2
+                augmentationSubstitution: {T2: T1}
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @45
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          fields
+            synthetic foo2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@field::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              type: T2
+              id: field_1
+              getter: getter_1
+          accessors
+            abstract get foo2 @60
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@getter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              returnType: T2
+              id: getter_1
+              variable: field_1
+''');
+  }
+
+  test_augmented_getters_augment_field() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A {
+  augment int get foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A {
+  int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          fields
+            foo @41
+              reference: <testLibraryFragment>::@mixin::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@mixin::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@getterAugmentation::foo
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@mixin::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            superclassConstraints
+              Object
+            fields
+              <testLibraryFragment>::@mixin::A::@field::foo
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@getterAugmentation::foo
+              <testLibraryFragment>::@mixin::A::@setter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              returnType: int
+              id: getter_1
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@mixin::A::@getter::foo
+''');
+  }
+
+  test_augmented_getters_augment_field2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A {
+  augment int get foo => 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment mixin A {
+  augment int get foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+mixin A {
+  int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @56
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          fields
+            foo @66
+              reference: <testLibraryFragment>::@mixin::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@mixin::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@getterAugmentation::foo
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@mixin::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            superclassConstraints
+              Object
+            fields
+              <testLibraryFragment>::@mixin::A::@field::foo
+            accessors
+              <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A::@getterAugmentation::foo
+              <testLibraryFragment>::@mixin::A::@setter::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              returnType: int
+              id: getter_1
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@mixin::A::@getter::foo
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A::@getterAugmentation::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+              returnType: int
+              id: getter_2
+              variable: field_0
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@getterAugmentation::foo
+''');
+  }
+
+  test_augmented_getters_augment_getter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A {
+  augment int get foo1 => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A {
+  int get foo1 => 0;
+  int get foo2 => 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          fields
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@mixin::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              type: int
+              id: field_0
+              getter: getter_0
+            synthetic foo2 @-1
+              reference: <testLibraryFragment>::@mixin::A::@field::foo2
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              type: int
+              id: field_1
+              getter: getter_1
+          accessors
+            get foo1 @45
+              reference: <testLibraryFragment>::@mixin::A::@getter::foo1
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@getterAugmentation::foo1
+            get foo2 @66
+              reference: <testLibraryFragment>::@mixin::A::@getter::foo2
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: int
+              id: getter_1
+              variable: field_1
+          augmented
+            superclassConstraints
+              Object
+            fields
+              <testLibraryFragment>::@mixin::A::@field::foo1
+              <testLibraryFragment>::@mixin::A::@field::foo2
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@getterAugmentation::foo1
+              <testLibraryFragment>::@mixin::A::@getter::foo2
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          accessors
+            augment get foo1 @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@getterAugmentation::foo1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              returnType: int
+              id: getter_2
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@mixin::A::@getter::foo1
+''');
+  }
+
+  test_augmented_getters_augment_getter2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A {
+  augment int get foo => 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment mixin A {
+  augment int get foo => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+mixin A {
+  int get foo => 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @56
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@mixin::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              type: int
+              id: field_0
+              getter: getter_0
+          accessors
+            get foo @70
+              reference: <testLibraryFragment>::@mixin::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@getterAugmentation::foo
+          augmented
+            superclassConstraints
+              Object
+            fields
+              <testLibraryFragment>::@mixin::A::@field::foo
+            accessors
+              <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A::@getterAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              returnType: int
+              id: getter_1
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@mixin::A::@getter::foo
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A::@getterAugmentation::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          accessors
+            augment get foo @65
+              reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A::@getterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+              returnType: int
+              id: getter_2
+              variable: field_0
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@getterAugmentation::foo
+''');
+  }
+
+  test_augmented_interfaces() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A implements I2 {}
+class I2 {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A implements I1 {}
+class I1 {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class I1 @56
+          reference: <testLibraryFragment>::@class::I1
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::I1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::I1
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          interfaces
+            I1
+          augmented
+            superclassConstraints
+              Object
+            interfaces
+              I1
+              I2
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class I2 @68
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          interfaces
+            I2
+''');
+  }
+
+  test_augmented_interfaces_chain() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+import augment 'b.dart';
+augment mixin A implements I2 {}
+class I2 {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'a.dart';
+augment mixin A implements I3 {}
+class I3 {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A implements I1 {}
+class I1 {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+      augmentationImports
+        package:test/b.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+          reference: <testLibrary>::@augmentation::package:test/b.dart
+          definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class I1 @56
+          reference: <testLibraryFragment>::@class::I1
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::I1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::I1
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          interfaces
+            I1
+          augmented
+            superclassConstraints
+              Object
+            interfaces
+              I1
+              I2
+              I3
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class I2 @93
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+      mixins
+        augment mixin A @68
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+          interfaces
+            I2
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+      classes
+        class I3 @65
+          reference: <testLibrary>::@fragment::package:test/b.dart::@class::I3
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/b.dart::@class::I3::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@class::I3
+      mixins
+        augment mixin A @40
+          reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          interfaces
+            I3
+''');
+  }
+
+  test_augmented_methods() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A {
+  void bar() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A {
+  void foo() {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          methods
+            foo @42
+              reference: <testLibraryFragment>::@mixin::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: void
+          augmented
+            superclassConstraints
+              Object
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@method::bar
+              <testLibraryFragment>::@mixin::A::@method::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          methods
+            bar @54
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@method::bar
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              returnType: void
+''');
+  }
+
+  test_augmented_methods_augment() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A {
+  augment void foo1() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A {
+  void foo1() {}
+  void foo2() {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          methods
+            foo1 @42
+              reference: <testLibraryFragment>::@mixin::A::@method::foo1
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: void
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@methodAugmentation::foo1
+            foo2 @59
+              reference: <testLibraryFragment>::@mixin::A::@method::foo2
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: void
+          augmented
+            superclassConstraints
+              Object
+            methods
+              <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@methodAugmentation::foo1
+              <testLibraryFragment>::@mixin::A::@method::foo2
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          methods
+            augment foo1 @62
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@methodAugmentation::foo1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              returnType: void
+              augmentationTarget: <testLibraryFragment>::@mixin::A::@method::foo1
+''');
+  }
+
+  test_augmented_methods_augment2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+import augment 'b.dart';
+augment mixin A {
+  augment void foo() {}
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'a.dart';
+augment mixin A {
+  augment void foo() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A {
+  void foo() {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+      augmentationImports
+        package:test/b.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+          reference: <testLibrary>::@augmentation::package:test/b.dart
+          definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          methods
+            foo @42
+              reference: <testLibraryFragment>::@mixin::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: void
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@methodAugmentation::foo
+          augmented
+            superclassConstraints
+              Object
+            methods
+              <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A::@methodAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @68
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+          methods
+            augment foo @87
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              returnType: void
+              augmentationTarget: <testLibraryFragment>::@mixin::A::@method::foo
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A::@methodAugmentation::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+      mixins
+        augment mixin A @40
+          reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          methods
+            augment foo @59
+              reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+              returnType: void
+              augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@methodAugmentation::foo
+''');
+  }
+
+  test_augmented_methods_generic() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A<T2> {
+  T2 bar() => throw 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A<T> {
+  T foo() => throw 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @33
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          methods
+            foo @42
+              reference: <testLibraryFragment>::@mixin::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: T
+          augmented
+            superclassConstraints
+              Object
+            methods
+              MethodMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@method::bar
+                augmentationSubstitution: {T2: T}
+              <testLibraryFragment>::@mixin::A::@method::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @45
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          methods
+            bar @56
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@method::bar
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              returnType: T2
+''');
+  }
+
+  test_augmented_methods_generic_augment() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A<T2> {
+  augment T2 foo() => throw 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A<T> {
+  T foo() => throw 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @33
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          methods
+            foo @42
+              reference: <testLibraryFragment>::@mixin::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: T
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@methodAugmentation::foo
+          augmented
+            superclassConstraints
+              Object
+            methods
+              MethodMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@methodAugmentation::foo
+                augmentationSubstitution: {T2: T}
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @45
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          methods
+            augment foo @64
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              returnType: T2
+              augmentationTarget: <testLibraryFragment>::@mixin::A::@method::foo
+''');
+  }
+
+  test_augmented_methods_typeParameterCountMismatch() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A<T> {
+  augment void foo() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A {
+  void foo() {}
+  void bar() {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          methods
+            foo @42
+              reference: <testLibraryFragment>::@mixin::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: void
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@methodAugmentation::foo
+            bar @58
+              reference: <testLibraryFragment>::@mixin::A::@method::bar
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: void
+          augmented
+            superclassConstraints
+              Object
+            methods
+              <testLibraryFragment>::@mixin::A::@method::bar
+              MethodMember
+                base: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@methodAugmentation::foo
+                augmentationSubstitution: {T: InvalidType}
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T @45
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          methods
+            augment foo @65
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              returnType: void
+              augmentationTarget: <testLibraryFragment>::@mixin::A::@method::foo
+''');
+  }
+
+  test_augmented_setters_add() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A {
+  set foo2(int _) {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A {
+  set foo1(int _) {}
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          fields
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@mixin::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              type: int
+              id: field_0
+              setter: setter_0
+          accessors
+            set foo1= @41
+              reference: <testLibraryFragment>::@mixin::A::@setter::foo1
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              parameters
+                requiredPositional _ @50
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+          augmented
+            superclassConstraints
+              Object
+            fields
+              <testLibraryFragment>::@mixin::A::@field::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@field::foo2
+            accessors
+              <testLibraryFragment>::@mixin::A::@setter::foo1
+              <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@setter::foo2
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          fields
+            synthetic foo2 @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@field::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              type: int
+              id: field_1
+              setter: setter_1
+          accessors
+            set foo2= @53
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@setter::foo2
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              parameters
+                requiredPositional _ @62
+                  type: int
+              returnType: void
+              id: setter_1
+              variable: field_1
+''');
+  }
+
+  test_augmented_setters_augment_field() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A {
+  augment set foo(int _) {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A {
+  int foo = 0;
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          fields
+            foo @41
+              reference: <testLibraryFragment>::@mixin::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+              id: field_0
+              getter: getter_0
+              setter: setter_0
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@mixin::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              returnType: int
+              id: getter_0
+              variable: field_0
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@mixin::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@setterAugmentation::foo
+          augmented
+            superclassConstraints
+              Object
+            fields
+              <testLibraryFragment>::@mixin::A::@field::foo
+            accessors
+              <testLibraryFragment>::@mixin::A::@getter::foo
+              <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@setterAugmentation::foo
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          accessors
+            augment set foo= @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@setterAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              parameters
+                requiredPositional _ @69
+                  type: int
+              returnType: void
+              id: setter_1
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@mixin::A::@setter::foo
+''');
+  }
+
+  test_augmented_setters_augment_setter() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A {
+  augment set foo1(int _) {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A {
+  set foo1(int _) {}
+  set foo2(int _) {}
+}
+''');
+
+    configuration.withPropertyLinking = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          fields
+            synthetic foo1 @-1
+              reference: <testLibraryFragment>::@mixin::A::@field::foo1
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              type: int
+              id: field_0
+              setter: setter_0
+            synthetic foo2 @-1
+              reference: <testLibraryFragment>::@mixin::A::@field::foo2
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              type: int
+              id: field_1
+              setter: setter_1
+          accessors
+            set foo1= @41
+              reference: <testLibraryFragment>::@mixin::A::@setter::foo1
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              parameters
+                requiredPositional _ @50
+                  type: int
+              returnType: void
+              id: setter_0
+              variable: field_0
+              augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@setterAugmentation::foo1
+            set foo2= @62
+              reference: <testLibraryFragment>::@mixin::A::@setter::foo2
+              enclosingElement: <testLibraryFragment>::@mixin::A
+              parameters
+                requiredPositional _ @71
+                  type: int
+              returnType: void
+              id: setter_1
+              variable: field_1
+          augmented
+            superclassConstraints
+              Object
+            fields
+              <testLibraryFragment>::@mixin::A::@field::foo1
+              <testLibraryFragment>::@mixin::A::@field::foo2
+            accessors
+              <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@setterAugmentation::foo1
+              <testLibraryFragment>::@mixin::A::@setter::foo2
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          accessors
+            augment set foo1= @61
+              reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A::@setterAugmentation::foo1
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+              parameters
+                requiredPositional _ @70
+                  type: int
+              returnType: void
+              id: setter_2
+              variable: field_0
+              augmentationTarget: <testLibraryFragment>::@mixin::A::@setter::foo1
+''');
+  }
+
+  test_augmented_superclassConstraints() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A on B2 {}
+class B2 {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A on B1 {}
+class B1 {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class B1 @48
+          reference: <testLibraryFragment>::@class::B1
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B1
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            B1
+          augmented
+            superclassConstraints
+              B1
+              B2
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class B2 @60
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::B2
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::B2::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::B2
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          superclassConstraints
+            B2
+''');
+  }
+
+  test_augmented_superclassConstraints_chain() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+import augment 'b.dart';
+augment mixin A on I2 {}
+class I2 {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'a.dart';
+augment mixin A on I3 {}
+class I3 {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A on I1 {}
+class I1 {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+      augmentationImports
+        package:test/b.dart
+          enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+          reference: <testLibrary>::@augmentation::package:test/b.dart
+          definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class I1 @48
+          reference: <testLibraryFragment>::@class::I1
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::I1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::I1
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            I1
+          augmented
+            superclassConstraints
+              I1
+              I2
+              I3
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class I2 @85
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+      mixins
+        augment mixin A @68
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+          superclassConstraints
+            I2
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+      classes
+        class I3 @57
+          reference: <testLibrary>::@fragment::package:test/b.dart::@class::I3
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/b.dart::@class::I3::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@class::I3
+      mixins
+        augment mixin A @40
+          reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            I3
+''');
+  }
+
+  test_augmented_superclassConstraints_fromAugmentation() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A on B {}
+class B {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          augmented
+            superclassConstraints
+              B
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class B @59
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::B
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::B::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::B
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          superclassConstraints
+            B
+''');
+  }
+
+  test_augmented_superclassConstraints_generic() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A<T2> on I2<T2> {}
+class I2<E> {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A<T> on I1 {}
+class I1 {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class I1 @51
+          reference: <testLibraryFragment>::@class::I1
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::I1::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::I1
+      mixins
+        mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @33
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            I1
+          augmented
+            superclassConstraints
+              I1
+              I2<T>
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class I2 @68
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant E @71
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::I2::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::I2
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T2 @45
+              defaultType: dynamic
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+          superclassConstraints
+            I2<T2>
+''');
+  }
+
+  test_augmentedBy_class2() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+
+augment class A {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+
+augment class A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+
+mixin A {}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @57
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @44
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTargetAny: <testLibraryFragment>::@mixin::A
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @44
+          reference: <testLibrary>::@fragment::package:test/b.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTargetAny: <testLibraryFragment>::@mixin::A
+''');
+  }
+
+  test_augmentedBy_class_mixin() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+
+augment class A {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+
+augment mixin A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+import augment 'b.dart';
+
+mixin A {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin A @57
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          augmented
+            superclassConstraints
+              Object
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      classes
+        augment class A @44
+          reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTargetAny: <testLibraryFragment>::@mixin::A
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@classAugmentation::A
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @44
+          reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+''');
+  }
+
+  test_inferTypes_method_ofAugment() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {
+  int foo(String a) => 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment mixin B {
+  foo(a) => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import 'a.dart';
+import augment 'b.dart';
+
+mixin B on A {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      mixins
+        mixin B @49
+          reference: <testLibraryFragment>::@mixin::B
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::B
+          superclassConstraints
+            A
+          augmented
+            superclassConstraints
+              A
+            methods
+              <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::B::@method::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin B @43
+          reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::B
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::B
+          methods
+            foo @49
+              reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::B::@method::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::B
+              parameters
+                requiredPositional a @53
+                  type: String
+              returnType: int
+''');
+  }
+
+  test_inferTypes_method_usingAugmentation_interface() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {
+  int foo(String a) => 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+import 'a.dart';
+augment mixin B implements A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'b.dart';
+
+mixin B {
+  foo(a) => 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin B @32
+          reference: <testLibraryFragment>::@mixin::B
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::B
+          superclassConstraints
+            Object
+          methods
+            foo @38
+              reference: <testLibraryFragment>::@mixin::B::@method::foo
+              enclosingElement: <testLibraryFragment>::@mixin::B
+              parameters
+                requiredPositional a @42
+                  type: String
+              returnType: int
+          augmented
+            superclassConstraints
+              Object
+            interfaces
+              A
+            methods
+              <testLibraryFragment>::@mixin::B::@method::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      mixins
+        augment mixin B @60
+          reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::B
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::B
+          interfaces
+            A
+''');
+  }
+
+  test_inferTypes_method_usingAugmentation_superclassConstraint() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {
+  int foo(String a) => 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+import 'a.dart';
+augment mixin B on A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'b.dart';
+
+mixin B {
+  foo(a) => 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin B @32
+          reference: <testLibraryFragment>::@mixin::B
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::B
+          methods
+            foo @38
+              reference: <testLibraryFragment>::@mixin::B::@method::foo
+              enclosingElement: <testLibraryFragment>::@mixin::B
+              parameters
+                requiredPositional a @42
+                  type: String
+              returnType: int
+          augmented
+            superclassConstraints
+              A
+            methods
+              <testLibraryFragment>::@mixin::B::@method::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+      mixins
+        augment mixin B @60
+          reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::B
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::B
+          superclassConstraints
+            A
+''');
+  }
+
+  test_inferTypes_method_withAugment() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {
+  int foo(String a) => 0;
+}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+augment library 'test.dart';
+augment mixin B {
+  augment foo(a) => 0;
+}
+''');
+
+    var library = await buildLibrary(r'''
+import 'a.dart';
+import augment 'b.dart';
+
+mixin B on A {
+  foo(a) => 0;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  libraryImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/b.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/b.dart
+      definingUnit: <testLibrary>::@fragment::package:test/b.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      libraryImports
+        package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+      mixins
+        mixin B @49
+          reference: <testLibraryFragment>::@mixin::B
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::B
+          superclassConstraints
+            A
+          methods
+            foo @60
+              reference: <testLibraryFragment>::@mixin::B::@method::foo
+              enclosingElement: <testLibraryFragment>::@mixin::B
+              parameters
+                requiredPositional a @64
+                  type: String
+              returnType: int
+              augmentation: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::B::@methodAugmentation::foo
+          augmented
+            superclassConstraints
+              A
+            methods
+              <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::B::@methodAugmentation::foo
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/b.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin B @43
+          reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::B
+          enclosingElement: <testLibrary>::@fragment::package:test/b.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::B
+          methods
+            augment foo @57
+              reference: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::B::@methodAugmentation::foo
+              enclosingElement: <testLibrary>::@fragment::package:test/b.dart::@mixinAugmentation::B
+              parameters
+                requiredPositional a @61
+                  type: String
+              returnType: int
+              augmentationTarget: <testLibraryFragment>::@mixin::B::@method::foo
+''');
+  }
+
+  test_modifiers_base() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment base mixin A {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+base mixin A {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        base mixin A @36
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          augmented
+            superclassConstraints
+              Object
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment base mixin A @48
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+''');
+  }
+
+  test_notAugmented_interfaces() async {
+    var library = await buildLibrary(r'''
+mixin A implements I {}
+class I {}
+''');
+
+    configuration.withAugmentedWithoutAugmentation = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class I @30
+          reference: <testLibraryFragment>::@class::I
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::I::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::I
+          augmented
+      mixins
+        mixin A @6
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+          interfaces
+            I
+          augmented
+            superclassConstraints
+              Object
+            interfaces
+              I
+''');
+  }
+
+  test_notAugmented_superclassConstraints() async {
+    var library = await buildLibrary(r'''
+mixin A on B {}
+class B {}
+''');
+
+    configuration.withAugmentedWithoutAugmentation = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class B @22
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+          augmented
+      mixins
+        mixin A @6
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            B
+          augmented
+            superclassConstraints
+              B
+''');
+  }
+
+  test_notSimplyBounded_self() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A<T extends A> {}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A<T extends A> {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  augmentationImports
+    package:test/a.dart
+      enclosingElement: <testLibrary>
+      reference: <testLibrary>::@augmentation::package:test/a.dart
+      definingUnit: <testLibrary>::@fragment::package:test/a.dart
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        notSimplyBounded mixin A @31
+          reference: <testLibraryFragment>::@mixin::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @33
+              bound: A<dynamic>
+              defaultType: dynamic
+          augmentation: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          superclassConstraints
+            Object
+          augmented
+            superclassConstraints
+              Object
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>::@augmentation::package:test/a.dart
+      enclosingElement3: <testLibraryFragment>
+      mixins
+        augment mixin A @43
+          reference: <testLibrary>::@fragment::package:test/a.dart::@mixinAugmentation::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          typeParameters
+            covariant T @45
+              bound: A<dynamic>
+              defaultType: A<dynamic>
+          augmentationTarget: <testLibraryFragment>::@mixin::A
+''');
+  }
+}
+
+@reflectiveTest
+class MixinElementTest_augmentation_fromBytes
+    extends MixinElementTest_augmentation {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class MixinElementTest_augmentation_keepLinking
+    extends MixinElementTest_augmentation {
+  @override
+  bool get keepLinkingLibraries => true;
+}
+
+@reflectiveTest
+class MixinElementTest_fromBytes extends MixinElementTest {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class MixinElementTest_keepLinking extends MixinElementTest {
+  @override
+  bool get keepLinkingLibraries => true;
+}
diff --git a/pkg/analyzer/test/src/summary/elements/non_synthetic_test.dart b/pkg/analyzer/test/src/summary/elements/non_synthetic_test.dart
new file mode 100644
index 0000000..4023faa
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/elements/non_synthetic_test.dart
@@ -0,0 +1,508 @@
+// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../dart/resolution/node_text_expectations.dart';
+import '../elements_base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NonSyntheticElementTest_keepLinking);
+    defineReflectiveTests(NonSyntheticElementTest_fromBytes);
+    defineReflectiveTests(UpdateNodeTextExpectations);
+  });
+}
+
+abstract class NonSyntheticElementTest extends ElementsBaseTest {
+  test_nonSynthetic_class_field() async {
+    var library = await buildLibrary(r'''
+class C {
+  int foo = 0;
+}
+''');
+    configuration.withNonSynthetic = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            foo @16
+              reference: <testLibraryFragment>::@class::C::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              shouldUseTypeForInitializerInference: true
+              nonSynthetic: <testLibraryFragment>::@class::C::@field::foo
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              nonSynthetic: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::C::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+              nonSynthetic: <testLibraryFragment>::@class::C::@field::foo
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+                  nonSynthetic: <testLibraryFragment>::@class::C::@field::foo
+              returnType: void
+              nonSynthetic: <testLibraryFragment>::@class::C::@field::foo
+''');
+  }
+
+  test_nonSynthetic_class_getter() async {
+    var library = await buildLibrary(r'''
+class C {
+  int get foo => 0;
+}
+''');
+    configuration.withNonSynthetic = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::C::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              nonSynthetic: <testLibraryFragment>::@class::C::@getter::foo
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              nonSynthetic: <testLibraryFragment>::@class::C
+          accessors
+            get foo @20
+              reference: <testLibraryFragment>::@class::C::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+              nonSynthetic: <testLibraryFragment>::@class::C::@getter::foo
+''');
+  }
+
+  test_nonSynthetic_class_setter() async {
+    var library = await buildLibrary(r'''
+class C {
+  set foo(int value) {}
+}
+''');
+    configuration.withNonSynthetic = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::C::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              type: int
+              nonSynthetic: <testLibraryFragment>::@class::C::@setter::foo
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              nonSynthetic: <testLibraryFragment>::@class::C
+          accessors
+            set foo= @16
+              reference: <testLibraryFragment>::@class::C::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional value @24
+                  type: int
+                  nonSynthetic: <testLibraryFragment>::@class::C::@setter::foo::@parameter::value
+              returnType: void
+              nonSynthetic: <testLibraryFragment>::@class::C::@setter::foo
+''');
+  }
+
+  test_nonSynthetic_enum() async {
+    var library = await buildLibrary(r'''
+enum E {
+  a, b
+}
+''');
+    configuration.withNonSynthetic = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      enums
+        enum E @5
+          reference: <testLibraryFragment>::@enum::E
+          enclosingElement: <testLibraryFragment>
+          supertype: Enum
+          fields
+            static const enumConstant a @11
+              reference: <testLibraryFragment>::@enum::E::@field::a
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+              nonSynthetic: <testLibraryFragment>::@enum::E::@field::a
+            static const enumConstant b @14
+              reference: <testLibraryFragment>::@enum::E::@field::b
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: E
+              shouldUseTypeForInitializerInference: false
+              constantInitializer
+                InstanceCreationExpression
+                  constructorName: ConstructorName
+                    type: NamedType
+                      name: E @-1
+                      element: <testLibraryFragment>::@enum::E
+                      type: E
+                    staticElement: <testLibraryFragment>::@enum::E::@constructor::new
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticType: E
+              nonSynthetic: <testLibraryFragment>::@enum::E::@field::b
+            synthetic static const values @-1
+              reference: <testLibraryFragment>::@enum::E::@field::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              type: List<E>
+              constantInitializer
+                ListLiteral
+                  leftBracket: [ @0
+                  elements
+                    SimpleIdentifier
+                      token: a @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::a
+                      staticType: E
+                    SimpleIdentifier
+                      token: b @-1
+                      staticElement: <testLibraryFragment>::@enum::E::@getter::b
+                      staticType: E
+                  rightBracket: ] @0
+                  staticType: List<E>
+              nonSynthetic: <testLibraryFragment>::@enum::E
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@enum::E::@constructor::new
+              enclosingElement: <testLibraryFragment>::@enum::E
+              nonSynthetic: <testLibraryFragment>::@enum::E
+          accessors
+            synthetic static get a @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::a
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+              nonSynthetic: <testLibraryFragment>::@enum::E::@field::a
+            synthetic static get b @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::b
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: E
+              nonSynthetic: <testLibraryFragment>::@enum::E::@field::b
+            synthetic static get values @-1
+              reference: <testLibraryFragment>::@enum::E::@getter::values
+              enclosingElement: <testLibraryFragment>::@enum::E
+              returnType: List<E>
+              nonSynthetic: <testLibraryFragment>::@enum::E
+''');
+  }
+
+  test_nonSynthetic_mixin_field() async {
+    var library = await buildLibrary(r'''
+mixin M {
+  int foo = 0;
+}
+''');
+    configuration.withNonSynthetic = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin M @6
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+          fields
+            foo @16
+              reference: <testLibraryFragment>::@mixin::M::@field::foo
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              type: int
+              shouldUseTypeForInitializerInference: true
+              nonSynthetic: <testLibraryFragment>::@mixin::M::@field::foo
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@mixin::M::@getter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              returnType: int
+              nonSynthetic: <testLibraryFragment>::@mixin::M::@field::foo
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@mixin::M::@setter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+                  nonSynthetic: <testLibraryFragment>::@mixin::M::@field::foo
+              returnType: void
+              nonSynthetic: <testLibraryFragment>::@mixin::M::@field::foo
+''');
+  }
+
+  test_nonSynthetic_mixin_getter() async {
+    var library = await buildLibrary(r'''
+mixin M {
+  int get foo => 0;
+}
+''');
+    configuration.withNonSynthetic = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin M @6
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@mixin::M::@field::foo
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              type: int
+              nonSynthetic: <testLibraryFragment>::@mixin::M::@getter::foo
+          accessors
+            get foo @20
+              reference: <testLibraryFragment>::@mixin::M::@getter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              returnType: int
+              nonSynthetic: <testLibraryFragment>::@mixin::M::@getter::foo
+''');
+  }
+
+  test_nonSynthetic_mixin_setter() async {
+    var library = await buildLibrary(r'''
+mixin M {
+  set foo(int value) {}
+}
+''');
+    configuration.withNonSynthetic = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin M @6
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          superclassConstraints
+            Object
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@mixin::M::@field::foo
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              type: int
+              nonSynthetic: <testLibraryFragment>::@mixin::M::@setter::foo
+          accessors
+            set foo= @16
+              reference: <testLibraryFragment>::@mixin::M::@setter::foo
+              enclosingElement: <testLibraryFragment>::@mixin::M
+              parameters
+                requiredPositional value @24
+                  type: int
+                  nonSynthetic: <testLibraryFragment>::@mixin::M::@setter::foo::@parameter::value
+              returnType: void
+              nonSynthetic: <testLibraryFragment>::@mixin::M::@setter::foo
+''');
+  }
+
+  test_nonSynthetic_unit_getter() async {
+    var library = await buildLibrary(r'''
+int get foo => 0;
+''');
+    configuration.withNonSynthetic = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        synthetic static foo @-1
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          nonSynthetic: <testLibraryFragment>::@getter::foo
+      accessors
+        static get foo @8
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+          nonSynthetic: <testLibraryFragment>::@getter::foo
+''');
+  }
+
+  test_nonSynthetic_unit_getterSetter() async {
+    var library = await buildLibrary(r'''
+int get foo => 0;
+set foo(int value) {}
+''');
+    configuration.withNonSynthetic = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        synthetic static foo @-1
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          nonSynthetic: <testLibraryFragment>::@getter::foo
+      accessors
+        static get foo @8
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+          nonSynthetic: <testLibraryFragment>::@getter::foo
+        static set foo= @22
+          reference: <testLibraryFragment>::@setter::foo
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional value @30
+              type: int
+              nonSynthetic: <testLibraryFragment>::@setter::foo::@parameter::value
+          returnType: void
+          nonSynthetic: <testLibraryFragment>::@setter::foo
+''');
+  }
+
+  test_nonSynthetic_unit_setter() async {
+    var library = await buildLibrary(r'''
+set foo(int value) {}
+''');
+    configuration.withNonSynthetic = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        synthetic static foo @-1
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          nonSynthetic: <testLibraryFragment>::@setter::foo
+      accessors
+        static set foo= @4
+          reference: <testLibraryFragment>::@setter::foo
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional value @12
+              type: int
+              nonSynthetic: <testLibraryFragment>::@setter::foo::@parameter::value
+          returnType: void
+          nonSynthetic: <testLibraryFragment>::@setter::foo
+''');
+  }
+
+  test_nonSynthetic_unit_variable() async {
+    var library = await buildLibrary(r'''
+int foo = 0;
+''');
+    configuration.withNonSynthetic = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static foo @4
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+          shouldUseTypeForInitializerInference: true
+          nonSynthetic: <testLibraryFragment>::@topLevelVariable::foo
+      accessors
+        synthetic static get foo @-1
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+          nonSynthetic: <testLibraryFragment>::@topLevelVariable::foo
+        synthetic static set foo= @-1
+          reference: <testLibraryFragment>::@setter::foo
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _foo @-1
+              type: int
+              nonSynthetic: <testLibraryFragment>::@topLevelVariable::foo
+          returnType: void
+          nonSynthetic: <testLibraryFragment>::@topLevelVariable::foo
+''');
+  }
+}
+
+@reflectiveTest
+class NonSyntheticElementTest_fromBytes extends NonSyntheticElementTest {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class NonSyntheticElementTest_keepLinking extends NonSyntheticElementTest {
+  @override
+  bool get keepLinkingLibraries => true;
+}
diff --git a/pkg/analyzer/test/src/summary/elements/offsets_test.dart b/pkg/analyzer/test/src/summary/elements/offsets_test.dart
new file mode 100644
index 0000000..67578f8
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/elements/offsets_test.dart
@@ -0,0 +1,2491 @@
+// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../dart/resolution/node_text_expectations.dart';
+import '../elements_base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(OffsetsElementTest_keepLinking);
+    defineReflectiveTests(OffsetsElementTest_fromBytes);
+    defineReflectiveTests(UpdateNodeTextExpectations);
+  });
+}
+
+abstract class OffsetsElementTest extends ElementsBaseTest {
+  test_codeRange_class() async {
+    var library = await buildLibrary('''
+class Raw {}
+
+/// Comment 1.
+/// Comment 2.
+class HasDocComment {}
+
+@Object()
+class HasAnnotation {}
+
+@Object()
+/// Comment 1.
+/// Comment 2.
+class AnnotationThenComment {}
+
+/// Comment 1.
+/// Comment 2.
+@Object()
+class CommentThenAnnotation {}
+
+/// Comment 1.
+@Object()
+/// Comment 2.
+class CommentAroundAnnotation {}
+''');
+    configuration.withCodeRanges = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class Raw @6
+          reference: <testLibraryFragment>::@class::Raw
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 0
+          codeLength: 12
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::Raw::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::Raw
+        class HasDocComment @50
+          reference: <testLibraryFragment>::@class::HasDocComment
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 1.\n/// Comment 2.
+          codeOffset: 14
+          codeLength: 52
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::HasDocComment::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::HasDocComment
+        class HasAnnotation @84
+          reference: <testLibraryFragment>::@class::HasAnnotation
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @68
+              name: SimpleIdentifier
+                token: Object @69
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @75
+                rightParenthesis: ) @76
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 68
+          codeLength: 32
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::HasAnnotation::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::HasAnnotation
+        class AnnotationThenComment @148
+          reference: <testLibraryFragment>::@class::AnnotationThenComment
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 1.\n/// Comment 2.
+          metadata
+            Annotation
+              atSign: @ @102
+              name: SimpleIdentifier
+                token: Object @103
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @109
+                rightParenthesis: ) @110
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 102
+          codeLength: 70
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::AnnotationThenComment::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::AnnotationThenComment
+        class CommentThenAnnotation @220
+          reference: <testLibraryFragment>::@class::CommentThenAnnotation
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 1.\n/// Comment 2.
+          metadata
+            Annotation
+              atSign: @ @204
+              name: SimpleIdentifier
+                token: Object @205
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @211
+                rightParenthesis: ) @212
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 174
+          codeLength: 70
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::CommentThenAnnotation::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::CommentThenAnnotation
+        class CommentAroundAnnotation @292
+          reference: <testLibraryFragment>::@class::CommentAroundAnnotation
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 2.
+          metadata
+            Annotation
+              atSign: @ @261
+              name: SimpleIdentifier
+                token: Object @262
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @268
+                rightParenthesis: ) @269
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 261
+          codeLength: 57
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::CommentAroundAnnotation::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::CommentAroundAnnotation
+''');
+  }
+
+  test_codeRange_class_namedMixin() async {
+    var library = await buildLibrary('''
+class A {}
+
+class B {}
+
+class Raw = Object with A, B;
+
+/// Comment 1.
+/// Comment 2.
+class HasDocComment = Object with A, B;
+
+@Object()
+class HasAnnotation = Object with A, B;
+
+@Object()
+/// Comment 1.
+/// Comment 2.
+class AnnotationThenComment = Object with A, B;
+
+/// Comment 1.
+/// Comment 2.
+@Object()
+class CommentThenAnnotation = Object with A, B;
+
+/// Comment 1.
+@Object()
+/// Comment 2.
+class CommentAroundAnnotation = Object with A, B;
+''');
+    configuration.withCodeRanges = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 0
+          codeLength: 10
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+        class B @18
+          reference: <testLibraryFragment>::@class::B
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 12
+          codeLength: 10
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::B::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::B
+        class alias Raw @30
+          reference: <testLibraryFragment>::@class::Raw
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 24
+          codeLength: 29
+          supertype: Object
+          mixins
+            A
+            B
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@class::Raw::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::Raw
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: dart:core::<fragment>::@class::Object::@constructor::new
+        class alias HasDocComment @91
+          reference: <testLibraryFragment>::@class::HasDocComment
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 1.\n/// Comment 2.
+          codeOffset: 55
+          codeLength: 69
+          supertype: Object
+          mixins
+            A
+            B
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@class::HasDocComment::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::HasDocComment
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: dart:core::<fragment>::@class::Object::@constructor::new
+        class alias HasAnnotation @142
+          reference: <testLibraryFragment>::@class::HasAnnotation
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @126
+              name: SimpleIdentifier
+                token: Object @127
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @133
+                rightParenthesis: ) @134
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 126
+          codeLength: 49
+          supertype: Object
+          mixins
+            A
+            B
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@class::HasAnnotation::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::HasAnnotation
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: dart:core::<fragment>::@class::Object::@constructor::new
+        class alias AnnotationThenComment @223
+          reference: <testLibraryFragment>::@class::AnnotationThenComment
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 1.\n/// Comment 2.
+          metadata
+            Annotation
+              atSign: @ @177
+              name: SimpleIdentifier
+                token: Object @178
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @184
+                rightParenthesis: ) @185
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 177
+          codeLength: 87
+          supertype: Object
+          mixins
+            A
+            B
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@class::AnnotationThenComment::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::AnnotationThenComment
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: dart:core::<fragment>::@class::Object::@constructor::new
+        class alias CommentThenAnnotation @312
+          reference: <testLibraryFragment>::@class::CommentThenAnnotation
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 1.\n/// Comment 2.
+          metadata
+            Annotation
+              atSign: @ @296
+              name: SimpleIdentifier
+                token: Object @297
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @303
+                rightParenthesis: ) @304
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 266
+          codeLength: 87
+          supertype: Object
+          mixins
+            A
+            B
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@class::CommentThenAnnotation::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::CommentThenAnnotation
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: dart:core::<fragment>::@class::Object::@constructor::new
+        class alias CommentAroundAnnotation @401
+          reference: <testLibraryFragment>::@class::CommentAroundAnnotation
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 2.
+          metadata
+            Annotation
+              atSign: @ @370
+              name: SimpleIdentifier
+                token: Object @371
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @377
+                rightParenthesis: ) @378
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 370
+          codeLength: 74
+          supertype: Object
+          mixins
+            A
+            B
+          constructors
+            synthetic const @-1
+              reference: <testLibraryFragment>::@class::CommentAroundAnnotation::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::CommentAroundAnnotation
+              constantInitializers
+                SuperConstructorInvocation
+                  superKeyword: super @0
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @0
+                    rightParenthesis: ) @0
+                  staticElement: dart:core::<fragment>::@class::Object::@constructor::new
+''');
+  }
+
+  test_codeRange_constructor() async {
+    var library = await buildLibrary('''
+class C {
+  C();
+
+  C.raw() {}
+
+  /// Comment 1.
+  /// Comment 2.
+  C.hasDocComment() {}
+
+  @Object()
+  C.hasAnnotation() {}
+
+  @Object()
+  /// Comment 1.
+  /// Comment 2.
+  C.annotationThenComment() {}
+
+  /// Comment 1.
+  /// Comment 2.
+  @Object()
+  C.commentThenAnnotation() {}
+
+  /// Comment 1.
+  @Object()
+  /// Comment 2.
+  C.commentAroundAnnotation() {}
+}
+''');
+    configuration.withCodeRanges = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 0
+          codeLength: 362
+          constructors
+            @12
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              codeOffset: 12
+              codeLength: 4
+            raw @22
+              reference: <testLibraryFragment>::@class::C::@constructor::raw
+              enclosingElement: <testLibraryFragment>::@class::C
+              codeOffset: 20
+              codeLength: 10
+              periodOffset: 21
+              nameEnd: 25
+            hasDocComment @70
+              reference: <testLibraryFragment>::@class::C::@constructor::hasDocComment
+              enclosingElement: <testLibraryFragment>::@class::C
+              documentationComment: /// Comment 1.\n/// Comment 2.
+              codeOffset: 34
+              codeLength: 54
+              periodOffset: 69
+              nameEnd: 83
+            hasAnnotation @106
+              reference: <testLibraryFragment>::@class::C::@constructor::hasAnnotation
+              enclosingElement: <testLibraryFragment>::@class::C
+              metadata
+                Annotation
+                  atSign: @ @92
+                  name: SimpleIdentifier
+                    token: Object @93
+                    staticElement: dart:core::<fragment>::@class::Object
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @99
+                    rightParenthesis: ) @100
+                  element: dart:core::<fragment>::@class::Object::@constructor::new
+              codeOffset: 92
+              codeLength: 32
+              periodOffset: 105
+              nameEnd: 119
+            annotationThenComment @176
+              reference: <testLibraryFragment>::@class::C::@constructor::annotationThenComment
+              enclosingElement: <testLibraryFragment>::@class::C
+              documentationComment: /// Comment 1.\n/// Comment 2.
+              metadata
+                Annotation
+                  atSign: @ @128
+                  name: SimpleIdentifier
+                    token: Object @129
+                    staticElement: dart:core::<fragment>::@class::Object
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @135
+                    rightParenthesis: ) @136
+                  element: dart:core::<fragment>::@class::Object::@constructor::new
+              codeOffset: 128
+              codeLength: 74
+              periodOffset: 175
+              nameEnd: 197
+            commentThenAnnotation @254
+              reference: <testLibraryFragment>::@class::C::@constructor::commentThenAnnotation
+              enclosingElement: <testLibraryFragment>::@class::C
+              documentationComment: /// Comment 1.\n/// Comment 2.
+              metadata
+                Annotation
+                  atSign: @ @240
+                  name: SimpleIdentifier
+                    token: Object @241
+                    staticElement: dart:core::<fragment>::@class::Object
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @247
+                    rightParenthesis: ) @248
+                  element: dart:core::<fragment>::@class::Object::@constructor::new
+              codeOffset: 206
+              codeLength: 74
+              periodOffset: 253
+              nameEnd: 275
+            commentAroundAnnotation @332
+              reference: <testLibraryFragment>::@class::C::@constructor::commentAroundAnnotation
+              enclosingElement: <testLibraryFragment>::@class::C
+              documentationComment: /// Comment 2.
+              metadata
+                Annotation
+                  atSign: @ @301
+                  name: SimpleIdentifier
+                    token: Object @302
+                    staticElement: dart:core::<fragment>::@class::Object
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @308
+                    rightParenthesis: ) @309
+                  element: dart:core::<fragment>::@class::Object::@constructor::new
+              codeOffset: 301
+              codeLength: 59
+              periodOffset: 331
+              nameEnd: 355
+''');
+  }
+
+  test_codeRange_constructor_factory() async {
+    var library = await buildLibrary('''
+class C {
+  factory C() => throw 0;
+
+  factory C.raw() => throw 0;
+
+  /// Comment 1.
+  /// Comment 2.
+  factory C.hasDocComment() => throw 0;
+
+  @Object()
+  factory C.hasAnnotation() => throw 0;
+
+  @Object()
+  /// Comment 1.
+  /// Comment 2.
+  factory C.annotationThenComment() => throw 0;
+
+  /// Comment 1.
+  /// Comment 2.
+  @Object()
+  factory C.commentThenAnnotation() => throw 0;
+
+  /// Comment 1.
+  @Object()
+  /// Comment 2.
+  factory C.commentAroundAnnotation() => throw 0;
+}
+''');
+    configuration.withCodeRanges = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 0
+          codeLength: 483
+          constructors
+            factory @20
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+              codeOffset: 12
+              codeLength: 23
+            factory raw @49
+              reference: <testLibraryFragment>::@class::C::@constructor::raw
+              enclosingElement: <testLibraryFragment>::@class::C
+              codeOffset: 39
+              codeLength: 27
+              periodOffset: 48
+              nameEnd: 52
+            factory hasDocComment @114
+              reference: <testLibraryFragment>::@class::C::@constructor::hasDocComment
+              enclosingElement: <testLibraryFragment>::@class::C
+              documentationComment: /// Comment 1.\n/// Comment 2.
+              codeOffset: 70
+              codeLength: 71
+              periodOffset: 113
+              nameEnd: 127
+            factory hasAnnotation @167
+              reference: <testLibraryFragment>::@class::C::@constructor::hasAnnotation
+              enclosingElement: <testLibraryFragment>::@class::C
+              metadata
+                Annotation
+                  atSign: @ @145
+                  name: SimpleIdentifier
+                    token: Object @146
+                    staticElement: dart:core::<fragment>::@class::Object
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @152
+                    rightParenthesis: ) @153
+                  element: dart:core::<fragment>::@class::Object::@constructor::new
+              codeOffset: 145
+              codeLength: 49
+              periodOffset: 166
+              nameEnd: 180
+            factory annotationThenComment @254
+              reference: <testLibraryFragment>::@class::C::@constructor::annotationThenComment
+              enclosingElement: <testLibraryFragment>::@class::C
+              documentationComment: /// Comment 1.\n/// Comment 2.
+              metadata
+                Annotation
+                  atSign: @ @198
+                  name: SimpleIdentifier
+                    token: Object @199
+                    staticElement: dart:core::<fragment>::@class::Object
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @205
+                    rightParenthesis: ) @206
+                  element: dart:core::<fragment>::@class::Object::@constructor::new
+              codeOffset: 198
+              codeLength: 91
+              periodOffset: 253
+              nameEnd: 275
+            factory commentThenAnnotation @349
+              reference: <testLibraryFragment>::@class::C::@constructor::commentThenAnnotation
+              enclosingElement: <testLibraryFragment>::@class::C
+              documentationComment: /// Comment 1.\n/// Comment 2.
+              metadata
+                Annotation
+                  atSign: @ @327
+                  name: SimpleIdentifier
+                    token: Object @328
+                    staticElement: dart:core::<fragment>::@class::Object
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @334
+                    rightParenthesis: ) @335
+                  element: dart:core::<fragment>::@class::Object::@constructor::new
+              codeOffset: 293
+              codeLength: 91
+              periodOffset: 348
+              nameEnd: 370
+            factory commentAroundAnnotation @444
+              reference: <testLibraryFragment>::@class::C::@constructor::commentAroundAnnotation
+              enclosingElement: <testLibraryFragment>::@class::C
+              documentationComment: /// Comment 2.
+              metadata
+                Annotation
+                  atSign: @ @405
+                  name: SimpleIdentifier
+                    token: Object @406
+                    staticElement: dart:core::<fragment>::@class::Object
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @412
+                    rightParenthesis: ) @413
+                  element: dart:core::<fragment>::@class::Object::@constructor::new
+              codeOffset: 405
+              codeLength: 76
+              periodOffset: 443
+              nameEnd: 467
+''');
+  }
+
+  test_codeRange_extensions() async {
+    var library = await buildLibrary('''
+class A {}
+
+extension Raw on A {}
+
+/// Comment 1.
+/// Comment 2.
+extension HasDocComment on A {}
+
+@Object()
+extension HasAnnotation on A {}
+
+@Object()
+/// Comment 1.
+/// Comment 2.
+extension AnnotationThenComment on A {}
+
+/// Comment 1.
+/// Comment 2.
+@Object()
+extension CommentThenAnnotation on A {}
+
+/// Comment 1.
+@Object()
+/// Comment 2.
+extension CommentAroundAnnotation on A {}
+''');
+    configuration.withCodeRanges = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 0
+          codeLength: 10
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+      extensions
+        Raw @22
+          reference: <testLibraryFragment>::@extension::Raw
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 12
+          codeLength: 21
+          extendedType: A
+        HasDocComment @75
+          reference: <testLibraryFragment>::@extension::HasDocComment
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 1.\n/// Comment 2.
+          codeOffset: 35
+          codeLength: 61
+          extendedType: A
+        HasAnnotation @118
+          reference: <testLibraryFragment>::@extension::HasAnnotation
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @98
+              name: SimpleIdentifier
+                token: Object @99
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @105
+                rightParenthesis: ) @106
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 98
+          codeLength: 41
+          extendedType: A
+        AnnotationThenComment @191
+          reference: <testLibraryFragment>::@extension::AnnotationThenComment
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 1.\n/// Comment 2.
+          metadata
+            Annotation
+              atSign: @ @141
+              name: SimpleIdentifier
+                token: Object @142
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @148
+                rightParenthesis: ) @149
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 141
+          codeLength: 79
+          extendedType: A
+        CommentThenAnnotation @272
+          reference: <testLibraryFragment>::@extension::CommentThenAnnotation
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 1.\n/// Comment 2.
+          metadata
+            Annotation
+              atSign: @ @252
+              name: SimpleIdentifier
+                token: Object @253
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @259
+                rightParenthesis: ) @260
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 222
+          codeLength: 79
+          extendedType: A
+        CommentAroundAnnotation @353
+          reference: <testLibraryFragment>::@extension::CommentAroundAnnotation
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 2.
+          metadata
+            Annotation
+              atSign: @ @318
+              name: SimpleIdentifier
+                token: Object @319
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @325
+                rightParenthesis: ) @326
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 318
+          codeLength: 66
+          extendedType: A
+''');
+  }
+
+  test_codeRange_field() async {
+    var library = await buildLibrary('''
+class C {
+  int withInit = 1;
+
+  int withoutInit;
+
+  int multiWithInit = 2, multiWithoutInit, multiWithInit2 = 3;
+}
+''');
+    configuration.withCodeRanges = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 0
+          codeLength: 115
+          fields
+            withInit @16
+              reference: <testLibraryFragment>::@class::C::@field::withInit
+              enclosingElement: <testLibraryFragment>::@class::C
+              codeOffset: 12
+              codeLength: 16
+              type: int
+              shouldUseTypeForInitializerInference: true
+            withoutInit @37
+              reference: <testLibraryFragment>::@class::C::@field::withoutInit
+              enclosingElement: <testLibraryFragment>::@class::C
+              codeOffset: 33
+              codeLength: 15
+              type: int
+            multiWithInit @57
+              reference: <testLibraryFragment>::@class::C::@field::multiWithInit
+              enclosingElement: <testLibraryFragment>::@class::C
+              codeOffset: 53
+              codeLength: 21
+              type: int
+              shouldUseTypeForInitializerInference: true
+            multiWithoutInit @76
+              reference: <testLibraryFragment>::@class::C::@field::multiWithoutInit
+              enclosingElement: <testLibraryFragment>::@class::C
+              codeOffset: 76
+              codeLength: 16
+              type: int
+            multiWithInit2 @94
+              reference: <testLibraryFragment>::@class::C::@field::multiWithInit2
+              enclosingElement: <testLibraryFragment>::@class::C
+              codeOffset: 94
+              codeLength: 18
+              type: int
+              shouldUseTypeForInitializerInference: true
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get withInit @-1
+              reference: <testLibraryFragment>::@class::C::@getter::withInit
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set withInit= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::withInit
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _withInit @-1
+                  type: int
+              returnType: void
+            synthetic get withoutInit @-1
+              reference: <testLibraryFragment>::@class::C::@getter::withoutInit
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set withoutInit= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::withoutInit
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _withoutInit @-1
+                  type: int
+              returnType: void
+            synthetic get multiWithInit @-1
+              reference: <testLibraryFragment>::@class::C::@getter::multiWithInit
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set multiWithInit= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::multiWithInit
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _multiWithInit @-1
+                  type: int
+              returnType: void
+            synthetic get multiWithoutInit @-1
+              reference: <testLibraryFragment>::@class::C::@getter::multiWithoutInit
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set multiWithoutInit= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::multiWithoutInit
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _multiWithoutInit @-1
+                  type: int
+              returnType: void
+            synthetic get multiWithInit2 @-1
+              reference: <testLibraryFragment>::@class::C::@getter::multiWithInit2
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set multiWithInit2= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::multiWithInit2
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _multiWithInit2 @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_codeRange_field_annotations() async {
+    var library = await buildLibrary('''
+class C {
+  /// Comment 1.
+  /// Comment 2.
+  int hasDocComment, hasDocComment2;
+
+  @Object()
+  int hasAnnotation, hasAnnotation2;
+
+  @Object()
+  /// Comment 1.
+  /// Comment 2.
+  int annotationThenComment, annotationThenComment2;
+
+  /// Comment 1.
+  /// Comment 2.
+  @Object()
+  int commentThenAnnotation, commentThenAnnotation2;
+
+  /// Comment 1.
+  @Object()
+  /// Comment 2.
+  int commentAroundAnnotation, commentAroundAnnotation2;
+}
+''');
+    configuration.withCodeRanges = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 0
+          codeLength: 436
+          fields
+            hasDocComment @50
+              reference: <testLibraryFragment>::@class::C::@field::hasDocComment
+              enclosingElement: <testLibraryFragment>::@class::C
+              documentationComment: /// Comment 1.\n/// Comment 2.
+              codeOffset: 12
+              codeLength: 51
+              type: int
+            hasDocComment2 @65
+              reference: <testLibraryFragment>::@class::C::@field::hasDocComment2
+              enclosingElement: <testLibraryFragment>::@class::C
+              documentationComment: /// Comment 1.\n/// Comment 2.
+              codeOffset: 65
+              codeLength: 14
+              type: int
+            hasAnnotation @100
+              reference: <testLibraryFragment>::@class::C::@field::hasAnnotation
+              enclosingElement: <testLibraryFragment>::@class::C
+              metadata
+                Annotation
+                  atSign: @ @84
+                  name: SimpleIdentifier
+                    token: Object @85
+                    staticElement: dart:core::<fragment>::@class::Object
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @91
+                    rightParenthesis: ) @92
+                  element: dart:core::<fragment>::@class::Object::@constructor::new
+              codeOffset: 84
+              codeLength: 29
+              type: int
+            hasAnnotation2 @115
+              reference: <testLibraryFragment>::@class::C::@field::hasAnnotation2
+              enclosingElement: <testLibraryFragment>::@class::C
+              metadata
+                Annotation
+                  atSign: @ @84
+                  name: SimpleIdentifier
+                    token: Object @85
+                    staticElement: dart:core::<fragment>::@class::Object
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @91
+                    rightParenthesis: ) @92
+                  element: dart:core::<fragment>::@class::Object::@constructor::new
+              codeOffset: 115
+              codeLength: 14
+              type: int
+            annotationThenComment @184
+              reference: <testLibraryFragment>::@class::C::@field::annotationThenComment
+              enclosingElement: <testLibraryFragment>::@class::C
+              documentationComment: /// Comment 1.\n/// Comment 2.
+              metadata
+                Annotation
+                  atSign: @ @134
+                  name: SimpleIdentifier
+                    token: Object @135
+                    staticElement: dart:core::<fragment>::@class::Object
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @141
+                    rightParenthesis: ) @142
+                  element: dart:core::<fragment>::@class::Object::@constructor::new
+              codeOffset: 134
+              codeLength: 71
+              type: int
+            annotationThenComment2 @207
+              reference: <testLibraryFragment>::@class::C::@field::annotationThenComment2
+              enclosingElement: <testLibraryFragment>::@class::C
+              documentationComment: /// Comment 1.\n/// Comment 2.
+              metadata
+                Annotation
+                  atSign: @ @134
+                  name: SimpleIdentifier
+                    token: Object @135
+                    staticElement: dart:core::<fragment>::@class::Object
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @141
+                    rightParenthesis: ) @142
+                  element: dart:core::<fragment>::@class::Object::@constructor::new
+              codeOffset: 207
+              codeLength: 22
+              type: int
+            commentThenAnnotation @284
+              reference: <testLibraryFragment>::@class::C::@field::commentThenAnnotation
+              enclosingElement: <testLibraryFragment>::@class::C
+              documentationComment: /// Comment 1.\n/// Comment 2.
+              metadata
+                Annotation
+                  atSign: @ @268
+                  name: SimpleIdentifier
+                    token: Object @269
+                    staticElement: dart:core::<fragment>::@class::Object
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @275
+                    rightParenthesis: ) @276
+                  element: dart:core::<fragment>::@class::Object::@constructor::new
+              codeOffset: 234
+              codeLength: 71
+              type: int
+            commentThenAnnotation2 @307
+              reference: <testLibraryFragment>::@class::C::@field::commentThenAnnotation2
+              enclosingElement: <testLibraryFragment>::@class::C
+              documentationComment: /// Comment 1.\n/// Comment 2.
+              metadata
+                Annotation
+                  atSign: @ @268
+                  name: SimpleIdentifier
+                    token: Object @269
+                    staticElement: dart:core::<fragment>::@class::Object
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @275
+                    rightParenthesis: ) @276
+                  element: dart:core::<fragment>::@class::Object::@constructor::new
+              codeOffset: 307
+              codeLength: 22
+              type: int
+            commentAroundAnnotation @384
+              reference: <testLibraryFragment>::@class::C::@field::commentAroundAnnotation
+              enclosingElement: <testLibraryFragment>::@class::C
+              documentationComment: /// Comment 2.
+              metadata
+                Annotation
+                  atSign: @ @351
+                  name: SimpleIdentifier
+                    token: Object @352
+                    staticElement: dart:core::<fragment>::@class::Object
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @358
+                    rightParenthesis: ) @359
+                  element: dart:core::<fragment>::@class::Object::@constructor::new
+              codeOffset: 351
+              codeLength: 56
+              type: int
+            commentAroundAnnotation2 @409
+              reference: <testLibraryFragment>::@class::C::@field::commentAroundAnnotation2
+              enclosingElement: <testLibraryFragment>::@class::C
+              documentationComment: /// Comment 2.
+              metadata
+                Annotation
+                  atSign: @ @351
+                  name: SimpleIdentifier
+                    token: Object @352
+                    staticElement: dart:core::<fragment>::@class::Object
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @358
+                    rightParenthesis: ) @359
+                  element: dart:core::<fragment>::@class::Object::@constructor::new
+              codeOffset: 409
+              codeLength: 24
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          accessors
+            synthetic get hasDocComment @-1
+              reference: <testLibraryFragment>::@class::C::@getter::hasDocComment
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set hasDocComment= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::hasDocComment
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _hasDocComment @-1
+                  type: int
+              returnType: void
+            synthetic get hasDocComment2 @-1
+              reference: <testLibraryFragment>::@class::C::@getter::hasDocComment2
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set hasDocComment2= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::hasDocComment2
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _hasDocComment2 @-1
+                  type: int
+              returnType: void
+            synthetic get hasAnnotation @-1
+              reference: <testLibraryFragment>::@class::C::@getter::hasAnnotation
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set hasAnnotation= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::hasAnnotation
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _hasAnnotation @-1
+                  type: int
+              returnType: void
+            synthetic get hasAnnotation2 @-1
+              reference: <testLibraryFragment>::@class::C::@getter::hasAnnotation2
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set hasAnnotation2= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::hasAnnotation2
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _hasAnnotation2 @-1
+                  type: int
+              returnType: void
+            synthetic get annotationThenComment @-1
+              reference: <testLibraryFragment>::@class::C::@getter::annotationThenComment
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set annotationThenComment= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::annotationThenComment
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _annotationThenComment @-1
+                  type: int
+              returnType: void
+            synthetic get annotationThenComment2 @-1
+              reference: <testLibraryFragment>::@class::C::@getter::annotationThenComment2
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set annotationThenComment2= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::annotationThenComment2
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _annotationThenComment2 @-1
+                  type: int
+              returnType: void
+            synthetic get commentThenAnnotation @-1
+              reference: <testLibraryFragment>::@class::C::@getter::commentThenAnnotation
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set commentThenAnnotation= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::commentThenAnnotation
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _commentThenAnnotation @-1
+                  type: int
+              returnType: void
+            synthetic get commentThenAnnotation2 @-1
+              reference: <testLibraryFragment>::@class::C::@getter::commentThenAnnotation2
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set commentThenAnnotation2= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::commentThenAnnotation2
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _commentThenAnnotation2 @-1
+                  type: int
+              returnType: void
+            synthetic get commentAroundAnnotation @-1
+              reference: <testLibraryFragment>::@class::C::@getter::commentAroundAnnotation
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set commentAroundAnnotation= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::commentAroundAnnotation
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _commentAroundAnnotation @-1
+                  type: int
+              returnType: void
+            synthetic get commentAroundAnnotation2 @-1
+              reference: <testLibraryFragment>::@class::C::@getter::commentAroundAnnotation2
+              enclosingElement: <testLibraryFragment>::@class::C
+              returnType: int
+            synthetic set commentAroundAnnotation2= @-1
+              reference: <testLibraryFragment>::@class::C::@setter::commentAroundAnnotation2
+              enclosingElement: <testLibraryFragment>::@class::C
+              parameters
+                requiredPositional _commentAroundAnnotation2 @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_codeRange_function() async {
+    var library = await buildLibrary('''
+void raw() {}
+
+/// Comment 1.
+/// Comment 2.
+void hasDocComment() {}
+
+@Object()
+void hasAnnotation() {}
+
+@Object()
+/// Comment 1.
+/// Comment 2.
+void annotationThenComment() {}
+
+/// Comment 1.
+/// Comment 2.
+@Object()
+void commentThenAnnotation() {}
+
+/// Comment 1.
+@Object()
+/// Comment 2.
+void commentAroundAnnotation() {}
+''');
+    configuration.withCodeRanges = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        raw @5
+          reference: <testLibraryFragment>::@function::raw
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 0
+          codeLength: 13
+          returnType: void
+        hasDocComment @50
+          reference: <testLibraryFragment>::@function::hasDocComment
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 1.\n/// Comment 2.
+          codeOffset: 15
+          codeLength: 53
+          returnType: void
+        hasAnnotation @85
+          reference: <testLibraryFragment>::@function::hasAnnotation
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @70
+              name: SimpleIdentifier
+                token: Object @71
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @77
+                rightParenthesis: ) @78
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 70
+          codeLength: 33
+          returnType: void
+        annotationThenComment @150
+          reference: <testLibraryFragment>::@function::annotationThenComment
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 1.\n/// Comment 2.
+          metadata
+            Annotation
+              atSign: @ @105
+              name: SimpleIdentifier
+                token: Object @106
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @112
+                rightParenthesis: ) @113
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 105
+          codeLength: 71
+          returnType: void
+        commentThenAnnotation @223
+          reference: <testLibraryFragment>::@function::commentThenAnnotation
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 1.\n/// Comment 2.
+          metadata
+            Annotation
+              atSign: @ @208
+              name: SimpleIdentifier
+                token: Object @209
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @215
+                rightParenthesis: ) @216
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 178
+          codeLength: 71
+          returnType: void
+        commentAroundAnnotation @296
+          reference: <testLibraryFragment>::@function::commentAroundAnnotation
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 2.
+          metadata
+            Annotation
+              atSign: @ @266
+              name: SimpleIdentifier
+                token: Object @267
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @273
+                rightParenthesis: ) @274
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 266
+          codeLength: 58
+          returnType: void
+''');
+  }
+
+  test_codeRange_method() async {
+    var library = await buildLibrary('''
+class C {
+  void raw() {}
+
+  /// Comment 1.
+  /// Comment 2.
+  void hasDocComment() {}
+
+  @Object()
+  void hasAnnotation() {}
+
+  @Object()
+  /// Comment 1.
+  /// Comment 2.
+  void annotationThenComment() {}
+
+  /// Comment 1.
+  /// Comment 2.
+  @Object()
+  void commentThenAnnotation() {}
+
+  /// Comment 1.
+  @Object()
+  /// Comment 2.
+  void commentAroundAnnotation() {}
+}
+''');
+    configuration.withCodeRanges = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class C @6
+          reference: <testLibraryFragment>::@class::C
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 0
+          codeLength: 372
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::C::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::C
+          methods
+            raw @17
+              reference: <testLibraryFragment>::@class::C::@method::raw
+              enclosingElement: <testLibraryFragment>::@class::C
+              codeOffset: 12
+              codeLength: 13
+              returnType: void
+            hasDocComment @68
+              reference: <testLibraryFragment>::@class::C::@method::hasDocComment
+              enclosingElement: <testLibraryFragment>::@class::C
+              documentationComment: /// Comment 1.\n/// Comment 2.
+              codeOffset: 29
+              codeLength: 57
+              returnType: void
+            hasAnnotation @107
+              reference: <testLibraryFragment>::@class::C::@method::hasAnnotation
+              enclosingElement: <testLibraryFragment>::@class::C
+              metadata
+                Annotation
+                  atSign: @ @90
+                  name: SimpleIdentifier
+                    token: Object @91
+                    staticElement: dart:core::<fragment>::@class::Object
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @97
+                    rightParenthesis: ) @98
+                  element: dart:core::<fragment>::@class::Object::@constructor::new
+              codeOffset: 90
+              codeLength: 35
+              returnType: void
+            annotationThenComment @180
+              reference: <testLibraryFragment>::@class::C::@method::annotationThenComment
+              enclosingElement: <testLibraryFragment>::@class::C
+              documentationComment: /// Comment 1.\n/// Comment 2.
+              metadata
+                Annotation
+                  atSign: @ @129
+                  name: SimpleIdentifier
+                    token: Object @130
+                    staticElement: dart:core::<fragment>::@class::Object
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @136
+                    rightParenthesis: ) @137
+                  element: dart:core::<fragment>::@class::Object::@constructor::new
+              codeOffset: 129
+              codeLength: 77
+              returnType: void
+            commentThenAnnotation @261
+              reference: <testLibraryFragment>::@class::C::@method::commentThenAnnotation
+              enclosingElement: <testLibraryFragment>::@class::C
+              documentationComment: /// Comment 1.\n/// Comment 2.
+              metadata
+                Annotation
+                  atSign: @ @244
+                  name: SimpleIdentifier
+                    token: Object @245
+                    staticElement: dart:core::<fragment>::@class::Object
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @251
+                    rightParenthesis: ) @252
+                  element: dart:core::<fragment>::@class::Object::@constructor::new
+              codeOffset: 210
+              codeLength: 77
+              returnType: void
+            commentAroundAnnotation @342
+              reference: <testLibraryFragment>::@class::C::@method::commentAroundAnnotation
+              enclosingElement: <testLibraryFragment>::@class::C
+              documentationComment: /// Comment 2.
+              metadata
+                Annotation
+                  atSign: @ @308
+                  name: SimpleIdentifier
+                    token: Object @309
+                    staticElement: dart:core::<fragment>::@class::Object
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @315
+                    rightParenthesis: ) @316
+                  element: dart:core::<fragment>::@class::Object::@constructor::new
+              codeOffset: 308
+              codeLength: 62
+              returnType: void
+''');
+  }
+
+  test_codeRange_parameter() async {
+    var library = await buildLibrary('''
+main({int a = 1, int b, int c = 2}) {}
+''');
+    configuration.withCodeRanges = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        main @0
+          reference: <testLibraryFragment>::@function::main
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 0
+          codeLength: 38
+          parameters
+            optionalNamed default a @10
+              reference: <testLibraryFragment>::@function::main::@parameter::a
+              type: int
+              codeOffset: 6
+              codeLength: 9
+              constantInitializer
+                IntegerLiteral
+                  literal: 1 @14
+                  staticType: int
+            optionalNamed default b @21
+              reference: <testLibraryFragment>::@function::main::@parameter::b
+              type: int
+              codeOffset: 17
+              codeLength: 5
+            optionalNamed default c @28
+              reference: <testLibraryFragment>::@function::main::@parameter::c
+              type: int
+              codeOffset: 24
+              codeLength: 9
+              constantInitializer
+                IntegerLiteral
+                  literal: 2 @32
+                  staticType: int
+          returnType: dynamic
+''');
+  }
+
+  test_codeRange_parameter_annotations() async {
+    var library = await buildLibrary('''
+main(@Object() int a, int b, @Object() int c) {}
+''');
+    configuration.withCodeRanges = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        main @0
+          reference: <testLibraryFragment>::@function::main
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 0
+          codeLength: 48
+          parameters
+            requiredPositional a @19
+              type: int
+              metadata
+                Annotation
+                  atSign: @ @5
+                  name: SimpleIdentifier
+                    token: Object @6
+                    staticElement: dart:core::<fragment>::@class::Object
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @12
+                    rightParenthesis: ) @13
+                  element: dart:core::<fragment>::@class::Object::@constructor::new
+              codeOffset: 5
+              codeLength: 15
+            requiredPositional b @26
+              type: int
+              codeOffset: 22
+              codeLength: 5
+            requiredPositional c @43
+              type: int
+              metadata
+                Annotation
+                  atSign: @ @29
+                  name: SimpleIdentifier
+                    token: Object @30
+                    staticElement: dart:core::<fragment>::@class::Object
+                    staticType: null
+                  arguments: ArgumentList
+                    leftParenthesis: ( @36
+                    rightParenthesis: ) @37
+                  element: dart:core::<fragment>::@class::Object::@constructor::new
+              codeOffset: 29
+              codeLength: 15
+          returnType: dynamic
+''');
+  }
+
+  test_codeRange_topLevelVariable() async {
+    var library = await buildLibrary('''
+int withInit = 1 + 2 * 3;
+
+int withoutInit;
+
+int multiWithInit = 2, multiWithoutInit, multiWithInit2 = 3;
+''');
+    configuration.withCodeRanges = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static withInit @4
+          reference: <testLibraryFragment>::@topLevelVariable::withInit
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 0
+          codeLength: 24
+          type: int
+          shouldUseTypeForInitializerInference: true
+        static withoutInit @31
+          reference: <testLibraryFragment>::@topLevelVariable::withoutInit
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 27
+          codeLength: 15
+          type: int
+        static multiWithInit @49
+          reference: <testLibraryFragment>::@topLevelVariable::multiWithInit
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 45
+          codeLength: 21
+          type: int
+          shouldUseTypeForInitializerInference: true
+        static multiWithoutInit @68
+          reference: <testLibraryFragment>::@topLevelVariable::multiWithoutInit
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 68
+          codeLength: 16
+          type: int
+        static multiWithInit2 @86
+          reference: <testLibraryFragment>::@topLevelVariable::multiWithInit2
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 86
+          codeLength: 18
+          type: int
+          shouldUseTypeForInitializerInference: true
+      accessors
+        synthetic static get withInit @-1
+          reference: <testLibraryFragment>::@getter::withInit
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static set withInit= @-1
+          reference: <testLibraryFragment>::@setter::withInit
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _withInit @-1
+              type: int
+          returnType: void
+        synthetic static get withoutInit @-1
+          reference: <testLibraryFragment>::@getter::withoutInit
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static set withoutInit= @-1
+          reference: <testLibraryFragment>::@setter::withoutInit
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _withoutInit @-1
+              type: int
+          returnType: void
+        synthetic static get multiWithInit @-1
+          reference: <testLibraryFragment>::@getter::multiWithInit
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static set multiWithInit= @-1
+          reference: <testLibraryFragment>::@setter::multiWithInit
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _multiWithInit @-1
+              type: int
+          returnType: void
+        synthetic static get multiWithoutInit @-1
+          reference: <testLibraryFragment>::@getter::multiWithoutInit
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static set multiWithoutInit= @-1
+          reference: <testLibraryFragment>::@setter::multiWithoutInit
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _multiWithoutInit @-1
+              type: int
+          returnType: void
+        synthetic static get multiWithInit2 @-1
+          reference: <testLibraryFragment>::@getter::multiWithInit2
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static set multiWithInit2= @-1
+          reference: <testLibraryFragment>::@setter::multiWithInit2
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _multiWithInit2 @-1
+              type: int
+          returnType: void
+''');
+  }
+
+  test_codeRange_topLevelVariable_annotations() async {
+    var library = await buildLibrary('''
+/// Comment 1.
+/// Comment 2.
+int hasDocComment, hasDocComment2;
+
+@Object()
+int hasAnnotation, hasAnnotation2;
+
+@Object()
+/// Comment 1.
+/// Comment 2.
+int annotationThenComment, annotationThenComment2;
+
+/// Comment 1.
+/// Comment 2.
+@Object()
+int commentThenAnnotation, commentThenAnnotation2;
+
+/// Comment 1.
+@Object()
+/// Comment 2.
+int commentAroundAnnotation, commentAroundAnnotation2;
+''');
+    configuration.withCodeRanges = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        static hasDocComment @34
+          reference: <testLibraryFragment>::@topLevelVariable::hasDocComment
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 1.\n/// Comment 2.
+          codeOffset: 0
+          codeLength: 47
+          type: int
+        static hasDocComment2 @49
+          reference: <testLibraryFragment>::@topLevelVariable::hasDocComment2
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 1.\n/// Comment 2.
+          codeOffset: 49
+          codeLength: 14
+          type: int
+        static hasAnnotation @80
+          reference: <testLibraryFragment>::@topLevelVariable::hasAnnotation
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @66
+              name: SimpleIdentifier
+                token: Object @67
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @73
+                rightParenthesis: ) @74
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 66
+          codeLength: 27
+          type: int
+        static hasAnnotation2 @95
+          reference: <testLibraryFragment>::@topLevelVariable::hasAnnotation2
+          enclosingElement: <testLibraryFragment>
+          metadata
+            Annotation
+              atSign: @ @66
+              name: SimpleIdentifier
+                token: Object @67
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @73
+                rightParenthesis: ) @74
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 95
+          codeLength: 14
+          type: int
+        static annotationThenComment @156
+          reference: <testLibraryFragment>::@topLevelVariable::annotationThenComment
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 1.\n/// Comment 2.
+          metadata
+            Annotation
+              atSign: @ @112
+              name: SimpleIdentifier
+                token: Object @113
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @119
+                rightParenthesis: ) @120
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 112
+          codeLength: 65
+          type: int
+        static annotationThenComment2 @179
+          reference: <testLibraryFragment>::@topLevelVariable::annotationThenComment2
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 1.\n/// Comment 2.
+          metadata
+            Annotation
+              atSign: @ @112
+              name: SimpleIdentifier
+                token: Object @113
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @119
+                rightParenthesis: ) @120
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 179
+          codeLength: 22
+          type: int
+        static commentThenAnnotation @248
+          reference: <testLibraryFragment>::@topLevelVariable::commentThenAnnotation
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 1.\n/// Comment 2.
+          metadata
+            Annotation
+              atSign: @ @234
+              name: SimpleIdentifier
+                token: Object @235
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @241
+                rightParenthesis: ) @242
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 204
+          codeLength: 65
+          type: int
+        static commentThenAnnotation2 @271
+          reference: <testLibraryFragment>::@topLevelVariable::commentThenAnnotation2
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 1.\n/// Comment 2.
+          metadata
+            Annotation
+              atSign: @ @234
+              name: SimpleIdentifier
+                token: Object @235
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @241
+                rightParenthesis: ) @242
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 271
+          codeLength: 22
+          type: int
+        static commentAroundAnnotation @340
+          reference: <testLibraryFragment>::@topLevelVariable::commentAroundAnnotation
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 2.
+          metadata
+            Annotation
+              atSign: @ @311
+              name: SimpleIdentifier
+                token: Object @312
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @318
+                rightParenthesis: ) @319
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 311
+          codeLength: 52
+          type: int
+        static commentAroundAnnotation2 @365
+          reference: <testLibraryFragment>::@topLevelVariable::commentAroundAnnotation2
+          enclosingElement: <testLibraryFragment>
+          documentationComment: /// Comment 2.
+          metadata
+            Annotation
+              atSign: @ @311
+              name: SimpleIdentifier
+                token: Object @312
+                staticElement: dart:core::<fragment>::@class::Object
+                staticType: null
+              arguments: ArgumentList
+                leftParenthesis: ( @318
+                rightParenthesis: ) @319
+              element: dart:core::<fragment>::@class::Object::@constructor::new
+          codeOffset: 365
+          codeLength: 24
+          type: int
+      accessors
+        synthetic static get hasDocComment @-1
+          reference: <testLibraryFragment>::@getter::hasDocComment
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static set hasDocComment= @-1
+          reference: <testLibraryFragment>::@setter::hasDocComment
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _hasDocComment @-1
+              type: int
+          returnType: void
+        synthetic static get hasDocComment2 @-1
+          reference: <testLibraryFragment>::@getter::hasDocComment2
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static set hasDocComment2= @-1
+          reference: <testLibraryFragment>::@setter::hasDocComment2
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _hasDocComment2 @-1
+              type: int
+          returnType: void
+        synthetic static get hasAnnotation @-1
+          reference: <testLibraryFragment>::@getter::hasAnnotation
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static set hasAnnotation= @-1
+          reference: <testLibraryFragment>::@setter::hasAnnotation
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _hasAnnotation @-1
+              type: int
+          returnType: void
+        synthetic static get hasAnnotation2 @-1
+          reference: <testLibraryFragment>::@getter::hasAnnotation2
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static set hasAnnotation2= @-1
+          reference: <testLibraryFragment>::@setter::hasAnnotation2
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _hasAnnotation2 @-1
+              type: int
+          returnType: void
+        synthetic static get annotationThenComment @-1
+          reference: <testLibraryFragment>::@getter::annotationThenComment
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static set annotationThenComment= @-1
+          reference: <testLibraryFragment>::@setter::annotationThenComment
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _annotationThenComment @-1
+              type: int
+          returnType: void
+        synthetic static get annotationThenComment2 @-1
+          reference: <testLibraryFragment>::@getter::annotationThenComment2
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static set annotationThenComment2= @-1
+          reference: <testLibraryFragment>::@setter::annotationThenComment2
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _annotationThenComment2 @-1
+              type: int
+          returnType: void
+        synthetic static get commentThenAnnotation @-1
+          reference: <testLibraryFragment>::@getter::commentThenAnnotation
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static set commentThenAnnotation= @-1
+          reference: <testLibraryFragment>::@setter::commentThenAnnotation
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _commentThenAnnotation @-1
+              type: int
+          returnType: void
+        synthetic static get commentThenAnnotation2 @-1
+          reference: <testLibraryFragment>::@getter::commentThenAnnotation2
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static set commentThenAnnotation2= @-1
+          reference: <testLibraryFragment>::@setter::commentThenAnnotation2
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _commentThenAnnotation2 @-1
+              type: int
+          returnType: void
+        synthetic static get commentAroundAnnotation @-1
+          reference: <testLibraryFragment>::@getter::commentAroundAnnotation
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static set commentAroundAnnotation= @-1
+          reference: <testLibraryFragment>::@setter::commentAroundAnnotation
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _commentAroundAnnotation @-1
+              type: int
+          returnType: void
+        synthetic static get commentAroundAnnotation2 @-1
+          reference: <testLibraryFragment>::@getter::commentAroundAnnotation2
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+        synthetic static set commentAroundAnnotation2= @-1
+          reference: <testLibraryFragment>::@setter::commentAroundAnnotation2
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional _commentAroundAnnotation2 @-1
+              type: int
+          returnType: void
+''');
+  }
+
+  test_codeRange_type_parameter() async {
+    var library = await buildLibrary('''
+class A<T> {}
+void f<U extends num> {}
+''');
+    configuration.withCodeRanges = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 0
+          codeLength: 13
+          typeParameters
+            covariant T @8
+              codeOffset: 8
+              codeLength: 1
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+      functions
+        f @19
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          codeOffset: 14
+          codeLength: 24
+          typeParameters
+            covariant U @21
+              codeOffset: 21
+              codeLength: 13
+              bound: num
+              defaultType: num
+          returnType: void
+''');
+  }
+
+  test_nameOffset_class_constructor() async {
+    var library = await buildLibrary(r'''
+class A {
+  A();
+  A.named();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @12
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+            named @21
+              reference: <testLibraryFragment>::@class::A::@constructor::named
+              enclosingElement: <testLibraryFragment>::@class::A
+              periodOffset: 20
+              nameEnd: 26
+''');
+  }
+
+  test_nameOffset_class_constructor_parameter() async {
+    var library = await buildLibrary(r'''
+class A {
+  A(int a);
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            @12
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional a @18
+                  type: int
+''');
+  }
+
+  test_nameOffset_class_field() async {
+    var library = await buildLibrary(r'''
+class A {
+  int foo = 0;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            foo @16
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+              shouldUseTypeForInitializerInference: true
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            synthetic get foo @-1
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+            synthetic set foo= @-1
+              reference: <testLibraryFragment>::@class::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional _foo @-1
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_nameOffset_class_getter() async {
+    var library = await buildLibrary(r'''
+class A {
+  int get foo => 0;
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            get foo @20
+              reference: <testLibraryFragment>::@class::A::@getter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              returnType: int
+''');
+  }
+
+  test_nameOffset_class_method() async {
+    var library = await buildLibrary(r'''
+class A {
+  void foo<T>(int a) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          methods
+            foo @17
+              reference: <testLibraryFragment>::@class::A::@method::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              typeParameters
+                covariant T @21
+                  defaultType: dynamic
+              parameters
+                requiredPositional a @28
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_nameOffset_class_setter() async {
+    var library = await buildLibrary(r'''
+class A {
+  set foo(int x) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          fields
+            synthetic foo @-1
+              reference: <testLibraryFragment>::@class::A::@field::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              type: int
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+          accessors
+            set foo= @16
+              reference: <testLibraryFragment>::@class::A::@setter::foo
+              enclosingElement: <testLibraryFragment>::@class::A
+              parameters
+                requiredPositional x @24
+                  type: int
+              returnType: void
+''');
+  }
+
+  test_nameOffset_class_typeParameter() async {
+    var library = await buildLibrary(r'''
+class A<T> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      classes
+        class A @6
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+''');
+  }
+
+  test_nameOffset_extension_typeParameter() async {
+    var library = await buildLibrary(r'''
+extension E<T> on int {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      extensions
+        E @10
+          reference: <testLibraryFragment>::@extension::E
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @12
+              defaultType: dynamic
+          extendedType: int
+''');
+  }
+
+  test_nameOffset_function_functionTypedFormal_parameter() async {
+    var library = await buildLibrary(r'''
+void f(void f<U>(int a)) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        f @5
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredPositional f @12
+              type: void Function<U>(int)
+              typeParameters
+                covariant U @14
+              parameters
+                requiredPositional a @21
+                  type: int
+          returnType: void
+''');
+  }
+
+  test_nameOffset_function_functionTypedFormal_parameter2() async {
+    var library = await buildLibrary(r'''
+void f({required void f<U>(int a)}) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        f @5
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          parameters
+            requiredNamed default f @22
+              reference: <testLibraryFragment>::@function::f::@parameter::f
+              type: void Function<U>(int)
+              typeParameters
+                covariant U @24
+              parameters
+                requiredPositional a @31
+                  type: int
+          returnType: void
+''');
+  }
+
+  test_nameOffset_function_typeParameter() async {
+    var library = await buildLibrary(r'''
+void f<T>() {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      functions
+        f @5
+          reference: <testLibraryFragment>::@function::f
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @7
+              defaultType: dynamic
+          returnType: void
+''');
+  }
+
+  test_nameOffset_functionTypeAlias_typeParameter() async {
+    var library = await buildLibrary(r'''
+typedef void F<T>();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      typeAliases
+        functionTypeAliasBased F @13
+          reference: <testLibraryFragment>::@typeAlias::F
+          typeParameters
+            unrelated T @15
+              defaultType: dynamic
+          aliasedType: void Function()
+          aliasedElement: GenericFunctionTypeElement
+            returnType: void
+''');
+  }
+
+  test_nameOffset_genericTypeAlias_typeParameter() async {
+    var library = await buildLibrary(r'''
+typedef F<T> = void Function();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      typeAliases
+        F @8
+          reference: <testLibraryFragment>::@typeAlias::F
+          typeParameters
+            unrelated T @10
+              defaultType: dynamic
+          aliasedType: void Function()
+          aliasedElement: GenericFunctionTypeElement
+            returnType: void
+''');
+  }
+
+  test_nameOffset_mixin_typeParameter() async {
+    var library = await buildLibrary(r'''
+mixin M<T> {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      mixins
+        mixin M @6
+          reference: <testLibraryFragment>::@mixin::M
+          enclosingElement: <testLibraryFragment>
+          typeParameters
+            covariant T @8
+              defaultType: dynamic
+          superclassConstraints
+            Object
+''');
+  }
+
+  test_nameOffset_unit_getter() async {
+    var library = await buildLibrary(r'''
+int get foo => 0;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      topLevelVariables
+        synthetic static foo @-1
+          reference: <testLibraryFragment>::@topLevelVariable::foo
+          enclosingElement: <testLibraryFragment>
+          type: int
+      accessors
+        static get foo @8
+          reference: <testLibraryFragment>::@getter::foo
+          enclosingElement: <testLibraryFragment>
+          returnType: int
+''');
+  }
+}
+
+@reflectiveTest
+class OffsetsElementTest_fromBytes extends OffsetsElementTest {
+  @override
+  bool get keepLinkingLibraries => false;
+}
+
+@reflectiveTest
+class OffsetsElementTest_keepLinking extends OffsetsElementTest {
+  @override
+  bool get keepLinkingLibraries => true;
+}
diff --git a/pkg/analyzer/test/src/summary/elements/part_include_test.dart b/pkg/analyzer/test/src/summary/elements/part_include_test.dart
new file mode 100644
index 0000000..19fbc71
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/elements/part_include_test.dart
@@ -0,0 +1,418 @@
+// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../dart/resolution/node_text_expectations.dart';
+import '../elements_base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(PartIncludeElementTest_keepLinking);
+    defineReflectiveTests(PartIncludeElementTest_fromBytes);
+    defineReflectiveTests(UpdateNodeTextExpectations);
+  });
+}
+
+abstract class PartIncludeElementTest extends ElementsBaseTest {
+  test_library_parts() async {
+    addSource('$testPackageLibPath/a.dart', 'part of my.lib;');
+    addSource('$testPackageLibPath/b.dart', 'part of my.lib;');
+    var library =
+        await buildLibrary('library my.lib; part "a.dart"; part "b.dart";');
+    checkElementText(library, r'''
+library
+  name: my.lib
+  nameOffset: 8
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  parts
+    part_0
+    part_1
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      parts
+        part_0
+          uri: package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          unit: <testLibrary>::@fragment::package:test/a.dart
+        part_1
+          uri: package:test/b.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          unit: <testLibrary>::@fragment::package:test/b.dart
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_library_parts_nested() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+part of 'test.dart';
+part 'a11.dart';
+part 'a12.dart';
+class A {}
+''');
+
+    newFile('$testPackageLibPath/a11.dart', r'''
+part of 'a.dart';
+class A11 {}
+''');
+
+    newFile('$testPackageLibPath/a12.dart', r'''
+part of 'a.dart';
+class A12 {}
+''');
+
+    newFile('$testPackageLibPath/b.dart', r'''
+part of 'test.dart';
+part 'b11.dart';
+part 'b12.dart';
+''');
+
+    newFile('$testPackageLibPath/b11.dart', r'''
+part of 'b.dart';
+class B11 {}
+''');
+
+    newFile('$testPackageLibPath/b12.dart', r'''
+part of 'b.dart';
+class B12 {}
+''');
+
+    var library = await buildLibrary('''
+part 'a.dart';
+part 'b.dart';
+class Z {}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  parts
+    part_0
+    part_1
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      parts
+        part_0
+          uri: package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          unit: <testLibrary>::@fragment::package:test/a.dart
+        part_1
+          uri: package:test/b.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          unit: <testLibrary>::@fragment::package:test/b.dart
+      classes
+        class Z @36
+          reference: <testLibraryFragment>::@class::Z
+          enclosingElement: <testLibraryFragment>
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+      parts
+        part_2
+          uri: package:test/a11.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+          unit: <testLibrary>::@fragment::package:test/a11.dart
+        part_3
+          uri: package:test/a12.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/a.dart
+          unit: <testLibrary>::@fragment::package:test/a12.dart
+      classes
+        class A @61
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::A
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+    <testLibrary>::@fragment::package:test/a11.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class A11 @24
+          reference: <testLibrary>::@fragment::package:test/a11.dart::@class::A11
+          enclosingElement: <testLibrary>::@fragment::package:test/a11.dart
+    <testLibrary>::@fragment::package:test/a12.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class A12 @24
+          reference: <testLibrary>::@fragment::package:test/a12.dart::@class::A12
+          enclosingElement: <testLibrary>::@fragment::package:test/a12.dart
+    <testLibrary>::@fragment::package:test/b.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+      parts
+        part_4
+          uri: package:test/b11.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+          unit: <testLibrary>::@fragment::package:test/b11.dart
+        part_5
+          uri: package:test/b12.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibrary>::@fragment::package:test/b.dart
+          unit: <testLibrary>::@fragment::package:test/b12.dart
+    <testLibrary>::@fragment::package:test/b11.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class B11 @24
+          reference: <testLibrary>::@fragment::package:test/b11.dart::@class::B11
+          enclosingElement: <testLibrary>::@fragment::package:test/b11.dart
+    <testLibrary>::@fragment::package:test/b12.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class B12 @24
+          reference: <testLibrary>::@fragment::package:test/b12.dart::@class::B12
+          enclosingElement: <testLibrary>::@fragment::package:test/b12.dart
+''');
+  }
+
+  test_library_parts_noRelativeUriStr() async {
+    var library = await buildLibrary(r'''
+part '${'foo'}.dart';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  parts
+    part_0
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      parts
+        part_0
+          uri: noRelativeUriString
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+''');
+  }
+
+  test_library_parts_withPart_partOfName() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+part of my.lib;
+class B {}
+''');
+    var library = await buildLibrary(r'''
+library my.lib;
+part 'a.dart';
+class A {}
+''');
+    checkElementText(library, r'''
+library
+  name: my.lib
+  nameOffset: 8
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  parts
+    part_0
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      parts
+        part_0
+          uri: package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          unit: <testLibrary>::@fragment::package:test/a.dart
+      classes
+        class A @37
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class B @22
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::B
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::B::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::B
+''');
+  }
+
+  test_library_parts_withPart_partOfUri() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+part of 'test.dart';
+class B {}
+''');
+    var library = await buildLibrary(r'''
+part 'a.dart';
+class A {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  definingUnit: <testLibraryFragment>
+  parts
+    part_0
+  units
+    <testLibraryFragment>
+      enclosingElement: <testLibrary>
+      parts
+        part_0
+          uri: package:test/a.dart
+          enclosingElement: <testLibrary>
+          enclosingElement3: <testLibraryFragment>
+          unit: <testLibrary>::@fragment::package:test/a.dart
+      classes
+        class A @21
+          reference: <testLibraryFragment>::@class::A
+          enclosingElement: <testLibraryFragment>
+          constructors
+            synthetic @-1
+              reference: <testLibraryFragment>::@class::A::@constructor::new
+              enclosingElement: <testLibraryFragment>::@class::A
+    <testLibrary>::@fragment::package:test/a.dart
+      enclosingElement: <testLibrary>
+      enclosingElement3: <testLibraryFragment>
+      classes
+        class B @27
+          reference: <testLibrary>::@fragment::package:test/a.dart::@class::B
+          enclosingElement: <testLibrary>::@fragment::package:test/a.dart
+          constructors
+            synthetic @-1
+              reference: <testLibrary>::@fragment::package:test/a.dart::@class::B::@constructor::new
+              enclosingElement: <testLibrary>::@fragment::package:test/a.dart::@class::B
+''');
+  }
+
+  test_library_parts_withRelativeUri_noSource() async {
+    var library = await buildLibrary(r'''