1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-24 17:35:35 +02:00

Bug 360378 - Confusing behavior when the current file is not part of the

refactoring working set. Also show preview whenever there are warnings.
This commit is contained in:
Sergey Prigogin 2011-10-12 10:10:34 -07:00
parent 9445f4c6a4
commit 58e5dd61e0
17 changed files with 485 additions and 377 deletions

View file

@ -74,7 +74,7 @@ public class RenameTests extends RefactoringTests {
CRenameProcessor proc= new CRenameProcessor(CRefactory.getInstance(), arg);
proc.setReplacementText( newName );
proc.setSelectedOptions(-1);
proc.setScope(TextSearchWrapper.SCOPE_WORKSPACE);
proc.setExhaustiveSearchScope(TextSearchWrapper.SCOPE_WORKSPACE);
return new CRenameRefactoring(proc);
}
@ -124,8 +124,7 @@ public class RenameTests extends RefactoringTests {
((CRenameProcessor) proc.getProcessor()).lockIndex();
try {
RefactoringStatus rs = checkConditions(proc);
return (rs.getSeverity());
return rs.getSeverity();
} finally {
((CRenameProcessor) proc.getProcessor()).unlockIndex();
}
@ -134,7 +133,7 @@ public class RenameTests extends RefactoringTests {
protected int countOccurrences(String contents, String lookup) {
int idx= contents.indexOf(lookup);
int count= 0;
while (idx >=0) {
while (idx >= 0) {
count++;
idx= contents.indexOf(lookup, idx+lookup.length());
}

View file

@ -57,14 +57,16 @@ public class RefactoringExecutionHelper {
private final int fSaveMode;
private class Operation implements IWorkspaceRunnable {
public Change fChange;
public PerformChangeOperation fPerformChangeOperation;
private final boolean fForked;
private final boolean fForkChangeExecution;
Change fChange;
PerformChangeOperation fPerformChangeOperation;
final boolean fForked;
final boolean fForkChangeExecution;
final boolean fCancelable;
public Operation(boolean forked, boolean forkChangeExecution) {
public Operation(boolean forked, boolean forkChangeExecution, boolean cancelable) {
fForked= forked;
fForkChangeExecution= forkChangeExecution;
this.fCancelable = cancelable;
}
public void run(IProgressMonitor pm) throws CoreException {
@ -72,7 +74,8 @@ public class RefactoringExecutionHelper {
pm.beginTask("", fForked && !fForkChangeExecution ? 7 : 11); //$NON-NLS-1$
pm.subTask(""); //$NON-NLS-1$
final RefactoringStatus status= fRefactoring.checkAllConditions(new SubProgressMonitor(pm, 4, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));
final RefactoringStatus status= fRefactoring.checkAllConditions(
new SubProgressMonitor(pm, 4, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));
if (status.getSeverity() >= fStopSeverity) {
final boolean[] canceled= { false };
if (fForked) {
@ -92,10 +95,7 @@ public class RefactoringExecutionHelper {
fChange= fRefactoring.createChange(new SubProgressMonitor(pm, 2, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));
fChange.initializeValidationData(new SubProgressMonitor(pm, 1, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));
fPerformChangeOperation= new PerformChangeOperation(fChange);//RefactoringUI.createUIAwareChangeOperation(fChange);
fPerformChangeOperation.setUndoManager(RefactoringCore.getUndoManager(), fRefactoring.getName());
if (fRefactoring instanceof IScheduledRefactoring)
fPerformChangeOperation.setSchedulingRule(((IScheduledRefactoring) fRefactoring).getSchedulingRule());
fPerformChangeOperation = createPerformChangeOperation(fChange);
if (!fForked || fForkChangeExecution)
fPerformChangeOperation.run(new SubProgressMonitor(pm, 4, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));
@ -157,15 +157,31 @@ public class RefactoringExecutionHelper {
* @throws InterruptedException thrown when the operation is canceled
* @throws InvocationTargetException thrown when the operation failed to execute
*/
public void perform(boolean fork, boolean forkChangeExecution, boolean cancelable) throws InterruptedException, InvocationTargetException {
public void perform(boolean fork, boolean forkChangeExecution, boolean cancelable)
throws InterruptedException, InvocationTargetException {
Operation operation = new Operation(fork, forkChangeExecution, cancelable);
performOperation(operation, null, fork);
}
public void performChange(Change change, boolean fork)
throws InterruptedException, InvocationTargetException {
PerformChangeOperation operation = createPerformChangeOperation(change);
performOperation(null, operation, fork);
}
/**
* Executes either a complete refactoring operation or a change operation.
* @param operation The refactoring operation. Can be <code>null</code>.
* @param changeOperation The change operation. Has to be <code>null</code> if {@code operation}
* is not <code>null</code> and not <code>null</code> otherwise.
* @param fork If set, the execution will be forked.
*/
private void performOperation(Operation operation, PerformChangeOperation changeOperation, boolean fork)
throws InterruptedException, InvocationTargetException {
Assert.isTrue((operation == null) != (changeOperation == null));
Assert.isTrue(Display.getCurrent() != null);
final IJobManager manager= Job.getJobManager();
final ISchedulingRule rule;
if (fRefactoring instanceof IScheduledRefactoring) {
rule= ((IScheduledRefactoring) fRefactoring).getSchedulingRule();
} else {
rule= ResourcesPlugin.getWorkspace().getRoot();
}
final ISchedulingRule rule = getSchedulingRule();
try {
try {
Runnable r= new Runnable() {
@ -179,17 +195,22 @@ public class RefactoringExecutionHelper {
}
RefactoringSaveHelper saveHelper= new RefactoringSaveHelper(fSaveMode);
if (!saveHelper.saveEditors(fParent))
throw new InterruptedException();
final Operation op= new Operation(fork, forkChangeExecution);
if (operation != null) {
if (!saveHelper.saveEditors(fParent))
throw new InterruptedException();
}
fRefactoring.setValidationContext(fParent);
try {
fExecContext.run(fork, cancelable, new WorkbenchRunnableAdapter(op, rule, true));
if (fork && !forkChangeExecution && op.fPerformChangeOperation != null)
fExecContext.run(false, false, new WorkbenchRunnableAdapter(op.fPerformChangeOperation, rule, true));
if (op.fPerformChangeOperation != null) {
RefactoringStatus validationStatus= op.fPerformChangeOperation.getValidationStatus();
if (operation != null) {
fExecContext.run(fork, operation.fCancelable, new WorkbenchRunnableAdapter(operation, rule, true));
changeOperation = operation.fPerformChangeOperation;
fork = fork && !operation.fForkChangeExecution;
}
if (changeOperation != null) {
if (fork)
fExecContext.run(false, false, new WorkbenchRunnableAdapter(changeOperation, rule, true));
RefactoringStatus validationStatus= changeOperation.getValidationStatus();
if (validationStatus != null && validationStatus.hasFatalError()) {
MessageDialog.openError(fParent, fRefactoring.getName(),
NLS.bind(Messages.RefactoringExecutionHelper_cannot_execute,
@ -198,14 +219,13 @@ public class RefactoringExecutionHelper {
}
}
} catch (InvocationTargetException e) {
PerformChangeOperation pco= op.fPerformChangeOperation;
if (pco != null && pco.changeExecutionFailed()) {
if (changeOperation != null && changeOperation.changeExecutionFailed()) {
ChangeExceptionHandler handler= new ChangeExceptionHandler(fParent, fRefactoring);
Throwable inner= e.getTargetException();
if (inner instanceof RuntimeException) {
handler.handle(pco.getChange(), (RuntimeException)inner);
handler.handle(changeOperation.getChange(), (RuntimeException)inner);
} else if (inner instanceof CoreException) {
handler.handle(pco.getChange(), (CoreException)inner);
handler.handle(changeOperation.getChange(), (CoreException)inner);
} else {
throw e;
}
@ -222,4 +242,20 @@ public class RefactoringExecutionHelper {
fRefactoring.setValidationContext(null);
}
}
private ISchedulingRule getSchedulingRule() {
if (fRefactoring instanceof IScheduledRefactoring) {
return ((IScheduledRefactoring) fRefactoring).getSchedulingRule();
} else {
return ResourcesPlugin.getWorkspace().getRoot();
}
}
private PerformChangeOperation createPerformChangeOperation(Change change) {
PerformChangeOperation operation = new PerformChangeOperation(change);
operation.setUndoManager(RefactoringCore.getUndoManager(), fRefactoring.getName());
if (fRefactoring instanceof IScheduledRefactoring)
operation.setSchedulingRule(((IScheduledRefactoring) fRefactoring).getSchedulingRule());
return operation;
}
}

View file

@ -6,7 +6,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - initial API and implementation
* Markus Schorn - initial API and implementation
******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring.rename;
@ -39,8 +39,8 @@ import org.eclipse.cdt.ui.CUIPlugin;
* can be calculated from the AST.
*/
public class CRefactoringArgument {
private int fOffset= 0;
private int fLength= 0;
private int fOffset;
private int fLength;
private String fText= ""; //$NON-NLS-1$
private int fKind= CRefactory.ARGUMENT_UNKNOWN;
private IFile fFile;
@ -72,22 +72,18 @@ public class CRefactoringArgument {
}
}
// overrider
public String getName() {
return fText;
}
// overrider
public IFile getSourceFile() {
return fFile;
}
// overrider
public int getArgumentKind() {
return fKind;
}
// overrider
public int getOffset() {
return fOffset;
}

View file

@ -6,8 +6,8 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - initial API and implementation
* Sergey Prigogin (Google)
* Markus Schorn - initial API and implementation
* Sergey Prigogin (Google)
******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring.rename;
@ -18,8 +18,6 @@ import java.util.Iterator;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.jface.text.ITextSelection;
@ -29,24 +27,20 @@ import org.eclipse.ui.ide.IDE;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.ui.refactoring.RefactoringStarter;
/**
* Serves to launch the various refactorings.
*/
public class CRefactory {
public static final int OPTION_ASK_SCOPE = 0x01;
public static final int OPTION_IN_COMMENT = 0x02;
public static final int OPTION_IN_STRING_LITERAL = 0x04;
public static final int OPTION_IN_INCLUDE_DIRECTIVE = 0x08;
public static final int OPTION_IN_MACRO_DEFINITION = 0x10;
public static final int OPTION_IN_PREPROCESSOR_DIRECTIVE = 0x20;
public static final int OPTION_IN_INACTIVE_CODE = 0x40;
public static final int OPTION_IN_CODE = 0x80;
public static final int OPTION_DO_VIRTUAL = 0x100;
public static final int OPTION_EXHAUSTIVE_FILE_SEARCH = 0x200;
public static final int OPTION_IN_CODE_REFERENCES = 0x01;
public static final int OPTION_IN_INACTIVE_CODE = 0x02;
public static final int OPTION_IN_COMMENT = 0x04;
public static final int OPTION_IN_STRING_LITERAL = 0x08;
public static final int OPTION_IN_INCLUDE_DIRECTIVE = 0x10;
public static final int OPTION_IN_MACRO_DEFINITION = 0x20;
public static final int OPTION_IN_PREPROCESSOR_DIRECTIVE = 0x40;
public static final int OPTION_DO_VIRTUAL = 0x80;
public static final int OPTION_EXHAUSTIVE_FILE_SEARCH = 0x100;
public static final int ARGUMENT_UNKNOWN = 0;
public static final int ARGUMENT_LOCAL_VAR = 1;
@ -64,7 +58,7 @@ public class CRefactory {
public static final int ARGUMENT_ENUMERATOR = 13;
public static final int ARGUMENT_CLASS_TYPE = 14;
public static final int ARGUMENT_NAMESPACE = 15;
private static CRefactory sInstance= new CRefactory();
private TextSearchWrapper fTextSearch;
@ -83,7 +77,7 @@ public class CRefactory {
CRefactoringArgument iarg= new CRefactoringArgument(arg);
final CRenameProcessor processor = new CRenameProcessor(this, iarg);
CRenameRefactoring refactoring= new CRenameRefactoring(processor);
openDialog(shell, refactoring, false);
RenameSupport.openDialog(shell, refactoring);
}
public void rename(Shell shell, IWorkingCopy workingCopy, ITextSelection selection) {
@ -98,51 +92,7 @@ public class CRefactory {
new CRefactoringArgument((IFile) res, selection.getOffset(), selection.getLength());
final CRenameProcessor processor = new CRenameProcessor(this, iarg);
CRenameRefactoring refactoring= new CRenameRefactoring(processor);
openDialog(shell, refactoring, false);
}
/**
* Opens the refactoring dialog.
*
* <p>
* This method has to be called from within the UI thread.
* </p>
*
* @param shell a shell used as a parent for the refactoring, preview, or error dialog
* @param showPreviewOnly if <code>true</code>, the dialog skips all user input pages and
* directly shows the preview or error page. Otherwise, shows all pages.
* @return <code>true</code> if the refactoring has been executed successfully,
* or <code>false</code> if it has been canceled.
*/
static boolean openDialog(Shell shell, CRenameRefactoring refactoring, boolean showPreviewOnly) {
try {
CRenameRefactoringWizard wizard;
if (!showPreviewOnly) {
wizard = new CRenameRefactoringWizard(refactoring);
} else {
wizard = new CRenameRefactoringWizard(refactoring) {
@Override
protected void addUserInputPages() {
// nothing to add
}
};
wizard.setForcePreviewReview(showPreviewOnly);
}
RefactoringStarter starter = new RefactoringStarter();
CRenameProcessor processor = (CRenameProcessor) refactoring.getProcessor();
processor.lockIndex();
try {
processor.checkInitialConditions(new NullProgressMonitor());
return starter.activate(wizard, shell, RenameMessages.CRefactory_title_rename, processor.getSaveMode());
} finally {
processor.unlockIndex();
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} catch (CoreException e) {
CUIPlugin.log(e);
}
return false;
RenameSupport.openDialog(shell, refactoring);
}
public TextSearchWrapper getTextSearch() {
@ -156,19 +106,19 @@ public class CRefactory {
IContentType[] cts= Platform.getContentTypeManager().getAllContentTypes();
HashSet<String> all= new HashSet<String>();
for (IContentType type : cts) {
boolean useit= false;
while (!useit && type != null) {
boolean useIt= false;
while (!useIt && type != null) {
String id= type.getId();
if (id.equals(CCorePlugin.CONTENT_TYPE_CHEADER) ||
id.equals(CCorePlugin.CONTENT_TYPE_CSOURCE) ||
id.equals(CCorePlugin.CONTENT_TYPE_CXXHEADER) ||
id.equals(CCorePlugin.CONTENT_TYPE_CXXSOURCE)) {
useit= true;
useIt= true;
} else {
type= type.getBaseType();
}
}
if (useit) {
if (useIt) {
String exts[] = type.getFileSpecs(IContentType.FILE_EXTENSION_SPEC);
all.addAll(Arrays.asList(exts));
}

View file

@ -13,7 +13,6 @@ package org.eclipse.cdt.internal.ui.refactoring.rename;
import org.eclipse.cdt.internal.ui.refactoring.RefactoringSaveHelper;
/**
* Rename processor that sets up the input page for renaming a global entity.
*/
@ -21,11 +20,11 @@ public class CRenameGlobalProcessor extends CRenameProcessorDelegate {
public CRenameGlobalProcessor(CRenameProcessor processor, String name) {
super(processor, name);
setAvailableOptions(CRefactory.OPTION_ASK_SCOPE |
CRefactory.OPTION_EXHAUSTIVE_FILE_SEARCH |
CRefactory.OPTION_IN_CODE |
setAvailableOptions(
CRefactory.OPTION_IN_CODE_REFERENCES |
CRefactory.OPTION_IN_COMMENT |
CRefactory.OPTION_IN_MACRO_DEFINITION);
CRefactory.OPTION_IN_MACRO_DEFINITION |
CRefactory.OPTION_EXHAUSTIVE_FILE_SEARCH);
}
@Override

View file

@ -20,12 +20,12 @@ public class CRenameIncludeProcessor extends CRenameProcessorDelegate {
public CRenameIncludeProcessor(CRenameProcessor input, String kind) {
super(input, kind);
setAvailableOptions(CRefactory.OPTION_ASK_SCOPE |
CRefactory.OPTION_EXHAUSTIVE_FILE_SEARCH |
setAvailableOptions(
CRefactory.OPTION_IN_COMMENT |
CRefactory.OPTION_IN_MACRO_DEFINITION);
CRefactory.OPTION_IN_MACRO_DEFINITION |
CRefactory.OPTION_EXHAUSTIVE_FILE_SEARCH);
setOptionsForcingPreview(-1);
setOptionsEnablingScope(-1);
setOptionsEnablingExhaustiveSearch(-1);
}
@Override

View file

@ -40,13 +40,11 @@ public class CRenameLocalProcessor extends CRenameProcessorDelegate {
setOptionsForcingPreview(0);
}
// overrider
@Override
protected int getAcceptedLocations(int selectedOptions) {
return CRefactory.OPTION_IN_CODE | CRefactory.OPTION_IN_MACRO_DEFINITION | selectedOptions;
return CRefactory.OPTION_IN_CODE_REFERENCES | CRefactory.OPTION_IN_MACRO_DEFINITION | selectedOptions;
}
// overrider
@Override
protected int getSearchScope() {
return TextSearchWrapper.SCOPE_FILE;

View file

@ -26,13 +26,13 @@ public class CRenameMacroProcessor extends CRenameGlobalProcessor {
public CRenameMacroProcessor(CRenameProcessor processor, String name) {
super(processor, name);
setAvailableOptions(CRefactory.OPTION_ASK_SCOPE |
CRefactory.OPTION_EXHAUSTIVE_FILE_SEARCH |
CRefactory.OPTION_IN_CODE |
setAvailableOptions(
CRefactory.OPTION_IN_CODE_REFERENCES |
CRefactory.OPTION_IN_COMMENT |
CRefactory.OPTION_IN_PREPROCESSOR_DIRECTIVE);
CRefactory.OPTION_IN_PREPROCESSOR_DIRECTIVE |
CRefactory.OPTION_EXHAUSTIVE_FILE_SEARCH);
}
@Override
protected int getAcceptedLocations(int selectedOptions) {
return selectedOptions | CRefactory.OPTION_IN_MACRO_DEFINITION;

View file

@ -52,13 +52,16 @@ public class CRenameProcessor extends RenameProcessor {
private final CRefactoringArgument fArgument;
private CRenameProcessorDelegate fDelegate;
private String fReplacementText;
private String fWorkingSet;
private int fScope;
private String fWorkingSetName;
private int fExhaustiveSearchScope;
private int fSelectedOptions;
private final CRefactory fManager;
private final ASTManager fAstManager;
private IIndex fIndex;
private int indexLockCount;
private RefactoringStatus fInitialConditionsStatus;
private Change fChange;
public CRenameProcessor(CRefactory refactoringManager, CRefactoringArgument arg) {
fManager= refactoringManager;
@ -70,13 +73,11 @@ public class CRenameProcessor extends RenameProcessor {
return fArgument;
}
// overrider
@Override
public Object[] getElements() {
return new Object[] { fArgument.getBinding() };
}
// overrider
@Override
public String getProcessorName() {
String result= null;
@ -139,15 +140,15 @@ public class CRenameProcessor extends RenameProcessor {
private CRenameProcessorDelegate createDelegate() {
switch (fArgument.getArgumentKind()) {
case CRefactory.ARGUMENT_LOCAL_VAR:
return new CRenameLocalProcessor(this,
return new CRenameLocalProcessor(this,
RenameMessages.CRenameTopProcessor_localVar,
fArgument.getScope());
case CRefactory.ARGUMENT_PARAMETER:
return new CRenameLocalProcessor(this,
return new CRenameLocalProcessor(this,
RenameMessages.CRenameTopProcessor_parameter,
fArgument.getScope());
case CRefactory.ARGUMENT_FILE_LOCAL_VAR:
return new CRenameLocalProcessor(this,
return new CRenameLocalProcessor(this,
RenameMessages.CRenameTopProcessor_filelocalVar,
null);
case CRefactory.ARGUMENT_GLOBAL_VAR:
@ -157,7 +158,7 @@ public class CRenameProcessor extends RenameProcessor {
case CRefactory.ARGUMENT_FIELD:
return new CRenameGlobalProcessor(this, RenameMessages.CRenameTopProcessor_field);
case CRefactory.ARGUMENT_FILE_LOCAL_FUNCTION:
return new CRenameLocalProcessor(this,
return new CRenameLocalProcessor(this,
RenameMessages.CRenameTopProcessor_filelocalFunction,
null);
case CRefactory.ARGUMENT_GLOBAL_FUNCTION:
@ -189,10 +190,18 @@ public class CRenameProcessor extends RenameProcessor {
@Override
public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException {
return fDelegate.createChange(pm);
fChange = fDelegate.createChange(pm);
return fChange;
}
@Override
/**
* @return the change if it has been created, or <code>null</code> otherwise.
*/
Change getChange() {
return fChange;
}
@Override
public RefactoringParticipant[] loadParticipants(RefactoringStatus status,
SharableParticipants sharedParticipants) throws CoreException {
RenameArguments arguments= new RenameArguments(getReplacementText(), true);
@ -206,7 +215,9 @@ public class CRenameProcessor extends RenameProcessor {
return result.toArray(new RefactoringParticipant[result.size()]);
}
// options for the input page in the refactoring wizard
/**
* Options for the input page in the refactoring wizard
*/
public int getAvailableOptions() {
if (fDelegate == null) {
return 0;
@ -214,7 +225,9 @@ public class CRenameProcessor extends RenameProcessor {
return fDelegate.getAvailableOptions();
}
// options for the input page that trigger the preview
/**
* Options for the input page that trigger the preview
*/
public int getOptionsForcingPreview() {
if (fDelegate == null) {
return 0;
@ -222,12 +235,16 @@ public class CRenameProcessor extends RenameProcessor {
return fDelegate.getOptionsForcingPreview();
}
// options for the input page that trigger the preview
public int getOptionsEnablingScope() {
/**
* The options that may need exhaustive file search since index lookup is not guaranteed to
* return all files participating in refactoring. When one of these options is selected,
* the exhaustive file search is enabled.
*/
public int getOptionsEnablingExhaustiveSearch() {
if (fDelegate == null) {
return 0;
}
return fDelegate.getOptionsEnablingScope();
return fDelegate.getOptionsEnablingExhaustiveSearch();
}
@Override
@ -235,12 +252,13 @@ public class CRenameProcessor extends RenameProcessor {
return IDENTIFIER;
}
public int getScope() {
return fScope;
public int getExhaustiveSearchScope() {
return (fSelectedOptions & CRefactory.OPTION_EXHAUSTIVE_FILE_SEARCH) != 0 ?
fExhaustiveSearchScope : TextSearchWrapper.SCOPE_FILE;
}
public void setScope(int scope) {
fScope = scope;
public void setExhaustiveSearchScope(int scope) {
fExhaustiveSearchScope = scope;
}
public int getSelectedOptions() {
@ -251,16 +269,20 @@ public class CRenameProcessor extends RenameProcessor {
fSelectedOptions = selectedOptions;
}
public String getWorkingSet() {
return fWorkingSet;
public boolean isPreviewRequired() {
return (fSelectedOptions & getOptionsForcingPreview()) != 0;
}
public String getWorkingSetName() {
return fWorkingSetName;
}
/**
* Sets the name of the working set. If the name of the working set is invalid,
* it's set to an empty string.
*/
public void setWorkingSet(String workingSet) {
fWorkingSet = checkWorkingSet(workingSet);
public void setWorkingSetName(String workingSet) {
fWorkingSetName = checkWorkingSet(workingSet);
}
public String getReplacementText() {
@ -280,21 +302,26 @@ public class CRenameProcessor extends RenameProcessor {
}
public void lockIndex() throws CoreException, InterruptedException {
if (fIndex == null) {
ICProject[] projects= CoreModel.getDefault().getCModel().getCProjects();
fIndex= CCorePlugin.getIndexManager().getIndex(projects);
if (indexLockCount == 0) {
if (fIndex == null) {
ICProject[] projects= CoreModel.getDefault().getCModel().getCProjects();
fIndex= CCorePlugin.getIndexManager().getIndex(projects);
}
fIndex.acquireReadLock();
}
fIndex.acquireReadLock();
indexLockCount++;
}
public void unlockIndex() {
if (fAstManager != null) {
fAstManager.dispose();
if (--indexLockCount <= 0) {
if (fAstManager != null) {
fAstManager.dispose();
}
if (fIndex != null) {
fIndex.releaseReadLock();
}
fIndex= null;
}
if (fIndex != null) {
fIndex.releaseReadLock();
}
fIndex= null;
}
public IIndex getIndex() {
@ -307,7 +334,7 @@ public class CRenameProcessor extends RenameProcessor {
public int getSaveMode() {
return fDelegate.getSaveMode();
}
private String checkWorkingSet(String workingSet) {
if (workingSet != null && workingSet.length() > 0) {
IWorkingSetManager wsManager= PlatformUI.getWorkbench().getWorkingSetManager();

View file

@ -47,7 +47,6 @@ import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.index.IIndexName;
import org.eclipse.cdt.ui.refactoring.CTextFileChange;
/**
* Abstract base for all different rename processors used by the top processor.
*/
@ -55,23 +54,21 @@ public abstract class CRenameProcessorDelegate {
private CRenameProcessor fTopProcessor;
private ArrayList<CRefactoringMatch> fMatches;
protected String fProcessorBaseName;
private int fAvailableOptions=
CRefactory.OPTION_ASK_SCOPE |
CRefactory.OPTION_EXHAUSTIVE_FILE_SEARCH |
CRefactory.OPTION_IN_CODE |
private int fAvailableOptions=
CRefactory.OPTION_IN_CODE_REFERENCES |
CRefactory.OPTION_IN_COMMENT |
CRefactory.OPTION_IN_MACRO_DEFINITION |
CRefactory.OPTION_IN_STRING_LITERAL;
CRefactory.OPTION_IN_STRING_LITERAL |
CRefactory.OPTION_EXHAUSTIVE_FILE_SEARCH;
private int fOptionsForcingPreview=
CRefactory.OPTION_IN_INACTIVE_CODE |
CRefactory.OPTION_IN_COMMENT |
CRefactory.OPTION_IN_COMMENT |
CRefactory.OPTION_IN_MACRO_DEFINITION |
CRefactory.OPTION_IN_PREPROCESSOR_DIRECTIVE |
CRefactory.OPTION_IN_STRING_LITERAL;
private int fOptionsEnablingScope= fOptionsForcingPreview;
private int fOptionsEnablingExhaustiveSearch= fOptionsForcingPreview |
CRefactory.OPTION_IN_INACTIVE_CODE | CRefactory.OPTION_IN_CODE_REFERENCES;
protected CRenameProcessorDelegate(CRenameProcessor topProcessor, String name) {
fTopProcessor= topProcessor;
@ -87,7 +84,7 @@ public abstract class CRenameProcessorDelegate {
}
final public int getSelectedScope() {
return fTopProcessor.getScope();
return fTopProcessor.getExhaustiveSearchScope();
}
final public int getSelectedOptions() {
@ -95,7 +92,7 @@ public abstract class CRenameProcessorDelegate {
}
final public String getSelectedWorkingSet() {
return fTopProcessor.getWorkingSet();
return fTopProcessor.getWorkingSetName();
}
final public CRefactory getManager() {
@ -142,15 +139,20 @@ public abstract class CRenameProcessorDelegate {
}
/**
* The options that need the scope definition. When one of them is
* selected, the scope options are enabled.
* Sets the options that enable exhaustive file search.
* @see #getOptionsEnablingExhaustiveSearch()
*/
public void setOptionsEnablingScope(int options) {
fOptionsEnablingScope= options;
void setOptionsEnablingExhaustiveSearch(int options) {
fOptionsEnablingExhaustiveSearch= options;
}
final int getOptionsEnablingScope() {
return fOptionsEnablingScope;
/**
* The options that may need exhaustive file search since index lookup is not guaranteed to
* return all files participating in refactoring. When one of these options is selected,
* the exhaustive file search is enabled.
*/
final int getOptionsEnablingExhaustiveSearch() {
return fOptionsEnablingExhaustiveSearch;
}
protected int getSearchScope() {
@ -159,17 +161,15 @@ public abstract class CRenameProcessorDelegate {
/**
* Builds an index-based file filter for the name search.
*
* @param bindings bindings being renamed
* @return A set of files containing references to the bindings, or <code>null</code> if
* exhaustive file search is requested.
* @return A set of files containing references to the bindings.
*/
private Collection<IResource> getFileFilter(IBinding[] bindings) {
if ((getSelectedOptions() & CRefactory.OPTION_EXHAUSTIVE_FILE_SEARCH) != 0) {
return null;
}
private Collection<IFile> getReferringFiles(IBinding[] bindings) {
ArrayList<IFile> files = new ArrayList<IFile>();
IIndex index = getIndex();
if (index == null) {
return null;
return files;
}
Set<IIndexFileLocation> locations = new HashSet<IIndexFileLocation>();
try {
@ -182,21 +182,21 @@ public abstract class CRenameProcessorDelegate {
}
}
} catch (InterruptedException e) {
return null;
return files;
} catch (CoreException e) {
return null;
return files;
} finally {
index.releaseReadLock();
}
ArrayList<IResource> files = new ArrayList<IResource>(locations.size());
files.ensureCapacity(locations.size());
IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
for (IIndexFileLocation location : locations) {
String fullPath= location.getFullPath();
if (fullPath != null) {
IResource file= workspaceRoot.findMember(fullPath);
if (file != null) {
files.add(file);
if (file instanceof IFile) {
files.add((IFile) file);
}
}
}
@ -220,13 +220,12 @@ public abstract class CRenameProcessorDelegate {
// perform text-search
fMatches= new ArrayList<CRefactoringMatch>();
TextSearchWrapper txtSearch= getManager().getTextSearch();
Collection<IResource> fileFilter = getFileFilter(renameBindings);
if (fileFilter != null && !fileFilter.contains(file)) {
fileFilter.add(file);
Collection<IFile> filesToSearch = getReferringFiles(renameBindings);
if (!filesToSearch.contains(file)) {
filesToSearch.add(file);
}
IStatus stat= txtSearch.searchWord(getSearchScope(), file, getSelectedWorkingSet(),
fileFilter != null ? fileFilter.toArray(new IResource[fileFilter.size()]) : null,
getManager().getCCppPatterns(),
IStatus stat= txtSearch.searchWord(filesToSearch.toArray(new IFile[filesToSearch.size()]),
getSearchScope(), file, getSelectedWorkingSet(), getManager().getCCppPatterns(),
getArgument().getName(), new SubProgressMonitor(monitor, 1), fMatches);
if (monitor.isCanceled()) {
throw new OperationCanceledException();
@ -354,7 +353,7 @@ public abstract class CRenameProcessorDelegate {
}
if (match.getAstInformation() != CRefactoringMatch.AST_REFERENCE_OTHER) {
IFile mfile= match.getFile();
if (file==null || !file.equals(mfile) || fileEdit == null || fileChange == null) {
if (file == null || !file.equals(mfile) || fileEdit == null || fileChange == null) {
file= mfile;
fileEdit= new MultiTextEdit();
fileChange = new CTextFileChange(file.getName(), file);

View file

@ -6,9 +6,9 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - initial API and implementation
* Emanuel Graf (Institute for Software, HSR Hochschule fuer Technik)
* Sergey Prigogin (Google)
* Markus Schorn - initial API and implementation
* Emanuel Graf (Institute for Software, HSR Hochschule fuer Technik)
* Sergey Prigogin (Google)
******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring.rename;
@ -45,7 +45,7 @@ public class CRenameRefactoringInputPage extends UserInputWizardPage {
private String fSearchString;
private int fOptions;
private int fForcePreviewOptions= 0;
private int fEnableScopeOptions;
private int fExhaustiveSearchEnablingOptions;
private Text fNewName;
private Button fDoVirtual;
@ -79,7 +79,7 @@ public class CRenameRefactoringInputPage extends UserInputWizardPage {
fSearchString= processor.getArgument().getName();
fOptions= processor.getAvailableOptions();
fForcePreviewOptions= processor.getOptionsForcingPreview();
fEnableScopeOptions= processor.getOptionsEnablingScope();
fExhaustiveSearchEnablingOptions= processor.getOptionsEnablingExhaustiveSearch();
Composite top= new Composite(parent, SWT.NONE);
initializeDialogUnits(top);
@ -87,7 +87,7 @@ public class CRenameRefactoringInputPage extends UserInputWizardPage {
top.setLayout(new GridLayout(2, false));
// new name
// New name
Composite group= top;
GridData gd;
GridLayout gl;
@ -95,7 +95,11 @@ public class CRenameRefactoringInputPage extends UserInputWizardPage {
Label label= new Label(top, SWT.NONE);
label.setText(RenameMessages.CRenameRefactoringInputPage_label_newName);
fNewName= new Text(top, SWT.BORDER);
fNewName.setText(fSearchString);
String name = processor.getReplacementText();
if (name == null) {
name = fSearchString;
}
fNewName.setText(name);
fNewName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
fNewName.selectAll();
@ -106,52 +110,9 @@ public class CRenameRefactoringInputPage extends UserInputWizardPage {
gd.horizontalSpan= 2;
}
if (hasOption(CRefactory.OPTION_ASK_SCOPE)) {
// Specify the scope.
skipLine(top);
label = new Label(top, SWT.NONE);
label.setText(RenameMessages.CRenameRefactoringInputPage_label_scope);
label.setLayoutData(gd= new GridData(GridData.FILL_HORIZONTAL));
gd.horizontalSpan= 2;
group= new Composite(top, SWT.NONE);
group.setLayoutData(gd= new GridData(GridData.FILL_HORIZONTAL));
gd.horizontalSpan= 2;
group.setLayout(gl= new GridLayout(4, false));
gl.marginHeight= 0;
gl.marginLeft = gl.marginWidth;
gl.marginWidth = 0;
fWorkspace= new Button(group, SWT.RADIO);
fWorkspace.setText(RenameMessages.CRenameRefactoringInputPage_button_workspace);
fWorkspace.setLayoutData(gd= new GridData());
fDependent= new Button(group, SWT.RADIO);
fDependent.setText(RenameMessages.CRenameRefactoringInputPage_button_relatedProjects);
fDependent.setLayoutData(gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
gd.horizontalIndent= 8;
fSingle= new Button(group, SWT.RADIO);
fSingle.setText(RenameMessages.CRenameRefactoringInputPage_button_singleProject);
fSingle.setLayoutData(gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
gd.horizontalIndent= 8;
gd.horizontalSpan= 2;
fWorkingSet= new Button(group, SWT.RADIO);
fWorkingSet.setText(RenameMessages.CRenameRefactoringInputPage_button_workingSet);
fWorkingSetSpec= new Text(group, SWT.SINGLE|SWT.BORDER|SWT.READ_ONLY);
fWorkingSetSpec.setLayoutData(gd= new GridData(GridData.FILL_HORIZONTAL));
gd.horizontalIndent= 8;
gd.horizontalSpan= 2;
fWorkingSetButton= new Button(group, SWT.PUSH);
fWorkingSetButton.setText(RenameMessages.CRenameRefactoringInputPage_button_chooseWorkingSet);
setButtonLayoutData(fWorkingSetButton);
}
boolean skippedLine= false;
group= null;
if (hasOption(CRefactory.OPTION_IN_CODE)) {
if (hasOption(CRefactory.OPTION_IN_CODE_REFERENCES)) {
group= createLabelAndGroup(group, skippedLine, top);
fReferences= new Button(group, SWT.CHECK);
fReferences.setText(RenameMessages.CRenameRefactoringInputPage_button_sourceCode);
@ -194,7 +155,43 @@ public class CRenameRefactoringInputPage extends UserInputWizardPage {
fExhausiveFileSearch.setLayoutData(gd= new GridData());
gd.horizontalIndent= 5;
gd.horizontalSpan= 2;
}
// Specify the scope.
group= new Composite(top, SWT.NONE);
group.setLayoutData(gd= new GridData(GridData.FILL_HORIZONTAL));
gd.horizontalSpan= 2;
gd.horizontalIndent= 16;
group.setLayout(gl= new GridLayout(4, false));
gl.marginHeight= 0;
gl.marginLeft = gl.marginWidth;
gl.marginWidth = 0;
fWorkspace= new Button(group, SWT.RADIO);
fWorkspace.setText(RenameMessages.CRenameRefactoringInputPage_button_workspace);
fWorkspace.setLayoutData(gd= new GridData());
fDependent= new Button(group, SWT.RADIO);
fDependent.setText(RenameMessages.CRenameRefactoringInputPage_button_relatedProjects);
fDependent.setLayoutData(gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
gd.horizontalIndent= 8;
fSingle= new Button(group, SWT.RADIO);
fSingle.setText(RenameMessages.CRenameRefactoringInputPage_button_singleProject);
fSingle.setLayoutData(gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
gd.horizontalIndent= 8;
gd.horizontalSpan= 2;
fWorkingSet= new Button(group, SWT.RADIO);
fWorkingSet.setText(RenameMessages.CRenameRefactoringInputPage_button_workingSet);
fWorkingSetSpec= new Text(group, SWT.SINGLE|SWT.BORDER|SWT.READ_ONLY);
fWorkingSetSpec.setLayoutData(gd= new GridData(GridData.FILL_HORIZONTAL));
gd.horizontalIndent= 8;
gd.horizontalSpan= 2;
fWorkingSetButton= new Button(group, SWT.PUSH);
fWorkingSetButton.setText(RenameMessages.CRenameRefactoringInputPage_button_chooseWorkingSet);
setButtonLayoutData(fWorkingSetButton);
}
Dialog.applyDialogFont(top);
hookSelectionListeners();
@ -283,7 +280,7 @@ public class CRenameRefactoringInputPage extends UserInputWizardPage {
}
protected void onSelectedScope(int scope) {
getRenameProcessor().setScope(scope);
getRenameProcessor().setExhaustiveSearchScope(scope);
updateEnablement();
}
@ -328,11 +325,11 @@ public class CRenameRefactoringInputPage extends UserInputWizardPage {
fDependent.setSelection(true);
break;
}
processor.setScope(scope);
processor.setExhaustiveSearchScope(scope);
String workingSet= fPreferences.getWorkingSet();
processor.setWorkingSet(workingSet); // CRenameProcessor validates the working set name.
fWorkingSetSpec.setText(processor.getWorkingSet());
processor.setWorkingSetName(workingSet); // CRenameProcessor validates the working set name.
fWorkingSetSpec.setText(processor.getWorkingSetName());
}
if (fDoVirtual != null) {
@ -343,40 +340,46 @@ public class CRenameRefactoringInputPage extends UserInputWizardPage {
boolean val= !fPreferences.getBoolean(CRenameRefactoringPreferences.KEY_REFERENCES_INV);
fReferences.setSelection(val);
}
initOption(fInInactiveCode, CRenameRefactoringPreferences.KEY_INACTIVE);
initOption(fInComment, CRenameRefactoringPreferences.KEY_COMMENT);
initOption(fInString, CRenameRefactoringPreferences.KEY_STRING);
initOption(fInInclude, CRenameRefactoringPreferences.KEY_INCLUDE);
initOption(fInMacro, CRenameRefactoringPreferences.KEY_MACRO_DEFINITION);
initOption(fInPreprocessor, CRenameRefactoringPreferences.KEY_PREPROCESSOR);
initOption(fInInactiveCode, CRenameRefactoringPreferences.KEY_INACTIVE);
initOption(fExhausiveFileSearch, CRenameRefactoringPreferences.KEY_EXHAUSTIVE_FILE_SEARCH);
}
private int computeSelectedOptions() {
int options= 0;
options |= computeOption(fDoVirtual, CRefactory.OPTION_DO_VIRTUAL);
options |= computeOption(fReferences, CRefactory.OPTION_IN_CODE);
options |= computeOption(fInComment, CRefactory.OPTION_IN_COMMENT);
options |= computeOption(fInString, CRefactory.OPTION_IN_STRING_LITERAL);
options |= computeOption(fInInclude, CRefactory.OPTION_IN_INCLUDE_DIRECTIVE);
options |= computeOption(fInMacro, CRefactory.OPTION_IN_MACRO_DEFINITION);
options |= computeOption(fInPreprocessor, CRefactory.OPTION_IN_PREPROCESSOR_DIRECTIVE);
options |= computeOption(fInInactiveCode, CRefactory.OPTION_IN_INACTIVE_CODE);
options |= computeOption(fExhausiveFileSearch, CRefactory.OPTION_EXHAUSTIVE_FILE_SEARCH);
int options= fPreferences.getOptions();
options = updateOptions(options, fDoVirtual, CRefactory.OPTION_DO_VIRTUAL);
options = updateOptions(options, fInInactiveCode, CRefactory.OPTION_IN_INACTIVE_CODE);
options = updateOptions(options, fInComment, CRefactory.OPTION_IN_COMMENT);
options = updateOptions(options, fInString, CRefactory.OPTION_IN_STRING_LITERAL);
options = updateOptions(options, fInInclude, CRefactory.OPTION_IN_INCLUDE_DIRECTIVE);
options = updateOptions(options, fInMacro, CRefactory.OPTION_IN_MACRO_DEFINITION);
options = updateOptions(options, fInPreprocessor, CRefactory.OPTION_IN_PREPROCESSOR_DIRECTIVE);
options = updateOptions(options, fReferences, CRefactory.OPTION_IN_CODE_REFERENCES);
options = updateOptions(options, fExhausiveFileSearch, CRefactory.OPTION_EXHAUSTIVE_FILE_SEARCH);
return options;
}
private int computeOption(Button button, int option) {
if (button != null && button.getSelection()) {
return option;
private int updateOptions(int options, Button button, int optionMask) {
if (button == null)
return options;
if (button.getSelection()) {
return options | optionMask;
} else {
return options & ~optionMask;
}
return 0;
}
private void initOption(Button button, String key) {
boolean val= false;
initOption(button, key, false);
}
private void initOption(Button button, String key, boolean defaultValue) {
if (button != null) {
val= fPreferences.getBoolean(key);
boolean val= fPreferences.getBoolean(key, defaultValue);
button.setSelection(val);
}
}
@ -444,13 +447,13 @@ public class CRenameRefactoringInputPage extends UserInputWizardPage {
fDependent.setSelection(false);
fSingle.setSelection(false);
fWorkingSet.setSelection(true);
processor.setScope(TextSearchWrapper.SCOPE_WORKING_SET);
processor.setExhaustiveSearchScope(TextSearchWrapper.SCOPE_WORKING_SET);
wsName= ws.getName();
}
}
processor.setWorkingSet(wsName); // CRenameProcessor validates the working set name.
fWorkingSetSpec.setText(processor.getWorkingSet());
processor.setWorkingSetName(wsName); // CRenameProcessor validates the working set name.
fWorkingSetSpec.setText(processor.getWorkingSetName());
updateEnablement();
}
@ -469,22 +472,26 @@ public class CRenameRefactoringInputPage extends UserInputWizardPage {
}
protected void updateEnablement() {
boolean enable= fEnableScopeOptions == -1 ||
(computeSelectedOptions() & fEnableScopeOptions) != 0;
if (fWorkspace != null) {
fWorkspace.setEnabled(enable);
fDependent.setEnabled(enable);
fSingle.setEnabled(enable);
boolean enableSpec= false;
fWorkingSet.setEnabled(enable);
if (enable && fWorkingSet.getSelection()) {
enableSpec= true;
}
fWorkingSetSpec.setEnabled(enableSpec);
fWorkingSetButton.setEnabled(enable);
}
if (fExhausiveFileSearch != null) {
boolean enable= fExhaustiveSearchEnablingOptions == -1 ||
(computeSelectedOptions() & fExhaustiveSearchEnablingOptions) != 0;
fExhausiveFileSearch.setEnabled(enable);
enable = enable && fExhausiveFileSearch.getSelection();
if (fWorkspace != null) {
fWorkspace.setEnabled(enable);
fDependent.setEnabled(enable);
fSingle.setEnabled(enable);
boolean enableSpec= false;
fWorkingSet.setEnabled(enable);
if (enable && fWorkingSet.getSelection()) {
enableSpec= true;
}
fWorkingSetSpec.setEnabled(enableSpec);
fWorkingSetButton.setEnabled(enable);
}
}
}
private CRenameProcessor getRenameProcessor() {

View file

@ -45,6 +45,11 @@ public class CRenameRefactoringPreferences {
return fDialogSettings.getBoolean(key);
}
public boolean getBoolean(String key, boolean defaultValue) {
String value = fDialogSettings.get(key);
return value != null ? Boolean.parseBoolean(value) : defaultValue;
}
public void put(String key, int value) {
fDialogSettings.put(key, value);
}
@ -74,7 +79,9 @@ public class CRenameRefactoringPreferences {
if (!getBoolean(KEY_IGNORE_VIRTUAL))
options |= CRefactory.OPTION_DO_VIRTUAL;
if (!getBoolean(KEY_REFERENCES_INV))
options |= CRefactory.OPTION_IN_CODE;
options |= CRefactory.OPTION_IN_CODE_REFERENCES;
if (getBoolean(KEY_INACTIVE))
options |= CRefactory.OPTION_IN_INACTIVE_CODE;
if (getBoolean(KEY_COMMENT))
options |= CRefactory.OPTION_IN_COMMENT;
if (getBoolean(KEY_STRING))
@ -85,8 +92,6 @@ public class CRenameRefactoringPreferences {
options |= CRefactory.OPTION_IN_MACRO_DEFINITION;
if (getBoolean(KEY_PREPROCESSOR))
options |= CRefactory.OPTION_IN_PREPROCESSOR_DIRECTIVE;
if (getBoolean(KEY_INACTIVE))
options |= CRefactory.OPTION_IN_INACTIVE_CODE;
if (getBoolean(KEY_EXHAUSTIVE_FILE_SEARCH))
options |= CRefactory.OPTION_EXHAUSTIVE_FILE_SEARCH;
return options;

View file

@ -334,8 +334,7 @@ public class RenameLinkedMode {
if (fShowPreview) { // could have been updated by undoAndCreateRenameSupport(..)
executed= renameSupport.openDialog(shell, true);
} else {
renameSupport.perform(shell, fEditor.getSite().getWorkbenchWindow());
executed= true;
executed= renameSupport.perform(shell, fEditor.getSite().getWorkbenchWindow());
}
if (executed) {
restoreFullSelection();
@ -429,10 +428,9 @@ public class RenameLinkedMode {
processor.setReplacementText(newName);
CRenameRefactoringPreferences preferences = new CRenameRefactoringPreferences();
processor.setSelectedOptions(preferences.getOptions());
processor.setScope(preferences.getScope());
processor.setWorkingSet(preferences.getWorkingSet());
RenameSupport renameSupport= RenameSupport.create(processor);
return renameSupport;
processor.setExhaustiveSearchScope(preferences.getScope());
processor.setWorkingSetName(preferences.getWorkingSet());
return RenameSupport.create(processor);
}
private void reconcile() throws CModelException {

View file

@ -77,7 +77,6 @@ public class RenameMessages extends NLS {
public static String CRenameRefactoringInputPage_button_workingSet;
public static String CRenameRefactoringInputPage_errorInvalidIdentifier;
public static String CRenameRefactoringInputPage_label_newName;
public static String CRenameRefactoringInputPage_label_scope;
public static String CRenameRefactoringInputPage_label_updateWithin;
public static String CRenameRefactoringInputPage_renameBaseAndDerivedMethods;
public static String CRenameTopProcessor_enumerator;

View file

@ -66,15 +66,14 @@ CRenameRefactoringInputPage_button_includes=Include directives
CRenameRefactoringInputPage_button_macroDefinitions=Macro definitions
CRenameRefactoringInputPage_button_preprocessor=Other preprocessor directives
CRenameRefactoringInputPage_button_strings=String literals
CRenameRefactoringInputPage_button_exhaustiveFileSearch=Exhaustive file search (slow)
CRenameRefactoringInputPage_button_exhaustiveFileSearch=Exhaustive (slow) file search in:
CRenameRefactoringInputPage_button_singleProject=Project
CRenameRefactoringInputPage_button_relatedProjects=Related projects
CRenameRefactoringInputPage_button_workspace=All projects
CRenameRefactoringInputPage_button_workingSet=Working set:
CRenameRefactoringInputPage_errorInvalidIdentifier=''{0}'' is not a valid identifier
CRenameRefactoringInputPage_label_newName=New Name:
CRenameRefactoringInputPage_label_scope=Scope of Rename:
CRenameRefactoringInputPage_label_updateWithin=Update within:
CRenameRefactoringInputPage_label_updateWithin=Update occurrences in:
CRenameRefactoringInputPage_renameBaseAndDerivedMethods=Rename virtual methods in base and derived classes, also (if any).
CRenameTopProcessor_enumerator=enumerator
CRenameTopProcessor_error_invalidName=The selected name cannot be renamed.

View file

@ -13,19 +13,25 @@ package org.eclipse.cdt.internal.ui.refactoring.rename;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.RefactoringCore;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.ui.refactoring.RefactoringExecutionHelper;
import org.eclipse.cdt.internal.ui.refactoring.RefactoringStarter;
/**
* Central access point to execute rename refactorings.
@ -49,6 +55,13 @@ public class RenameSupport {
/** Flag indicating that the setter method is to be updated as well. */
public static final int UPDATE_SETTER_METHOD= 1 << 5;
/** @see #openDialog(Shell, CRenameRefactoring, DialogMode) */
private enum DialogMode { ALL_PAGES, PREVIEW_ONLY, CONDITIONAL_PREVIEW }
/** @see #openDialog(Shell, CRenameRefactoring, DialogMode) */
private enum DialogResult { OK, CANCELED, SKIPPED }
// Same as org.eclipse.ltk.internal.ui.refactoring.IErrorWizardPage#PAGE_NAME
private static final String ERROR_PAGE_NAME = "ErrorPage"; //$NON-NLS-1$
private CRenameRefactoring fRefactoring;
private RefactoringStatus fPreCheckStatus;
@ -67,7 +80,7 @@ public class RenameSupport {
* @throws CoreException if an unexpected exception occurs while performing the checking.
*
* @see #openDialog(Shell)
* @see #perform(Shell, IRunnableContext)
* @see #perform(Shell, IWorkbenchWindow)
*/
public IStatus preCheck() throws CoreException {
ensureChecked();
@ -80,14 +93,13 @@ public class RenameSupport {
/**
* Opens the refactoring dialog for this rename support.
*
* @param parent a shell used as a parent for the refactoring dialog.
* @throws CoreException if an unexpected exception occurs while opening the
* dialog.
* @param shell a shell used as a parent for the refactoring dialog.
* @throws CoreException if an unexpected exception occurs while opening the dialog.
*
* @see #openDialog(Shell, boolean)
*/
public void openDialog(Shell parent) throws CoreException {
openDialog(parent, false);
public boolean openDialog(Shell shell) throws CoreException {
return openDialog(shell, false);
}
/**
@ -116,7 +128,84 @@ public class RenameSupport {
return false;
}
return CRefactory.openDialog(shell, fRefactoring, showPreviewOnly);
DialogMode mode = showPreviewOnly ? DialogMode.PREVIEW_ONLY : DialogMode.ALL_PAGES;
return openDialog(shell, fRefactoring, mode) == DialogResult.OK;
}
/**
* Opens the refactoring dialog for a given rename refactoring.
*
* @param shell a shell used as a parent for the refactoring dialog.
* @param refactoring the refactoring object.
*
* @see #openDialog(Shell, boolean)
*/
public static void openDialog(Shell shell, CRenameRefactoring refactoring) {
openDialog(shell, refactoring, DialogMode.ALL_PAGES);
}
/**
* Opens the refactoring dialog.
*
* <p>
* This method has to be called from within the UI thread.
* </p>
*
* @param shell A shell used as a parent for the refactoring, preview, or error dialog
* @param refactoring The refactoring.
* @param mode One of DialogMode values. ALL_PAGES opens wizard with all pages shown;
* PREVIEW_ONLY opens the preview page only; CONDITIONAL_PREVIEW opens the wizard with
* preview page only and only if a warning was generated during the final conditions check.
* @return One of DialogResult values. OK is returned if the dialog was shown and
* the refactoring change was applied; CANCELED is returned if the refactoring was
* cancelled. SKIPPED is returned if the dialog was skipped in CONDITIONAL_PREVIEW mode and
* the refactoring change has not been applied yet.
*/
static DialogResult openDialog(Shell shell, CRenameRefactoring refactoring, final DialogMode mode) {
try {
final boolean[] dialogSkipped = new boolean[1];
CRenameRefactoringWizard wizard;
if (mode == DialogMode.ALL_PAGES) {
wizard = new CRenameRefactoringWizard(refactoring);
} else {
wizard = new CRenameRefactoringWizard(refactoring) {
@Override
protected void addUserInputPages() {
// Nothing to add
}
@Override
public IWizardPage getStartingPage() {
IWizardPage startingPage = super.getStartingPage();
if (mode == DialogMode.CONDITIONAL_PREVIEW &&
!startingPage.getName().equals(ERROR_PAGE_NAME)) {
dialogSkipped[0] = true;
return null;
}
return startingPage;
}
};
wizard.setForcePreviewReview(mode != DialogMode.ALL_PAGES);
}
RefactoringStarter starter = new RefactoringStarter();
CRenameProcessor processor = (CRenameProcessor) refactoring.getProcessor();
processor.lockIndex();
try {
processor.checkInitialConditions(new NullProgressMonitor());
if (starter.activate(wizard, shell, RenameMessages.CRefactory_title_rename,
processor.getSaveMode())) {
return DialogResult.OK;
}
return dialogSkipped[0] ? DialogResult.SKIPPED : DialogResult.CANCELED;
} finally {
processor.unlockIndex();
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} catch (CoreException e) {
CUIPlugin.log(e);
}
return DialogResult.CANCELED;
}
/**
@ -139,26 +228,38 @@ public class RenameSupport {
* @see #openDialog(Shell)
* @see IRunnableContext#run(boolean, boolean, org.eclipse.jface.operation.IRunnableWithProgress)
*/
public void perform(Shell parent, IRunnableContext context) throws InterruptedException, InvocationTargetException {
public boolean perform(Shell parent, IWorkbenchWindow context) throws InterruptedException, InvocationTargetException {
try {
ensureChecked();
if (fPreCheckStatus.hasFatalError()) {
showInformation(parent, fPreCheckStatus);
return;
return false;
}
CRenameProcessor renameProcessor = getRenameProcessor();
renameProcessor.lockIndex();
try {
renameProcessor.lockIndex();
fPreCheckStatus = renameProcessor.checkInitialConditions(new NullProgressMonitor());
if (fPreCheckStatus.hasFatalError()) {
showInformation(parent, fPreCheckStatus);
return;
return false;
}
DialogResult result = openDialog(context.getShell(), fRefactoring,
DialogMode.CONDITIONAL_PREVIEW);
switch (result) {
case OK:
return true;
case SKIPPED:
RefactoringExecutionHelper helper= new RefactoringExecutionHelper(fRefactoring,
RefactoringCore.getConditionCheckingFailedSeverity(),
renameProcessor.getSaveMode(), parent, context);
Change change = renameProcessor.getChange();
Assert.isNotNull(change);
helper.performChange(change, true);
return true;
default:
return false;
}
RefactoringExecutionHelper helper= new RefactoringExecutionHelper(fRefactoring,
RefactoringCore.getConditionCheckingFailedSeverity(), renameProcessor.getSaveMode(),
parent, context);
helper.perform(true, true);
} finally {
renameProcessor.unlockIndex();
}

View file

@ -6,8 +6,8 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - initial API and implementation
* Sergey Prigogin (Google)
* Markus Schorn - initial API and implementation
* Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring.rename;
@ -42,7 +42,6 @@ import org.eclipse.search.core.text.TextSearchMatchAccess;
import org.eclipse.search.core.text.TextSearchRequestor;
import org.eclipse.search.core.text.TextSearchScope;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.IWorkingSetManager;
import org.eclipse.ui.PlatformUI;
import org.eclipse.cdt.core.model.CoreModel;
@ -65,28 +64,29 @@ public class TextSearchWrapper {
public final static int SCOPE_WORKING_SET = 5;
private static class SearchScope extends TextSearchScope {
public static SearchScope newSearchScope(IWorkingSet ws, IResource[] filter) {
public static SearchScope newSearchScope(IFile[] files, IWorkingSet ws) {
IAdaptable[] adaptables= ws.getElements();
ArrayList<IResource> resources = new ArrayList<IResource>();
for (int i = 0; i < adaptables.length; i++) {
IAdaptable adaptable = adaptables[i];
IResource r= (IResource) adaptable.getAdapter(IResource.class);
if (r != null) {
resources.add(r);
IResource resource= (IResource) adaptable.getAdapter(IResource.class);
if (resource != null) {
resources.add(resource);
}
}
return newSearchScope(resources.toArray(new IResource[resources.size()]), filter);
return newSearchScope(files, resources.toArray(new IResource[resources.size()]));
}
public static SearchScope newSearchScope(IResource[] roots, IResource[] filter) {
if (filter != null) {
ArrayList<IResource> files = new ArrayList<IResource>(filter.length);
for (IResource file : filter) {
if (isInForest(file, roots)) {
files.add(file);
public static SearchScope newSearchScope(IFile[] files, IResource[] roots) {
if (files != null) {
ArrayList<IResource> resources = new ArrayList<IResource>(files.length + roots.length);
for (IFile file : files) {
if (!isInForest(file, roots)) {
resources.add(file);
}
}
roots = files.toArray(new IResource[files.size()]);
Collections.addAll(resources, roots);
roots = resources.toArray(new IResource[resources.size()]);
}
return new SearchScope(roots);
}
@ -181,93 +181,88 @@ public class TextSearchWrapper {
public TextSearchWrapper() {
}
private TextSearchScope createSearchScope(IFile file, int scope, String workingSetName,
IResource[] filter, String[] patterns) {
private TextSearchScope createSearchScope(IFile[] files, int scope, IFile file,
String workingSetName, String[] patterns) {
switch (scope) {
case SCOPE_WORKSPACE:
return defineSearchScope(file.getWorkspace().getRoot(), filter, patterns);
return defineSearchScope(files, file.getWorkspace().getRoot(), patterns);
case SCOPE_SINGLE_PROJECT:
return defineSearchScope(file.getProject(), filter, patterns);
return defineSearchScope(files, file.getProject(), patterns);
case SCOPE_FILE:
return defineSearchScope(file, filter, patterns);
return defineSearchScope(files, file, patterns);
case SCOPE_WORKING_SET: {
TextSearchScope result= defineWorkingSetAsSearchScope(workingSetName, filter, patterns);
if (result == null) {
result= defineSearchScope(file.getWorkspace().getRoot(), filter, patterns);
}
return result;
return defineWorkingSetAsSearchScope(files, workingSetName, patterns);
}
}
return defineRelatedProjectsAsSearchScope(file.getProject(), filter, patterns);
return defineRelatedProjectsAsSearchScope(files, file.getProject(), patterns);
}
private TextSearchScope defineRelatedProjectsAsSearchScope(IProject project, IResource[] filter, String[] patterns) {
private TextSearchScope defineRelatedProjectsAsSearchScope(IFile[] files, IProject project, String[] patterns) {
HashSet<IProject> projects= new HashSet<IProject>();
LinkedList<IProject> workThrough= new LinkedList<IProject>();
workThrough.add(project);
while (!workThrough.isEmpty()) {
IProject prj= workThrough.removeLast();
if (projects.add(prj)) {
IProject proj= workThrough.removeLast();
if (projects.add(proj)) {
try {
workThrough.addAll(Arrays.asList(prj.getReferencedProjects()));
workThrough.addAll(Arrays.asList(prj.getReferencingProjects()));
workThrough.addAll(Arrays.asList(proj.getReferencedProjects()));
workThrough.addAll(Arrays.asList(proj.getReferencingProjects()));
} catch (CoreException e) {
// need to ignore
}
}
}
IResource[] roots= projects.toArray(new IResource[projects.size()]);
return defineSearchScope(roots, filter, patterns);
return defineSearchScope(files, roots, patterns);
}
private TextSearchScope defineWorkingSetAsSearchScope(String workingSetName, IResource[] filter, String[] patterns) {
if (workingSetName == null) {
return null;
}
IWorkingSetManager wsManager= PlatformUI.getWorkbench().getWorkingSetManager();
IWorkingSet ws= wsManager.getWorkingSet(workingSetName);
if (ws == null) {
return null;
}
SearchScope result= SearchScope.newSearchScope(ws, filter);
private TextSearchScope defineWorkingSetAsSearchScope(IFile[] files, String workingSetName, String[] patterns) {
IWorkingSet workingSet = workingSetName != null ?
PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSet(workingSetName) :
null;
SearchScope result= workingSet != null ?
SearchScope.newSearchScope(files, workingSet) :
SearchScope.newSearchScope(files, new IResource[0]);
applyFilePatterns(result, patterns);
return result;
}
private void applyFilePatterns(SearchScope scope, String[] patterns) {
for (int i = 0; i < patterns.length; i++) {
String pattern = patterns[i];
for (String pattern : patterns) {
scope.addFileNamePattern(pattern);
}
}
private TextSearchScope defineSearchScope(IResource root, IResource[] filter, String[] patterns) {
SearchScope result= SearchScope.newSearchScope(new IResource[] { root }, filter);
private TextSearchScope defineSearchScope(IFile[] files, IResource root, String[] patterns) {
SearchScope result= SearchScope.newSearchScope(files, new IResource[] { root });
applyFilePatterns(result, patterns);
return result;
}
private TextSearchScope defineSearchScope(IResource[] roots, IResource[] filter, String[] patterns) {
SearchScope result= SearchScope.newSearchScope(roots, filter);
private TextSearchScope defineSearchScope(IFile[] files, IResource[] roots, String[] patterns) {
SearchScope result= SearchScope.newSearchScope(files, roots);
applyFilePatterns(result, patterns);
return result;
}
/**
* Searches for a given word.
*
* @param scope One of SCOPE_FILE, SCOPE_WORKSPACE, SCOPE_RELATED_PROJECTS, SCOPE_SINGLE_PROJECT,
* or SCOPE_WORKING_SET.
* @param file The file used as an anchor for the scope.
* @param workingSet The name of a working set. Ignored is scope is not SCOPE_WORKING_SET.
* @param filter If not null, further limits the scope of the search.
*
* @param filesToSearch The files to search.
* @param scope Together with {@code file} and {@code workingSet} defines set of additional
* file to search. One of SCOPE_FILE, SCOPE_WORKSPACE, SCOPE_RELATED_PROJECTS,
* SCOPE_SINGLE_PROJECT, or SCOPE_WORKING_SET.
* @param scopeAnchor The file used as an anchor for the scope.
* @param workingSet The name of a working set. Ignored if {@code scope} is not
* SCOPE_WORKING_SET.
* @param patterns File name patterns.
* @param word The word to search for.
* @param monitor A progress monitor.
* @param target The list that gets populated with search results.
*/
public IStatus searchWord(int scope, IFile file, String workingSet, IResource[] filter, String[] patterns,
String word, IProgressMonitor monitor, final List<CRefactoringMatch> target) {
public IStatus searchWord(IFile[] filesToSearch, int scope, IFile scopeAnchor, String workingSet,
String[] patterns, String word, IProgressMonitor monitor,
final List<CRefactoringMatch> target) {
int startPos= target.size();
TextSearchEngine engine= TextSearchEngine.create();
StringBuilder searchPattern= new StringBuilder(word.length() + 8);
@ -279,7 +274,7 @@ public class TextSearchWrapper {
Pattern pattern= Pattern.compile(searchPattern.toString());
TextSearchScope searchscope= createSearchScope(file, scope, workingSet, filter, patterns);
TextSearchScope searchscope= createSearchScope(filesToSearch, scope, scopeAnchor, workingSet, patterns);
TextSearchRequestor requestor= new TextSearchRequestor() {
@Override
public boolean acceptPatternMatch(TextSearchMatchAccess access) {
@ -360,7 +355,7 @@ public class TextSearchWrapper {
Token token;
int lastState= 0;
while ((token= scanner.nextToken()) != null) {
int state= CRefactory.OPTION_IN_CODE;
int state= CRefactory.OPTION_IN_CODE_REFERENCES;
switch (token.getType()) {
case Token.tLINECOMMENT:
case Token.tBLOCKCOMMENT:
@ -382,7 +377,7 @@ public class TextSearchWrapper {
break;
}
if (state != lastState) {
locations.add(new int[] {token.getOffset(), state});
locations.add(new int[] { token.getOffset(), state });
lastState= state;
}
}