Version 2.16.0-141.0.dev
Merge commit '584411632fa0117dd9a9dbde5ba235e2626cfac2' into 'dev'
diff --git a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
index f320c5f..6c4801c 100644
--- a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
@@ -2,14 +2,17 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+import 'package:analysis_server/src/protocol_server.dart';
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/arglist_contributor.dart';
import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
+import 'package:analyzer_utilities/check/check.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
+import 'completion_check.dart';
import 'completion_contributor_util.dart';
void main() {
@@ -19,95 +22,6 @@
}
mixin ArgListContributorMixin on DartCompletionContributorTest {
- void assertNoOtherSuggestions(Iterable<CompletionSuggestion> expected) {
- for (var suggestion in suggestions) {
- if (!expected.contains(suggestion)) {
- failedCompletion('did not expect completion: '
- '${suggestion.completion}\n $suggestion');
- }
- }
- }
-
- /// Assert that there is a suggestion with the given parameter [name] that has
- /// the given [completion], [selectionOffset] and [selectionLength].
- void assertSuggestArgumentAndCompletion(String name,
- {required String completion,
- required int selectionOffset,
- int selectionLength = 0}) {
- var suggestion = suggestions.firstWhere((s) => s.parameterName == name);
- expect(suggestion, isNotNull);
- expect(suggestion.completion, completion);
- expect(suggestion.selectionOffset, selectionOffset);
- expect(suggestion.selectionLength, selectionLength);
- }
-
- void assertSuggestArgumentList_params(
- List<String> expectedNames,
- List<String> expectedTypes,
- List<String>? actualNames,
- List<String>? actualTypes) {
- if (actualNames != null &&
- actualNames.length == expectedNames.length &&
- actualTypes != null &&
- actualTypes.length == expectedTypes.length) {
- var index = 0;
- while (index < expectedNames.length) {
- if (actualNames[index] != expectedNames[index] ||
- actualTypes[index] != expectedTypes[index]) {
- break;
- }
- ++index;
- }
- if (index == expectedNames.length) {
- return;
- }
- }
- var msg = StringBuffer();
- msg.writeln('Argument list not the same');
- msg.writeln(' Expected names: $expectedNames');
- msg.writeln(' found: $actualNames');
- msg.writeln(' Expected types: $expectedTypes');
- msg.writeln(' found: $actualTypes');
- fail(msg.toString());
- }
-
- /// Assert that the specified named argument suggestions with their types are
- /// the only suggestions.
- void assertSuggestArgumentsAndTypes(
- {required Map<String, String> namedArgumentsWithTypes,
- bool includeColon = true,
- bool includeComma = false}) {
- var expected = <CompletionSuggestion>[];
- namedArgumentsWithTypes.forEach((String name, String type) {
- var completion = includeColon ? '$name: ' : name;
- // Selection should be before any trailing commas.
- var selectionOffset = completion.length;
- if (includeComma) {
- completion = '$completion,';
- }
- expected.add(assertSuggest(completion,
- csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
- paramName: name,
- paramType: type,
- selectionOffset: selectionOffset));
- });
- assertNoOtherSuggestions(expected);
- }
-
- /// Assert that the specified suggestions are the only suggestions.
- void assertSuggestions(List<String> suggestions) {
- var expected = <CompletionSuggestion>[];
- for (var suggestion in suggestions) {
- // Selection offset should be before any trailing commas.
- var selectionOffset =
- suggestion.endsWith(',') ? suggestion.length - 1 : suggestion.length;
- expected.add(assertSuggest('$suggestion',
- csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
- selectionOffset: selectionOffset));
- }
- assertNoOtherSuggestions(expected);
- }
-
@override
DartCompletionContributor createContributor(
DartCompletionRequest request,
@@ -358,12 +272,19 @@
await _tryParametersArguments(
parameters: '({bool one, int two})',
arguments: '(^)',
- check: () {
- assertSuggestArgumentsAndTypes(
- namedArgumentsWithTypes: {'one': 'bool', 'two': 'int'},
- );
- assertSuggestArgumentAndCompletion('one',
- completion: 'one: ', selectionOffset: 5);
+ check: (response) {
+ check(response).suggestions.namedArguments.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('one: ')
+ ..parameterType.isEqualTo('bool')
+ ..hasEmptyReplacement()
+ ..hasSelection(offset: 5),
+ (suggestion) => suggestion
+ ..completion.isEqualTo('two: ')
+ ..parameterType.isEqualTo('int')
+ ..hasEmptyReplacement()
+ ..hasSelection(offset: 5),
+ ]);
},
);
}
@@ -372,12 +293,19 @@
await _tryParametersArguments(
parameters: '({bool one, int two})',
arguments: '(o^)',
- check: () {
- assertSuggestArgumentsAndTypes(
- namedArgumentsWithTypes: {'one': 'bool', 'two': 'int'},
- );
- assertSuggestArgumentAndCompletion('one',
- completion: 'one: ', selectionOffset: 5);
+ check: (response) {
+ check(response).suggestions.namedArguments.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('one: ')
+ ..parameterType.isEqualTo('bool')
+ ..hasReplacement(left: 1)
+ ..hasSelection(offset: 5),
+ (suggestion) => suggestion
+ ..completion.isEqualTo('two: ')
+ ..parameterType.isEqualTo('int')
+ ..hasReplacement(left: 1)
+ ..hasSelection(offset: 5),
+ ]);
},
);
}
@@ -386,11 +314,14 @@
await _tryParametersArguments(
parameters: '({bool one, int two})',
arguments: '(o^ two: 2)',
- check: () {
- assertSuggestArgumentsAndTypes(
- namedArgumentsWithTypes: {'one': 'bool'}, includeComma: true);
- assertSuggestArgumentAndCompletion('one',
- completion: 'one: ,', selectionOffset: 5);
+ check: (response) {
+ check(response).suggestions.namedArguments.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('one: ,')
+ ..parameterType.isEqualTo('bool')
+ ..hasReplacement(left: 1)
+ ..hasSelection(offset: 5),
+ ]);
},
);
}
@@ -399,11 +330,14 @@
await _tryParametersArguments(
parameters: '({bool one, int two})',
arguments: '(o^, two: 2)',
- check: () {
- assertSuggestArgumentsAndTypes(
- namedArgumentsWithTypes: {'one': 'bool'}, includeComma: false);
- assertSuggestArgumentAndCompletion('one',
- completion: 'one: ', selectionOffset: 5);
+ check: (response) {
+ check(response).suggestions.namedArguments.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('one: ')
+ ..parameterType.isEqualTo('bool')
+ ..hasReplacement(left: 1)
+ ..hasSelection(offset: 5),
+ ]);
},
);
}
@@ -412,11 +346,14 @@
await _tryParametersArguments(
parameters: '({bool one, int two})',
arguments: '(o^ , two: 2)',
- check: () {
- assertSuggestArgumentsAndTypes(
- namedArgumentsWithTypes: {'one': 'bool'}, includeComma: false);
- assertSuggestArgumentAndCompletion('one',
- completion: 'one: ', selectionOffset: 5);
+ check: (response) {
+ check(response).suggestions.namedArguments.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('one: ')
+ ..parameterType.isEqualTo('bool')
+ ..hasReplacement(left: 1)
+ ..hasSelection(offset: 5),
+ ]);
},
);
}
@@ -425,12 +362,19 @@
await _tryParametersArguments(
parameters: '({bool one, int two})',
arguments: '(^o,)',
- check: () {
- assertSuggestArgumentsAndTypes(
- namedArgumentsWithTypes: {'one': 'bool', 'two': 'int'},
- );
- assertSuggestArgumentAndCompletion('one',
- completion: 'one: ', selectionOffset: 5);
+ check: (response) {
+ check(response).suggestions.namedArguments.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('one: ')
+ ..parameterType.isEqualTo('bool')
+ ..hasEmptyReplacement()
+ ..hasSelection(offset: 5),
+ (suggestion) => suggestion
+ ..completion.isEqualTo('two: ')
+ ..parameterType.isEqualTo('int')
+ ..hasEmptyReplacement()
+ ..hasSelection(offset: 5),
+ ]);
},
);
}
@@ -439,11 +383,14 @@
await _tryParametersArguments(
parameters: '({bool one, int two})',
arguments: '(^ two: 2)',
- check: () {
- assertSuggestArgumentsAndTypes(
- namedArgumentsWithTypes: {'one': 'bool'}, includeComma: true);
- assertSuggestArgumentAndCompletion('one',
- completion: 'one: ,', selectionOffset: 5);
+ check: (response) {
+ check(response).suggestions.namedArguments.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('one: ,')
+ ..parameterType.isEqualTo('bool')
+ ..hasEmptyReplacement()
+ ..hasSelection(offset: 5),
+ ]);
},
);
}
@@ -452,8 +399,14 @@
await _tryParametersArguments(
parameters: '({bool one, int two})',
arguments: '(^two: 2)',
- check: () {
- assertSuggestions(['one: ,']);
+ check: (response) {
+ check(response).suggestions.namedArguments.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('one: ,')
+ ..parameterType.isEqualTo('bool')
+ ..hasReplacement(right: 3)
+ ..hasSelection(offset: 5),
+ ]);
},
);
}
@@ -462,13 +415,14 @@
await _tryParametersArguments(
parameters: '({bool one, int two})',
arguments: '(^, two: 2)',
- check: () {
- assertSuggestArgumentsAndTypes(
- namedArgumentsWithTypes: {'one': 'bool'},
- includeComma: false,
- );
- assertSuggestArgumentAndCompletion('one',
- completion: 'one: ', selectionOffset: 5);
+ check: (response) {
+ check(response).suggestions.namedArguments.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('one: ')
+ ..parameterType.isEqualTo('bool')
+ ..hasEmptyReplacement()
+ ..hasSelection(offset: 5),
+ ]);
},
);
}
@@ -477,10 +431,14 @@
await _tryParametersArguments(
parameters: '({bool one, int two})',
arguments: '(^ , two: 2)',
- check: () {
- assertSuggestArgumentsAndTypes(
- namedArgumentsWithTypes: {'one': 'bool'},
- );
+ check: (response) {
+ check(response).suggestions.namedArguments.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('one: ')
+ ..parameterType.isEqualTo('bool')
+ ..hasEmptyReplacement()
+ ..hasSelection(offset: 5),
+ ]);
},
);
}
@@ -489,10 +447,14 @@
await _tryParametersArguments(
parameters: '(int one, {bool two, int three})',
arguments: '(1, ^, three: 3)',
- check: () {
- assertSuggestArgumentsAndTypes(
- namedArgumentsWithTypes: {'two': 'bool'},
- );
+ check: (response) {
+ check(response).suggestions.namedArguments.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('two: ')
+ ..parameterType.isEqualTo('bool')
+ ..hasEmptyReplacement()
+ ..hasSelection(offset: 5),
+ ]);
},
);
}
@@ -501,8 +463,14 @@
await _tryParametersArguments(
parameters: '(int one, {bool two, int three})',
arguments: '(1, ^ three: 3)',
- check: () {
- assertSuggestions(['two: ,']);
+ check: (response) {
+ check(response).suggestions.namedArguments.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('two: ,')
+ ..parameterType.isEqualTo('bool')
+ ..hasEmptyReplacement()
+ ..hasSelection(offset: 5),
+ ]);
},
);
}
@@ -511,8 +479,14 @@
await _tryParametersArguments(
parameters: '(int one, {bool two, int three})',
arguments: '(1, ^three: 3)',
- check: () {
- assertSuggestions(['two: ,']);
+ check: (response) {
+ check(response).suggestions.namedArguments.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('two: ,')
+ ..parameterType.isEqualTo('bool')
+ ..hasReplacement(right: 5)
+ ..hasSelection(offset: 5),
+ ]);
},
);
}
@@ -522,8 +496,8 @@
await _tryParametersArguments(
parameters: '({bool one, int two})',
arguments: '(two: 2^)',
- check: () {
- assertSuggestions([', one: ']);
+ check: (response) {
+ check(response).suggestions.namedArguments.isEmpty;
},
);
}
@@ -533,8 +507,8 @@
await _tryParametersArguments(
parameters: '({bool one, int two})',
arguments: '(two: 2 ^)',
- check: () {
- assertSuggestions([', one: ']);
+ check: (response) {
+ check(response).suggestions.namedArguments.isEmpty;
},
);
}
@@ -543,12 +517,14 @@
await _tryParametersArguments(
parameters: '({bool one, int two})',
arguments: '(two: 2, ^)',
- check: () {
- assertSuggestArgumentsAndTypes(
- namedArgumentsWithTypes: {'one': 'bool'},
- );
- assertSuggestArgumentAndCompletion('one',
- completion: 'one: ', selectionOffset: 5);
+ check: (response) {
+ check(response).suggestions.namedArguments.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('one: ')
+ ..parameterType.isEqualTo('bool')
+ ..hasEmptyReplacement()
+ ..hasSelection(offset: 5),
+ ]);
},
);
}
@@ -557,12 +533,14 @@
await _tryParametersArguments(
parameters: '({bool one, int two})',
arguments: '(two: 2, o^)',
- check: () {
- assertSuggestArgumentsAndTypes(
- namedArgumentsWithTypes: {'one': 'bool'},
- );
- assertSuggestArgumentAndCompletion('one',
- completion: 'one: ', selectionOffset: 5);
+ check: (response) {
+ check(response).suggestions.namedArguments.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('one: ')
+ ..parameterType.isEqualTo('bool')
+ ..hasReplacement(left: 1)
+ ..hasSelection(offset: 5),
+ ]);
},
);
}
@@ -571,12 +549,14 @@
await _tryParametersArguments(
parameters: '({bool one, int two})',
arguments: '(two: 2, o^,)',
- check: () {
- assertSuggestArgumentsAndTypes(
- namedArgumentsWithTypes: {'one': 'bool'},
- );
- assertSuggestArgumentAndCompletion('one',
- completion: 'one: ', selectionOffset: 5);
+ check: (response) {
+ check(response).suggestions.namedArguments.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('one: ')
+ ..parameterType.isEqualTo('bool')
+ ..hasReplacement(left: 1)
+ ..hasSelection(offset: 5),
+ ]);
},
);
}
@@ -585,8 +565,19 @@
await _tryParametersArguments(
parameters: '(int one, int two, int three, {int four, int five})',
arguments: '(1, ^, 3)',
- check: () {
- assertSuggestions(['four: ', 'five: ']);
+ check: (response) {
+ check(response).suggestions.namedArguments.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('four: ')
+ ..parameterType.isEqualTo('int')
+ ..hasEmptyReplacement()
+ ..hasSelection(offset: 6),
+ (suggestion) => suggestion
+ ..completion.isEqualTo('five: ')
+ ..parameterType.isEqualTo('int')
+ ..hasEmptyReplacement()
+ ..hasSelection(offset: 6),
+ ]);
},
);
}
@@ -596,8 +587,8 @@
languageVersion: '2.15',
parameters: '(int one, int two, int three, {int four, int five})',
arguments: '(1, ^, 3)',
- check: () {
- assertNoSuggestions();
+ check: (response) {
+ check(response).suggestions.namedArguments.isEmpty;
},
);
}
@@ -606,11 +597,19 @@
await _tryParametersArguments(
parameters: '({bool one, int two})',
arguments: '(o^: false)',
- check: () {
- assertSuggestArgumentsAndTypes(
- namedArgumentsWithTypes: {'one': 'bool', 'two': 'int'},
- includeColon: false,
- );
+ check: (response) {
+ check(response).suggestions.namedArguments.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('one')
+ ..parameterType.isEqualTo('bool')
+ ..hasReplacement(left: 1)
+ ..hasSelection(offset: 3),
+ (suggestion) => suggestion
+ ..completion.isEqualTo('two')
+ ..parameterType.isEqualTo('int')
+ ..hasReplacement(left: 1)
+ ..hasSelection(offset: 3),
+ ]);
},
);
}
@@ -619,30 +618,68 @@
await _tryParametersArguments(
parameters: '(bool one, {int two, double three})',
arguments: '(false, ^t: 2)',
- check: () {
- assertSuggestions(['two: ,', 'three: ,']);
+ check: (response) {
+ check(response).suggestions.namedArguments.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('two: ,')
+ ..parameterType.isEqualTo('int')
+ ..hasReplacement(right: 1)
+ ..hasSelection(offset: 5),
+ (suggestion) => suggestion
+ ..completion.isEqualTo('three: ,')
+ ..parameterType.isEqualTo('double')
+ ..hasReplacement(right: 1)
+ ..hasSelection(offset: 7),
+ ]);
},
);
}
Future<void> test_named_23() async {
await _tryParametersArguments(
- parameters: '(bool one, {int two, double three})',
- arguments: '(false, ^: 2)',
- check: () {
- assertSuggestArgumentsAndTypes(
- namedArgumentsWithTypes: {'two': 'int', 'three': 'double'},
- );
+ parameters: '(bool one, {int two})',
+ arguments: '(false, foo^ba: 2)',
+ check: (response) {
+ check(response).suggestions.namedArguments.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('two')
+ ..parameterType.isEqualTo('int')
+ ..hasReplacement(left: 3, right: 2)
+ ..hasSelection(offset: 3),
+ ]);
},
);
}
Future<void> test_named_24() async {
await _tryParametersArguments(
+ parameters: '(bool one, {int two, double three})',
+ arguments: '(false, ^: 2)',
+ check: (response) {
+ check(response).suggestions.namedArguments.matchesInAnyOrder([
+ (suggestion) => suggestion
+ // TODO(scheglov) This does not seem right.
+ ..completion.isEqualTo('two: ')
+ ..parameterType.isEqualTo('int')
+ ..hasEmptyReplacement()
+ ..hasSelection(offset: 5),
+ (suggestion) => suggestion
+ // TODO(scheglov) This does not seem right.
+ ..completion.isEqualTo('three: ')
+ ..parameterType.isEqualTo('double')
+ ..hasEmptyReplacement()
+ ..hasSelection(offset: 7),
+ ]);
+ },
+ );
+ }
+
+ Future<void> test_named_25() async {
+ await _tryParametersArguments(
parameters: '({bool one, int two})',
arguments: '(one: ^)',
- check: () {
- assertNoSuggestions();
+ check: (response) {
+ check(response).suggestions.namedArguments.isEmpty;
},
);
}
@@ -651,12 +688,24 @@
String? languageVersion,
required String parameters,
required String arguments,
- required void Function() check,
+ required void Function(CompletionResponseForTesting response) check,
}) async {
var languageVersionLine = languageVersion != null
? '// @dart = $languageVersion'
: '// no language version override';
+ Future<void> computeAndCheck() async {
+ await computeSuggestions();
+ check(
+ CompletionResponseForTesting(
+ requestOffset: completionOffset,
+ replacementOffset: replacementOffset,
+ replacementLength: replacementLength,
+ suggestions: suggestions,
+ ),
+ );
+ }
+
// Annotation, local class.
addTestSource2('''
$languageVersionLine
@@ -666,8 +715,7 @@
@A$arguments
void f() {}
''');
- await computeSuggestions();
- check();
+ await computeAndCheck();
// Annotation, imported class.
newFile('$testPackageLibPath/a.dart', content: '''
@@ -681,8 +729,7 @@
@A$arguments
void f() {}
''');
- await computeSuggestions();
- check();
+ await computeAndCheck();
// Annotation, imported class, prefixed.
newFile('$testPackageLibPath/a.dart', content: '''
@@ -696,8 +743,7 @@
@p.A$arguments
void f() {}
''');
- await computeSuggestions();
- check();
+ await computeAndCheck();
// Function expression invocation.
addTestSource2('''
@@ -706,8 +752,7 @@
void f$parameters() {}
var v = (f)$arguments;
''');
- await computeSuggestions();
- check();
+ await computeAndCheck();
// Instance creation, local class, generative.
addTestSource2('''
@@ -717,8 +762,7 @@
}
var v = A$arguments;
''');
- await computeSuggestions();
- check();
+ await computeAndCheck();
// Instance creation, imported class, generative.
newFile('$testPackageLibPath/a.dart', content: '''
@@ -731,8 +775,7 @@
import 'a.dart';
var v = A$arguments;
''');
- await computeSuggestions();
- check();
+ await computeAndCheck();
// Instance creation, imported class, factory.
newFile('$testPackageLibPath/a.dart', content: '''
@@ -745,8 +788,7 @@
import 'a.dart';
var v = A$arguments;
''');
- await computeSuggestions();
- check();
+ await computeAndCheck();
// Method invocation, local method.
addTestSource2('''
@@ -756,8 +798,7 @@
}
var v = A().foo$arguments;
''');
- await computeSuggestions();
- check();
+ await computeAndCheck();
// Method invocation, local function.
addTestSource2('''
@@ -765,8 +806,7 @@
void f$parameters() {}
var v = f$arguments;
''');
- await computeSuggestions();
- check();
+ await computeAndCheck();
// Method invocation, imported function.
newFile('$testPackageLibPath/a.dart', content: '''
@@ -777,8 +817,7 @@
import 'a.dart';
var v = f$arguments;
''');
- await computeSuggestions();
- check();
+ await computeAndCheck();
// Super constructor invocation.
addTestSource2('''
@@ -790,8 +829,7 @@
B() : super$arguments;
}
''');
- await computeSuggestions();
- check();
+ await computeAndCheck();
// This constructor invocation.
addTestSource2('''
@@ -801,8 +839,7 @@
A.named() : this$arguments;
}
''');
- await computeSuggestions();
- check();
+ await computeAndCheck();
// Invalid: getter invocation.
// Parameters not used. Check not used.
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_check.dart b/pkg/analysis_server/test/services/completion/dart/completion_check.dart
new file mode 100644
index 0000000..669cf76
--- /dev/null
+++ b/pkg/analysis_server/test/services/completion/dart/completion_check.dart
@@ -0,0 +1,148 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analyzer_utilities/check/check.dart';
+
+class CompletionResponseForTesting {
+ final int requestOffset;
+ final int replacementOffset;
+ final int replacementLength;
+ final List<CompletionSuggestion> suggestions;
+
+ CompletionResponseForTesting({
+ required this.requestOffset,
+ required this.replacementOffset,
+ required this.replacementLength,
+ required this.suggestions,
+ });
+
+ factory CompletionResponseForTesting.legacy(
+ int requestOffset,
+ CompletionResultsParams parameters,
+ ) {
+ return CompletionResponseForTesting(
+ requestOffset: requestOffset,
+ replacementOffset: parameters.replacementOffset,
+ replacementLength: parameters.replacementLength,
+ suggestions: parameters.results,
+ );
+ }
+}
+
+/// A completion suggestion with the response for context.
+class CompletionSuggestionForTesting {
+ final CompletionResponseForTesting response;
+ final CompletionSuggestion suggestion;
+
+ CompletionSuggestionForTesting({
+ required this.response,
+ required this.suggestion,
+ });
+
+ /// Return the effective replacement length.
+ int get replacementLength =>
+ suggestion.replacementLength ?? response.replacementLength;
+
+ /// Return the effective replacement offset.
+ int get replacementOffset =>
+ suggestion.replacementOffset ?? response.replacementOffset;
+
+ @override
+ String toString() => '(completion: ${suggestion.completion})';
+}
+
+extension CompletionResponseExtension
+ on CheckTarget<CompletionResponseForTesting> {
+ CheckTarget<List<CompletionSuggestionForTesting>> get suggestions {
+ var suggestions = value.suggestions
+ .map((e) =>
+ CompletionSuggestionForTesting(response: value, suggestion: e))
+ .toList();
+ return nest(
+ suggestions,
+ (selected) => 'suggestions ${valueStr(selected)}',
+ );
+ }
+}
+
+extension CompletionSuggestionExtension
+ on CheckTarget<CompletionSuggestionForTesting> {
+ CheckTarget<String> get completion {
+ return nest(
+ value.suggestion.completion,
+ (selected) => 'has completion ${valueStr(selected)}',
+ );
+ }
+
+ CheckTarget<String?> get parameterType {
+ return nest(
+ value.suggestion.parameterType,
+ (selected) => 'has parameterType ${valueStr(selected)}',
+ );
+ }
+
+ /// Return the effective replacement length.
+ CheckTarget<int> get replacementLength {
+ return nest(
+ value.replacementLength,
+ (selected) => 'has replacementLength ${valueStr(selected)}',
+ );
+ }
+
+ /// Return the effective replacement offset.
+ CheckTarget<int> get replacementOffset {
+ return nest(
+ value.replacementOffset,
+ (selected) => 'has replacementOffset ${valueStr(selected)}',
+ );
+ }
+
+ CheckTarget<int> get selectionLength {
+ return nest(
+ value.suggestion.selectionLength,
+ (selected) => 'has selectionLength ${valueStr(selected)}',
+ );
+ }
+
+ CheckTarget<int> get selectionOffset {
+ return nest(
+ value.suggestion.selectionOffset,
+ (selected) => 'has selectionOffset ${valueStr(selected)}',
+ );
+ }
+
+ /// Check that the effective replacement offset is the completion request
+ /// offset, and the length of the replacement is zero.
+ void hasEmptyReplacement() {
+ hasReplacement(left: 0, right: 0);
+ }
+
+ /// Check that the effective replacement offset is the completion request
+ /// offset minus [left], and the length of the replacement is `left + right`.
+ void hasReplacement({int left = 0, int right = 0}) {
+ replacementOffset.isEqualTo(value.response.requestOffset - left);
+ replacementLength.isEqualTo(left + right);
+ }
+
+ void hasSelection({required int offset, int length = 0}) {
+ selectionOffset.isEqualTo(offset);
+ selectionLength.isEqualTo(length);
+ }
+}
+
+extension CompletionSuggestionsExtension
+ on CheckTarget<Iterable<CompletionSuggestionForTesting>> {
+ CheckTarget<Iterable<CompletionSuggestionForTesting>> get namedArguments {
+ var result = value
+ .where((suggestion) =>
+ suggestion.suggestion.kind ==
+ CompletionSuggestionKind.NAMED_ARGUMENT)
+ .toList();
+ return nest(
+ result,
+ (selected) => 'named arguments ${valueStr(selected)}',
+ );
+ }
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 0b49b4e..6d7e98d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -334,8 +334,8 @@
/// Compute [_constants] in all units.
void _computeConstants() {
- computeConstants(_typeProvider, _typeSystem, _declaredVariables,
- _constants.toList(), _libraryElement.featureSet);
+ computeConstants(
+ _declaredVariables, _constants.toList(), _libraryElement.featureSet);
}
void _computeHints(FileState file, CompilationUnit unit) {
diff --git a/pkg/analyzer/lib/src/dart/constant/compute.dart b/pkg/analyzer/lib/src/dart/constant/compute.dart
index cb56ffe..b2b67c8 100644
--- a/pkg/analyzer/lib/src/dart/constant/compute.dart
+++ b/pkg/analyzer/lib/src/dart/constant/compute.dart
@@ -4,20 +4,14 @@
import 'package:analyzer/dart/analysis/declared_variables.dart';
import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/dart/element/type_provider.dart';
import 'package:analyzer/src/dart/constant/evaluation.dart';
import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/type_system.dart';
import 'package:analyzer/src/summary/link.dart' as graph
show DependencyWalker, Node;
/// Compute values of the given [constants] with correct ordering.
-void computeConstants(
- TypeProvider typeProvider,
- TypeSystemImpl typeSystem,
- DeclaredVariables declaredVariables,
- List<ConstantEvaluationTarget> constants,
- FeatureSet featureSet) {
+void computeConstants(DeclaredVariables declaredVariables,
+ List<ConstantEvaluationTarget> constants, FeatureSet featureSet) {
var walker = _ConstantWalker(declaredVariables, featureSet);
for (var constant in constants) {
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 43e9949..0a2341a 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -1594,8 +1594,7 @@
/// of formal parameters, are evaluated.
void computeConstantDependencies() {
if (!isConstantEvaluated) {
- computeConstants(library.typeProvider, library.typeSystem,
- context.declaredVariables, [this], library.featureSet);
+ computeConstants(context.declaredVariables, [this], library.featureSet);
}
}
}
@@ -1680,8 +1679,7 @@
'[reference: $reference]',
);
}
- computeConstants(library.typeProvider, library.typeSystem,
- context.declaredVariables, [this], library.featureSet);
+ computeConstants(context.declaredVariables, [this], library.featureSet);
}
return evaluationResult?.value;
}
@@ -2031,9 +2029,8 @@
@override
DartObject? computeConstantValue() {
if (evaluationResult == null) {
- var library = compilationUnit.library;
- computeConstants(library.typeProvider, library.typeSystem,
- context.declaredVariables, [this], library.featureSet);
+ computeConstants(context.declaredVariables, [this],
+ compilationUnit.library.featureSet);
}
return evaluationResult?.value;
}
diff --git a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
index d3ba759..2caa7a1 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
@@ -196,8 +196,8 @@
/// Compute [_constants] in all units.
void _computeConstants() {
- computeConstants(_typeProvider, _typeSystem, _declaredVariables,
- _constants.toList(), _libraryElement.featureSet);
+ computeConstants(
+ _declaredVariables, _constants.toList(), _libraryElement.featureSet);
}
void _computeDiagnostics({
diff --git a/pkg/analyzer/lib/src/lint/linter.dart b/pkg/analyzer/lib/src/lint/linter.dart
index 8b32896..542e9ec 100644
--- a/pkg/analyzer/lib/src/lint/linter.dart
+++ b/pkg/analyzer/lib/src/lint/linter.dart
@@ -375,8 +375,6 @@
);
computeConstants(
- typeProvider,
- typeSystem,
declaredVariables,
dependencies,
libraryElement.featureSet,
@@ -483,8 +481,6 @@
var dependenciesFinder = ConstantExpressionsDependenciesFinder();
node.accept(dependenciesFinder);
computeConstants(
- typeProvider,
- typeSystem,
declaredVariables,
dependenciesFinder.dependencies.toList(),
libraryElement.featureSet,
diff --git a/pkg/analyzer_utilities/lib/check/iterable.dart b/pkg/analyzer_utilities/lib/check/iterable.dart
index 0e3e0d3..e6415c3 100644
--- a/pkg/analyzer_utilities/lib/check/iterable.dart
+++ b/pkg/analyzer_utilities/lib/check/iterable.dart
@@ -4,6 +4,7 @@
import 'package:analyzer_utilities/check/check.dart';
import 'package:meta/meta.dart';
+import 'package:test/test.dart' as test_package;
extension IterableExtension<T> on CheckTarget<Iterable<T>> {
void get isEmpty {
@@ -28,4 +29,51 @@
return nest(actual, (length) => 'has length $length');
}
+
+ /// Succeeds if the number of [matchers] is exactly the same as the number
+ /// of elements in [value], and for each matcher there is exactly one element
+ /// that matches.
+ void matchesInAnyOrder(
+ Iterable<void Function(CheckTarget<T> element)> matchers,
+ ) {
+ var elementList = value.toList();
+ var matcherList = matchers.toList();
+ if (elementList.length != matcherList.length) {
+ fail('Expected ${valueStr(matcherList.length)} elements, '
+ 'actually ${valueStr(elementList.length)}');
+ }
+
+ for (var matcherIndex = 0;
+ matcherIndex < matcherList.length;
+ matcherIndex++) {
+ var matcher = matcherList[matcherIndex];
+ T? matchedElement;
+ for (var elementIndex = 0;
+ elementIndex < elementList.length;
+ elementIndex++) {
+ var element = elementList[elementIndex];
+ var elementTarget = nest(
+ element,
+ (element) =>
+ 'element ${valueStr(element)} at ${valueStr(elementIndex)}',
+ );
+ // Jump to the next element if does not match.
+ try {
+ matcher(elementTarget);
+ } on test_package.TestFailure {
+ continue;
+ }
+ // The element matches, check that it is unique.
+ if (matchedElement == null) {
+ matchedElement = element;
+ } else {
+ fail('Already matched ${valueStr(matchedElement)}, '
+ 'found ${valueStr(element)}');
+ }
+ }
+ if (matchedElement == null) {
+ fail('No match at ${valueStr(matcherIndex)}');
+ }
+ }
+ }
}
diff --git a/pkg/analyzer_utilities/test/check/check_test.dart b/pkg/analyzer_utilities/test/check/check_test.dart
index 907438f..bab4572 100644
--- a/pkg/analyzer_utilities/test/check/check_test.dart
+++ b/pkg/analyzer_utilities/test/check/check_test.dart
@@ -96,6 +96,46 @@
_fails(() => check(<int>[]).isNotEmpty);
_fails(() => check(<int>{}).isNotEmpty);
});
+ test('matchesInAnyOrder', () {
+ // Order does not matter.
+ check([0, 1]).matchesInAnyOrder([
+ (e) => e.isEqualTo(0),
+ (e) => e.isEqualTo(1),
+ ]);
+ check([0, 1]).matchesInAnyOrder([
+ (e) => e.isEqualTo(1),
+ (e) => e.isEqualTo(0),
+ ]);
+ // Matchers can be different.
+ check([0, 1]).matchesInAnyOrder([
+ (e) => e.isZero,
+ (e) => e.isEqualTo(1),
+ ]);
+ check([0, 10]).matchesInAnyOrder([
+ (e) => e.isZero,
+ (e) => e.isGreaterThan(5),
+ ]);
+ // Wrong number of matchers.
+ _fails(
+ () => check([0, 1]).matchesInAnyOrder([
+ (e) => e.isZero,
+ ]),
+ );
+ // The first matcher accepts more than one element.
+ _fails(
+ () => check([1, 2]).matchesInAnyOrder([
+ (e) => e.isGreaterThan(0),
+ (e) => e.isEqualTo(2),
+ ]),
+ );
+ // The second matcher accepts more than one element.
+ _fails(
+ () => check([1, 2]).matchesInAnyOrder([
+ (e) => e.isEqualTo(2),
+ (e) => e.isGreaterThan(0),
+ ]),
+ );
+ });
});
group('nullability', () {
const int? notNullable = 0;
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index 7069199..70eeca3 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -125,7 +125,7 @@
void buildOutlineExpressions(
SourceLibraryBuilder library,
- CoreTypes coreTypes,
+ ClassHierarchy classHierarchy,
List<DelayedActionPerformer> delayedActionPerformers,
List<SynthesizedFunctionNode> synthesizedFunctionNodes);
@@ -351,12 +351,12 @@
@override
void buildOutlineExpressions(
SourceLibraryBuilder library,
- CoreTypes coreTypes,
+ ClassHierarchy classHierarchy,
List<DelayedActionPerformer> delayedActionPerformers,
List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
void build(String ignore, Builder declaration) {
SourceMemberBuilder member = declaration as SourceMemberBuilder;
- member.buildOutlineExpressions(library, coreTypes,
+ member.buildOutlineExpressions(library, classHierarchy,
delayedActionPerformers, synthesizedFunctionNodes);
}
@@ -365,7 +365,7 @@
if (typeVariables != null) {
for (int i = 0; i < typeVariables!.length; i++) {
typeVariables![i].buildOutlineExpressions(library, this, null,
- coreTypes, delayedActionPerformers, scope.parent!);
+ classHierarchy, delayedActionPerformers, scope.parent!);
}
}
diff --git a/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart b/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
index c91f09f..c2e155b 100644
--- a/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
@@ -5,7 +5,8 @@
import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
import 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart';
+import 'package:kernel/class_hierarchy.dart';
+import 'package:kernel/type_algebra.dart';
import '../builder/library_builder.dart';
@@ -41,12 +42,16 @@
import '../util/helpers.dart' show DelayedActionPerformer;
import 'builder.dart';
+import 'class_builder.dart';
import 'field_builder.dart';
import 'formal_parameter_builder.dart';
import 'function_builder.dart';
import 'member_builder.dart';
import 'metadata_builder.dart';
+import 'named_type_builder.dart';
+import 'type_alias_builder.dart';
import 'type_builder.dart';
+import 'type_declaration_builder.dart';
import 'type_variable_builder.dart';
abstract class ConstructorBuilder implements FunctionBuilder {
@@ -75,6 +80,13 @@
Constructor get actualConstructor => _constructor;
+ bool _hasFormalsInferred = false;
+
+ final bool _hasSuperInitializingFormals;
+
+ final List<SynthesizedFunctionNode> _superParameterDefaultValueCloners =
+ <SynthesizedFunctionNode>[];
+
SourceConstructorBuilder(
List<MetadataBuilder>? metadata,
int modifiers,
@@ -106,6 +118,8 @@
charOffset,
tearOffReference,
forAbstractClassOrEnum: forAbstractClassOrEnum),
+ _hasSuperInitializingFormals =
+ formals?.any((formal) => formal.isSuperInitializingFormal) ?? false,
super(metadata, modifiers, returnType, name, typeVariables, formals,
compilationUnit, charOffset, nativeMethodName);
@@ -190,7 +204,8 @@
if (formals != null) {
bool needsInference = false;
for (FormalParameterBuilder formal in formals!) {
- if (formal.type == null && formal.isInitializingFormal) {
+ if (formal.type == null &&
+ (formal.isInitializingFormal || formal.isSuperInitializingFormal)) {
formal.variable!.type = const UnknownType();
needsInference = true;
}
@@ -208,13 +223,205 @@
}
/// Infers the types of any untyped initializing formals.
- void inferFormalTypes() {
+ void inferFormalTypes(ClassHierarchy classHierarchy) {
+ if (_hasFormalsInferred) return;
if (formals != null) {
for (FormalParameterBuilder formal in formals!) {
- if (formal.type == null && formal.isInitializingFormal) {
- formal.finalizeInitializingFormal(classBuilder);
+ if (formal.type == null) {
+ if (formal.isInitializingFormal) {
+ formal.finalizeInitializingFormal(classBuilder);
+ }
}
}
+
+ if (_hasSuperInitializingFormals) {
+ if (beginInitializers != null) {
+ BodyBuilder bodyBuilder = library.loader
+ .createBodyBuilderForOutlineExpression(
+ library, classBuilder, this, classBuilder.scope, fileUri);
+ bodyBuilder.constantContext = ConstantContext.required;
+ bodyBuilder.parseInitializers(beginInitializers!,
+ doFinishConstructor: false);
+ }
+ finalizeSuperInitializingFormals(
+ classHierarchy, _superParameterDefaultValueCloners);
+ }
+ }
+ _hasFormalsInferred = true;
+ }
+
+ /* ConstructorBuilder | DillConstructorBuilder */
+ Object? _computeSuperTargetBuilder() {
+ Constructor superTarget;
+ ClassBuilder superclassBuilder;
+
+ TypeBuilder? supertype = classBuilder.supertypeBuilder;
+ if (supertype is NamedTypeBuilder) {
+ TypeDeclarationBuilder? declaration = supertype.declaration;
+ if (declaration is ClassBuilder) {
+ superclassBuilder = declaration;
+ } else if (declaration is TypeAliasBuilder) {
+ declaration = declaration.unaliasDeclaration(supertype.arguments);
+ if (declaration is ClassBuilder) {
+ superclassBuilder = declaration;
+ } else {
+ // The error in this case should be reported elsewhere.
+ return null;
+ }
+ } else {
+ // The error in this case should be reported elsewhere.
+ return null;
+ }
+ } else {
+ // The error in this case should be reported elsewhere.
+ return null;
+ }
+
+ if (constructor.initializers.isNotEmpty &&
+ constructor.initializers.last is SuperInitializer) {
+ superTarget = (constructor.initializers.last as SuperInitializer).target;
+ } else {
+ MemberBuilder? memberBuilder = superclassBuilder.constructors
+ .lookup("", charOffset, library.fileUri);
+ if (memberBuilder is ConstructorBuilder) {
+ superTarget = memberBuilder.constructor;
+ } else if (memberBuilder is DillConstructorBuilder) {
+ superTarget = memberBuilder.constructor;
+ } else {
+ // The error in this case should be reported elsewhere.
+ return null;
+ }
+ }
+
+ MemberBuilder? constructorBuilder =
+ superclassBuilder.findConstructorOrFactory(
+ superTarget.name.text, charOffset, library.fileUri, library);
+ return constructorBuilder is ConstructorBuilder ||
+ constructorBuilder is DillConstructorBuilder
+ ? constructorBuilder
+ : null;
+ }
+
+ void finalizeSuperInitializingFormals(ClassHierarchy classHierarchy,
+ List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
+ if (formals == null) return;
+ if (!_hasSuperInitializingFormals) return;
+
+ void performRecoveryForErroneousCase() {
+ for (FormalParameterBuilder formal in formals!) {
+ if (formal.isSuperInitializingFormal) {
+ formal.variable!.type = const DynamicType();
+ }
+ }
+ }
+
+ Object? superTargetBuilder = _computeSuperTargetBuilder();
+ Constructor superTarget;
+ List<FormalParameterBuilder>? superFormals;
+ if (superTargetBuilder is SourceConstructorBuilder) {
+ superTarget = superTargetBuilder.constructor;
+ superFormals = superTargetBuilder.formals!;
+ } else if (superTargetBuilder is DillConstructorBuilder) {
+ superTarget = superTargetBuilder.constructor;
+ if (superTargetBuilder is SyntheticConstructorBuilder) {
+ superFormals = superTargetBuilder.formals;
+ } else {
+ // The error in this case should be reported elsewhere. Here we perform
+ // a simple recovery.
+ return performRecoveryForErroneousCase();
+ }
+ } else {
+ // The error in this case should be reported elsewhere. Here we perform a
+ // simple recovery.
+ return performRecoveryForErroneousCase();
+ }
+
+ if (superFormals == null) {
+ // The error in this case should be reported elsewhere. Here we perform a
+ // simple recovery.
+ return performRecoveryForErroneousCase();
+ }
+
+ if (superTargetBuilder is SourceConstructorBuilder) {
+ superTargetBuilder.inferFormalTypes(classHierarchy);
+ } else if (superTargetBuilder is SyntheticConstructorBuilder) {
+ MemberBuilder? superTargetOriginBuilder = superTargetBuilder.actualOrigin;
+ if (superTargetOriginBuilder is SourceConstructorBuilder) {
+ superTargetOriginBuilder.inferFormalTypes(classHierarchy);
+ }
+ }
+
+ int superInitializingFormalIndex = -1;
+ List<int>? positionalSuperParameters;
+ List<String>? namedSuperParameters;
+
+ Supertype? supertype = classHierarchy.getClassAsInstanceOf(
+ classBuilder.cls, superTarget.enclosingClass);
+ assert(supertype != null);
+ Map<TypeParameter, DartType> substitution =
+ new Map<TypeParameter, DartType>.fromIterables(
+ supertype!.classNode.typeParameters, supertype.typeArguments);
+
+ for (int formalIndex = 0; formalIndex < formals!.length; formalIndex++) {
+ FormalParameterBuilder formal = formals![formalIndex];
+ if (formal.isSuperInitializingFormal) {
+ superInitializingFormalIndex++;
+ bool hasImmediatelyDeclaredInitializer = formal.hasDeclaredInitializer;
+ if (formal.type == null) {
+ DartType? type;
+
+ if (formal.isPositional) {
+ if (superInitializingFormalIndex < superFormals.length) {
+ FormalParameterBuilder correspondingSuperFormal =
+ superFormals[superInitializingFormalIndex];
+ formal.hasDeclaredInitializer =
+ hasImmediatelyDeclaredInitializer ||
+ correspondingSuperFormal.hasDeclaredInitializer;
+ if (!hasImmediatelyDeclaredInitializer) {
+ (positionalSuperParameters ??= <int>[]).add(formalIndex);
+ }
+ type = correspondingSuperFormal.variable!.type;
+ } else {
+ // TODO(cstefantsova): Report an error.
+ }
+ } else {
+ FormalParameterBuilder? correspondingSuperFormal;
+ for (FormalParameterBuilder superFormal in superFormals) {
+ if (superFormal.isNamed && superFormal.name == formal.name) {
+ correspondingSuperFormal = superFormal;
+ break;
+ }
+ }
+
+ if (correspondingSuperFormal != null) {
+ formal.hasDeclaredInitializer =
+ hasImmediatelyDeclaredInitializer ||
+ correspondingSuperFormal.hasDeclaredInitializer;
+ if (!hasImmediatelyDeclaredInitializer) {
+ (namedSuperParameters ??= <String>[]).add(formal.name);
+ }
+ type = correspondingSuperFormal.variable!.type;
+ } else {
+ // TODO(cstefantsova): Report an error.
+ }
+ }
+
+ if (substitution.isNotEmpty && type != null) {
+ type = substitute(type, substitution);
+ }
+ formal.variable!.type = type ?? const DynamicType();
+ } else {
+ formal.variable!.type = const DynamicType();
+ }
+ }
+ }
+
+ if (positionalSuperParameters != null || namedSuperParameters != null) {
+ synthesizedFunctionNodes.add(new SynthesizedFunctionNode(
+ substitution, superTarget.function, constructor.function,
+ positionalSuperParameters: positionalSuperParameters ?? const <int>[],
+ namedSuperParameters: namedSuperParameters ?? const <String>[],
+ isOutlineNode: true));
}
}
@@ -223,34 +430,52 @@
@override
void buildOutlineExpressions(
SourceLibraryBuilder library,
- CoreTypes coreTypes,
+ ClassHierarchy classHierarchy,
List<DelayedActionPerformer> delayedActionPerformers,
List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
if (_hasBuiltOutlines) return;
if (isConst && isPatch) {
- origin.buildOutlineExpressions(library, coreTypes,
+ origin.buildOutlineExpressions(library, classHierarchy,
delayedActionPerformers, synthesizedFunctionNodes);
}
- super.buildOutlineExpressions(
- library, coreTypes, delayedActionPerformers, synthesizedFunctionNodes);
+ super.buildOutlineExpressions(library, classHierarchy,
+ delayedActionPerformers, synthesizedFunctionNodes);
// For modular compilation purposes we need to include initializers
- // for const constructors into the outline.
- if (isConst && beginInitializers != null) {
+ // for const constructors into the outline. We also need to parse
+ // initializers to infer types of the super-initializing parameters.
+ if ((isConst || _hasSuperInitializingFormals) &&
+ beginInitializers != null) {
BodyBuilder bodyBuilder = library.loader
.createBodyBuilderForOutlineExpression(
library, classBuilder, this, classBuilder.scope, fileUri);
bodyBuilder.constantContext = ConstantContext.required;
- bodyBuilder.parseInitializers(beginInitializers!);
+ bodyBuilder.parseInitializers(beginInitializers!,
+ doFinishConstructor: isConst);
bodyBuilder.performBacklogComputations(delayedActionPerformers);
}
beginInitializers = null;
+ addSuperParameterDefaultValueCloners(synthesizedFunctionNodes);
if (isConst && isPatch) {
_finishPatch();
}
_hasBuiltOutlines = true;
}
+ void addSuperParameterDefaultValueCloners(
+ List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
+ Object? superTargetBuilder = _computeSuperTargetBuilder();
+ if (superTargetBuilder is SourceConstructorBuilder) {
+ superTargetBuilder
+ .addSuperParameterDefaultValueCloners(synthesizedFunctionNodes);
+ } else if (superTargetBuilder is SyntheticConstructorBuilder) {
+ superTargetBuilder
+ .addSuperParameterDefaultValueCloners(synthesizedFunctionNodes);
+ }
+ synthesizedFunctionNodes.addAll(_superParameterDefaultValueCloners);
+ _superParameterDefaultValueCloners.clear();
+ }
+
@override
void buildFunction(SourceLibraryBuilder library) {
// According to the specification §9.3 the return type of a constructor
@@ -460,21 +685,40 @@
class SyntheticConstructorBuilder extends DillConstructorBuilder
with SourceMemberBuilderMixin {
- SourceMemberBuilder? _origin;
+ // TODO(johnniwinther,cstefantsova): Rename [_origin] to avoid the confusion
+ // with patches.
+ // TODO(johnniwinther): Change the type of [_origin] to SourceMemberBuilder
+ // when it's the supertype for both old SourceMemberBuilder and
+ // SyntheticConstructorBuilder.
+ MemberBuilder? _origin;
SynthesizedFunctionNode? _synthesizedFunctionNode;
SyntheticConstructorBuilder(SourceClassBuilder parent,
Constructor constructor, Procedure? constructorTearOff,
- {SourceMemberBuilder? origin,
- SynthesizedFunctionNode? synthesizedFunctionNode})
+ {MemberBuilder? origin, SynthesizedFunctionNode? synthesizedFunctionNode})
: _origin = origin,
_synthesizedFunctionNode = synthesizedFunctionNode,
super(constructor, constructorTearOff, parent);
+ // TODO(johnniwinther,cstefantsova): Rename [actualOrigin] to avoid the
+ // confusion with patches.
+ MemberBuilder? get actualOrigin {
+ MemberBuilder? origin = _origin;
+ while (origin is SyntheticConstructorBuilder) {
+ origin = origin._origin;
+ }
+ return origin;
+ }
+
+ List<FormalParameterBuilder>? get formals {
+ MemberBuilder? origin = actualOrigin;
+ return origin is SourceConstructorBuilder ? origin.formals : null;
+ }
+
@override
void buildOutlineExpressions(
SourceLibraryBuilder libraryBuilder,
- CoreTypes coreTypes,
+ ClassHierarchy classHierarchy,
List<DelayedActionPerformer> delayedActionPerformers,
List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
if (_origin != null) {
@@ -483,12 +727,32 @@
if (originLibraryBuilder is SourceLibraryBuilder) {
// If [_origin] is from a source library, we need to build the default
// values and initializers first.
- _origin!.buildOutlineExpressions(originLibraryBuilder, coreTypes,
- delayedActionPerformers, synthesizedFunctionNodes);
+ MemberBuilder origin = _origin!;
+ if (origin is SourceConstructorBuilder) {
+ origin.buildOutlineExpressions(originLibraryBuilder, classHierarchy,
+ delayedActionPerformers, synthesizedFunctionNodes);
+ } else if (origin is SyntheticConstructorBuilder) {
+ origin.buildOutlineExpressions(originLibraryBuilder, classHierarchy,
+ delayedActionPerformers, synthesizedFunctionNodes);
+ }
}
- _synthesizedFunctionNode!.cloneDefaultValues();
- _synthesizedFunctionNode = null;
+ addSuperParameterDefaultValueCloners(synthesizedFunctionNodes);
_origin = null;
}
}
+
+ void addSuperParameterDefaultValueCloners(
+ List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
+ MemberBuilder? origin = _origin;
+ if (origin is SourceConstructorBuilder) {
+ origin.addSuperParameterDefaultValueCloners(synthesizedFunctionNodes);
+ } else if (origin is SyntheticConstructorBuilder) {
+ origin.addSuperParameterDefaultValueCloners(synthesizedFunctionNodes);
+ }
+ if (_synthesizedFunctionNode != null) {
+ synthesizedFunctionNodes
+ .add(_synthesizedFunctionNode!..isOutlineNode = true);
+ _synthesizedFunctionNode = null;
+ }
+ }
}
diff --git a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
index a72ac97..1253322 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -27,7 +27,7 @@
StringLiteral,
SuperInitializer,
ThisExpression;
-import 'package:kernel/core_types.dart';
+import 'package:kernel/class_hierarchy.dart';
import 'package:kernel/reference_from_index.dart' show IndexedClass;
@@ -467,7 +467,7 @@
@override
void buildOutlineExpressions(
SourceLibraryBuilder libraryBuilder,
- CoreTypes coreTypes,
+ ClassHierarchy classHierarchy,
List<DelayedActionPerformer> delayedActionPerformers,
List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
List<Expression> values = <Expression>[];
@@ -486,7 +486,7 @@
SourceFieldBuilder valuesBuilder =
firstMemberNamed("values") as SourceFieldBuilder;
valuesBuilder.buildBody(
- coreTypes,
+ classHierarchy.coreTypes,
new ListLiteral(values,
typeArgument: rawType(library.nonNullable), isConst: true));
SourceConstructorBuilder constructorBuilder =
@@ -508,7 +508,7 @@
new IntLiteral(index++),
new StringLiteral(constant),
]);
- field.buildBody(coreTypes,
+ field.buildBody(classHierarchy.coreTypes,
new ConstructorInvocation(constructor, arguments, isConst: true));
}
}
@@ -533,8 +533,8 @@
]));
} else {}
- super.buildOutlineExpressions(
- library, coreTypes, delayedActionPerformers, synthesizedFunctionNodes);
+ super.buildOutlineExpressions(library, classHierarchy,
+ delayedActionPerformers, synthesizedFunctionNodes);
}
@override
diff --git a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
index fabf10a..95e42ab 100644
--- a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart';
+import 'package:kernel/class_hierarchy.dart';
import '../fasta_codes.dart'
show templateInternalProblemNotFoundIn, templateTypeArgumentMismatch;
@@ -37,7 +37,7 @@
void buildOutlineExpressions(
SourceLibraryBuilder library,
- CoreTypes coreTypes,
+ ClassHierarchy classHierarchy,
List<DelayedActionPerformer> delayedActionPerformers,
List<SynthesizedFunctionNode> synthesizedFunctionNodes);
diff --git a/pkg/front_end/lib/src/fasta/builder/factory_builder.dart b/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
index 86c7b96..9d3f52d 100644
--- a/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart';
+import 'package:kernel/class_hierarchy.dart';
import 'package:kernel/type_algebra.dart';
import '../dill/dill_member_builder.dart';
@@ -167,12 +167,12 @@
@override
void buildOutlineExpressions(
SourceLibraryBuilder library,
- CoreTypes coreTypes,
+ ClassHierarchy classHierarchy,
List<DelayedActionPerformer> delayedActionPerformers,
List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
if (_hasBuiltOutlines) return;
- super.buildOutlineExpressions(
- library, coreTypes, delayedActionPerformers, synthesizedFunctionNodes);
+ super.buildOutlineExpressions(library, classHierarchy,
+ delayedActionPerformers, synthesizedFunctionNodes);
_hasBuiltOutlines = true;
}
@@ -374,16 +374,16 @@
@override
void buildOutlineExpressions(
SourceLibraryBuilder library,
- CoreTypes coreTypes,
+ ClassHierarchy classHierarchy,
List<DelayedActionPerformer> delayedActionPerformers,
List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
if (_hasBuiltOutlines) return;
if (isConst && isPatch) {
- origin.buildOutlineExpressions(library, coreTypes,
+ origin.buildOutlineExpressions(library, classHierarchy,
delayedActionPerformers, synthesizedFunctionNodes);
}
- super.buildOutlineExpressions(
- library, coreTypes, delayedActionPerformers, synthesizedFunctionNodes);
+ super.buildOutlineExpressions(library, classHierarchy,
+ delayedActionPerformers, synthesizedFunctionNodes);
RedirectingFactoryBody redirectingFactoryBody =
_procedureInternal.function.body as RedirectingFactoryBody;
List<DartType>? typeArguments = redirectingFactoryBody.typeArguments;
diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
index 8a69632..251ad96 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -7,6 +7,7 @@
import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show Token;
import 'package:kernel/ast.dart';
+import 'package:kernel/class_hierarchy.dart';
import 'package:kernel/core_types.dart';
import 'package:kernel/src/legacy_erasure.dart';
import 'package:kernel/type_algebra.dart';
@@ -419,10 +420,10 @@
@override
void buildOutlineExpressions(
SourceLibraryBuilder library,
- CoreTypes coreTypes,
+ ClassHierarchy classHierarchy,
List<DelayedActionPerformer> delayedActionPerformers,
List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
- _fieldEncoding.completeSignature(coreTypes);
+ _fieldEncoding.completeSignature(classHierarchy.coreTypes);
for (Annotatable annotatable in _fieldEncoding.annotatables) {
MetadataBuilder.buildAnnotations(
@@ -464,7 +465,7 @@
bodyBuilder.transformCollections, library.library);
initializer = wrapper.operand;
}
- buildBody(coreTypes, initializer);
+ buildBody(classHierarchy.coreTypes, initializer);
bodyBuilder.performBacklogComputations(delayedActionPerformers);
}
_constInitializerToken = null;
diff --git a/pkg/front_end/lib/src/fasta/builder/function_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_builder.dart
index 9fda3a8..1390968 100644
--- a/pkg/front_end/lib/src/fasta/builder/function_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/function_builder.dart
@@ -5,7 +5,7 @@
library fasta.procedure_builder;
import 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart';
+import 'package:kernel/class_hierarchy.dart';
import '../identifiers.dart';
import '../scope.dart';
@@ -446,7 +446,7 @@
@override
void buildOutlineExpressions(
SourceLibraryBuilder library,
- CoreTypes coreTypes,
+ ClassHierarchy classHierarchy,
List<DelayedActionPerformer> delayedActionPerformers,
List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
if (!_hasBuiltOutlineExpressions) {
@@ -463,7 +463,7 @@
library,
classOrExtensionBuilder,
this,
- coreTypes,
+ classHierarchy,
delayedActionPerformers,
computeTypeParameterScope(parentScope));
}
diff --git a/pkg/front_end/lib/src/fasta/builder/member_builder.dart b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
index d3e08e6..954097a 100644
--- a/pkg/front_end/lib/src/fasta/builder/member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
@@ -5,7 +5,7 @@
library fasta.member_builder;
import 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart';
+import 'package:kernel/class_hierarchy.dart';
import '../../base/common.dart';
@@ -174,7 +174,7 @@
void buildOutlineExpressions(
SourceLibraryBuilder library,
- CoreTypes coreTypes,
+ ClassHierarchy classHierarchy,
List<DelayedActionPerformer> delayedActionPerformers,
List<SynthesizedFunctionNode> synthesizedFunctionNodes);
}
@@ -223,7 +223,7 @@
@override
void buildOutlineExpressions(
SourceLibraryBuilder library,
- CoreTypes coreTypes,
+ ClassHierarchy classHierarchy,
List<DelayedActionPerformer> delayedActionPerformers,
List<SynthesizedFunctionNode> synthesizedFunctionNodes) {}
diff --git a/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
index 2430ab7a..077db8d 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
@@ -6,7 +6,7 @@
import 'package:kernel/ast.dart'
show DartType, Nullability, TypeParameter, TypeParameterType;
-import 'package:kernel/core_types.dart';
+import 'package:kernel/class_hierarchy.dart';
import '../fasta_codes.dart'
show
@@ -201,7 +201,7 @@
SourceLibraryBuilder libraryBuilder,
DeclarationBuilder? classOrExtensionBuilder,
MemberBuilder? memberBuilder,
- CoreTypes coreTypes,
+ ClassHierarchy classHierarchy,
List<DelayedActionPerformer> delayedActionPerformers,
Scope scope) {
MetadataBuilder.buildAnnotations(parameter, metadata, libraryBuilder,
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart
index 097bdc1..01f0010 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart';
+import 'package:kernel/class_hierarchy.dart';
import '../builder/extension_builder.dart';
import '../builder/library_builder.dart';
@@ -108,7 +108,7 @@
@override
void buildOutlineExpressions(
LibraryBuilder library,
- CoreTypes coreTypes,
+ ClassHierarchy classHierarchy,
List<DelayedActionPerformer> delayedActionPerformers,
List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
// TODO(johnniwinther): Remove the need for this.
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index d8fbe1d..3c7b280 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1085,7 +1085,8 @@
for (int i = 0; i < formals.parameters!.length; i++) {
FormalParameterBuilder parameter = formals.parameters![i];
Expression? initializer = parameter.variable!.initializer;
- if (parameter.isOptional || initializer != null) {
+ if (!parameter.isSuperInitializingFormal &&
+ (parameter.isOptional || initializer != null)) {
if (!parameter.initializerWasInferred) {
parameter.initializerWasInferred = true;
if (parameter.isOptional) {
@@ -1621,7 +1622,7 @@
return fakeReturn.expression!;
}
- void parseInitializers(Token token) {
+ void parseInitializers(Token token, {bool doFinishConstructor = true}) {
Parser parser = new Parser(this,
useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
if (!token.isEof) {
@@ -1630,10 +1631,10 @@
} else {
handleNoInitializers();
}
- // We are passing [AsyncMarker.Sync] because the error will be reported
- // already.
- finishConstructor(
- member as SourceConstructorBuilder, AsyncMarker.Sync, null);
+ if (doFinishConstructor) {
+ finishConstructor(
+ member as SourceConstructorBuilder, AsyncMarker.Sync, null);
+ }
}
Expression parseFieldInitializer(Token token) {
@@ -1724,11 +1725,13 @@
]);
} else {
arguments.positional.addAll(positionalSuperParametersAsArguments);
+ setParents(positionalSuperParametersAsArguments, arguments);
}
}
if (namedSuperParametersAsArguments != null) {
// TODO(cstefantsova): Report name conflicts.
arguments.named.addAll(namedSuperParametersAsArguments);
+ setParents(namedSuperParametersAsArguments, arguments);
}
LocatedMessage? message = checkArgumentsForFunction(
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_helper.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_helper.dart
index bf49dae..8dba882 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_helper.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_helper.dart
@@ -35,9 +35,52 @@
/// named parameters.
final bool identicalSignatures;
+ final List<int>? _positionalSuperParameters;
+
+ final List<String>? _namedSuperParameters;
+
+ bool isOutlineNode;
+
SynthesizedFunctionNode(
this._typeSubstitution, this._original, this._synthesized,
- {this.identicalSignatures: true});
+ {this.identicalSignatures: true,
+ List<int>? positionalSuperParameters: null,
+ List<String>? namedSuperParameters: null,
+ this.isOutlineNode: false})
+ : _positionalSuperParameters = positionalSuperParameters,
+ _namedSuperParameters = namedSuperParameters,
+ // Check that [positionalSuperParameters] and [namedSuperParameters] are
+ // provided or omitted together.
+ assert((positionalSuperParameters == null) ==
+ (namedSuperParameters == null)),
+ assert(positionalSuperParameters == null ||
+ () {
+ // Check that [positionalSuperParameters] is sorted if it's
+ // provided.
+ for (int i = 1; i < positionalSuperParameters.length; i++) {
+ if (positionalSuperParameters[i] <
+ positionalSuperParameters[i - 1]) {
+ return false;
+ }
+ }
+ return true;
+ }()),
+ assert(namedSuperParameters == null ||
+ () {
+ // Check that [namedSuperParameters] are the subset of and in the
+ // same order as the named parameters of [_synthesized].
+ int superParameterIndex = 0;
+ for (int namedParameterIndex = 0;
+ namedParameterIndex < _synthesized.namedParameters.length &&
+ superParameterIndex < namedSuperParameters.length;
+ namedParameterIndex++) {
+ if (_synthesized.namedParameters[namedParameterIndex].name ==
+ namedSuperParameters[superParameterIndex]) {
+ ++superParameterIndex;
+ }
+ }
+ return superParameterIndex == namedSuperParameters.length;
+ }());
void cloneDefaultValues() {
// TODO(ahe): It is unclear if it is legal to use type variables in
@@ -63,17 +106,40 @@
// unrelated.
if (identicalSignatures) {
- assert(_synthesized.positionalParameters.length ==
- _original.positionalParameters.length);
- for (int i = 0; i < _synthesized.positionalParameters.length; i++) {
- cloneInitializer(_original.positionalParameters[i],
- _synthesized.positionalParameters[i]);
+ assert(_positionalSuperParameters != null ||
+ _synthesized.positionalParameters.length ==
+ _original.positionalParameters.length);
+ List<int>? positionalSuperParameters = _positionalSuperParameters;
+ int superParameterIndex = 0;
+ for (int i = 0; i < _original.positionalParameters.length; i++) {
+ if (positionalSuperParameters == null) {
+ cloneInitializer(_original.positionalParameters[i],
+ _synthesized.positionalParameters[i]);
+ } else if (superParameterIndex < positionalSuperParameters.length &&
+ positionalSuperParameters[superParameterIndex] == i) {
+ cloneInitializer(_original.positionalParameters[i],
+ _synthesized.positionalParameters[superParameterIndex]);
+ superParameterIndex++;
+ }
}
- assert(_synthesized.namedParameters.length ==
- _original.namedParameters.length);
- for (int i = 0; i < _synthesized.namedParameters.length; i++) {
- cloneInitializer(
- _original.namedParameters[i], _synthesized.namedParameters[i]);
+
+ assert(_namedSuperParameters != null ||
+ _synthesized.namedParameters.length ==
+ _original.namedParameters.length);
+ List<String>? namedSuperParameters = _namedSuperParameters;
+ superParameterIndex = 0;
+ for (int i = 0; i < _original.namedParameters.length; i++) {
+ if (namedSuperParameters == null) {
+ cloneInitializer(
+ _original.namedParameters[i], _synthesized.namedParameters[i]);
+ } else if (superParameterIndex < namedSuperParameters.length &&
+ namedSuperParameters[superParameterIndex] ==
+ _original.namedParameters[i].name) {
+ // TODO(cstefantsova): Handle the erroneous case of missing names.
+ cloneInitializer(_original.namedParameters[i],
+ _synthesized.namedParameters[superParameterIndex]);
+ superParameterIndex++;
+ }
}
} else {
for (int i = 0; i < _synthesized.positionalParameters.length; i++) {
@@ -110,6 +176,12 @@
}
}
}
+
+ @override
+ String toString() {
+ return "SynthesizedFunctionNode(original=${_original.parent}, "
+ "synthesized=${_synthesized.parent})";
+ }
}
class TypeDependency {
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 2070ba302..4167fe9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -416,9 +416,10 @@
loader.addNoSuchMethodForwarders(sourceClassBuilders);
loader.checkMixins(sourceClassBuilders);
loader.buildOutlineExpressions(
- loader.coreTypes, synthesizedFunctionNodes);
+ loader.hierarchy, synthesizedFunctionNodes);
loader.checkTypes();
loader.checkRedirectingFactories(sourceClassBuilders);
+ finishSynthesizedParameters(forOutline: true);
loader.checkMainMethods();
installAllComponentProblems(loader.allComponentProblems);
loader.allComponentProblems.clear();
@@ -884,22 +885,26 @@
}
return new SyntheticConstructorBuilder(
classBuilder, constructor, constructorTearOff,
- // If the constructor is constant, the default values must be part of
- // the outline expressions. We pass on the original constructor and
- // cloned function nodes to ensure that the default values are computed
- // and cloned for the outline.
- origin: isConst && superConstructorBuilder is SourceMemberBuilder
- ? superConstructorBuilder
- : null,
- synthesizedFunctionNode: isConst ? synthesizedFunctionNode : null);
+ // We pass on the original constructor and the cloned function nodes to
+ // ensure that the default values are computed and cloned for the
+ // outline. It is needed to make the default values a part of the
+ // outline for const constructors, and additionally it is required for
+ // a potential subclass using super initializing parameters that will
+ // required the cloning of the default values.
+ origin: superConstructorBuilder,
+ synthesizedFunctionNode: synthesizedFunctionNode);
}
- void finishSynthesizedParameters() {
+ void finishSynthesizedParameters({bool forOutline = false}) {
for (SynthesizedFunctionNode synthesizedFunctionNode
in synthesizedFunctionNodes) {
- synthesizedFunctionNode.cloneDefaultValues();
+ if (!forOutline || synthesizedFunctionNode.isOutlineNode) {
+ synthesizedFunctionNode.cloneDefaultValues();
+ }
}
- synthesizedFunctionNodes.clear();
+ if (!forOutline) {
+ synthesizedFunctionNodes.clear();
+ }
ticker.logMs("Cloned default values of formals");
}
diff --git a/pkg/front_end/lib/src/fasta/scope.dart b/pkg/front_end/lib/src/fasta/scope.dart
index af11d4d..840e400 100644
--- a/pkg/front_end/lib/src/fasta/scope.dart
+++ b/pkg/front_end/lib/src/fasta/scope.dart
@@ -5,7 +5,7 @@
library fasta.scope;
import 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart';
+import 'package:kernel/class_hierarchy.dart';
import 'builder/builder.dart';
import 'builder/extension_builder.dart';
@@ -820,7 +820,7 @@
@override
void buildOutlineExpressions(
SourceLibraryBuilder library,
- CoreTypes coreTypes,
+ ClassHierarchy classHierarchy,
List<DelayedActionPerformer> delayedActionPerformers,
List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
throw new UnsupportedError(
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 367808c..f60505d 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -7,7 +7,6 @@
import 'package:kernel/ast.dart';
import 'package:kernel/class_hierarchy.dart'
show ClassHierarchy, ClassHierarchyMembers;
-import 'package:kernel/core_types.dart';
import 'package:kernel/reference_from_index.dart' show IndexedClass;
import 'package:kernel/src/bounds_checks.dart';
import 'package:kernel/src/legacy_erasure.dart';
@@ -1927,7 +1926,7 @@
@override
void buildOutlineExpressions(
SourceLibraryBuilder library,
- CoreTypes coreTypes,
+ ClassHierarchy classHierarchy,
List<DelayedActionPerformer> delayedActionPerformers,
List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
// Do nothing.
diff --git a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
index 7e37aee..e17ec41 100644
--- a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart';
+import 'package:kernel/class_hierarchy.dart';
import 'package:kernel/type_environment.dart';
import '../../base/common.dart';
@@ -282,7 +282,7 @@
@override
void buildOutlineExpressions(
SourceLibraryBuilder library,
- CoreTypes coreTypes,
+ ClassHierarchy classHierarchy,
List<DelayedActionPerformer> delayedActionPerformers,
List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
MetadataBuilder.buildAnnotations(isPatch ? origin.extension : extension,
@@ -290,13 +290,13 @@
if (typeParameters != null) {
for (int i = 0; i < typeParameters!.length; i++) {
typeParameters![i].buildOutlineExpressions(library, this, null,
- coreTypes, delayedActionPerformers, scope.parent!);
+ classHierarchy, delayedActionPerformers, scope.parent!);
}
}
void build(String ignore, Builder declaration) {
SourceMemberBuilder member = declaration as SourceMemberBuilder;
- member.buildOutlineExpressions(library, coreTypes,
+ member.buildOutlineExpressions(library, classHierarchy,
delayedActionPerformers, synthesizedFunctionNodes);
}
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index cfa2f08..b7551de 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -17,7 +17,6 @@
import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
import 'package:kernel/clone.dart' show CloneVisitorNotMembers;
-import 'package:kernel/core_types.dart';
import 'package:kernel/reference_from_index.dart'
show IndexedClass, IndexedContainer, IndexedLibrary;
@@ -2580,8 +2579,11 @@
}
if (constructorBuilder.isConst) {
currentTypeParameterScopeBuilder.declaresConstConstructor = true;
+ }
+ if (constructorBuilder.isConst || enableSuperParametersInLibrary) {
// const constructors will have their initializers compiled and written
- // into the outline.
+ // into the outline. In case of super-parameters language feature, the
+ // super initializers are required to infer the types of super parameters.
constructorBuilder.beginInitializers =
beginInitializers ?? new Token.eof(-1);
}
@@ -2972,14 +2974,14 @@
}
void buildOutlineExpressions(
- CoreTypes coreTypes,
+ ClassHierarchy classHierarchy,
List<SynthesizedFunctionNode> synthesizedFunctionNodes,
List<DelayedActionPerformer> delayedActionPerformers) {
Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
if (patches != null) {
for (SourceLibraryBuilder patchLibrary in patches) {
patchLibrary.buildOutlineExpressions(
- coreTypes, synthesizedFunctionNodes, delayedActionPerformers);
+ classHierarchy, synthesizedFunctionNodes, delayedActionPerformers);
}
}
@@ -2990,17 +2992,17 @@
while (iterator.moveNext()) {
Builder declaration = iterator.current;
if (declaration is ClassBuilder) {
- declaration.buildOutlineExpressions(
- this, coreTypes, delayedActionPerformers, synthesizedFunctionNodes);
+ declaration.buildOutlineExpressions(this, classHierarchy,
+ delayedActionPerformers, synthesizedFunctionNodes);
} else if (declaration is ExtensionBuilder) {
- declaration.buildOutlineExpressions(
- this, coreTypes, delayedActionPerformers, synthesizedFunctionNodes);
+ declaration.buildOutlineExpressions(this, classHierarchy,
+ delayedActionPerformers, synthesizedFunctionNodes);
} else if (declaration is SourceMemberBuilder) {
- declaration.buildOutlineExpressions(
- this, coreTypes, delayedActionPerformers, synthesizedFunctionNodes);
+ declaration.buildOutlineExpressions(this, classHierarchy,
+ delayedActionPerformers, synthesizedFunctionNodes);
} else if (declaration is SourceTypeAliasBuilder) {
- declaration.buildOutlineExpressions(
- this, coreTypes, delayedActionPerformers, synthesizedFunctionNodes);
+ declaration.buildOutlineExpressions(this, classHierarchy,
+ delayedActionPerformers, synthesizedFunctionNodes);
} else {
assert(
declaration is PrefixBuilder ||
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 48f3241..b7bcf7a 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -1948,13 +1948,13 @@
ticker.logMs("Checked mixin declaration applications");
}
- void buildOutlineExpressions(CoreTypes coreTypes,
+ void buildOutlineExpressions(ClassHierarchy classHierarchy,
List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
List<DelayedActionPerformer> delayedActionPerformers =
<DelayedActionPerformer>[];
for (SourceLibraryBuilder library in sourceLibraryBuilders) {
library.buildOutlineExpressions(
- coreTypes, synthesizedFunctionNodes, delayedActionPerformers);
+ classHierarchy, synthesizedFunctionNodes, delayedActionPerformers);
}
for (DelayedActionPerformer delayedActionPerformer
in delayedActionPerformers) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
index 9585ec4..7ff533d 100644
--- a/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
@@ -6,8 +6,7 @@
import 'package:front_end/src/fasta/kernel/expression_generator_helper.dart';
import 'package:kernel/ast.dart';
-
-import 'package:kernel/core_types.dart';
+import 'package:kernel/class_hierarchy.dart';
import 'package:kernel/type_algebra.dart'
show FreshTypeParameters, getFreshTypeParameters;
@@ -258,7 +257,7 @@
void buildOutlineExpressions(
SourceLibraryBuilder library,
- CoreTypes coreTypes,
+ ClassHierarchy classHierarchy,
List<DelayedActionPerformer> delayedActionPerformers,
List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
MetadataBuilder.buildAnnotations(
@@ -269,7 +268,7 @@
library,
null,
null,
- coreTypes,
+ classHierarchy,
delayedActionPerformers,
computeTypeParameterScope(library.scope));
}
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
index 34aa46b..407f747 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
@@ -154,7 +154,7 @@
// Field types have all been inferred so we don't need to guard against
// cyclic dependency.
for (SourceConstructorBuilder builder in toBeInferred.values) {
- builder.inferFormalTypes();
+ builder.inferFormalTypes(classHierarchy);
}
toBeInferred.clear();
for (TypeDependency typeDependency in typeDependencies.values) {
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index ad23808..1107037 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -405,7 +405,7 @@
} else if ((constructor = engine.toBeInferred[target]) != null) {
engine.toBeInferred.remove(target);
engine.beingInferred[target] = constructor!;
- constructor.inferFormalTypes();
+ constructor.inferFormalTypes(classHierarchy);
engine.beingInferred.remove(target);
}
}
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index 39c9d6c..3f775f2 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -475,6 +475,7 @@
clone
cloned
cloner
+cloners
clones
cloning
close
@@ -586,6 +587,7 @@
conformed
confuse
confused
+confusion
conjunction
connect
connected
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index ea9623a..5452103 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -934,6 +934,7 @@
t4b
t\b\f\u
t\u0008\f\u
+ta
tails
talk
templates
@@ -974,7 +975,10 @@
trivially
truncated
tt
+tta
ttest
+ttta
+tttta
txt
typeargs
typeparam
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.outline.expect
index 37b4b1f..dfa0d03 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.outline.expect
@@ -34,7 +34,7 @@
abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/ {
}
class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::NamedMixinApplication::T%> with self::Mixin<self::NamedMixinApplication::S%> {
- synthetic constructor •([core::int field]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+ synthetic constructor •([core::int field = 0]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
: super self::Class::•(field)
;
synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
@@ -51,7 +51,7 @@
return new self::NamedMixinApplication::redirectingGenerative<self::NamedMixinApplication::_#redirectingGenerative#tearOff::T%, self::NamedMixinApplication::_#redirectingGenerative#tearOff::S%>(field);
}
abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::AbstractNamedMixinApplication::T%> with self::Mixin<self::AbstractNamedMixinApplication::S%> {
- synthetic constructor •([core::int field]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+ synthetic constructor •([core::int field = 0]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
: super self::Class::•(field)
;
synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
diff --git a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.outline.expect
index c282d10..16c614a 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.outline.expect
@@ -24,7 +24,7 @@
abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/ {
}
class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::NamedMixinApplication::T%> with self::Mixin<self::NamedMixinApplication::S%> {
- synthetic constructor •([core::int field]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+ synthetic constructor •([core::int field = 0]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
: super self::Class::•(field)
;
synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
@@ -35,7 +35,7 @@
;
}
abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::AbstractNamedMixinApplication::T%> with self::Mixin<self::AbstractNamedMixinApplication::S%> {
- synthetic constructor •([core::int field]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+ synthetic constructor •([core::int field = 0]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
: super self::Class::•(field)
;
synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
diff --git a/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.weak.outline.expect b/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.weak.outline.expect
index 2950126..60cff2d 100644
--- a/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.weak.outline.expect
@@ -18,10 +18,10 @@
import "org-dartlang-testcase:///m_lib.dart";
abstract class _B&A&M = a_l::A with m_l::M /*isAnonymousMixin*/ {
- synthetic constructor •({core::double d, (core::String) → core::String s}) → self2::_B&A&M
+ synthetic constructor •({core::double d = #C1, (core::String) → core::String s = #C2}) → self2::_B&A&M
: super a_l::A::•(d: d, s: s)
;
- synthetic constructor factoryConstructor({core::double d, (core::String) → core::String s}) → self2::_B&A&M
+ synthetic constructor factoryConstructor({core::double d = #C1, (core::String) → core::String s = #C2}) → self2::_B&A&M
: super a_l::A::factoryConstructor(d: d, s: s)
;
mixin-super-stub method m1() → dynamic
diff --git a/pkg/front_end/testcases/general/issue31767.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue31767.dart.weak.outline.expect
index d4d8c65..9e60bbc 100644
--- a/pkg/front_end/testcases/general/issue31767.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue31767.dart.weak.outline.expect
@@ -25,7 +25,7 @@
;
}
class D = self::C with self::M {
- synthetic constructor foo(core::int* x, [core::int* y, core::int* z]) → self::D*
+ synthetic constructor foo(core::int* x, [core::int* y = 0, core::int* z = 0]) → self::D*
: super self::C::foo(x, y, z)
;
mixin-super-stub get w2() → core::int*
@@ -36,7 +36,7 @@
;
}
class E = iss::A with self::N {
- synthetic constructor foo(core::int* x, [core::int* y, core::int* z, iss::_A* a]) → self::E*
+ synthetic constructor foo(core::int* x, [core::int* y = iss::_private, core::int* z = iss::_private, iss::_A* a = const iss::_A::•(5)]) → self::E*
: super iss::A::foo(x, y, z, a)
;
mixin-super-stub get w2() → core::int*
@@ -92,7 +92,10 @@
Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///issue31767.dart:31:7 -> IntConstant(3)
+Evaluated: StaticGet @ org-dartlang-testcase:///issue31767.dart:31:7 -> IntConstant(3)
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue31767.dart:31:7 -> InstanceConstant(const _A{_A.field: 5})
Evaluated: StaticGet @ org-dartlang-testcase:///issue31767_lib.dart:14:25 -> IntConstant(3)
Evaluated: StaticGet @ org-dartlang-testcase:///issue31767_lib.dart:14:43 -> IntConstant(3)
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue31767_lib.dart:14:68 -> InstanceConstant(const _A{_A.field: 5})
-Extra constant evaluation: evaluated: 13, effectively constant: 3
+Extra constant evaluation: evaluated: 16, effectively constant: 6
diff --git a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.weak.outline.expect b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.weak.outline.expect
index b84923c..4244473 100644
--- a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.weak.outline.expect
@@ -41,7 +41,7 @@
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class D = self::C<core::String*> with self::M {
- synthetic constructor •({dynamic a, dynamic b}) → self::D*
+ synthetic constructor •({dynamic a = 0, dynamic b = invalid-type}) → self::D*
: super self::C::•(a: a, b: b)
;
}
@@ -50,7 +50,7 @@
;
}
abstract class _F&C&M = self::C<core::int*> with self::M /*isAnonymousMixin*/ {
- synthetic constructor •({dynamic a, dynamic b}) → self::_F&C&M*
+ synthetic constructor •({dynamic a = 0, dynamic b = invalid-type}) → self::_F&C&M*
: super self::C::•(a: a, b: b)
;
}
@@ -64,4 +64,6 @@
Extra constant evaluation status:
Evaluated: TypeLiteral @ org-dartlang-testcase:///mixin_constructors_with_default_values.dart:9:15 -> TypeLiteralConstant(<invalid>)
-Extra constant evaluation: evaluated: 5, effectively constant: 1
+Evaluated: TypeLiteral @ org-dartlang-testcase:///mixin_constructors_with_default_values.dart:14:7 -> TypeLiteralConstant(<invalid>)
+Evaluated: TypeLiteral @ org-dartlang-testcase:///mixin_constructors_with_default_values.dart:18:7 -> TypeLiteralConstant(<invalid>)
+Extra constant evaluation: evaluated: 7, effectively constant: 3
diff --git a/pkg/front_end/testcases/general/mixin_from_patch/main.dart.weak.outline.expect b/pkg/front_end/testcases/general/mixin_from_patch/main.dart.weak.outline.expect
index 46d5dff..bffd38a 100644
--- a/pkg/front_end/testcases/general/mixin_from_patch/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_from_patch/main.dart.weak.outline.expect
@@ -52,7 +52,7 @@
synthetic constructor unpatched() → self2::_SubClass&Class&Mixin*
: super self2::Class::unpatched()
;
- synthetic constructor _internal({core::bool* value}) → self2::_SubClass&Class&Mixin*
+ synthetic constructor _internal({core::bool* value = false}) → self2::_SubClass&Class&Mixin*
: super self2::Class::_internal(value: value)
;
}
diff --git a/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart
new file mode 100644
index 0000000..9a48c68
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2021, 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.
+
+B1 f1() => throw 42;
+
+class A1 {
+ var foo = f1(); // Ok.
+ A1(this.foo);
+}
+
+class B1 extends A1 {
+ B1(super.foo) : super();
+}
+
+class A2 {
+ var foo = B2.new; // Error.
+ A2(this.foo);
+}
+
+class B2 extends A2 {
+ B2(super.foo) : super();
+}
+
+class A3 {
+ var foo = C3.new; // Error.
+ A3();
+ A3.initializeFoo(this.foo);
+}
+
+class B3 extends A3 {
+ var bar = A3.initializeFoo;
+ B3(this.bar) : super();
+}
+
+class C3 extends B3 {
+ C3(super.bar) : super();
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.strong.expect b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.strong.expect
new file mode 100644
index 0000000..063d341
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.strong.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:17:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+// var foo = B2.new; // Error.
+// ^^^
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:26:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+// var foo = C3.new; // Error.
+// ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ field self::B1 foo = self::f1();
+ constructor •(self::B1 foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+}
+class B1 extends self::A1 {
+ constructor •(self::B1 foo) → self::B1
+ : super self::A1::•(foo)
+ ;
+}
+class A2 extends core::Object {
+ field invalid-type foo = #C1;
+ constructor •(invalid-type foo) → self::A2
+ : self::A2::foo = foo, super core::Object::•()
+ ;
+}
+class B2 extends self::A2 {
+ constructor •(invalid-type foo) → self::B2
+ : super self::A2::•(foo)
+ ;
+}
+class A3 extends core::Object {
+ field invalid-type foo = #C2;
+ constructor •() → self::A3
+ : super core::Object::•()
+ ;
+ constructor initializeFoo(invalid-type foo) → self::A3
+ : self::A3::foo = foo, super core::Object::•()
+ ;
+}
+class B3 extends self::A3 {
+ field (invalid-type) → self::A3 bar = #C3;
+ constructor •((invalid-type) → self::A3 bar) → self::B3
+ : self::B3::bar = bar, super self::A3::•()
+ ;
+}
+class C3 extends self::B3 {
+ constructor •((invalid-type) → self::A3 bar) → self::C3
+ : super self::B3::•(bar)
+ ;
+}
+static method f1() → self::B1
+ return throw 42;
+static method main() → dynamic {}
+
+constants {
+ #C1 = constructor-tearoff self::B2::•
+ #C2 = constructor-tearoff self::C3::•
+ #C3 = constructor-tearoff self::A3::initializeFoo
+}
diff --git a/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.strong.transformed.expect
new file mode 100644
index 0000000..063d341
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.strong.transformed.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:17:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+// var foo = B2.new; // Error.
+// ^^^
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:26:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+// var foo = C3.new; // Error.
+// ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ field self::B1 foo = self::f1();
+ constructor •(self::B1 foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+}
+class B1 extends self::A1 {
+ constructor •(self::B1 foo) → self::B1
+ : super self::A1::•(foo)
+ ;
+}
+class A2 extends core::Object {
+ field invalid-type foo = #C1;
+ constructor •(invalid-type foo) → self::A2
+ : self::A2::foo = foo, super core::Object::•()
+ ;
+}
+class B2 extends self::A2 {
+ constructor •(invalid-type foo) → self::B2
+ : super self::A2::•(foo)
+ ;
+}
+class A3 extends core::Object {
+ field invalid-type foo = #C2;
+ constructor •() → self::A3
+ : super core::Object::•()
+ ;
+ constructor initializeFoo(invalid-type foo) → self::A3
+ : self::A3::foo = foo, super core::Object::•()
+ ;
+}
+class B3 extends self::A3 {
+ field (invalid-type) → self::A3 bar = #C3;
+ constructor •((invalid-type) → self::A3 bar) → self::B3
+ : self::B3::bar = bar, super self::A3::•()
+ ;
+}
+class C3 extends self::B3 {
+ constructor •((invalid-type) → self::A3 bar) → self::C3
+ : super self::B3::•(bar)
+ ;
+}
+static method f1() → self::B1
+ return throw 42;
+static method main() → dynamic {}
+
+constants {
+ #C1 = constructor-tearoff self::B2::•
+ #C2 = constructor-tearoff self::C3::•
+ #C3 = constructor-tearoff self::A3::initializeFoo
+}
diff --git a/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.textual_outline.expect b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.textual_outline.expect
new file mode 100644
index 0000000..94dbab2
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.textual_outline.expect
@@ -0,0 +1,28 @@
+B1 f1() => throw 42;
+class A1 {
+ var foo = f1();
+ A1(this.foo);
+}
+class B1 extends A1 {
+ B1(super.foo) : super();
+}
+class A2 {
+ var foo = B2.new;
+ A2(this.foo);
+}
+class B2 extends A2 {
+ B2(super.foo) : super();
+}
+class A3 {
+ var foo = C3.new;
+ A3();
+ A3.initializeFoo(this.foo);
+}
+class B3 extends A3 {
+ var bar = A3.initializeFoo;
+ B3(this.bar) : super();
+}
+class C3 extends B3 {
+ C3(super.bar) : super();
+}
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.expect b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.expect
new file mode 100644
index 0000000..063d341
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:17:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+// var foo = B2.new; // Error.
+// ^^^
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:26:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+// var foo = C3.new; // Error.
+// ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ field self::B1 foo = self::f1();
+ constructor •(self::B1 foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+}
+class B1 extends self::A1 {
+ constructor •(self::B1 foo) → self::B1
+ : super self::A1::•(foo)
+ ;
+}
+class A2 extends core::Object {
+ field invalid-type foo = #C1;
+ constructor •(invalid-type foo) → self::A2
+ : self::A2::foo = foo, super core::Object::•()
+ ;
+}
+class B2 extends self::A2 {
+ constructor •(invalid-type foo) → self::B2
+ : super self::A2::•(foo)
+ ;
+}
+class A3 extends core::Object {
+ field invalid-type foo = #C2;
+ constructor •() → self::A3
+ : super core::Object::•()
+ ;
+ constructor initializeFoo(invalid-type foo) → self::A3
+ : self::A3::foo = foo, super core::Object::•()
+ ;
+}
+class B3 extends self::A3 {
+ field (invalid-type) → self::A3 bar = #C3;
+ constructor •((invalid-type) → self::A3 bar) → self::B3
+ : self::B3::bar = bar, super self::A3::•()
+ ;
+}
+class C3 extends self::B3 {
+ constructor •((invalid-type) → self::A3 bar) → self::C3
+ : super self::B3::•(bar)
+ ;
+}
+static method f1() → self::B1
+ return throw 42;
+static method main() → dynamic {}
+
+constants {
+ #C1 = constructor-tearoff self::B2::•
+ #C2 = constructor-tearoff self::C3::•
+ #C3 = constructor-tearoff self::A3::initializeFoo
+}
diff --git a/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..063d341
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.modular.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:17:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+// var foo = B2.new; // Error.
+// ^^^
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:26:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+// var foo = C3.new; // Error.
+// ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ field self::B1 foo = self::f1();
+ constructor •(self::B1 foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+}
+class B1 extends self::A1 {
+ constructor •(self::B1 foo) → self::B1
+ : super self::A1::•(foo)
+ ;
+}
+class A2 extends core::Object {
+ field invalid-type foo = #C1;
+ constructor •(invalid-type foo) → self::A2
+ : self::A2::foo = foo, super core::Object::•()
+ ;
+}
+class B2 extends self::A2 {
+ constructor •(invalid-type foo) → self::B2
+ : super self::A2::•(foo)
+ ;
+}
+class A3 extends core::Object {
+ field invalid-type foo = #C2;
+ constructor •() → self::A3
+ : super core::Object::•()
+ ;
+ constructor initializeFoo(invalid-type foo) → self::A3
+ : self::A3::foo = foo, super core::Object::•()
+ ;
+}
+class B3 extends self::A3 {
+ field (invalid-type) → self::A3 bar = #C3;
+ constructor •((invalid-type) → self::A3 bar) → self::B3
+ : self::B3::bar = bar, super self::A3::•()
+ ;
+}
+class C3 extends self::B3 {
+ constructor •((invalid-type) → self::A3 bar) → self::C3
+ : super self::B3::•(bar)
+ ;
+}
+static method f1() → self::B1
+ return throw 42;
+static method main() → dynamic {}
+
+constants {
+ #C1 = constructor-tearoff self::B2::•
+ #C2 = constructor-tearoff self::C3::•
+ #C3 = constructor-tearoff self::A3::initializeFoo
+}
diff --git a/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.outline.expect
new file mode 100644
index 0000000..1647019
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.outline.expect
@@ -0,0 +1,55 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:17:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+// var foo = B2.new; // Error.
+// ^^^
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:26:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+// var foo = C3.new; // Error.
+// ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ field self::B1 foo;
+ constructor •(self::B1 foo) → self::A1
+ ;
+}
+class B1 extends self::A1 {
+ constructor •(self::B1 foo) → self::B1
+ ;
+}
+class A2 extends core::Object {
+ field invalid-type foo;
+ constructor •(invalid-type foo) → self::A2
+ ;
+}
+class B2 extends self::A2 {
+ constructor •(invalid-type foo) → self::B2
+ ;
+}
+class A3 extends core::Object {
+ field invalid-type foo;
+ constructor •() → self::A3
+ ;
+ constructor initializeFoo(invalid-type foo) → self::A3
+ ;
+}
+class B3 extends self::A3 {
+ field (invalid-type) → self::A3 bar;
+ constructor •((invalid-type) → self::A3 bar) → self::B3
+ ;
+}
+class C3 extends self::B3 {
+ constructor •((invalid-type) → self::A3 bar) → self::C3
+ ;
+}
+static method f1() → self::B1
+ ;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.transformed.expect
new file mode 100644
index 0000000..063d341
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart.weak.transformed.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:17:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+// var foo = B2.new; // Error.
+// ^^^
+//
+// pkg/front_end/testcases/super_parameters/circular_dependency_inference.dart:26:7: Error: Can't infer the type of 'foo': circularity found during type inference.
+// Specify the type explicitly.
+// var foo = C3.new; // Error.
+// ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ field self::B1 foo = self::f1();
+ constructor •(self::B1 foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+}
+class B1 extends self::A1 {
+ constructor •(self::B1 foo) → self::B1
+ : super self::A1::•(foo)
+ ;
+}
+class A2 extends core::Object {
+ field invalid-type foo = #C1;
+ constructor •(invalid-type foo) → self::A2
+ : self::A2::foo = foo, super core::Object::•()
+ ;
+}
+class B2 extends self::A2 {
+ constructor •(invalid-type foo) → self::B2
+ : super self::A2::•(foo)
+ ;
+}
+class A3 extends core::Object {
+ field invalid-type foo = #C2;
+ constructor •() → self::A3
+ : super core::Object::•()
+ ;
+ constructor initializeFoo(invalid-type foo) → self::A3
+ : self::A3::foo = foo, super core::Object::•()
+ ;
+}
+class B3 extends self::A3 {
+ field (invalid-type) → self::A3 bar = #C3;
+ constructor •((invalid-type) → self::A3 bar) → self::B3
+ : self::B3::bar = bar, super self::A3::•()
+ ;
+}
+class C3 extends self::B3 {
+ constructor •((invalid-type) → self::A3 bar) → self::C3
+ : super self::B3::•(bar)
+ ;
+}
+static method f1() → self::B1
+ return throw 42;
+static method main() → dynamic {}
+
+constants {
+ #C1 = constructor-tearoff self::B2::•
+ #C2 = constructor-tearoff self::C3::•
+ #C3 = constructor-tearoff self::A3::initializeFoo
+}
diff --git a/pkg/front_end/testcases/super_parameters/default_values.dart b/pkg/front_end/testcases/super_parameters/default_values.dart
new file mode 100644
index 0000000..515a046
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/default_values.dart
@@ -0,0 +1,109 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class S1 {
+ int s;
+ S1([int x = 0]) : s = x - 1;
+}
+
+class C1 extends S1 {
+ int c;
+ C1([super.x]) : c = x + 1; // Ok.
+}
+
+class S2 {
+ int s;
+ S2({int x = 0}) : s = x - 1;
+}
+
+class C2 extends S2 {
+ int c;
+ C2({super.x}) : c = x + 1; // Ok.
+}
+
+class S3 {
+ int s;
+ S3([int x = 0]) : s = x - 1;
+}
+
+class C3 extends S3 {
+ int c;
+ C3([super.x = 42]) : c = x + 1; // Ok.
+}
+
+class S4 {
+ int s;
+ S4({int x = 0}) : s = x - 1;
+}
+
+class C4 extends S4 {
+ int c;
+ C4({super.x = 42}) : c = x + 1; // Ok.
+}
+
+class S5 {
+ num a;
+ S5([num x = 3.14]) : a = x - 1;
+}
+
+class C5 extends S5 {
+ C5([int super.x]); // Error.
+}
+
+class S6 {
+ num? a;
+ S6([num? x = 3.14]) : a = x;
+}
+
+class C6 extends S6 {
+ int? b;
+ C6([int? super.x]); // Ok.
+}
+
+class S7 {
+ int s;
+ S7([int x = 0]) : s = x - 1;
+}
+
+class C7 extends S7 {
+ int c;
+ C7([super.x]) : c = x + 1;
+}
+
+class CC7 extends C7 {
+ int cc;
+ CC7([super.x]) : cc = x * 1;
+}
+
+class S8 {
+ int s;
+ S8([int x = 0]) : s = x - 1;
+}
+
+class CC8 extends C8 {
+ int cc;
+ CC8([super.x]) : cc = x * 1;
+}
+
+class C8 extends S8 {
+ int c;
+ C8([super.x]) : c = x + 1;
+}
+
+class CC9 extends C9 {
+ int cc;
+ CC9([super.x]) : cc = x * 1;
+}
+
+class C9 extends S9 {
+ int c;
+ C9([super.x]) : c = x + 1;
+}
+
+class S9 {
+ int s;
+ S9([int x = 0]) : s = x - 1;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/default_values.dart.strong.expect b/pkg/front_end/testcases/super_parameters/default_values.dart.strong.expect
new file mode 100644
index 0000000..d27a628
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/default_values.dart.strong.expect
@@ -0,0 +1,148 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:51:11: Error: Expected ']' before this.
+// C5([int super.x]); // Error.
+// ^^^^^
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:61:10: Error: Expected ']' before this.
+// C6([int? super.x]); // Ok.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class S1 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S1
+ : self::S1::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C1 extends self::S1 {
+ field core::int c;
+ constructor •([core::int x = #C1]) → self::C1
+ : self::C1::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S1::•(x)
+ ;
+}
+class S2 extends core::Object {
+ field core::int s;
+ constructor •({core::int x = #C1}) → self::S2
+ : self::S2::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C2 extends self::S2 {
+ field core::int c;
+ constructor •({core::int x = #C1}) → self::C2
+ : self::C2::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S2::•(x: x)
+ ;
+}
+class S3 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S3
+ : self::S3::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C3 extends self::S3 {
+ field core::int c;
+ constructor •([core::int x = #C2]) → self::C3
+ : self::C3::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S3::•(x)
+ ;
+}
+class S4 extends core::Object {
+ field core::int s;
+ constructor •({core::int x = #C1}) → self::S4
+ : self::S4::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C4 extends self::S4 {
+ field core::int c;
+ constructor •({core::int x = #C2}) → self::C4
+ : self::C4::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S4::•(x: x)
+ ;
+}
+class S5 extends core::Object {
+ field core::num a;
+ constructor •([core::num x = #C3]) → self::S5
+ : self::S5::a = x.{core::num::-}(1){(core::num) → core::num}, super core::Object::•()
+ ;
+}
+class C5 extends self::S5 {
+ constructor •([dynamic int = #C4]) → self::C5
+ : super self::S5::•()
+ ;
+}
+class S6 extends core::Object {
+ field core::num? a;
+ constructor •([core::num? x = #C3]) → self::S6
+ : self::S6::a = x, super core::Object::•()
+ ;
+}
+class C6 extends self::S6 {
+ field core::int? b = null;
+ constructor •([dynamic int = #C4]) → self::C6
+ : super self::S6::•()
+ ;
+}
+class S7 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S7
+ : self::S7::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C7 extends self::S7 {
+ field core::int c;
+ constructor •([core::int x = #C1]) → self::C7
+ : self::C7::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S7::•(x)
+ ;
+}
+class CC7 extends self::C7 {
+ field core::int cc;
+ constructor •([core::int x = #C1]) → self::CC7
+ : self::CC7::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C7::•(x)
+ ;
+}
+class S8 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S8
+ : self::S8::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class CC8 extends self::C8 {
+ field core::int cc;
+ constructor •([core::int x = #C1]) → self::CC8
+ : self::CC8::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C8::•(x)
+ ;
+}
+class C8 extends self::S8 {
+ field core::int c;
+ constructor •([core::int x = #C1]) → self::C8
+ : self::C8::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S8::•(x)
+ ;
+}
+class CC9 extends self::C9 {
+ field core::int cc;
+ constructor •([core::int x = #C1]) → self::CC9
+ : self::CC9::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C9::•(x)
+ ;
+}
+class C9 extends self::S9 {
+ field core::int c;
+ constructor •([core::int x = #C1]) → self::C9
+ : self::C9::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S9::•(x)
+ ;
+}
+class S9 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S9
+ : self::S9::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = 42
+ #C3 = 3.14
+ #C4 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/default_values.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/default_values.dart.strong.transformed.expect
new file mode 100644
index 0000000..d27a628
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/default_values.dart.strong.transformed.expect
@@ -0,0 +1,148 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:51:11: Error: Expected ']' before this.
+// C5([int super.x]); // Error.
+// ^^^^^
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:61:10: Error: Expected ']' before this.
+// C6([int? super.x]); // Ok.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class S1 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S1
+ : self::S1::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C1 extends self::S1 {
+ field core::int c;
+ constructor •([core::int x = #C1]) → self::C1
+ : self::C1::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S1::•(x)
+ ;
+}
+class S2 extends core::Object {
+ field core::int s;
+ constructor •({core::int x = #C1}) → self::S2
+ : self::S2::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C2 extends self::S2 {
+ field core::int c;
+ constructor •({core::int x = #C1}) → self::C2
+ : self::C2::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S2::•(x: x)
+ ;
+}
+class S3 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S3
+ : self::S3::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C3 extends self::S3 {
+ field core::int c;
+ constructor •([core::int x = #C2]) → self::C3
+ : self::C3::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S3::•(x)
+ ;
+}
+class S4 extends core::Object {
+ field core::int s;
+ constructor •({core::int x = #C1}) → self::S4
+ : self::S4::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C4 extends self::S4 {
+ field core::int c;
+ constructor •({core::int x = #C2}) → self::C4
+ : self::C4::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S4::•(x: x)
+ ;
+}
+class S5 extends core::Object {
+ field core::num a;
+ constructor •([core::num x = #C3]) → self::S5
+ : self::S5::a = x.{core::num::-}(1){(core::num) → core::num}, super core::Object::•()
+ ;
+}
+class C5 extends self::S5 {
+ constructor •([dynamic int = #C4]) → self::C5
+ : super self::S5::•()
+ ;
+}
+class S6 extends core::Object {
+ field core::num? a;
+ constructor •([core::num? x = #C3]) → self::S6
+ : self::S6::a = x, super core::Object::•()
+ ;
+}
+class C6 extends self::S6 {
+ field core::int? b = null;
+ constructor •([dynamic int = #C4]) → self::C6
+ : super self::S6::•()
+ ;
+}
+class S7 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S7
+ : self::S7::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C7 extends self::S7 {
+ field core::int c;
+ constructor •([core::int x = #C1]) → self::C7
+ : self::C7::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S7::•(x)
+ ;
+}
+class CC7 extends self::C7 {
+ field core::int cc;
+ constructor •([core::int x = #C1]) → self::CC7
+ : self::CC7::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C7::•(x)
+ ;
+}
+class S8 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S8
+ : self::S8::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class CC8 extends self::C8 {
+ field core::int cc;
+ constructor •([core::int x = #C1]) → self::CC8
+ : self::CC8::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C8::•(x)
+ ;
+}
+class C8 extends self::S8 {
+ field core::int c;
+ constructor •([core::int x = #C1]) → self::C8
+ : self::C8::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S8::•(x)
+ ;
+}
+class CC9 extends self::C9 {
+ field core::int cc;
+ constructor •([core::int x = #C1]) → self::CC9
+ : self::CC9::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C9::•(x)
+ ;
+}
+class C9 extends self::S9 {
+ field core::int c;
+ constructor •([core::int x = #C1]) → self::C9
+ : self::C9::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S9::•(x)
+ ;
+}
+class S9 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S9
+ : self::S9::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = 42
+ #C3 = 3.14
+ #C4 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/default_values.dart.textual_outline.expect b/pkg/front_end/testcases/super_parameters/default_values.dart.textual_outline.expect
new file mode 100644
index 0000000..1cb3689
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/default_values.dart.textual_outline.expect
@@ -0,0 +1,84 @@
+class S1 {
+ int s;
+ S1([int x = 0]) : s = x - 1;
+}
+class C1 extends S1 {
+ int c;
+ C1([super.x]) : c = x + 1;
+}
+class S2 {
+ int s;
+ S2({int x = 0}) : s = x - 1;
+}
+class C2 extends S2 {
+ int c;
+ C2({super.x}) : c = x + 1;
+}
+class S3 {
+ int s;
+ S3([int x = 0]) : s = x - 1;
+}
+class C3 extends S3 {
+ int c;
+ C3([super.x = 42]) : c = x + 1;
+}
+class S4 {
+ int s;
+ S4({int x = 0}) : s = x - 1;
+}
+class C4 extends S4 {
+ int c;
+ C4({super.x = 42}) : c = x + 1;
+}
+class S5 {
+ num a;
+ S5([num x = 3.14]) : a = x - 1;
+}
+class C5 extends S5 {
+ C5([int super.x]);
+}
+class S6 {
+ num? a;
+ S6([num? x = 3.14]) : a = x;
+}
+class C6 extends S6 {
+ int? b;
+ C6([int? super.x]);
+}
+class S7 {
+ int s;
+ S7([int x = 0]) : s = x - 1;
+}
+class C7 extends S7 {
+ int c;
+ C7([super.x]) : c = x + 1;
+}
+class CC7 extends C7 {
+ int cc;
+ CC7([super.x]) : cc = x * 1;
+}
+class S8 {
+ int s;
+ S8([int x = 0]) : s = x - 1;
+}
+class CC8 extends C8 {
+ int cc;
+ CC8([super.x]) : cc = x * 1;
+}
+class C8 extends S8 {
+ int c;
+ C8([super.x]) : c = x + 1;
+}
+class CC9 extends C9 {
+ int cc;
+ CC9([super.x]) : cc = x * 1;
+}
+class C9 extends S9 {
+ int c;
+ C9([super.x]) : c = x + 1;
+}
+class S9 {
+ int s;
+ S9([int x = 0]) : s = x - 1;
+}
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/default_values.dart.weak.expect b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.expect
new file mode 100644
index 0000000..d27a628
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.expect
@@ -0,0 +1,148 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:51:11: Error: Expected ']' before this.
+// C5([int super.x]); // Error.
+// ^^^^^
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:61:10: Error: Expected ']' before this.
+// C6([int? super.x]); // Ok.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class S1 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S1
+ : self::S1::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C1 extends self::S1 {
+ field core::int c;
+ constructor •([core::int x = #C1]) → self::C1
+ : self::C1::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S1::•(x)
+ ;
+}
+class S2 extends core::Object {
+ field core::int s;
+ constructor •({core::int x = #C1}) → self::S2
+ : self::S2::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C2 extends self::S2 {
+ field core::int c;
+ constructor •({core::int x = #C1}) → self::C2
+ : self::C2::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S2::•(x: x)
+ ;
+}
+class S3 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S3
+ : self::S3::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C3 extends self::S3 {
+ field core::int c;
+ constructor •([core::int x = #C2]) → self::C3
+ : self::C3::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S3::•(x)
+ ;
+}
+class S4 extends core::Object {
+ field core::int s;
+ constructor •({core::int x = #C1}) → self::S4
+ : self::S4::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C4 extends self::S4 {
+ field core::int c;
+ constructor •({core::int x = #C2}) → self::C4
+ : self::C4::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S4::•(x: x)
+ ;
+}
+class S5 extends core::Object {
+ field core::num a;
+ constructor •([core::num x = #C3]) → self::S5
+ : self::S5::a = x.{core::num::-}(1){(core::num) → core::num}, super core::Object::•()
+ ;
+}
+class C5 extends self::S5 {
+ constructor •([dynamic int = #C4]) → self::C5
+ : super self::S5::•()
+ ;
+}
+class S6 extends core::Object {
+ field core::num? a;
+ constructor •([core::num? x = #C3]) → self::S6
+ : self::S6::a = x, super core::Object::•()
+ ;
+}
+class C6 extends self::S6 {
+ field core::int? b = null;
+ constructor •([dynamic int = #C4]) → self::C6
+ : super self::S6::•()
+ ;
+}
+class S7 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S7
+ : self::S7::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C7 extends self::S7 {
+ field core::int c;
+ constructor •([core::int x = #C1]) → self::C7
+ : self::C7::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S7::•(x)
+ ;
+}
+class CC7 extends self::C7 {
+ field core::int cc;
+ constructor •([core::int x = #C1]) → self::CC7
+ : self::CC7::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C7::•(x)
+ ;
+}
+class S8 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S8
+ : self::S8::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class CC8 extends self::C8 {
+ field core::int cc;
+ constructor •([core::int x = #C1]) → self::CC8
+ : self::CC8::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C8::•(x)
+ ;
+}
+class C8 extends self::S8 {
+ field core::int c;
+ constructor •([core::int x = #C1]) → self::C8
+ : self::C8::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S8::•(x)
+ ;
+}
+class CC9 extends self::C9 {
+ field core::int cc;
+ constructor •([core::int x = #C1]) → self::CC9
+ : self::CC9::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C9::•(x)
+ ;
+}
+class C9 extends self::S9 {
+ field core::int c;
+ constructor •([core::int x = #C1]) → self::C9
+ : self::C9::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S9::•(x)
+ ;
+}
+class S9 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S9
+ : self::S9::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = 42
+ #C3 = 3.14
+ #C4 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/default_values.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.modular.expect
new file mode 100644
index 0000000..d27a628
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.modular.expect
@@ -0,0 +1,148 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:51:11: Error: Expected ']' before this.
+// C5([int super.x]); // Error.
+// ^^^^^
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:61:10: Error: Expected ']' before this.
+// C6([int? super.x]); // Ok.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class S1 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S1
+ : self::S1::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C1 extends self::S1 {
+ field core::int c;
+ constructor •([core::int x = #C1]) → self::C1
+ : self::C1::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S1::•(x)
+ ;
+}
+class S2 extends core::Object {
+ field core::int s;
+ constructor •({core::int x = #C1}) → self::S2
+ : self::S2::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C2 extends self::S2 {
+ field core::int c;
+ constructor •({core::int x = #C1}) → self::C2
+ : self::C2::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S2::•(x: x)
+ ;
+}
+class S3 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S3
+ : self::S3::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C3 extends self::S3 {
+ field core::int c;
+ constructor •([core::int x = #C2]) → self::C3
+ : self::C3::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S3::•(x)
+ ;
+}
+class S4 extends core::Object {
+ field core::int s;
+ constructor •({core::int x = #C1}) → self::S4
+ : self::S4::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C4 extends self::S4 {
+ field core::int c;
+ constructor •({core::int x = #C2}) → self::C4
+ : self::C4::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S4::•(x: x)
+ ;
+}
+class S5 extends core::Object {
+ field core::num a;
+ constructor •([core::num x = #C3]) → self::S5
+ : self::S5::a = x.{core::num::-}(1){(core::num) → core::num}, super core::Object::•()
+ ;
+}
+class C5 extends self::S5 {
+ constructor •([dynamic int = #C4]) → self::C5
+ : super self::S5::•()
+ ;
+}
+class S6 extends core::Object {
+ field core::num? a;
+ constructor •([core::num? x = #C3]) → self::S6
+ : self::S6::a = x, super core::Object::•()
+ ;
+}
+class C6 extends self::S6 {
+ field core::int? b = null;
+ constructor •([dynamic int = #C4]) → self::C6
+ : super self::S6::•()
+ ;
+}
+class S7 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S7
+ : self::S7::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C7 extends self::S7 {
+ field core::int c;
+ constructor •([core::int x = #C1]) → self::C7
+ : self::C7::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S7::•(x)
+ ;
+}
+class CC7 extends self::C7 {
+ field core::int cc;
+ constructor •([core::int x = #C1]) → self::CC7
+ : self::CC7::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C7::•(x)
+ ;
+}
+class S8 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S8
+ : self::S8::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class CC8 extends self::C8 {
+ field core::int cc;
+ constructor •([core::int x = #C1]) → self::CC8
+ : self::CC8::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C8::•(x)
+ ;
+}
+class C8 extends self::S8 {
+ field core::int c;
+ constructor •([core::int x = #C1]) → self::C8
+ : self::C8::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S8::•(x)
+ ;
+}
+class CC9 extends self::C9 {
+ field core::int cc;
+ constructor •([core::int x = #C1]) → self::CC9
+ : self::CC9::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C9::•(x)
+ ;
+}
+class C9 extends self::S9 {
+ field core::int c;
+ constructor •([core::int x = #C1]) → self::C9
+ : self::C9::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S9::•(x)
+ ;
+}
+class S9 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S9
+ : self::S9::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = 42
+ #C3 = 3.14
+ #C4 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/default_values.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.outline.expect
new file mode 100644
index 0000000..9cb4ff2
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.outline.expect
@@ -0,0 +1,121 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:51:11: Error: Expected ']' before this.
+// C5([int super.x]); // Error.
+// ^^^^^
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:61:10: Error: Expected ']' before this.
+// C6([int? super.x]); // Ok.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class S1 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = 0]) → self::S1
+ ;
+}
+class C1 extends self::S1 {
+ field core::int c;
+ constructor •([core::int x = 0]) → self::C1
+ ;
+}
+class S2 extends core::Object {
+ field core::int s;
+ constructor •({core::int x = 0}) → self::S2
+ ;
+}
+class C2 extends self::S2 {
+ field core::int c;
+ constructor •({core::int x = 0}) → self::C2
+ ;
+}
+class S3 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = 0]) → self::S3
+ ;
+}
+class C3 extends self::S3 {
+ field core::int c;
+ constructor •([core::int x = 42]) → self::C3
+ ;
+}
+class S4 extends core::Object {
+ field core::int s;
+ constructor •({core::int x = 0}) → self::S4
+ ;
+}
+class C4 extends self::S4 {
+ field core::int c;
+ constructor •({core::int x = 42}) → self::C4
+ ;
+}
+class S5 extends core::Object {
+ field core::num a;
+ constructor •([core::num x = 3.14]) → self::S5
+ ;
+}
+class C5 extends self::S5 {
+ constructor •([dynamic int]) → self::C5
+ ;
+}
+class S6 extends core::Object {
+ field core::num? a;
+ constructor •([core::num? x = 3.14]) → self::S6
+ ;
+}
+class C6 extends self::S6 {
+ field core::int? b;
+ constructor •([dynamic int]) → self::C6
+ ;
+}
+class S7 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = 0]) → self::S7
+ ;
+}
+class C7 extends self::S7 {
+ field core::int c;
+ constructor •([core::int x = 0]) → self::C7
+ ;
+}
+class CC7 extends self::C7 {
+ field core::int cc;
+ constructor •([core::int x = 0]) → self::CC7
+ ;
+}
+class S8 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = 0]) → self::S8
+ ;
+}
+class CC8 extends self::C8 {
+ field core::int cc;
+ constructor •([core::int x = 0]) → self::CC8
+ ;
+}
+class C8 extends self::S8 {
+ field core::int c;
+ constructor •([core::int x = 0]) → self::C8
+ ;
+}
+class CC9 extends self::C9 {
+ field core::int cc;
+ constructor •([core::int x = 0]) → self::CC9
+ ;
+}
+class C9 extends self::S9 {
+ field core::int c;
+ constructor •([core::int x = 0]) → self::C9
+ ;
+}
+class S9 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = 0]) → self::S9
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/super_parameters/default_values.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.transformed.expect
new file mode 100644
index 0000000..d27a628
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/default_values.dart.weak.transformed.expect
@@ -0,0 +1,148 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:51:11: Error: Expected ']' before this.
+// C5([int super.x]); // Error.
+// ^^^^^
+//
+// pkg/front_end/testcases/super_parameters/default_values.dart:61:10: Error: Expected ']' before this.
+// C6([int? super.x]); // Ok.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class S1 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S1
+ : self::S1::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C1 extends self::S1 {
+ field core::int c;
+ constructor •([core::int x = #C1]) → self::C1
+ : self::C1::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S1::•(x)
+ ;
+}
+class S2 extends core::Object {
+ field core::int s;
+ constructor •({core::int x = #C1}) → self::S2
+ : self::S2::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C2 extends self::S2 {
+ field core::int c;
+ constructor •({core::int x = #C1}) → self::C2
+ : self::C2::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S2::•(x: x)
+ ;
+}
+class S3 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S3
+ : self::S3::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C3 extends self::S3 {
+ field core::int c;
+ constructor •([core::int x = #C2]) → self::C3
+ : self::C3::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S3::•(x)
+ ;
+}
+class S4 extends core::Object {
+ field core::int s;
+ constructor •({core::int x = #C1}) → self::S4
+ : self::S4::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C4 extends self::S4 {
+ field core::int c;
+ constructor •({core::int x = #C2}) → self::C4
+ : self::C4::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S4::•(x: x)
+ ;
+}
+class S5 extends core::Object {
+ field core::num a;
+ constructor •([core::num x = #C3]) → self::S5
+ : self::S5::a = x.{core::num::-}(1){(core::num) → core::num}, super core::Object::•()
+ ;
+}
+class C5 extends self::S5 {
+ constructor •([dynamic int = #C4]) → self::C5
+ : super self::S5::•()
+ ;
+}
+class S6 extends core::Object {
+ field core::num? a;
+ constructor •([core::num? x = #C3]) → self::S6
+ : self::S6::a = x, super core::Object::•()
+ ;
+}
+class C6 extends self::S6 {
+ field core::int? b = null;
+ constructor •([dynamic int = #C4]) → self::C6
+ : super self::S6::•()
+ ;
+}
+class S7 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S7
+ : self::S7::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class C7 extends self::S7 {
+ field core::int c;
+ constructor •([core::int x = #C1]) → self::C7
+ : self::C7::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S7::•(x)
+ ;
+}
+class CC7 extends self::C7 {
+ field core::int cc;
+ constructor •([core::int x = #C1]) → self::CC7
+ : self::CC7::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C7::•(x)
+ ;
+}
+class S8 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S8
+ : self::S8::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+class CC8 extends self::C8 {
+ field core::int cc;
+ constructor •([core::int x = #C1]) → self::CC8
+ : self::CC8::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C8::•(x)
+ ;
+}
+class C8 extends self::S8 {
+ field core::int c;
+ constructor •([core::int x = #C1]) → self::C8
+ : self::C8::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S8::•(x)
+ ;
+}
+class CC9 extends self::C9 {
+ field core::int cc;
+ constructor •([core::int x = #C1]) → self::CC9
+ : self::CC9::cc = x.{core::num::*}(1){(core::num) → core::int}, super self::C9::•(x)
+ ;
+}
+class C9 extends self::S9 {
+ field core::int c;
+ constructor •([core::int x = #C1]) → self::C9
+ : self::C9::c = x.{core::num::+}(1){(core::num) → core::int}, super self::S9::•(x)
+ ;
+}
+class S9 extends core::Object {
+ field core::int s;
+ constructor •([core::int x = #C1]) → self::S9
+ : self::S9::s = x.{core::num::-}(1){(core::num) → core::int}, super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = 42
+ #C3 = 3.14
+ #C4 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.strong.expect b/pkg/front_end/testcases/super_parameters/simple.dart.strong.expect
index 2738e5e..1b2cab9 100644
--- a/pkg/front_end/testcases/super_parameters/simple.dart.strong.expect
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.strong.expect
@@ -9,7 +9,7 @@
;
}
class B extends self::A {
- constructor •(dynamic foo) → self::B
+ constructor •(core::int foo) → self::B
: super self::A::•(foo)
;
}
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/simple.dart.strong.transformed.expect
index 2738e5e..1b2cab9 100644
--- a/pkg/front_end/testcases/super_parameters/simple.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.strong.transformed.expect
@@ -9,7 +9,7 @@
;
}
class B extends self::A {
- constructor •(dynamic foo) → self::B
+ constructor •(core::int foo) → self::B
: super self::A::•(foo)
;
}
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.weak.expect b/pkg/front_end/testcases/super_parameters/simple.dart.weak.expect
index 2738e5e..1b2cab9 100644
--- a/pkg/front_end/testcases/super_parameters/simple.dart.weak.expect
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.weak.expect
@@ -9,7 +9,7 @@
;
}
class B extends self::A {
- constructor •(dynamic foo) → self::B
+ constructor •(core::int foo) → self::B
: super self::A::•(foo)
;
}
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/simple.dart.weak.modular.expect
index 2738e5e..1b2cab9 100644
--- a/pkg/front_end/testcases/super_parameters/simple.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.weak.modular.expect
@@ -9,7 +9,7 @@
;
}
class B extends self::A {
- constructor •(dynamic foo) → self::B
+ constructor •(core::int foo) → self::B
: super self::A::•(foo)
;
}
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/simple.dart.weak.outline.expect
index 997a20e..61584c5 100644
--- a/pkg/front_end/testcases/super_parameters/simple.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.weak.outline.expect
@@ -8,7 +8,7 @@
;
}
class B extends self::A {
- constructor •(dynamic foo) → self::B
+ constructor •(core::int foo) → self::B
;
}
static method main() → dynamic
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/simple.dart.weak.transformed.expect
index 2738e5e..1b2cab9 100644
--- a/pkg/front_end/testcases/super_parameters/simple.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.weak.transformed.expect
@@ -9,7 +9,7 @@
;
}
class B extends self::A {
- constructor •(dynamic foo) → self::B
+ constructor •(core::int foo) → self::B
: super self::A::•(foo)
;
}
diff --git a/pkg/front_end/testcases/super_parameters/simple_inference.dart b/pkg/front_end/testcases/super_parameters/simple_inference.dart
new file mode 100644
index 0000000..41034252
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_inference.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A1 {
+ final int foo;
+ A1(this.foo);
+ A1.named(this.foo);
+ A1.named2(int foo) : foo = foo;
+ A1.named3({required int foo}) : foo = foo;
+}
+
+class B1 extends A1 {
+ B1(super.foo);
+ B1.named(super.foo) : super.named();
+ B1.named2(super.foo) : super.named2();
+ B1.named3({required super.foo}) : super.named3();
+}
+
+class A2 {
+ final int foo;
+ final String bar;
+ A2({required int this.foo, required String this.bar});
+}
+
+class B2 extends A2 {
+ B2({required super.bar, required super.foo});
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_inference.dart.strong.expect b/pkg/front_end/testcases/super_parameters/simple_inference.dart.strong.expect
new file mode 100644
index 0000000..2422e10
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_inference.dart.strong.expect
@@ -0,0 +1,50 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ final field core::int foo;
+ constructor •(core::int foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+ constructor named(core::int foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+ constructor named2(core::int foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+ constructor named3({required core::int foo = #C1}) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+}
+class B1 extends self::A1 {
+ constructor •(core::int foo) → self::B1
+ : super self::A1::•(foo)
+ ;
+ constructor named(core::int foo) → self::B1
+ : super self::A1::named(foo)
+ ;
+ constructor named2(core::int foo) → self::B1
+ : super self::A1::named2(foo)
+ ;
+ constructor named3({required dynamic foo = #C1}) → self::B1
+ : super self::A1::named3(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ ;
+}
+class A2 extends core::Object {
+ final field core::int foo;
+ final field core::String bar;
+ constructor •({required core::int foo = #C1, required core::String bar = #C1}) → self::A2
+ : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+ ;
+}
+class B2 extends self::A2 {
+ constructor •({required core::String bar = #C1, required core::int foo = #C1}) → self::B2
+ : super self::A2::•(bar: bar, foo: foo)
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/simple_inference.dart.strong.transformed.expect
new file mode 100644
index 0000000..2422e10
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_inference.dart.strong.transformed.expect
@@ -0,0 +1,50 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ final field core::int foo;
+ constructor •(core::int foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+ constructor named(core::int foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+ constructor named2(core::int foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+ constructor named3({required core::int foo = #C1}) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+}
+class B1 extends self::A1 {
+ constructor •(core::int foo) → self::B1
+ : super self::A1::•(foo)
+ ;
+ constructor named(core::int foo) → self::B1
+ : super self::A1::named(foo)
+ ;
+ constructor named2(core::int foo) → self::B1
+ : super self::A1::named2(foo)
+ ;
+ constructor named3({required dynamic foo = #C1}) → self::B1
+ : super self::A1::named3(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ ;
+}
+class A2 extends core::Object {
+ final field core::int foo;
+ final field core::String bar;
+ constructor •({required core::int foo = #C1, required core::String bar = #C1}) → self::A2
+ : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+ ;
+}
+class B2 extends self::A2 {
+ constructor •({required core::String bar = #C1, required core::int foo = #C1}) → self::B2
+ : super self::A2::•(bar: bar, foo: foo)
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_inference.dart.textual_outline.expect b/pkg/front_end/testcases/super_parameters/simple_inference.dart.textual_outline.expect
new file mode 100644
index 0000000..a194020
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_inference.dart.textual_outline.expect
@@ -0,0 +1,22 @@
+class A1 {
+ final int foo;
+ A1(this.foo);
+ A1.named(this.foo);
+ A1.named2(int foo) : foo = foo;
+ A1.named3({required int foo}) : foo = foo;
+}
+class B1 extends A1 {
+ B1(super.foo);
+ B1.named(super.foo) : super.named();
+ B1.named2(super.foo) : super.named2();
+ B1.named3({required super.foo}) : super.named3();
+}
+class A2 {
+ final int foo;
+ final String bar;
+ A2({required int this.foo, required String this.bar});
+}
+class B2 extends A2 {
+ B2({required super.bar, required super.foo});
+}
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.expect b/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.expect
new file mode 100644
index 0000000..2422e10
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.expect
@@ -0,0 +1,50 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ final field core::int foo;
+ constructor •(core::int foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+ constructor named(core::int foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+ constructor named2(core::int foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+ constructor named3({required core::int foo = #C1}) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+}
+class B1 extends self::A1 {
+ constructor •(core::int foo) → self::B1
+ : super self::A1::•(foo)
+ ;
+ constructor named(core::int foo) → self::B1
+ : super self::A1::named(foo)
+ ;
+ constructor named2(core::int foo) → self::B1
+ : super self::A1::named2(foo)
+ ;
+ constructor named3({required dynamic foo = #C1}) → self::B1
+ : super self::A1::named3(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ ;
+}
+class A2 extends core::Object {
+ final field core::int foo;
+ final field core::String bar;
+ constructor •({required core::int foo = #C1, required core::String bar = #C1}) → self::A2
+ : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+ ;
+}
+class B2 extends self::A2 {
+ constructor •({required core::String bar = #C1, required core::int foo = #C1}) → self::B2
+ : super self::A2::•(bar: bar, foo: foo)
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..2422e10
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ final field core::int foo;
+ constructor •(core::int foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+ constructor named(core::int foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+ constructor named2(core::int foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+ constructor named3({required core::int foo = #C1}) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+}
+class B1 extends self::A1 {
+ constructor •(core::int foo) → self::B1
+ : super self::A1::•(foo)
+ ;
+ constructor named(core::int foo) → self::B1
+ : super self::A1::named(foo)
+ ;
+ constructor named2(core::int foo) → self::B1
+ : super self::A1::named2(foo)
+ ;
+ constructor named3({required dynamic foo = #C1}) → self::B1
+ : super self::A1::named3(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ ;
+}
+class A2 extends core::Object {
+ final field core::int foo;
+ final field core::String bar;
+ constructor •({required core::int foo = #C1, required core::String bar = #C1}) → self::A2
+ : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+ ;
+}
+class B2 extends self::A2 {
+ constructor •({required core::String bar = #C1, required core::int foo = #C1}) → self::B2
+ : super self::A2::•(bar: bar, foo: foo)
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.outline.expect
new file mode 100644
index 0000000..c7b816c
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.outline.expect
@@ -0,0 +1,37 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ final field core::int foo;
+ constructor •(core::int foo) → self::A1
+ ;
+ constructor named(core::int foo) → self::A1
+ ;
+ constructor named2(core::int foo) → self::A1
+ ;
+ constructor named3({required core::int foo}) → self::A1
+ ;
+}
+class B1 extends self::A1 {
+ constructor •(core::int foo) → self::B1
+ ;
+ constructor named(core::int foo) → self::B1
+ ;
+ constructor named2(core::int foo) → self::B1
+ ;
+ constructor named3({required dynamic foo}) → self::B1
+ ;
+}
+class A2 extends core::Object {
+ final field core::int foo;
+ final field core::String bar;
+ constructor •({required core::int foo, required core::String bar}) → self::A2
+ ;
+}
+class B2 extends self::A2 {
+ constructor •({required core::String bar, required core::int foo}) → self::B2
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.transformed.expect
new file mode 100644
index 0000000..2422e10
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.transformed.expect
@@ -0,0 +1,50 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ final field core::int foo;
+ constructor •(core::int foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+ constructor named(core::int foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+ constructor named2(core::int foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+ constructor named3({required core::int foo = #C1}) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+}
+class B1 extends self::A1 {
+ constructor •(core::int foo) → self::B1
+ : super self::A1::•(foo)
+ ;
+ constructor named(core::int foo) → self::B1
+ : super self::A1::named(foo)
+ ;
+ constructor named2(core::int foo) → self::B1
+ : super self::A1::named2(foo)
+ ;
+ constructor named3({required dynamic foo = #C1}) → self::B1
+ : super self::A1::named3(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ ;
+}
+class A2 extends core::Object {
+ final field core::int foo;
+ final field core::String bar;
+ constructor •({required core::int foo = #C1, required core::String bar = #C1}) → self::A2
+ : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+ ;
+}
+class B2 extends self::A2 {
+ constructor •({required core::String bar = #C1, required core::int foo = #C1}) → self::B2
+ : super self::A2::•(bar: bar, foo: foo)
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.expect
index 01051cd..ad7ea47 100644
--- a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.expect
@@ -24,17 +24,17 @@
;
}
class B1 extends self::A1 {
- constructor •({required dynamic foo = #C1}) → self::B1
- : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ constructor •({required core::int foo = #C1}) → self::B1
+ : super self::A1::•(foo: foo)
;
}
class C1 extends self::A1 {
- constructor •({required dynamic foo = #C1}) → self::C1
+ constructor •({required core::int foo = #C1}) → self::C1
: super self::A1::•(foo: invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
C1({required super.foo}) : super(foo: foo); // Error.
^^^" in block {
foo;
- } =>foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ } =>foo)
;
}
class A2 extends core::Object {
@@ -52,13 +52,13 @@
;
}
class C2 extends self::A2 {
- constructor •({required dynamic foo = #C1}) → self::C2
+ constructor •({required core::int foo = #C1}) → self::C2
: final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
C2({required super.foo}) : super(); // Error.
^"
;
- constructor other({required dynamic foo = #C1}) → self::C2
- : super self::A2::•(bar: "bar", foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ constructor other({required core::int foo = #C1}) → self::C2
+ : super self::A2::•(bar: "bar", foo: foo)
;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.transformed.expect
index 74cac10..ad7ea47 100644
--- a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.transformed.expect
@@ -24,12 +24,12 @@
;
}
class B1 extends self::A1 {
- constructor •({required dynamic foo = #C1}) → self::B1
- : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ constructor •({required core::int foo = #C1}) → self::B1
+ : super self::A1::•(foo: foo)
;
}
class C1 extends self::A1 {
- constructor •({required dynamic foo = #C1}) → self::C1
+ constructor •({required core::int foo = #C1}) → self::C1
: super self::A1::•(foo: invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
C1({required super.foo}) : super(foo: foo); // Error.
^^^" in block {
@@ -52,13 +52,13 @@
;
}
class C2 extends self::A2 {
- constructor •({required dynamic foo = #C1}) → self::C2
+ constructor •({required core::int foo = #C1}) → self::C2
: final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
C2({required super.foo}) : super(); // Error.
^"
;
- constructor other({required dynamic foo = #C1}) → self::C2
- : super self::A2::•(bar: "bar", foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ constructor other({required core::int foo = #C1}) → self::C2
+ : super self::A2::•(bar: "bar", foo: foo)
;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.expect
index 01051cd..ad7ea47 100644
--- a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.expect
@@ -24,17 +24,17 @@
;
}
class B1 extends self::A1 {
- constructor •({required dynamic foo = #C1}) → self::B1
- : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ constructor •({required core::int foo = #C1}) → self::B1
+ : super self::A1::•(foo: foo)
;
}
class C1 extends self::A1 {
- constructor •({required dynamic foo = #C1}) → self::C1
+ constructor •({required core::int foo = #C1}) → self::C1
: super self::A1::•(foo: invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
C1({required super.foo}) : super(foo: foo); // Error.
^^^" in block {
foo;
- } =>foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ } =>foo)
;
}
class A2 extends core::Object {
@@ -52,13 +52,13 @@
;
}
class C2 extends self::A2 {
- constructor •({required dynamic foo = #C1}) → self::C2
+ constructor •({required core::int foo = #C1}) → self::C2
: final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
C2({required super.foo}) : super(); // Error.
^"
;
- constructor other({required dynamic foo = #C1}) → self::C2
- : super self::A2::•(bar: "bar", foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ constructor other({required core::int foo = #C1}) → self::C2
+ : super self::A2::•(bar: "bar", foo: foo)
;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.modular.expect
index 01051cd..ad7ea47 100644
--- a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.modular.expect
@@ -24,17 +24,17 @@
;
}
class B1 extends self::A1 {
- constructor •({required dynamic foo = #C1}) → self::B1
- : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ constructor •({required core::int foo = #C1}) → self::B1
+ : super self::A1::•(foo: foo)
;
}
class C1 extends self::A1 {
- constructor •({required dynamic foo = #C1}) → self::C1
+ constructor •({required core::int foo = #C1}) → self::C1
: super self::A1::•(foo: invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
C1({required super.foo}) : super(foo: foo); // Error.
^^^" in block {
foo;
- } =>foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ } =>foo)
;
}
class A2 extends core::Object {
@@ -52,13 +52,13 @@
;
}
class C2 extends self::A2 {
- constructor •({required dynamic foo = #C1}) → self::C2
+ constructor •({required core::int foo = #C1}) → self::C2
: final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
C2({required super.foo}) : super(); // Error.
^"
;
- constructor other({required dynamic foo = #C1}) → self::C2
- : super self::A2::•(bar: "bar", foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ constructor other({required core::int foo = #C1}) → self::C2
+ : super self::A2::•(bar: "bar", foo: foo)
;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.outline.expect
index f3d5bdd..99e1ef3 100644
--- a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.outline.expect
@@ -8,11 +8,11 @@
;
}
class B1 extends self::A1 {
- constructor •({required dynamic foo}) → self::B1
+ constructor •({required core::int foo}) → self::B1
;
}
class C1 extends self::A1 {
- constructor •({required dynamic foo}) → self::C1
+ constructor •({required core::int foo}) → self::C1
;
}
class A2 extends core::Object {
@@ -26,9 +26,9 @@
;
}
class C2 extends self::A2 {
- constructor •({required dynamic foo}) → self::C2
+ constructor •({required core::int foo}) → self::C2
;
- constructor other({required dynamic foo}) → self::C2
+ constructor other({required core::int foo}) → self::C2
;
}
static method main() → dynamic
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.transformed.expect
index 74cac10..ad7ea47 100644
--- a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.transformed.expect
@@ -24,12 +24,12 @@
;
}
class B1 extends self::A1 {
- constructor •({required dynamic foo = #C1}) → self::B1
- : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ constructor •({required core::int foo = #C1}) → self::B1
+ : super self::A1::•(foo: foo)
;
}
class C1 extends self::A1 {
- constructor •({required dynamic foo = #C1}) → self::C1
+ constructor •({required core::int foo = #C1}) → self::C1
: super self::A1::•(foo: invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
C1({required super.foo}) : super(foo: foo); // Error.
^^^" in block {
@@ -52,13 +52,13 @@
;
}
class C2 extends self::A2 {
- constructor •({required dynamic foo = #C1}) → self::C2
+ constructor •({required core::int foo = #C1}) → self::C2
: final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
C2({required super.foo}) : super(); // Error.
^"
;
- constructor other({required dynamic foo = #C1}) → self::C2
- : super self::A2::•(bar: "bar", foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ constructor other({required core::int foo = #C1}) → self::C2
+ : super self::A2::•(bar: "bar", foo: foo)
;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.expect
index 228f432..4d064a8 100644
--- a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.expect
@@ -28,12 +28,12 @@
;
}
class B1 extends self::A1 {
- constructor •(dynamic foo) → self::B1
- : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ constructor •(core::int foo) → self::B1
+ : super self::A1::•(foo)
;
}
class C1 extends self::A1 {
- constructor •(dynamic foo) → self::C1
+ constructor •(core::int foo) → self::C1
: super self::A1::•(42)
;
}
@@ -53,7 +53,7 @@
;
}
class C2 extends self::A2 {
- constructor •(dynamic foo) → self::C2
+ constructor •(core::int foo) → self::C2
: final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
C2(super.foo) : super(); // Error.
^"
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.transformed.expect
index 228f432..4d064a8 100644
--- a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.transformed.expect
@@ -28,12 +28,12 @@
;
}
class B1 extends self::A1 {
- constructor •(dynamic foo) → self::B1
- : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ constructor •(core::int foo) → self::B1
+ : super self::A1::•(foo)
;
}
class C1 extends self::A1 {
- constructor •(dynamic foo) → self::C1
+ constructor •(core::int foo) → self::C1
: super self::A1::•(42)
;
}
@@ -53,7 +53,7 @@
;
}
class C2 extends self::A2 {
- constructor •(dynamic foo) → self::C2
+ constructor •(core::int foo) → self::C2
: final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
C2(super.foo) : super(); // Error.
^"
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.expect
index 228f432..4d064a8 100644
--- a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.expect
@@ -28,12 +28,12 @@
;
}
class B1 extends self::A1 {
- constructor •(dynamic foo) → self::B1
- : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ constructor •(core::int foo) → self::B1
+ : super self::A1::•(foo)
;
}
class C1 extends self::A1 {
- constructor •(dynamic foo) → self::C1
+ constructor •(core::int foo) → self::C1
: super self::A1::•(42)
;
}
@@ -53,7 +53,7 @@
;
}
class C2 extends self::A2 {
- constructor •(dynamic foo) → self::C2
+ constructor •(core::int foo) → self::C2
: final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
C2(super.foo) : super(); // Error.
^"
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.modular.expect
index 228f432..4d064a8 100644
--- a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.modular.expect
@@ -28,12 +28,12 @@
;
}
class B1 extends self::A1 {
- constructor •(dynamic foo) → self::B1
- : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ constructor •(core::int foo) → self::B1
+ : super self::A1::•(foo)
;
}
class C1 extends self::A1 {
- constructor •(dynamic foo) → self::C1
+ constructor •(core::int foo) → self::C1
: super self::A1::•(42)
;
}
@@ -53,7 +53,7 @@
;
}
class C2 extends self::A2 {
- constructor •(dynamic foo) → self::C2
+ constructor •(core::int foo) → self::C2
: final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
C2(super.foo) : super(); // Error.
^"
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.outline.expect
index 184b3f4..383a149 100644
--- a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.outline.expect
@@ -8,11 +8,11 @@
;
}
class B1 extends self::A1 {
- constructor •(dynamic foo) → self::B1
+ constructor •(core::int foo) → self::B1
;
}
class C1 extends self::A1 {
- constructor •(dynamic foo) → self::C1
+ constructor •(core::int foo) → self::C1
;
}
class A2 extends core::Object {
@@ -26,7 +26,7 @@
;
}
class C2 extends self::A2 {
- constructor •(dynamic foo) → self::C2
+ constructor •(core::int foo) → self::C2
;
}
static method main() → dynamic
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.transformed.expect
index 228f432..4d064a8 100644
--- a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.transformed.expect
@@ -28,12 +28,12 @@
;
}
class B1 extends self::A1 {
- constructor •(dynamic foo) → self::B1
- : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ constructor •(core::int foo) → self::B1
+ : super self::A1::•(foo)
;
}
class C1 extends self::A1 {
- constructor •(dynamic foo) → self::C1
+ constructor •(core::int foo) → self::C1
: super self::A1::•(42)
;
}
@@ -53,7 +53,7 @@
;
}
class C2 extends self::A2 {
- constructor •(dynamic foo) → self::C2
+ constructor •(core::int foo) → self::C2
: final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
C2(super.foo) : super(); // Error.
^"
diff --git a/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart
new file mode 100644
index 0000000..71e4e70
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart
@@ -0,0 +1,95 @@
+// Copyright (c) 2021, 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.
+
+// 1. The base case.
+
+class A1 {
+ final int a;
+ A1(this.a);
+}
+
+class B1 {}
+
+// C1 has a synthesized constructor that takes a positional parameter.
+class C1 = A1 with B1;
+
+class D1 extends C1 {
+ D1(super.a);
+}
+
+// 2. The case of named parameters.
+
+class A2 {
+ final int a;
+ A2({this.a = 0});
+}
+
+class B2 {}
+
+// C2 has a synthesized constructor that takes a named parameter.
+class C2 = A2 with B2;
+
+class D2 extends C2 {
+ D2({super.a});
+}
+
+// 3. The case of optional positional parameters.
+
+class A3 {
+ final int a;
+ A3([this.a = 0]);
+}
+
+class B3 {}
+
+// C3 has a synthesized constructor that takes an optional positional parameter.
+class C3 = A3 with B3;
+
+class D3 extends C3 {
+ D3([super.a]);
+}
+
+// 4. The case of the inverted order of classes.
+
+class D4 extends C4 {
+ D4([super.foo]);
+}
+
+// C4 has a synthesized constructor that takes an optional parameter.
+class C4 = A4 with B4;
+
+class B4 {}
+
+class A4 extends AA4 {
+ A4([super.foo]);
+}
+
+class AA4 {
+ final int foo;
+ AA4([this.foo = 42]);
+}
+
+// 5. The case of a longer named mixin chain.
+
+class D5 extends C5c {
+ D5([super.foo]);
+}
+
+// C5a, C5b, C5c have synthesized constructors that take an optional parameter.
+class C5c = C5b with B5;
+class C5b = C5a with B5;
+class C5a = A5 with B5;
+
+class B5 {}
+
+class A5 extends AA5 {
+ A5([super.foo]);
+}
+
+class AA5 {
+ final int foo;
+ AA5([this.foo = 42]);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.strong.expect b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.strong.expect
new file mode 100644
index 0000000..0a867e6
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.strong.expect
@@ -0,0 +1,135 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ final field core::int a;
+ constructor •(core::int a) → self::A1
+ : self::A1::a = a, super core::Object::•()
+ ;
+}
+class B1 extends core::Object {
+ synthetic constructor •() → self::B1
+ : super core::Object::•()
+ ;
+}
+class C1 = self::A1 with self::B1 {
+ synthetic constructor •(core::int a) → self::C1
+ : super self::A1::•(a)
+ ;
+}
+class D1 extends self::C1 {
+ constructor •(core::int a) → self::D1
+ : super self::C1::•(a)
+ ;
+}
+class A2 extends core::Object {
+ final field core::int a;
+ constructor •({core::int a = #C1}) → self::A2
+ : self::A2::a = a, super core::Object::•()
+ ;
+}
+class B2 extends core::Object {
+ synthetic constructor •() → self::B2
+ : super core::Object::•()
+ ;
+}
+class C2 = self::A2 with self::B2 {
+ synthetic constructor •({core::int a = #C1}) → self::C2
+ : super self::A2::•(a: a)
+ ;
+}
+class D2 extends self::C2 {
+ constructor •({core::int a = #C1}) → self::D2
+ : super self::C2::•(a: a)
+ ;
+}
+class A3 extends core::Object {
+ final field core::int a;
+ constructor •([core::int a = #C1]) → self::A3
+ : self::A3::a = a, super core::Object::•()
+ ;
+}
+class B3 extends core::Object {
+ synthetic constructor •() → self::B3
+ : super core::Object::•()
+ ;
+}
+class C3 = self::A3 with self::B3 {
+ synthetic constructor •([core::int a = #C1]) → self::C3
+ : super self::A3::•(a)
+ ;
+}
+class D3 extends self::C3 {
+ constructor •([core::int a = #C1]) → self::D3
+ : super self::C3::•(a)
+ ;
+}
+class D4 extends self::C4 {
+ constructor •([core::int foo = #C2]) → self::D4
+ : super self::C4::•(foo)
+ ;
+}
+class C4 = self::A4 with self::B4 {
+ synthetic constructor •([core::int foo = #C2]) → self::C4
+ : super self::A4::•(foo)
+ ;
+}
+class B4 extends core::Object {
+ synthetic constructor •() → self::B4
+ : super core::Object::•()
+ ;
+}
+class A4 extends self::AA4 {
+ constructor •([core::int foo = #C2]) → self::A4
+ : super self::AA4::•(foo)
+ ;
+}
+class AA4 extends core::Object {
+ final field core::int foo;
+ constructor •([core::int foo = #C2]) → self::AA4
+ : self::AA4::foo = foo, super core::Object::•()
+ ;
+}
+class D5 extends self::C5c {
+ constructor •([core::int foo = #C2]) → self::D5
+ : super self::C5c::•(foo)
+ ;
+}
+class C5c = self::C5b with self::B5 {
+ synthetic constructor •([core::int foo = #C2]) → self::C5c
+ : super self::C5b::•(foo)
+ ;
+}
+class C5b = self::C5a with self::B5 {
+ synthetic constructor •([core::int foo = #C2]) → self::C5b
+ : super self::C5a::•(foo)
+ ;
+}
+class C5a = self::A5 with self::B5 {
+ synthetic constructor •([core::int foo = #C2]) → self::C5a
+ : super self::A5::•(foo)
+ ;
+}
+class B5 extends core::Object {
+ synthetic constructor •() → self::B5
+ : super core::Object::•()
+ ;
+}
+class A5 extends self::AA5 {
+ constructor •([core::int foo = #C2]) → self::A5
+ : super self::AA5::•(foo)
+ ;
+}
+class AA5 extends core::Object {
+ final field core::int foo;
+ constructor •([core::int foo = #C2]) → self::AA5
+ : self::AA5::foo = foo, super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = 42
+}
diff --git a/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.strong.transformed.expect
new file mode 100644
index 0000000..cf81c26
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.strong.transformed.expect
@@ -0,0 +1,135 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ final field core::int a;
+ constructor •(core::int a) → self::A1
+ : self::A1::a = a, super core::Object::•()
+ ;
+}
+class B1 extends core::Object {
+ synthetic constructor •() → self::B1
+ : super core::Object::•()
+ ;
+}
+class C1 extends self::A1 implements self::B1 /*isEliminatedMixin*/ {
+ synthetic constructor •(core::int a) → self::C1
+ : super self::A1::•(a)
+ ;
+}
+class D1 extends self::C1 {
+ constructor •(core::int a) → self::D1
+ : super self::C1::•(a)
+ ;
+}
+class A2 extends core::Object {
+ final field core::int a;
+ constructor •({core::int a = #C1}) → self::A2
+ : self::A2::a = a, super core::Object::•()
+ ;
+}
+class B2 extends core::Object {
+ synthetic constructor •() → self::B2
+ : super core::Object::•()
+ ;
+}
+class C2 extends self::A2 implements self::B2 /*isEliminatedMixin*/ {
+ synthetic constructor •({core::int a = #C1}) → self::C2
+ : super self::A2::•(a: a)
+ ;
+}
+class D2 extends self::C2 {
+ constructor •({core::int a = #C1}) → self::D2
+ : super self::C2::•(a: a)
+ ;
+}
+class A3 extends core::Object {
+ final field core::int a;
+ constructor •([core::int a = #C1]) → self::A3
+ : self::A3::a = a, super core::Object::•()
+ ;
+}
+class B3 extends core::Object {
+ synthetic constructor •() → self::B3
+ : super core::Object::•()
+ ;
+}
+class C3 extends self::A3 implements self::B3 /*isEliminatedMixin*/ {
+ synthetic constructor •([core::int a = #C1]) → self::C3
+ : super self::A3::•(a)
+ ;
+}
+class D3 extends self::C3 {
+ constructor •([core::int a = #C1]) → self::D3
+ : super self::C3::•(a)
+ ;
+}
+class D4 extends self::C4 {
+ constructor •([core::int foo = #C2]) → self::D4
+ : super self::C4::•(foo)
+ ;
+}
+class C4 extends self::A4 implements self::B4 /*isEliminatedMixin*/ {
+ synthetic constructor •([core::int foo = #C2]) → self::C4
+ : super self::A4::•(foo)
+ ;
+}
+class B4 extends core::Object {
+ synthetic constructor •() → self::B4
+ : super core::Object::•()
+ ;
+}
+class A4 extends self::AA4 {
+ constructor •([core::int foo = #C2]) → self::A4
+ : super self::AA4::•(foo)
+ ;
+}
+class AA4 extends core::Object {
+ final field core::int foo;
+ constructor •([core::int foo = #C2]) → self::AA4
+ : self::AA4::foo = foo, super core::Object::•()
+ ;
+}
+class D5 extends self::C5c {
+ constructor •([core::int foo = #C2]) → self::D5
+ : super self::C5c::•(foo)
+ ;
+}
+class C5c extends self::C5b implements self::B5 /*isEliminatedMixin*/ {
+ synthetic constructor •([core::int foo = #C2]) → self::C5c
+ : super self::C5b::•(foo)
+ ;
+}
+class C5b extends self::C5a implements self::B5 /*isEliminatedMixin*/ {
+ synthetic constructor •([core::int foo = #C2]) → self::C5b
+ : super self::C5a::•(foo)
+ ;
+}
+class C5a extends self::A5 implements self::B5 /*isEliminatedMixin*/ {
+ synthetic constructor •([core::int foo = #C2]) → self::C5a
+ : super self::A5::•(foo)
+ ;
+}
+class B5 extends core::Object {
+ synthetic constructor •() → self::B5
+ : super core::Object::•()
+ ;
+}
+class A5 extends self::AA5 {
+ constructor •([core::int foo = #C2]) → self::A5
+ : super self::AA5::•(foo)
+ ;
+}
+class AA5 extends core::Object {
+ final field core::int foo;
+ constructor •([core::int foo = #C2]) → self::AA5
+ : self::AA5::foo = foo, super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = 42
+}
diff --git a/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.textual_outline.expect b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.textual_outline.expect
new file mode 100644
index 0000000..ed0e4f7
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.textual_outline.expect
@@ -0,0 +1,54 @@
+class A1 {
+ final int a;
+ A1(this.a);
+}
+class B1 {}
+class C1 = A1 with B1;
+class D1 extends C1 {
+ D1(super.a);
+}
+class A2 {
+ final int a;
+ A2({this.a = 0});
+}
+class B2 {}
+class C2 = A2 with B2;
+class D2 extends C2 {
+ D2({super.a});
+}
+class A3 {
+ final int a;
+ A3([this.a = 0]);
+}
+class B3 {}
+class C3 = A3 with B3;
+class D3 extends C3 {
+ D3([super.a]);
+}
+class D4 extends C4 {
+ D4([super.foo]);
+}
+class C4 = A4 with B4;
+class B4 {}
+class A4 extends AA4 {
+ A4([super.foo]);
+}
+class AA4 {
+ final int foo;
+ AA4([this.foo = 42]);
+}
+class D5 extends C5c {
+ D5([super.foo]);
+}
+class C5c = C5b with B5;
+class C5b = C5a with B5;
+class C5a = A5 with B5;
+class B5 {}
+class A5 extends AA5 {
+ A5([super.foo]);
+}
+class AA5 {
+ final int foo;
+ AA5([this.foo = 42]);
+}
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.expect b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.expect
new file mode 100644
index 0000000..0a867e6
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.expect
@@ -0,0 +1,135 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ final field core::int a;
+ constructor •(core::int a) → self::A1
+ : self::A1::a = a, super core::Object::•()
+ ;
+}
+class B1 extends core::Object {
+ synthetic constructor •() → self::B1
+ : super core::Object::•()
+ ;
+}
+class C1 = self::A1 with self::B1 {
+ synthetic constructor •(core::int a) → self::C1
+ : super self::A1::•(a)
+ ;
+}
+class D1 extends self::C1 {
+ constructor •(core::int a) → self::D1
+ : super self::C1::•(a)
+ ;
+}
+class A2 extends core::Object {
+ final field core::int a;
+ constructor •({core::int a = #C1}) → self::A2
+ : self::A2::a = a, super core::Object::•()
+ ;
+}
+class B2 extends core::Object {
+ synthetic constructor •() → self::B2
+ : super core::Object::•()
+ ;
+}
+class C2 = self::A2 with self::B2 {
+ synthetic constructor •({core::int a = #C1}) → self::C2
+ : super self::A2::•(a: a)
+ ;
+}
+class D2 extends self::C2 {
+ constructor •({core::int a = #C1}) → self::D2
+ : super self::C2::•(a: a)
+ ;
+}
+class A3 extends core::Object {
+ final field core::int a;
+ constructor •([core::int a = #C1]) → self::A3
+ : self::A3::a = a, super core::Object::•()
+ ;
+}
+class B3 extends core::Object {
+ synthetic constructor •() → self::B3
+ : super core::Object::•()
+ ;
+}
+class C3 = self::A3 with self::B3 {
+ synthetic constructor •([core::int a = #C1]) → self::C3
+ : super self::A3::•(a)
+ ;
+}
+class D3 extends self::C3 {
+ constructor •([core::int a = #C1]) → self::D3
+ : super self::C3::•(a)
+ ;
+}
+class D4 extends self::C4 {
+ constructor •([core::int foo = #C2]) → self::D4
+ : super self::C4::•(foo)
+ ;
+}
+class C4 = self::A4 with self::B4 {
+ synthetic constructor •([core::int foo = #C2]) → self::C4
+ : super self::A4::•(foo)
+ ;
+}
+class B4 extends core::Object {
+ synthetic constructor •() → self::B4
+ : super core::Object::•()
+ ;
+}
+class A4 extends self::AA4 {
+ constructor •([core::int foo = #C2]) → self::A4
+ : super self::AA4::•(foo)
+ ;
+}
+class AA4 extends core::Object {
+ final field core::int foo;
+ constructor •([core::int foo = #C2]) → self::AA4
+ : self::AA4::foo = foo, super core::Object::•()
+ ;
+}
+class D5 extends self::C5c {
+ constructor •([core::int foo = #C2]) → self::D5
+ : super self::C5c::•(foo)
+ ;
+}
+class C5c = self::C5b with self::B5 {
+ synthetic constructor •([core::int foo = #C2]) → self::C5c
+ : super self::C5b::•(foo)
+ ;
+}
+class C5b = self::C5a with self::B5 {
+ synthetic constructor •([core::int foo = #C2]) → self::C5b
+ : super self::C5a::•(foo)
+ ;
+}
+class C5a = self::A5 with self::B5 {
+ synthetic constructor •([core::int foo = #C2]) → self::C5a
+ : super self::A5::•(foo)
+ ;
+}
+class B5 extends core::Object {
+ synthetic constructor •() → self::B5
+ : super core::Object::•()
+ ;
+}
+class A5 extends self::AA5 {
+ constructor •([core::int foo = #C2]) → self::A5
+ : super self::AA5::•(foo)
+ ;
+}
+class AA5 extends core::Object {
+ final field core::int foo;
+ constructor •([core::int foo = #C2]) → self::AA5
+ : self::AA5::foo = foo, super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = 42
+}
diff --git a/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.modular.expect
new file mode 100644
index 0000000..0a867e6
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.modular.expect
@@ -0,0 +1,135 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ final field core::int a;
+ constructor •(core::int a) → self::A1
+ : self::A1::a = a, super core::Object::•()
+ ;
+}
+class B1 extends core::Object {
+ synthetic constructor •() → self::B1
+ : super core::Object::•()
+ ;
+}
+class C1 = self::A1 with self::B1 {
+ synthetic constructor •(core::int a) → self::C1
+ : super self::A1::•(a)
+ ;
+}
+class D1 extends self::C1 {
+ constructor •(core::int a) → self::D1
+ : super self::C1::•(a)
+ ;
+}
+class A2 extends core::Object {
+ final field core::int a;
+ constructor •({core::int a = #C1}) → self::A2
+ : self::A2::a = a, super core::Object::•()
+ ;
+}
+class B2 extends core::Object {
+ synthetic constructor •() → self::B2
+ : super core::Object::•()
+ ;
+}
+class C2 = self::A2 with self::B2 {
+ synthetic constructor •({core::int a = #C1}) → self::C2
+ : super self::A2::•(a: a)
+ ;
+}
+class D2 extends self::C2 {
+ constructor •({core::int a = #C1}) → self::D2
+ : super self::C2::•(a: a)
+ ;
+}
+class A3 extends core::Object {
+ final field core::int a;
+ constructor •([core::int a = #C1]) → self::A3
+ : self::A3::a = a, super core::Object::•()
+ ;
+}
+class B3 extends core::Object {
+ synthetic constructor •() → self::B3
+ : super core::Object::•()
+ ;
+}
+class C3 = self::A3 with self::B3 {
+ synthetic constructor •([core::int a = #C1]) → self::C3
+ : super self::A3::•(a)
+ ;
+}
+class D3 extends self::C3 {
+ constructor •([core::int a = #C1]) → self::D3
+ : super self::C3::•(a)
+ ;
+}
+class D4 extends self::C4 {
+ constructor •([core::int foo = #C2]) → self::D4
+ : super self::C4::•(foo)
+ ;
+}
+class C4 = self::A4 with self::B4 {
+ synthetic constructor •([core::int foo = #C2]) → self::C4
+ : super self::A4::•(foo)
+ ;
+}
+class B4 extends core::Object {
+ synthetic constructor •() → self::B4
+ : super core::Object::•()
+ ;
+}
+class A4 extends self::AA4 {
+ constructor •([core::int foo = #C2]) → self::A4
+ : super self::AA4::•(foo)
+ ;
+}
+class AA4 extends core::Object {
+ final field core::int foo;
+ constructor •([core::int foo = #C2]) → self::AA4
+ : self::AA4::foo = foo, super core::Object::•()
+ ;
+}
+class D5 extends self::C5c {
+ constructor •([core::int foo = #C2]) → self::D5
+ : super self::C5c::•(foo)
+ ;
+}
+class C5c = self::C5b with self::B5 {
+ synthetic constructor •([core::int foo = #C2]) → self::C5c
+ : super self::C5b::•(foo)
+ ;
+}
+class C5b = self::C5a with self::B5 {
+ synthetic constructor •([core::int foo = #C2]) → self::C5b
+ : super self::C5a::•(foo)
+ ;
+}
+class C5a = self::A5 with self::B5 {
+ synthetic constructor •([core::int foo = #C2]) → self::C5a
+ : super self::A5::•(foo)
+ ;
+}
+class B5 extends core::Object {
+ synthetic constructor •() → self::B5
+ : super core::Object::•()
+ ;
+}
+class A5 extends self::AA5 {
+ constructor •([core::int foo = #C2]) → self::A5
+ : super self::AA5::•(foo)
+ ;
+}
+class AA5 extends core::Object {
+ final field core::int foo;
+ constructor •([core::int foo = #C2]) → self::AA5
+ : self::AA5::foo = foo, super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = 42
+}
diff --git a/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.outline.expect
new file mode 100644
index 0000000..ee7f775
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.outline.expect
@@ -0,0 +1,114 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ final field core::int a;
+ constructor •(core::int a) → self::A1
+ ;
+}
+class B1 extends core::Object {
+ synthetic constructor •() → self::B1
+ ;
+}
+class C1 = self::A1 with self::B1 {
+ synthetic constructor •(core::int a) → self::C1
+ : super self::A1::•(a)
+ ;
+}
+class D1 extends self::C1 {
+ constructor •(core::int a) → self::D1
+ ;
+}
+class A2 extends core::Object {
+ final field core::int a;
+ constructor •({core::int a = 0}) → self::A2
+ ;
+}
+class B2 extends core::Object {
+ synthetic constructor •() → self::B2
+ ;
+}
+class C2 = self::A2 with self::B2 {
+ synthetic constructor •({core::int a = 0}) → self::C2
+ : super self::A2::•(a: a)
+ ;
+}
+class D2 extends self::C2 {
+ constructor •({core::int a = 0}) → self::D2
+ ;
+}
+class A3 extends core::Object {
+ final field core::int a;
+ constructor •([core::int a = 0]) → self::A3
+ ;
+}
+class B3 extends core::Object {
+ synthetic constructor •() → self::B3
+ ;
+}
+class C3 = self::A3 with self::B3 {
+ synthetic constructor •([core::int a = 0]) → self::C3
+ : super self::A3::•(a)
+ ;
+}
+class D3 extends self::C3 {
+ constructor •([core::int a = 0]) → self::D3
+ ;
+}
+class D4 extends self::C4 {
+ constructor •([core::int foo = 42]) → self::D4
+ ;
+}
+class C4 = self::A4 with self::B4 {
+ synthetic constructor •([core::int foo = 42]) → self::C4
+ : super self::A4::•(foo)
+ ;
+}
+class B4 extends core::Object {
+ synthetic constructor •() → self::B4
+ ;
+}
+class A4 extends self::AA4 {
+ constructor •([core::int foo = 42]) → self::A4
+ ;
+}
+class AA4 extends core::Object {
+ final field core::int foo;
+ constructor •([core::int foo = 42]) → self::AA4
+ ;
+}
+class D5 extends self::C5c {
+ constructor •([core::int foo = 42]) → self::D5
+ ;
+}
+class C5c = self::C5b with self::B5 {
+ synthetic constructor •([core::int foo = 42]) → self::C5c
+ : super self::C5b::•(foo)
+ ;
+}
+class C5b = self::C5a with self::B5 {
+ synthetic constructor •([core::int foo = 42]) → self::C5b
+ : super self::C5a::•(foo)
+ ;
+}
+class C5a = self::A5 with self::B5 {
+ synthetic constructor •([core::int foo = 42]) → self::C5a
+ : super self::A5::•(foo)
+ ;
+}
+class B5 extends core::Object {
+ synthetic constructor •() → self::B5
+ ;
+}
+class A5 extends self::AA5 {
+ constructor •([core::int foo = 42]) → self::A5
+ ;
+}
+class AA5 extends core::Object {
+ final field core::int foo;
+ constructor •([core::int foo = 42]) → self::AA5
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.transformed.expect
new file mode 100644
index 0000000..cf81c26
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/synthesized_super_constructor_with_parameters.dart.weak.transformed.expect
@@ -0,0 +1,135 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ final field core::int a;
+ constructor •(core::int a) → self::A1
+ : self::A1::a = a, super core::Object::•()
+ ;
+}
+class B1 extends core::Object {
+ synthetic constructor •() → self::B1
+ : super core::Object::•()
+ ;
+}
+class C1 extends self::A1 implements self::B1 /*isEliminatedMixin*/ {
+ synthetic constructor •(core::int a) → self::C1
+ : super self::A1::•(a)
+ ;
+}
+class D1 extends self::C1 {
+ constructor •(core::int a) → self::D1
+ : super self::C1::•(a)
+ ;
+}
+class A2 extends core::Object {
+ final field core::int a;
+ constructor •({core::int a = #C1}) → self::A2
+ : self::A2::a = a, super core::Object::•()
+ ;
+}
+class B2 extends core::Object {
+ synthetic constructor •() → self::B2
+ : super core::Object::•()
+ ;
+}
+class C2 extends self::A2 implements self::B2 /*isEliminatedMixin*/ {
+ synthetic constructor •({core::int a = #C1}) → self::C2
+ : super self::A2::•(a: a)
+ ;
+}
+class D2 extends self::C2 {
+ constructor •({core::int a = #C1}) → self::D2
+ : super self::C2::•(a: a)
+ ;
+}
+class A3 extends core::Object {
+ final field core::int a;
+ constructor •([core::int a = #C1]) → self::A3
+ : self::A3::a = a, super core::Object::•()
+ ;
+}
+class B3 extends core::Object {
+ synthetic constructor •() → self::B3
+ : super core::Object::•()
+ ;
+}
+class C3 extends self::A3 implements self::B3 /*isEliminatedMixin*/ {
+ synthetic constructor •([core::int a = #C1]) → self::C3
+ : super self::A3::•(a)
+ ;
+}
+class D3 extends self::C3 {
+ constructor •([core::int a = #C1]) → self::D3
+ : super self::C3::•(a)
+ ;
+}
+class D4 extends self::C4 {
+ constructor •([core::int foo = #C2]) → self::D4
+ : super self::C4::•(foo)
+ ;
+}
+class C4 extends self::A4 implements self::B4 /*isEliminatedMixin*/ {
+ synthetic constructor •([core::int foo = #C2]) → self::C4
+ : super self::A4::•(foo)
+ ;
+}
+class B4 extends core::Object {
+ synthetic constructor •() → self::B4
+ : super core::Object::•()
+ ;
+}
+class A4 extends self::AA4 {
+ constructor •([core::int foo = #C2]) → self::A4
+ : super self::AA4::•(foo)
+ ;
+}
+class AA4 extends core::Object {
+ final field core::int foo;
+ constructor •([core::int foo = #C2]) → self::AA4
+ : self::AA4::foo = foo, super core::Object::•()
+ ;
+}
+class D5 extends self::C5c {
+ constructor •([core::int foo = #C2]) → self::D5
+ : super self::C5c::•(foo)
+ ;
+}
+class C5c extends self::C5b implements self::B5 /*isEliminatedMixin*/ {
+ synthetic constructor •([core::int foo = #C2]) → self::C5c
+ : super self::C5b::•(foo)
+ ;
+}
+class C5b extends self::C5a implements self::B5 /*isEliminatedMixin*/ {
+ synthetic constructor •([core::int foo = #C2]) → self::C5b
+ : super self::C5a::•(foo)
+ ;
+}
+class C5a extends self::A5 implements self::B5 /*isEliminatedMixin*/ {
+ synthetic constructor •([core::int foo = #C2]) → self::C5a
+ : super self::A5::•(foo)
+ ;
+}
+class B5 extends core::Object {
+ synthetic constructor •() → self::B5
+ : super core::Object::•()
+ ;
+}
+class A5 extends self::AA5 {
+ constructor •([core::int foo = #C2]) → self::A5
+ : super self::AA5::•(foo)
+ ;
+}
+class AA5 extends core::Object {
+ final field core::int foo;
+ constructor •([core::int foo = #C2]) → self::AA5
+ : self::AA5::foo = foo, super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = 42
+}
diff --git a/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart
new file mode 100644
index 0000000..efa62e9
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart
@@ -0,0 +1,81 @@
+// Copyright (c) 2021, 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.
+
+// 1. The base case.
+
+class A1 {
+ final String foo;
+ A1(this.foo);
+}
+
+typedef TA1 = A1;
+
+typedef TTA1 = TA1;
+
+typedef TTTA1 = TTA1;
+
+typedef TTTTA1 = TTTA1;
+
+class D1 extends TTTTA1 {
+ D1(super.foo);
+}
+
+// 2. The case of named parameters.
+
+class A2 {
+ final String foo;
+ A2({this.foo = "bar"});
+}
+
+typedef TA2 = A2;
+
+typedef TTA2 = TA2;
+
+typedef TTTA2 = TTA2;
+
+typedef TTTTA2 = TTTA2;
+
+class D2 extends TTTTA2 {
+ D2({super.foo});
+}
+
+// 3. The case of optional positional parameters.
+
+class A3 {
+ final String foo;
+ A3([this.foo = "bar"]);
+}
+
+typedef TA3 = A3;
+
+typedef TTA3 = TA3;
+
+typedef TTTA3 = TTA3;
+
+typedef TTTTA3 = TTTA3;
+
+class D3 extends TTTTA3 {
+ D3([super.foo]);
+}
+
+// 4. The case of the inverted order of declarations.
+
+class D4 extends TTTTA4 {
+ D4([super.foo]);
+}
+
+typedef TTTTA4 = TTTA4;
+
+typedef TTTA4 = TTA4;
+
+typedef TTA4 = TA4;
+
+typedef TA4 = A4;
+
+class A4 {
+ final String foo;
+ A4([this.foo = "bar"]);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.strong.expect b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.strong.expect
new file mode 100644
index 0000000..c64854a
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.strong.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef TA1 = self::A1;
+typedef TTA1 = self::A1;
+typedef TTTA1 = self::A1;
+typedef TTTTA1 = self::A1;
+typedef TA2 = self::A2;
+typedef TTA2 = self::A2;
+typedef TTTA2 = self::A2;
+typedef TTTTA2 = self::A2;
+typedef TA3 = self::A3;
+typedef TTA3 = self::A3;
+typedef TTTA3 = self::A3;
+typedef TTTTA3 = self::A3;
+typedef TTTTA4 = self::A4;
+typedef TTTA4 = self::A4;
+typedef TTA4 = self::A4;
+typedef TA4 = self::A4;
+class A1 extends core::Object {
+ final field core::String foo;
+ constructor •(core::String foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+}
+class D1 extends self::A1 {
+ constructor •(core::String foo) → self::D1
+ : super self::A1::•(foo)
+ ;
+}
+class A2 extends core::Object {
+ final field core::String foo;
+ constructor •({core::String foo = #C1}) → self::A2
+ : self::A2::foo = foo, super core::Object::•()
+ ;
+}
+class D2 extends self::A2 {
+ constructor •({core::String foo = #C1}) → self::D2
+ : super self::A2::•(foo: foo)
+ ;
+}
+class A3 extends core::Object {
+ final field core::String foo;
+ constructor •([core::String foo = #C1]) → self::A3
+ : self::A3::foo = foo, super core::Object::•()
+ ;
+}
+class D3 extends self::A3 {
+ constructor •([core::String foo = #C1]) → self::D3
+ : super self::A3::•(foo)
+ ;
+}
+class D4 extends self::A4 {
+ constructor •([core::String foo = #C1]) → self::D4
+ : super self::A4::•(foo)
+ ;
+}
+class A4 extends core::Object {
+ final field core::String foo;
+ constructor •([core::String foo = #C1]) → self::A4
+ : self::A4::foo = foo, super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = "bar"
+}
diff --git a/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.strong.transformed.expect
new file mode 100644
index 0000000..c64854a
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.strong.transformed.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef TA1 = self::A1;
+typedef TTA1 = self::A1;
+typedef TTTA1 = self::A1;
+typedef TTTTA1 = self::A1;
+typedef TA2 = self::A2;
+typedef TTA2 = self::A2;
+typedef TTTA2 = self::A2;
+typedef TTTTA2 = self::A2;
+typedef TA3 = self::A3;
+typedef TTA3 = self::A3;
+typedef TTTA3 = self::A3;
+typedef TTTTA3 = self::A3;
+typedef TTTTA4 = self::A4;
+typedef TTTA4 = self::A4;
+typedef TTA4 = self::A4;
+typedef TA4 = self::A4;
+class A1 extends core::Object {
+ final field core::String foo;
+ constructor •(core::String foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+}
+class D1 extends self::A1 {
+ constructor •(core::String foo) → self::D1
+ : super self::A1::•(foo)
+ ;
+}
+class A2 extends core::Object {
+ final field core::String foo;
+ constructor •({core::String foo = #C1}) → self::A2
+ : self::A2::foo = foo, super core::Object::•()
+ ;
+}
+class D2 extends self::A2 {
+ constructor •({core::String foo = #C1}) → self::D2
+ : super self::A2::•(foo: foo)
+ ;
+}
+class A3 extends core::Object {
+ final field core::String foo;
+ constructor •([core::String foo = #C1]) → self::A3
+ : self::A3::foo = foo, super core::Object::•()
+ ;
+}
+class D3 extends self::A3 {
+ constructor •([core::String foo = #C1]) → self::D3
+ : super self::A3::•(foo)
+ ;
+}
+class D4 extends self::A4 {
+ constructor •([core::String foo = #C1]) → self::D4
+ : super self::A4::•(foo)
+ ;
+}
+class A4 extends core::Object {
+ final field core::String foo;
+ constructor •([core::String foo = #C1]) → self::A4
+ : self::A4::foo = foo, super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = "bar"
+}
diff --git a/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.textual_outline.expect b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.textual_outline.expect
new file mode 100644
index 0000000..1e4deb1
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.textual_outline.expect
@@ -0,0 +1,45 @@
+class A1 {
+ final String foo;
+ A1(this.foo);
+}
+typedef TA1 = A1;
+typedef TTA1 = TA1;
+typedef TTTA1 = TTA1;
+typedef TTTTA1 = TTTA1;
+class D1 extends TTTTA1 {
+ D1(super.foo);
+}
+class A2 {
+ final String foo;
+ A2({this.foo = "bar"});
+}
+typedef TA2 = A2;
+typedef TTA2 = TA2;
+typedef TTTA2 = TTA2;
+typedef TTTTA2 = TTTA2;
+class D2 extends TTTTA2 {
+ D2({super.foo});
+}
+class A3 {
+ final String foo;
+ A3([this.foo = "bar"]);
+}
+typedef TA3 = A3;
+typedef TTA3 = TA3;
+typedef TTTA3 = TTA3;
+typedef TTTTA3 = TTTA3;
+class D3 extends TTTTA3 {
+ D3([super.foo]);
+}
+class D4 extends TTTTA4 {
+ D4([super.foo]);
+}
+typedef TTTTA4 = TTTA4;
+typedef TTTA4 = TTA4;
+typedef TTA4 = TA4;
+typedef TA4 = A4;
+class A4 {
+ final String foo;
+ A4([this.foo = "bar"]);
+}
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.expect b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.expect
new file mode 100644
index 0000000..c64854a
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef TA1 = self::A1;
+typedef TTA1 = self::A1;
+typedef TTTA1 = self::A1;
+typedef TTTTA1 = self::A1;
+typedef TA2 = self::A2;
+typedef TTA2 = self::A2;
+typedef TTTA2 = self::A2;
+typedef TTTTA2 = self::A2;
+typedef TA3 = self::A3;
+typedef TTA3 = self::A3;
+typedef TTTA3 = self::A3;
+typedef TTTTA3 = self::A3;
+typedef TTTTA4 = self::A4;
+typedef TTTA4 = self::A4;
+typedef TTA4 = self::A4;
+typedef TA4 = self::A4;
+class A1 extends core::Object {
+ final field core::String foo;
+ constructor •(core::String foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+}
+class D1 extends self::A1 {
+ constructor •(core::String foo) → self::D1
+ : super self::A1::•(foo)
+ ;
+}
+class A2 extends core::Object {
+ final field core::String foo;
+ constructor •({core::String foo = #C1}) → self::A2
+ : self::A2::foo = foo, super core::Object::•()
+ ;
+}
+class D2 extends self::A2 {
+ constructor •({core::String foo = #C1}) → self::D2
+ : super self::A2::•(foo: foo)
+ ;
+}
+class A3 extends core::Object {
+ final field core::String foo;
+ constructor •([core::String foo = #C1]) → self::A3
+ : self::A3::foo = foo, super core::Object::•()
+ ;
+}
+class D3 extends self::A3 {
+ constructor •([core::String foo = #C1]) → self::D3
+ : super self::A3::•(foo)
+ ;
+}
+class D4 extends self::A4 {
+ constructor •([core::String foo = #C1]) → self::D4
+ : super self::A4::•(foo)
+ ;
+}
+class A4 extends core::Object {
+ final field core::String foo;
+ constructor •([core::String foo = #C1]) → self::A4
+ : self::A4::foo = foo, super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = "bar"
+}
diff --git a/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.modular.expect
new file mode 100644
index 0000000..c64854a
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef TA1 = self::A1;
+typedef TTA1 = self::A1;
+typedef TTTA1 = self::A1;
+typedef TTTTA1 = self::A1;
+typedef TA2 = self::A2;
+typedef TTA2 = self::A2;
+typedef TTTA2 = self::A2;
+typedef TTTTA2 = self::A2;
+typedef TA3 = self::A3;
+typedef TTA3 = self::A3;
+typedef TTTA3 = self::A3;
+typedef TTTTA3 = self::A3;
+typedef TTTTA4 = self::A4;
+typedef TTTA4 = self::A4;
+typedef TTA4 = self::A4;
+typedef TA4 = self::A4;
+class A1 extends core::Object {
+ final field core::String foo;
+ constructor •(core::String foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+}
+class D1 extends self::A1 {
+ constructor •(core::String foo) → self::D1
+ : super self::A1::•(foo)
+ ;
+}
+class A2 extends core::Object {
+ final field core::String foo;
+ constructor •({core::String foo = #C1}) → self::A2
+ : self::A2::foo = foo, super core::Object::•()
+ ;
+}
+class D2 extends self::A2 {
+ constructor •({core::String foo = #C1}) → self::D2
+ : super self::A2::•(foo: foo)
+ ;
+}
+class A3 extends core::Object {
+ final field core::String foo;
+ constructor •([core::String foo = #C1]) → self::A3
+ : self::A3::foo = foo, super core::Object::•()
+ ;
+}
+class D3 extends self::A3 {
+ constructor •([core::String foo = #C1]) → self::D3
+ : super self::A3::•(foo)
+ ;
+}
+class D4 extends self::A4 {
+ constructor •([core::String foo = #C1]) → self::D4
+ : super self::A4::•(foo)
+ ;
+}
+class A4 extends core::Object {
+ final field core::String foo;
+ constructor •([core::String foo = #C1]) → self::A4
+ : self::A4::foo = foo, super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = "bar"
+}
diff --git a/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.outline.expect
new file mode 100644
index 0000000..f4d87e2
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.outline.expect
@@ -0,0 +1,58 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef TA1 = self::A1;
+typedef TTA1 = self::A1;
+typedef TTTA1 = self::A1;
+typedef TTTTA1 = self::A1;
+typedef TA2 = self::A2;
+typedef TTA2 = self::A2;
+typedef TTTA2 = self::A2;
+typedef TTTTA2 = self::A2;
+typedef TA3 = self::A3;
+typedef TTA3 = self::A3;
+typedef TTTA3 = self::A3;
+typedef TTTTA3 = self::A3;
+typedef TTTTA4 = self::A4;
+typedef TTTA4 = self::A4;
+typedef TTA4 = self::A4;
+typedef TA4 = self::A4;
+class A1 extends core::Object {
+ final field core::String foo;
+ constructor •(core::String foo) → self::A1
+ ;
+}
+class D1 extends self::A1 {
+ constructor •(core::String foo) → self::D1
+ ;
+}
+class A2 extends core::Object {
+ final field core::String foo;
+ constructor •({core::String foo = "bar"}) → self::A2
+ ;
+}
+class D2 extends self::A2 {
+ constructor •({core::String foo = "bar"}) → self::D2
+ ;
+}
+class A3 extends core::Object {
+ final field core::String foo;
+ constructor •([core::String foo = "bar"]) → self::A3
+ ;
+}
+class D3 extends self::A3 {
+ constructor •([core::String foo = "bar"]) → self::D3
+ ;
+}
+class D4 extends self::A4 {
+ constructor •([core::String foo = "bar"]) → self::D4
+ ;
+}
+class A4 extends core::Object {
+ final field core::String foo;
+ constructor •([core::String foo = "bar"]) → self::A4
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.transformed.expect
new file mode 100644
index 0000000..c64854a
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/type_alias_in_supertype.dart.weak.transformed.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef TA1 = self::A1;
+typedef TTA1 = self::A1;
+typedef TTTA1 = self::A1;
+typedef TTTTA1 = self::A1;
+typedef TA2 = self::A2;
+typedef TTA2 = self::A2;
+typedef TTTA2 = self::A2;
+typedef TTTTA2 = self::A2;
+typedef TA3 = self::A3;
+typedef TTA3 = self::A3;
+typedef TTTA3 = self::A3;
+typedef TTTTA3 = self::A3;
+typedef TTTTA4 = self::A4;
+typedef TTTA4 = self::A4;
+typedef TTA4 = self::A4;
+typedef TA4 = self::A4;
+class A1 extends core::Object {
+ final field core::String foo;
+ constructor •(core::String foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+}
+class D1 extends self::A1 {
+ constructor •(core::String foo) → self::D1
+ : super self::A1::•(foo)
+ ;
+}
+class A2 extends core::Object {
+ final field core::String foo;
+ constructor •({core::String foo = #C1}) → self::A2
+ : self::A2::foo = foo, super core::Object::•()
+ ;
+}
+class D2 extends self::A2 {
+ constructor •({core::String foo = #C1}) → self::D2
+ : super self::A2::•(foo: foo)
+ ;
+}
+class A3 extends core::Object {
+ final field core::String foo;
+ constructor •([core::String foo = #C1]) → self::A3
+ : self::A3::foo = foo, super core::Object::•()
+ ;
+}
+class D3 extends self::A3 {
+ constructor •([core::String foo = #C1]) → self::D3
+ : super self::A3::•(foo)
+ ;
+}
+class D4 extends self::A4 {
+ constructor •([core::String foo = #C1]) → self::D4
+ : super self::A4::•(foo)
+ ;
+}
+class A4 extends core::Object {
+ final field core::String foo;
+ constructor •([core::String foo = #C1]) → self::A4
+ : self::A4::foo = foo, super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = "bar"
+}
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 5ebd7e2..db22169c 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -201,9 +201,14 @@
regress/issue_39091_1: FormatterCrash
regress/issue_41265.crash: Crash
regress/issue_41265.crash: FormatterCrash
+super_parameters/circular_dependency_inference: FormatterCrash
+super_parameters/default_values: FormatterCrash
super_parameters/simple: FormatterCrash
+super_parameters/simple_inference: FormatterCrash
super_parameters/simple_named_super_parameters: FormatterCrash
super_parameters/simple_positional_super_parameters: FormatterCrash
+super_parameters/synthesized_super_constructor_with_parameters: FormatterCrash
+super_parameters/type_alias_in_supertype: FormatterCrash
super_parameters/typed_super_parameter: FormatterCrash
triple_shift/invalid_operator: FormatterCrash
variance/class_type_parameter_modifier: FormatterCrash
diff --git a/tools/VERSION b/tools/VERSION
index 967b65e..a94e232 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 16
PATCH 0
-PRERELEASE 140
+PRERELEASE 141
PRERELEASE_PATCH 0
\ No newline at end of file