1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 08:55:25 +02:00

Fixed interaction between refactoring and a team provider.

This commit is contained in:
Sergey Prigogin 2012-03-23 18:46:12 -07:00
parent 018eb7334b
commit 12f003ec60
4 changed files with 39 additions and 17 deletions

View file

@ -15,6 +15,7 @@ package org.eclipse.cdt.internal.ui.refactoring;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory;
import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IProgressMonitor;
@ -72,6 +73,7 @@ public abstract class CRefactoring extends Refactoring {
protected Region selectedRegion; protected Region selectedRegion;
protected final RefactoringStatus initStatus; protected final RefactoringStatus initStatus;
protected CRefactoringContext refactoringContext; protected CRefactoringContext refactoringContext;
private ModificationCollector modificationCollector;
public CRefactoring(ICElement element, ISelection selection, ICProject project) { public CRefactoring(ICElement element, ISelection selection, ICProject project) {
this.project = project; this.project = project;
@ -107,10 +109,15 @@ public abstract class CRefactoring extends Refactoring {
throws CoreException, OperationCanceledException { throws CoreException, OperationCanceledException {
if (pm == null) if (pm == null)
pm = new NullProgressMonitor(); pm = new NullProgressMonitor();
pm.beginTask(Messages.CRefactoring_checking_final_conditions, 6); pm.beginTask(Messages.CRefactoring_checking_final_conditions, 10);
CheckConditionsContext context = createCheckConditionsContext(); CheckConditionsContext context= new CheckConditionsContext();
RefactoringStatus result = checkFinalConditions(new SubProgressMonitor(pm, 5), context); context.add(new ValidateEditChecker(getValidationContext()));
ResourceChangeChecker resourceChecker = new ResourceChangeChecker();
IResourceChangeDescriptionFactory deltaFactory = resourceChecker.getDeltaFactory();
context.add(resourceChecker);
RefactoringStatus result = checkFinalConditions(new SubProgressMonitor(pm, 8), context);
if (result.hasFatalError()) { if (result.hasFatalError()) {
pm.done(); pm.done();
return result; return result;
@ -118,7 +125,11 @@ public abstract class CRefactoring extends Refactoring {
if (pm.isCanceled()) if (pm.isCanceled())
throw new OperationCanceledException(); throw new OperationCanceledException();
result.merge(context.check(new SubProgressMonitor(pm, 1))); modificationCollector = new ModificationCollector(deltaFactory);
collectModifications(pm, modificationCollector);
result.merge(context.check(new SubProgressMonitor(pm, 2)));
pm.done(); pm.done();
return result; return result;
} }
@ -162,9 +173,7 @@ public abstract class CRefactoring extends Refactoring {
@Override @Override
public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException { public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException {
ModificationCollector collector = new ModificationCollector(); CCompositeChange finalChange = modificationCollector.createFinalChange();
collectModifications(pm, collector);
CCompositeChange finalChange = collector.createFinalChange();
finalChange.setDescription(new RefactoringChangeDescriptor(getRefactoringDescriptor())); finalChange.setDescription(new RefactoringChangeDescriptor(getRefactoringDescriptor()));
return finalChange; return finalChange;
} }
@ -222,13 +231,6 @@ public abstract class CRefactoring extends Refactoring {
return names; return names;
} }
private CheckConditionsContext createCheckConditionsContext() throws CoreException {
CheckConditionsContext result= new CheckConditionsContext();
result.add(new ValidateEditChecker(getValidationContext()));
result.add(new ResourceChangeChecker());
return result;
}
private class ProblemFinder extends ASTVisitor { private class ProblemFinder extends ASTVisitor {
private boolean problemFound = false; private boolean problemFound = false;
private final RefactoringStatus status; private final RefactoringStatus status;

View file

@ -8,6 +8,7 @@
* *
* Contributors: * Contributors:
* Institute for Software - initial API and implementation * Institute for Software - initial API and implementation
* Sergey Prigogin (Google)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring; package org.eclipse.cdt.internal.ui.refactoring;
@ -16,6 +17,7 @@ import java.io.InputStream;
import java.net.URI; import java.net.URI;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IPath;
@ -24,6 +26,7 @@ import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.ltk.core.refactoring.Change; import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.resource.ResourceChange;
import org.eclipse.osgi.util.NLS; import org.eclipse.osgi.util.NLS;
/** /**
@ -31,7 +34,7 @@ import org.eclipse.osgi.util.NLS;
* *
* @author Emanuel Graf * @author Emanuel Graf
*/ */
public class CreateFileChange extends Change { public class CreateFileChange extends ResourceChange {
private String name; private String name;
private final IPath path; private final IPath path;
private final String source; private final String source;
@ -50,7 +53,7 @@ public class CreateFileChange extends Change {
} }
@Override @Override
public Object getModifiedElement() { public IResource getModifiedResource() {
return ResourcesPlugin.getWorkspace().getRoot().getFile(path); return ResourcesPlugin.getWorkspace().getRoot().getFile(path);
} }

View file

@ -8,6 +8,7 @@
* *
* Contributors: * Contributors:
* Institute for Software - initial API and implementation * Institute for Software - initial API and implementation
* Sergey Prigogin (Google)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring; package org.eclipse.cdt.internal.ui.refactoring;
@ -16,6 +17,8 @@ import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory;
import org.eclipse.ltk.core.refactoring.Change; import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.CompositeChange; import org.eclipse.ltk.core.refactoring.CompositeChange;
@ -29,15 +32,27 @@ import org.eclipse.cdt.core.dom.rewrite.ASTRewrite;
* @author Mirko Stocker * @author Mirko Stocker
*/ */
public class ModificationCollector { public class ModificationCollector {
private final IResourceChangeDescriptionFactory deltaFactory;
// Each translation unit can have only one ASTRewrite // Each translation unit can have only one ASTRewrite
private final Map<IASTTranslationUnit, ASTRewrite> rewriters = private final Map<IASTTranslationUnit, ASTRewrite> rewriters =
new HashMap<IASTTranslationUnit, ASTRewrite>(); new HashMap<IASTTranslationUnit, ASTRewrite>();
private Collection<CreateFileChange> changes; private Collection<CreateFileChange> changes;
public ModificationCollector() {
this(null);
}
public ModificationCollector(IResourceChangeDescriptionFactory deltaFactory) {
this.deltaFactory = deltaFactory;
}
public ASTRewrite rewriterForTranslationUnit(IASTTranslationUnit ast) { public ASTRewrite rewriterForTranslationUnit(IASTTranslationUnit ast) {
if (!rewriters.containsKey(ast)) { if (!rewriters.containsKey(ast)) {
rewriters.put(ast, ASTRewrite.create(ast)); rewriters.put(ast, ASTRewrite.create(ast));
if (deltaFactory != null)
deltaFactory.change((IFile) ast.getOriginatingTranslationUnit().getResource());
} }
return rewriters.get(ast); return rewriters.get(ast);
} }
@ -48,6 +63,8 @@ public class ModificationCollector {
changes = new ArrayList<CreateFileChange>(); changes = new ArrayList<CreateFileChange>();
} }
changes.add(change); changes.add(change);
if (deltaFactory != null)
deltaFactory.create(change.getModifiedResource());
} }
public CCompositeChange createFinalChange() { public CCompositeChange createFinalChange() {

View file

@ -129,7 +129,7 @@ public class ParameterNamesInputPage extends UserInputWizardPage {
public String createFunctionDefinitionSignature(IProgressMonitor monitor) { public String createFunctionDefinitionSignature(IProgressMonitor monitor) {
try { try {
ModificationCollector collector = new ModificationCollector(); ModificationCollector collector = new ModificationCollector();
ImplementMethodRefactoring implementMethodRefactoring = (ImplementMethodRefactoring)wizard.getRefactoring(); ImplementMethodRefactoring implementMethodRefactoring = (ImplementMethodRefactoring) wizard.getRefactoring();
CCompositeChange finalChange = null; CCompositeChange finalChange = null;
// We can have multiple preview jobs. We don't // We can have multiple preview jobs. We don't
// want multiple jobs concurrently using the same ASTs // want multiple jobs concurrently using the same ASTs