Skip to content

Commit c7bb9cf

Browse files
pqcommit-bot@chromium.org
authored andcommitted
refactor to share common fix/assist processor code
Also, introduces a fix for curly braces (and makes the assist conditional). This is the proposed pattern for the remaining fix/assist correspondences. See: #37508 (Note: in a follow-up I'll pull more shared functionality into the new BaseProcessor; the goal here is to have just enough shared to allow for conditionally adding assists where there are already fixes.) Change-Id: I5b725c58b15afa76db66d15f34c90338704689c7 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/115720 Commit-Queue: Phil Quitslund <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]>
1 parent 5a45050 commit c7bb9cf

File tree

8 files changed

+293
-165
lines changed

8 files changed

+293
-165
lines changed

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

Lines changed: 40 additions & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@ import 'dart:collection';
88
import 'package:analysis_server/plugin/edit/assist/assist_core.dart';
99
import 'package:analysis_server/plugin/edit/assist/assist_dart.dart';
1010
import 'package:analysis_server/src/services/correction/assist.dart';
11+
import 'package:analysis_server/src/services/correction/base_processor.dart';
1112
import 'package:analysis_server/src/services/correction/name_suggestion.dart';
1213
import 'package:analysis_server/src/services/correction/selection_analyzer.dart';
1314
import 'package:analysis_server/src/services/correction/statement_analyzer.dart';
1415
import 'package:analysis_server/src/services/correction/util.dart';
16+
import 'package:analysis_server/src/services/linter/lint_names.dart';
1517
import 'package:analysis_server/src/services/search/hierarchy.dart';
1618
import 'package:analysis_server/src/utilities/flutter.dart';
1719
import 'package:analyzer/dart/analysis/session.dart';
@@ -36,45 +38,34 @@ import 'package:analyzer_plugin/utilities/assist/assist.dart'
3638
import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
3739
import 'package:analyzer_plugin/utilities/range_factory.dart';
3840
import 'package:meta/meta.dart';
39-
import 'package:path/path.dart';
41+
import 'package:path/path.dart' hide context;
4042

4143
typedef _SimpleIdentifierVisitor(SimpleIdentifier node);
4244

4345
/**
4446
* The computer for Dart assists.
4547
*/
46-
class AssistProcessor {
48+
class AssistProcessor extends BaseProcessor {
4749
final DartAssistContext context;
48-
final int selectionOffset;
49-
final int selectionLength;
50-
final int selectionEnd;
5150

5251
final AnalysisSession session;
5352
final AnalysisSessionHelper sessionHelper;
5453
final TypeProvider typeProvider;
55-
final String file;
56-
final CorrectionUtils utils;
5754
final Flutter flutter;
5855

5956
final List<Assist> assists = <Assist>[];
6057

61-
AstNode node;
62-
6358
AssistProcessor(this.context)
64-
: selectionOffset = context.selectionOffset,
65-
selectionLength = context.selectionLength,
66-
selectionEnd = context.selectionOffset + context.selectionLength,
67-
session = context.resolveResult.session,
59+
: session = context.resolveResult.session,
6860
sessionHelper = AnalysisSessionHelper(context.resolveResult.session),
6961
typeProvider = context.resolveResult.typeProvider,
70-
file = context.resolveResult.path,
71-
utils = new CorrectionUtils(context.resolveResult),
72-
flutter = Flutter.of(context.resolveResult);
73-
74-
/**
75-
* Returns the EOL to use for this [CompilationUnit].
76-
*/
77-
String get eol => utils.endOfLine;
62+
flutter = Flutter.of(context.resolveResult),
63+
super(
64+
selectionOffset: context.selectionOffset,
65+
selectionLength: context.selectionLength,
66+
resolvedResult: context.resolveResult,
67+
workspace: context.workspace,
68+
);
7869

7970
/**
8071
* Return the status of the known experiments.
@@ -84,7 +75,7 @@ class AssistProcessor {
8475
.experimentStatus;
8576

8677
Future<List<Assist>> compute() async {
87-
if (!_setupCompute()) {
78+
if (!setupCompute()) {
8879
return assists;
8980
}
9081

@@ -147,7 +138,11 @@ class AssistProcessor {
147138
await _addProposal_splitAndCondition();
148139
await _addProposal_splitVariableDeclaration();
149140
await _addProposal_surroundWith();
150-
await _addProposal_useCurlyBraces();
141+
if (!_containsDiagnostic(
142+
LintNames.curly_braces_in_flow_control_structures,
143+
)) {
144+
await _addProposal_useCurlyBraces();
145+
}
151146

152147
if (experimentStatus.control_flow_collections) {
153148
await _addProposal_convertConditionalExpressionToIfElement();
@@ -161,7 +156,7 @@ class AssistProcessor {
161156
}
162157

163158
Future<List<Assist>> computeAssist(AssistKind assistKind) async {
164-
if (!_setupCompute()) {
159+
if (!setupCompute()) {
165160
return assists;
166161
}
167162

@@ -221,6 +216,9 @@ class AssistProcessor {
221216

222217
void _addAssistFromBuilder(DartChangeBuilder builder, AssistKind kind,
223218
{List args = null}) {
219+
if (builder == null) {
220+
return;
221+
}
224222
SourceChange change = builder.sourceChange;
225223
if (change.edits.isEmpty) {
226224
_coverageMarker();
@@ -3855,129 +3853,8 @@ class AssistProcessor {
38553853
}
38563854

38573855
Future<void> _addProposal_useCurlyBraces() async {
3858-
Future<void> doStatement(DoStatement node) async {
3859-
var body = node.body;
3860-
if (body is Block) return;
3861-
3862-
var prefix = utils.getLinePrefix(node.offset);
3863-
var indent = prefix + utils.getIndent(1);
3864-
3865-
var changeBuilder = _newDartChangeBuilder();
3866-
await changeBuilder.addFileEdit(file, (builder) {
3867-
builder.addSimpleReplacement(
3868-
range.endStart(node.doKeyword, body),
3869-
' {$eol$indent',
3870-
);
3871-
builder.addSimpleReplacement(
3872-
range.endStart(body, node.whileKeyword),
3873-
'$eol$prefix} ',
3874-
);
3875-
});
3876-
3877-
_addAssistFromBuilder(changeBuilder, DartAssistKind.USE_CURLY_BRACES);
3878-
}
3879-
3880-
Future<void> forStatement(ForStatement node) async {
3881-
var body = node.body;
3882-
if (body is Block) return;
3883-
3884-
var prefix = utils.getLinePrefix(node.offset);
3885-
var indent = prefix + utils.getIndent(1);
3886-
3887-
var changeBuilder = _newDartChangeBuilder();
3888-
await changeBuilder.addFileEdit(file, (builder) {
3889-
builder.addSimpleReplacement(
3890-
range.endStart(node.rightParenthesis, body),
3891-
' {$eol$indent',
3892-
);
3893-
builder.addSimpleInsertion(body.end, '$eol$prefix}');
3894-
});
3895-
3896-
_addAssistFromBuilder(changeBuilder, DartAssistKind.USE_CURLY_BRACES);
3897-
}
3898-
3899-
Future<void> ifStatement(IfStatement node, Statement thenOrElse) async {
3900-
var prefix = utils.getLinePrefix(node.offset);
3901-
var indent = prefix + utils.getIndent(1);
3902-
3903-
var changeBuilder = _newDartChangeBuilder();
3904-
await changeBuilder.addFileEdit(file, (builder) {
3905-
var thenStatement = node.thenStatement;
3906-
if (thenStatement is! Block &&
3907-
(thenOrElse == null || thenOrElse == thenStatement)) {
3908-
builder.addSimpleReplacement(
3909-
range.endStart(node.rightParenthesis, thenStatement),
3910-
' {$eol$indent',
3911-
);
3912-
if (node.elseKeyword != null) {
3913-
builder.addSimpleReplacement(
3914-
range.endStart(thenStatement, node.elseKeyword),
3915-
'$eol$prefix} ',
3916-
);
3917-
} else {
3918-
builder.addSimpleInsertion(thenStatement.end, '$eol$prefix}');
3919-
}
3920-
}
3921-
3922-
var elseStatement = node.elseStatement;
3923-
if (elseStatement != null &&
3924-
elseStatement is! Block &&
3925-
(thenOrElse == null || thenOrElse == elseStatement)) {
3926-
builder.addSimpleReplacement(
3927-
range.endStart(node.elseKeyword, elseStatement),
3928-
' {$eol$indent',
3929-
);
3930-
builder.addSimpleInsertion(elseStatement.end, '$eol$prefix}');
3931-
}
3932-
});
3933-
3934-
_addAssistFromBuilder(changeBuilder, DartAssistKind.USE_CURLY_BRACES);
3935-
}
3936-
3937-
Future<void> whileStatement(WhileStatement node) async {
3938-
var body = node.body;
3939-
if (body is Block) return;
3940-
3941-
var prefix = utils.getLinePrefix(node.offset);
3942-
var indent = prefix + utils.getIndent(1);
3943-
3944-
var changeBuilder = _newDartChangeBuilder();
3945-
await changeBuilder.addFileEdit(file, (builder) {
3946-
builder.addSimpleReplacement(
3947-
range.endStart(node.rightParenthesis, body),
3948-
' {$eol$indent',
3949-
);
3950-
builder.addSimpleInsertion(body.end, '$eol$prefix}');
3951-
});
3952-
3953-
_addAssistFromBuilder(changeBuilder, DartAssistKind.USE_CURLY_BRACES);
3954-
}
3955-
3956-
var statement = this.node.thisOrAncestorOfType<Statement>();
3957-
var parent = statement?.parent;
3958-
3959-
if (statement is DoStatement) {
3960-
return doStatement(statement);
3961-
} else if (parent is DoStatement) {
3962-
return doStatement(parent);
3963-
} else if (statement is ForStatement) {
3964-
return forStatement(statement);
3965-
} else if (parent is ForStatement) {
3966-
return forStatement(parent);
3967-
} else if (statement is IfStatement) {
3968-
if (statement.elseKeyword != null &&
3969-
range.token(statement.elseKeyword).contains(selectionOffset)) {
3970-
return ifStatement(statement, statement.elseStatement);
3971-
} else {
3972-
return ifStatement(statement, null);
3973-
}
3974-
} else if (parent is IfStatement) {
3975-
return ifStatement(parent, statement);
3976-
} else if (statement is WhileStatement) {
3977-
return whileStatement(statement);
3978-
} else if (parent is WhileStatement) {
3979-
return whileStatement(parent);
3980-
}
3856+
final changeBuilder = await createBuilder_useCurlyBraces();
3857+
_addAssistFromBuilder(changeBuilder, DartAssistKind.USE_CURLY_BRACES);
39813858
}
39823859

39833860
/**
@@ -4014,6 +3891,22 @@ class AssistProcessor {
40143891
}
40153892
}
40163893

3894+
bool _containsDiagnostic(String diagnosticCode) {
3895+
final fileOffset = node.offset;
3896+
for (var error in context.resolveResult.errors) {
3897+
final errorSource = error.source;
3898+
if (file == errorSource.fullName) {
3899+
if (fileOffset >= error.offset &&
3900+
fileOffset <= error.offset + error.length) {
3901+
if (error.errorCode.name == diagnosticCode) {
3902+
return true;
3903+
}
3904+
}
3905+
}
3906+
}
3907+
return false;
3908+
}
3909+
40173910
void _convertFlutterChildToChildren(
40183911
NamedExpression namedExp,
40193912
String eol,
@@ -4213,12 +4106,6 @@ class AssistProcessor {
42134106
return new DartChangeBuilderImpl.forWorkspace(context.workspace);
42144107
}
42154108

4216-
bool _setupCompute() {
4217-
var locator = new NodeLocator(selectionOffset, selectionEnd);
4218-
node = locator.searchWithin(context.resolveResult.unit);
4219-
return node != null;
4220-
}
4221-
42224109
Future<void> _swapParentAndChild(InstanceCreationExpression parent,
42234110
InstanceCreationExpression child, AssistKind kind) async {
42244111
// The child must have its own child.

0 commit comments

Comments
 (0)