Skip to content

Commit 52857b0

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Update computeDefaultTypes
This adds missing functionality to computeDefaultTypes for getters and setters. Change-Id: Ib7a92c34c76e84ad41d5c054823cd4f430fb1e4a Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/400100 Reviewed-by: Chloe Stefantsova <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent 8a28378 commit 52857b0

11 files changed

+541
-56
lines changed

pkg/front_end/lib/src/fragment/getter.dart

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -171,20 +171,8 @@ class GetterFragment implements Fragment, FunctionFragment {
171171
_encoding.becomeNative(loader);
172172
}
173173

174-
int computeDefaultTypes(ComputeDefaultTypeContext context,
175-
{required bool inErrorRecovery}) {
176-
bool hasErrors =
177-
context.reportSimplicityIssuesForTypeParameters(declaredTypeParameters);
178-
context.reportGenericFunctionTypesForFormals(declaredFormals);
179-
if (returnType is! OmittedTypeBuilder) {
180-
hasErrors |= context.reportInboundReferenceIssuesForType(returnType);
181-
context.recursivelyReportGenericFunctionTypesAsBoundsForType(returnType);
182-
}
183-
int count = context.computeDefaultTypesForVariables(declaredTypeParameters,
184-
inErrorRecovery: hasErrors);
185-
count += _encoding.computeDefaultTypes(context,
186-
inErrorRecovery: inErrorRecovery);
187-
return count;
174+
int computeDefaultTypes(ComputeDefaultTypeContext context) {
175+
return _encoding.computeDefaultTypes(context);
188176
}
189177

190178
void ensureTypes(
@@ -298,8 +286,7 @@ sealed class _GetterEncoding implements InferredTypeListener {
298286

299287
LocalScope createFormalParameterScope(LookupScope typeParameterScope);
300288

301-
int computeDefaultTypes(ComputeDefaultTypeContext context,
302-
{required bool inErrorRecovery});
289+
int computeDefaultTypes(ComputeDefaultTypeContext context);
303290

304291
void ensureTypes(
305292
SourceLibraryBuilder libraryBuilder, ClassHierarchyBase hierarchy);
@@ -414,16 +401,26 @@ mixin _DirectGetterEncodingMixin implements _GetterEncoding {
414401
}
415402

416403
@override
417-
int computeDefaultTypes(ComputeDefaultTypeContext context,
418-
{required bool inErrorRecovery}) {
419-
return 0;
404+
int computeDefaultTypes(ComputeDefaultTypeContext context) {
405+
bool hasErrors = context.reportSimplicityIssuesForTypeParameters(
406+
_fragment.declaredTypeParameters);
407+
context.reportGenericFunctionTypesForFormals(_fragment.declaredFormals);
408+
if (_fragment.returnType is! OmittedTypeBuilder) {
409+
hasErrors |=
410+
context.reportInboundReferenceIssuesForType(_fragment.returnType);
411+
context.recursivelyReportGenericFunctionTypesAsBoundsForType(
412+
_fragment.returnType);
413+
}
414+
return context.computeDefaultTypesForVariables(
415+
_fragment.declaredTypeParameters,
416+
inErrorRecovery: hasErrors);
420417
}
421418

422419
@override
423420
void ensureTypes(
424421
SourceLibraryBuilder libraryBuilder, ClassHierarchyBase hierarchy) {
425422
_fragment.returnType
426-
.build(libraryBuilder, TypeUse.fieldType, hierarchy: hierarchy);
423+
.build(libraryBuilder, TypeUse.returnType, hierarchy: hierarchy);
427424
}
428425

429426
@override
@@ -665,11 +662,23 @@ mixin _ExtensionInstanceGetterEncodingMixin implements _GetterEncoding {
665662
}
666663

667664
@override
668-
int computeDefaultTypes(ComputeDefaultTypeContext context,
669-
{required bool inErrorRecovery}) {
670-
return context.computeDefaultTypesForVariables(
665+
int computeDefaultTypes(ComputeDefaultTypeContext context) {
666+
bool hasErrors = context.reportSimplicityIssuesForTypeParameters(
667+
_fragment.declaredTypeParameters);
668+
context.reportGenericFunctionTypesForFormals(_fragment.declaredFormals);
669+
if (_fragment.returnType is! OmittedTypeBuilder) {
670+
hasErrors |=
671+
context.reportInboundReferenceIssuesForType(_fragment.returnType);
672+
context.recursivelyReportGenericFunctionTypesAsBoundsForType(
673+
_fragment.returnType);
674+
}
675+
int count = context.computeDefaultTypesForVariables(
676+
_fragment.declaredTypeParameters,
677+
inErrorRecovery: hasErrors);
678+
count += context.computeDefaultTypesForVariables(
671679
_clonedDeclarationTypeParameters,
672-
inErrorRecovery: inErrorRecovery);
680+
inErrorRecovery: hasErrors);
681+
return count;
673682
}
674683

675684
BuiltMemberKind get _builtMemberKind;

pkg/front_end/lib/src/fragment/setter.dart

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -181,20 +181,8 @@ class SetterFragment implements Fragment, FunctionFragment {
181181
_encoding.checkVariance(sourceClassBuilder, typeEnvironment);
182182
}
183183

184-
int computeDefaultTypes(ComputeDefaultTypeContext context,
185-
{required bool inErrorRecovery}) {
186-
bool hasErrors =
187-
context.reportSimplicityIssuesForTypeParameters(declaredTypeParameters);
188-
context.reportGenericFunctionTypesForFormals(declaredFormals);
189-
if (returnType is! OmittedTypeBuilder) {
190-
hasErrors |= context.reportInboundReferenceIssuesForType(returnType);
191-
context.recursivelyReportGenericFunctionTypesAsBoundsForType(returnType);
192-
}
193-
int count = context.computeDefaultTypesForVariables(declaredTypeParameters,
194-
inErrorRecovery: hasErrors);
195-
count += _encoding.computeDefaultTypes(context,
196-
inErrorRecovery: inErrorRecovery);
197-
return count;
184+
int computeDefaultTypes(ComputeDefaultTypeContext context) {
185+
return _encoding.computeDefaultTypes(context);
198186
}
199187

200188
Procedure get writeTarget => _encoding.writeTarget;
@@ -295,8 +283,7 @@ sealed class _SetterEncoding {
295283

296284
LocalScope createFormalParameterScope(LookupScope typeParameterScope);
297285

298-
int computeDefaultTypes(ComputeDefaultTypeContext context,
299-
{required bool inErrorRecovery});
286+
int computeDefaultTypes(ComputeDefaultTypeContext context);
300287

301288
void ensureTypes(
302289
SourceLibraryBuilder libraryBuilder, ClassHierarchyBase hierarchy);
@@ -472,16 +459,26 @@ mixin _DirectSetterEncodingMixin implements _SetterEncoding {
472459
}
473460

474461
@override
475-
int computeDefaultTypes(ComputeDefaultTypeContext context,
476-
{required bool inErrorRecovery}) {
477-
return 0;
462+
int computeDefaultTypes(ComputeDefaultTypeContext context) {
463+
bool hasErrors = context.reportSimplicityIssuesForTypeParameters(
464+
_fragment.declaredTypeParameters);
465+
context.reportGenericFunctionTypesForFormals(_fragment.declaredFormals);
466+
if (_fragment.returnType is! OmittedTypeBuilder) {
467+
hasErrors |=
468+
context.reportInboundReferenceIssuesForType(_fragment.returnType);
469+
context.recursivelyReportGenericFunctionTypesAsBoundsForType(
470+
_fragment.returnType);
471+
}
472+
return context.computeDefaultTypesForVariables(
473+
_fragment.declaredTypeParameters,
474+
inErrorRecovery: hasErrors);
478475
}
479476

480477
@override
481478
void ensureTypes(
482479
SourceLibraryBuilder libraryBuilder, ClassHierarchyBase hierarchy) {
483480
_fragment.returnType
484-
.build(libraryBuilder, TypeUse.fieldType, hierarchy: hierarchy);
481+
.build(libraryBuilder, TypeUse.returnType, hierarchy: hierarchy);
485482
List<FormalParameterBuilder>? declaredFormals = _fragment.declaredFormals;
486483
if (declaredFormals != null) {
487484
for (FormalParameterBuilder formal in declaredFormals) {
@@ -738,11 +735,23 @@ mixin _ExtensionInstanceSetterEncodingMixin implements _SetterEncoding {
738735
}
739736

740737
@override
741-
int computeDefaultTypes(ComputeDefaultTypeContext context,
742-
{required bool inErrorRecovery}) {
743-
return context.computeDefaultTypesForVariables(
738+
int computeDefaultTypes(ComputeDefaultTypeContext context) {
739+
bool hasErrors = context.reportSimplicityIssuesForTypeParameters(
740+
_fragment.declaredTypeParameters);
741+
context.reportGenericFunctionTypesForFormals(_fragment.declaredFormals);
742+
if (_fragment.returnType is! OmittedTypeBuilder) {
743+
hasErrors |=
744+
context.reportInboundReferenceIssuesForType(_fragment.returnType);
745+
context.recursivelyReportGenericFunctionTypesAsBoundsForType(
746+
_fragment.returnType);
747+
}
748+
int count = context.computeDefaultTypesForVariables(
749+
_fragment.declaredTypeParameters,
750+
inErrorRecovery: hasErrors);
751+
count += context.computeDefaultTypesForVariables(
744752
_clonedDeclarationTypeParameters,
745-
inErrorRecovery: inErrorRecovery);
753+
inErrorRecovery: hasErrors);
754+
return count;
746755
}
747756

748757
@override

pkg/front_end/lib/src/source/source_property_builder.dart

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -474,12 +474,10 @@ class SourcePropertyBuilder extends SourceMemberBuilderImpl {
474474
{required bool inErrorRecovery}) {
475475
int count = 0;
476476
if (_introductoryGetable != null) {
477-
count += _introductoryGetable!
478-
.computeDefaultTypes(context, inErrorRecovery: inErrorRecovery);
477+
count += _introductoryGetable!.computeDefaultTypes(context);
479478
}
480479
if (_introductorySetable != null) {
481-
count += _introductorySetable!
482-
.computeDefaultTypes(context, inErrorRecovery: inErrorRecovery);
480+
count += _introductorySetable!.computeDefaultTypes(context);
483481
}
484482
return count;
485483
}
@@ -855,7 +853,7 @@ class _SetterClassMember implements ClassMember {
855853
@override
856854
// Coverage-ignore(suite): Not run.
857855
bool isSameDeclaration(ClassMember other) {
858-
return other is _GetterClassMember && _builder == other._builder;
856+
return other is _SetterClassMember && _builder == other._builder;
859857
}
860858

861859
@override

pkg/front_end/test/coverage_suite_expected.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
290290
),
291291
// 100.0%.
292292
"package:front_end/src/builder/formal_parameter_builder.dart": (
293-
hitCount: 169,
293+
hitCount: 170,
294294
missCount: 0,
295295
),
296296
// 100.0%.
@@ -510,7 +510,7 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
510510
),
511511
// 100.0%.
512512
"package:front_end/src/fragment/getter.dart": (
513-
hitCount: 501,
513+
hitCount: 526,
514514
missCount: 0,
515515
),
516516
// 100.0%.
@@ -535,7 +535,7 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
535535
),
536536
// 100.0%.
537537
"package:front_end/src/fragment/setter.dart": (
538-
hitCount: 521,
538+
hitCount: 546,
539539
missCount: 0,
540540
),
541541
// 100.0%.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
class G<T extends G<T>> {}
6+
7+
class C {
8+
void Function<T extends G>() get getter2 => throw '';
9+
void set setter2(void Function<T extends G>() _) {}
10+
}
11+
12+
extension E<T extends G<T>> on T {
13+
T get getter1 => throw '';
14+
void set setter1(T t) {}
15+
void Function<T extends G>() get getter2 => throw '';
16+
void set setter2(void Function<T extends G>() _) {}
17+
}
18+
19+
extension type ET<T extends G<T>>(T it) {
20+
T get getter1 => throw '';
21+
void set setter1(T t) {}
22+
void Function<T extends G>() get getter2 => throw '';
23+
void set setter2(void Function<T extends G>() _) {}
24+
}
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
library;
2+
//
3+
// Problems in library:
4+
//
5+
// pkg/front_end/testcases/general/getter_setter_types.dart:8:17: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
6+
// Try providing type arguments to 'G' here.
7+
// void Function<T extends G>() get getter2 => throw '';
8+
// ^
9+
// pkg/front_end/testcases/general/getter_setter_types.dart:5:9: Context: Bound of this variable references variable 'T' from the same declaration.
10+
// class G<T extends G<T>> {}
11+
// ^
12+
//
13+
// pkg/front_end/testcases/general/getter_setter_types.dart:9:34: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
14+
// Try providing type arguments to 'G' here.
15+
// void set setter2(void Function<T extends G>() _) {}
16+
// ^
17+
// pkg/front_end/testcases/general/getter_setter_types.dart:5:9: Context: Bound of this variable references variable 'T' from the same declaration.
18+
// class G<T extends G<T>> {}
19+
// ^
20+
//
21+
// pkg/front_end/testcases/general/getter_setter_types.dart:15:17: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
22+
// Try providing type arguments to 'G' here.
23+
// void Function<T extends G>() get getter2 => throw '';
24+
// ^
25+
// pkg/front_end/testcases/general/getter_setter_types.dart:5:9: Context: Bound of this variable references variable 'T' from the same declaration.
26+
// class G<T extends G<T>> {}
27+
// ^
28+
//
29+
// pkg/front_end/testcases/general/getter_setter_types.dart:16:34: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
30+
// Try providing type arguments to 'G' here.
31+
// void set setter2(void Function<T extends G>() _) {}
32+
// ^
33+
// pkg/front_end/testcases/general/getter_setter_types.dart:5:9: Context: Bound of this variable references variable 'T' from the same declaration.
34+
// class G<T extends G<T>> {}
35+
// ^
36+
//
37+
// pkg/front_end/testcases/general/getter_setter_types.dart:22:17: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
38+
// Try providing type arguments to 'G' here.
39+
// void Function<T extends G>() get getter2 => throw '';
40+
// ^
41+
// pkg/front_end/testcases/general/getter_setter_types.dart:5:9: Context: Bound of this variable references variable 'T' from the same declaration.
42+
// class G<T extends G<T>> {}
43+
// ^
44+
//
45+
// pkg/front_end/testcases/general/getter_setter_types.dart:23:34: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
46+
// Try providing type arguments to 'G' here.
47+
// void set setter2(void Function<T extends G>() _) {}
48+
// ^
49+
// pkg/front_end/testcases/general/getter_setter_types.dart:5:9: Context: Bound of this variable references variable 'T' from the same declaration.
50+
// class G<T extends G<T>> {}
51+
// ^
52+
//
53+
import self as self;
54+
import "dart:core" as core;
55+
56+
class G<T extends self::G<self::G::T> = self::G<dynamic>> extends core::Object {
57+
synthetic constructor •() → self::G<self::G::T>
58+
: super core::Object::•()
59+
;
60+
}
61+
class C extends core::Object {
62+
synthetic constructor •() → self::C
63+
: super core::Object::•()
64+
;
65+
get getter2() → <T extends self::G<self::G<dynamic>> = dynamic>() → void
66+
return throw "";
67+
set setter2(wildcard <T extends self::G<self::G<dynamic>> = dynamic>() → void _#wc0#formal) → void {}
68+
}
69+
extension E<T extends self::G<T> = self::G<dynamic>> on T {
70+
get getter1 = self::E|get#getter1;
71+
get getter2 = self::E|get#getter2;
72+
set setter1 = self::E|set#setter1;
73+
set setter2 = self::E|set#setter2;
74+
}
75+
extension type ET<T extends self::G<T> = self::G<dynamic>>(T it) {
76+
abstract extension-type-member representation-field get it() → T;
77+
get getter1 = self::ET|get#getter1;
78+
get getter2 = self::ET|get#getter2;
79+
set setter1 = self::ET|set#setter1;
80+
set setter2 = self::ET|set#setter2;
81+
constructor • = self::ET|constructor#;
82+
constructor tearoff • = self::ET|constructor#_#new#tearOff;
83+
}
84+
static extension-member method E|get#getter1<T extends self::G<self::E|get#getter1::T> = self::G<dynamic>>(lowered final self::E|get#getter1::T #this) → self::E|get#getter1::T
85+
return throw "";
86+
static extension-member method E|set#setter1<T extends self::G<self::E|set#setter1::T> = self::G<dynamic>>(lowered final self::E|set#setter1::T #this, self::E|set#setter1::T t) → void {}
87+
static extension-member method E|get#getter2<T extends self::G<self::E|get#getter2::T> = dynamic>(lowered final self::E|get#getter2::T #this) → <T extends self::G<self::G<dynamic>> = dynamic>() → void
88+
return throw "";
89+
static extension-member method E|set#setter2<T extends self::G<self::E|set#setter2::T> = self::G<dynamic>>(lowered final self::E|set#setter2::T #this, wildcard <T extends self::G<self::G<dynamic>> = dynamic>() → void _#wc1#formal) → void {}
90+
static extension-type-member method ET|constructor#<T extends self::G<self::ET|constructor#::T> = self::G<dynamic>>(self::ET|constructor#::T it) → self::ET<self::ET|constructor#::T>% /* erasure=self::ET|constructor#::T, declared=! */ {
91+
lowered final self::ET<self::ET|constructor#::T>% /* erasure=self::ET|constructor#::T, declared=! */ #this = it;
92+
return #this;
93+
}
94+
static extension-type-member method ET|constructor#_#new#tearOff<T extends self::G<self::ET|constructor#_#new#tearOff::T> = self::G<dynamic>>(self::ET|constructor#_#new#tearOff::T it) → self::ET<self::ET|constructor#_#new#tearOff::T>% /* erasure=self::ET|constructor#_#new#tearOff::T, declared=! */
95+
return self::ET|constructor#<self::ET|constructor#_#new#tearOff::T>(it);
96+
static extension-type-member method ET|get#getter1<T extends self::G<self::ET|get#getter1::T> = self::G<dynamic>>(lowered final self::ET<self::ET|get#getter1::T>% /* erasure=self::ET|get#getter1::T, declared=! */ #this) → self::ET|get#getter1::T
97+
return throw "";
98+
static extension-type-member method ET|set#setter1<T extends self::G<self::ET|set#setter1::T> = self::G<dynamic>>(lowered final self::ET<self::ET|set#setter1::T>% /* erasure=self::ET|set#setter1::T, declared=! */ #this, self::ET|set#setter1::T t) → void {}
99+
static extension-type-member method ET|get#getter2<T extends self::G<self::ET|get#getter2::T> = dynamic>(lowered final self::ET<self::ET|get#getter2::T>% /* erasure=self::ET|get#getter2::T, declared=! */ #this) → <T extends self::G<self::G<dynamic>> = dynamic>() → void
100+
return throw "";
101+
static extension-type-member method ET|set#setter2<T extends self::G<self::ET|set#setter2::T> = self::G<dynamic>>(lowered final self::ET<self::ET|set#setter2::T>% /* erasure=self::ET|set#setter2::T, declared=! */ #this, wildcard <T extends self::G<self::G<dynamic>> = dynamic>() → void _#wc2#formal) → void {}

0 commit comments

Comments
 (0)