Skip to content

Commit 39b7125

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Fix for curly_braces_in_flow_control_structures lint.
Quick assist for converting single line statements to blocks and vice-versa is also sometimes useful, but separate. [email protected], [email protected] Bug: #37084 Change-Id: I9c6b2f7c063bc339a57d991e4d675b87e1910413 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/103721 Reviewed-by: Brian Wilkerson <[email protected]> Reviewed-by: Phil Quitslund <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent b6c3b2c commit 39b7125

4 files changed

Lines changed: 574 additions & 0 deletions

File tree

‎pkg/analysis_server/lib/src/services/correction/assist.dart‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,4 +232,6 @@ class DartAssistKind {
232232
'dart.assist.surround.tryFinally', 29, "Surround with 'try-finally'");
233233
static const SURROUND_WITH_WHILE = const AssistKind(
234234
'dart.assist.surround.while', 24, "Surround with 'while'");
235+
static const USE_CURLY_BRACES =
236+
const AssistKind('USE_CURLY_BRACES', 30, "Use curly braces");
235237
}

‎pkg/analysis_server/lib/src/services/correction/assist_internal.dart‎

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ class AssistProcessor {
149149
await _addProposal_splitAndCondition();
150150
await _addProposal_splitVariableDeclaration();
151151
await _addProposal_surroundWith();
152+
await _addProposal_useCurlyBraces();
152153

153154
if (experimentStatus.control_flow_collections) {
154155
await _addProposal_convertConditionalExpressionToIfElement();
@@ -3947,6 +3948,132 @@ class AssistProcessor {
39473948
}
39483949
}
39493950

3951+
Future<void> _addProposal_useCurlyBraces() async {
3952+
Future<void> doStatement(DoStatement node) async {
3953+
var body = node.body;
3954+
if (body is Block) return;
3955+
3956+
var prefix = utils.getLinePrefix(node.offset);
3957+
var indent = prefix + utils.getIndent(1);
3958+
3959+
var changeBuilder = _newDartChangeBuilder();
3960+
await changeBuilder.addFileEdit(file, (builder) {
3961+
builder.addSimpleReplacement(
3962+
range.endStart(node.doKeyword, body),
3963+
' {$eol$indent',
3964+
);
3965+
builder.addSimpleReplacement(
3966+
range.endStart(body, node.whileKeyword),
3967+
'$eol$prefix} ',
3968+
);
3969+
});
3970+
3971+
_addAssistFromBuilder(changeBuilder, DartAssistKind.USE_CURLY_BRACES);
3972+
}
3973+
3974+
Future<void> forStatement(ForStatement node) async {
3975+
var body = node.body;
3976+
if (body is Block) return;
3977+
3978+
var prefix = utils.getLinePrefix(node.offset);
3979+
var indent = prefix + utils.getIndent(1);
3980+
3981+
var changeBuilder = _newDartChangeBuilder();
3982+
await changeBuilder.addFileEdit(file, (builder) {
3983+
builder.addSimpleReplacement(
3984+
range.endStart(node.rightParenthesis, body),
3985+
' {$eol$indent',
3986+
);
3987+
builder.addSimpleInsertion(body.end, '$eol$prefix}');
3988+
});
3989+
3990+
_addAssistFromBuilder(changeBuilder, DartAssistKind.USE_CURLY_BRACES);
3991+
}
3992+
3993+
Future<void> ifStatement(IfStatement node, Statement thenOrElse) async {
3994+
var prefix = utils.getLinePrefix(node.offset);
3995+
var indent = prefix + utils.getIndent(1);
3996+
3997+
var changeBuilder = _newDartChangeBuilder();
3998+
await changeBuilder.addFileEdit(file, (builder) {
3999+
var thenStatement = node.thenStatement;
4000+
if (thenStatement is! Block &&
4001+
(thenOrElse == null || thenOrElse == thenStatement)) {
4002+
builder.addSimpleReplacement(
4003+
range.endStart(node.rightParenthesis, thenStatement),
4004+
' {$eol$indent',
4005+
);
4006+
if (node.elseKeyword != null) {
4007+
builder.addSimpleReplacement(
4008+
range.endStart(thenStatement, node.elseKeyword),
4009+
'$eol$prefix} ',
4010+
);
4011+
} else {
4012+
builder.addSimpleInsertion(thenStatement.end, '$eol$prefix}');
4013+
}
4014+
}
4015+
4016+
var elseStatement = node.elseStatement;
4017+
if (elseStatement != null &&
4018+
elseStatement is! Block &&
4019+
(thenOrElse == null || thenOrElse == elseStatement)) {
4020+
builder.addSimpleReplacement(
4021+
range.endStart(node.elseKeyword, elseStatement),
4022+
' {$eol$indent',
4023+
);
4024+
builder.addSimpleInsertion(elseStatement.end, '$eol$prefix}');
4025+
}
4026+
});
4027+
4028+
_addAssistFromBuilder(changeBuilder, DartAssistKind.USE_CURLY_BRACES);
4029+
}
4030+
4031+
Future<void> whileStatement(WhileStatement node) async {
4032+
var body = node.body;
4033+
if (body is Block) return;
4034+
4035+
var prefix = utils.getLinePrefix(node.offset);
4036+
var indent = prefix + utils.getIndent(1);
4037+
4038+
var changeBuilder = _newDartChangeBuilder();
4039+
await changeBuilder.addFileEdit(file, (builder) {
4040+
builder.addSimpleReplacement(
4041+
range.endStart(node.rightParenthesis, body),
4042+
' {$eol$indent',
4043+
);
4044+
builder.addSimpleInsertion(body.end, '$eol$prefix}');
4045+
});
4046+
4047+
_addAssistFromBuilder(changeBuilder, DartAssistKind.USE_CURLY_BRACES);
4048+
}
4049+
4050+
var statement = this.node.thisOrAncestorOfType<Statement>();
4051+
var parent = statement?.parent;
4052+
4053+
if (statement is DoStatement) {
4054+
return doStatement(statement);
4055+
} else if (parent is DoStatement) {
4056+
return doStatement(parent);
4057+
} else if (statement is ForStatement) {
4058+
return forStatement(statement);
4059+
} else if (parent is ForStatement) {
4060+
return forStatement(parent);
4061+
} else if (statement is IfStatement) {
4062+
if (statement.elseKeyword != null &&
4063+
range.token(statement.elseKeyword).contains(selectionOffset)) {
4064+
return ifStatement(statement, statement.elseStatement);
4065+
} else {
4066+
return ifStatement(statement, null);
4067+
}
4068+
} else if (parent is IfStatement) {
4069+
return ifStatement(parent, statement);
4070+
} else if (statement is WhileStatement) {
4071+
return whileStatement(statement);
4072+
} else if (parent is WhileStatement) {
4073+
return whileStatement(parent);
4074+
}
4075+
}
4076+
39504077
/**
39514078
* Return `true` if all of the parameters in the given list of [parameters]
39524079
* have an explicit type annotation.

‎pkg/analysis_server/test/src/services/correction/assist/test_all.dart‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ import 'surround_with_if_test.dart' as surround_with_if;
7878
import 'surround_with_try_catch_test.dart' as surround_with_try_catch;
7979
import 'surround_with_try_finally_test.dart' as surround_with_try_finally;
8080
import 'surround_with_while_test.dart' as surround_with_while;
81+
import 'use_curly_braces_test.dart' as use_curly_braces;
8182

8283
main() {
8384
defineReflectiveSuite(() {
@@ -147,5 +148,6 @@ main() {
147148
surround_with_try_catch.main();
148149
surround_with_try_finally.main();
149150
surround_with_while.main();
151+
use_curly_braces.main();
150152
}, name: 'assist');
151153
}

0 commit comments

Comments
 (0)