/*******************************************************************************
* Copyright (c) 2008, 2014 Institute for Software, HSR Hochschule fuer Technik
* Rapperswil, University of applied sciences and others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Institute for Software - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.core.parser.tests.rewrite.changegenerator;
import static org.eclipse.cdt.internal.core.dom.rewrite.ASTModification.ModificationKind.APPEND_CHILD;
import static org.eclipse.cdt.core.dom.ast.IASTLiteralExpression.lk_integer_constant;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTArrayModifier;
import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTDeclarationStatement;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTExpressionList;
import org.eclipse.cdt.core.dom.ast.IASTForStatement;
import org.eclipse.cdt.core.dom.ast.IASTIdExpression;
import org.eclipse.cdt.core.dom.ast.IASTIfStatement;
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
import org.eclipse.cdt.core.dom.ast.IASTInitializerClause;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTPointer;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTStandardFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTStatement;
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTBinaryExpression;
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.ICPPASTDeclarator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLiteralExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNewExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTParameterDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleDeclSpecifier;
import org.eclipse.cdt.internal.core.dom.rewrite.ASTModificationStore;
public class AppendTests extends ChangeGeneratorTest {
public static TestSuite suite() {
return new TestSuite(AppendTests.class);
}
//int *pi[5];
//int *pi[5][3];
public void testArrayModifier() throws Exception {
compareResult(new ASTVisitor() {
{
shouldVisitDeclarators = true;
}
@Override
public int visit(IASTDeclarator declarator) {
if (declarator instanceof IASTArrayDeclarator) {
IASTExpression expr = factory.newLiteralExpression(lk_integer_constant, "3");
IASTArrayModifier newModifier = factory.newArrayModifier(expr);
addModification(null, APPEND_CHILD, declarator, newModifier);
return PROCESS_ABORT;
}
return PROCESS_CONTINUE;
}
});
}
//int *values = new int[6];
//int *values = new int[6][5];
public void testArraySizeExpression() throws Exception {
compareResult(new ASTVisitor() {
{
shouldVisitExpressions = true;
}
@Override
public int visit(IASTExpression expression) {
if (expression instanceof ICPPASTNewExpression) {
ICPPASTNewExpression newExpression = (ICPPASTNewExpression) expression;
IASTTypeId id = newExpression.getTypeId();
IASTArrayDeclarator dtor = (IASTArrayDeclarator) id.getAbstractDeclarator();
IASTArrayModifier[] mods = dtor.getArrayModifiers();
IASTExpression expr = factory.newLiteralExpression(lk_integer_constant, "5");
IASTArrayModifier add = factory.newArrayModifier(expr);
addModification(null, APPEND_CHILD, dtor, add);
return PROCESS_ABORT;
}
return PROCESS_CONTINUE;
}
});
}
//TestClass::TestClass(int a, int b) :
// beta(b) {
//}
//
//TestClass::TestClass(int a, int b) :
// beta(b), alpha(a) {
//}
//
public void testCtorChainInitializer() throws Exception {
compareResult(new ASTVisitor() {
{
shouldVisitDeclarations = true;
}
@Override
public int visit(IASTDeclaration decl) {
if (decl instanceof ICPPASTFunctionDefinition) {
IASTIdExpression idExpression = factory.newIdExpression(factory.newName("a".toCharArray()));
IASTInitializer initExpr = factory.newConstructorInitializer(new IASTInitializerClause[] { idExpression });
IASTName initName = factory.newName("alpha".toCharArray());
ICPPASTConstructorChainInitializer newInitializer = factory.newConstructorChainInitializer(initName, initExpr);
addModification(null, APPEND_CHILD, decl, newInitializer);
return PROCESS_ABORT;
}
return PROCESS_CONTINUE;
}
});
}
//void foo(int parameter) {
//}
//void foo(int parameter) throw (int) {
//}
public void testException() throws Exception {
compareResult(new ASTVisitor() {
{
shouldVisitDeclarators = true;
}
@Override
public int visit(IASTDeclarator declarator) {
if (declarator instanceof ICPPASTFunctionDeclarator) {
ICPPASTDeclarator exceptionDeclarator = factory.newDeclarator(factory.newName());
ICPPASTSimpleDeclSpecifier exDeclSpec = factory.newSimpleDeclSpecifier();
exDeclSpec.setType(IASTSimpleDeclSpecifier.t_int);
IASTTypeId exception = factory.newTypeId(exDeclSpec, exceptionDeclarator);
addModification(null, APPEND_CHILD, declarator, exception);
return PROCESS_ABORT;
}
return PROCESS_CONTINUE;
}
});
}
//void main() {
// int s = 0, c = 0, h = 0;
// s = 3, h = 5;
//}
//void main() {
// int s = 0, c = 0, h = 0;
// s = 3, h = 5, c = 9;
//}
public void testExpression() throws Exception {
compareResult(new ASTVisitor() {
{
shouldVisitExpressions = true;
}
@Override
public int visit(IASTExpression expression) {
if (expression instanceof IASTExpressionList) {
IASTName name = factory.newName("c".toCharArray());
IASTIdExpression leftOperand = factory.newIdExpression(name);
ICPPASTLiteralExpression rightOperand = factory.newLiteralExpression(lk_integer_constant, "9");
ICPPASTBinaryExpression binEx = factory.newBinaryExpression(IASTBinaryExpression.op_assign, leftOperand, rightOperand);
addModification(null, APPEND_CHILD, expression, binEx);
return PROCESS_ABORT;
}
return PROCESS_CONTINUE;
}
});
}
//void foo(bool cond1, bool cond2) {
//}
//void foo(bool cond1, bool cond2) {
// if (cond1) {
// } else if (cond2) {
// }
//}
public void testNestedElseifStatement() throws Exception {
compareResult(new ASTVisitor() {
{
shouldVisitStatements = true;
}
@Override
public int visit(IASTStatement statement) {
if (statement instanceof IASTCompoundStatement) {
IASTIdExpression elseIfCondition = factory.newIdExpression(factory.newName("cond2".toCharArray()));
IASTStatement elseIfThen = factory.newCompoundStatement();
IASTIfStatement elseIfStatement = factory.newIfStatement(elseIfCondition, elseIfThen, null);
IASTIdExpression ifCondition = factory.newIdExpression(factory.newName("cond1".toCharArray()));
IASTStatement ifThen = factory.newCompoundStatement();
IASTIfStatement ifStatement = factory.newIfStatement(ifCondition, ifThen, elseIfStatement);
addModification(null, APPEND_CHILD, statement, ifStatement);
return PROCESS_ABORT;
}
return PROCESS_ABORT;
}
});
}
//void foo(int existing) {
//}
//void foo(int existing, int newParameter) {
//}
public void testParameter() throws Exception {
compareResult(new ASTVisitor() {
{
shouldVisitDeclarators = true;
}
@Override
public int visit(IASTDeclarator declarator) {
if (declarator instanceof ICPPASTFunctionDeclarator) {
IASTName parameterName = factory.newName("newParameter".toCharArray());
ICPPASTDeclarator paramDeclarator = factory.newDeclarator(parameterName);
paramDeclarator.setName(parameterName);
ICPPASTSimpleDeclSpecifier declSpec = factory.newSimpleDeclSpecifier();
declSpec.setType(IASTSimpleDeclSpecifier.t_int);
ICPPASTParameterDeclaration insertedParameter = factory.newParameterDeclaration(declSpec, paramDeclarator);
addModification(null, APPEND_CHILD, declarator, insertedParameter);
return PROCESS_ABORT;
}
return PROCESS_CONTINUE;
}
});
}
//void foo() {
//}
//void foo(int newParameter) {
//}
public void testParameterToList() throws Exception {
compareResult(new ASTVisitor() {
{
shouldVisitDeclarators = true;
}
@Override
public int visit(IASTDeclarator declarator) {
if (declarator instanceof ICPPASTFunctionDeclarator) {
IASTName parameterName = factory.newName("newParameter".toCharArray());
ICPPASTDeclarator parameterDeclarator = factory.newDeclarator(parameterName);
ICPPASTSimpleDeclSpecifier parameterDeclSpec = factory.newSimpleDeclSpecifier();
parameterDeclSpec.setType(IASTSimpleDeclSpecifier.t_int);
ICPPASTParameterDeclaration insertedParameter = factory.newParameterDeclaration(parameterDeclSpec, parameterDeclarator);
addModification(null, APPEND_CHILD, declarator, insertedParameter);
return PROCESS_ABORT;
}
return PROCESS_CONTINUE;
}
});
}
//void foo(int parameter) {
//}
//void foo(int *parameter) {
//}
public void testPointerToParamter() throws Exception {
compareResult(new ASTVisitor() {
{
shouldVisitDeclarators = true;
}
@Override
public int visit(IASTDeclarator declarator) {
if (declarator instanceof ICPPASTFunctionDeclarator) {
ICPPASTFunctionDeclarator functionDeclarator = (ICPPASTFunctionDeclarator) declarator;
IASTParameterDeclaration[] parameters = functionDeclarator.getParameters();
for (IASTParameterDeclaration curParam : parameters) {
IASTDeclarator paramDeclarator = curParam.getDeclarator();
IASTName name = paramDeclarator.getName();
if (name.toString().equals("parameter")) {
IASTPointer addedPointer = factory.newPointer();
addModification(null, APPEND_CHILD, paramDeclarator, addedPointer);
return PROCESS_ABORT;
}
}
}
return PROCESS_CONTINUE;
}
});
}
//void foo(int *parameter) {
//}
//void foo(int **parameter) {
//}
public void testPointerToPointerParameter() throws Exception {
compareResult(new ASTVisitor() {
{
shouldVisitDeclarators = true;
}
@Override
public int visit(IASTDeclarator declarator) {
if (declarator instanceof ICPPASTFunctionDeclarator) {
ICPPASTFunctionDeclarator functionDeclarator = (ICPPASTFunctionDeclarator) declarator;
IASTParameterDeclaration[] parameters = functionDeclarator.getParameters();
for (IASTParameterDeclaration curParam : parameters) {
IASTDeclarator paramDeclarator = curParam.getDeclarator();
IASTName name = paramDeclarator.getName();
if (name.toString().equals("parameter")) {
IASTPointer addedPointer = factory.newPointer();
addModification(null, APPEND_CHILD, paramDeclarator, addedPointer);
return PROCESS_ABORT;
}
}
}
return PROCESS_CONTINUE;
}
});
}
//class A
//{
//public:
// A();
// virtual ~A();
// int foo();
//
//private:
// int help();
//};
//class A
//{
//public:
// A();
// virtual ~A();
// int foo();
//
//private:
// int help();
// int exp(int i);
//};
public void testAddDeclarationBugTest() throws Exception {
compareResult(new ASTVisitor() {
{
shouldVisitDeclSpecifiers = true;
}
@Override
public int visit(IASTDeclSpecifier declSpec) {
if (declSpec instanceof ICPPASTCompositeTypeSpecifier) {
IASTSimpleDeclSpecifier returnType = factory.newSimpleDeclSpecifier();
returnType.setType(IASTSimpleDeclSpecifier.t_int);
IASTSimpleDeclaration functionDeclaration = factory.newSimpleDeclaration(returnType);
IASTName functionName = factory.newName("exp".toCharArray());
IASTStandardFunctionDeclarator declarator = factory.newFunctionDeclarator(functionName);
IASTSimpleDeclSpecifier paramType = factory.newSimpleDeclSpecifier();
paramType.setType(IASTSimpleDeclSpecifier.t_int);
IASTName paramName = factory.newName("i".toCharArray());
IASTDeclarator decl = factory.newDeclarator(paramName);
ICPPASTParameterDeclaration param = factory.newParameterDeclaration(paramType, decl);
declarator.addParameterDeclaration(param);
functionDeclaration.addDeclarator(declarator);
addModification(null, APPEND_CHILD, declSpec, functionDeclaration);
return PROCESS_ABORT;
}
return PROCESS_CONTINUE;
}
});
}
//void foo() {
// for (int i = 0; i < 10; i++) {
//
//
// }
//}
//void foo() {
// for (int i = 0; i < 10; i++) {
// int i;
// int j;
// }
//}
public void testMultilineWhitespaceHandling() throws Exception {
compareResult(new ASTVisitor() {
{
shouldVisitStatements = true;
}
@Override
public int visit(IASTStatement statement) {
if (statement instanceof IASTForStatement) {
IASTForStatement forStatement = (IASTForStatement) statement;
IASTStatement compoundStatement = forStatement.getBody();
addIntDeclaration(modStore, compoundStatement, "i");
addIntDeclaration(modStore, compoundStatement, "j");
}
return PROCESS_CONTINUE;
}
private void addIntDeclaration(final ASTModificationStore modStore, IASTStatement compoundStatement,
String variableName) {
ICPPASTSimpleDeclSpecifier newSimpleDeclSpecifier = factory.newSimpleDeclSpecifier();
newSimpleDeclSpecifier.setType(IASTSimpleDeclSpecifier.t_int);
IASTSimpleDeclaration newSimpleDeclaration = factory.newSimpleDeclaration(newSimpleDeclSpecifier);
newSimpleDeclaration.addDeclarator(factory.newDeclarator(factory.newName(variableName.toCharArray())));
IASTDeclarationStatement newDeclaration = factory.newDeclarationStatement(newSimpleDeclaration);
addModification(null, APPEND_CHILD, compoundStatement, newDeclaration);
}
});
}
//void foo() {
//
// for(int i = 0; i < 10; i++){
//
// }
//void foo() {
// for (int i = 0; i < 10; i++) {
// }
//}
public void testAppendNull() throws Exception {
compareResult(new ASTVisitor() {
{
shouldVisitStatements = true;
}
@Override
public int visit(IASTStatement statement) {
if (statement instanceof IASTCompoundStatement) {
addModification(null, APPEND_CHILD, statement, null);
return PROCESS_ABORT;
}
return PROCESS_CONTINUE;
}
});
}
//void foo() {
//
// for (int i = 0; i < 10; i++) {
// }
//}
//
//void foo() {
//
// for (int i = 0; i < 10; i++) {
// for (int i = 0; i < 10; i++) {
// }
// }
//}
//
public void testSelfInsertion() throws Exception {
compareResult(new ASTVisitor() {
{
shouldVisitStatements = true;
}
@Override
public int visit(IASTStatement statement) {
if (statement instanceof IASTForStatement) {
IASTForStatement forStatement = (IASTForStatement) statement;
IASTStatement compoundStatement = forStatement.getBody();
addModification(null, APPEND_CHILD, compoundStatement, forStatement);
return PROCESS_ABORT;
}
return PROCESS_CONTINUE;
}
});
}
}