Version 2.17.0-96.0.dev
Merge commit '69396286219e8b8dd5c76e0ac22bc9734fddd5a6' into 'dev'
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart
index 27a7915..7238af4 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart
@@ -89,7 +89,7 @@
/// The [resolveIdentifier] argument should return the import uri to be used
/// for that identifier.
String buildAugmentationLibrary(Iterable<MacroExecutionResult> macroResults,
- Uri Function(Identifier) resolveIdentifier);
+ ResolvedIdentifier Function(Identifier) resolveIdentifier);
/// Tell the executor to shut down and clean up any resources it may have
/// allocated.
@@ -220,6 +220,41 @@
}
}
+/// A resolved [Identifier], this is used when creating augmentation libraries
+/// to qualify identifiers where needed.
+class ResolvedIdentifier extends Identifier {
+ /// The import URI for the library that defines the member that is referenced
+ /// by this identifier.
+ final Uri uri;
+
+ /// Type type of identifier this is (instance, static, top level).
+ final IdentifierKind kind;
+
+ /// The unqualified name of this identifier.
+ @override
+ final String name;
+
+ /// If this is a static member, then the name of the fully qualified scope
+ /// surrounding this member. Should not contain a trailing `.`.
+ ///
+ /// Typically this would just be the name of a type.
+ final String? staticScope;
+
+ ResolvedIdentifier({
+ required this.kind,
+ required this.name,
+ required this.staticScope,
+ required this.uri,
+ });
+}
+
+/// The types of identifiers.
+enum IdentifierKind {
+ instanceMember,
+ staticInstanceMember,
+ topLevelMember,
+}
+
/// An opaque identifier for a macro class, retrieved by
/// [MacroExecutor.loadMacro].
///
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/augmentation_library.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/augmentation_library.dart
index cd0e198..56e4fb7a 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/augmentation_library.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/augmentation_library.dart
@@ -10,26 +10,44 @@
mixin AugmentationLibraryBuilder on MacroExecutor {
@override
String buildAugmentationLibrary(Iterable<MacroExecutionResult> macroResults,
- Uri Function(Identifier) resolveIdentifier) {
+ ResolvedIdentifier Function(Identifier) resolveIdentifier) {
StringBuffer importsBuffer = new StringBuffer();
StringBuffer directivesBuffer = new StringBuffer();
Map<Uri, String> importPrefixes = {};
int nextPrefix = 0;
+ // Keeps track of the last part written in `lastDirectivePart`.
+ String lastDirectivePart = '';
+ void writeDirectivePart(String part) {
+ lastDirectivePart = part;
+ directivesBuffer.write(part);
+ }
+
void buildCode(Code code) {
for (Object part in code.parts) {
if (part is String) {
- directivesBuffer.write(part);
+ writeDirectivePart(part);
} else if (part is Code) {
buildCode(part);
} else if (part is Identifier) {
- Uri uri = resolveIdentifier(part);
- String prefix = importPrefixes.putIfAbsent(uri, () {
+ ResolvedIdentifier resolved = resolveIdentifier(part);
+ String prefix = importPrefixes.putIfAbsent(resolved.uri, () {
String prefix = 'i${nextPrefix++}';
- importsBuffer.writeln("import '$uri' as $prefix;");
+ importsBuffer.writeln("import '${resolved.uri}' as $prefix;");
return prefix;
});
- directivesBuffer.write('$prefix.${part.name}');
+ if (resolved.kind == IdentifierKind.instanceMember) {
+ // Qualify with `this.` if we don't have a receiver.
+ if (!lastDirectivePart.trimRight().endsWith('.')) {
+ writeDirectivePart('this.');
+ }
+ } else {
+ writeDirectivePart('${prefix}.');
+ }
+ if (resolved.kind == IdentifierKind.staticInstanceMember) {
+ writeDirectivePart('${resolved.staticScope!}.');
+ }
+ writeDirectivePart('${part.name}');
} else {
throw new ArgumentError(
'Code objects only support String, Identifier, and Code '
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/isolated_executor/isolated_executor.dart b/pkg/_fe_analyzer_shared/lib/src/macros/isolated_executor/isolated_executor.dart
index 7713aa3..6902870 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/isolated_executor/isolated_executor.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/isolated_executor/isolated_executor.dart
@@ -366,7 +366,7 @@
/// These calls are handled by the higher level executor.
@override
String buildAugmentationLibrary(Iterable<MacroExecutionResult> macroResults,
- Uri Function(Identifier) resolveIdentifier) =>
+ ResolvedIdentifier Function(Identifier) resolveIdentifier) =>
throw new StateError('Unreachable');
@override
diff --git a/pkg/_fe_analyzer_shared/test/macros/executor_shared/augmentation_library_test.dart b/pkg/_fe_analyzer_shared/test/macros/executor_shared/augmentation_library_test.dart
index f3a5cbd..704898a 100644
--- a/pkg/_fe_analyzer_shared/test/macros/executor_shared/augmentation_library_test.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/executor_shared/augmentation_library_test.dart
@@ -35,7 +35,7 @@
]),
];
var library = _TestExecutor().buildAugmentationLibrary(
- results, (Identifier i) => (i as TestIdentifier).libraryImportUri);
+ results, (Identifier i) => (i as TestIdentifier).resolved);
expect(library, equalsIgnoringWhitespace('''
augment class Foo00 {
int get i => 0;
@@ -68,15 +68,33 @@
var fooIdentifier = TestIdentifier(
id: RemoteInstance.uniqueId,
name: 'Foo',
- libraryImportUri: Uri.parse('package:foo/foo.dart'));
+ kind: IdentifierKind.topLevelMember,
+ staticScope: null,
+ uri: Uri.parse('package:foo/foo.dart'));
var barIdentifier = TestIdentifier(
id: RemoteInstance.uniqueId,
name: 'Bar',
- libraryImportUri: Uri.parse('package:bar/bar.dart'));
+ kind: IdentifierKind.topLevelMember,
+ staticScope: null,
+ uri: Uri.parse('package:bar/bar.dart'));
var builderIdentifier = TestIdentifier(
id: RemoteInstance.uniqueId,
name: 'Builder',
- libraryImportUri: Uri.parse('package:builder/builder.dart'));
+ kind: IdentifierKind.topLevelMember,
+ staticScope: null,
+ uri: Uri.parse('package:builder/builder.dart'));
+ var barInstanceMember = TestIdentifier(
+ id: RemoteInstance.uniqueId,
+ name: 'baz',
+ kind: IdentifierKind.instanceMember,
+ staticScope: null,
+ uri: Uri.parse('package:bar/bar.dart'));
+ var barStaticMember = TestIdentifier(
+ id: RemoteInstance.uniqueId,
+ name: 'zap',
+ kind: IdentifierKind.staticInstanceMember,
+ staticScope: 'Bar',
+ uri: Uri.parse('package:bar/bar.dart'));
var results = [
MacroExecutionResultImpl(augmentations: [
DeclarationCode.fromParts([
@@ -87,24 +105,32 @@
'<',
barIdentifier,
'<T>> {\n',
+ 'late int ${barInstanceMember.name};\n',
barIdentifier,
'<T> build() => new ',
barIdentifier,
- '();\n}',
+ '()..',
+ barInstanceMember,
+ ' = ',
+ barStaticMember,
+ ';',
+ '\n}',
]),
], newTypeNames: [
'FooBuilder',
])
];
var library = _TestExecutor().buildAugmentationLibrary(
- results, (Identifier i) => (i as TestIdentifier).libraryImportUri);
+ results, (Identifier i) => (i as TestIdentifier).resolved);
expect(library, equalsIgnoringWhitespace('''
import 'package:foo/foo.dart' as i0;
import 'package:builder/builder.dart' as i1;
import 'package:bar/bar.dart' as i2;
class FooBuilder<T extends i0.Foo> implements i1.Builder<i2.Bar<T>> {
- i2.Bar<T> build() => new i2.Bar();
+ late int baz;
+
+ i2.Bar<T> build() => new i2.Bar()..baz = i2.Bar.zap;
}
'''));
});
diff --git a/pkg/_fe_analyzer_shared/test/macros/util.dart b/pkg/_fe_analyzer_shared/test/macros/util.dart
index 34625b2..725b3fd 100644
--- a/pkg/_fe_analyzer_shared/test/macros/util.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/util.dart
@@ -5,6 +5,7 @@
import 'dart:mirrors';
import 'package:_fe_analyzer_shared/src/macros/api.dart';
+import 'package:_fe_analyzer_shared/src/macros/executor.dart';
import 'package:_fe_analyzer_shared/src/macros/executor_shared/introspection_impls.dart';
import 'package:_fe_analyzer_shared/src/macros/executor_shared/remote_instance.dart';
@@ -108,13 +109,22 @@
(library == other.library && identifier.name == other.identifier.name);
}
-/// An identifier that knows what URI should be used to import it.
+/// An identifier that knows the resolved version of itself.
class TestIdentifier extends IdentifierImpl {
- final Uri libraryImportUri;
+ final ResolvedIdentifier resolved;
- TestIdentifier(
- {required int id, required String name, required this.libraryImportUri})
- : super(id: id, name: name);
+ TestIdentifier({
+ required int id,
+ required String name,
+ required IdentifierKind kind,
+ required Uri uri,
+ required String? staticScope,
+ }) : resolved = ResolvedIdentifier(
+ kind: kind, name: name, staticScope: staticScope, uri: uri),
+ super(
+ id: id,
+ name: name,
+ );
}
extension DebugCodeString on Code {
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 e04f3aa..422afdf 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1622,7 +1622,8 @@
return fakeReturn.expression!;
}
- void parseInitializers(Token token, {bool doFinishConstructor = true}) {
+ List<Initializer>? parseInitializers(Token token,
+ {bool doFinishConstructor = true}) {
Parser parser = new Parser(this,
useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
if (!token.isEof) {
@@ -1635,6 +1636,7 @@
finishConstructor(
member as DeclaredSourceConstructorBuilder, AsyncMarker.Sync, null);
}
+ return _initializers;
}
Expression parseFieldInitializer(Token token) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart b/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
index 27e2e0e..2cf43f9 100644
--- a/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
@@ -238,22 +238,24 @@
}
if (_hasSuperInitializingFormals) {
+ List<Initializer>? initializers;
if (beginInitializers != null) {
BodyBuilder bodyBuilder = library.loader
.createBodyBuilderForOutlineExpression(
library, classBuilder, this, classBuilder.scope, fileUri);
bodyBuilder.constantContext = ConstantContext.required;
- bodyBuilder.parseInitializers(beginInitializers!,
+ initializers = bodyBuilder.parseInitializers(beginInitializers!,
doFinishConstructor: false);
}
finalizeSuperInitializingFormals(
- classHierarchy, _superParameterDefaultValueCloners);
+ classHierarchy, _superParameterDefaultValueCloners, initializers);
}
}
_hasFormalsInferred = true;
}
- ConstructorBuilder? _computeSuperTargetBuilder() {
+ ConstructorBuilder? _computeSuperTargetBuilder(
+ List<Initializer>? initializers) {
Constructor superTarget;
ClassBuilder superclassBuilder;
@@ -279,9 +281,10 @@
return null;
}
- if (constructor.initializers.isNotEmpty &&
- constructor.initializers.last is SuperInitializer) {
- superTarget = (constructor.initializers.last as SuperInitializer).target;
+ if (initializers != null &&
+ initializers.isNotEmpty &&
+ initializers.last is SuperInitializer) {
+ superTarget = (initializers.last as SuperInitializer).target;
} else {
MemberBuilder? memberBuilder = superclassBuilder.constructors
.lookup("", charOffset, library.fileUri);
@@ -299,8 +302,10 @@
return constructorBuilder is ConstructorBuilder ? constructorBuilder : null;
}
- void finalizeSuperInitializingFormals(ClassHierarchy classHierarchy,
- List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
+ void finalizeSuperInitializingFormals(
+ ClassHierarchy classHierarchy,
+ List<SynthesizedFunctionNode> synthesizedFunctionNodes,
+ List<Initializer>? initializers) {
if (formals == null) return;
if (!_hasSuperInitializingFormals) return;
@@ -312,7 +317,8 @@
}
}
- ConstructorBuilder? superTargetBuilder = _computeSuperTargetBuilder();
+ ConstructorBuilder? superTargetBuilder =
+ _computeSuperTargetBuilder(initializers);
Constructor superTarget;
List<FormalParameterBuilder>? superFormals;
if (superTargetBuilder is DeclaredSourceConstructorBuilder) {
@@ -468,7 +474,8 @@
void addSuperParameterDefaultValueCloners(
List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
- ConstructorBuilder? superTargetBuilder = _computeSuperTargetBuilder();
+ ConstructorBuilder? superTargetBuilder =
+ _computeSuperTargetBuilder(constructor.initializers);
if (superTargetBuilder is DeclaredSourceConstructorBuilder) {
superTargetBuilder
.addSuperParameterDefaultValueCloners(synthesizedFunctionNodes);
diff --git a/pkg/front_end/test/macros/macro_test.dart b/pkg/front_end/test/macros/macro_test.dart
index ce03989..910c3e1 100644
--- a/pkg/front_end/test/macros/macro_test.dart
+++ b/pkg/front_end/test/macros/macro_test.dart
@@ -282,7 +282,7 @@
@override
String buildAugmentationLibrary(Iterable<MacroExecutionResult> macroResults,
- Uri Function(Identifier) resolveIdentifier) {
+ ResolvedIdentifier Function(Identifier) resolveIdentifier) {
// TODO: implement buildAugmentationLibrary
throw UnimplementedError();
}
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 3423497..10299a1 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -943,6 +943,7 @@
qi
qm
quad
+qualify
quantified
queries
quick
@@ -1369,6 +1370,7 @@
unpaired
unparsed
unpleasant
+unqualified
unreachable
unseen
unset
diff --git a/pkg/front_end/testcases/super_parameters/issue48286.dart b/pkg/front_end/testcases/super_parameters/issue48286.dart
new file mode 100644
index 0000000..042a998
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/issue48286.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2022, 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 S<T> {
+ num n;
+ T t;
+ S(this.n, this.t);
+ S.named(this.t, this.n);
+}
+
+class C<T> extends S<T> {
+ C.constr1(super.n, String s, super.t);
+ C.constr2(int i, super.n, String s, super.t) : super();
+ C.constr3(int i, super.t, String s, super.n) : super.named();
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/issue48286.dart.strong.expect b/pkg/front_end/testcases/super_parameters/issue48286.dart.strong.expect
new file mode 100644
index 0000000..5409077
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/issue48286.dart.strong.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class S<T extends core::Object? = dynamic> extends core::Object {
+ field core::num n;
+ covariant-by-class field self::S::T% t;
+ constructor •(core::num n, self::S::T% t) → self::S<self::S::T%>
+ : self::S::n = n, self::S::t = t, super core::Object::•()
+ ;
+ constructor named(self::S::T% t, core::num n) → self::S<self::S::T%>
+ : self::S::t = t, self::S::n = n, super core::Object::•()
+ ;
+}
+class C<T extends core::Object? = dynamic> extends self::S<self::C::T%> {
+ constructor constr1(core::num n, core::String s, self::C::T% t) → self::C<self::C::T%>
+ : super self::S::•(n, t)
+ ;
+ constructor constr2(core::int i, core::num n, core::String s, self::C::T% t) → self::C<self::C::T%>
+ : super self::S::•(n, t)
+ ;
+ constructor constr3(core::int i, self::C::T% t, core::String s, core::num n) → self::C<self::C::T%>
+ : super self::S::named(t, n)
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/issue48286.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/issue48286.dart.strong.transformed.expect
new file mode 100644
index 0000000..5409077
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/issue48286.dart.strong.transformed.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class S<T extends core::Object? = dynamic> extends core::Object {
+ field core::num n;
+ covariant-by-class field self::S::T% t;
+ constructor •(core::num n, self::S::T% t) → self::S<self::S::T%>
+ : self::S::n = n, self::S::t = t, super core::Object::•()
+ ;
+ constructor named(self::S::T% t, core::num n) → self::S<self::S::T%>
+ : self::S::t = t, self::S::n = n, super core::Object::•()
+ ;
+}
+class C<T extends core::Object? = dynamic> extends self::S<self::C::T%> {
+ constructor constr1(core::num n, core::String s, self::C::T% t) → self::C<self::C::T%>
+ : super self::S::•(n, t)
+ ;
+ constructor constr2(core::int i, core::num n, core::String s, self::C::T% t) → self::C<self::C::T%>
+ : super self::S::•(n, t)
+ ;
+ constructor constr3(core::int i, self::C::T% t, core::String s, core::num n) → self::C<self::C::T%>
+ : super self::S::named(t, n)
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/issue48286.dart.textual_outline.expect b/pkg/front_end/testcases/super_parameters/issue48286.dart.textual_outline.expect
new file mode 100644
index 0000000..9eae54a
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/issue48286.dart.textual_outline.expect
@@ -0,0 +1,12 @@
+class S<T> {
+ num n;
+ T t;
+ S(this.n, this.t);
+ S.named(this.t, this.n);
+}
+class C<T> extends S<T> {
+ C.constr1(super.n, String s, super.t);
+ C.constr2(int i, super.n, String s, super.t) : super();
+ C.constr3(int i, super.t, String s, super.n) : super.named();
+}
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/issue48286.dart.weak.expect b/pkg/front_end/testcases/super_parameters/issue48286.dart.weak.expect
new file mode 100644
index 0000000..5409077
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/issue48286.dart.weak.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class S<T extends core::Object? = dynamic> extends core::Object {
+ field core::num n;
+ covariant-by-class field self::S::T% t;
+ constructor •(core::num n, self::S::T% t) → self::S<self::S::T%>
+ : self::S::n = n, self::S::t = t, super core::Object::•()
+ ;
+ constructor named(self::S::T% t, core::num n) → self::S<self::S::T%>
+ : self::S::t = t, self::S::n = n, super core::Object::•()
+ ;
+}
+class C<T extends core::Object? = dynamic> extends self::S<self::C::T%> {
+ constructor constr1(core::num n, core::String s, self::C::T% t) → self::C<self::C::T%>
+ : super self::S::•(n, t)
+ ;
+ constructor constr2(core::int i, core::num n, core::String s, self::C::T% t) → self::C<self::C::T%>
+ : super self::S::•(n, t)
+ ;
+ constructor constr3(core::int i, self::C::T% t, core::String s, core::num n) → self::C<self::C::T%>
+ : super self::S::named(t, n)
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/issue48286.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/issue48286.dart.weak.modular.expect
new file mode 100644
index 0000000..5409077
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/issue48286.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class S<T extends core::Object? = dynamic> extends core::Object {
+ field core::num n;
+ covariant-by-class field self::S::T% t;
+ constructor •(core::num n, self::S::T% t) → self::S<self::S::T%>
+ : self::S::n = n, self::S::t = t, super core::Object::•()
+ ;
+ constructor named(self::S::T% t, core::num n) → self::S<self::S::T%>
+ : self::S::t = t, self::S::n = n, super core::Object::•()
+ ;
+}
+class C<T extends core::Object? = dynamic> extends self::S<self::C::T%> {
+ constructor constr1(core::num n, core::String s, self::C::T% t) → self::C<self::C::T%>
+ : super self::S::•(n, t)
+ ;
+ constructor constr2(core::int i, core::num n, core::String s, self::C::T% t) → self::C<self::C::T%>
+ : super self::S::•(n, t)
+ ;
+ constructor constr3(core::int i, self::C::T% t, core::String s, core::num n) → self::C<self::C::T%>
+ : super self::S::named(t, n)
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/issue48286.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/issue48286.dart.weak.outline.expect
new file mode 100644
index 0000000..35398a6
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/issue48286.dart.weak.outline.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class S<T extends core::Object? = dynamic> extends core::Object {
+ field core::num n;
+ covariant-by-class field self::S::T% t;
+ constructor •(core::num n, self::S::T% t) → self::S<self::S::T%>
+ ;
+ constructor named(self::S::T% t, core::num n) → self::S<self::S::T%>
+ ;
+}
+class C<T extends core::Object? = dynamic> extends self::S<self::C::T%> {
+ constructor constr1(core::num n, core::String s, self::C::T% t) → self::C<self::C::T%>
+ ;
+ constructor constr2(core::int i, core::num n, core::String s, self::C::T% t) → self::C<self::C::T%>
+ ;
+ constructor constr3(core::int i, self::C::T% t, core::String s, core::num n) → self::C<self::C::T%>
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/super_parameters/issue48286.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/issue48286.dart.weak.transformed.expect
new file mode 100644
index 0000000..5409077
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/issue48286.dart.weak.transformed.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class S<T extends core::Object? = dynamic> extends core::Object {
+ field core::num n;
+ covariant-by-class field self::S::T% t;
+ constructor •(core::num n, self::S::T% t) → self::S<self::S::T%>
+ : self::S::n = n, self::S::t = t, super core::Object::•()
+ ;
+ constructor named(self::S::T% t, core::num n) → self::S<self::S::T%>
+ : self::S::t = t, self::S::n = n, super core::Object::•()
+ ;
+}
+class C<T extends core::Object? = dynamic> extends self::S<self::C::T%> {
+ constructor constr1(core::num n, core::String s, self::C::T% t) → self::C<self::C::T%>
+ : super self::S::•(n, t)
+ ;
+ constructor constr2(core::int i, core::num n, core::String s, self::C::T% t) → self::C<self::C::T%>
+ : super self::S::•(n, t)
+ ;
+ constructor constr3(core::int i, self::C::T% t, core::String s, core::num n) → self::C<self::C::T%>
+ : super self::S::named(t, n)
+ ;
+}
+static method main() → dynamic {}
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
index 2422e10..8e3046a 100644
--- a/pkg/front_end/testcases/super_parameters/simple_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_inference.dart.strong.expect
@@ -27,8 +27,8 @@
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)
+ constructor named3({required core::int foo = #C1}) → self::B1
+ : super self::A1::named3(foo: foo)
;
}
class A2 extends core::Object {
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
index 2422e10..8e3046a 100644
--- 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
@@ -27,8 +27,8 @@
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)
+ constructor named3({required core::int foo = #C1}) → self::B1
+ : super self::A1::named3(foo: foo)
;
}
class A2 extends core::Object {
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
index 2422e10..8e3046a 100644
--- a/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_inference.dart.weak.expect
@@ -27,8 +27,8 @@
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)
+ constructor named3({required core::int foo = #C1}) → self::B1
+ : super self::A1::named3(foo: foo)
;
}
class A2 extends core::Object {
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
index 2422e10..8e3046a 100644
--- 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
@@ -27,8 +27,8 @@
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)
+ constructor named3({required core::int foo = #C1}) → self::B1
+ : super self::A1::named3(foo: foo)
;
}
class A2 extends core::Object {
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
index c7b816c..3d11aa3 100644
--- 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
@@ -20,7 +20,7 @@
;
constructor named2(core::int foo) → self::B1
;
- constructor named3({required dynamic foo}) → self::B1
+ constructor named3({required core::int foo}) → self::B1
;
}
class A2 extends core::Object {
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
index 2422e10..8e3046a 100644
--- 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
@@ -27,8 +27,8 @@
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)
+ constructor named3({required core::int foo = #C1}) → self::B1
+ : super self::A1::named3(foo: foo)
;
}
class A2 extends core::Object {
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 8c015e4..bb12aa2 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -219,6 +219,7 @@
super_parameters/circular_dependency_inference: FormatterCrash
super_parameters/default_values: FormatterCrash
super_parameters/issue48142: FormatterCrash
+super_parameters/issue48286: FormatterCrash
super_parameters/simple: FormatterCrash
super_parameters/simple_inference: FormatterCrash
super_parameters/simple_named_super_parameters: FormatterCrash
diff --git a/tools/VERSION b/tools/VERSION
index 37044ab..19760f9 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 17
PATCH 0
-PRERELEASE 95
+PRERELEASE 96
PRERELEASE_PATCH 0
\ No newline at end of file