Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(61)

Side by Side Diff: pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart

Issue 2289823002: Issue 27179. Materialize synthetic constructors on rename. (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698