mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-05 15:25:49 +02:00
Fix for 191021: Code formatter fails in switch statement: indentation incorrect due to typecast
This commit is contained in:
parent
a7da016b95
commit
4271cea90d
2 changed files with 138 additions and 12 deletions
|
@ -25,6 +25,7 @@ import org.eclipse.cdt.core.dom.ast.IASTArrayModifier;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
|
import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTBreakStatement;
|
import org.eclipse.cdt.core.dom.ast.IASTBreakStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTCaseStatement;
|
import org.eclipse.cdt.core.dom.ast.IASTCaseStatement;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTCastExpression;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
|
import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
|
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTConditionalExpression;
|
import org.eclipse.cdt.core.dom.ast.IASTConditionalExpression;
|
||||||
|
@ -89,6 +90,7 @@ import org.eclipse.cdt.core.dom.ast.c.ICASTElaboratedTypeSpecifier;
|
||||||
import org.eclipse.cdt.core.dom.ast.c.ICASTEnumerationSpecifier;
|
import org.eclipse.cdt.core.dom.ast.c.ICASTEnumerationSpecifier;
|
||||||
import org.eclipse.cdt.core.dom.ast.c.ICASTPointer;
|
import org.eclipse.cdt.core.dom.ast.c.ICASTPointer;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor;
|
import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCastExpression;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorInitializer;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorInitializer;
|
||||||
|
@ -533,10 +535,12 @@ public class CodeFormatterVisitor extends CPPASTVisitor {
|
||||||
visit((IASTBinaryExpression)node);
|
visit((IASTBinaryExpression)node);
|
||||||
} else if (node instanceof IASTLiteralExpression) {
|
} else if (node instanceof IASTLiteralExpression) {
|
||||||
visit((IASTLiteralExpression)node);
|
visit((IASTLiteralExpression)node);
|
||||||
} else if (node instanceof IASTUnaryExpression) {
|
|
||||||
visit((IASTUnaryExpression)node);
|
|
||||||
} else if (node instanceof IASTIdExpression) {
|
} else if (node instanceof IASTIdExpression) {
|
||||||
visit((IASTIdExpression)node);
|
visit((IASTIdExpression)node);
|
||||||
|
} else if (node instanceof IASTCastExpression) {
|
||||||
|
visit((IASTCastExpression)node);
|
||||||
|
} else if (node instanceof IASTUnaryExpression) {
|
||||||
|
visit((IASTUnaryExpression)node);
|
||||||
} else if (node instanceof IASTProblemExpression) {
|
} else if (node instanceof IASTProblemExpression) {
|
||||||
visit((IASTProblemExpression)node);
|
visit((IASTProblemExpression)node);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1290,6 +1294,49 @@ public class CodeFormatterVisitor extends CPPASTVisitor {
|
||||||
return PROCESS_SKIP;
|
return PROCESS_SKIP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int visit(IASTCastExpression node) {
|
||||||
|
switch (node.getOperator()) {
|
||||||
|
case IASTCastExpression.op_cast:
|
||||||
|
scribe.printNextToken(Token.tLPAREN, scribe.printComment());
|
||||||
|
if (scribe.printComment()) {
|
||||||
|
scribe.space();
|
||||||
|
}
|
||||||
|
node.getTypeId().accept(this);
|
||||||
|
scribe.printNextToken(Token.tRPAREN, scribe.printComment());
|
||||||
|
if (scribe.printComment()) {
|
||||||
|
scribe.space();
|
||||||
|
}
|
||||||
|
// operand
|
||||||
|
node.getOperand().accept(this);
|
||||||
|
if (scribe.printComment()) {
|
||||||
|
scribe.space();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ICPPASTCastExpression.op_const_cast:
|
||||||
|
case ICPPASTCastExpression.op_dynamic_cast:
|
||||||
|
case ICPPASTCastExpression.op_reinterpret_cast:
|
||||||
|
case ICPPASTCastExpression.op_static_cast:
|
||||||
|
scribe.printNextToken(peekNextToken(), scribe.printComment());
|
||||||
|
scribe.printNextToken(Token.tLT, scribe.printComment());
|
||||||
|
if (scribe.printComment()) {
|
||||||
|
scribe.space();
|
||||||
|
}
|
||||||
|
node.getTypeId().accept(this);
|
||||||
|
scribe.printNextToken(Token.tGT, scribe.printComment());
|
||||||
|
// operand
|
||||||
|
scribe.printNextToken(Token.tLPAREN, scribe.printComment());
|
||||||
|
node.getOperand().accept(this);
|
||||||
|
scribe.printNextToken(Token.tRPAREN, scribe.printComment());
|
||||||
|
if (scribe.printComment()) {
|
||||||
|
scribe.space();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
skipToNode(node.getOperand());
|
||||||
|
}
|
||||||
|
return PROCESS_SKIP;
|
||||||
|
}
|
||||||
|
|
||||||
private int visit(IASTTypeIdExpression node) {
|
private int visit(IASTTypeIdExpression node) {
|
||||||
scribe.printNextToken(peekNextToken());
|
scribe.printNextToken(peekNextToken());
|
||||||
scribe.printNextToken(Token.tLPAREN);
|
scribe.printNextToken(Token.tLPAREN);
|
||||||
|
@ -1853,23 +1900,44 @@ public class CodeFormatterVisitor extends CPPASTVisitor {
|
||||||
scribe.unIndent();
|
scribe.unIndent();
|
||||||
}
|
}
|
||||||
bracePosition = preferences.brace_position_for_block_in_case;
|
bracePosition = preferences.brace_position_for_block_in_case;
|
||||||
|
try {
|
||||||
formatBlock((IASTCompoundStatement) statement, bracePosition,
|
formatBlock((IASTCompoundStatement) statement, bracePosition,
|
||||||
preferences.insert_space_after_colon_in_case,
|
preferences.insert_space_after_colon_in_case,
|
||||||
preferences.indent_statements_compare_to_block);
|
preferences.indent_statements_compare_to_block);
|
||||||
|
} catch (ASTProblemException e) {
|
||||||
|
if (i < statementsLength - 1) {
|
||||||
|
final IASTStatement nextStatement = (IASTStatement) statements.get(i + 1);
|
||||||
|
skipToNode(nextStatement);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (preferences.indent_switchstatements_compare_to_cases) {
|
if (preferences.indent_switchstatements_compare_to_cases) {
|
||||||
scribe.indent();
|
scribe.indent();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
bracePosition = preferences.brace_position_for_block;
|
bracePosition = preferences.brace_position_for_block;
|
||||||
|
try {
|
||||||
formatBlock((IASTCompoundStatement) statement, bracePosition,
|
formatBlock((IASTCompoundStatement) statement, bracePosition,
|
||||||
preferences.insert_space_before_opening_brace_in_block,
|
preferences.insert_space_before_opening_brace_in_block,
|
||||||
preferences.indent_statements_compare_to_block);
|
preferences.indent_statements_compare_to_block);
|
||||||
|
} catch (ASTProblemException e) {
|
||||||
|
if (i < statementsLength - 1) {
|
||||||
|
final IASTStatement nextStatement = (IASTStatement) statements.get(i + 1);
|
||||||
|
skipToNode(nextStatement);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
wasAStatement = true;
|
wasAStatement = true;
|
||||||
wasACase = false;
|
wasACase = false;
|
||||||
} else {
|
} else {
|
||||||
scribe.startNewLine();
|
scribe.startNewLine();
|
||||||
|
try {
|
||||||
statement.accept(this);
|
statement.accept(this);
|
||||||
|
} catch (ASTProblemException e) {
|
||||||
|
if (i < statementsLength - 1) {
|
||||||
|
final IASTStatement nextStatement = (IASTStatement) statements.get(i + 1);
|
||||||
|
skipToNode(nextStatement);
|
||||||
|
}
|
||||||
|
}
|
||||||
wasAStatement = true;
|
wasAStatement = true;
|
||||||
wasACase = false;
|
wasACase = false;
|
||||||
}
|
}
|
||||||
|
@ -2089,7 +2157,11 @@ public class CodeFormatterVisitor extends CPPASTVisitor {
|
||||||
final int statementsLength = statements.size();
|
final int statementsLength = statements.size();
|
||||||
if (statementsLength > 1) {
|
if (statementsLength > 1) {
|
||||||
IASTStatement previousStatement = (IASTStatement) statements.get(0);
|
IASTStatement previousStatement = (IASTStatement) statements.get(0);
|
||||||
|
try {
|
||||||
previousStatement.accept(this);
|
previousStatement.accept(this);
|
||||||
|
} catch (ASTProblemException e) {
|
||||||
|
skipToNode((IASTStatement) statements.get(1));
|
||||||
|
}
|
||||||
final boolean previousStatementIsNullStmt = previousStatement instanceof IASTNullStatement;
|
final boolean previousStatementIsNullStmt = previousStatement instanceof IASTNullStatement;
|
||||||
for (int i = 1; i < statementsLength - 1; i++) {
|
for (int i = 1; i < statementsLength - 1; i++) {
|
||||||
final IASTStatement statement = (IASTStatement) statements.get(i);
|
final IASTStatement statement = (IASTStatement) statements.get(i);
|
||||||
|
@ -2098,7 +2170,11 @@ public class CodeFormatterVisitor extends CPPASTVisitor {
|
||||||
|| (!previousStatementIsNullStmt && !statementIsNullStmt)) {
|
|| (!previousStatementIsNullStmt && !statementIsNullStmt)) {
|
||||||
scribe.startNewLine();
|
scribe.startNewLine();
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
statement.accept(this);
|
statement.accept(this);
|
||||||
|
} catch (ASTProblemException e) {
|
||||||
|
skipToNode((IASTStatement) statements.get(i + 1));
|
||||||
|
}
|
||||||
previousStatement = statement;
|
previousStatement = statement;
|
||||||
}
|
}
|
||||||
final IASTStatement statement = ((IASTStatement) statements.get(statementsLength - 1));
|
final IASTStatement statement = ((IASTStatement) statements.get(statementsLength - 1));
|
||||||
|
@ -2109,7 +2185,8 @@ public class CodeFormatterVisitor extends CPPASTVisitor {
|
||||||
}
|
}
|
||||||
statement.accept(this);
|
statement.accept(this);
|
||||||
} else {
|
} else {
|
||||||
((IASTStatement) statements.get(0)).accept(this);
|
final IASTStatement statement = (IASTStatement) statements.get(0);
|
||||||
|
statement.accept(this);
|
||||||
}
|
}
|
||||||
if (insertNewLineAfterLastStatement) {
|
if (insertNewLineAfterLastStatement) {
|
||||||
scribe.startNewLine();
|
scribe.startNewLine();
|
||||||
|
|
|
@ -73,4 +73,53 @@ public class CodeFormatterTest extends BaseUITestCase {
|
||||||
fOptions.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_OPENING_PAREN_IN_METHOD_DECLARATION, CCorePlugin.INSERT);
|
fOptions.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_OPENING_PAREN_IN_METHOD_DECLARATION, CCorePlugin.INSERT);
|
||||||
assertFormatterResult();
|
assertFormatterResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//void FailSwitchFormatting(void)
|
||||||
|
//{
|
||||||
|
// switch (confusefomatter)
|
||||||
|
// {
|
||||||
|
//
|
||||||
|
// case START_CONFUSION:
|
||||||
|
// SomeFunctionCallWithTypecast(( castConfusion_t)myvar1,
|
||||||
|
// (castNoAdditionalConfusion_t) myvar2);
|
||||||
|
// break;
|
||||||
|
//
|
||||||
|
// case REVEAL_CONFUSION:
|
||||||
|
// if (myBlockIndentIsOk)
|
||||||
|
// {
|
||||||
|
// myBlockstuff();
|
||||||
|
// }
|
||||||
|
// break;
|
||||||
|
//
|
||||||
|
// case CONTINUE_CONFUSION:
|
||||||
|
// {
|
||||||
|
// //the indentation problem continues...
|
||||||
|
// }
|
||||||
|
// default://....still not right
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
//void FailSwitchFormatting(void) {
|
||||||
|
// switch (confusefomatter) {
|
||||||
|
//
|
||||||
|
// case START_CONFUSION:
|
||||||
|
// SomeFunctionCallWithTypecast(( castConfusion_t)myvar1,
|
||||||
|
// (castNoAdditionalConfusion_t) myvar2);
|
||||||
|
// break;
|
||||||
|
//
|
||||||
|
// case REVEAL_CONFUSION:
|
||||||
|
// if (myBlockIndentIsOk) {
|
||||||
|
// myBlockstuff();
|
||||||
|
// }
|
||||||
|
// break;
|
||||||
|
//
|
||||||
|
// case CONTINUE_CONFUSION: {
|
||||||
|
// //the indentation problem continues...
|
||||||
|
// }
|
||||||
|
// default://....still not right
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
public void testIndentConfusionByCastExpression_Bug191021() throws Exception {
|
||||||
|
assertFormatterResult();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue