Skip to content

Commit d35cb90

Browse files
stereotype441commit-bot@chromium.org
authored andcommitted
Expose _flowAnalysis from ResolverVisitor.
This saves a lot of plumbing work in the analyzer, because it allows the individual resolver components to access flow analysis via the resolver field rather than needing to maintain their own field. It should be helpful in supporting the upcoming "why not promoted" functionality (#38773), which will require flow analysis to be visible to even more parts of the resolver. Bug: #38773 Change-Id: Ibea0ec7e263461d6c512b3dad59f10622b2aac6f Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/181661 Reviewed-by: Samuel Rawlins <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Paul Berry <[email protected]>
1 parent 65f8699 commit d35cb90

10 files changed

+126
-174
lines changed

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

+7-13
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import 'package:analyzer/src/dart/ast/ast.dart';
1212
import 'package:analyzer/src/dart/ast/token.dart';
1313
import 'package:analyzer/src/dart/element/type.dart';
1414
import 'package:analyzer/src/dart/element/type_system.dart';
15-
import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
1615
import 'package:analyzer/src/dart/resolver/invocation_inference_helper.dart';
1716
import 'package:analyzer/src/dart/resolver/type_property_resolver.dart';
1817
import 'package:analyzer/src/error/codes.dart';
@@ -22,21 +21,17 @@ import 'package:meta/meta.dart';
2221
/// Helper for resolving [AssignmentExpression]s.
2322
class AssignmentExpressionResolver {
2423
final ResolverVisitor _resolver;
25-
final FlowAnalysisHelper _flowAnalysis;
2624
final TypePropertyResolver _typePropertyResolver;
2725
final InvocationInferenceHelper _inferenceHelper;
2826
final AssignmentExpressionShared _assignmentShared;
2927

3028
AssignmentExpressionResolver({
3129
@required ResolverVisitor resolver,
32-
@required FlowAnalysisHelper flowAnalysis,
3330
}) : _resolver = resolver,
34-
_flowAnalysis = flowAnalysis,
3531
_typePropertyResolver = resolver.typePropertyResolver,
3632
_inferenceHelper = resolver.inferenceHelper,
3733
_assignmentShared = AssignmentExpressionShared(
3834
resolver: resolver,
39-
flowAnalysis: flowAnalysis,
4035
);
4136

4237
ErrorReporter get _errorReporter => _resolver.errorReporter;
@@ -80,7 +75,7 @@ class AssignmentExpressionResolver {
8075
_setRhsContext(node, leftType, operator, right);
8176
}
8277

83-
var flow = _flowAnalysis?.flow;
78+
var flow = _resolver.flowAnalysis?.flow;
8479
if (flow != null && isIfNull) {
8580
flow.ifNullExpression_rightBegin(left, node.readType);
8681
}
@@ -276,23 +271,22 @@ class AssignmentExpressionResolver {
276271

277272
class AssignmentExpressionShared {
278273
final ResolverVisitor _resolver;
279-
final FlowAnalysisHelper _flowAnalysis;
280274

281275
AssignmentExpressionShared({
282276
@required ResolverVisitor resolver,
283-
@required FlowAnalysisHelper flowAnalysis,
284-
}) : _resolver = resolver,
285-
_flowAnalysis = flowAnalysis;
277+
}) : _resolver = resolver;
286278

287279
ErrorReporter get _errorReporter => _resolver.errorReporter;
288280

289281
void checkFinalAlreadyAssigned(Expression left) {
290-
var flow = _flowAnalysis?.flow;
282+
var flow = _resolver.flowAnalysis?.flow;
291283
if (flow != null && left is SimpleIdentifier) {
292284
var element = left.staticElement;
293285
if (element is VariableElement) {
294-
var assigned = _flowAnalysis.isDefinitelyAssigned(left, element);
295-
var unassigned = _flowAnalysis.isDefinitelyUnassigned(left, element);
286+
var assigned =
287+
_resolver.flowAnalysis.isDefinitelyAssigned(left, element);
288+
var unassigned =
289+
_resolver.flowAnalysis.isDefinitelyUnassigned(left, element);
296290

297291
if (element.isFinal) {
298292
if (element.isLate) {

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

+5-9
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import 'package:analyzer/error/listener.dart';
1111
import 'package:analyzer/src/dart/ast/ast.dart';
1212
import 'package:analyzer/src/dart/element/type.dart';
1313
import 'package:analyzer/src/dart/element/type_system.dart';
14-
import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
1514
import 'package:analyzer/src/dart/resolver/invocation_inference_helper.dart';
1615
import 'package:analyzer/src/dart/resolver/resolution_result.dart';
1716
import 'package:analyzer/src/dart/resolver/type_property_resolver.dart';
@@ -24,17 +23,14 @@ import 'package:meta/meta.dart';
2423
class BinaryExpressionResolver {
2524
final ResolverVisitor _resolver;
2625
final TypePromotionManager _promoteManager;
27-
final FlowAnalysisHelper _flowAnalysis;
2826
final TypePropertyResolver _typePropertyResolver;
2927
final InvocationInferenceHelper _inferenceHelper;
3028

3129
BinaryExpressionResolver({
3230
@required ResolverVisitor resolver,
3331
@required TypePromotionManager promoteManager,
34-
@required FlowAnalysisHelper flowAnalysis,
3532
}) : _resolver = resolver,
3633
_promoteManager = promoteManager,
37-
_flowAnalysis = flowAnalysis,
3834
_typePropertyResolver = resolver.typePropertyResolver,
3935
_inferenceHelper = resolver.inferenceHelper;
4036

@@ -111,7 +107,7 @@ class BinaryExpressionResolver {
111107
left.accept(_resolver);
112108
left = node.leftOperand;
113109

114-
var flow = _flowAnalysis?.flow;
110+
var flow = _resolver.flowAnalysis?.flow;
115111
var leftExtensionOverride = left is ExtensionOverride;
116112
if (!leftExtensionOverride) {
117113
flow?.equalityOp_rightBegin(left, left.staticType);
@@ -136,7 +132,7 @@ class BinaryExpressionResolver {
136132
void _resolveIfNull(BinaryExpressionImpl node) {
137133
var left = node.leftOperand;
138134
var right = node.rightOperand;
139-
var flow = _flowAnalysis?.flow;
135+
var flow = _resolver.flowAnalysis?.flow;
140136

141137
var leftContextType = InferenceContext.getContext(node);
142138
if (leftContextType != null && _isNonNullableByDefault) {
@@ -171,7 +167,7 @@ class BinaryExpressionResolver {
171167
void _resolveLogicalAnd(BinaryExpressionImpl node) {
172168
var left = node.leftOperand;
173169
var right = node.rightOperand;
174-
var flow = _flowAnalysis?.flow;
170+
var flow = _resolver.flowAnalysis?.flow;
175171

176172
InferenceContext.setType(left, _typeProvider.boolType);
177173
InferenceContext.setType(right, _typeProvider.boolType);
@@ -180,7 +176,7 @@ class BinaryExpressionResolver {
180176
left.accept(_resolver);
181177
left = node.leftOperand;
182178

183-
if (_flowAnalysis != null) {
179+
if (_resolver.flowAnalysis != null) {
184180
flow?.logicalBinaryOp_rightBegin(left, node, isAnd: true);
185181
_resolver.checkUnreachableNode(right);
186182

@@ -209,7 +205,7 @@ class BinaryExpressionResolver {
209205
void _resolveLogicalOr(BinaryExpressionImpl node) {
210206
var left = node.leftOperand;
211207
var right = node.rightOperand;
212-
var flow = _flowAnalysis?.flow;
208+
var flow = _resolver.flowAnalysis?.flow;
213209

214210
InferenceContext.setType(left, _typeProvider.boolType);
215211
InferenceContext.setType(right, _typeProvider.boolType);

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

+8-13
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,17 @@ import 'package:analyzer/src/dart/element/element.dart';
1010
import 'package:analyzer/src/dart/element/type.dart';
1111
import 'package:analyzer/src/dart/element/type_schema.dart';
1212
import 'package:analyzer/src/dart/resolver/assignment_expression_resolver.dart';
13-
import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
1413
import 'package:analyzer/src/error/codes.dart';
1514
import 'package:analyzer/src/generated/resolver.dart';
1615
import 'package:meta/meta.dart';
1716

1817
/// Helper for resolving [ForStatement]s and [ForElement]s.
1918
class ForResolver {
2019
final ResolverVisitor _resolver;
21-
final FlowAnalysisHelper _flowAnalysis;
2220

2321
ForResolver({
2422
@required ResolverVisitor resolver,
25-
@required FlowAnalysisHelper flowAnalysis,
26-
}) : _resolver = resolver,
27-
_flowAnalysis = flowAnalysis;
23+
}) : _resolver = resolver;
2824

2925
void resolveElement(ForElementImpl node) {
3026
var forLoopParts = node.forLoopParts;
@@ -89,7 +85,6 @@ class ForResolver {
8985
identifier?.accept(_resolver);
9086
AssignmentExpressionShared(
9187
resolver: _resolver,
92-
flowAnalysis: _flowAnalysis,
9388
).checkFinalAlreadyAssigned(identifier);
9489
}
9590

@@ -134,10 +129,10 @@ class ForResolver {
134129
}
135130

136131
if (loopVariable != null) {
137-
_flowAnalysis?.flow?.declare(loopVariable.declaredElement, true);
132+
_resolver.flowAnalysis?.flow?.declare(loopVariable.declaredElement, true);
138133
}
139134

140-
_flowAnalysis?.flow?.forEach_bodyBegin(
135+
_resolver.flowAnalysis?.flow?.forEach_bodyBegin(
141136
node,
142137
identifierElement is VariableElement
143138
? identifierElement
@@ -147,7 +142,7 @@ class ForResolver {
147142

148143
_resolveBody(body);
149144

150-
_flowAnalysis?.flow?.forEach_end();
145+
_resolver.flowAnalysis?.flow?.forEach_end();
151146
}
152147

153148
void _forParts(AstNode node, ForParts forParts, AstNode body) {
@@ -157,7 +152,7 @@ class ForResolver {
157152
forParts.initialization?.accept(_resolver);
158153
}
159154

160-
_flowAnalysis?.for_conditionBegin(node);
155+
_resolver.flowAnalysis?.for_conditionBegin(node);
161156

162157
var condition = forParts.condition;
163158
if (condition != null) {
@@ -167,13 +162,13 @@ class ForResolver {
167162
_resolver.boolExpressionVerifier.checkForNonBoolCondition(condition);
168163
}
169164

170-
_flowAnalysis?.for_bodyBegin(node, condition);
165+
_resolver.flowAnalysis?.for_bodyBegin(node, condition);
171166
_resolveBody(body);
172167

173-
_flowAnalysis?.flow?.for_updaterBegin();
168+
_resolver.flowAnalysis?.flow?.for_updaterBegin();
174169
forParts.updaters.accept(_resolver);
175170

176-
_flowAnalysis?.flow?.for_end();
171+
_resolver.flowAnalysis?.flow?.for_end();
177172
}
178173

179174
void _resolveBody(AstNode body) {

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

+7-10
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import 'package:analyzer/src/dart/element/element.dart';
99
import 'package:analyzer/src/dart/element/type.dart';
1010
import 'package:analyzer/src/dart/element/type_system.dart';
1111
import 'package:analyzer/src/dart/resolver/body_inference_context.dart';
12-
import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
1312
import 'package:analyzer/src/dart/resolver/invocation_inference_helper.dart';
1413
import 'package:analyzer/src/generated/migration.dart';
1514
import 'package:analyzer/src/generated/resolver.dart';
@@ -20,18 +19,15 @@ class FunctionExpressionResolver {
2019
final ResolverVisitor _resolver;
2120
final MigrationResolutionHooks _migrationResolutionHooks;
2221
final InvocationInferenceHelper _inferenceHelper;
23-
final FlowAnalysisHelper _flowAnalysis;
2422
final TypePromotionManager _promoteManager;
2523

2624
FunctionExpressionResolver({
2725
@required ResolverVisitor resolver,
2826
@required MigrationResolutionHooks migrationResolutionHooks,
29-
@required FlowAnalysisHelper flowAnalysis,
3027
@required TypePromotionManager promoteManager,
3128
}) : _resolver = resolver,
3229
_migrationResolutionHooks = migrationResolutionHooks,
3330
_inferenceHelper = resolver.inferenceHelper,
34-
_flowAnalysis = flowAnalysis,
3531
_promoteManager = promoteManager;
3632

3733
bool get _isNonNullableByDefault => _typeSystem.isNonNullableByDefault;
@@ -42,9 +38,10 @@ class FunctionExpressionResolver {
4238
var isFunctionDeclaration = node.parent is FunctionDeclaration;
4339
var body = node.body;
4440

45-
if (_flowAnalysis != null) {
46-
if (_flowAnalysis.flow != null && !isFunctionDeclaration) {
47-
_flowAnalysis.executableDeclaration_enter(node, node.parameters, true);
41+
if (_resolver.flowAnalysis != null) {
42+
if (_resolver.flowAnalysis.flow != null && !isFunctionDeclaration) {
43+
_resolver.flowAnalysis
44+
.executableDeclaration_enter(node, node.parameters, true);
4845
}
4946
} else {
5047
_promoteManager.enterFunctionBody(body);
@@ -65,15 +62,15 @@ class FunctionExpressionResolver {
6562
node.visitChildren(_resolver);
6663
_resolve2(node);
6764

68-
if (_flowAnalysis != null) {
69-
if (_flowAnalysis.flow != null && !isFunctionDeclaration) {
65+
if (_resolver.flowAnalysis != null) {
66+
if (_resolver.flowAnalysis.flow != null && !isFunctionDeclaration) {
7067
var bodyContext = BodyInferenceContext.of(node.body);
7168
_resolver.checkForBodyMayCompleteNormally(
7269
returnType: bodyContext?.contextType,
7370
body: body,
7471
errorNode: body,
7572
);
76-
_flowAnalysis.flow?.functionExpression_end();
73+
_resolver.flowAnalysis.flow?.functionExpression_end();
7774
_resolver.nullSafetyDeadCodeVerifier?.flowEnd(node);
7875
}
7976
} else {

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

+1-5
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import 'package:analyzer/src/dart/ast/ast.dart';
1010
import 'package:analyzer/src/dart/element/type.dart';
1111
import 'package:analyzer/src/dart/element/type_algebra.dart';
1212
import 'package:analyzer/src/dart/element/type_system.dart';
13-
import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
1413
import 'package:analyzer/src/error/codes.dart';
1514
import 'package:analyzer/src/generated/migration.dart';
1615
import 'package:analyzer/src/generated/resolver.dart';
@@ -19,7 +18,6 @@ import 'package:meta/meta.dart';
1918
class InvocationInferenceHelper {
2019
final ResolverVisitor _resolver;
2120
final ErrorReporter _errorReporter;
22-
final FlowAnalysisHelper _flowAnalysis;
2321
final TypeSystemImpl _typeSystem;
2422
final MigrationResolutionHooks _migrationResolutionHooks;
2523

@@ -29,13 +27,11 @@ class InvocationInferenceHelper {
2927
InvocationInferenceHelper(
3028
{@required ResolverVisitor resolver,
3129
@required ErrorReporter errorReporter,
32-
@required FlowAnalysisHelper flowAnalysis,
3330
@required TypeSystemImpl typeSystem,
3431
@required MigrationResolutionHooks migrationResolutionHooks})
3532
: _resolver = resolver,
3633
_errorReporter = errorReporter,
3734
_typeSystem = typeSystem,
38-
_flowAnalysis = flowAnalysis,
3935
_migrationResolutionHooks = migrationResolutionHooks;
4036

4137
/// Compute the return type of the method or function represented by the given
@@ -200,7 +196,7 @@ class InvocationInferenceHelper {
200196
} else {
201197
expression.staticType = type;
202198
if (_typeSystem.isBottom(type)) {
203-
_flowAnalysis?.flow?.handleExit();
199+
_resolver.flowAnalysis?.flow?.handleExit();
204200
}
205201
}
206202
}

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

+3-7
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import 'package:analyzer/src/dart/element/type.dart';
1212
import 'package:analyzer/src/dart/element/type_system.dart';
1313
import 'package:analyzer/src/dart/error/syntactic_errors.dart';
1414
import 'package:analyzer/src/dart/resolver/assignment_expression_resolver.dart';
15-
import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
1615
import 'package:analyzer/src/dart/resolver/invocation_inference_helper.dart';
1716
import 'package:analyzer/src/dart/resolver/type_property_resolver.dart';
1817
import 'package:analyzer/src/error/codes.dart';
@@ -22,21 +21,17 @@ import 'package:meta/meta.dart';
2221
/// Helper for resolving [PostfixExpression]s.
2322
class PostfixExpressionResolver {
2423
final ResolverVisitor _resolver;
25-
final FlowAnalysisHelper _flowAnalysis;
2624
final TypePropertyResolver _typePropertyResolver;
2725
final InvocationInferenceHelper _inferenceHelper;
2826
final AssignmentExpressionShared _assignmentShared;
2927

3028
PostfixExpressionResolver({
3129
@required ResolverVisitor resolver,
32-
@required FlowAnalysisHelper flowAnalysis,
3330
}) : _resolver = resolver,
34-
_flowAnalysis = flowAnalysis,
3531
_typePropertyResolver = resolver.typePropertyResolver,
3632
_inferenceHelper = resolver.inferenceHelper,
3733
_assignmentShared = AssignmentExpressionShared(
3834
resolver: resolver,
39-
flowAnalysis: flowAnalysis,
4035
);
4136

4237
ErrorReporter get _errorReporter => _resolver.errorReporter;
@@ -180,7 +175,8 @@ class PostfixExpressionResolver {
180175
if (operand is SimpleIdentifier) {
181176
var element = operand.staticElement;
182177
if (element is PromotableElement) {
183-
_flowAnalysis?.flow?.write(element, operatorReturnType, null);
178+
_resolver.flowAnalysis?.flow
179+
?.write(element, operatorReturnType, null);
184180
}
185181
}
186182
}
@@ -219,6 +215,6 @@ class PostfixExpressionResolver {
219215
_inferenceHelper.recordStaticType(node, type);
220216

221217
_resolver.nullShortingTermination(node);
222-
_flowAnalysis?.flow?.nonNullAssert_end(operand);
218+
_resolver.flowAnalysis?.flow?.nonNullAssert_end(operand);
223219
}
224220
}

0 commit comments

Comments
 (0)