Skip to content

Commit c867de3

Browse files
johnniwintherCommit Queue
authored and
Commit Queue
committed
[cfe] Use InferableTypeBuilder for primary constructor parameters
Primary constructor parameters where wrongfully using the ImplicitTypeBuilder instead of the InferableTypeBuilder meaning that parameter types where not inferred but instead defaulted to dynamic. Documentation is added to these classes to avoid the same mistake in the future. Closes #53211 Change-Id: I075d5dc7e3db53dc00a11ba76b51ecf0b8438489 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/320762 Reviewed-by: Chloe Stefantsova <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent b08f029 commit c867de3

File tree

252 files changed

+2704
-2111
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

252 files changed

+2704
-2111
lines changed

pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart

+3-2
Original file line numberDiff line numberDiff line change
@@ -199,12 +199,13 @@ class FormalParameterBuilder extends ModifierBuilderImpl
199199
type.clone(newTypes, contextLibrary, contextDeclaration), name);
200200
}
201201

202-
FormalParameterBuilder forPrimaryConstructor() {
202+
FormalParameterBuilder forPrimaryConstructor(
203+
SourceLibraryBuilder sourceLibraryBuilder) {
203204
return new FormalParameterBuilder(
204205
metadata,
205206
kind,
206207
modifiers | initializingFormalMask,
207-
const ImplicitTypeBuilder(),
208+
sourceLibraryBuilder.addInferableType(),
208209
name,
209210
null,
210211
charOffset,

pkg/front_end/lib/src/fasta/builder/omitted_type_builder.dart

+13
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,13 @@ abstract class OmittedTypeBuilder extends TypeBuilder {
6060
DartType get type;
6161
}
6262

63+
/// [TypeBuilder] for when there is no explicit type provided by the user and
64+
/// the type _cannot_ be inferred from context.
65+
///
66+
/// For omitted return types and parameter types of instance method,
67+
/// field types and initializing formal types, use [InferableTypeBuilder]
68+
/// instead. This should be created through
69+
/// [SourceLibraryBuilder.addInferableType] to ensure the type is inferred.
6370
class ImplicitTypeBuilder extends OmittedTypeBuilder {
6471
const ImplicitTypeBuilder();
6572

@@ -89,6 +96,12 @@ class ImplicitTypeBuilder extends OmittedTypeBuilder {
8996
DartType get type => const DynamicType();
9097
}
9198

99+
/// [TypeBuilder] for when there is no explicit type provided by the user but
100+
/// the type _can_ be inferred from context. For instance omitted return types
101+
/// and parameter types of instance method,
102+
///
103+
/// [InferableTypeBuilder] should be created through
104+
/// [SourceLibraryBuilder.addInferableType] to ensure the type is inferred.
92105
class InferableTypeBuilder extends OmittedTypeBuilder
93106
with InferableTypeBuilderMixin
94107
implements InferableType {

pkg/front_end/lib/src/fasta/source/outline_builder.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -1631,7 +1631,7 @@ class OutlineBuilder extends StackListenerImpl {
16311631
type: formal.type,
16321632
name: formal.name,
16331633
charOffset: formal.charOffset);
1634-
formals[i] = formal.forPrimaryConstructor();
1634+
formals[i] = formal.forPrimaryConstructor(libraryBuilder);
16351635
}
16361636
}
16371637

pkg/front_end/testcases/inline_class/extension_types/access_non_extension_type_members.dart.strong.expect

+4-4
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,17 @@ extension type F(self::B it) implements self::E /* = self::B */ {
2828
constructor • = self::F|;
2929
tearoff • = self::F|_#new#tearOff;
3030
}
31-
static inline-class-member method E|(dynamic it) → self::E /* = self::B */ {
31+
static inline-class-member method E|(self::B it) → self::E /* = self::B */ {
3232
lowered final self::E /* = self::B */ #this = it;
3333
return #this;
3434
}
35-
static inline-class-member method E|_#new#tearOff(dynamic it) → self::E /* = self::B */
35+
static inline-class-member method E|_#new#tearOff(self::B it) → self::E /* = self::B */
3636
return self::E|(it);
37-
static inline-class-member method F|(dynamic it) → self::F /* = self::B */ {
37+
static inline-class-member method F|(self::B it) → self::F /* = self::B */ {
3838
lowered final self::F /* = self::B */ #this = it;
3939
return #this;
4040
}
41-
static inline-class-member method F|_#new#tearOff(dynamic it) → self::F /* = self::B */
41+
static inline-class-member method F|_#new#tearOff(self::B it) → self::F /* = self::B */
4242
return self::F|(it);
4343
static method main() → dynamic {
4444
self::B b = new self::B::•();

pkg/front_end/testcases/inline_class/extension_types/access_non_extension_type_members.dart.strong.transformed.expect

+4-4
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,17 @@ extension type F(self::B it) implements self::E /* = self::B */ {
2828
constructor • = self::F|;
2929
tearoff • = self::F|_#new#tearOff;
3030
}
31-
static inline-class-member method E|(dynamic it) → self::E /* = self::B */ {
31+
static inline-class-member method E|(self::B it) → self::E /* = self::B */ {
3232
lowered final self::E /* = self::B */ #this = it;
3333
return #this;
3434
}
35-
static inline-class-member method E|_#new#tearOff(dynamic it) → self::E /* = self::B */
35+
static inline-class-member method E|_#new#tearOff(self::B it) → self::E /* = self::B */
3636
return self::E|(it);
37-
static inline-class-member method F|(dynamic it) → self::F /* = self::B */ {
37+
static inline-class-member method F|(self::B it) → self::F /* = self::B */ {
3838
lowered final self::F /* = self::B */ #this = it;
3939
return #this;
4040
}
41-
static inline-class-member method F|_#new#tearOff(dynamic it) → self::F /* = self::B */
41+
static inline-class-member method F|_#new#tearOff(self::B it) → self::F /* = self::B */
4242
return self::F|(it);
4343
static method main() → dynamic {
4444
self::B b = new self::B::•();

pkg/front_end/testcases/inline_class/extension_types/access_non_extension_type_members.dart.weak.expect

+4-4
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,17 @@ extension type F(self::B it) implements self::E /* = self::B */ {
2828
constructor • = self::F|;
2929
tearoff • = self::F|_#new#tearOff;
3030
}
31-
static inline-class-member method E|(dynamic it) → self::E /* = self::B */ {
31+
static inline-class-member method E|(self::B it) → self::E /* = self::B */ {
3232
lowered final self::E /* = self::B */ #this = it;
3333
return #this;
3434
}
35-
static inline-class-member method E|_#new#tearOff(dynamic it) → self::E /* = self::B */
35+
static inline-class-member method E|_#new#tearOff(self::B it) → self::E /* = self::B */
3636
return self::E|(it);
37-
static inline-class-member method F|(dynamic it) → self::F /* = self::B */ {
37+
static inline-class-member method F|(self::B it) → self::F /* = self::B */ {
3838
lowered final self::F /* = self::B */ #this = it;
3939
return #this;
4040
}
41-
static inline-class-member method F|_#new#tearOff(dynamic it) → self::F /* = self::B */
41+
static inline-class-member method F|_#new#tearOff(self::B it) → self::F /* = self::B */
4242
return self::F|(it);
4343
static method main() → dynamic {
4444
self::B b = new self::B::•();

pkg/front_end/testcases/inline_class/extension_types/access_non_extension_type_members.dart.weak.modular.expect

+4-4
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,17 @@ extension type F(self::B it) implements self::E /* = self::B */ {
2828
constructor • = self::F|;
2929
tearoff • = self::F|_#new#tearOff;
3030
}
31-
static inline-class-member method E|(dynamic it) → self::E /* = self::B */ {
31+
static inline-class-member method E|(self::B it) → self::E /* = self::B */ {
3232
lowered final self::E /* = self::B */ #this = it;
3333
return #this;
3434
}
35-
static inline-class-member method E|_#new#tearOff(dynamic it) → self::E /* = self::B */
35+
static inline-class-member method E|_#new#tearOff(self::B it) → self::E /* = self::B */
3636
return self::E|(it);
37-
static inline-class-member method F|(dynamic it) → self::F /* = self::B */ {
37+
static inline-class-member method F|(self::B it) → self::F /* = self::B */ {
3838
lowered final self::F /* = self::B */ #this = it;
3939
return #this;
4040
}
41-
static inline-class-member method F|_#new#tearOff(dynamic it) → self::F /* = self::B */
41+
static inline-class-member method F|_#new#tearOff(self::B it) → self::F /* = self::B */
4242
return self::F|(it);
4343
static method main() → dynamic {
4444
self::B b = new self::B::•();

pkg/front_end/testcases/inline_class/extension_types/access_non_extension_type_members.dart.weak.outline.expect

+4-4
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ extension type F(self::B it) implements self::E /* = self::B */ {
2525
constructor • = self::F|;
2626
tearoff • = self::F|_#new#tearOff;
2727
}
28-
static inline-class-member method E|(dynamic it) → self::E /* = self::B */
28+
static inline-class-member method E|(self::B it) → self::E /* = self::B */
2929
;
30-
static inline-class-member method E|_#new#tearOff(dynamic it) → self::E /* = self::B */
30+
static inline-class-member method E|_#new#tearOff(self::B it) → self::E /* = self::B */
3131
return self::E|(it);
32-
static inline-class-member method F|(dynamic it) → self::F /* = self::B */
32+
static inline-class-member method F|(self::B it) → self::F /* = self::B */
3333
;
34-
static inline-class-member method F|_#new#tearOff(dynamic it) → self::F /* = self::B */
34+
static inline-class-member method F|_#new#tearOff(self::B it) → self::F /* = self::B */
3535
return self::F|(it);
3636
static method main() → dynamic
3737
;

pkg/front_end/testcases/inline_class/extension_types/access_non_extension_type_members.dart.weak.transformed.expect

+4-4
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,17 @@ extension type F(self::B it) implements self::E /* = self::B */ {
2828
constructor • = self::F|;
2929
tearoff • = self::F|_#new#tearOff;
3030
}
31-
static inline-class-member method E|(dynamic it) → self::E /* = self::B */ {
31+
static inline-class-member method E|(self::B it) → self::E /* = self::B */ {
3232
lowered final self::E /* = self::B */ #this = it;
3333
return #this;
3434
}
35-
static inline-class-member method E|_#new#tearOff(dynamic it) → self::E /* = self::B */
35+
static inline-class-member method E|_#new#tearOff(self::B it) → self::E /* = self::B */
3636
return self::E|(it);
37-
static inline-class-member method F|(dynamic it) → self::F /* = self::B */ {
37+
static inline-class-member method F|(self::B it) → self::F /* = self::B */ {
3838
lowered final self::F /* = self::B */ #this = it;
3939
return #this;
4040
}
41-
static inline-class-member method F|_#new#tearOff(dynamic it) → self::F /* = self::B */
41+
static inline-class-member method F|_#new#tearOff(self::B it) → self::F /* = self::B */
4242
return self::F|(it);
4343
static method main() → dynamic {
4444
self::B b = new self::B::•();

pkg/front_end/testcases/inline_class/extension_types/annotations.dart.strong.expect

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ extension type A(core::int i) {
1111
constructor constructor = self::A|constructor;
1212
tearoff constructor = self::A|_#constructor#tearOff;
1313
}
14-
static inline-class-member method A|(@#C2 dynamic i) → self::A /* = core::int */ {
14+
static inline-class-member method A|(@#C2 core::int i) → self::A /* = core::int */ {
1515
lowered final self::A /* = core::int */ #this = i;
1616
return #this;
1717
}
18-
static inline-class-member method A|_#new#tearOff(dynamic i) → self::A /* = core::int */
18+
static inline-class-member method A|_#new#tearOff(core::int i) → self::A /* = core::int */
1919
return self::A|(i);
2020
@#C2
2121
static inline-class-member method A|constructor(core::int i) → self::A /* = core::int */ {

pkg/front_end/testcases/inline_class/extension_types/annotations.dart.strong.transformed.expect

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ extension type A(core::int i) {
1111
constructor constructor = self::A|constructor;
1212
tearoff constructor = self::A|_#constructor#tearOff;
1313
}
14-
static inline-class-member method A|(@#C2 dynamic i) → self::A /* = core::int */ {
14+
static inline-class-member method A|(@#C2 core::int i) → self::A /* = core::int */ {
1515
lowered final self::A /* = core::int */ #this = i;
1616
return #this;
1717
}
18-
static inline-class-member method A|_#new#tearOff(dynamic i) → self::A /* = core::int */
18+
static inline-class-member method A|_#new#tearOff(core::int i) → self::A /* = core::int */
1919
return self::A|(i);
2020
@#C2
2121
static inline-class-member method A|constructor(core::int i) → self::A /* = core::int */ {

pkg/front_end/testcases/inline_class/extension_types/annotations.dart.weak.expect

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ extension type A(core::int i) {
1111
constructor constructor = self::A|constructor;
1212
tearoff constructor = self::A|_#constructor#tearOff;
1313
}
14-
static inline-class-member method A|(@#C2 dynamic i) → self::A /* = core::int */ {
14+
static inline-class-member method A|(@#C2 core::int i) → self::A /* = core::int */ {
1515
lowered final self::A /* = core::int */ #this = i;
1616
return #this;
1717
}
18-
static inline-class-member method A|_#new#tearOff(dynamic i) → self::A /* = core::int */
18+
static inline-class-member method A|_#new#tearOff(core::int i) → self::A /* = core::int */
1919
return self::A|(i);
2020
@#C2
2121
static inline-class-member method A|constructor(core::int i) → self::A /* = core::int */ {

pkg/front_end/testcases/inline_class/extension_types/annotations.dart.weak.modular.expect

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ extension type A(core::int i) {
1111
constructor constructor = self::A|constructor;
1212
tearoff constructor = self::A|_#constructor#tearOff;
1313
}
14-
static inline-class-member method A|(@#C2 dynamic i) → self::A /* = core::int */ {
14+
static inline-class-member method A|(@#C2 core::int i) → self::A /* = core::int */ {
1515
lowered final self::A /* = core::int */ #this = i;
1616
return #this;
1717
}
18-
static inline-class-member method A|_#new#tearOff(dynamic i) → self::A /* = core::int */
18+
static inline-class-member method A|_#new#tearOff(core::int i) → self::A /* = core::int */
1919
return self::A|(i);
2020
@#C2
2121
static inline-class-member method A|constructor(core::int i) → self::A /* = core::int */ {

pkg/front_end/testcases/inline_class/extension_types/annotations.dart.weak.outline.expect

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ extension type A(core::int i) {
1111
constructor constructor = self::A|constructor;
1212
tearoff constructor = self::A|_#constructor#tearOff;
1313
}
14-
static inline-class-member method A|(dynamic i) → self::A /* = core::int */
14+
static inline-class-member method A|(core::int i) → self::A /* = core::int */
1515
;
16-
static inline-class-member method A|_#new#tearOff(dynamic i) → self::A /* = core::int */
16+
static inline-class-member method A|_#new#tearOff(core::int i) → self::A /* = core::int */
1717
return self::A|(i);
1818
@core::Deprecated::•("")
1919
static inline-class-member method A|constructor(core::int i) → self::A /* = core::int */

pkg/front_end/testcases/inline_class/extension_types/annotations.dart.weak.transformed.expect

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ extension type A(core::int i) {
1111
constructor constructor = self::A|constructor;
1212
tearoff constructor = self::A|_#constructor#tearOff;
1313
}
14-
static inline-class-member method A|(@#C2 dynamic i) → self::A /* = core::int */ {
14+
static inline-class-member method A|(@#C2 core::int i) → self::A /* = core::int */ {
1515
lowered final self::A /* = core::int */ #this = i;
1616
return #this;
1717
}
18-
static inline-class-member method A|_#new#tearOff(dynamic i) → self::A /* = core::int */
18+
static inline-class-member method A|_#new#tearOff(core::int i) → self::A /* = core::int */
1919
return self::A|(i);
2020
@#C2
2121
static inline-class-member method A|constructor(core::int i) → self::A /* = core::int */ {

pkg/front_end/testcases/inline_class/extension_types/assign_interface_type.dart.strong.expect

+10-10
Original file line numberDiff line numberDiff line change
@@ -314,35 +314,35 @@ extension type G<T extends core::Object? = dynamic>(T% o) {
314314
constructor • = self::G|;
315315
tearoff • = self::G|_#new#tearOff;
316316
}
317-
static inline-class-member method C|(dynamic o) → self::C /* = core::Object? */ {
317+
static inline-class-member method C|(core::Object? o) → self::C /* = core::Object? */ {
318318
lowered final self::C /* = core::Object? */ #this = o;
319319
return #this;
320320
}
321-
static inline-class-member method C|_#new#tearOff(dynamic o) → self::C /* = core::Object? */
321+
static inline-class-member method C|_#new#tearOff(core::Object? o) → self::C /* = core::Object? */
322322
return self::C|(o);
323-
static inline-class-member method D|(dynamic o) → self::D /* = core::Object */ {
323+
static inline-class-member method D|(core::Object o) → self::D /* = core::Object */ {
324324
lowered final self::D /* = core::Object */ #this = o;
325325
return #this;
326326
}
327-
static inline-class-member method D|_#new#tearOff(dynamic o) → self::D /* = core::Object */
327+
static inline-class-member method D|_#new#tearOff(core::Object o) → self::D /* = core::Object */
328328
return self::D|(o);
329-
static inline-class-member method E|(dynamic it) → self::E /* = self::B */ {
329+
static inline-class-member method E|(self::B it) → self::E /* = self::B */ {
330330
lowered final self::E /* = self::B */ #this = it;
331331
return #this;
332332
}
333-
static inline-class-member method E|_#new#tearOff(dynamic it) → self::E /* = self::B */
333+
static inline-class-member method E|_#new#tearOff(self::B it) → self::E /* = self::B */
334334
return self::E|(it);
335-
static inline-class-member method F|(dynamic it) → self::F /* = self::B */ {
335+
static inline-class-member method F|(self::B it) → self::F /* = self::B */ {
336336
lowered final self::F /* = self::B */ #this = it;
337337
return #this;
338338
}
339-
static inline-class-member method F|_#new#tearOff(dynamic it) → self::F /* = self::B */
339+
static inline-class-member method F|_#new#tearOff(self::B it) → self::F /* = self::B */
340340
return self::F|(it);
341-
static inline-class-member method G|<T extends core::Object? = dynamic>(dynamic o) → self::G<self::G|::T%> /* = self::G|::T% */ {
341+
static inline-class-member method G|<T extends core::Object? = dynamic>(self::G|::T% o) → self::G<self::G|::T%> /* = self::G|::T% */ {
342342
lowered final self::G<self::G|::T%> /* = self::G|::T% */ #this = o;
343343
return #this;
344344
}
345-
static inline-class-member method G|_#new#tearOff<T extends core::Object? = dynamic>(dynamic o) → self::G<self::G|_#new#tearOff::T%> /* = self::G|_#new#tearOff::T% */
345+
static inline-class-member method G|_#new#tearOff<T extends core::Object? = dynamic>(self::G|_#new#tearOff::T% o) → self::G<self::G|_#new#tearOff::T%> /* = self::G|_#new#tearOff::T% */
346346
return self::G|<self::G|_#new#tearOff::T%>(o);
347347
static method test<T1 extends core::Object? = dynamic, T2 extends self::A>(core::Object o, self::A a, self::B b, self::C /* = core::Object? */ c, self::D /* = core::Object */ d, self::E /* = self::B */ e, self::F /* = self::B */ f, self::G<self::test::T1%> /* = self::test::T1% */ g1, self::G<self::test::T2> /* = self::test::T2 */ g2) → dynamic {
348348
o = o;

pkg/front_end/testcases/inline_class/extension_types/assign_interface_type.dart.strong.transformed.expect

+10-10
Original file line numberDiff line numberDiff line change
@@ -314,35 +314,35 @@ extension type G<T extends core::Object? = dynamic>(T% o) {
314314
constructor • = self::G|;
315315
tearoff • = self::G|_#new#tearOff;
316316
}
317-
static inline-class-member method C|(dynamic o) → self::C /* = core::Object? */ {
317+
static inline-class-member method C|(core::Object? o) → self::C /* = core::Object? */ {
318318
lowered final self::C /* = core::Object? */ #this = o;
319319
return #this;
320320
}
321-
static inline-class-member method C|_#new#tearOff(dynamic o) → self::C /* = core::Object? */
321+
static inline-class-member method C|_#new#tearOff(core::Object? o) → self::C /* = core::Object? */
322322
return self::C|(o);
323-
static inline-class-member method D|(dynamic o) → self::D /* = core::Object */ {
323+
static inline-class-member method D|(core::Object o) → self::D /* = core::Object */ {
324324
lowered final self::D /* = core::Object */ #this = o;
325325
return #this;
326326
}
327-
static inline-class-member method D|_#new#tearOff(dynamic o) → self::D /* = core::Object */
327+
static inline-class-member method D|_#new#tearOff(core::Object o) → self::D /* = core::Object */
328328
return self::D|(o);
329-
static inline-class-member method E|(dynamic it) → self::E /* = self::B */ {
329+
static inline-class-member method E|(self::B it) → self::E /* = self::B */ {
330330
lowered final self::E /* = self::B */ #this = it;
331331
return #this;
332332
}
333-
static inline-class-member method E|_#new#tearOff(dynamic it) → self::E /* = self::B */
333+
static inline-class-member method E|_#new#tearOff(self::B it) → self::E /* = self::B */
334334
return self::E|(it);
335-
static inline-class-member method F|(dynamic it) → self::F /* = self::B */ {
335+
static inline-class-member method F|(self::B it) → self::F /* = self::B */ {
336336
lowered final self::F /* = self::B */ #this = it;
337337
return #this;
338338
}
339-
static inline-class-member method F|_#new#tearOff(dynamic it) → self::F /* = self::B */
339+
static inline-class-member method F|_#new#tearOff(self::B it) → self::F /* = self::B */
340340
return self::F|(it);
341-
static inline-class-member method G|<T extends core::Object? = dynamic>(dynamic o) → self::G<self::G|::T%> /* = self::G|::T% */ {
341+
static inline-class-member method G|<T extends core::Object? = dynamic>(self::G|::T% o) → self::G<self::G|::T%> /* = self::G|::T% */ {
342342
lowered final self::G<self::G|::T%> /* = self::G|::T% */ #this = o;
343343
return #this;
344344
}
345-
static inline-class-member method G|_#new#tearOff<T extends core::Object? = dynamic>(dynamic o) → self::G<self::G|_#new#tearOff::T%> /* = self::G|_#new#tearOff::T% */
345+
static inline-class-member method G|_#new#tearOff<T extends core::Object? = dynamic>(self::G|_#new#tearOff::T% o) → self::G<self::G|_#new#tearOff::T%> /* = self::G|_#new#tearOff::T% */
346346
return self::G|<self::G|_#new#tearOff::T%>(o);
347347
static method test<T1 extends core::Object? = dynamic, T2 extends self::A>(core::Object o, self::A a, self::B b, self::C /* = core::Object? */ c, self::D /* = core::Object */ d, self::E /* = self::B */ e, self::F /* = self::B */ f, self::G<self::test::T1%> /* = self::test::T1% */ g1, self::G<self::test::T2> /* = self::test::T2 */ g2) → dynamic {
348348
o = o;

0 commit comments

Comments
 (0)