| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 library services.refactoring; | |
| 6 | |
| 7 import 'dart:async'; | |
| 8 | |
| 9 import 'package:analysis_services/correction/change.dart'; | |
| 10 import 'package:analysis_services/correction/status.dart'; | |
| 11 import 'package:analysis_services/search/search_engine.dart'; | |
| 12 import 'package:analysis_services/src/refactoring/rename_class_member.dart'; | |
| 13 import 'package:analysis_services/src/refactoring/rename_constructor.dart'; | |
| 14 import 'package:analysis_services/src/refactoring/rename_import.dart'; | |
| 15 import 'package:analysis_services/src/refactoring/rename_library.dart'; | |
| 16 import 'package:analysis_services/src/refactoring/rename_local.dart'; | |
| 17 import 'package:analysis_services/src/refactoring/rename_unit_member.dart'; | |
| 18 import 'package:analyzer/src/generated/element.dart'; | |
| 19 | |
| 20 | |
| 21 /** | |
| 22 * Abstract interface for all refactorings. | |
| 23 */ | |
| 24 abstract class Refactoring { | |
| 25 /** | |
| 26 * The ids of source edits that are not known to be valid. | |
| 27 * | |
| 28 * An edit is not known to be valid if there was insufficient type information | |
| 29 * for the server to be able to determine whether or not the code needs to be | |
| 30 * modified, such as when a member is being renamed and there is a reference | |
| 31 * to a member from an unknown type. This field will be omitted if the change | |
| 32 * field is omitted or if there are no potential edits for the refactoring. | |
| 33 */ | |
| 34 List<String> get potentialEditIds; | |
| 35 | |
| 36 /** | |
| 37 * Returns the human readable name of this [Refactoring]. | |
| 38 */ | |
| 39 String get refactoringName; | |
| 40 | |
| 41 /** | |
| 42 * Checks all conditions - [checkInitialConditions] and | |
| 43 * [checkFinalConditions] to decide if refactoring can be performed. | |
| 44 */ | |
| 45 Future<RefactoringStatus> checkAllConditions(); | |
| 46 | |
| 47 /** | |
| 48 * Validates environment to check if this refactoring can be performed. | |
| 49 * | |
| 50 * This check may be slow, because many refactorings use search engine. | |
| 51 */ | |
| 52 Future<RefactoringStatus> checkFinalConditions(); | |
| 53 | |
| 54 /** | |
| 55 * Validates arguments to check if this refactoring can be performed. | |
| 56 * | |
| 57 * This check should be quick because it is used often as arguments change. | |
| 58 */ | |
| 59 Future<RefactoringStatus> checkInitialConditions(); | |
| 60 | |
| 61 /** | |
| 62 * Returns the [Change] to apply to perform this refactoring. | |
| 63 */ | |
| 64 Future<Change> createChange(); | |
| 65 | |
| 66 /** | |
| 67 * Returs `true` if the [Change] created by refactoring may be unsafe, | |
| 68 * so we want user to review the [Change] to ensure that he understands it. | |
| 69 */ | |
| 70 bool requiresPreview(); | |
| 71 } | |
| 72 | |
| 73 | |
| 74 /** | |
| 75 * Abstract [Refactoring] for renaming some [Element]. | |
| 76 */ | |
| 77 abstract class RenameRefactoring implements Refactoring { | |
| 78 /** | |
| 79 * Returns a new [RenameRefactoring] instance for renaming [element], | |
| 80 * maybe `null` if there is no support for renaming [Element]s of the given | |
| 81 * type. | |
| 82 */ | |
| 83 factory RenameRefactoring(SearchEngine searchEngine, Element element) { | |
| 84 if (element is PropertyAccessorElement) { | |
| 85 element = (element as PropertyAccessorElement).variable; | |
| 86 } | |
| 87 if (element.enclosingElement is CompilationUnitElement) { | |
| 88 return new RenameUnitMemberRefactoringImpl(searchEngine, element); | |
| 89 } | |
| 90 if (element is ConstructorElement) { | |
| 91 return new RenameConstructorRefactoringImpl(searchEngine, element); | |
| 92 } | |
| 93 if (element is ImportElement) { | |
| 94 return new RenameImportRefactoringImpl(searchEngine, element); | |
| 95 } | |
| 96 if (element is LibraryElement) { | |
| 97 return new RenameLibraryRefactoringImpl(searchEngine, element); | |
| 98 } | |
| 99 if (element is LocalElement) { | |
| 100 return new RenameLocalRefactoringImpl(searchEngine, element); | |
| 101 } | |
| 102 if (element.enclosingElement is ClassElement) { | |
| 103 return new RenameClassMemberRefactoringImpl(searchEngine, element); | |
| 104 } | |
| 105 return null; | |
| 106 } | |
| 107 | |
| 108 /** | |
| 109 * Sets the new name for the [Element]. | |
| 110 */ | |
| 111 void set newName(String newName); | |
| 112 | |
| 113 /** | |
| 114 * Returns the old name of the [Element] being renamed. | |
| 115 */ | |
| 116 String get oldName; | |
| 117 | |
| 118 /** | |
| 119 * Validates that the [newName] is a valid identifier and is appropriate for | |
| 120 * the type of the [Element] being renamed. | |
| 121 * | |
| 122 * It does not perform all the checks (such as checking for conflicts with any | |
| 123 * existing names in any of the scopes containing the current name), as many | |
| 124 * of these checkes require search engine. Use [checkFinalConditions] for this | |
| 125 * level of checking. | |
| 126 */ | |
| 127 RefactoringStatus checkNewName(); | |
| 128 } | |
| OLD | NEW |