Skip to content

Commit 2ee7416

Browse files
stereotype441commit-bot@chromium.org
authored andcommitted
Add "why not promoted" support for explicit extension overrides.
Bug: #44898 Change-Id: Iea9300cf2cae52355bfa5a71f773c8136da2c644 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/195306 Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Paul Berry <[email protected]>
1 parent dd2b04e commit 2ee7416

File tree

5 files changed

+204
-161
lines changed

5 files changed

+204
-161
lines changed

pkg/_fe_analyzer_shared/test/flow_analysis/why_not_promoted/data/argument_type_not_assignable_nullability_error.dart

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,3 +473,19 @@ indexSetPostIncDec(C32 c, List<int> values) {
473473
/*analyzer.notPromoted(propertyNotPromoted(target: member:C32.bad, type: int?))*/ c
474474
. /*cfe.notPromoted(propertyNotPromoted(target: member:C32.bad, type: int?))*/ bad]--;
475475
}
476+
477+
extension E33 on int {
478+
void f() {}
479+
}
480+
481+
class C33 {
482+
int? bad;
483+
}
484+
485+
test(C33 c) {
486+
if (c.bad == null) return;
487+
E33(
488+
/*analyzer.notPromoted(propertyNotPromoted(target: member:C33.bad, type: int?))*/ c
489+
. /*cfe.notPromoted(propertyNotPromoted(target: member:C33.bad, type: int?))*/ bad)
490+
.f();
491+
}

pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis.dart';
56
import 'package:analyzer/dart/analysis/features.dart';
67
import 'package:analyzer/dart/ast/ast.dart';
78
import 'package:analyzer/dart/ast/syntactic_entity.dart';
@@ -119,7 +120,8 @@ class ExtensionMemberResolver {
119120
}
120121

121122
/// Perform upward inference for the override.
122-
void resolveOverride(ExtensionOverride node) {
123+
void resolveOverride(ExtensionOverride node,
124+
List<Map<DartType, NonPromotionReason> Function()> whyNotPromotedList) {
123125
var nodeImpl = node as ExtensionOverrideImpl;
124126
var element = node.staticElement!;
125127
var typeParameters = element.typeParameters;
@@ -173,10 +175,14 @@ class ExtensionMemberResolver {
173175
_errorReporter.reportErrorForNode(
174176
CompileTimeErrorCode.USE_OF_VOID_RESULT, receiverExpression);
175177
} else if (!_typeSystem.isAssignableTo(receiverType, node.extendedType!)) {
178+
var whyNotPromoted =
179+
whyNotPromotedList.isEmpty ? null : whyNotPromotedList[0];
176180
_errorReporter.reportErrorForNode(
177181
CompileTimeErrorCode.EXTENSION_OVERRIDE_ARGUMENT_NOT_ASSIGNABLE,
178182
receiverExpression,
179183
[receiverType, node.extendedType],
184+
_resolver.computeWhyNotPromotedMessages(
185+
receiverExpression, whyNotPromoted?.call()),
180186
);
181187
}
182188
}

pkg/analyzer/lib/src/generated/resolver.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1456,7 +1456,7 @@ class ResolverVisitor extends ScopedVisitor with ErrorDetectionHelpers {
14561456
whyNotPromotedList: whyNotPromotedList);
14571457

14581458
node.accept(elementResolver);
1459-
node.accept(typeAnalyzer);
1459+
extensionResolver.resolveOverride(node, whyNotPromotedList);
14601460
}
14611461

14621462
@override

pkg/analyzer/lib/src/generated/static_type_analyzer.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,8 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<void> {
128128

129129
@override
130130
void visitExtensionOverride(ExtensionOverride node) {
131-
_resolver.extensionResolver.resolveOverride(node);
131+
assert(false,
132+
'Resolver should call extensionResolver.resolveOverride directly');
132133
}
133134

134135
/// The Dart Language Specification, 12.9: <blockquote>The static type of a function literal of the

0 commit comments

Comments
 (0)