@@ -8,10 +8,12 @@ import 'dart:collection';
88import 'package:analysis_server/plugin/edit/assist/assist_core.dart' ;
99import 'package:analysis_server/plugin/edit/assist/assist_dart.dart' ;
1010import 'package:analysis_server/src/services/correction/assist.dart' ;
11+ import 'package:analysis_server/src/services/correction/base_processor.dart' ;
1112import 'package:analysis_server/src/services/correction/name_suggestion.dart' ;
1213import 'package:analysis_server/src/services/correction/selection_analyzer.dart' ;
1314import 'package:analysis_server/src/services/correction/statement_analyzer.dart' ;
1415import 'package:analysis_server/src/services/correction/util.dart' ;
16+ import 'package:analysis_server/src/services/linter/lint_names.dart' ;
1517import 'package:analysis_server/src/services/search/hierarchy.dart' ;
1618import 'package:analysis_server/src/utilities/flutter.dart' ;
1719import 'package:analyzer/dart/analysis/session.dart' ;
@@ -36,45 +38,34 @@ import 'package:analyzer_plugin/utilities/assist/assist.dart'
3638import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart' ;
3739import 'package:analyzer_plugin/utilities/range_factory.dart' ;
3840import 'package:meta/meta.dart' ;
39- import 'package:path/path.dart' ;
41+ import 'package:path/path.dart' hide context ;
4042
4143typedef _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