OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 import 'dart:async'; | 5 import 'dart:async'; |
6 import 'dart:collection'; | 6 import 'dart:collection'; |
7 import 'dart:core'; | 7 import 'dart:core'; |
8 | 8 |
9 import 'package:analysis_server/plugin/edit/fix/fix_core.dart'; | 9 import 'package:analysis_server/plugin/edit/fix/fix_core.dart'; |
10 import 'package:analysis_server/plugin/edit/fix/fix_dart.dart'; | 10 import 'package:analysis_server/plugin/edit/fix/fix_dart.dart'; |
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 } | 389 } |
390 if (errorCode == StaticTypeWarningCode.UNDEFINED_SETTER) { | 390 if (errorCode == StaticTypeWarningCode.UNDEFINED_SETTER) { |
391 await _addFix_undefinedClassAccessor_useSimilar(); | 391 await _addFix_undefinedClassAccessor_useSimilar(); |
392 await _addFix_createField(); | 392 await _addFix_createField(); |
393 } | 393 } |
394 if (errorCode == CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER || | 394 if (errorCode == CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER || |
395 errorCode == StaticWarningCode.UNDEFINED_NAMED_PARAMETER) { | 395 errorCode == StaticWarningCode.UNDEFINED_NAMED_PARAMETER) { |
396 await _addFix_convertFlutterChild(); | 396 await _addFix_convertFlutterChild(); |
397 await _addFix_convertFlutterChildren(); | 397 await _addFix_convertFlutterChildren(); |
398 } | 398 } |
| 399 if (errorCode == |
| 400 CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD) { |
| 401 await _addFix_createField_initializingFormal(); |
| 402 } |
399 // lints | 403 // lints |
400 if (errorCode is LintCode) { | 404 if (errorCode is LintCode) { |
401 if (errorCode.name == LintNames.annotate_overrides) { | 405 if (errorCode.name == LintNames.annotate_overrides) { |
402 await _addFix_addOverrideAnnotation(); | 406 await _addFix_addOverrideAnnotation(); |
403 } | 407 } |
404 if (errorCode.name == LintNames.avoid_annotating_with_dynamic) { | 408 if (errorCode.name == LintNames.avoid_annotating_with_dynamic) { |
405 await _addFix_removeTypeName(); | 409 await _addFix_removeTypeName(); |
406 } | 410 } |
407 if (errorCode.name == LintNames.avoid_init_to_null) { | 411 if (errorCode.name == LintNames.avoid_init_to_null) { |
408 await _addFix_removeInitializer(); | 412 await _addFix_removeInitializer(); |
(...skipping 765 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1174 utils.targetClassElement = targetClassElement; | 1178 utils.targetClassElement = targetClassElement; |
1175 // prepare target ClassDeclaration | 1179 // prepare target ClassDeclaration |
1176 AstNode targetTypeNode = getParsedClassElementNode(targetClassElement); | 1180 AstNode targetTypeNode = getParsedClassElementNode(targetClassElement); |
1177 if (targetTypeNode is! ClassDeclaration) { | 1181 if (targetTypeNode is! ClassDeclaration) { |
1178 return; | 1182 return; |
1179 } | 1183 } |
1180 ClassDeclaration targetClassNode = targetTypeNode; | 1184 ClassDeclaration targetClassNode = targetTypeNode; |
1181 // prepare location | 1185 // prepare location |
1182 ClassMemberLocation targetLocation = | 1186 ClassMemberLocation targetLocation = |
1183 utils.prepareNewFieldLocation(targetClassNode); | 1187 utils.prepareNewFieldLocation(targetClassNode); |
1184 // build method source | 1188 // build field source |
1185 Source targetSource = targetClassElement.source; | 1189 Source targetSource = targetClassElement.source; |
1186 String targetFile = targetSource.fullName; | 1190 String targetFile = targetSource.fullName; |
1187 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1191 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
1188 await changeBuilder.addFileEdit(targetFile, targetSource.modificationStamp, | 1192 await changeBuilder.addFileEdit(targetFile, targetSource.modificationStamp, |
1189 (DartFileEditBuilder builder) { | 1193 (DartFileEditBuilder builder) { |
1190 Expression fieldTypeNode = climbPropertyAccess(nameNode); | 1194 Expression fieldTypeNode = climbPropertyAccess(nameNode); |
1191 DartType fieldType = _inferUndefinedExpressionType(fieldTypeNode); | 1195 DartType fieldType = _inferUndefinedExpressionType(fieldTypeNode); |
1192 builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) { | 1196 builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) { |
1193 builder.write(targetLocation.prefix); | 1197 builder.write(targetLocation.prefix); |
1194 builder.writeFieldDeclaration(name, | 1198 builder.writeFieldDeclaration(name, |
1195 isStatic: staticModifier, | 1199 isStatic: staticModifier, |
1196 nameGroupName: 'NAME', | 1200 nameGroupName: 'NAME', |
1197 type: fieldType, | 1201 type: fieldType, |
1198 typeGroupName: 'TYPE'); | 1202 typeGroupName: 'TYPE'); |
1199 builder.write(targetLocation.suffix); | 1203 builder.write(targetLocation.suffix); |
1200 }); | 1204 }); |
1201 }); | 1205 }); |
1202 _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_FIELD, args: [name]); | 1206 _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_FIELD, args: [name]); |
1203 } | 1207 } |
1204 | 1208 |
| 1209 Future<Null> _addFix_createField_initializingFormal() async { |
| 1210 // |
| 1211 // Ensure that we are in an initializing formal parameter. |
| 1212 // |
| 1213 FieldFormalParameter parameter = |
| 1214 node.getAncestor((node) => node is FieldFormalParameter); |
| 1215 if (parameter == null) { |
| 1216 return; |
| 1217 } |
| 1218 ClassDeclaration targetClassNode = |
| 1219 parameter.getAncestor((node) => node is ClassDeclaration); |
| 1220 if (targetClassNode == null) { |
| 1221 return; |
| 1222 } |
| 1223 SimpleIdentifier nameNode = parameter.identifier; |
| 1224 String name = nameNode.name; |
| 1225 ClassMemberLocation targetLocation = |
| 1226 utils.prepareNewFieldLocation(targetClassNode); |
| 1227 // |
| 1228 // Add proposal. |
| 1229 // |
| 1230 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1231 await changeBuilder.addFileEdit(file, fileStamp, |
| 1232 (DartFileEditBuilder builder) { |
| 1233 DartType fieldType = parameter.type?.type; |
| 1234 builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) { |
| 1235 builder.write(targetLocation.prefix); |
| 1236 builder.writeFieldDeclaration(name, |
| 1237 nameGroupName: 'NAME', type: fieldType, typeGroupName: 'TYPE'); |
| 1238 builder.write(targetLocation.suffix); |
| 1239 }); |
| 1240 }); |
| 1241 _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_FIELD, args: [name]); |
| 1242 } |
| 1243 |
1205 Future<Null> _addFix_createFunction_forFunctionType() async { | 1244 Future<Null> _addFix_createFunction_forFunctionType() async { |
1206 if (node is SimpleIdentifier) { | 1245 if (node is SimpleIdentifier) { |
1207 SimpleIdentifier nameNode = node as SimpleIdentifier; | 1246 SimpleIdentifier nameNode = node as SimpleIdentifier; |
1208 // prepare argument expression (to get parameter) | 1247 // prepare argument expression (to get parameter) |
1209 ClassElement targetElement; | 1248 ClassElement targetElement; |
1210 Expression argument; | 1249 Expression argument; |
1211 { | 1250 { |
1212 Expression target = getQualifiedPropertyTarget(node); | 1251 Expression target = getQualifiedPropertyTarget(node); |
1213 if (target != null) { | 1252 if (target != null) { |
1214 DartType targetType = target.bestType; | 1253 DartType targetType = target.bestType; |
(...skipping 1960 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3175 } | 3214 } |
3176 } | 3215 } |
3177 } | 3216 } |
3178 | 3217 |
3179 void _updateList(Iterable<Element> elements) { | 3218 void _updateList(Iterable<Element> elements) { |
3180 for (Element element in elements) { | 3219 for (Element element in elements) { |
3181 _update(element); | 3220 _update(element); |
3182 } | 3221 } |
3183 } | 3222 } |
3184 } | 3223 } |
OLD | NEW |