Skip to content

Commit 718ab66

Browse files
bwilkersoncommit-bot@chromium.org
authored andcommitted
Support postfix ++ and -- operators
Change-Id: Ib16f30a8b5d6e94b1a6ec0cddf5c88f58188ea83 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/107021 Reviewed-by: Paul Berry <[email protected]> Commit-Queue: Brian Wilkerson <[email protected]>
1 parent e2bc551 commit 718ab66

2 files changed

Lines changed: 51 additions & 2 deletions

File tree

pkg/nnbd_migration/lib/src/graph_builder.dart

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -554,8 +554,27 @@ $stackTrace''');
554554

555555
@override
556556
DecoratedType visitPostfixExpression(PostfixExpression node) {
557-
// TODO(brianwilkerson)
558-
_unimplemented(node, 'PostfixExpression');
557+
var operatorType = node.operator.type;
558+
if (operatorType == TokenType.PLUS_PLUS ||
559+
operatorType == TokenType.MINUS_MINUS) {
560+
_handleAssignment(_notNullType, node.operand);
561+
var callee = node.staticElement;
562+
if (callee is ClassMemberElement &&
563+
callee.enclosingElement.typeParameters.isNotEmpty) {
564+
// TODO(paulberry)
565+
_unimplemented(node,
566+
'Operator ${operatorType.lexeme} defined on a class with type parameters');
567+
}
568+
if (callee == null) {
569+
// TODO(paulberry)
570+
_unimplemented(node, 'Unresolved operator ${operatorType.lexeme}');
571+
}
572+
var calleeType = getOrComputeElementType(callee);
573+
// TODO(paulberry): substitute if necessary
574+
return calleeType.returnType;
575+
}
576+
_unimplemented(
577+
node, 'Postfix expression with operator ${node.operator.lexeme}');
559578
}
560579

561580
@override

pkg/nnbd_migration/test/graph_builder_test.dart

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1284,6 +1284,36 @@ int f() {
12841284
assertEdge(always, decoratedTypeAnnotation('int').node, hard: false));
12851285
}
12861286

1287+
test_postfixExpression_minusMinus() async {
1288+
await analyze('''
1289+
int f(int i) {
1290+
return i--;
1291+
}
1292+
''');
1293+
1294+
var declaration = decoratedTypeAnnotation('int i').node;
1295+
var use = checkExpression('i--');
1296+
assertNullCheck(use, assertEdge(declaration, never, hard: true));
1297+
1298+
var returnType = decoratedTypeAnnotation('int f').node;
1299+
assertEdge(never, returnType, hard: false);
1300+
}
1301+
1302+
test_postfixExpression_plusPlus() async {
1303+
await analyze('''
1304+
int f(int i) {
1305+
return i++;
1306+
}
1307+
''');
1308+
1309+
var declaration = decoratedTypeAnnotation('int i').node;
1310+
var use = checkExpression('i++');
1311+
assertNullCheck(use, assertEdge(declaration, never, hard: true));
1312+
1313+
var returnType = decoratedTypeAnnotation('int f').node;
1314+
assertEdge(never, returnType, hard: false);
1315+
}
1316+
12871317
test_prefixedIdentifier_field_type() async {
12881318
await analyze('''
12891319
class C {

0 commit comments

Comments
 (0)