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:
parent
2dcd01336a
commit
33fcecc5b0
2 changed files with 29 additions and 7 deletions
|
@ -61,10 +61,6 @@ public class CaseBreakQuickFixBreak extends AbstractAstRewriteQuickFix {
|
||||||
while (beforeBreakNode != null) {
|
while (beforeBreakNode != null) {
|
||||||
if (beforeBreakNode.getParent() instanceof IASTCompoundStatement
|
if (beforeBreakNode.getParent() instanceof IASTCompoundStatement
|
||||||
&& beforeBreakNode.getParent().getParent() instanceof IASTSwitchStatement) {
|
&& 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;
|
return (IASTStatement) beforeBreakNode;
|
||||||
}
|
}
|
||||||
beforeBreakNode = beforeBreakNode.getParent();
|
beforeBreakNode = beforeBreakNode.getParent();
|
||||||
|
@ -81,8 +77,16 @@ public class CaseBreakQuickFixBreak extends AbstractAstRewriteQuickFix {
|
||||||
IASTTranslationUnit ast = getTranslationUnitViaEditor(marker).getAST(index, ITranslationUnit.AST_SKIP_INDEXED_HEADERS);
|
IASTTranslationUnit ast = getTranslationUnitViaEditor(marker).getAST(index, ITranslationUnit.AST_SKIP_INDEXED_HEADERS);
|
||||||
IASTStatement beforeBreak = getStmtBeforeBreak(marker, ast);
|
IASTStatement beforeBreak = getStmtBeforeBreak(marker, ast);
|
||||||
if (beforeBreak != null && beforeBreak.getParent() instanceof IASTCompoundStatement) {
|
if (beforeBreak != null && beforeBreak.getParent() instanceof IASTCompoundStatement) {
|
||||||
IASTCompoundStatement enclosingStatement = (IASTCompoundStatement) beforeBreak.getParent();
|
IASTCompoundStatement enclosingStatement;
|
||||||
IASTStatement after = getAfterStatement(beforeBreak);
|
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());
|
ASTRewrite r = ASTRewrite.create(enclosingStatement.getTranslationUnit());
|
||||||
IASTBreakStatement breakStatement = ast.getASTNodeFactory().newBreakStatement();
|
IASTBreakStatement breakStatement = ast.getASTNodeFactory().newBreakStatement();
|
||||||
r.insertBefore(enclosingStatement, after, breakStatement, null);
|
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();
|
IASTCompoundStatement enclosingStatement = (IASTCompoundStatement) beforeBreak.getParent();
|
||||||
IASTStatement after = null;
|
IASTStatement after = null;
|
||||||
IASTStatement[] statements = enclosingStatement.getStatements();
|
IASTStatement[] statements = enclosingStatement.getStatements();
|
||||||
|
|
|
@ -49,4 +49,22 @@ public class CaseBreakQuickFixTest extends QuickFixTestCase {
|
||||||
String result = runQuickFixOneFile();
|
String result = runQuickFixOneFile();
|
||||||
assertContainedIn("hello();\t\tbreak;", result);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue