| /* |
| * Copyright (c) 2014, the Dart project authors. |
| * |
| * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except |
| * in compliance with the License. You may obtain a copy of the License at |
| * |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Unless required by applicable law or agreed to in writing, software distributed under the License |
| * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
| * or implied. See the License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| |
| package com.google.dart.engine.services.internal.refactoring; |
| |
| import com.google.dart.engine.element.angular.AngularElement; |
| import com.google.dart.engine.search.SearchEngine; |
| import com.google.dart.engine.search.SearchMatch; |
| import com.google.dart.engine.services.change.Change; |
| import com.google.dart.engine.services.change.CompositeChange; |
| import com.google.dart.engine.services.change.SourceChange; |
| import com.google.dart.engine.services.change.SourceChangeManager; |
| import com.google.dart.engine.services.refactoring.ProgressMonitor; |
| import com.google.dart.engine.services.refactoring.Refactoring; |
| import com.google.dart.engine.services.status.RefactoringStatus; |
| import com.google.dart.engine.source.Source; |
| |
| import java.util.List; |
| |
| /** |
| * {@link Refactoring} for renaming some {@link AngularElement}. |
| */ |
| abstract public class RenameAngularElementRefactoringImpl extends RenameRefactoringImpl { |
| protected final AngularElement element; |
| protected SourceChangeManager changeManager; |
| |
| public RenameAngularElementRefactoringImpl(SearchEngine searchEngine, AngularElement element) { |
| super(searchEngine, element); |
| this.element = element; |
| } |
| |
| @Override |
| public RefactoringStatus checkFinalConditions(ProgressMonitor pm) throws Exception { |
| pm = checkProgressMonitor(pm); |
| pm.beginTask("Checking final conditions", 1); |
| try { |
| return new RefactoringStatus(); |
| } finally { |
| pm.done(); |
| } |
| } |
| |
| @Override |
| public RefactoringStatus checkNewName(String newName) { |
| RefactoringStatus result = new RefactoringStatus(); |
| result.merge(super.checkNewName(newName)); |
| result.merge(checkNameSyntax(newName)); |
| result.merge(checkNameConflicts(newName)); |
| return result; |
| } |
| |
| @Override |
| public Change createChange(ProgressMonitor pm) throws Exception { |
| pm = checkProgressMonitor(pm); |
| try { |
| changeManager = new SourceChangeManager(); |
| // update declaration |
| { |
| Source elementSource = element.getSource(); |
| SourceChange elementChange = changeManager.get(elementSource); |
| addDeclarationEdit(elementChange, element); |
| } |
| // update references |
| List<SearchMatch> matches = searchEngine.searchReferences(element, null, null); |
| List<SourceReference> references = getSourceReferences(matches); |
| for (SourceReference reference : references) { |
| SourceChange refChange = changeManager.get(reference.source); |
| addReferenceEdit(refChange, reference); |
| } |
| // additional changes |
| createAdditionalChanges(); |
| // return CompositeChange |
| CompositeChange compositeChange = new CompositeChange(getRefactoringName()); |
| compositeChange.add(changeManager.getChanges()); |
| return compositeChange; |
| } finally { |
| pm.done(); |
| } |
| } |
| |
| /** |
| * Checks if {@link AngularElement} with the given name will conflict with any existing element. |
| */ |
| protected abstract RefactoringStatus checkNameConflicts(String newName); |
| |
| /** |
| * Check if the given name is valid for the {@link AngularElement} being renamed. |
| */ |
| protected abstract RefactoringStatus checkNameSyntax(String newName); |
| |
| /** |
| * Subclasses may override this method to contribute additional changes to {@link #changeManager}. |
| */ |
| protected void createAdditionalChanges() throws Exception { |
| } |
| } |