Skip to content

Commit

Permalink
[cfe] Use InferableTypeBuilder for primary constructor parameters
Browse files Browse the repository at this point in the history
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 <cstefantsova@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
  • Loading branch information
johnniwinther authored and Commit Queue committed Aug 16, 2023
1 parent b08f029 commit c867de3
Show file tree
Hide file tree
Showing 252 changed files with 2,704 additions and 2,111 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -199,12 +199,13 @@ class FormalParameterBuilder extends ModifierBuilderImpl
type.clone(newTypes, contextLibrary, contextDeclaration), name);
}

FormalParameterBuilder forPrimaryConstructor() {
FormalParameterBuilder forPrimaryConstructor(
SourceLibraryBuilder sourceLibraryBuilder) {
return new FormalParameterBuilder(
metadata,
kind,
modifiers | initializingFormalMask,
const ImplicitTypeBuilder(),
sourceLibraryBuilder.addInferableType(),
name,
null,
charOffset,
Expand Down
13 changes: 13 additions & 0 deletions pkg/front_end/lib/src/fasta/builder/omitted_type_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,13 @@ abstract class OmittedTypeBuilder extends TypeBuilder {
DartType get type;
}

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

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

/// [TypeBuilder] for when there is no explicit type provided by the user but
/// the type _can_ be inferred from context. For instance omitted return types
/// and parameter types of instance method,
///
/// [InferableTypeBuilder] should be created through
/// [SourceLibraryBuilder.addInferableType] to ensure the type is inferred.
class InferableTypeBuilder extends OmittedTypeBuilder
with InferableTypeBuilderMixin
implements InferableType {
Expand Down
2 changes: 1 addition & 1 deletion pkg/front_end/lib/src/fasta/source/outline_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1631,7 +1631,7 @@ class OutlineBuilder extends StackListenerImpl {
type: formal.type,
name: formal.name,
charOffset: formal.charOffset);
formals[i] = formal.forPrimaryConstructor();
formals[i] = formal.forPrimaryConstructor(libraryBuilder);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,17 @@ extension type F(self::B it) implements self::E /* = self::B */ {
constructor • = self::F|;
tearoff • = self::F|_#new#tearOff;
}
static inline-class-member method E|(dynamic it) → self::E /* = self::B */ {
static inline-class-member method E|(self::B it) → self::E /* = self::B */ {
lowered final self::E /* = self::B */ #this = it;
return #this;
}
static inline-class-member method E|_#new#tearOff(dynamic it) → self::E /* = self::B */
static inline-class-member method E|_#new#tearOff(self::B it) → self::E /* = self::B */
return self::E|(it);
static inline-class-member method F|(dynamic it) → self::F /* = self::B */ {
static inline-class-member method F|(self::B it) → self::F /* = self::B */ {
lowered final self::F /* = self::B */ #this = it;
return #this;
}
static inline-class-member method F|_#new#tearOff(dynamic it) → self::F /* = self::B */
static inline-class-member method F|_#new#tearOff(self::B it) → self::F /* = self::B */
return self::F|(it);
static method main() → dynamic {
self::B b = new self::B::•();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,17 @@ extension type F(self::B it) implements self::E /* = self::B */ {
constructor • = self::F|;
tearoff • = self::F|_#new#tearOff;
}
static inline-class-member method E|(dynamic it) → self::E /* = self::B */ {
static inline-class-member method E|(self::B it) → self::E /* = self::B */ {
lowered final self::E /* = self::B */ #this = it;
return #this;
}
static inline-class-member method E|_#new#tearOff(dynamic it) → self::E /* = self::B */
static inline-class-member method E|_#new#tearOff(self::B it) → self::E /* = self::B */
return self::E|(it);
static inline-class-member method F|(dynamic it) → self::F /* = self::B */ {
static inline-class-member method F|(self::B it) → self::F /* = self::B */ {
lowered final self::F /* = self::B */ #this = it;
return #this;
}
static inline-class-member method F|_#new#tearOff(dynamic it) → self::F /* = self::B */
static inline-class-member method F|_#new#tearOff(self::B it) → self::F /* = self::B */
return self::F|(it);
static method main() → dynamic {
self::B b = new self::B::•();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,17 @@ extension type F(self::B it) implements self::E /* = self::B */ {
constructor • = self::F|;
tearoff • = self::F|_#new#tearOff;
}
static inline-class-member method E|(dynamic it) → self::E /* = self::B */ {
static inline-class-member method E|(self::B it) → self::E /* = self::B */ {
lowered final self::E /* = self::B */ #this = it;
return #this;
}
static inline-class-member method E|_#new#tearOff(dynamic it) → self::E /* = self::B */
static inline-class-member method E|_#new#tearOff(self::B it) → self::E /* = self::B */
return self::E|(it);
static inline-class-member method F|(dynamic it) → self::F /* = self::B */ {
static inline-class-member method F|(self::B it) → self::F /* = self::B */ {
lowered final self::F /* = self::B */ #this = it;
return #this;
}
static inline-class-member method F|_#new#tearOff(dynamic it) → self::F /* = self::B */
static inline-class-member method F|_#new#tearOff(self::B it) → self::F /* = self::B */
return self::F|(it);
static method main() → dynamic {
self::B b = new self::B::•();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,17 @@ extension type F(self::B it) implements self::E /* = self::B */ {
constructor • = self::F|;
tearoff • = self::F|_#new#tearOff;
}
static inline-class-member method E|(dynamic it) → self::E /* = self::B */ {
static inline-class-member method E|(self::B it) → self::E /* = self::B */ {
lowered final self::E /* = self::B */ #this = it;
return #this;
}
static inline-class-member method E|_#new#tearOff(dynamic it) → self::E /* = self::B */
static inline-class-member method E|_#new#tearOff(self::B it) → self::E /* = self::B */
return self::E|(it);
static inline-class-member method F|(dynamic it) → self::F /* = self::B */ {
static inline-class-member method F|(self::B it) → self::F /* = self::B */ {
lowered final self::F /* = self::B */ #this = it;
return #this;
}
static inline-class-member method F|_#new#tearOff(dynamic it) → self::F /* = self::B */
static inline-class-member method F|_#new#tearOff(self::B it) → self::F /* = self::B */
return self::F|(it);
static method main() → dynamic {
self::B b = new self::B::•();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,13 @@ extension type F(self::B it) implements self::E /* = self::B */ {
constructor • = self::F|;
tearoff • = self::F|_#new#tearOff;
}
static inline-class-member method E|(dynamic it) → self::E /* = self::B */
static inline-class-member method E|(self::B it) → self::E /* = self::B */
;
static inline-class-member method E|_#new#tearOff(dynamic it) → self::E /* = self::B */
static inline-class-member method E|_#new#tearOff(self::B it) → self::E /* = self::B */
return self::E|(it);
static inline-class-member method F|(dynamic it) → self::F /* = self::B */
static inline-class-member method F|(self::B it) → self::F /* = self::B */
;
static inline-class-member method F|_#new#tearOff(dynamic it) → self::F /* = self::B */
static inline-class-member method F|_#new#tearOff(self::B it) → self::F /* = self::B */
return self::F|(it);
static method main() → dynamic
;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,17 @@ extension type F(self::B it) implements self::E /* = self::B */ {
constructor • = self::F|;
tearoff • = self::F|_#new#tearOff;
}
static inline-class-member method E|(dynamic it) → self::E /* = self::B */ {
static inline-class-member method E|(self::B it) → self::E /* = self::B */ {
lowered final self::E /* = self::B */ #this = it;
return #this;
}
static inline-class-member method E|_#new#tearOff(dynamic it) → self::E /* = self::B */
static inline-class-member method E|_#new#tearOff(self::B it) → self::E /* = self::B */
return self::E|(it);
static inline-class-member method F|(dynamic it) → self::F /* = self::B */ {
static inline-class-member method F|(self::B it) → self::F /* = self::B */ {
lowered final self::F /* = self::B */ #this = it;
return #this;
}
static inline-class-member method F|_#new#tearOff(dynamic it) → self::F /* = self::B */
static inline-class-member method F|_#new#tearOff(self::B it) → self::F /* = self::B */
return self::F|(it);
static method main() → dynamic {
self::B b = new self::B::•();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ extension type A(core::int i) {
constructor constructor = self::A|constructor;
tearoff constructor = self::A|_#constructor#tearOff;
}
static inline-class-member method A|(@#C2 dynamic i) → self::A /* = core::int */ {
static inline-class-member method A|(@#C2 core::int i) → self::A /* = core::int */ {
lowered final self::A /* = core::int */ #this = i;
return #this;
}
static inline-class-member method A|_#new#tearOff(dynamic i) → self::A /* = core::int */
static inline-class-member method A|_#new#tearOff(core::int i) → self::A /* = core::int */
return self::A|(i);
@#C2
static inline-class-member method A|constructor(core::int i) → self::A /* = core::int */ {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ extension type A(core::int i) {
constructor constructor = self::A|constructor;
tearoff constructor = self::A|_#constructor#tearOff;
}
static inline-class-member method A|(@#C2 dynamic i) → self::A /* = core::int */ {
static inline-class-member method A|(@#C2 core::int i) → self::A /* = core::int */ {
lowered final self::A /* = core::int */ #this = i;
return #this;
}
static inline-class-member method A|_#new#tearOff(dynamic i) → self::A /* = core::int */
static inline-class-member method A|_#new#tearOff(core::int i) → self::A /* = core::int */
return self::A|(i);
@#C2
static inline-class-member method A|constructor(core::int i) → self::A /* = core::int */ {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ extension type A(core::int i) {
constructor constructor = self::A|constructor;
tearoff constructor = self::A|_#constructor#tearOff;
}
static inline-class-member method A|(@#C2 dynamic i) → self::A /* = core::int */ {
static inline-class-member method A|(@#C2 core::int i) → self::A /* = core::int */ {
lowered final self::A /* = core::int */ #this = i;
return #this;
}
static inline-class-member method A|_#new#tearOff(dynamic i) → self::A /* = core::int */
static inline-class-member method A|_#new#tearOff(core::int i) → self::A /* = core::int */
return self::A|(i);
@#C2
static inline-class-member method A|constructor(core::int i) → self::A /* = core::int */ {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ extension type A(core::int i) {
constructor constructor = self::A|constructor;
tearoff constructor = self::A|_#constructor#tearOff;
}
static inline-class-member method A|(@#C2 dynamic i) → self::A /* = core::int */ {
static inline-class-member method A|(@#C2 core::int i) → self::A /* = core::int */ {
lowered final self::A /* = core::int */ #this = i;
return #this;
}
static inline-class-member method A|_#new#tearOff(dynamic i) → self::A /* = core::int */
static inline-class-member method A|_#new#tearOff(core::int i) → self::A /* = core::int */
return self::A|(i);
@#C2
static inline-class-member method A|constructor(core::int i) → self::A /* = core::int */ {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ extension type A(core::int i) {
constructor constructor = self::A|constructor;
tearoff constructor = self::A|_#constructor#tearOff;
}
static inline-class-member method A|(dynamic i) → self::A /* = core::int */
static inline-class-member method A|(core::int i) → self::A /* = core::int */
;
static inline-class-member method A|_#new#tearOff(dynamic i) → self::A /* = core::int */
static inline-class-member method A|_#new#tearOff(core::int i) → self::A /* = core::int */
return self::A|(i);
@core::Deprecated::•("")
static inline-class-member method A|constructor(core::int i) → self::A /* = core::int */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ extension type A(core::int i) {
constructor constructor = self::A|constructor;
tearoff constructor = self::A|_#constructor#tearOff;
}
static inline-class-member method A|(@#C2 dynamic i) → self::A /* = core::int */ {
static inline-class-member method A|(@#C2 core::int i) → self::A /* = core::int */ {
lowered final self::A /* = core::int */ #this = i;
return #this;
}
static inline-class-member method A|_#new#tearOff(dynamic i) → self::A /* = core::int */
static inline-class-member method A|_#new#tearOff(core::int i) → self::A /* = core::int */
return self::A|(i);
@#C2
static inline-class-member method A|constructor(core::int i) → self::A /* = core::int */ {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -314,35 +314,35 @@ extension type G<T extends core::Object? = dynamic>(T% o) {
constructor • = self::G|;
tearoff • = self::G|_#new#tearOff;
}
static inline-class-member method C|(dynamic o) → self::C /* = core::Object? */ {
static inline-class-member method C|(core::Object? o) → self::C /* = core::Object? */ {
lowered final self::C /* = core::Object? */ #this = o;
return #this;
}
static inline-class-member method C|_#new#tearOff(dynamic o) → self::C /* = core::Object? */
static inline-class-member method C|_#new#tearOff(core::Object? o) → self::C /* = core::Object? */
return self::C|(o);
static inline-class-member method D|(dynamic o) → self::D /* = core::Object */ {
static inline-class-member method D|(core::Object o) → self::D /* = core::Object */ {
lowered final self::D /* = core::Object */ #this = o;
return #this;
}
static inline-class-member method D|_#new#tearOff(dynamic o) → self::D /* = core::Object */
static inline-class-member method D|_#new#tearOff(core::Object o) → self::D /* = core::Object */
return self::D|(o);
static inline-class-member method E|(dynamic it) → self::E /* = self::B */ {
static inline-class-member method E|(self::B it) → self::E /* = self::B */ {
lowered final self::E /* = self::B */ #this = it;
return #this;
}
static inline-class-member method E|_#new#tearOff(dynamic it) → self::E /* = self::B */
static inline-class-member method E|_#new#tearOff(self::B it) → self::E /* = self::B */
return self::E|(it);
static inline-class-member method F|(dynamic it) → self::F /* = self::B */ {
static inline-class-member method F|(self::B it) → self::F /* = self::B */ {
lowered final self::F /* = self::B */ #this = it;
return #this;
}
static inline-class-member method F|_#new#tearOff(dynamic it) → self::F /* = self::B */
static inline-class-member method F|_#new#tearOff(self::B it) → self::F /* = self::B */
return self::F|(it);
static inline-class-member method G|<T extends core::Object? = dynamic>(dynamic o) → self::G<self::G|::T%> /* = self::G|::T% */ {
static inline-class-member method G|<T extends core::Object? = dynamic>(self::G|::T% o) → self::G<self::G|::T%> /* = self::G|::T% */ {
lowered final self::G<self::G|::T%> /* = self::G|::T% */ #this = o;
return #this;
}
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% */
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% */
return self::G|<self::G|_#new#tearOff::T%>(o);
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 {
o = o;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -314,35 +314,35 @@ extension type G<T extends core::Object? = dynamic>(T% o) {
constructor • = self::G|;
tearoff • = self::G|_#new#tearOff;
}
static inline-class-member method C|(dynamic o) → self::C /* = core::Object? */ {
static inline-class-member method C|(core::Object? o) → self::C /* = core::Object? */ {
lowered final self::C /* = core::Object? */ #this = o;
return #this;
}
static inline-class-member method C|_#new#tearOff(dynamic o) → self::C /* = core::Object? */
static inline-class-member method C|_#new#tearOff(core::Object? o) → self::C /* = core::Object? */
return self::C|(o);
static inline-class-member method D|(dynamic o) → self::D /* = core::Object */ {
static inline-class-member method D|(core::Object o) → self::D /* = core::Object */ {
lowered final self::D /* = core::Object */ #this = o;
return #this;
}
static inline-class-member method D|_#new#tearOff(dynamic o) → self::D /* = core::Object */
static inline-class-member method D|_#new#tearOff(core::Object o) → self::D /* = core::Object */
return self::D|(o);
static inline-class-member method E|(dynamic it) → self::E /* = self::B */ {
static inline-class-member method E|(self::B it) → self::E /* = self::B */ {
lowered final self::E /* = self::B */ #this = it;
return #this;
}
static inline-class-member method E|_#new#tearOff(dynamic it) → self::E /* = self::B */
static inline-class-member method E|_#new#tearOff(self::B it) → self::E /* = self::B */
return self::E|(it);
static inline-class-member method F|(dynamic it) → self::F /* = self::B */ {
static inline-class-member method F|(self::B it) → self::F /* = self::B */ {
lowered final self::F /* = self::B */ #this = it;
return #this;
}
static inline-class-member method F|_#new#tearOff(dynamic it) → self::F /* = self::B */
static inline-class-member method F|_#new#tearOff(self::B it) → self::F /* = self::B */
return self::F|(it);
static inline-class-member method G|<T extends core::Object? = dynamic>(dynamic o) → self::G<self::G|::T%> /* = self::G|::T% */ {
static inline-class-member method G|<T extends core::Object? = dynamic>(self::G|::T% o) → self::G<self::G|::T%> /* = self::G|::T% */ {
lowered final self::G<self::G|::T%> /* = self::G|::T% */ #this = o;
return #this;
}
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% */
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% */
return self::G|<self::G|_#new#tearOff::T%>(o);
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 {
o = o;
Expand Down
Loading

0 comments on commit c867de3

Please sign in to comment.