1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Fixes parsing of declarations and new expressions, bug 84242+236856.

This commit is contained in:
Markus Schorn 2008-06-18 12:16:19 +00:00
parent 03a4e6e5aa
commit 4e28c73769
70 changed files with 3030 additions and 2492 deletions

View file

@ -25,6 +25,7 @@ import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
import org.eclipse.cdt.core.dom.ast.IASTCastExpression;
import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
import org.eclipse.cdt.core.dom.ast.IASTConditionalExpression;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
@ -35,6 +36,7 @@ import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTIdExpression;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTStatement;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
@ -544,23 +546,35 @@ public class AST2BaseTest extends BaseTestCase {
assertEquals(count, sum);
}
final protected IASTFunctionDefinition getFunctionDefinition(IASTTranslationUnit tu, int i_decl) {
final protected <T extends IASTDeclaration> T getDeclaration(IASTTranslationUnit tu, int i_decl) {
Class<T> tclass;
IASTDeclaration[] decls= tu.getDeclarations();
assertTrue(decls.length > i_decl);
assertInstance(decls[i_decl], IASTFunctionDefinition.class);
return (IASTFunctionDefinition) decls[i_decl];
return (T) decls[i_decl];
}
final protected IASTStatement getStatement(IASTFunctionDefinition fdef, int i_stmt) {
final protected <T extends IASTDeclaration> T getDeclaration(IASTCompositeTypeSpecifier ct, int i_decl) {
Class<T> tclass;
IASTDeclaration[] decls= ct.getMembers();
assertTrue(decls.length > i_decl);
return (T) decls[i_decl];
}
final protected <T extends IASTCompositeTypeSpecifier> T getCompositeType(IASTTranslationUnit tu, int i_decl) {
IASTSimpleDeclaration sdecl= getDeclaration(tu, i_decl);
return (T) sdecl.getDeclSpecifier();
}
final protected <T extends IASTStatement> T getStatement(IASTFunctionDefinition fdef, int i_stmt) {
IASTCompoundStatement compound= (IASTCompoundStatement) fdef.getBody();
IASTStatement[] stmts= compound.getStatements();
assertTrue(stmts.length > i_stmt);
return stmts[i_stmt];
return (T) stmts[i_stmt];
}
final protected IASTExpression getExpressionOfStatement(IASTFunctionDefinition fdef, int i) {
final protected <T extends IASTExpression> T getExpressionOfStatement(IASTFunctionDefinition fdef, int i) {
IASTStatement stmt= getStatement(fdef, i);
assertInstance(stmt, IASTExpressionStatement.class);
return ((IASTExpressionStatement) stmt).getExpression();
return (T) ((IASTExpressionStatement) stmt).getExpression();
}
}

View file

@ -90,18 +90,6 @@ public class AST2CPPSpecFailingTest extends AST2SpecBaseTest {
parse(getAboveComment(), ParserLanguage.CPP, true, 0);
}
// class C { };
// void f(int(C)) { } // void f(int (*fp)(C c)) { }
// // not: void f(int C);
// int g(C);
// void foo() {
// f(1); //error: cannot convert 1 to function pointer
// f(g); //OK
// }
public void _test8_2s7a() throws Exception { // TODO raised bug 90633
parse(getAboveComment(), ParserLanguage.CPP, true, 0);
}
// char msg[] = "Syntax error on line %s
// ";
public void _test8_5_2s1() throws Exception { // TODO raised bug 90647

View file

@ -13,14 +13,18 @@ package org.eclipse.cdt.core.parser.tests.ast2;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTExpressionList;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTProblemDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.IFunction;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNewExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration;
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
@ -776,14 +780,13 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest {
// };
public void test5_3_4s3() throws Exception {
IASTTranslationUnit tu= parse(getAboveComment(), ParserLanguage.CPP, true, 0);
IASTFunctionDefinition fdef= getFunctionDefinition(tu, 0);
IASTFunctionDefinition fdef= getDeclaration(tu, 0);
IASTExpression expr= getExpressionOfStatement(fdef, 0);
assertInstance(expr, ICPPASTNewExpression.class);
ICPPASTNewExpression newExpr= (ICPPASTNewExpression) expr;
assertNull(newExpr.getNewPlacement());
assertNull(newExpr.getNewInitializer());
assertEquals(0, newExpr.getNewTypeIdArrayExpressions().length);
IASTTypeId typeid= newExpr.getTypeId();
isTypeEqual(CPPVisitor.createType(typeid), "int () * []");
}
@ -795,11 +798,11 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest {
// new T[5];
// new (2,f) T[5];
// };
public void _test5_3_4s12() throws Exception {
// failing see https://bugs.eclipse.org/bugs/show_bug.cgi?id=236856
public void test5_3_4s12() throws Exception {
// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=236856
IASTTranslationUnit tu= parse(getAboveComment(), ParserLanguage.CPP, true, 0);
IASTFunctionDefinition fdef= getFunctionDefinition(tu, 1);
IASTFunctionDefinition fdef= getDeclaration(tu, 1);
// new T;
IASTExpression expr= getExpressionOfStatement(fdef, 0);
@ -807,7 +810,6 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest {
ICPPASTNewExpression newExpr= (ICPPASTNewExpression) expr;
assertNull(newExpr.getNewPlacement());
assertNull(newExpr.getNewInitializer());
assertEquals(0, newExpr.getNewTypeIdArrayExpressions().length);
isTypeEqual(CPPVisitor.createType(newExpr.getTypeId()), "int");
// new(2,f) T;
@ -816,7 +818,6 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest {
newExpr= (ICPPASTNewExpression) expr;
assertInstance(newExpr.getNewPlacement(), IASTExpressionList.class);
assertNull(newExpr.getNewInitializer());
assertEquals(0, newExpr.getNewTypeIdArrayExpressions().length);
isTypeEqual(CPPVisitor.createType(newExpr.getTypeId()), "int");
// new T[5];
@ -825,7 +826,6 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest {
newExpr= (ICPPASTNewExpression) expr;
assertNull(newExpr.getNewPlacement());
assertNull(newExpr.getNewInitializer());
assertEquals(1, newExpr.getNewTypeIdArrayExpressions().length);
isTypeEqual(CPPVisitor.createType(newExpr.getTypeId()), "int []");
// new (2,f) T[5];
@ -834,7 +834,6 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest {
newExpr= (ICPPASTNewExpression) expr;
assertInstance(newExpr.getNewPlacement(), IASTExpressionList.class);
assertNull(newExpr.getNewInitializer());
assertEquals(1, newExpr.getNewTypeIdArrayExpressions().length);
isTypeEqual(CPPVisitor.createType(newExpr.getTypeId()), "int []");
}
@ -1133,7 +1132,10 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest {
// // an ordinary member function, not a constructor
// } S;
public void test7_1_3s5b() throws Exception {
parse(getAboveComment(), ParserLanguage.CPP, true, 0);
IASTTranslationUnit tu= parseWithErrors(getAboveComment(), ParserLanguage.CPP);
IASTCompositeTypeSpecifier comp= getCompositeType(tu, 0);
IASTDeclaration d= getDeclaration(comp, 0);
assertInstance(d, IASTProblemDeclaration.class);
}
// int foo() {
@ -1776,10 +1778,27 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest {
parse(getAboveComment(), ParserLanguage.CPP, true, 0);
}
// class C { };
// void f(int(C)) { } // void f(int (*fp)(C c)) { }
// // not: void f(int C);
// int g(C);
// void foo() {
// f(1); //error: cannot convert 1 to function pointer
// f(g); //OK
// }
public void test8_2s7a() throws Exception { // TODO raised bug 90633
final String code = getAboveComment();
parse(code, ParserLanguage.CPP, true, 1);
BindingAssertionHelper ba= new BindingAssertionHelper(code, true);
IFunction f= ba.assertNonProblem("f", 1, IFunction.class);
isTypeEqual(f.getType(), "void (int (C) *)");
}
// class C { };
// void h(int *(C[10])); // void h(int *(*_fp)(C _parm[10]));
// // not: void h(int *C[10]);
public void _test8_2s7b() throws Exception {
public void test8_2s7b() throws Exception {
final String code = getAboveComment();
parse(code, ParserLanguage.CPP, true, 0);
BindingAssertionHelper ba= new BindingAssertionHelper(code, true);
@ -3958,7 +3977,7 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest {
// int f(char*);
// void g()
// {
// extern f(int);
// extern int f(int);
// f("asdf"); //error: f(int) hides f(char*)
// // so there is no f(char*) in this scope
// }
@ -5634,7 +5653,7 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest {
parse(getAboveComment(), ParserLanguage.CPP, true, 0);
}
// class Matherr { virtual vf(); };
// class Matherr { virtual void vf(); };
// class Overflow: public Matherr { };
// class Underflow: public Matherr { };
// class Zerodivide: public Matherr { };
@ -6185,7 +6204,10 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest {
// int ef(D&);
// int ff(X&);
public void test11_3s2() throws Exception { //bug 92793
parse(getAboveComment(), ParserLanguage.CPP, true, 0);
IASTTranslationUnit tu= parse(getAboveComment(), ParserLanguage.CPP, true, 0);
IASTCompositeTypeSpecifier D= getCompositeType(tu, 2);
IASTDeclaration accessDecl= getDeclaration(D, 2);
assertInstance(accessDecl, ICPPASTUsingDeclaration.class);
}
// int z() {

View file

@ -33,6 +33,7 @@ import org.eclipse.cdt.core.dom.ast.IASTDeclarationStatement;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTExpressionList;
import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement;
import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator;
@ -83,6 +84,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTOperatorName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTPointerToMember;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeConstructorExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTWhileStatement;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType;
@ -1621,7 +1623,7 @@ public class AST2CPPTests extends AST2BaseTest {
}
// namespace Y { void f(float); }
// namespace A { using namespace Y; f(int); }
// namespace A { using namespace Y; void f(int); }
// namespace B { void f(char); }
// namespace AB { using namespace A; using namespace B; }
// void h(){
@ -3562,32 +3564,38 @@ public class AST2CPPTests extends AST2BaseTest {
// 1,4,12,21 - conversion
// 2, 16 .isConversion
assertEquals(col.size(), 22);
final IASTName int1 = col.getName(1);
assertNotNull(int1);
assertTrue(int1 instanceof ICPPASTConversionName);
assertNotNull(((ICPPASTConversionName) int1).getTypeId());
assertNotNull(col.getName(1));
assertNotNull(col.getName(4));
assertNotNull(col.getName(12));
assertNotNull(col.getName(21));
assertNotNull(col.getName(2));
assertNotNull(col.getName(16));
IASTFunctionDefinition fdef= getDeclaration(tu, 1);
final IASTName x_int = fdef.getDeclarator().getName();
assertNotNull(x_int);
assertTrue(x_int instanceof ICPPASTQualifiedName);
assertTrue(((ICPPASTQualifiedName) x_int).isConversionOrOperator());
// ensure the conversions are conversions
assertTrue(col.getName(1) instanceof ICPPASTConversionName);
assertTrue(col.getName(4) instanceof ICPPASTConversionName);
assertTrue(col.getName(12) instanceof ICPPASTConversionName);
assertTrue(col.getName(21) instanceof ICPPASTConversionName);
assertNotNull(((ICPPASTConversionName) col.getName(1)).getTypeId());
assertNotNull(((ICPPASTConversionName) col.getName(4)).getTypeId());
assertNotNull(((ICPPASTConversionName) col.getName(12)).getTypeId());
assertNotNull(((ICPPASTConversionName) col.getName(21)).getTypeId());
final IASTName int2= ((ICPPASTQualifiedName)x_int).getLastName();
assertNotNull(int2);
assertTrue(int2 instanceof ICPPASTConversionName);
assertNotNull(((ICPPASTConversionName) int2).getTypeId());
// ensure qualified name isConversionOrOperator
assertTrue(col.getName(2) instanceof ICPPASTQualifiedName);
assertTrue(col.getName(16) instanceof ICPPASTQualifiedName);
assertTrue(((ICPPASTQualifiedName) col.getName(2))
.isConversionOrOperator());
assertTrue(((ICPPASTQualifiedName) col.getName(16))
.isConversionOrOperator());
final IASTName int3 = col.getName(12);
assertNotNull(int3);
assertTrue(int3 instanceof ICPPASTConversionName);
assertNotNull(((ICPPASTConversionName) int3).getTypeId());
ICPPASTTemplateDeclaration tdef= getDeclaration(tu, 3);
fdef= (IASTFunctionDefinition) tdef.getDeclaration();
final IASTName x_ac_int = fdef.getDeclarator().getName();
assertNotNull(x_ac_int);
assertTrue(x_ac_int instanceof ICPPASTQualifiedName);
assertTrue(((ICPPASTQualifiedName) x_ac_int).isConversionOrOperator());
final IASTName int4= ((ICPPASTQualifiedName)x_ac_int).getLastName();
assertNotNull(int4);
assertTrue(int4 instanceof ICPPASTConversionName);
assertNotNull(((ICPPASTConversionName) int4).getTypeId());
}
public void testBug88662() throws Exception {
@ -4066,7 +4074,7 @@ public class AST2CPPTests extends AST2BaseTest {
assertSame(d2, r);
}
// class P {
// class Point {
// Point() : xCoord(0) {}
// int xCoord;
// };
@ -5021,10 +5029,6 @@ public class AST2CPPTests extends AST2BaseTest {
assertSame( blah, col.getName(6).resolveBinding() );
}
public void testBug80171() throws Exception {
parseAndCheckBindings( "static var;"); //$NON-NLS-1$
}
public void testBug78800() throws Exception {
parseAndCheckBindings( "class Matrix { public: Matrix & operator *(Matrix &); }; Matrix rotate, translate; Matrix transform = rotate * translate;" ); //$NON-NLS-1$
}
@ -5658,7 +5662,7 @@ public class AST2CPPTests extends AST2BaseTest {
// X::~X() {}
// X::operator int() {}
// X::xtint(a); // 2
public void _testEmptyDeclSpecifier() throws Exception {
public void testEmptyDeclSpecifier() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertNonProblem("X {", 1, ICPPClassType.class);
ba.assertNonProblem("X()", 1, ICPPConstructor.class);
@ -5677,46 +5681,46 @@ public class AST2CPPTests extends AST2BaseTest {
// int p[100];
// void test(int f) {
// new T;
// new T();
// new T(f);
// new (p) T;
// new (p) T();
// new (p) T(f);
// new (T);
// new (T)();
// new (T)(f);
// new (p) (T);
// new (p) (T)();
// new (p) (T)(f);
// new T[f][f];
// new T[f][f](f);
// new (p) T[f][f];
// new (p) T[f][f](f);
// new (T[f][f]);
// new (T[f][f])(f);
// new (p) (T[f][f]);
// new (p) (T[f][f])(f);
// };
public void _testNewPlacement_Bug236856() throws Exception {
public void testNewPlacement() throws Exception {
IASTTranslationUnit tu= parseAndCheckBindings(getAboveComment());
IASTFunctionDefinition fdef= getFunctionDefinition(tu, 3);
IASTFunctionDefinition fdef= getDeclaration(tu, 3);
checkNewExpression(fdef, 0, null, "int", 0, null);
checkNewExpression(fdef, 1, null, "int", 0, IASTIdExpression.class);
checkNewExpression(fdef, 2, IASTIdExpression.class, "int", 0, null);
checkNewExpression(fdef, 3, IASTIdExpression.class, "int", 0, IASTIdExpression.class);
checkNewExpression(fdef, 4, null, "int", 0, null);
checkNewExpression(fdef, 5, null, "int", 0, IASTIdExpression.class);
checkNewExpression(fdef, 6, IASTIdExpression.class, "int", 0, null);
checkNewExpression(fdef, 7, IASTIdExpression.class, "int", 0, IASTIdExpression.class);
checkNewExpression(fdef, 0, null, "int", null);
checkNewExpression(fdef, 1, null, "int", IASTExpressionList.class);
checkNewExpression(fdef, 2, null, "int", IASTIdExpression.class);
checkNewExpression(fdef, 3, IASTIdExpression.class, "int", null);
checkNewExpression(fdef, 4, IASTIdExpression.class, "int", IASTExpressionList.class);
checkNewExpression(fdef, 5, IASTIdExpression.class, "int", IASTIdExpression.class);
checkNewExpression(fdef, 6, null, "int", null);
checkNewExpression(fdef, 7, null, "int", IASTExpressionList.class);
checkNewExpression(fdef, 8, null, "int", IASTIdExpression.class);
checkNewExpression(fdef, 9, IASTIdExpression.class, "int", null);
checkNewExpression(fdef, 10, IASTIdExpression.class, "int", IASTExpressionList.class);
checkNewExpression(fdef, 11, IASTIdExpression.class, "int", IASTIdExpression.class);
checkNewExpression(fdef, 8, null, "int [] []", 2, null);
checkNewExpression(fdef, 9, null, "int [] []", 2, IASTIdExpression.class);
checkNewExpression(fdef, 10, IASTIdExpression.class, "int [] []", 2, null);
checkNewExpression(fdef, 11, IASTIdExpression.class, "int [] []", 2, IASTIdExpression.class);
checkNewExpression(fdef, 12, null, "int [] []", 2, null);
checkNewExpression(fdef, 13, null, "int [] []", 2, IASTIdExpression.class);
checkNewExpression(fdef, 14, IASTIdExpression.class, "int [] []", 2, null);
checkNewExpression(fdef, 15, IASTIdExpression.class, "int [] []", 2, IASTIdExpression.class);
checkNewExpression(fdef, 12, null, "int [] []", null);
checkNewExpression(fdef, 13, IASTIdExpression.class, "int [] []", null);
checkNewExpression(fdef, 14, null, "int [] []", null);
checkNewExpression(fdef, 15, IASTIdExpression.class, "int [] []", null);
}
private void checkNewExpression(IASTFunctionDefinition fdef, int i_expr, Class<?> placement, String type, int array, Class<?> init) {
private void checkNewExpression(IASTFunctionDefinition fdef, int i_expr, Class<?> placement, String type, Class<?> init) {
IASTExpression expr;
ICPPASTNewExpression newExpr;
expr= getExpressionOfStatement(fdef, i_expr);
@ -5732,8 +5736,6 @@ public class AST2CPPTests extends AST2BaseTest {
} else {
assertInstance(newExpr.getNewInitializer(), init);
}
assertEquals(array, newExpr.getNewTypeIdArrayExpressions().length);
isTypeEqual(CPPVisitor.createType(newExpr.getTypeId()), type);
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2005, 2007 IBM Corporation and others.
* Copyright (c) 2005, 2008 IBM Corporation 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
@ -10,10 +10,11 @@
*******************************************************************************/
package org.eclipse.cdt.core.parser.tests.ast2;
import org.eclipse.cdt.core.parser.ParserLanguage;
/**
* @author dsteffle
* mstodo the class should be removed
*/
public class AST2CSpecFailingTest extends AST2SpecBaseTest {
@ -38,19 +39,20 @@ public class AST2CSpecFailingTest extends AST2SpecBaseTest {
--End Example]
*/
public void test6_7_7s6() throws Exception {
StringBuffer buffer = new StringBuffer();
buffer.append("typedef signed int t;\n"); //$NON-NLS-1$
buffer.append("typedef int plain;\n"); //$NON-NLS-1$
buffer.append("struct tag {\n"); //$NON-NLS-1$
buffer.append("unsigned t:4;\n"); //$NON-NLS-1$
buffer.append("const t:5;\n"); //$NON-NLS-1$
buffer.append("plain r:5;\n"); //$NON-NLS-1$
buffer.append("};\n"); //$NON-NLS-1$
buffer.append("t f(t (t));\n"); //$NON-NLS-1$
buffer.append("long t;\n"); //$NON-NLS-1$
try {
parse(buffer.toString(), ParserLanguage.C, true, 0);
assertTrue(false);
} catch (Exception e) {}
// test is no longer failing, was moved to AST2CSpecTest
// StringBuffer buffer = new StringBuffer();
// buffer.append("typedef signed int t;\n"); //$NON-NLS-1$
// buffer.append("typedef int plain;\n"); //$NON-NLS-1$
// buffer.append("struct tag {\n"); //$NON-NLS-1$
// buffer.append("unsigned t:4;\n"); //$NON-NLS-1$
// buffer.append("const t:5;\n"); //$NON-NLS-1$
// buffer.append("plain r:5;\n"); //$NON-NLS-1$
// buffer.append("};\n"); //$NON-NLS-1$
// buffer.append("t f(t (t));\n"); //$NON-NLS-1$
// buffer.append("long t;\n"); //$NON-NLS-1$
// try {
// parse(buffer.toString(), ParserLanguage.C, true, 0);
// assertTrue(false);
// } catch (Exception e) {}
}
}

View file

@ -2078,4 +2078,32 @@ public class AST2CSpecTest extends AST2SpecBaseTest {
parseCandCPP(buffer.toString(), false, 0);
}
/**
[--Start Example(C 6.7.7-6):
typedef signed int t;
typedef int plain;
struct tag {
unsigned t:4;
const t:5;
plain r:5;
};
t f(t (t));
long t;
--End Example]
*/
public void test6_7_7s6() throws Exception {
StringBuffer buffer = new StringBuffer();
buffer.append("typedef signed int t;\n"); //$NON-NLS-1$
buffer.append("typedef int plain;\n"); //$NON-NLS-1$
buffer.append("struct tag {\n"); //$NON-NLS-1$
buffer.append("unsigned t:4;\n"); //$NON-NLS-1$
buffer.append("const t:5;\n"); //$NON-NLS-1$
buffer.append("plain r:5;\n"); //$NON-NLS-1$
buffer.append("};\n"); //$NON-NLS-1$
buffer.append("t f(t (t));\n"); //$NON-NLS-1$
buffer.append("long t;\n"); //$NON-NLS-1$
parse(buffer.toString(), ParserLanguage.C, true, 0);
}
}

View file

@ -66,6 +66,10 @@ public class AST2SpecBaseTest extends AST2BaseTest {
parse( code, ParserLanguage.CPP, false, true, checkBindings, expectedProblemBindings, null );
}
protected IASTTranslationUnit parseWithErrors( String code, ParserLanguage lang) throws ParserException {
return parse(code, lang, false, false, false, 0, null );
}
protected IASTTranslationUnit parse( String code, ParserLanguage lang, boolean checkBindings, int expectedProblemBindings ) throws ParserException {
return parse(code, lang, false, true, checkBindings, expectedProblemBindings, null );
}
@ -134,7 +138,7 @@ public class AST2SpecBaseTest extends AST2BaseTest {
NameResolver res = new NameResolver();
tu.accept( res );
if (res.problemBindings.size() != expectedProblemBindings )
throw new ParserException("Expected " + expectedProblemBindings + " problems, encountered " + res.problemBindings.size() ); //$NON-NLS-1$ //$NON-NLS-2$
throw new ParserException("Expected " + expectedProblemBindings + " problems, encountered " + res.problemBindings.size() );
if (problems != null) {
for (int i = 0; i < problems.length; i++) {
assertEquals(problems[i], res.problemBindings.get(i));
@ -143,24 +147,24 @@ public class AST2SpecBaseTest extends AST2BaseTest {
}
if( parser2.encounteredError() && expectNoProblems )
throw new ParserException( "FAILURE"); //$NON-NLS-1$
throw new ParserException( "FAILURE");
if( lang == ParserLanguage.C && expectNoProblems )
{
if (CVisitor.getProblems(tu).length != 0) {
throw new ParserException (" CVisitor has AST Problems " ); //$NON-NLS-1$
throw new ParserException (" CVisitor has AST Problems " );
}
if (tu.getPreprocessorProblems().length != 0) {
throw new ParserException (" C TranslationUnit has Preprocessor Problems " ); //$NON-NLS-1$
throw new ParserException (" C TranslationUnit has Preprocessor Problems " );
}
}
else if ( lang == ParserLanguage.CPP && expectNoProblems )
{
if (CPPVisitor.getProblems(tu).length != 0) {
throw new ParserException (" CPPVisitor has AST Problems " ); //$NON-NLS-1$
throw new ParserException (" CPPVisitor has AST Problems " );
}
if (tu.getPreprocessorProblems().length != 0) {
throw new ParserException (" CPP TranslationUnit has Preprocessor Problems " ); //$NON-NLS-1$
throw new ParserException (" CPP TranslationUnit has Preprocessor Problems " );
}
}
@ -179,6 +183,7 @@ public class AST2SpecBaseTest extends AST2BaseTest {
public int numNullBindings = 0;
@Override
public int visit(IASTName name) {
nameList.add(name);
IBinding binding = name.resolveBinding();

View file

@ -3746,8 +3746,17 @@ public class AST2Tests extends AST2BaseTest {
assertInstance(col.getName(11).resolveBinding(), ITypedef.class);
// function ptr
assertInstance(col.getName(12).resolveBinding(), ITypedef.class);
assertInstance(col.getName(13).resolveBinding(), IProblemBinding.class);
final IBinding typedef = col.getName(12).resolveBinding();
final IBinding secondJ = col.getName(13).resolveBinding();
assertInstance(typedef, ITypedef.class);
if (lang == ParserLanguage.CPP) {
assertInstance(secondJ, IProblemBinding.class);
} else {
// for plain C this is actually not a problem, the second J has to be interpreted as a (useless)
// parameter name.
assertInstance(typedef, ITypedef.class);
isTypeEqual(((ITypedef) typedef).getType(), "int (int) *");
}
}
}
@ -4817,9 +4826,7 @@ public class AST2Tests extends AST2BaseTest {
// int f3(int (tint));
// int f4(int (identifier));
// int f5(int *(tint[10]));
public void _testParamWithFunctionType_Bug84242() throws Exception {
// works for plain-c, see testcase below.
// mstodo also check related failure AST2CPPSpecFailingTest._test8_2s7a()
public void testParamWithFunctionType_Bug84242() throws Exception {
final String comment= getAboveComment();
final boolean[] isCpps= {false, true};
for (boolean isCpp : isCpps) {
@ -4844,7 +4851,7 @@ public class AST2Tests extends AST2BaseTest {
// class C { };
// void f1(int(C)) { }
public void _testParamWithFunctionTypeCpp_Bug84242() throws Exception {
public void testParamWithFunctionTypeCpp_Bug84242() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
IFunction f= ba.assertNonProblem("f1", 2, IFunction.class);

View file

@ -120,17 +120,17 @@ public class CommentTests extends AST2BaseTest {
private String getCppSource() {
StringBuffer buffer = new StringBuffer();
buffer.append("CppClass()\n");
buffer.append("void CppClass()\n");
buffer.append("{\n");
buffer.append(" // Comment in cpp\n");
buffer.append(" value = 1 + /*The magic 5 */5 * 6;\n");
buffer.append(" int value = 1 + /*The magic 5 */5 * 6;\n");
buffer.append(" // Another comment\n");
buffer.append(" value++;\n");
buffer.append("}\n");
buffer.append("/* A blockcomment \n");
buffer.append("* over multiple lines */\n");
buffer.append("//Toplevel comment\n");
buffer.append("doIrgendwas(){\n");
buffer.append("void doIrgendwas(){\n");
buffer.append(" //A little bit code\n");
buffer.append(" int i = 3; //Trailing comment\n");
buffer.append(" ;\n");
@ -152,7 +152,7 @@ public class CommentTests extends AST2BaseTest {
buffer.append(" int n = i++ +5;\n");
buffer.append(" //Last comment in cpp\n");
buffer.append("}\n");
buffer.append("globaleFuntktion(){\n");
buffer.append("int globaleFuntktion(){\n");
buffer.append("//An integer\n");
buffer.append("int i;\n");
buffer.append("}\n");
@ -243,8 +243,7 @@ public class CommentTests extends AST2BaseTest {
assertEquals(5, comments.length);
assertNotNull(comments[0].getFileLocation());
assertNotNull(comments[0].getNodeLocations());
for (int i = 0; i < comments.length; i++) {
IASTComment comment = comments[i];
for (IASTComment comment : comments) {
IASTFileLocation loc= comment.getFileLocation();
int idx= loc.getNodeOffset() + comment.getRawSignature().indexOf("TODO");
assertEquals("TODO", code.substring(idx, idx+4));

View file

@ -854,8 +854,7 @@ public class CompleteParser2Tests extends BaseTestCase {
assertInstances( col, A, 2 );
}
// failing, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=236856
public void _testNewExpressions() throws Exception {
public void testNewExpressions() throws Exception {
IASTTranslationUnit tu = parse( "typedef int A; int B; int C; int D; int P; int*p = new (P) (A[B][C][D]);" ); //$NON-NLS-1$
CPPNameCollector col = new CPPNameCollector();
tu.accept( col );

View file

@ -98,9 +98,9 @@ public class DOMSelectionParseTest extends DOMSelectionParseBaseTest {
public void testBaseCase_FunctionDeclaration() throws Exception
{
String code = "int x(); x( );"; //$NON-NLS-1$
int offset1 = code.indexOf( "x()" ); //$NON-NLS-1$
int offset2 = code.indexOf( "()"); //$NON-NLS-1$
String code = "int x(); void test() {x( );}"; //$NON-NLS-1$
int offset1 = code.indexOf( "x( )" ); //$NON-NLS-1$
int offset2 = code.indexOf( "( )"); //$NON-NLS-1$
IASTNode node = parse( code, offset1, offset2 );
assertTrue( node instanceof IASTName );
assertTrue( ((IASTName)node).resolveBinding() instanceof IFunction );

View file

@ -521,7 +521,7 @@ public class QuickParser2Tests extends TestCase {
public void testBug36769A() throws Exception {
parse("template <class A, B> cls<A, C>::operator &() const {}\n");
parse("template <class A, B> cls<A, C>::operator otherType() const {}\n");
parse("template <class A, B> cls<A, C>::cls() {}\n");
parse("template <class A, B> cls<A, C>::~cls() {}\n");
}
@ -535,7 +535,11 @@ public class QuickParser2Tests extends TestCase {
}
public void testBugFunctor758() throws Exception {
parse("template <typename Fun> Functor(Fun fun) : spImpl_(new FunctorHandler<Functor, Fun>(fun)){}");
parse(
"class Functor {"+
"template <typename Fun> Functor(Fun fun) : spImpl_(new FunctorHandler<Functor, Fun>(fun)){}" +
"};"
);
}
public void testBug36932() throws Exception {
@ -642,10 +646,10 @@ public class QuickParser2Tests extends TestCase {
public void testBug36696() throws Exception {
Writer code = new StringWriter();
code
.write("template <typename P1> RefCounted(const RefCounted<P1>& rhs)\n");
code
.write(": pCount_(reinterpret_cast<const RefCounted&>(rhs).pCount_) {}\n");
code.write("template<typename T> class RefCounted {");
code.write("template <typename P1> RefCounted(const RefCounted<P1>& rhs)\n");
code.write(": pCount_(reinterpret_cast<const RefCounted&>(rhs).pCount_) {}\n");
code.write("};");
parse(code.toString());
}
@ -839,7 +843,11 @@ public class QuickParser2Tests extends TestCase {
}
public void testBug36690() throws Exception {
parse("Functor(const Functor& rhs) : spImpl_(Impl::Clone(rhs.spImpl_.get())){}");
parse(
"class Functor {" +
"Functor(const Functor& rhs) : spImpl_(Impl::Clone(rhs.spImpl_.get())){}" +
"}"
);
}
public void testBug36703() throws Exception {

View file

@ -78,22 +78,22 @@ public class BasicCompletionTest extends CompletionTestBase {
public void testTypedef() throws Exception {
String code =
"typedef int blah;" +
"void test() {typedef int blah;" +
"bl";
// C++
IASTCompletionNode node = getGPPCompletionNode(code);
IASTName[] names = node.getNames();
assertEquals(2, names.length);
assertNull(names[0].getTranslationUnit());
IBinding[] bindings = names[1].getCompletionContext().findBindings(names[1], true);
assertNull(names[1].getTranslationUnit());
IBinding[] bindings = names[0].getCompletionContext().findBindings(names[0], true);
assertEquals(1, bindings.length);
assertEquals("blah", ((ITypedef)bindings[0]).getName());
// C
node = getGCCCompletionNode(code);
names = node.getNames();
assertEquals(1, names.length);
assert(names.length > 0);
bindings = names[0].getCompletionContext().findBindings(names[0], true);
assertEquals(1, bindings.length);
assertEquals("blah", ((ITypedef)bindings[0]).getName());

View file

@ -13,10 +13,14 @@ package org.eclipse.cdt.core.parser.tests.rewrite.changegenerator.append;
import junit.framework.Test;
import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTArrayModifier;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNewExpression;
import org.eclipse.cdt.core.parser.tests.rewrite.changegenerator.ChangeGeneratorTest;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTArrayModifier;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTLiteralExpression;
import org.eclipse.cdt.internal.core.dom.rewrite.ASTModification;
import org.eclipse.cdt.internal.core.dom.rewrite.ASTModificationStore;
@ -47,8 +51,11 @@ public class ArraySizeExpressionTest extends ChangeGeneratorTest {
public int visit(IASTExpression expression) {
if (expression instanceof ICPPASTNewExpression) {
ICPPASTNewExpression newExpression = (ICPPASTNewExpression) expression;
newExpression.getNewTypeIdArrayExpressions();
ASTModification modification = new ASTModification(ASTModification.ModificationKind.APPEND_CHILD, newExpression, new CPPASTLiteralExpression(0, "5"), null); //$NON-NLS-1$
IASTTypeId id= newExpression.getTypeId();
IASTArrayDeclarator dtor= (IASTArrayDeclarator) id.getAbstractDeclarator();
IASTArrayModifier[] mods= dtor.getArrayModifiers();
IASTArrayModifier add= new CPPASTArrayModifier(new CPPASTLiteralExpression(0, "5"));
ASTModification modification = new ASTModification(ASTModification.ModificationKind.APPEND_CHILD, dtor, add, null);
modStore.storeModification(null, modification);
}
return PROCESS_CONTINUE;

View file

@ -13,10 +13,14 @@ package org.eclipse.cdt.core.parser.tests.rewrite.changegenerator.insertbefore;
import junit.framework.Test;
import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTArrayModifier;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNewExpression;
import org.eclipse.cdt.core.parser.tests.rewrite.changegenerator.ChangeGeneratorTest;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTArrayModifier;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTLiteralExpression;
import org.eclipse.cdt.internal.core.dom.rewrite.ASTModification;
import org.eclipse.cdt.internal.core.dom.rewrite.ASTModificationStore;
@ -49,8 +53,11 @@ public class ArraySizeExpressionTest extends ChangeGeneratorTest {
public int visit(IASTExpression expression) {
if (expression instanceof ICPPASTNewExpression) {
ICPPASTNewExpression newExpression = (ICPPASTNewExpression) expression;
IASTExpression[] arraySizeExpressions = newExpression.getNewTypeIdArrayExpressions();
ASTModification modification = new ASTModification(ASTModification.ModificationKind.INSERT_BEFORE, arraySizeExpressions[0], new CPPASTLiteralExpression(0, "6"), null); //$NON-NLS-1$
IASTTypeId id= newExpression.getTypeId();
IASTArrayDeclarator dtor= (IASTArrayDeclarator) id.getAbstractDeclarator();
IASTArrayModifier[] mods= dtor.getArrayModifiers();
IASTArrayModifier add= new CPPASTArrayModifier(new CPPASTLiteralExpression(0, "6"));
ASTModification modification = new ASTModification(ASTModification.ModificationKind.INSERT_BEFORE, mods[0], add, null);
modStore.storeModification(null, modification);
}
return PROCESS_CONTINUE;

View file

@ -13,7 +13,10 @@ package org.eclipse.cdt.core.parser.tests.rewrite.changegenerator.remove;
import junit.framework.Test;
import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTArrayModifier;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNewExpression;
import org.eclipse.cdt.core.parser.tests.rewrite.changegenerator.ChangeGeneratorTest;
@ -47,8 +50,10 @@ public class ArraySizeExpressionTest extends ChangeGeneratorTest {
public int visit(IASTExpression expression) {
if (expression instanceof ICPPASTNewExpression) {
ICPPASTNewExpression newExpression = (ICPPASTNewExpression) expression;
IASTExpression[] arraySizeExpressions = newExpression.getNewTypeIdArrayExpressions();
ASTModification modification = new ASTModification(ASTModification.ModificationKind.REPLACE, arraySizeExpressions[1], null, null);
IASTTypeId id= newExpression.getTypeId();
IASTArrayDeclarator dtor= (IASTArrayDeclarator) id.getAbstractDeclarator();
IASTArrayModifier[] mods= dtor.getArrayModifiers();
ASTModification modification = new ASTModification(ASTModification.ModificationKind.REPLACE, mods[1], null, null);
modStore.storeModification(null, modification);
}
return PROCESS_CONTINUE;

View file

@ -13,7 +13,10 @@ package org.eclipse.cdt.core.parser.tests.rewrite.changegenerator.replace;
import junit.framework.Test;
import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTArrayModifier;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNewExpression;
import org.eclipse.cdt.core.parser.tests.rewrite.changegenerator.ChangeGeneratorTest;
@ -54,8 +57,11 @@ public class ArraySizeExpressionTest extends ChangeGeneratorTest {
public int visit(IASTExpression expression) {
if (expression instanceof ICPPASTNewExpression) {
ICPPASTNewExpression newExpression = (ICPPASTNewExpression) expression;
IASTExpression[] arraySizeExpressions = newExpression.getNewTypeIdArrayExpressions();
ASTModification modification = new ASTModification(ASTModification.ModificationKind.REPLACE, arraySizeExpressions[1], new CPPASTLiteralExpression(0, "7"), null); //$NON-NLS-1$
IASTTypeId id= newExpression.getTypeId();
IASTArrayDeclarator dtor= (IASTArrayDeclarator) id.getAbstractDeclarator();
IASTArrayModifier[] mods= dtor.getArrayModifiers();
IASTExpression expr= mods[1].getConstantExpression();
ASTModification modification = new ASTModification(ASTModification.ModificationKind.REPLACE, expr, new CPPASTLiteralExpression(0, "7"), null); //$NON-NLS-1$
modStore.storeModification(null, modification);
}
return PROCESS_CONTINUE;

View file

@ -1,12 +1,13 @@
/*******************************************************************************
* Copyright (c) 2007 Symbian Software Systems and others.
* Copyright (c) 2007, 2008 Symbian Software Systems 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:
* Andrew Ferguson (Symbian) - Initial implementation
* Andrew Ferguson (Symbian) - Initial implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.pdom.tests;
@ -19,6 +20,7 @@ import junit.framework.Test;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IFunctionType;
import org.eclipse.cdt.core.dom.ast.IType;
@ -46,6 +48,7 @@ public class PDOMCBugsTest extends BaseTestCase {
return suite(PDOMCBugsTest.class);
}
@Override
protected void setUp() throws Exception {
cproject= CProjectHelper.createCProject("PDOMCBugsTest"+System.currentTimeMillis(), "bin", IPDOMManager.ID_NO_INDEXER);
Bundle b = CTestPlugin.getDefault().getBundle();
@ -59,6 +62,7 @@ public class PDOMCBugsTest extends BaseTestCase {
super.setUp();
}
@Override
protected void tearDown() throws Exception {
if (cproject != null) {
cproject.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor());
@ -79,16 +83,16 @@ public class PDOMCBugsTest extends BaseTestCase {
IBinding[] bindings= pdom.findBindings(Pattern.compile(".*"), false, IndexFilter.ALL, NPM);
assertEquals(7, bindings.length);
Set bnames= new HashSet();
for(int i=0; i<bindings.length; i++) {
assertTrue("expected typedef, got "+bindings[i], bindings[i] instanceof ITypedef);
bnames.add(bindings[i].getName());
IType type= SemanticUtil.getUltimateType((IType)bindings[i], false);
for (IBinding binding : bindings) {
assertTrue("expected typedef, got "+binding, binding instanceof ITypedef);
bnames.add(binding.getName());
IType type= SemanticUtil.getUltimateType((IType)binding, false);
if(bindings[i].getName().equals("J")) {
if(binding.getName().equals("J")) {
// for plain C the second J has to be interpreted as a (useless) parameter name.
assertTrue(type instanceof IFunctionType);
IFunctionType ft= (IFunctionType) type;
assertEquals(1, ft.getParameterTypes().length);
assertNull(ft.getParameterTypes()[0]);
assertEquals("int (int)", ASTTypeUtil.getType(ft));
} else {
assertNull("expected null, got "+type, type);
}

View file

@ -1,28 +1,28 @@
//!Commented NameTest1
//%CPP
//Test
Hallo;
int Hallo;
//!Commented NameTest2
//%CPP
Hallo; //Test
int Hallo; //Test
//!Commented NameTest2
//%CPP
Hallo /*Test*/;
int Hallo /*Test*/;
//!Commented QualifiedName1
//%CPP
//TEST
TestClass::Hallo;
int TestClass::Hallo;
//!Commented QualifiedName1
//%CPP
TestClass::Hallo; //TEST
int TestClass::Hallo; //TEST
//!Commented QualifiedName1
//%CPP
TestClass::Hallo /*Test*/;
int TestClass::Hallo /*Test*/;
//!Commented OperatorName1
//%CPP

View file

@ -3,7 +3,7 @@
class Klasse0
{
public:
Klasse1(); /*
Klasse0(); /*
* Comment
*/
std::string toString();
@ -15,7 +15,7 @@ private:
class Klasse0
{
public:
Klasse1(); /*
Klasse0(); /*
* Comment
*/
std::string toString();
@ -28,7 +28,7 @@ private:
class Klasse0
{
public:
Klasse1(); //Comment
Klasse0(); //Comment
std::string toString();
private:
int i;
@ -38,7 +38,7 @@ private:
class Klasse0
{
public:
Klasse1(); //Comment
Klasse0(); //Comment
std::string toString();
private:
int i;
@ -51,7 +51,7 @@ class Klasse0
{
//Comment2
public:
Klasse1();
Klasse0();
std::string toString();
private:
int i;
@ -524,7 +524,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -541,7 +541,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0; //TEST
i++;
@ -557,7 +557,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -575,7 +575,7 @@ public:
Klasse1();
std::string toString();
//KommentarDavor
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -592,7 +592,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -609,7 +609,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -627,7 +627,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -646,7 +646,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -663,7 +663,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -681,7 +681,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -701,7 +701,7 @@ public:
Klasse1();
std::string toString();
//TEST
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -719,7 +719,7 @@ public:
Klasse1();
std::string toString();
/*TEST*/
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -737,7 +737,7 @@ class Klasse1 //Nachher
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -755,7 +755,7 @@ class Klasse1 /*Nachher*/
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -774,7 +774,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -793,7 +793,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -814,7 +814,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -831,7 +831,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -848,7 +848,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -865,7 +865,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -884,7 +884,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -904,7 +904,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -922,7 +922,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;

View file

@ -1,10 +1,10 @@
//!NameTest
//%CPP
Hallo;
int Hallo;
//!QualifiedName
//%CPP
TestClass::Hallo;
int TestClass::Hallo;
//!OperatorName
//%CPP

View file

@ -10,7 +10,7 @@ void foo()
//!CaseDefaultStatementTest
//%CPP
foo()
void foo()
{
switch (1){
case 1:

View file

@ -146,7 +146,7 @@ public: = //Klasse...
class Klasse0
{
public:
Klasse1(); //Comment
Klasse0(); //Comment
std::string toString();
private:
int i;
@ -156,7 +156,7 @@ private:
=>leading
=>trailing
Klasse1(); = //Comment
Klasse0(); = //Comment
=>freestanding
@ -760,7 +760,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -785,7 +785,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0; //TEST
i++;
@ -810,7 +810,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -840,7 +840,7 @@ public:
Klasse1();
std::string toString();
//KommentarDavor
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -852,7 +852,7 @@ private:
//=
=>leading
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -874,7 +874,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -893,7 +893,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -913,7 +913,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -933,7 +933,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -949,7 +949,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -967,7 +967,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -990,7 +990,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1008,7 +1008,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1027,7 +1027,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1047,7 +1047,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1069,7 +1069,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1087,7 +1087,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1108,7 +1108,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1131,7 +1131,7 @@ public:
Klasse1();
std::string toString();
//TEST
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1143,7 +1143,7 @@ private:
//=
=>leading
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1162,7 +1162,7 @@ public:
Klasse1();
std::string toString();
/*TEST*/
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1174,7 +1174,7 @@ private:
//=
=>leading
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1193,7 +1193,7 @@ class Klasse1 //Nachher
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1210,7 +1210,7 @@ class Klasse1 //Nachher
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1234,7 +1234,7 @@ class Klasse1 /*Nachher*/
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1251,7 +1251,7 @@ class Klasse1 /*Nachher*/
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1276,7 +1276,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1294,7 +1294,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1319,7 +1319,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1337,7 +1337,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1364,7 +1364,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1382,7 +1382,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1407,7 +1407,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1433,7 +1433,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1459,7 +1459,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1489,7 +1489,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1520,7 +1520,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;
@ -1547,7 +1547,7 @@ class Klasse1
public:
Klasse1();
std::string toString();
inlineMethode()
void inlineMethode()
{
int i = 0;
i++;

View file

@ -16,7 +16,7 @@
*/
package org.eclipse.cdt.core.testplugin;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import org.eclipse.core.resources.IFile;
@ -30,36 +30,37 @@ import org.eclipse.core.runtime.CoreException;
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class FileManager {
ArrayList fileHandles;
HashSet<IFile> fileHandles;
public FileManager(){
fileHandles = new ArrayList();
fileHandles = new HashSet<IFile>();
}
public void addFile(IFile file){
fileHandles.add(file);
}
public void closeAllFiles() throws CoreException{
Iterator iter = fileHandles.iterator();
while (iter.hasNext()){
IFile tempFile = (IFile) iter.next();
tempFile.refreshLocal(IResource.DEPTH_INFINITE,null);
try {
tempFile.delete(true,null);
} catch (CoreException e) {
public void closeAllFiles() throws CoreException, InterruptedException{
int wait= 1;
for (int i = 0; i < 11; i++) {
for (Iterator iter= fileHandles.iterator(); iter.hasNext();) {
IFile tempFile = (IFile) iter.next();
try {
Thread.sleep(2000);
} catch (InterruptedException e1) {
}
finally{
if (i==1) {
tempFile.refreshLocal(IResource.DEPTH_INFINITE,null);
}
tempFile.delete(true,null);
iter.remove();
} catch (CoreException e) {
if (wait > 2000)
throw e;
}
}
if (fileHandles.isEmpty())
return;
Thread.sleep(wait);
wait*=2;
}
}
}

View file

@ -1,12 +1,13 @@
/*******************************************************************************
* Copyright (c) 2004, 2005 IBM Corporation and others.
* Copyright (c) 2004, 2008 IBM Corporation 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:
* IBM - Initial API and implementation
* IBM - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.core.dom.ast.cpp;
@ -81,8 +82,7 @@ public interface ICPPASTNewExpression extends IASTExpression {
public static final ASTNodeProperty TYPE_ID = new ASTNodeProperty("ICPPASTNewExpression.TYPE_ID - The type being 'newed'"); //$NON-NLS-1$
/**
* Get the type Id.
*
* Get the type Id. The type-id includes the optional array modifications.
* @return <code>IASTTypeId</code>
*/
public IASTTypeId getTypeId();
@ -96,9 +96,8 @@ public interface ICPPASTNewExpression extends IASTExpression {
public void setTypeId(IASTTypeId typeId);
/**
* Is the typeID a new type ID?
*
* @return boolean
* Returns whether the the typeID a new type ID, which is the case when
* the type-id is provided without parenthesis.
*/
public boolean isNewTypeId();
@ -117,18 +116,15 @@ public interface ICPPASTNewExpression extends IASTExpression {
"ICPPASTNewExpression.NEW_TYPEID_ARRAY_EXPRESSION - Expressions inside array brackets"); //$NON-NLS-1$
/**
* Get the new array size expressions.
*
* @return <code>IASTExpression []</code>
* @deprecated the id-expressions are part of the type-id.
*/
@Deprecated
public IASTExpression[] getNewTypeIdArrayExpressions();
/**
* Add another array size expression.
*
* @param expression
* <code>IASTExpression</code>
* @deprecated the id-expressions are part of the type-id
*/
@Deprecated
public void addNewTypeIdArrayExpression(IASTExpression expression);
}

View file

@ -37,6 +37,7 @@ import org.eclipse.cdt.core.dom.ast.IASTExpressionList;
import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement;
import org.eclipse.cdt.core.dom.ast.IASTFieldDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTGotoStatement;
import org.eclipse.cdt.core.dom.ast.IASTIdExpression;
import org.eclipse.cdt.core.dom.ast.IASTIfStatement;
@ -78,8 +79,7 @@ import org.eclipse.cdt.core.parser.ParserMode;
* @author jcamelon
*/
public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
protected final AbstractParserLogService log;
protected final AbstractParserLogService log;
protected final IScanner scanner;
protected final ParserMode mode;
@ -193,6 +193,12 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
return node.getOffset() + node.getLength();
}
protected void adjustLength(IASTNode n, IASTNode endNode) {
final int endOffset= calculateEndOffset(endNode);
final ASTNode node = (ASTNode) n;
node.setLength(endOffset-node.getOffset());
}
/**
* Consume the next token available, regardless of the type.
*
@ -201,13 +207,12 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
* If there is no token to consume.
*/
protected IToken consume() throws EndOfFileException {
if (currToken == null)
if (currToken == null) {
currToken = fetchToken();
IToken lastToken = null;
if (currToken != null)
lastToken = currToken;
currToken = currToken.getNext();
}
final IToken lastToken = currToken;
currToken= lastToken.getNext();
return lastToken;
}
@ -220,13 +225,33 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
* @throws BacktrackException
* If LT(1) != type
*/
protected IToken consume(int type) throws EndOfFileException,
BacktrackException {
if (LT(1) == type)
return consume();
IToken la = LA(1);
throwBacktrack(la.getOffset(), la.getLength());
return null;
protected IToken consume(int type) throws EndOfFileException, BacktrackException {
final IToken la1= LA(1);
if (la1.getType() != type)
throwBacktrack(la1);
return consume();
}
/**
* Consume the next token available only if the type is as specified. In case we
* reached the end of completion, no token is consumed and the eoc-token returned.
*
* @param type
* The type of token that you are expecting.
* @return the token that was consumed and removed from our buffer.
* @throws BacktrackException
* If LT(1) != type
*/
protected IToken consumeOrEOC(int type) throws EndOfFileException, BacktrackException {
final IToken la1= LA(1);
final int lt1 = la1.getType();
if (lt1 != type) {
if (lt1 == IToken.tEOC)
return la1;
throwBacktrack(la1);
}
return consume();
}
/**
@ -560,6 +585,16 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
protected abstract IGNUASTCompoundStatementExpression createCompoundStatementExpression();
protected IASTExpression possiblyEmptyExpressionList(int endToken) throws BacktrackException, EndOfFileException {
IToken la1= LA(1);
if (la1.getType() == endToken) {
IASTExpressionList expressionList = createExpressionList();
((ASTNode) expressionList).setOffsetAndLength(la1.getOffset(), 0);
return expressionList;
}
return expression();
}
protected IASTExpression expression() throws BacktrackException, EndOfFileException {
IToken la = LA(1);
int startingOffset = la.getOffset();
@ -593,14 +628,11 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
protected abstract IASTExpression multiplicativeExpression()
throws BacktrackException, EndOfFileException;
protected abstract IASTTypeId typeId(boolean forNewExpression)
throws EndOfFileException;
protected abstract IASTTypeId typeId(DeclarationOptions option) throws EndOfFileException;
protected abstract IASTExpression castExpression()
throws BacktrackException, EndOfFileException;
protected abstract IASTExpression castExpression() throws BacktrackException, EndOfFileException;
protected abstract IASTExpression unaryExpression()
throws BacktrackException, EndOfFileException;
protected abstract IASTExpression unaryExpression() throws BacktrackException, EndOfFileException;
protected abstract IASTExpression buildTypeIdExpression(int op,
IASTTypeId typeId, int startingOffset, int endingOffset);
@ -818,7 +850,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
boolean needBack = false;
try {
consume();
d = typeId(false);
d = typeId(DeclarationOptions.TYPEID);
if (d == null)
needBack = true;
else
@ -862,7 +894,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
}
catch (BacktrackException e) {
backup(m);
d = typeId(false);
d = typeId(DeclarationOptions.TYPEID);
if (d == null)
throw e;
}
@ -874,14 +906,10 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
if (d != null)
return buildTypeIdExpression(IGNUASTTypeIdExpression.op_typeof, d, offset, lastOffset);
if (expression != null)
return buildUnaryExpression(IGNUASTUnaryExpression.op_typeof, expression, offset, lastOffset);
return null;
return buildUnaryExpression(IGNUASTUnaryExpression.op_typeof, expression, offset, lastOffset);
}
protected IASTStatement handleFunctionBody() throws BacktrackException,
EndOfFileException {
protected IASTStatement handleFunctionBody() throws BacktrackException, EndOfFileException {
if (mode == ParserMode.QUICK_PARSE || mode == ParserMode.STRUCTURAL_PARSE) {
IToken curr = LA(1);
IToken last = skipOverCompoundStatement();
@ -896,9 +924,10 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
IASTCompoundStatement cs = createCompoundStatement();
((ASTNode) cs).setOffsetAndLength(curr.getOffset(), last.getEndOffset() - curr.getOffset());
return cs;
} else if (mode == ParserMode.COMPLETE_PARSE)
return functionBody();
return null;
}
// full parse
return functionBody();
}
/**
@ -912,184 +941,50 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
return compoundStatement();
}
protected abstract IASTDeclarator initDeclarator()
throws EndOfFileException, BacktrackException;
protected abstract IASTDeclarator initDeclarator(DeclarationOptions option) throws EndOfFileException, BacktrackException;
/**
* @param flags input flags that are used to make our decision
* @param option the options with which to parse the declaration
* @throws FoundDeclaratorException encountered EOF while looking ahead
*/
protected void lookAheadForDeclarator(Flags flags) throws FoundDeclaratorException {
if (flags.typeId)
return;
protected void lookAheadForDeclarator(final DeclarationOptions option) throws FoundDeclaratorException {
IToken mark = null;
try {
mark = mark();
} catch (EndOfFileException eof) {
return;
}
try
{
if( LT(1) == IToken.tIDENTIFIER && LT(2) == IToken.tIDENTIFIER )
return;
}
catch( EndOfFileException eof )
{
backup( mark );
return;
}
try {
IASTDeclarator d = initDeclarator();
IToken la = LA(1);
backup(mark);
if (la == null || la.getType() == IToken.tEOC)
return;
final ASTNode n = ((ASTNode) d);
final int length = n.getLength();
final int offset = n.getOffset();
if (length == 0)
return;
if (flags.parm) {
ASTNode name = (ASTNode) d.getName();
if (name.getOffset() == offset) {
// fix for bugs 147903 and 179493
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=147903
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=179493
if (name.getLength() == length || d instanceof IASTArrayDeclarator) {
return;
}
}
if (d.getInitializer() != null) {
ASTNode init = (ASTNode) d.getInitializer();
if (name.getOffset() == offset
&& n.getOffset() + n.getLength() == init
.getOffset()
+ init.getLength())
return;
}
final IASTDeclarator dtor= initDeclarator(option);
final IToken la = LA(1);
if (la == null || la == mark)
return;
switch (la.getType()) {
case IToken.tCOMMA:
case IToken.tRPAREN:
throw new FoundDeclaratorException( d, la );
default:
return;
}
}
checkTokenVsDeclarator(la, d);
return;
if (verifyLookaheadDeclarator(option, dtor, la))
throw new FoundDeclaratorException(dtor, la);
} catch (BacktrackException bte) {
backup(mark);
return;
} catch (EndOfFileException e) {
backup(mark);
return;
} finally {
if (mark != null)
backup(mark);
}
}
protected void checkTokenVsDeclarator(IToken la, IASTDeclarator d) throws FoundDeclaratorException {
switch (la.getType()) {
case IToken.tCOMMA:
case IToken.tLBRACE:
throw new FoundDeclaratorException( d, la );
case IToken.tSEMI:
if (d instanceof IASTFieldDeclarator)
return;
throw new FoundDeclaratorException( d, la );
default:
return;
}
}
protected abstract boolean verifyLookaheadDeclarator(DeclarationOptions option, IASTDeclarator d, IToken nextToken);
public static class FoundDeclaratorException extends Exception
{
public static class FoundDeclaratorException extends Exception {
private static final long serialVersionUID = 0;
public final IASTDeclarator declarator;
public final IToken currToken;
public IASTDeclSpecifier declSpec;
public IASTDeclarator declarator;
public FoundDeclaratorException( IASTDeclarator d, IToken t )
{
public IASTDeclSpecifier altSpec;
public IASTDeclarator altDeclarator;
public IToken currToken;
public FoundDeclaratorException(IASTDeclarator d, IToken t) {
this.declarator = d;
this.currToken =t;
}
}
public static class Flags {
private boolean encounteredTypename = false;
// have we encountered a typeName yet?
private boolean encounteredRawType = false;
// have we encountered a raw type yet?
boolean parm = false;
// is this for a simpleDeclaration or parameterDeclaration?
boolean constructor = false;
boolean typeId = false;
// are we attempting the constructor strategy?
public Flags(boolean parm, boolean c, boolean t) {
this.parm = parm;
constructor = c;
typeId = t;
}
public Flags(boolean parm, boolean typeId) {
this(parm, false, typeId);
}
/**
* @return true if we have encountered a simple type up to this point,
* false otherwise
*/
public boolean haveEncounteredRawType() {
return encounteredRawType;
}
/**
* @return true if we have encountered a typename up to this point,
* false otherwise
*/
public boolean haveEncounteredTypename() {
return encounteredTypename;
}
/**
* @param b -
* set to true if we encounter a raw type (int, short, etc.)
*/
public void setEncounteredRawType(boolean b) {
encounteredRawType = b;
}
/**
* @param b -
* set to true if we encounter a typename
*/
public void setEncounteredTypename(boolean b) {
encounteredTypename = b;
}
/**
* @return true if we are parsing for a ParameterDeclaration
*/
public boolean isForParameterDeclaration() {
return parm;
}
/**
* @return whether or not we are attempting the constructor strategy or
* not
*/
public boolean isForConstructor() {
return constructor;
}
}
/**
* Parse an enumeration specifier, as according to the ANSI specs in C &
* C++. enumSpecifier: "enum" (name)? "{" (enumerator-list) "}"
@ -1246,8 +1141,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
protected abstract IASTCaseStatement createCaseStatement();
protected abstract IASTDeclaration declaration() throws BacktrackException,
EndOfFileException;
protected abstract IASTDeclaration declaration(DeclarationOptions option) throws BacktrackException, EndOfFileException;
protected IASTDeclaration asmDeclaration() throws EndOfFileException,
@ -1330,7 +1224,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
* This method will attempt to parse a statement as both an expression and a declaration,
* if both parses succeed then an ambiguity node is returned.
*/
protected IASTStatement parseDeclarationOrExpressionStatement() throws EndOfFileException, BacktrackException {
protected IASTStatement parseDeclarationOrExpressionStatement(DeclarationOptions option) throws EndOfFileException, BacktrackException {
// First attempt to parse an expressionStatement
// Note: the function style cast ambiguity is handled in expression
// Since it only happens when we are in a statement
@ -1354,7 +1248,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
// Now attempt to parse a declarationStatement
IASTDeclarationStatement ds = null;
try {
IASTDeclaration d = declaration();
IASTDeclaration d = declaration(option);
ds = createDeclarationStatement();
ds.setDeclaration(d);
((ASTNode) ds).setOffsetAndLength(((ASTNode) d).getOffset(), ((ASTNode) d).getLength());
@ -1369,10 +1263,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
return ds;
}
if (ds == null) {
while (true) {
if (consume() == lastTokenOfExpression)
break;
}
backup(lastTokenOfExpression); consume();
return expressionStatement;
}
@ -1396,61 +1287,49 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
}
}
// x = y; // implicit int
// valid at Translation Unit scope but not valid as a statement in a function body
if(isImplicitInt(ds.getDeclaration())) {
backup(mark);
while (true) {
if (consume() == lastTokenOfExpression)
break;
}
final IASTDeclaration declaration = ds.getDeclaration();
if (declaration instanceof IASTSimpleDeclaration) {
final IASTSimpleDeclaration simpleDecl = (IASTSimpleDeclaration) declaration;
IASTDeclSpecifier declspec= simpleDecl.getDeclSpecifier();
if (declspec instanceof IASTNamedTypeSpecifier) {
final IASTDeclarator[] declarators = simpleDecl.getDeclarators();
return expressionStatement;
}
// x;
// can be parsed as a named declaration specifier without a declarator
if (declarators.length == 0) {
backup(lastTokenOfExpression); consume();
return expressionStatement;
}
// generalization of the previous check for implicit int
if (ds.getDeclaration() instanceof IASTAmbiguousDeclaration ) {
IASTAmbiguousDeclaration amb = (IASTAmbiguousDeclaration) ds.getDeclaration();
boolean allImplicitInt = true;
for(IASTDeclaration ambD : amb.getDeclarations()) {
if(!isImplicitInt(ambD)) {
allImplicitInt = false;
break;
}
}
if(allImplicitInt) {
backup(mark);
while (true) {
if (consume() == lastTokenOfExpression)
break;
}
return expressionStatement;
}
}
// a function call interpreted as declaration: 'func(x);' --> 'func x;'
if (declarators.length == 1) {
IASTName name= ((IASTNamedTypeSpecifier) declspec).getName();
final IASTDeclarator dtor= declarators[0];
if (name.contains(declspec)) {
if (dtor.getNestedDeclarator() != null) {
if (dtor instanceof IASTAmbiguousDeclarator == false
&& dtor instanceof IASTArrayDeclarator == false
&& dtor instanceof IASTFieldDeclarator == false
&& dtor instanceof IASTFunctionDeclarator == false) {
backup(lastTokenOfExpression); consume();
return expressionStatement;
}
}
}
// x;
// a single identifier can be parsed as a named declaration specifier without a declarator
if(ds.getDeclaration() instanceof IASTSimpleDeclaration &&
((IASTSimpleDeclaration) ds.getDeclaration()).getDeclSpecifier() instanceof IASTNamedTypeSpecifier) {
final IASTDeclarator[] declarators = ((IASTSimpleDeclaration) ds.getDeclaration()).getDeclarators();
if (declarators.length == 0
|| (declarators.length == 1 && (declarators[0].getName()
.toCharArray().length == 0 && declarators[0]
.getNestedDeclarator() == null))) {
backup(mark);
while (true) {
if (consume() == lastTokenOfExpression)
break;
}
return expressionStatement;
}
}
if (dtor.getName().toCharArray().length == 0 && dtor.getNestedDeclarator() == null) {
throw new Error();
// backup(lastTokenOfExpression); consume();
// return expressionStatement;
}
}
}
}
// create and return ambiguity node
IASTAmbiguousStatement statement = createAmbiguousStatement();
statement.addStatement(ds);
statement.addStatement(expressionStatement);
statement.addStatement(ds);
((ASTNode) statement).setOffsetAndLength((ASTNode) ds);
return statement;
}
@ -1746,7 +1625,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
try {
if (typeIdWithParentheses)
consume(IToken.tLPAREN);
typeId = typeId(false);
typeId = typeId(DeclarationOptions.TYPEID);
if (typeId != null) {
if (typeIdWithParentheses) {
switch (LT(1)) {
@ -1827,16 +1706,13 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
return null;
}
protected abstract IASTDeclaration simpleDeclaration() throws BacktrackException,
EndOfFileException;
/**
* @throws BacktrackException
*/
protected IASTStatement forInitStatement() throws BacktrackException, EndOfFileException {
protected IASTStatement forInitStatement(DeclarationOptions option) throws BacktrackException, EndOfFileException {
if( LT(1) == IToken.tSEMI )
return parseNullStatement();
return parseDeclarationOrExpressionStatement();
return parseDeclarationOrExpressionStatement(option);
}
/**

View file

@ -0,0 +1,60 @@
/*******************************************************************************
* Copyright (c) 2008 Wind River Systems, Inc. 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:
* Markus Schorn - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser;
/**
* Configures the parsing of a declaration in various contexts.
* @since 5.0
*/
public class DeclarationOptions {
final public static int ALLOW_EMPTY_SPECIFIER= 0x01;
final public static int ALLOW_ABSTRACT= 0x02;
final public static int REQUIRE_ABSTRACT= 0x04;
final public static int ALLOW_BITFIELD= 0x08;
final public static int NO_INITIALIZER= 0x10;
final public static int ALLOW_CONSTRUCTOR_INITIALIZER= 0x20;
final public static int NO_FUNCTIONS= 0x40;
final public static int NO_ARRAYS= 0x80;
final public static int NO_NESTED= 0x100;
public static final DeclarationOptions
GLOBAL= new DeclarationOptions(ALLOW_EMPTY_SPECIFIER | ALLOW_CONSTRUCTOR_INITIALIZER),
C_MEMBER= new DeclarationOptions(ALLOW_BITFIELD),
CPP_MEMBER= new DeclarationOptions(ALLOW_EMPTY_SPECIFIER | ALLOW_BITFIELD | ALLOW_CONSTRUCTOR_INITIALIZER),
LOCAL= new DeclarationOptions(ALLOW_CONSTRUCTOR_INITIALIZER),
PARAMETER= new DeclarationOptions(ALLOW_ABSTRACT),
TYPEID= new DeclarationOptions(REQUIRE_ABSTRACT | NO_INITIALIZER),
TYPEID_NEW= new DeclarationOptions(REQUIRE_ABSTRACT | NO_INITIALIZER | NO_FUNCTIONS | NO_NESTED),
TYPEID_CONVERSION= new DeclarationOptions(REQUIRE_ABSTRACT | NO_INITIALIZER | NO_FUNCTIONS | NO_NESTED),
EXCEPTION= new DeclarationOptions(ALLOW_ABSTRACT | NO_INITIALIZER),
CONDITION= new DeclarationOptions(ALLOW_CONSTRUCTOR_INITIALIZER),
C_PARAMETER_NON_ABSTRACT= new DeclarationOptions(ALLOW_ABSTRACT | ALLOW_EMPTY_SPECIFIER);
final public boolean fAllowEmptySpecifier;
final public boolean fAllowAbstract;
final public boolean fRequireAbstract;
final public boolean fAllowBitField;
final public boolean fAllowInitializer;
final public boolean fAllowConstructorInitializer;
final public boolean fAllowFunctions;
final public boolean fAllowNested;
public DeclarationOptions(int options) {
fAllowEmptySpecifier= (options & ALLOW_EMPTY_SPECIFIER) != 0;
fRequireAbstract= (options & REQUIRE_ABSTRACT) != 0;
fAllowAbstract= fRequireAbstract || (options & ALLOW_ABSTRACT) != 0;
fAllowBitField= (options & ALLOW_BITFIELD) != 0;
fAllowInitializer= (options & NO_INITIALIZER) == 0;
fAllowConstructorInitializer= fAllowInitializer && (options & ALLOW_CONSTRUCTOR_INITIALIZER) != 0;
fAllowFunctions= (options & NO_FUNCTIONS) == 0;
fAllowNested= (options & NO_NESTED) == 0;
}
}

View file

@ -0,0 +1,33 @@
/*******************************************************************************
* Copyright (c) 2008 IBM Wind River Systems, Inc. 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:
* Markus Schorn - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser;
import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
/**
* Needed to handle the ambiguous declarator.
* @since 5.0
*/
public interface IASTAmbiguousDeclarator extends IASTDeclarator {
public static final ASTNodeProperty SUBDECLARATOR = new ASTNodeProperty( "IASTAmbiguousDeclarator.SUBDECLARATOR"); //$NON-NLS-1$
/**
* Add an alternative to this ambiguous declarator.
*/
public void addDeclarator(IASTDeclarator e);
/**
* Return an array of all alternatives for this ambiguous declarator.
*/
public IASTDeclarator[] getDeclarators();
}

View file

@ -0,0 +1,33 @@
/*******************************************************************************
* Copyright (c) 2008 IBM Wind River Systems, Inc. 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:
* Markus Schorn - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser;
import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration;
/**
* Needed to handle the ambiguity for parameter declarations in plain C
* @since 5.0
*/
public interface IASTAmbiguousParameterDeclaration extends IASTParameterDeclaration {
public static final ASTNodeProperty SUBDECLARATION = new ASTNodeProperty( "IASTAmbiguousParameterDeclaration.SUBDECLARATION"); //$NON-NLS-1$
/**
* Add an alternative to this ambiguous parameter declaration.
*/
public void addParameterDeclaration(IASTParameterDeclaration e);
/**
* Return an array of all alternatives for this ambiguous parameter declaration.
*/
public IASTParameterDeclaration[] getParameterDeclarations();
}

View file

@ -0,0 +1,95 @@
/*******************************************************************************
* Copyright (c) 2008 IBM Wind River Systems, Inc. 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:
* Markus Schorn - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.c;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTPointerOperator;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousDeclarator;
import org.eclipse.core.runtime.Assert;
/**
* Handles ambiguities when parsing declarators.
* <br>
* Example: void f(int (D)); // is D a type?
* @since 5.0.1
*/
public class CASTAmbiguousDeclarator extends CASTAmbiguity implements IASTAmbiguousDeclarator {
private IASTDeclarator[] dtors = new IASTDeclarator[2];
private int dtorPos=-1;
public CASTAmbiguousDeclarator(IASTDeclarator... decls) {
for(IASTDeclarator d : decls) {
if (d != null) {
addDeclarator(d);
}
}
}
public void addDeclarator(IASTDeclarator d) {
if (d != null) {
dtors = (IASTDeclarator[]) ArrayUtil.append(IASTDeclarator.class, dtors, ++dtorPos, d);
d.setParent(this);
d.setPropertyInParent(SUBDECLARATOR);
}
}
public IASTDeclarator[] getDeclarators() {
dtors = (IASTDeclarator[]) ArrayUtil.removeNullsAfter(IASTDeclarator.class, dtors, dtorPos );
return dtors;
}
@Override
protected IASTNode[] getNodes() {
return getDeclarators();
}
public IASTInitializer getInitializer() {
return dtors[0].getInitializer();
}
public IASTName getName() {
return dtors[0].getName();
}
public IASTDeclarator getNestedDeclarator() {
return dtors[0].getNestedDeclarator();
}
public IASTPointerOperator[] getPointerOperators() {
return dtors[0].getPointerOperators();
}
public int getRoleForName(IASTName name) {
return dtors[0].getRoleForName(name);
}
public void addPointerOperator(IASTPointerOperator operator) {
Assert.isLegal(false);
}
public void setInitializer(IASTInitializer initializer) {
Assert.isLegal(false);
}
public void setName(IASTName name) {
Assert.isLegal(false);
}
public void setNestedDeclarator(IASTDeclarator nested) {
Assert.isLegal(false);
}
}

View file

@ -0,0 +1,71 @@
/*******************************************************************************
* Copyright (c) 2008 IBM Wind River Systems, Inc. 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:
* Markus Schorn - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.c;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousParameterDeclaration;
import org.eclipse.core.runtime.Assert;
/**
* Handles ambiguities for parameter declarations.
* <br>
* void function(const D*); // is D a type?
* @since 5.0.1
*/
public class CASTAmbiguousParameterDeclaration extends CASTAmbiguity implements IASTAmbiguousParameterDeclaration {
private IASTParameterDeclaration[] paramDecls = new IASTParameterDeclaration[2];
private int declPos=-1;
public CASTAmbiguousParameterDeclaration(IASTParameterDeclaration... decls) {
for(IASTParameterDeclaration d : decls)
addParameterDeclaration(d);
}
public void addParameterDeclaration(IASTParameterDeclaration d) {
if (d != null) {
paramDecls = (IASTParameterDeclaration[]) ArrayUtil.append(IASTParameterDeclaration.class, paramDecls, ++declPos, d);
d.setParent(this);
d.setPropertyInParent(SUBDECLARATION);
}
}
public IASTParameterDeclaration[] getParameterDeclarations() {
paramDecls = (IASTParameterDeclaration[]) ArrayUtil.removeNullsAfter(IASTParameterDeclaration.class, paramDecls, declPos );
return paramDecls;
}
@Override
protected IASTNode[] getNodes() {
return getParameterDeclarations();
}
public IASTDeclSpecifier getDeclSpecifier() {
return paramDecls[0].getDeclSpecifier();
}
public IASTDeclarator getDeclarator() {
return paramDecls[0].getDeclarator();
}
public void setDeclSpecifier(IASTDeclSpecifier declSpec) {
Assert.isLegal(false);
}
public void setDeclarator(IASTDeclarator declarator) {
Assert.isLegal(false);
}
}

View file

@ -6,7 +6,8 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Rational Software - Initial API and implementation
* IBM Rational Software - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.c;

View file

@ -26,11 +26,12 @@ import org.eclipse.cdt.core.dom.ast.IASTPointerOperator;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent;
/**
* @author jcamelon
*/
public class CASTDeclarator extends CASTNode implements IASTDeclarator {
public class CASTDeclarator extends CASTNode implements IASTDeclarator, IASTAmbiguityParent {
private IASTInitializer initializer;
private IASTName name;
@ -207,4 +208,12 @@ public class CASTDeclarator extends CASTNode implements IASTDeclarator {
}
return r_unclear;
}
public void replace(IASTNode child, IASTNode other) {
if (child == nestedDeclarator) {
other.setPropertyInParent(child.getPropertyInParent());
other.setParent(child.getParent());
nestedDeclarator= (IASTDeclarator) other;
}
}
}

View file

@ -6,7 +6,8 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Rational Software - Initial API and implementation
* IBM Rational Software - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.c;
@ -16,17 +17,13 @@ import org.eclipse.cdt.core.dom.ast.IASTFieldDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent;
/**
* @author jcamelon
*/
public class CASTFieldDeclarator extends CASTDeclarator implements
IASTFieldDeclarator, IASTAmbiguityParent {
public class CASTFieldDeclarator extends CASTDeclarator implements IASTFieldDeclarator {
private IASTExpression bitFieldSize;
public CASTFieldDeclarator() {
}
@ -57,12 +54,14 @@ public class CASTFieldDeclarator extends CASTDeclarator implements
return true;
}
public void replace(IASTNode child, IASTNode other) {
if( child == bitFieldSize)
{
@Override
public void replace(IASTNode child, IASTNode other) {
if( child == bitFieldSize) {
other.setPropertyInParent( child.getPropertyInParent() );
other.setParent( child.getParent() );
bitFieldSize = (IASTExpression) other;
} else {
super.replace(child, other);
}
}

View file

@ -6,13 +6,14 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Rational Software - Initial API and implementation
* Markus Schorn (Wind River Systems)
* IBM Rational Software - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.c;
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTStandardFunctionDeclarator;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
@ -26,8 +27,6 @@ public class CASTFunctionDeclarator extends CASTDeclarator implements IASTStanda
private int parametersPos=-1;
private boolean varArgs;
public CASTFunctionDeclarator() {
}
@ -65,4 +64,19 @@ public class CASTFunctionDeclarator extends CASTDeclarator implements IASTStanda
}
return true;
}
@Override
public void replace(IASTNode child, IASTNode other) {
if( parameters != null ) {
for (int i = 0; i < parameters.length; ++i) {
if (child == parameters[i]) {
other.setPropertyInParent(child.getPropertyInParent());
other.setParent(child.getParent());
parameters[i]= (IASTParameterDeclaration) other;
return;
}
}
}
super.replace(child, other);
}
}

View file

@ -223,4 +223,8 @@ public class CASTName extends CASTNode implements IASTName, IASTCompletionContex
}
return (IBinding[])ArrayUtil.removeNulls(IBinding.class, bindings);
}
public IASTName getLastName() {
return this;
}
}

View file

@ -6,22 +6,23 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Rational Software - Initial API and implementation
* Yuan Zhang / Beth Tibbitts (IBM Research)
* IBM Rational Software - Initial API and implementation
* Yuan Zhang / Beth Tibbitts (IBM Research)
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.c;
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent;
/**
* @author jcamelon
*/
public class CASTParameterDeclaration extends CASTNode implements
IASTParameterDeclaration {
public class CASTParameterDeclaration extends CASTNode implements IASTParameterDeclaration, IASTAmbiguityParent {
private IASTDeclSpecifier declSpec;
private IASTDeclarator declarator;
@ -79,4 +80,12 @@ public class CASTParameterDeclaration extends CASTNode implements
}
return true;
}
public void replace(IASTNode child, IASTNode other) {
if (child == declarator) {
other.setPropertyInParent(child.getPropertyInParent());
other.setParent(child.getParent());
declarator= (IASTDeclarator) other;
}
}
}

View file

@ -6,8 +6,8 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Rational Software - Initial API and implementation
* Markus Schorn (Wind River Systems)
* IBM Rational Software - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.c;
@ -53,8 +53,9 @@ public class CBasicType implements ICBasicType {
if( type == IBasicType.t_unspecified ){
if( (qualifiers & ( IS_COMPLEX | IS_IMAGINARY )) != 0 )
type = IBasicType.t_float;
else if( (qualifiers & ~( IS_COMPLEX | IS_IMAGINARY )) != 0 )
else {
type = IBasicType.t_int;
}
}
}
@ -65,8 +66,9 @@ public class CBasicType implements ICBasicType {
if( type == IBasicType.t_unspecified ){
if( (qualifiers & ( IS_COMPLEX | IS_IMAGINARY )) != 0 )
type = IBasicType.t_float;
else if( (qualifiers & ~( IS_COMPLEX | IS_IMAGINARY )) != 0 )
else {
type = IBasicType.t_int;
}
}
}

View file

@ -36,6 +36,7 @@ import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTExpressionList;
import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement;
import org.eclipse.cdt.core.dom.ast.IASTFieldDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFieldReference;
import org.eclipse.cdt.core.dom.ast.IASTForStatement;
import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression;
@ -2156,4 +2157,55 @@ public class CVisitor {
return true;
}
/**
* Returns the innermost declarator nested within the given <code>declarator</code>, or
* <code>declarator</code> itself.
* @since 5.0
*/
public static IASTDeclarator findInnermostDeclarator(IASTDeclarator declarator) {
IASTDeclarator innermost= null;
while(declarator != null) {
innermost= declarator;
declarator= declarator.getNestedDeclarator();
}
return innermost;
}
/**
* Returns the outermost declarator the given <code>declarator</code> nests within, or
* <code>declarator</code> itself.
* @since 5.0
*/
public static IASTDeclarator findOutermostDeclarator(IASTDeclarator declarator) {
while(true) {
IASTNode parent= declarator.getParent();
if (parent instanceof IASTDeclarator) {
declarator= (IASTDeclarator) parent;
} else {
return declarator;
}
}
}
/**
* Searches for the innermost declarator that contributes the the type declared.
* @since 5.0
*/
public static IASTDeclarator findTypeRelevantDeclarator(IASTDeclarator declarator) {
IASTDeclarator result= findInnermostDeclarator(declarator);
while (result.getPointerOperators().length == 0
&& result instanceof IASTFieldDeclarator == false
&& result instanceof IASTFunctionDeclarator == false
&& result instanceof IASTArrayModifier == false) {
final IASTNode parent= result.getParent();
if (parent instanceof IASTDeclarator) {
result= (IASTDeclarator) parent;
} else {
return result;
}
}
return result;
}
}

View file

@ -0,0 +1,95 @@
/*******************************************************************************
* Copyright (c) 2008 IBM Wind River Systems, Inc. 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:
* Markus Schorn - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTPointerOperator;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousDeclarator;
import org.eclipse.core.runtime.Assert;
/**
* Handles ambiguities when parsing declarators.
* <br>
* Example: void f(int (D)); // is D a type?
* @since 5.0.1
*/
public class CPPASTAmbiguousDeclarator extends CPPASTAmbiguity implements IASTAmbiguousDeclarator {
private IASTDeclarator[] dtors = new IASTDeclarator[2];
private int dtorPos=-1;
public CPPASTAmbiguousDeclarator(IASTDeclarator... decls) {
for(IASTDeclarator d : decls) {
if (d != null) {
addDeclarator(d);
}
}
}
public void addDeclarator(IASTDeclarator d) {
if (d != null) {
dtors = (IASTDeclarator[]) ArrayUtil.append(IASTDeclarator.class, dtors, ++dtorPos, d);
d.setParent(this);
d.setPropertyInParent(SUBDECLARATOR);
}
}
public IASTDeclarator[] getDeclarators() {
dtors = (IASTDeclarator[]) ArrayUtil.removeNullsAfter(IASTDeclarator.class, dtors, dtorPos );
return dtors;
}
@Override
protected IASTNode[] getNodes() {
return getDeclarators();
}
public IASTInitializer getInitializer() {
return dtors[0].getInitializer();
}
public IASTName getName() {
return dtors[0].getName();
}
public IASTDeclarator getNestedDeclarator() {
return dtors[0].getNestedDeclarator();
}
public IASTPointerOperator[] getPointerOperators() {
return dtors[0].getPointerOperators();
}
public int getRoleForName(IASTName name) {
return dtors[0].getRoleForName(name);
}
public void addPointerOperator(IASTPointerOperator operator) {
Assert.isLegal(false);
}
public void setInitializer(IASTInitializer initializer) {
Assert.isLegal(false);
}
public void setName(IASTName name) {
Assert.isLegal(false);
}
public void setNestedDeclarator(IASTDeclarator nested) {
Assert.isLegal(false);
}
}

View file

@ -25,6 +25,7 @@ import org.eclipse.cdt.core.dom.ast.IASTPointerOperator;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
/**
* @author jcamelon
@ -115,22 +116,19 @@ public class CPPASTDeclarator extends CPPASTNode implements IASTDeclarator {
if( !ptrOps[i].accept( action ) ) return false;
}
if( getPropertyInParent() != IASTTypeId.ABSTRACT_DECLARATOR &&
nestedDeclarator == null )
{
if( getParent() instanceof IASTDeclarator )
{
IASTDeclarator outermostDeclarator = (IASTDeclarator) getParent();
while( outermostDeclarator.getParent() instanceof IASTDeclarator )
outermostDeclarator = (IASTDeclarator) outermostDeclarator.getParent();
if( outermostDeclarator.getPropertyInParent() != IASTTypeId.ABSTRACT_DECLARATOR )
if( name != null ) if( !name.accept( action ) ) return false;
if (nestedDeclarator == null && name != null) {
IASTDeclarator outermost= CPPVisitor.findOutermostDeclarator(this);
if (outermost.getPropertyInParent() != IASTTypeId.ABSTRACT_DECLARATOR) {
if (!name.accept(action)) return false;
}
else
if( name != null ) if( !name.accept( action ) ) return false;
}
if( nestedDeclarator != null ) if( !nestedDeclarator.accept( action ) ) return false;
if (nestedDeclarator != null) {
if (!nestedDeclarator.accept(action)) return false;
}
if (!postAccept(action))
return false;
if( action.shouldVisitDeclarators ){
switch( action.leave( this ) ){
@ -139,8 +137,7 @@ public class CPPASTDeclarator extends CPPASTNode implements IASTDeclarator {
default : break;
}
}
return postAccept( action );
return true;
}
protected boolean postAccept( ASTVisitor action ){

View file

@ -274,4 +274,8 @@ public class CPPASTName extends CPPASTNode implements IASTName, IASTCompletionCo
public ILinkage getLinkage() {
return Linkage.CPP_LINKAGE;
}
public IASTName getLastName() {
return this;
}
}

View file

@ -6,19 +6,25 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
* IBM - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp;
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.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTPointerOperator;
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNewExpression;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
import org.eclipse.core.runtime.Assert;
/**
* @author jcamelon
@ -32,6 +38,9 @@ public class CPPASTNewExpression extends CPPASTNode implements
private IASTTypeId typeId;
private boolean isNewTypeId;
private IASTExpression [] arrayExpressions = null;
public CPPASTNewExpression() {
}
@ -96,20 +105,44 @@ public class CPPASTNewExpression extends CPPASTNode implements
}
public IASTExpression [] getNewTypeIdArrayExpressions() {
if( arrayExpressions == null ) return IASTExpression.EMPTY_EXPRESSION_ARRAY;
return (IASTExpression[]) ArrayUtil.trim( IASTExpression.class, arrayExpressions );
if( arrayExpressions == null ) {
if (typeId != null) {
IASTDeclarator dtor= CPPVisitor.findInnermostDeclarator(typeId.getAbstractDeclarator());
if (dtor instanceof IASTArrayDeclarator) {
IASTArrayDeclarator ad= (IASTArrayDeclarator) dtor;
IASTArrayModifier[] ams= ad.getArrayModifiers();
arrayExpressions= new IASTExpression[ams.length];
for (int i = 0; i < ams.length; i++) {
IASTArrayModifier am = ams[i];
arrayExpressions[i]= am.getConstantExpression();
}
return arrayExpressions;
}
}
arrayExpressions= IASTExpression.EMPTY_EXPRESSION_ARRAY;
}
return arrayExpressions;
}
public void addNewTypeIdArrayExpression(IASTExpression expression) {
arrayExpressions = (IASTExpression[]) ArrayUtil.append( IASTExpression.class, arrayExpressions, expression );
if(expression != null) {
expression.setParent(this);
expression.setPropertyInParent(NEW_TYPEID_ARRAY_EXPRESSION);
}
Assert.isNotNull(typeId);
IASTDeclarator dtor= CPPVisitor.findInnermostDeclarator(typeId.getAbstractDeclarator());
if (dtor instanceof IASTArrayDeclarator == false) {
Assert.isNotNull(dtor);
Assert.isTrue(dtor.getParent() == typeId);
IASTArrayDeclarator adtor= new CPPASTArrayDeclarator(dtor.getName());
IASTPointerOperator[] ptrOps= dtor.getPointerOperators();
for (IASTPointerOperator ptr : ptrOps) {
adtor.addPointerOperator(ptr);
}
typeId.setAbstractDeclarator(adtor);
dtor= adtor;
}
IASTArrayModifier mod= new CPPASTArrayModifier(expression);
((ASTNode) mod).setOffsetAndLength((ASTNode)expression);
((IASTArrayDeclarator) dtor).addArrayModifier(mod);
}
private IASTExpression [] arrayExpressions = null;
@Override
public boolean accept( ASTVisitor action ){
if( action.shouldVisitExpressions ){
@ -122,11 +155,6 @@ public class CPPASTNewExpression extends CPPASTNode implements
if( placement != null ) if( !placement.accept( action ) ) return false;
if( typeId != null ) if( !typeId.accept( action ) ) return false;
IASTExpression [] exps = getNewTypeIdArrayExpressions();
for( int i = 0; i < exps.length; i++ )
if( !exps[i].accept( action ) ) return false;
if( initializer != null ) if( !initializer.accept( action ) ) return false;
if( action.shouldVisitExpressions ){
@ -152,14 +180,6 @@ public class CPPASTNewExpression extends CPPASTNode implements
other.setParent( child.getParent() );
initializer = (IASTExpression) other;
}
if( arrayExpressions == null ) return;
for( int i = 0; i < arrayExpressions.length; ++i )
if( arrayExpressions[i] == child )
{
other.setPropertyInParent( child.getPropertyInParent() );
other.setParent( child.getParent() );
arrayExpressions[i] = (IASTExpression) other;
}
}
public IType getExpressionType() {

View file

@ -6,19 +6,22 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
* IBM - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTParameterDeclaration;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent;
/**
* @author jcamelon
*/
public class CPPASTParameterDeclaration extends CPPASTNode implements ICPPASTParameterDeclaration {
public class CPPASTParameterDeclaration extends CPPASTNode implements ICPPASTParameterDeclaration, IASTAmbiguityParent {
private IASTDeclSpecifier declSpec;
private IASTDeclarator declarator;
@ -78,4 +81,12 @@ public class CPPASTParameterDeclaration extends CPPASTNode implements ICPPASTPar
}
return true;
}
public void replace(IASTNode child, IASTNode other) {
if (child == declarator) {
other.setPropertyInParent(child.getPropertyInParent());
other.setParent(child.getParent());
declarator= (IASTDeclarator) other;
}
}
}

View file

@ -99,10 +99,10 @@ public class CPPASTQualifiedName extends CPPASTNode implements
}
public IASTName getLastName() {
if (names == null || names.length == 0)
if (namesPos < 0)
return null;
return names[names.length - 1];
return names[namesPos];
}
public char[] toCharArray() {

View file

@ -197,10 +197,11 @@ public class CPPASTTemplateId extends CPPASTNode implements ICPPASTTemplateId, I
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IASTName#getLinkage()
*/
public ILinkage getLinkage() {
return Linkage.CPP_LINKAGE;
}
public IASTName getLastName() {
return this;
}
}

View file

@ -39,6 +39,7 @@ import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTExpressionList;
import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement;
import org.eclipse.cdt.core.dom.ast.IASTFieldDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFieldReference;
import org.eclipse.cdt.core.dom.ast.IASTForStatement;
import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression;
@ -2439,4 +2440,54 @@ public class CPPVisitor {
}
return e1;
}
/**
* Returns the outermost declarator the given <code>declarator</code> nests within, or
* <code>declarator</code> itself.
* @since 5.0
*/
public static IASTDeclarator findOutermostDeclarator(IASTDeclarator declarator) {
while(true) {
IASTNode parent= declarator.getParent();
if (parent instanceof IASTDeclarator) {
declarator= (IASTDeclarator) parent;
} else {
return declarator;
}
}
}
/**
* Returns the innermost declarator nested within the given <code>declarator</code>, or
* <code>declarator</code> itself.
* @since 5.1
*/
public static IASTDeclarator findInnermostDeclarator(IASTDeclarator declarator) {
IASTDeclarator innermost= null;
while(declarator != null) {
innermost= declarator;
declarator= declarator.getNestedDeclarator();
}
return innermost;
}
/**
* Searches for the innermost declarator that contributes the the type declared.
* @since 5.1
*/
public static IASTDeclarator findTypeRelevantDeclarator(IASTDeclarator declarator) {
IASTDeclarator result= findInnermostDeclarator(declarator);
while (result.getPointerOperators().length == 0
&& result instanceof IASTFieldDeclarator == false
&& result instanceof IASTFunctionDeclarator == false
&& result instanceof IASTArrayModifier == false) {
final IASTNode parent= result.getParent();
if (parent instanceof IASTDeclarator) {
result= (IASTDeclarator) parent;
} else {
return result;
}
}
return result;
}
}

View file

@ -11,6 +11,8 @@
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.rewrite.astwriter;
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTArrayModifier;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.internal.core.dom.rewrite.ASTModificationStore;
import org.eclipse.cdt.internal.core.dom.rewrite.changegenerator.ChangeGeneratorWriterVisitor;
@ -78,7 +80,16 @@ public class ASTWriter {
*/
public String write(IASTNode rootNode, String fileScope, NodeCommentMap commentMap) throws ProblemRuntimeException {
transformationVisitor = new ChangeGeneratorWriterVisitor(modificationStore, givenIndentation, fileScope, commentMap);
rootNode.accept(transformationVisitor);
// mstodo: workaround for
if (rootNode instanceof IASTArrayModifier) {
int result= transformationVisitor.visit((IASTArrayModifier) rootNode);
if (result == ASTVisitor.PROCESS_CONTINUE) {
rootNode.accept(transformationVisitor);
}
} else {
rootNode.accept(transformationVisitor);
}
String str = transformationVisitor.toString();
transformationVisitor.cleanCache();
return str;

View file

@ -7,11 +7,13 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Institute for Software - initial API and implementation
* Institute for Software - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.rewrite.astwriter;
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTArrayModifier;
import org.eclipse.cdt.core.dom.ast.IASTComment;
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
@ -200,6 +202,12 @@ public class ASTWriterVisitor extends CPPASTVisitor {
return ASTVisitor.PROCESS_SKIP;
}
public int visit(IASTArrayModifier amod) {
if(!macroHandler.checkisMacroExpansionNode(amod)) {
declaratorWriter.writeArrayModifier(amod);
}
return ASTVisitor.PROCESS_SKIP;
}
@Override

View file

@ -7,7 +7,8 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Institute for Software - initial API and implementation
* Institute for Software - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.rewrite.astwriter;
@ -15,6 +16,7 @@ import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTArrayModifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTFieldDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
import org.eclipse.cdt.core.dom.ast.IASTName;
@ -254,12 +256,18 @@ public class DeclaratorWriter extends NodeWriter {
protected void writeArrayModifiers(IASTArrayDeclarator arrDecl, IASTArrayModifier[] arrMods) {
for (IASTArrayModifier modifier : arrMods) {
scribe.print('[');
modifier.accept(visitor);
scribe.print(']');
writeArrayModifier(modifier);
}
}
protected void writeArrayModifier(IASTArrayModifier modifier) {
scribe.print('[');
IASTExpression ex= modifier.getConstantExpression();
if (ex != null) {
ex.accept(visitor);
}
scribe.print(']');
}
private void writeFieldDeclarator(IASTFieldDeclarator fieldDecl) {
IASTPointerOperator[] pointOps = fieldDecl.getPointerOperators();

View file

@ -353,25 +353,14 @@ public class ExpressionWriter extends NodeWriter{
IASTTypeId typeId = newExp.getTypeId();
visitNodeIfNotNull(typeId);
IASTExpression[] arraySizeExpressions = getNewTypeIdArrayExpressions(newExp, newExp.getNewTypeIdArrayExpressions());
for (IASTExpression expression : arraySizeExpressions) {
scribe.print('[');
expression.accept(visitor);
scribe.print(']');
}
if (arraySizeExpressions.length == 0 ) {
IASTExpression initExp= getNewInitializer(newExp);
if (initExp != null) {
scribe.print('(');
IASTExpression initExp = getNewInitializer(newExp);
visitNodeIfNotNull(initExp);
initExp.accept(visitor);
scribe.print(')');
}
}
protected IASTExpression[] getNewTypeIdArrayExpressions(
ICPPASTNewExpression newExp, IASTExpression[] expressions) {
return newExp.getNewTypeIdArrayExpressions();
}
protected IASTExpression getNewInitializer(ICPPASTNewExpression newExp) {
return newExp.getNewInitializer();
}

View file

@ -7,7 +7,8 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Institute for Software - initial API and implementation
* Institute for Software - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.rewrite.changegenerator;
@ -16,6 +17,8 @@ import java.util.LinkedHashMap;
import java.util.List;
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.IASTComment;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
@ -26,10 +29,13 @@ import org.eclipse.cdt.core.dom.ast.IASTInitializer;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTPointerOperator;
import org.eclipse.cdt.core.dom.ast.IASTStatement;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
import org.eclipse.cdt.internal.core.dom.rewrite.ASTModification;
import org.eclipse.cdt.internal.core.dom.rewrite.ASTModificationMap;
import org.eclipse.cdt.internal.core.dom.rewrite.ASTModificationStore;
@ -132,7 +138,7 @@ public class ChangeGenerator extends CPPASTVisitor {
private IASTNode determineParentToBeRewritten(IASTNode modifiedNode, List<ASTModification> modificationsForNode) {
IASTNode modifiedNodeParent = modifiedNode;
for(ASTModification currentModification : modificationsForNode){
if(currentModification.getKind() != ASTModification.ModificationKind.APPEND_CHILD){
if(currentModification.getKind() == ASTModification.ModificationKind.REPLACE){
modifiedNodeParent = modifiedNode.getParent();
break;
}
@ -385,9 +391,51 @@ public class ChangeGenerator extends CPPASTVisitor {
synthTreatment(declarator);
return ASTVisitor.PROCESS_SKIP;
}
// mstodo workaround
if (declarator instanceof IASTArrayDeclarator) {
IASTPointerOperator [] ptrOps = declarator.getPointerOperators();
for ( int i = 0; i < ptrOps.length; i++ ) {
if( !ptrOps[i].accept( this ) ) return PROCESS_ABORT;
}
IASTDeclarator nestedDeclarator= declarator.getNestedDeclarator();
IASTName name= declarator.getName();
if (nestedDeclarator == null && name != null) {
IASTDeclarator outermost= CPPVisitor.findOutermostDeclarator(declarator);
if (outermost.getPropertyInParent() != IASTTypeId.ABSTRACT_DECLARATOR) {
if (!name.accept(this)) return PROCESS_ABORT;
}
}
if (nestedDeclarator != null) {
if (!nestedDeclarator.accept(this)) return PROCESS_ABORT;
}
IASTArrayModifier [] mods = ((IASTArrayDeclarator) declarator).getArrayModifiers();
for ( int i = 0; i < mods.length; i++ ) {
int result= visit(mods[i]);
if (result != PROCESS_CONTINUE)
return result;
if( !mods[i].accept( this ) ) return PROCESS_ABORT;
}
IASTInitializer initializer = declarator.getInitializer();
if( initializer != null ) if( !initializer.accept( this ) ) return PROCESS_ABORT;
return PROCESS_CONTINUE;
}
return super.visit(declarator);
}
public int visit(IASTArrayModifier mod) {
if (hasChangedChild(mod)) {
synthTreatment(mod);
return ASTVisitor.PROCESS_SKIP;
}
return PROCESS_CONTINUE;
}
@Override
public int visit(ICPPASTNamespaceDefinition namespaceDefinition) {

View file

@ -7,10 +7,12 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Institute for Software - initial API and implementation
* Institute for Software - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.rewrite.changegenerator;
import org.eclipse.cdt.core.dom.ast.IASTArrayModifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
@ -270,6 +272,14 @@ public class ChangeGeneratorWriterVisitor extends ASTWriterVisitor {
return PROCESS_SKIP;
}
@Override
public int visit(IASTArrayModifier arrayModifier) {
if (doBeforeEveryNode(arrayModifier) == PROCESS_CONTINUE) {
return super.visit(arrayModifier);
}
return PROCESS_SKIP;
}
@Override
public int visit(IASTExpression expression) {
if (doBeforeEveryNode(expression) == PROCESS_CONTINUE) {

View file

@ -7,7 +7,8 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Institute for Software - initial API and implementation
* Institute for Software - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.rewrite.changegenerator;
@ -76,13 +77,4 @@ public class ModifiedASTExpressionWriter extends ExpressionWriter {
}
return initializer;
}
@Override
protected IASTExpression[] getNewTypeIdArrayExpressions(
ICPPASTNewExpression newExp, IASTExpression[] expressions) {
IASTExpression[] modifiedExpressions = modificationHelper.createModifiedChildArray(newExp, expressions, IASTExpression.class);
return modifiedExpressions;
}
}

View file

@ -71,6 +71,9 @@ class ASTPreprocessorName extends ASTPreprocessorNode implements IASTName {
public int getRoleOfName(boolean allowResolution) {
return IASTNameOwner.r_unclear;
}
public IASTName getLastName() {
return this;
}
}
class ASTPreprocessorDefinition extends ASTPreprocessorName {

View file

@ -33,8 +33,7 @@ public class BasicTokenDuple implements ITokenDuple {
lastToken = last;
}
//TODO - move numSegments to a subclass
private int numSegments = -1;
protected int numSegments = -1;
BasicTokenDuple( ITokenDuple firstDuple, ITokenDuple secondDuple ){
this( firstDuple.getFirstToken(), secondDuple.getLastToken() );

View file

@ -23,7 +23,6 @@ import org.eclipse.cdt.core.parser.ITokenDuple;
public class TemplateTokenDuple extends BasicTokenDuple {
protected final List [] argLists;
private final int numSegments;
/**
* @param first

View file

@ -167,6 +167,10 @@ public class PDOMASTAdapter {
public String toString() {
return fDelegate.toString();
}
public IASTName getLastName() {
return this;
}
}
private static class AnonymousEnumeration implements IEnumeration {

View file

@ -41,7 +41,7 @@ public:
void anotherMethod();
};
class {
class xOtherClass {
public:
xOtherClass(char*);
xOtherClass(int);

View file

@ -267,7 +267,7 @@ struct helper {};
helper *new_helper()
{
return new helper();
return new helper;
}
int main(int argc, char** argv)

View file

@ -17,15 +17,18 @@ package org.eclipse.cdt.ui.tests.refactoring.rename;
import java.io.StringWriter;
import junit.framework.*;
import junit.framework.AssertionFailedError;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.tests.FailingTest;
import org.eclipse.core.resources.IFile;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.participants.RenameArguments;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.tests.FailingTest;
/**
* @author aniefer
*/
@ -63,7 +66,7 @@ public class RenameRegressionTests extends RenameTests {
public void testSimpleRename() throws Exception {
StringWriter writer = new StringWriter();
writer.write( "int boo; // boo \n" ); //$NON-NLS-1$
writer.write( "#ifdef 0 \n" ); //$NON-NLS-1$
writer.write( "#if 0 \n" ); //$NON-NLS-1$
writer.write( "boo \n" ); //$NON-NLS-1$
writer.write( "#endif \n" ); //$NON-NLS-1$
writer.write( "void f() { \n" ); //$NON-NLS-1$

View file

@ -43,6 +43,7 @@ import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.PreferenceConstants;
import org.eclipse.cdt.internal.core.CCoreInternals;
import org.eclipse.cdt.internal.core.index.provider.IndexProviderManager;
import org.eclipse.cdt.internal.core.index.provider.ReadOnlyPDOMProviderBridge;
@ -77,7 +78,7 @@ public class AbstractSemanticHighlightingTest extends TestCase {
String sdkCode=
"void SDKFunction();\n"+
"class SDKClass { public: SDKMethod(); };\n\n";
"class SDKClass { public: void SDKMethod(); };\n\n";
fSdkFile= createExternalSDK(sdkCode);
assertNotNull(fSdkFile);
@ -148,8 +149,8 @@ public class AbstractSemanticHighlightingTest extends TestCase {
store.setToDefault(PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_ENABLED);
SemanticHighlighting[] semanticHighlightings= SemanticHighlightings.getSemanticHighlightings();
for (int i= 0, n= semanticHighlightings.length; i < n; i++) {
String enabledPreferenceKey= SemanticHighlightings.getEnabledPreferenceKey(semanticHighlightings[i]);
for (SemanticHighlighting semanticHighlighting : semanticHighlightings) {
String enabledPreferenceKey= SemanticHighlightings.getEnabledPreferenceKey(semanticHighlighting);
if (!store.isDefault(enabledPreferenceKey))
store.setToDefault(enabledPreferenceKey);
}
@ -215,8 +216,7 @@ public class AbstractSemanticHighlightingTest extends TestCase {
buf.append("// "+fCurrentHighlighting+'\n');
IDocument document= fSourceViewer.getDocument();
buf.append("Position[] expected= new Position[] {\n");
for (int i= 0, n= positions.length; i < n; i++) {
Position position= positions[i];
for (Position position : positions) {
int line= document.getLineOfOffset(position.getOffset());
int column= position.getOffset() - document.getLineOffset(line);
buf.append("\tcreatePosition(" + line + ", " + column + ", " + position.getLength() + "),\n");
@ -253,8 +253,7 @@ public class AbstractSemanticHighlightingTest extends TestCase {
IPreferenceStore store= CUIPlugin.getDefault().getPreferenceStore();
store.setValue(PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_ENABLED, true);
SemanticHighlighting[] semanticHilightings= SemanticHighlightings.getSemanticHighlightings();
for (int i= 0, n= semanticHilightings.length; i < n; i++) {
SemanticHighlighting semanticHilighting= semanticHilightings[i];
for (SemanticHighlighting semanticHilighting : semanticHilightings) {
if (store.getBoolean(SemanticHighlightings.getEnabledPreferenceKey(semanticHilighting)))
store.setValue(SemanticHighlightings.getEnabledPreferenceKey(semanticHilighting), false);
}

View file

@ -289,10 +289,10 @@ public class CodeFormatterTest extends BaseUITestCase {
assertFormatterResult();
}
//main
//int main
//(
// int argc,
// char const * argv[]
// char const int* argv[]
//)
//try
//{
@ -310,7 +310,7 @@ public class CodeFormatterTest extends BaseUITestCase {
// return 2;
//}
//main(int argc, char const * argv[])
//int main(int argc, char const int* argv[])
//try {
// for (int i = 1; i < argc; ++i) {
// }
@ -326,9 +326,9 @@ public class CodeFormatterTest extends BaseUITestCase {
assertFormatterResult();
}
//main(int argc, char const * argv[]) { try { for (int i = 1; i < argc; ++i) { } return 0; } catch (float e) { return 1; } catch (...) { return 2; } }
//int main(int argc, char const int * argv[]) { try { for (int i = 1; i < argc; ++i) { } return 0; } catch (float e) { return 1; } catch (...) { return 2; } }
//main(int argc, char const * argv[]) {
//int main(int argc, char const int * argv[]) {
// try {
// for (int i = 1; i < argc; ++i) {
// }

View file

@ -22,7 +22,7 @@ public class CompletionTest_AnonymousTypes extends CompletionProposalsBaseTest{
private final String headerFileName = "CompletionTestStart40.h";
private final String headerFileFullPath ="resources/contentassist/" + headerFileName;
private final String expectedPrefix = "";
private final String[] expectedResults = {"notAnonymousEnum", "notAnonymousClass"};
private final String[] expectedResults = {"notAnonymousEnum", "notAnonymousClass", "xOtherClass"};
public CompletionTest_AnonymousTypes(String name) {
super(name);
@ -39,6 +39,7 @@ public class CompletionTest_AnonymousTypes extends CompletionProposalsBaseTest{
/* (non-Javadoc)
* @see org.eclipse.cdt.core.codeassist.tests.CompletionProposalsTest#getCompletionPosition()
*/
@Override
protected int getCompletionPosition() {
return getBuffer().indexOf(" x ");
}
@ -46,6 +47,7 @@ public class CompletionTest_AnonymousTypes extends CompletionProposalsBaseTest{
/* (non-Javadoc)
* @see org.eclipse.cdt.core.codeassist.tests.CompletionProposalsTest#getExpectedPrefix()
*/
@Override
protected String getExpectedPrefix() {
return expectedPrefix;
}
@ -53,6 +55,7 @@ public class CompletionTest_AnonymousTypes extends CompletionProposalsBaseTest{
/* (non-Javadoc)
* @see org.eclipse.cdt.core.codeassist.tests.CompletionProposalsTest#getExpectedResultsValues()
*/
@Override
protected String[] getExpectedResultsValues() {
return expectedResults;
}
@ -60,6 +63,7 @@ public class CompletionTest_AnonymousTypes extends CompletionProposalsBaseTest{
/* (non-Javadoc)
* @see org.eclipse.cdt.core.codeassist.tests.CompletionProposalsTest#getFileName()
*/
@Override
protected String getFileName() {
return fileName;
}
@ -67,12 +71,14 @@ public class CompletionTest_AnonymousTypes extends CompletionProposalsBaseTest{
/* (non-Javadoc)
* @see org.eclipse.cdt.core.codeassist.tests.CompletionProposalsTest#getFileFullPath()
*/
@Override
protected String getFileFullPath() {
return fileFullPath;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.codeassist.tests.CompletionProposalsTest#getHeaderFileFullPath()
*/
@Override
protected String getHeaderFileFullPath() {
return headerFileFullPath;
}
@ -80,6 +86,7 @@ public class CompletionTest_AnonymousTypes extends CompletionProposalsBaseTest{
/* (non-Javadoc)
* @see org.eclipse.cdt.core.codeassist.tests.CompletionProposalsTest#getHeaderFileName()
*/
@Override
protected String getHeaderFileName() {
return headerFileName;
}

View file

@ -46,6 +46,7 @@ public abstract class CPPSelectionTestsAnyIndexer extends BaseSelectionTestsInde
sourceIndexerID= indexerID;
}
@Override
protected void setUp() throws Exception {
super.setUp();
@ -60,6 +61,7 @@ public abstract class CPPSelectionTestsAnyIndexer extends BaseSelectionTestsInde
index= CCorePlugin.getIndexManager().getIndex(fCProject);
}
@Override
protected void tearDown() throws Exception {
closeAllEditors();
CProjectHelper.delete(fCProject);
@ -732,7 +734,7 @@ public abstract class CPPSelectionTestsAnyIndexer extends BaseSelectionTestsInde
// typedef int TestTypeTwo;
// #include "testBug78354.h"
// main()
// int main()
// {
// TestTypeOne myFirstLink = 5;
// TestTypeTwo mySecondLink = 6;

View file

@ -141,27 +141,29 @@ public class CPPSelectionTestsNoIndexer extends BaseUITestCase {
}
}
protected void setUp() throws Exception {
@Override
protected void setUp() throws Exception {
super.setUp();
initProject();
OpenDeclarationsAction.sIsJUnitTest= true;
OpenDeclarationsAction.sAllowFallback= false;
}
protected void tearDown() throws Exception {
@Override
protected void tearDown() throws Exception {
if( project == null || !project.exists() )
return;
closeAllEditors();
IResource [] members = project.members();
for( int i = 0; i < members.length; i++ ){
if( members[i].getName().equals( ".project" ) || members[i].getName().equals( ".cproject" ) ) //$NON-NLS-1$ //$NON-NLS-2$
for (IResource member : members) {
if( member.getName().equals( ".project" ) || member.getName().equals( ".cproject" ) ) //$NON-NLS-1$ //$NON-NLS-2$
continue;
if (members[i].getName().equals(".settings"))
if (member.getName().equals(".settings"))
continue;
try{
members[i].delete( false, monitor );
member.delete( false, monitor );
} catch( Throwable e ){
/*boo*/
}
@ -922,7 +924,7 @@ public class CPPSelectionTestsNoIndexer extends BaseUITestCase {
StringBuffer buffer = new StringBuffer();
buffer.append("typedef int TestTypeOne;\n"); //$NON-NLS-1$
buffer.append("typedef int TestTypeTwo;\n"); //$NON-NLS-1$
buffer.append("main()\n"); //$NON-NLS-1$
buffer.append("int main()\n"); //$NON-NLS-1$
buffer.append("{\n"); //$NON-NLS-1$
buffer.append("TestTypeOne myFirstLink = 5;\n"); //$NON-NLS-1$
buffer.append("TestTypeTwo mySecondLink = 6;\n"); //$NON-NLS-1$

View file

@ -115,7 +115,8 @@ public class CSelectionTestsNoIndexer extends BaseUITestCase {
return suite;
}
protected void setUp() throws Exception {
@Override
protected void setUp() throws Exception {
super.setUp();
OpenDeclarationsAction.sIsJUnitTest= true;
OpenDeclarationsAction.sAllowFallback= false;
@ -133,20 +134,21 @@ public class CSelectionTestsNoIndexer extends BaseUITestCase {
}
}
protected void tearDown() throws Exception {
@Override
protected void tearDown() throws Exception {
if( project == null || !project.exists() )
return;
closeAllEditors();
IResource [] members = project.members();
for( int i = 0; i < members.length; i++ ){
if( members[i].getName().equals( ".project" ) || members[i].getName().equals( ".cproject" ) ) //$NON-NLS-1$ //$NON-NLS-2$
for (IResource member : members) {
if( member.getName().equals( ".project" ) || member.getName().equals( ".cproject" ) ) //$NON-NLS-1$ //$NON-NLS-2$
continue;
if (members[i].getName().equals(".settings"))
if (member.getName().equals(".settings"))
continue;
try{
members[i].delete( true, monitor );
member.delete( true, monitor );
} catch( Throwable e ){
/*boo*/
}
@ -667,7 +669,7 @@ public class CSelectionTestsNoIndexer extends BaseUITestCase {
StringBuffer buffer = new StringBuffer();
buffer.append("typedef int TestTypeOne;\n"); //$NON-NLS-1$
buffer.append("typedef int TestTypeTwo;\n"); //$NON-NLS-1$
buffer.append("main()\n"); //$NON-NLS-1$
buffer.append("int main()\n"); //$NON-NLS-1$
buffer.append("{\n"); //$NON-NLS-1$
buffer.append("TestTypeOne myFirstLink = 5;\n"); //$NON-NLS-1$
buffer.append("TestTypeTwo mySecondLink = 6;\n"); //$NON-NLS-1$

View file

@ -49,10 +49,6 @@ import org.eclipse.cdt.core.model.ISourceRange;
import org.eclipse.cdt.core.model.ISourceReference;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousDeclaration;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousExpression;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousStatement;
import org.eclipse.cdt.internal.ui.refactoring.utils.SelectionHelper;
/**
@ -165,46 +161,6 @@ public abstract class CRefactoring extends Refactoring {
}
private class AmbiguityFinder extends ASTVisitor{
private boolean ambiguityFound = false;
{
shouldVisitDeclarations = true;
shouldVisitExpressions = true;
shouldVisitStatements= true;
}
@Override
public int visit(IASTDeclaration declaration) {
if (declaration instanceof IASTAmbiguousDeclaration) {
ambiguityFound = true;
}
return ASTVisitor.PROCESS_CONTINUE;
}
@Override
public int visit(IASTExpression expression) {
if (expression instanceof IASTAmbiguousExpression) {
ambiguityFound = true;
}
return ASTVisitor.PROCESS_CONTINUE;
}
@Override
public int visit(IASTStatement statement) {
if (statement instanceof IASTAmbiguousStatement) {
ambiguityFound = true;
}
return ASTVisitor.PROCESS_CONTINUE;
}
public boolean ambiguityFound() {
return ambiguityFound;
}
}
@Override
public RefactoringStatus checkFinalConditions(IProgressMonitor pm)
throws CoreException, OperationCanceledException {
@ -302,9 +258,8 @@ public abstract class CRefactoring extends Refactoring {
}
protected boolean translationUnitIsAmbiguous() {
AmbiguityFinder af = new AmbiguityFinder();
unit.accept(af);
return af.ambiguityFound();
// ambiguities are resolved before the tu is passed to the refactoring.
return false;
}
public void lockIndex() throws CoreException, InterruptedException {