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'''