| 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 library services.src.refactoring.rename_constructor; | 5 library services.src.refactoring.rename_constructor; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 | 8 |
| 9 import 'package:analysis_server/src/protocol_server.dart' hide Element; | 9 import 'package:analysis_server/src/protocol_server.dart' hide Element; |
| 10 import 'package:analysis_server/src/services/correction/source_range.dart'; | 10 import 'package:analysis_server/src/services/correction/source_range.dart'; |
| 11 import 'package:analysis_server/src/services/correction/status.dart'; | 11 import 'package:analysis_server/src/services/correction/status.dart'; |
| 12 import 'package:analysis_server/src/services/correction/util.dart'; | 12 import 'package:analysis_server/src/services/correction/util.dart'; |
| 13 import 'package:analysis_server/src/services/refactoring/naming_conventions.dart
'; | 13 import 'package:analysis_server/src/services/refactoring/naming_conventions.dart
'; |
| 14 import 'package:analysis_server/src/services/refactoring/refactoring.dart'; | 14 import 'package:analysis_server/src/services/refactoring/refactoring.dart'; |
| 15 import 'package:analysis_server/src/services/refactoring/refactoring_internal.da
rt'; | 15 import 'package:analysis_server/src/services/refactoring/refactoring_internal.da
rt'; |
| 16 import 'package:analysis_server/src/services/refactoring/rename.dart'; | 16 import 'package:analysis_server/src/services/refactoring/rename.dart'; |
| 17 import 'package:analysis_server/src/services/search/hierarchy.dart'; | 17 import 'package:analysis_server/src/services/search/hierarchy.dart'; |
| 18 import 'package:analysis_server/src/services/search/search_engine.dart'; | 18 import 'package:analysis_server/src/services/search/search_engine.dart'; |
| 19 import 'package:analyzer/dart/ast/ast.dart'; |
| 19 import 'package:analyzer/dart/element/element.dart'; | 20 import 'package:analyzer/dart/element/element.dart'; |
| 20 import 'package:analyzer/src/generated/java_core.dart'; | 21 import 'package:analyzer/src/generated/java_core.dart'; |
| 21 import 'package:analyzer/src/generated/source.dart'; | 22 import 'package:analyzer/src/generated/source.dart'; |
| 22 | 23 |
| 23 /** | 24 /** |
| 24 * A [Refactoring] for renaming [ConstructorElement]s. | 25 * A [Refactoring] for renaming [ConstructorElement]s. |
| 25 */ | 26 */ |
| 26 class RenameConstructorRefactoringImpl extends RenameRefactoringImpl { | 27 class RenameConstructorRefactoringImpl extends RenameRefactoringImpl { |
| 27 RenameConstructorRefactoringImpl( | 28 RenameConstructorRefactoringImpl( |
| 28 SearchEngine searchEngine, ConstructorElement element) | 29 SearchEngine searchEngine, ConstructorElement element) |
| (...skipping 16 matching lines...) Expand all Loading... |
| 45 | 46 |
| 46 @override | 47 @override |
| 47 RefactoringStatus checkNewName() { | 48 RefactoringStatus checkNewName() { |
| 48 RefactoringStatus result = super.checkNewName(); | 49 RefactoringStatus result = super.checkNewName(); |
| 49 result.addStatus(validateConstructorName(newName)); | 50 result.addStatus(validateConstructorName(newName)); |
| 50 return result; | 51 return result; |
| 51 } | 52 } |
| 52 | 53 |
| 53 @override | 54 @override |
| 54 Future fillChange() async { | 55 Future fillChange() async { |
| 55 if (!element.isSynthetic) { | 56 // prepare references |
| 56 // prepare references | 57 List<SearchMatch> matches = await searchEngine.searchReferences(element); |
| 57 List<SearchMatch> matches = await searchEngine.searchReferences(element); | 58 List<SourceReference> references = getSourceReferences(matches); |
| 58 List<SourceReference> references = getSourceReferences(matches); | 59 // append declaration |
| 59 // append declaration | 60 if (element.isSynthetic) { |
| 61 _replaceSynthetic(); |
| 62 } else { |
| 60 references.add(_createDeclarationReference()); | 63 references.add(_createDeclarationReference()); |
| 61 // update references | 64 } |
| 62 String replacement = newName.isEmpty ? '' : '.$newName'; | 65 // update references |
| 63 for (SourceReference reference in references) { | 66 String replacement = newName.isEmpty ? '' : '.$newName'; |
| 64 reference.addEdit(change, replacement); | 67 for (SourceReference reference in references) { |
| 65 } | 68 reference.addEdit(change, replacement); |
| 66 } | 69 } |
| 67 } | 70 } |
| 68 | 71 |
| 69 void _analyzePossibleConflicts(RefactoringStatus result) { | 72 void _analyzePossibleConflicts(RefactoringStatus result) { |
| 70 // check if there are members with "newName" in the same ClassElement | 73 // check if there are members with "newName" in the same ClassElement |
| 71 ClassElement parentClass = element.enclosingElement; | 74 ClassElement parentClass = element.enclosingElement; |
| 72 for (Element newNameMember in getChildren(parentClass, newName)) { | 75 for (Element newNameMember in getChildren(parentClass, newName)) { |
| 73 String message = format( | 76 String message = format( |
| 74 "Class '{0}' already declares {1} with name '{2}'.", | 77 "Class '{0}' already declares {1} with name '{2}'.", |
| 75 parentClass.displayName, | 78 parentClass.displayName, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 88 } | 91 } |
| 89 return new SourceReference(new SearchMatch( | 92 return new SourceReference(new SearchMatch( |
| 90 element.context, | 93 element.context, |
| 91 element.library.source.uri.toString(), | 94 element.library.source.uri.toString(), |
| 92 element.source.uri.toString(), | 95 element.source.uri.toString(), |
| 93 MatchKind.DECLARATION, | 96 MatchKind.DECLARATION, |
| 94 sourceRange, | 97 sourceRange, |
| 95 true, | 98 true, |
| 96 true)); | 99 true)); |
| 97 } | 100 } |
| 101 |
| 102 void _replaceSynthetic() { |
| 103 ClassElement classElement = element.enclosingElement; |
| 104 ClassDeclaration classNode = classElement.computeNode(); |
| 105 CorrectionUtils utils = new CorrectionUtils(classNode.parent); |
| 106 ClassMemberLocation location = |
| 107 utils.prepareNewConstructorLocation(classNode); |
| 108 doSourceChange_addElementEdit( |
| 109 change, |
| 110 classElement, |
| 111 new SourceEdit( |
| 112 location.offset, |
| 113 0, |
| 114 location.prefix + |
| 115 '${classElement.name}.$newName();' + |
| 116 location.suffix)); |
| 117 } |
| 98 } | 118 } |
| OLD | NEW |