1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-09 01:05:38 +02:00

Fixed IllegalStateException in Extract Function refactoring.

This commit is contained in:
Sergey Prigogin 2012-03-19 19:29:36 -07:00
parent cc1209d029
commit d4a53f3f5b
7 changed files with 19 additions and 15 deletions

View file

@ -911,8 +911,11 @@ abstract class FlowAnalyzer extends ASTGenericVisitor {
if (binding instanceof IVariable) { if (binding instanceof IVariable) {
IVariable variable= (IVariable) binding; IVariable variable= (IVariable) binding;
if (!(variable instanceof IField)) { if (!(variable instanceof IField)) {
int accessMode = CPPVariableReadWriteFlags.getReadWriteFlags(node); int index = fFlowContext.getIndexFromLocal(variable);
setFlowInfo(node, new LocalFlowInfo(variable, accessMode, fFlowContext)); if (index >= 0) {
int accessMode = CPPVariableReadWriteFlags.getReadWriteFlags(node);
setFlowInfo(node, new LocalFlowInfo(variable, index, accessMode, fFlowContext));
}
} }
} }
return PROCESS_SKIP; return PROCESS_SKIP;

View file

@ -16,11 +16,11 @@ import org.eclipse.cdt.core.dom.ast.IVariable;
class LocalFlowInfo extends FlowInfo { class LocalFlowInfo extends FlowInfo {
private final int fVariableIndex; private final int fVariableIndex;
public LocalFlowInfo(IVariable binding, int localAccessMode, FlowContext context) { public LocalFlowInfo(IVariable binding, int variableIndex, int localAccessMode, FlowContext context) {
super(NO_RETURN); super(NO_RETURN);
fVariableIndex= context.getIndexFromLocal(binding); if (variableIndex < 0)
if (fVariableIndex < 0) throw new IllegalArgumentException("Invalid index for local variable \"" + binding.getName()); //$NON-NLS-1$
throw new IllegalStateException("Invalid local variable \"" + binding.getName() + "\" for the context."); //$NON-NLS-1$ //$NON-NLS-2$ fVariableIndex= variableIndex;
if (context.considerAccessMode()) { if (context.considerAccessMode()) {
createAccessModeArray(context); createAccessModeArray(context);
context.manageLocal(binding); context.manageLocal(binding);

View file

@ -132,16 +132,16 @@ public abstract class CRefactoring extends Refactoring {
public RefactoringStatus checkInitialConditions(IProgressMonitor pm) public RefactoringStatus checkInitialConditions(IProgressMonitor pm)
throws CoreException, OperationCanceledException { throws CoreException, OperationCanceledException {
SubMonitor sm = SubMonitor.convert(pm, 10); SubMonitor sm = SubMonitor.convert(pm, 10);
sm.subTask(Messages.Refactoring_PM_LoadTU); if (isProgressMonitorCanceled(sm, initStatus)) {
if (isProgressMonitorCanceld(sm, initStatus)) {
return initStatus; return initStatus;
} }
sm.subTask(Messages.Refactoring_PM_LoadTU);
IASTTranslationUnit ast = getAST(tu, sm); IASTTranslationUnit ast = getAST(tu, sm);
if (ast == null) { if (ast == null) {
initStatus.addError(NLS.bind(Messages.Refactoring_ParsingError, tu.getPath())); initStatus.addError(NLS.bind(Messages.Refactoring_ParsingError, tu.getPath()));
return initStatus; return initStatus;
} }
if (isProgressMonitorCanceld(sm, initStatus)) { if (isProgressMonitorCanceled(sm, initStatus)) {
return initStatus; return initStatus;
} }
sm.subTask(Messages.Refactoring_PM_CheckTU); sm.subTask(Messages.Refactoring_PM_CheckTU);
@ -152,7 +152,7 @@ public abstract class CRefactoring extends Refactoring {
return initStatus; return initStatus;
} }
protected static boolean isProgressMonitorCanceld(IProgressMonitor sm, RefactoringStatus status) { protected static boolean isProgressMonitorCanceled(IProgressMonitor sm, RefactoringStatus status) {
if (sm.isCanceled()) { if (sm.isCanceled()) {
status.addFatalError(Messages.Refactoring_CanceledByUser); status.addFatalError(Messages.Refactoring_CanceledByUser);
return true; return true;

View file

@ -278,6 +278,7 @@ public class NameInformation {
if (!isWriteAccess) { if (!isWriteAccess) {
indirection = Indirection.REFERENCE; indirection = Indirection.REFERENCE;
} }
// TODO(sprigogin): Verify availability of the copy ctor before passing by value
} else { } else {
indirection = Indirection.POINTER; indirection = Indirection.POINTER;
} }

View file

@ -173,7 +173,7 @@ public class ExtractFunctionRefactoring extends CRefactoring {
nodeFactory = ast.getASTNodeFactory(); nodeFactory = ast.getASTNodeFactory();
container = findExtractableNodes(); container = findExtractableNodes();
if (isProgressMonitorCanceld(sm, initStatus)) if (isProgressMonitorCanceled(sm, initStatus))
return initStatus; return initStatus;
if (container.isEmpty()) { if (container.isEmpty()) {

View file

@ -114,7 +114,7 @@ public class ExtractLocalVariableRefactoring extends CRefactoring {
} }
sm.worked(1); sm.worked(1);
if (isProgressMonitorCanceld(sm, initStatus)) if (isProgressMonitorCanceled(sm, initStatus))
return initStatus; return initStatus;
boolean oneMarked = selectedRegion != null && isOneMarked(container.getNodesToWrite(), selectedRegion); boolean oneMarked = selectedRegion != null && isOneMarked(container.getNodesToWrite(), selectedRegion);
@ -125,7 +125,7 @@ public class ExtractLocalVariableRefactoring extends CRefactoring {
} }
sm.worked(1); sm.worked(1);
if (isProgressMonitorCanceld(sm, initStatus)) if (isProgressMonitorCanceled(sm, initStatus))
return initStatus; return initStatus;
sm.worked(1); sm.worked(1);

View file

@ -93,7 +93,7 @@ public class HideMethodRefactoring extends CRefactoring {
return initStatus; return initStatus;
} }
if (isProgressMonitorCanceld(sm, initStatus)) if (isProgressMonitorCanceled(sm, initStatus))
return initStatus; return initStatus;
List<IASTName> names = findAllMarkedNames(); List<IASTName> names = findAllMarkedNames();
@ -118,7 +118,7 @@ public class HideMethodRefactoring extends CRefactoring {
return initStatus; return initStatus;
} }
if (isProgressMonitorCanceld(sm, initStatus)) if (isProgressMonitorCanceled(sm, initStatus))
return initStatus; return initStatus;
if (methodDeclaration instanceof IASTFunctionDefinition) { if (methodDeclaration instanceof IASTFunctionDefinition) {
IASTDeclarator declarator = ((IASTFunctionDefinition) methodDeclaration).getDeclarator(); IASTDeclarator declarator = ((IASTFunctionDefinition) methodDeclaration).getDeclarator();