Skip to content

Commit 8b01baa

Browse files
chloestefantsovaCommit Queue
authored and
Commit Queue
committed
[cfe] Perform checks on factories of extension type declarations
Closes #53209 Closes #53140 Part of #49731 Change-Id: Ia94b1e85d6775efc23bf732441fa66d4de1de515 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/332403 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Chloe Stefantsova <[email protected]>
1 parent dd3705d commit 8b01baa

33 files changed

+1228
-69
lines changed

pkg/front_end/lib/src/fasta/kernel/kernel_target.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,8 @@ class KernelTarget extends TargetImplementation {
530530

531531
benchmarker
532532
?.enterPhase(BenchmarkPhases.outline_checkRedirectingFactories);
533-
loader.checkRedirectingFactories(sortedSourceClassBuilders);
533+
loader.checkRedirectingFactories(
534+
sortedSourceClassBuilders, sortedSourceExtensionTypeBuilders);
534535

535536
benchmarker
536537
?.enterPhase(BenchmarkPhases.outline_finishSynthesizedParameters);

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import '../util/helpers.dart';
3232
import 'class_declaration.dart';
3333
import 'source_builder_mixins.dart';
3434
import 'source_constructor_builder.dart';
35+
import 'source_factory_builder.dart';
3536
import 'source_field_builder.dart';
3637
import 'source_library_builder.dart';
3738
import 'source_member_builder.dart';
@@ -484,6 +485,15 @@ class SourceExtensionTypeDeclarationBuilder
484485
}
485486
}
486487

488+
void checkRedirectingFactories(TypeEnvironment typeEnvironment) {
489+
Iterator<SourceFactoryBuilder> iterator =
490+
constructorScope.filteredIterator<SourceFactoryBuilder>(
491+
parent: this, includeDuplicates: true, includeAugmentations: true);
492+
while (iterator.moveNext()) {
493+
iterator.current.checkRedirectingFactories(typeEnvironment);
494+
}
495+
}
496+
487497
@override
488498
void buildOutlineExpressions(
489499
ClassHierarchy classHierarchy,

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,8 @@ class RedirectingFactoryBuilder extends SourceFactoryBuilder {
336336

337337
FreshTypeParameters? _tearOffTypeParameters;
338338

339+
bool _hasBeenCheckedAsRedirectingFactory = false;
340+
339341
RedirectingFactoryBuilder(
340342
List<MetadataBuilder>? metadata,
341343
int modifiers,
@@ -737,6 +739,9 @@ class RedirectingFactoryBuilder extends SourceFactoryBuilder {
737739

738740
@override
739741
void _checkRedirectingFactory(TypeEnvironment typeEnvironment) {
742+
if (_hasBeenCheckedAsRedirectingFactory) return;
743+
_hasBeenCheckedAsRedirectingFactory = true;
744+
740745
// Check that factory declaration is not cyclic.
741746
if (_isCyclicRedirectingFactory(this)) {
742747
libraryBuilder.addProblemForRedirectingFactory(
@@ -788,6 +793,16 @@ class RedirectingFactoryBuilder extends SourceFactoryBuilder {
788793
return;
789794
}
790795

796+
Builder? redirectionTargetBuilder = redirectionTarget.target;
797+
if (redirectionTargetBuilder is RedirectingFactoryBuilder) {
798+
redirectionTargetBuilder._checkRedirectingFactory(typeEnvironment);
799+
String? errorMessage = redirectionTargetBuilder
800+
.function.redirectingFactoryTarget?.errorMessage;
801+
if (errorMessage != null) {
802+
setRedirectingFactoryError(errorMessage);
803+
}
804+
}
805+
791806
// Redirection to generative enum constructors is forbidden and is reported
792807
// as an error elsewhere.
793808
if (!((classBuilder?.cls.isEnum ?? false) &&

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2774,14 +2774,24 @@ severity: $severity
27742774
.logMs("Updated ${changedClasses.length} classes in kernel hierarchy");
27752775
}
27762776

2777-
void checkRedirectingFactories(List<SourceClassBuilder> sourceClasses) {
2777+
void checkRedirectingFactories(
2778+
List<SourceClassBuilder> sourceClasses,
2779+
List<SourceExtensionTypeDeclarationBuilder>
2780+
sourceExtensionTypeDeclarationBuilders) {
27782781
// TODO(ahe): Move this to [ClassHierarchyBuilder].
27792782
for (SourceClassBuilder builder in sourceClasses) {
27802783
if (builder.libraryBuilder.loader == this && !builder.isPatch) {
27812784
builder.checkRedirectingFactories(
27822785
typeInferenceEngine.typeSchemaEnvironment);
27832786
}
27842787
}
2788+
for (SourceExtensionTypeDeclarationBuilder builder
2789+
in sourceExtensionTypeDeclarationBuilders) {
2790+
if (builder.libraryBuilder.loader == this && !builder.isPatch) {
2791+
builder.checkRedirectingFactories(
2792+
typeInferenceEngine.typeSchemaEnvironment);
2793+
}
2794+
}
27852795
ticker.logMs("Checked redirecting factories");
27862796
}
27872797

pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ class TypeInferrerImpl implements TypeInferrer {
248248
staticTarget: target);
249249
visitor.checkCleanState();
250250
DartType resultType = result.inferredType;
251-
if (resultType is InterfaceType) {
251+
if (resultType is TypeDeclarationType) {
252252
return resultType.typeArguments;
253253
} else {
254254
return null;

pkg/front_end/test/spell_checking_list_tests.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,7 @@ gave
339339
gc
340340
gcd
341341
gclient
342+
ge
342343
gesture
343344
gi
344345
gm

pkg/front_end/testcases/dart2js/issue47916e.dart.strong.expect

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,14 @@ import self as self;
1010
import "dart:core" as core;
1111

1212
abstract class A extends core::Object {
13-
static factory •() → self::A /* redirection-target: self::B::• */
14-
return self::B::•();
15-
static method _#new#tearOff() → self::A;
13+
static factory •() → self::A
14+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916e.dart:10:23: Error: Redirection constructor target not found: 'C.named'
15+
const factory B() = C.named;
16+
^";
17+
static method _#new#tearOff() → self::A
18+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916e.dart:10:23: Error: Redirection constructor target not found: 'C.named'
19+
const factory B() = C.named;
20+
^";
1621
}
1722
abstract class B extends core::Object implements self::A {
1823
static factory •() → self::B

pkg/front_end/testcases/dart2js/issue47916e.dart.strong.transformed.expect

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,14 @@ import self as self;
1010
import "dart:core" as core;
1111

1212
abstract class A extends core::Object {
13-
static factory •() → self::A /* redirection-target: self::B::• */
14-
return self::B::•();
15-
static method _#new#tearOff() → self::A;
13+
static factory •() → self::A
14+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916e.dart:10:23: Error: Redirection constructor target not found: 'C.named'
15+
const factory B() = C.named;
16+
^";
17+
static method _#new#tearOff() → self::A
18+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916e.dart:10:23: Error: Redirection constructor target not found: 'C.named'
19+
const factory B() = C.named;
20+
^";
1621
}
1722
abstract class B extends core::Object implements self::A {
1823
static factory •() → self::B

pkg/front_end/testcases/dart2js/issue47916e.dart.weak.expect

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,14 @@ import self as self;
1010
import "dart:core" as core;
1111

1212
abstract class A extends core::Object {
13-
static factory •() → self::A /* redirection-target: self::B::• */
14-
return self::B::•();
15-
static method _#new#tearOff() → self::A;
13+
static factory •() → self::A
14+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916e.dart:10:23: Error: Redirection constructor target not found: 'C.named'
15+
const factory B() = C.named;
16+
^";
17+
static method _#new#tearOff() → self::A
18+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916e.dart:10:23: Error: Redirection constructor target not found: 'C.named'
19+
const factory B() = C.named;
20+
^";
1621
}
1722
abstract class B extends core::Object implements self::A {
1823
static factory •() → self::B

pkg/front_end/testcases/dart2js/issue47916e.dart.weak.modular.expect

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,14 @@ import self as self;
1010
import "dart:core" as core;
1111

1212
abstract class A extends core::Object {
13-
static factory •() → self::A /* redirection-target: self::B::• */
14-
return self::B::•();
15-
static method _#new#tearOff() → self::A;
13+
static factory •() → self::A
14+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916e.dart:10:23: Error: Redirection constructor target not found: 'C.named'
15+
const factory B() = C.named;
16+
^";
17+
static method _#new#tearOff() → self::A
18+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916e.dart:10:23: Error: Redirection constructor target not found: 'C.named'
19+
const factory B() = C.named;
20+
^";
1621
}
1722
abstract class B extends core::Object implements self::A {
1823
static factory •() → self::B

pkg/front_end/testcases/dart2js/issue47916e.dart.weak.outline.expect

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,14 @@ import self as self;
1010
import "dart:core" as core;
1111

1212
abstract class A extends core::Object {
13-
static factory •() → self::A /* redirection-target: self::B::• */
14-
return self::B::•();
15-
static method _#new#tearOff() → self::A;
13+
static factory •() → self::A
14+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916e.dart:10:23: Error: Redirection constructor target not found: 'C.named'
15+
const factory B() = C.named;
16+
^";
17+
static method _#new#tearOff() → self::A
18+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916e.dart:10:23: Error: Redirection constructor target not found: 'C.named'
19+
const factory B() = C.named;
20+
^";
1621
}
1722
abstract class B extends core::Object implements self::A {
1823
static factory •() → self::B

pkg/front_end/testcases/dart2js/issue47916e.dart.weak.transformed.expect

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,14 @@ import self as self;
1010
import "dart:core" as core;
1111

1212
abstract class A extends core::Object {
13-
static factory •() → self::A /* redirection-target: self::B::• */
14-
return self::B::•();
15-
static method _#new#tearOff() → self::A;
13+
static factory •() → self::A
14+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916e.dart:10:23: Error: Redirection constructor target not found: 'C.named'
15+
const factory B() = C.named;
16+
^";
17+
static method _#new#tearOff() → self::A
18+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916e.dart:10:23: Error: Redirection constructor target not found: 'C.named'
19+
const factory B() = C.named;
20+
^";
1621
}
1722
abstract class B extends core::Object implements self::A {
1823
static factory •() → self::B

pkg/front_end/testcases/dart2js/issue47916f.dart.strong.expect

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,14 @@ import self as self;
1414
import "dart:core" as core;
1515

1616
abstract class A<T extends core::Object? = dynamic> extends core::Object {
17-
static factory •<T extends core::Object? = dynamic>() → self::A<self::A::•::T%> /* redirection-target: self::B::•<self::A::•::T%>*/
18-
return self::B::•<self::A::•::T%>();
19-
static method _#new#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#new#tearOff::T%>;
17+
static factory •<T extends core::Object? = dynamic>() → self::A<self::A::•::T%>
18+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916f.dart:10:17: Error: Cyclic definition of factory 'B'.
19+
const factory B() = C;
20+
^";
21+
static method _#new#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#new#tearOff::T%>
22+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916f.dart:10:17: Error: Cyclic definition of factory 'B'.
23+
const factory B() = C;
24+
^";
2025
}
2126
abstract class B<T extends core::Object? = dynamic> extends core::Object implements self::A<self::B::T%> {
2227
static factory •<T extends core::Object? = dynamic>() → self::B<self::B::•::T%>

pkg/front_end/testcases/dart2js/issue47916f.dart.strong.transformed.expect

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,14 @@ import self as self;
1414
import "dart:core" as core;
1515

1616
abstract class A<T extends core::Object? = dynamic> extends core::Object {
17-
static factory •<T extends core::Object? = dynamic>() → self::A<self::A::•::T%> /* redirection-target: self::B::•<self::A::•::T%>*/
18-
return self::B::•<self::A::•::T%>();
19-
static method _#new#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#new#tearOff::T%>;
17+
static factory •<T extends core::Object? = dynamic>() → self::A<self::A::•::T%>
18+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916f.dart:10:17: Error: Cyclic definition of factory 'B'.
19+
const factory B() = C;
20+
^";
21+
static method _#new#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#new#tearOff::T%>
22+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916f.dart:10:17: Error: Cyclic definition of factory 'B'.
23+
const factory B() = C;
24+
^";
2025
}
2126
abstract class B<T extends core::Object? = dynamic> extends core::Object implements self::A<self::B::T%> {
2227
static factory •<T extends core::Object? = dynamic>() → self::B<self::B::•::T%>

pkg/front_end/testcases/dart2js/issue47916f.dart.weak.expect

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,14 @@ import self as self;
1414
import "dart:core" as core;
1515

1616
abstract class A<T extends core::Object? = dynamic> extends core::Object {
17-
static factory •<T extends core::Object? = dynamic>() → self::A<self::A::•::T%> /* redirection-target: self::B::•<self::A::•::T%>*/
18-
return self::B::•<self::A::•::T%>();
19-
static method _#new#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#new#tearOff::T%>;
17+
static factory •<T extends core::Object? = dynamic>() → self::A<self::A::•::T%>
18+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916f.dart:10:17: Error: Cyclic definition of factory 'B'.
19+
const factory B() = C;
20+
^";
21+
static method _#new#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#new#tearOff::T%>
22+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916f.dart:10:17: Error: Cyclic definition of factory 'B'.
23+
const factory B() = C;
24+
^";
2025
}
2126
abstract class B<T extends core::Object? = dynamic> extends core::Object implements self::A<self::B::T%> {
2227
static factory •<T extends core::Object? = dynamic>() → self::B<self::B::•::T%>

pkg/front_end/testcases/dart2js/issue47916f.dart.weak.modular.expect

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,14 @@ import self as self;
1414
import "dart:core" as core;
1515

1616
abstract class A<T extends core::Object? = dynamic> extends core::Object {
17-
static factory •<T extends core::Object? = dynamic>() → self::A<self::A::•::T%> /* redirection-target: self::B::•<self::A::•::T%>*/
18-
return self::B::•<self::A::•::T%>();
19-
static method _#new#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#new#tearOff::T%>;
17+
static factory •<T extends core::Object? = dynamic>() → self::A<self::A::•::T%>
18+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916f.dart:10:17: Error: Cyclic definition of factory 'B'.
19+
const factory B() = C;
20+
^";
21+
static method _#new#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#new#tearOff::T%>
22+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916f.dart:10:17: Error: Cyclic definition of factory 'B'.
23+
const factory B() = C;
24+
^";
2025
}
2126
abstract class B<T extends core::Object? = dynamic> extends core::Object implements self::A<self::B::T%> {
2227
static factory •<T extends core::Object? = dynamic>() → self::B<self::B::•::T%>

pkg/front_end/testcases/dart2js/issue47916f.dart.weak.outline.expect

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,14 @@ import self as self;
1414
import "dart:core" as core;
1515

1616
abstract class A<T extends core::Object? = dynamic> extends core::Object {
17-
static factory •<T extends core::Object? = dynamic>() → self::A<self::A::•::T%> /* redirection-target: self::B::•<self::A::•::T%>*/
18-
return self::B::•<self::A::•::T%>();
19-
static method _#new#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#new#tearOff::T%>;
17+
static factory •<T extends core::Object? = dynamic>() → self::A<self::A::•::T%>
18+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916f.dart:10:17: Error: Cyclic definition of factory 'B'.
19+
const factory B() = C;
20+
^";
21+
static method _#new#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#new#tearOff::T%>
22+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916f.dart:10:17: Error: Cyclic definition of factory 'B'.
23+
const factory B() = C;
24+
^";
2025
}
2126
abstract class B<T extends core::Object? = dynamic> extends core::Object implements self::A<self::B::T%> {
2227
static factory •<T extends core::Object? = dynamic>() → self::B<self::B::•::T%>

pkg/front_end/testcases/dart2js/issue47916f.dart.weak.transformed.expect

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,14 @@ import self as self;
1414
import "dart:core" as core;
1515

1616
abstract class A<T extends core::Object? = dynamic> extends core::Object {
17-
static factory •<T extends core::Object? = dynamic>() → self::A<self::A::•::T%> /* redirection-target: self::B::•<self::A::•::T%>*/
18-
return self::B::•<self::A::•::T%>();
19-
static method _#new#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#new#tearOff::T%>;
17+
static factory •<T extends core::Object? = dynamic>() → self::A<self::A::•::T%>
18+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916f.dart:10:17: Error: Cyclic definition of factory 'B'.
19+
const factory B() = C;
20+
^";
21+
static method _#new#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#new#tearOff::T%>
22+
return invalid-expression "pkg/front_end/testcases/dart2js/issue47916f.dart:10:17: Error: Cyclic definition of factory 'B'.
23+
const factory B() = C;
24+
^";
2025
}
2126
abstract class B<T extends core::Object? = dynamic> extends core::Object implements self::A<self::B::T%> {
2227
static factory •<T extends core::Object? = dynamic>() → self::B<self::B::•::T%>

pkg/front_end/testcases/extension_types/generic_factory.dart.strong.expect

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ static inline-class-member method ET3|constructor#c1<T extends core::num>() →
2424
}
2525
static inline-class-member method ET3|constructor#_#c1#tearOff<T extends core::num>() → self::ET3<self::ET3|constructor#_#c1#tearOff::T> /* = core::int */
2626
return self::ET3|constructor#c1<self::ET3|constructor#_#c1#tearOff::T>();
27-
static inline-class-member method ET3|constructor#f1<T extends core::num>() → self::ET3<self::ET3|constructor#f1::T> /* = core::int */ /* redirection-target: self::ET3|constructor#c1<dynamic>*/
28-
return self::ET3|constructor#c1<dynamic>();
27+
static inline-class-member method ET3|constructor#f1<T extends core::num>() → self::ET3<self::ET3|constructor#f1::T> /* = core::int */ /* redirection-target: self::ET3|constructor#c1<self::ET3|constructor#f1::T>*/
28+
return self::ET3|constructor#c1<self::ET3|constructor#f1::T>();
2929
static inline-class-member method ET3|constructor#_#f1#tearOff<T extends core::num>() → self::ET3<self::ET3|constructor#_#f1#tearOff::T> /* = core::int */
30-
return self::ET3|constructor#c1<dynamic>();
30+
return self::ET3|constructor#c1<self::ET3|constructor#_#f1#tearOff::T>();

pkg/front_end/testcases/extension_types/generic_factory.dart.strong.transformed.expect

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,7 @@ static inline-class-member method ET3|constructor#c1<T extends core::num>() →
2424
}
2525
static inline-class-member method ET3|constructor#_#c1#tearOff<T extends core::num>() → self::ET3<self::ET3|constructor#_#c1#tearOff::T> /* = core::int */
2626
return self::ET3|constructor#c1<self::ET3|constructor#_#c1#tearOff::T>();
27-
static inline-class-member method ET3|constructor#f1<T extends core::num>() → self::ET3<self::ET3|constructor#f1::T> /* = core::int */ /* redirection-target: self::ET3|constructor#c1<dynamic>*/
28-
return self::ET3|constructor#c1<dynamic>();
27+
static inline-class-member method ET3|constructor#f1<T extends core::num>() → self::ET3<self::ET3|constructor#f1::T> /* = core::int */ /* redirection-target: self::ET3|constructor#c1<self::ET3|constructor#f1::T>*/
28+
return self::ET3|constructor#c1<self::ET3|constructor#f1::T>();
2929
static inline-class-member method ET3|constructor#_#f1#tearOff<T extends core::num>() → self::ET3<self::ET3|constructor#_#f1#tearOff::T> /* = core::int */
30-
return self::ET3|constructor#c1<dynamic>();
31-
32-
33-
Extra constant evaluation status:
34-
Evaluated: StaticInvocation @ org-dartlang-testcase:///generic_factory.dart:7:17 -> IntConstant(0)
35-
Evaluated: StaticInvocation @ org-dartlang-testcase:///generic_factory.dart:7:11 -> IntConstant(0)
36-
Extra constant evaluation: evaluated: 10, effectively constant: 2
30+
return self::ET3|constructor#c1<self::ET3|constructor#_#f1#tearOff::T>();

pkg/front_end/testcases/extension_types/generic_factory.dart.weak.expect

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ static inline-class-member method ET3|constructor#c1<T extends core::num>() →
2424
}
2525
static inline-class-member method ET3|constructor#_#c1#tearOff<T extends core::num>() → self::ET3<self::ET3|constructor#_#c1#tearOff::T> /* = core::int */
2626
return self::ET3|constructor#c1<self::ET3|constructor#_#c1#tearOff::T>();
27-
static inline-class-member method ET3|constructor#f1<T extends core::num>() → self::ET3<self::ET3|constructor#f1::T> /* = core::int */ /* redirection-target: self::ET3|constructor#c1<dynamic>*/
28-
return self::ET3|constructor#c1<dynamic>();
27+
static inline-class-member method ET3|constructor#f1<T extends core::num>() → self::ET3<self::ET3|constructor#f1::T> /* = core::int */ /* redirection-target: self::ET3|constructor#c1<self::ET3|constructor#f1::T>*/
28+
return self::ET3|constructor#c1<self::ET3|constructor#f1::T>();
2929
static inline-class-member method ET3|constructor#_#f1#tearOff<T extends core::num>() → self::ET3<self::ET3|constructor#_#f1#tearOff::T> /* = core::int */
30-
return self::ET3|constructor#c1<dynamic>();
30+
return self::ET3|constructor#c1<self::ET3|constructor#_#f1#tearOff::T>();

0 commit comments

Comments
 (0)