Skip to content

Commit d2f3470

Browse files
stereotype441Commit Queue
authored andcommitted
[analyzer] Use PromotableElementImpl2 to interface to shared analysis code.
Change the analyzer's use of shared classes and mixins to to supply `PromotableElementImpl2` instead of `PromotableElement2` as the type parameter that represents promotable variables. This is a follow-up to https://dart-review.googlesource.com/c/sdk/+/400660, which changed the code from supplying `PromotableElement` to `PromotableElement2`. That change was both larger and riskier than this one, since it changed the identity of the objects that were passed to shared analysis code. This change merely substitutes a more precise type for the type argument, without changing the underlying objects in use. This is part of a larger arc of work to change the analyzer's use of the shared code so that the type parameters it supplies are not part of the analyzer public API. See #59763. Change-Id: I2013dd0b7d38350ed7a9f2f4bd875d0006941754 Bug: #59763 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/401740 Commit-Queue: Paul Berry <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]>
1 parent a7fe1e6 commit d2f3470

12 files changed

+98
-69
lines changed

pkg/analyzer/lib/src/dart/ast/ast.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -821,7 +821,7 @@ final class AssignedVariablePatternImpl extends VariablePatternImpl
821821
@override
822822
DartType computePatternSchema(ResolverVisitor resolverVisitor) {
823823
var element = element2;
824-
if (element is PromotableElement2) {
824+
if (element is PromotableElementImpl2) {
825825
return resolverVisitor
826826
.analyzeAssignedVariablePatternSchema(element)
827827
.unwrapTypeSchemaView();
@@ -2583,7 +2583,7 @@ final class CatchClauseParameterImpl extends AstNodeImpl
25832583

25842584
@experimental
25852585
@override
2586-
LocalVariableElement2? get declaredElement2 {
2586+
LocalVariableElementImpl2? get declaredElement2 {
25872587
return declaredElement.asElement2 as LocalVariableElementImpl2?;
25882588
}
25892589

@@ -4892,7 +4892,7 @@ final class DeclaredIdentifierImpl extends DeclarationImpl
48924892

48934893
@experimental
48944894
@override
4895-
LocalVariableElement2? get declaredElement2 {
4895+
LocalVariableElementImpl2? get declaredElement2 {
48964896
return declaredElement.asElement2 as LocalVariableElementImpl2?;
48974897
}
48984898

@@ -4983,7 +4983,7 @@ final class DeclaredVariablePatternImpl extends VariablePatternImpl
49834983

49844984
@experimental
49854985
@override
4986-
BindPatternVariableElement2? get declaredElement2 {
4986+
BindPatternVariableElementImpl2? get declaredElement2 {
49874987
return declaredElement?.element;
49884988
}
49894989

@@ -17274,7 +17274,7 @@ class SwitchStatementCaseGroup {
1727417274
final bool hasLabels;
1727517275

1727617276
/// Joined variables declared in [members], available in [statements].
17277-
late Map<String, PromotableElement2> variables;
17277+
late Map<String, PromotableElementImpl2> variables;
1727817278

1727917279
SwitchStatementCaseGroup(this.members, this.hasLabels);
1728017280

pkg/analyzer/lib/src/dart/element/type_constraint_gatherer.dart

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import 'package:_fe_analyzer_shared/src/type_inference/type_constraint.dart'
2121
UnknownTypeConstraintOrigin;
2222
import 'package:_fe_analyzer_shared/src/types/shared_type.dart';
2323
import 'package:analyzer/dart/element/element.dart';
24-
import 'package:analyzer/dart/element/element2.dart';
2524
import 'package:analyzer/dart/element/type.dart';
2625
import 'package:analyzer/src/dart/ast/ast.dart';
2726
import 'package:analyzer/src/dart/element/element.dart';
@@ -31,19 +30,27 @@ import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
3130

3231
/// Instance of [shared.GeneratedTypeConstraint] specific to the Analyzer.
3332
typedef GeneratedTypeConstraint = shared.GeneratedTypeConstraint<DartType,
34-
TypeParameterElement, PromotableElement2>;
33+
TypeParameterElement, PromotableElementImpl2>;
3534

3635
/// Instance of [shared.MergedTypeConstraint] specific to the Analyzer.
37-
typedef MergedTypeConstraint = shared.MergedTypeConstraint<DartType,
38-
TypeParameterElement, PromotableElement2, InterfaceType, InterfaceElement>;
36+
typedef MergedTypeConstraint = shared.MergedTypeConstraint<
37+
DartType,
38+
TypeParameterElement,
39+
PromotableElementImpl2,
40+
InterfaceType,
41+
InterfaceElement>;
3942

4043
/// Instance of [shared.TypeConstraintFromArgument] specific to the Analyzer.
41-
typedef TypeConstraintFromArgument = shared.TypeConstraintFromArgument<DartType,
42-
PromotableElement2, TypeParameterElement, InterfaceType, InterfaceElement>;
44+
typedef TypeConstraintFromArgument = shared.TypeConstraintFromArgument<
45+
DartType,
46+
PromotableElementImpl2,
47+
TypeParameterElement,
48+
InterfaceType,
49+
InterfaceElement>;
4350

4451
/// Instance of [shared.TypeConstraintFromExtendsClause] specific to the Analyzer.
4552
typedef TypeConstraintFromExtendsClause
46-
= shared.TypeConstraintFromExtendsClause<DartType, PromotableElement2,
53+
= shared.TypeConstraintFromExtendsClause<DartType, PromotableElementImpl2,
4754
TypeParameterElement, InterfaceType, InterfaceElement>;
4855

4956
/// Instance of [shared.TypeConstraintFromFunctionContext] specific to the Analyzer.
@@ -52,7 +59,7 @@ typedef TypeConstraintFromFunctionContext
5259
DartType,
5360
DartType,
5461
DartType,
55-
PromotableElement2,
62+
PromotableElementImpl2,
5663
TypeParameterElement,
5764
InterfaceType,
5865
InterfaceElement>;
@@ -62,19 +69,23 @@ typedef TypeConstraintFromReturnType = shared.TypeConstraintFromReturnType<
6269
DartType,
6370
DartType,
6471
DartType,
65-
PromotableElement2,
72+
PromotableElementImpl2,
6673
TypeParameterElement,
6774
InterfaceType,
6875
InterfaceElement>;
6976

7077
/// Instance of [shared.TypeConstraintOrigin] specific to the Analyzer.
71-
typedef TypeConstraintOrigin = shared.TypeConstraintOrigin<DartType,
72-
PromotableElement2, TypeParameterElement, InterfaceType, InterfaceElement>;
78+
typedef TypeConstraintOrigin = shared.TypeConstraintOrigin<
79+
DartType,
80+
PromotableElementImpl2,
81+
TypeParameterElement,
82+
InterfaceType,
83+
InterfaceElement>;
7384

7485
/// Instance of [shared.UnknownTypeConstraintOrigin] specific to the Analyzer.
7586
typedef UnknownTypeConstraintOrigin = shared.UnknownTypeConstraintOrigin<
7687
DartType,
77-
PromotableElement2,
88+
PromotableElementImpl2,
7889
TypeParameterElement,
7990
InterfaceType,
8091
InterfaceElement>;
@@ -84,7 +95,7 @@ typedef UnknownTypeConstraintOrigin = shared.UnknownTypeConstraintOrigin<
8495
class TypeConstraintGatherer extends shared.TypeConstraintGenerator<
8596
DartType,
8697
ParameterElement,
87-
PromotableElement2,
98+
PromotableElementImpl2,
8899
TypeParameterElement,
89100
InterfaceType,
90101
InterfaceElement,
@@ -93,7 +104,7 @@ class TypeConstraintGatherer extends shared.TypeConstraintGenerator<
93104
shared.TypeConstraintGeneratorMixin<
94105
DartType,
95106
ParameterElement,
96-
PromotableElement2,
107+
PromotableElementImpl2,
97108
TypeParameterElement,
98109
InterfaceType,
99110
InterfaceElement,

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ import 'package:_fe_analyzer_shared/src/types/shared_type.dart';
77
import 'package:analyzer/dart/analysis/features.dart';
88
import 'package:analyzer/dart/ast/token.dart';
99
import 'package:analyzer/dart/element/element.dart';
10-
import 'package:analyzer/dart/element/element2.dart';
1110
import 'package:analyzer/dart/element/type.dart';
1211
import 'package:analyzer/dart/element/type_provider.dart';
1312
import 'package:analyzer/error/listener.dart';
1413
import 'package:analyzer/src/dart/ast/ast.dart';
1514
import 'package:analyzer/src/dart/ast/extensions.dart';
15+
import 'package:analyzer/src/dart/element/element.dart';
1616
import 'package:analyzer/src/dart/element/type.dart';
1717
import 'package:analyzer/src/dart/element/type_schema.dart';
1818
import 'package:analyzer/src/dart/element/type_system.dart';
@@ -103,7 +103,7 @@ class AssignmentExpressionResolver {
103103
whyNotPromoted: whyNotPromoted, contextType: contextType);
104104

105105
if (flow != null) {
106-
if (writeElement2 is PromotableElement2) {
106+
if (writeElement2 is PromotableElementImpl2) {
107107
flow.write(node, writeElement2, SharedTypeView(node.typeOrThrow),
108108
hasRead ? null : right);
109109
}
@@ -362,7 +362,7 @@ class AssignmentExpressionShared {
362362

363363
if (left is SimpleIdentifier) {
364364
var element = left.element;
365-
if (element is PromotableElement2) {
365+
if (element is PromotableElementImpl2) {
366366
var assigned = flowAnalysis.isDefinitelyAssigned(left, element);
367367
var unassigned = flowAnalysis.isDefinitelyUnassigned(left, element);
368368

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ import 'package:analyzer/dart/analysis/features.dart';
88
import 'package:analyzer/dart/ast/syntactic_entity.dart';
99
import 'package:analyzer/dart/ast/token.dart';
1010
import 'package:analyzer/dart/element/element.dart';
11-
import 'package:analyzer/dart/element/element2.dart';
1211
import 'package:analyzer/dart/element/type.dart';
1312
import 'package:analyzer/dart/element/type_provider.dart';
1413
import 'package:analyzer/error/listener.dart';
1514
import 'package:analyzer/src/dart/ast/ast.dart';
1615
import 'package:analyzer/src/dart/ast/extensions.dart';
16+
import 'package:analyzer/src/dart/element/element.dart';
1717
import 'package:analyzer/src/dart/element/type.dart';
1818
import 'package:analyzer/src/dart/element/type_schema.dart';
1919
import 'package:analyzer/src/dart/element/type_system.dart';
@@ -141,13 +141,13 @@ class BinaryExpressionResolver {
141141

142142
if (left is SimpleIdentifierImpl && right is NullLiteralImpl) {
143143
var element = left.element;
144-
if (element is PromotableElement2 &&
144+
if (element is PromotableElementImpl2 &&
145145
flowAnalysis.isDefinitelyUnassigned(left, element)) {
146146
reportNullComparison(left, node.operator);
147147
}
148148
} else if (right is SimpleIdentifierImpl && left is NullLiteralImpl) {
149149
var element = right.element;
150-
if (element is PromotableElement2 &&
150+
if (element is PromotableElementImpl2 &&
151151
flowAnalysis.isDefinitelyUnassigned(right, element)) {
152152
reportNullComparison(node.operator, right);
153153
}

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

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ class FlowAnalysisDataForTesting {
5454

5555
/// For each top level or class level declaration, the assigned variables
5656
/// information that was computed for it.
57-
final Map<AstNode, AssignedVariablesForTesting<AstNode, PromotableElement2>>
57+
final Map<AstNode,
58+
AssignedVariablesForTesting<AstNode, PromotableElementImpl2>>
5859
assignedVariables = {};
5960

6061
/// For each expression that led to an error because it was not promoted, a
@@ -76,7 +77,7 @@ class FlowAnalysisHelper {
7677
final TypeSystemOperations typeOperations;
7778

7879
/// Precomputed sets of potentially assigned variables.
79-
AssignedVariables<AstNode, PromotableElement2>? assignedVariables;
80+
AssignedVariables<AstNode, PromotableElementImpl2>? assignedVariables;
8081

8182
/// The result for post-resolution stages of analysis, for testing only.
8283
final FlowAnalysisDataForTesting? dataForTesting;
@@ -95,7 +96,7 @@ class FlowAnalysisHelper {
9596
final bool inferenceUpdate4Enabled;
9697

9798
/// The current flow, when resolving a function body, or `null` otherwise.
98-
FlowAnalysis<AstNode, Statement, Expression, PromotableElement2,
99+
FlowAnalysis<AstNode, Statement, Expression, PromotableElementImpl2,
99100
SharedTypeView<DartType>>? flow;
100101

101102
FlowAnalysisHelper(bool retainDataForTesting, FeatureSet featureSet,
@@ -173,10 +174,10 @@ class FlowAnalysisHelper {
173174
retainDataForTesting: dataForTesting != null, visit: visit);
174175
if (dataForTesting != null) {
175176
dataForTesting!.assignedVariables[node] = assignedVariables
176-
as AssignedVariablesForTesting<AstNode, PromotableElement2>;
177+
as AssignedVariablesForTesting<AstNode, PromotableElementImpl2>;
177178
}
178179
flow = isNonNullableByDefault
179-
? FlowAnalysis<AstNode, Statement, Expression, PromotableElement2,
180+
? FlowAnalysis<AstNode, Statement, Expression, PromotableElementImpl2,
180181
SharedTypeView<DartType>>(
181182
typeOperations,
182183
assignedVariables!,
@@ -185,7 +186,7 @@ class FlowAnalysisHelper {
185186
fieldPromotionEnabled: fieldPromotionEnabled,
186187
inferenceUpdate4Enabled: inferenceUpdate4Enabled,
187188
)
188-
: FlowAnalysis<AstNode, Statement, Expression, PromotableElement2,
189+
: FlowAnalysis<AstNode, Statement, Expression, PromotableElementImpl2,
189190
SharedTypeView<DartType>>.legacy(
190191
typeOperations, assignedVariables!);
191192
}
@@ -235,7 +236,10 @@ class FlowAnalysisHelper {
235236

236237
if (parameters != null) {
237238
for (var parameter in parameters.parameters) {
238-
var declaredElement = parameter.declaredFragment!.element;
239+
// TODO(paulberry): try to remove this cast by changing `parameters` to
240+
// a `FormalParameterListImpl`
241+
var declaredElement =
242+
parameter.declaredFragment!.element as PromotableElementImpl2;
239243
// TODO(paulberry): `skipDuplicateCheck` is currently needed to work
240244
// around a failure in duplicate_definition_test.dart; fix this.
241245
flow!.declare(declaredElement, SharedTypeView(declaredElement.type),
@@ -263,7 +267,7 @@ class FlowAnalysisHelper {
263267

264268
bool isDefinitelyAssigned(
265269
SimpleIdentifier node,
266-
PromotableElement2 element,
270+
PromotableElementImpl2 element,
267271
) {
268272
var isAssigned = flow!.isAssigned(element);
269273

@@ -280,7 +284,7 @@ class FlowAnalysisHelper {
280284

281285
bool isDefinitelyUnassigned(
282286
SimpleIdentifier node,
283-
PromotableElement2 element,
287+
PromotableElementImpl2 element,
284288
) {
285289
var isUnassigned = flow!.isUnassigned(element);
286290

@@ -335,19 +339,20 @@ class FlowAnalysisHelper {
335339
var variables = node.variables;
336340
for (var i = 0; i < variables.length; ++i) {
337341
var variable = variables[i];
338-
var declaredElement = variable.declaredElement2 as PromotableElement2;
342+
var declaredElement =
343+
variable.declaredElement2 as PromotableElementImpl2;
339344
flow!.declare(declaredElement, SharedTypeView(declaredElement.type),
340345
initialized: variable.initializer != null);
341346
}
342347
}
343348
}
344349

345350
/// Computes the [AssignedVariables] map for the given [node].
346-
static AssignedVariables<AstNode, PromotableElement2>
351+
static AssignedVariables<AstNode, PromotableElementImpl2>
347352
computeAssignedVariables(AstNode node, FormalParameterList? parameters,
348353
{bool retainDataForTesting = false,
349354
void Function(AstVisitor<Object?> visitor)? visit}) {
350-
AssignedVariables<AstNode, PromotableElement2> assignedVariables =
355+
AssignedVariables<AstNode, PromotableElementImpl2> assignedVariables =
351356
retainDataForTesting
352357
? AssignedVariablesForTesting()
353358
: AssignedVariables();
@@ -418,10 +423,10 @@ class FlowAnalysisHelper {
418423

419424
class TypeSystemOperations
420425
with
421-
TypeAnalyzerOperationsMixin<DartType, PromotableElement2,
426+
TypeAnalyzerOperationsMixin<DartType, PromotableElementImpl2,
422427
TypeParameterElement, InterfaceType, InterfaceElement>
423428
implements
424-
TypeAnalyzerOperations<DartType, PromotableElement2,
429+
TypeAnalyzerOperations<DartType, PromotableElementImpl2,
425430
TypeParameterElement, InterfaceType, InterfaceElement> {
426431
final bool strictCasts;
427432
final TypeSystemImpl typeSystem;
@@ -1189,7 +1194,7 @@ class _LocalVariableTypeProvider implements LocalVariableTypeProvider {
11891194
@override
11901195
DartType getType(SimpleIdentifier node, {required bool isRead}) {
11911196
var variable = node.element as VariableElement2;
1192-
if (variable is PromotableElement2) {
1197+
if (variable is PromotableElementImpl2) {
11931198
var promotedType = isRead
11941199
? _manager.flow?.variableRead(node, variable)
11951200
: _manager.flow?.promotedType(variable);

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,10 @@ class ForResolver {
123123
void _forEachParts(AstNode node, bool isAsync, ForEachParts forEachParts,
124124
void Function() visitBody) {
125125
Expression iterable = forEachParts.iterable;
126-
DeclaredIdentifier? loopVariable;
126+
DeclaredIdentifierImpl? loopVariable;
127127
SimpleIdentifier? identifier;
128128
Element2? identifierElement;
129-
if (forEachParts is ForEachPartsWithDeclaration) {
129+
if (forEachParts is ForEachPartsWithDeclarationImpl) {
130130
loopVariable = forEachParts.loopVariable;
131131
} else if (forEachParts is ForEachPartsWithIdentifier) {
132132
identifier = forEachParts.identifier;
@@ -188,7 +188,7 @@ class ForResolver {
188188
}
189189

190190
_resolver.flowAnalysis.flow?.forEach_bodyBegin(node);
191-
if (identifierElement is PromotableElement2 &&
191+
if (identifierElement is PromotableElementImpl2 &&
192192
forEachParts is ForEachPartsWithIdentifier) {
193193
_resolver.flowAnalysis.flow?.write(
194194
forEachParts, identifierElement, SharedTypeView(elementType), null);

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ import 'package:_fe_analyzer_shared/src/types/shared_type.dart';
66
import 'package:analyzer/dart/analysis/features.dart';
77
import 'package:analyzer/dart/ast/token.dart';
88
import 'package:analyzer/dart/element/element.dart';
9-
import 'package:analyzer/dart/element/element2.dart';
109
import 'package:analyzer/dart/element/type.dart';
1110
import 'package:analyzer/error/listener.dart';
1211
import 'package:analyzer/src/dart/ast/ast.dart';
1312
import 'package:analyzer/src/dart/ast/extensions.dart';
13+
import 'package:analyzer/src/dart/element/element.dart';
1414
import 'package:analyzer/src/dart/element/type.dart';
1515
import 'package:analyzer/src/dart/element/type_system.dart';
1616
import 'package:analyzer/src/dart/error/syntactic_errors.dart';
@@ -177,7 +177,7 @@ class PostfixExpressionResolver {
177177
}
178178
if (operand is SimpleIdentifier) {
179179
var element = operand.element;
180-
if (element is PromotableElement2) {
180+
if (element is PromotableElementImpl2) {
181181
if (_resolver.definingLibrary.featureSet
182182
.isEnabled(Feature.inference_update_4)) {
183183
_resolver.flowAnalysis.flow?.postIncDec(

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
import 'package:_fe_analyzer_shared/src/types/shared_type.dart';
66
import 'package:analyzer/dart/ast/token.dart';
77
import 'package:analyzer/dart/element/element.dart';
8-
import 'package:analyzer/dart/element/element2.dart';
98
import 'package:analyzer/dart/element/type.dart';
109
import 'package:analyzer/dart/element/type_provider.dart';
1110
import 'package:analyzer/error/listener.dart';
1211
import 'package:analyzer/src/dart/ast/ast.dart';
1312
import 'package:analyzer/src/dart/ast/extensions.dart';
13+
import 'package:analyzer/src/dart/element/element.dart';
1414
import 'package:analyzer/src/dart/element/type.dart';
1515
import 'package:analyzer/src/dart/element/type_schema.dart';
1616
import 'package:analyzer/src/dart/element/type_system.dart';
@@ -236,7 +236,7 @@ class PrefixExpressionResolver {
236236
}
237237
if (operand is SimpleIdentifier) {
238238
var element = operand.element;
239-
if (element is PromotableElement2) {
239+
if (element is PromotableElementImpl2) {
240240
_resolver.flowAnalysis.flow
241241
?.write(node, element, SharedTypeView(staticType), null);
242242
}

0 commit comments

Comments
 (0)