Version 3.6.0-113.0.dev
Merge 093d867a0cd4f6fa4f8f2b8d55a814374c9dddf1 into dev
diff --git a/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml b/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml
index 75d0d24..95142b4 100644
--- a/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml
+++ b/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml
@@ -1836,8 +1836,6 @@
Should probably be able to use `DataDriven`.
HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE:
status: hasFix
-HintCode.DIVISION_OPTIMIZATION:
- status: hasFix
HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION:
status: noFix
HintCode.MACRO_INFO:
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 1184fae..bd08bdd 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -1552,9 +1552,6 @@
HintCode.DEPRECATED_COLON_FOR_DEFAULT_VALUE: [
ReplaceColonWithEquals.new,
],
- HintCode.DIVISION_OPTIMIZATION: [
- UseEffectiveIntegerDivision.new,
- ],
HintCode.UNNECESSARY_IMPORT: [
RemoveUnusedImport.new,
],
diff --git a/pkg/analysis_server/lib/src/services/linter/lint_names.dart b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
index 8acb555..1d4125a 100644
--- a/pkg/analysis_server/lib/src/services/linter/lint_names.dart
+++ b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
@@ -207,4 +207,5 @@
static const String use_string_in_part_of_directives =
'use_string_in_part_of_directives';
static const String use_super_parameters = 'use_super_parameters';
+ static const String use_truncating_division = 'use_truncating_division';
}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/use_effective_integer_division_test.dart b/pkg/analysis_server/test/src/services/correction/fix/use_effective_integer_division_test.dart
index b169998..833e0da 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/use_effective_integer_division_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/use_effective_integer_division_test.dart
@@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/linter/lint_names.dart';
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -17,6 +18,9 @@
@reflectiveTest
class UseEffectiveIntegerDivisionMultiTest extends BulkFixProcessorTest {
+ @override
+ String get lintCode => LintNames.use_truncating_division;
+
Future<void> test_singleFile() async {
await resolveTestCode('''
void f() {
@@ -53,10 +57,13 @@
}
@reflectiveTest
-class UseEffectiveIntegerDivisionTest extends FixProcessorTest {
+class UseEffectiveIntegerDivisionTest extends FixProcessorLintTest {
@override
FixKind get kind => DartFixKind.USE_EFFECTIVE_INTEGER_DIVISION;
+ @override
+ String get lintCode => LintNames.use_truncating_division;
+
Future<void> test_normalDivision() async {
await resolveTestCode('''
void f() {
diff --git a/pkg/analyzer/lib/src/dart/error/hint_codes.g.dart b/pkg/analyzer/lib/src/dart/error/hint_codes.g.dart
index 9a7f281..7bd3b50 100644
--- a/pkg/analyzer/lib/src/dart/error/hint_codes.g.dart
+++ b/pkg/analyzer/lib/src/dart/error/hint_codes.g.dart
@@ -86,15 +86,6 @@
);
/// No parameters.
- static const HintCode DIVISION_OPTIMIZATION = HintCode(
- 'DIVISION_OPTIMIZATION',
- "The operator x ~/ y is more efficient than (x / y).toInt().",
- correctionMessage:
- "Try re-writing the expression to use the '~/' operator.",
- hasPublishedDocs: true,
- );
-
- /// No parameters.
static const HintCode IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION = HintCode(
'IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION',
"The imported library defines a top-level function named 'loadLibrary' "
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index 738b9cd..a4a425a 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -159,7 +159,6 @@
@override
void visitBinaryExpression(BinaryExpression node) {
- _checkForDivisionOptimizationHint(node);
_deprecatedVerifier.binaryExpression(node);
_checkForInvariantNanComparison(node);
_checkForInvariantNullComparison(node);
@@ -849,47 +848,6 @@
}
}
- /// Checks the passed binary expression for [HintCode.DIVISION_OPTIMIZATION].
- ///
- /// Returns whether a hint code is generated.
- // TODO(srawlins): Remove this ASAP, as it is being replaced by the
- // 'use_truncating_division' lint rule, to avoid double reporting.
- bool _checkForDivisionOptimizationHint(BinaryExpression node) {
- if (node.operator.type != TokenType.SLASH) return false;
-
- // Return if the two operands are not each `int`.
- var leftType = node.leftOperand.staticType;
- if (leftType == null || !leftType.isDartCoreInt) return false;
-
- var rightType = node.rightOperand.staticType;
- if (rightType == null || !rightType.isDartCoreInt) return false;
-
- // Return if the '/' operator is not defined in core, or if we don't know
- // its static type.
- var methodElement = node.staticElement;
- if (methodElement == null) return false;
-
- var libraryElement = methodElement.library;
- if (!libraryElement.isDartCore) return false;
-
- var parent = node.parent;
- if (parent is! ParenthesizedExpression) return false;
-
- var outermostParentheses = parent.thisOrAncestorMatching(
- (e) => e.parent is! ParenthesizedExpression) as ParenthesizedExpression;
- var grandParent = outermostParentheses.parent;
- if (grandParent is! MethodInvocation) return false;
-
- // Report an error if the `(x / y)` expression has `toInt()` invoked on it.
- if (grandParent.methodName.name == 'toInt' &&
- grandParent.argumentList.arguments.isEmpty) {
- _errorReporter.atNode(grandParent, HintCode.DIVISION_OPTIMIZATION);
- return true;
- }
-
- return false;
- }
-
/// Generate hints related to duplicate elements (keys) in sets (maps).
void _checkForDuplications(SetOrMapLiteral node) {
// This only checks for top-level elements. If, for, and spread elements
diff --git a/pkg/analyzer/lib/src/error/error_code_values.g.dart b/pkg/analyzer/lib/src/error/error_code_values.g.dart
index 2bb4ebb..50e992f 100644
--- a/pkg/analyzer/lib/src/error/error_code_values.g.dart
+++ b/pkg/analyzer/lib/src/error/error_code_values.g.dart
@@ -649,7 +649,6 @@
HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE,
HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE_WITH_MESSAGE,
HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE,
- HintCode.DIVISION_OPTIMIZATION,
HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION,
HintCode.MACRO_INFO,
HintCode.UNNECESSARY_IMPORT,
diff --git a/pkg/analyzer/messages.yaml b/pkg/analyzer/messages.yaml
index 262d208..c7bb24f 100644
--- a/pkg/analyzer/messages.yaml
+++ b/pkg/analyzer/messages.yaml
@@ -20977,6 +20977,7 @@
This code is deprecated in favor of the
'deprecated_member_from_same_package' lint rule, and will be removed.
DIVISION_OPTIMIZATION:
+ removedIn: "3.5"
problemMessage: The operator x ~/ y is more efficient than (x / y).toInt().
correctionMessage: "Try re-writing the expression to use the '~/' operator."
hasPublishedDocs: true
diff --git a/pkg/analyzer/test/src/diagnostics/division_optimization_test.dart b/pkg/analyzer/test/src/diagnostics/division_optimization_test.dart
deleted file mode 100644
index d011743..0000000
--- a/pkg/analyzer/test/src/diagnostics/division_optimization_test.dart
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright (c) 2019, 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/src/error/codes.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../dart/resolution/context_collection_resolution.dart';
-
-main() {
- defineReflectiveSuite(() {
- defineReflectiveTests(DivisionOptimizationTest);
- });
-}
-
-@reflectiveTest
-class DivisionOptimizationTest extends PubPackageResolutionTest {
- test_divisionOptimization() async {
- await assertNoErrorsInCode(r'''
-void f(int x, int y) {
- x / y.toInt();
-}
-''');
- }
-
- test_double() async {
- await assertNoErrorsInCode(r'''
-void f(double x, double y) {
- (x / y).toInt();
-}
-''');
- }
-
- test_dynamic() async {
- await assertNoErrorsInCode(r'''
-void f(x, y) {
- (x / y).toInt();
-}
-''');
- }
-
- test_int() async {
- await assertErrorsInCode(r'''
-void f(int x, int y) {
- (x / y).toInt();
-}
-''', [
- error(HintCode.DIVISION_OPTIMIZATION, 25, 15),
- ]);
- }
-
- test_nonNumeric() async {
- await assertNoErrorsInCode(r'''
-class A {
- A operator /(A x) { return x; }
-
- void toInt() {}
-}
-void f(A x, A y) {
- (x / y).toInt();
-}
-''');
- }
-
- test_wrappedInParentheses() async {
- await assertErrorsInCode(r'''
-void f(int x, int y) {
- (((x / y))).toInt();
-}
-''', [
- error(HintCode.DIVISION_OPTIMIZATION, 25, 19),
- ]);
- }
-}
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 2d6bfbd..ccf6acb 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -185,7 +185,6 @@
as deprecated_implements_function;
import 'deprecated_member_use_test.dart' as deprecated_member_use;
import 'deprecated_mixin_function_test.dart' as deprecated_mixin_function;
-import 'division_optimization_test.dart' as division_optimization;
import 'doc_directive_argument_wrong_format_test.dart'
as doc_directive_argument_wrong_format;
import 'doc_directive_has_extra_arguments_test.dart'
@@ -1049,7 +1048,6 @@
deprecated_implements_function.main();
deprecated_member_use.main();
deprecated_mixin_function.main();
- division_optimization.main();
doc_directive_argument_wrong_format.main();
doc_directive_has_extra_arguments.main();
doc_directive_has_unexpected_named_argument.main();
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
+