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

Bug 363884 - NPE using 'Add break statement' quick fix

Change-Id: I240b196d04b5f032bfaa9666db595b788b7a1d02
Signed-off-by: Nathan Ridge <zeratul976@hotmail.com>
Reviewed-on: https://git.eclipse.org/r/14640
Reviewed-by: Sergey Prigogin <eclipse.sprigogin@gmail.com>
IP-Clean: Sergey Prigogin <eclipse.sprigogin@gmail.com>
Tested-by: Sergey Prigogin <eclipse.sprigogin@gmail.com>
This commit is contained in:
Nathan Ridge 2013-07-18 01:37:08 -04:00 committed by Sergey Prigogin
parent 2dcd01336a
commit 33fcecc5b0
2 changed files with 29 additions and 7 deletions

View file

@ -61,10 +61,6 @@ public class CaseBreakQuickFixBreak extends AbstractAstRewriteQuickFix {
while (beforeBreakNode != null) {
if (beforeBreakNode.getParent() instanceof IASTCompoundStatement
&& beforeBreakNode.getParent().getParent() instanceof IASTSwitchStatement) {
if (beforeBreakNode instanceof IASTCompoundStatement) {
IASTStatement[] statements = ((IASTCompoundStatement) beforeBreakNode).getStatements();
return statements[statements.length - 1]; // return last one
}
return (IASTStatement) beforeBreakNode;
}
beforeBreakNode = beforeBreakNode.getParent();
@ -81,8 +77,16 @@ public class CaseBreakQuickFixBreak extends AbstractAstRewriteQuickFix {
IASTTranslationUnit ast = getTranslationUnitViaEditor(marker).getAST(index, ITranslationUnit.AST_SKIP_INDEXED_HEADERS);
IASTStatement beforeBreak = getStmtBeforeBreak(marker, ast);
if (beforeBreak != null && beforeBreak.getParent() instanceof IASTCompoundStatement) {
IASTCompoundStatement enclosingStatement = (IASTCompoundStatement) beforeBreak.getParent();
IASTStatement after = getAfterStatement(beforeBreak);
IASTCompoundStatement enclosingStatement;
IASTStatement after;
if (beforeBreak instanceof IASTCompoundStatement) {
// Case body is enclosed in braces. Add 'break' as last statement inside braces.
enclosingStatement = (IASTCompoundStatement) beforeBreak;
after = null;
} else {
enclosingStatement = (IASTCompoundStatement) beforeBreak.getParent();
after = getStatementAfter(beforeBreak);
}
ASTRewrite r = ASTRewrite.create(enclosingStatement.getTranslationUnit());
IASTBreakStatement breakStatement = ast.getASTNodeFactory().newBreakStatement();
r.insertBefore(enclosingStatement, after, breakStatement, null);
@ -96,7 +100,7 @@ public class CaseBreakQuickFixBreak extends AbstractAstRewriteQuickFix {
}
}
private IASTStatement getAfterStatement(IASTStatement beforeBreak) {
private IASTStatement getStatementAfter(IASTStatement beforeBreak) {
IASTCompoundStatement enclosingStatement = (IASTCompoundStatement) beforeBreak.getParent();
IASTStatement after = null;
IASTStatement[] statements = enclosingStatement.getStatements();

View file

@ -49,4 +49,22 @@ public class CaseBreakQuickFixTest extends QuickFixTestCase {
String result = runQuickFixOneFile();
assertContainedIn("hello();\t\tbreak;", result);
}
// int main() {
// int a;
// switch(a)
// {
// case 0:
// {
// }
// default:
// break;
// }
// return 0;
// }
public void testNPE_bug363884() throws Exception {
loadcode(getAboveComment());
String result = runQuickFixOneFile();
assertContainedIn("break;\t}\t\t\tdefault:", result);
}
}