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

Apply patch to add pdom binding resolution tests for Bugzilla#162581

This commit is contained in:
Andrew Ferguson 2006-11-10 15:18:13 +00:00
parent 12f3dd59c5
commit 525d297214
6 changed files with 1028 additions and 11 deletions

View file

@ -0,0 +1,123 @@
/*******************************************************************************
* Copyright (c) 2006 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
*******************************************************************************/
package org.eclipse.cdt.internal.pdom.tests;
import java.io.IOException;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IFunctionType;
import org.eclipse.cdt.core.dom.ast.IPointerType;
import org.eclipse.cdt.core.dom.ast.IProblemBinding;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.testplugin.CTestPlugin;
import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
import org.eclipse.cdt.internal.core.CCoreInternals;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.osgi.framework.Bundle;
/**
* When the PDOM is used to avoid parsing work (i.e. an AST is obtained which
* is backed by the PDOM), it must be possible to resolve which binding a name
* in the AST is referring to. If the binding is not defined in the AST fragment
* then it is assumed to have come from a file which is already indexed.
*
* This class is for testing the process by which bindings are looked up in
* the PDOM purely from AST information (i.e. without a real binding from the DOM)
*/
public abstract class IndexBindingResolutionTestBase extends PDOMTestBase {
IIndex index;
ICProject cproject;
IPath header, references;
StringBuffer[] testData;
IASTTranslationUnit ast;
protected void setUp() throws Exception {
Bundle b = CTestPlugin.getDefault().getBundle();
testData = TestSourceReader.getContentsForTest(b, "parser", getClass(), getName(), 2);
IFile file = TestSourceReader.createFile(cproject.getProject(), header, testData[0].toString());
CCoreInternals.getPDOMManager().setIndexerId(cproject, IPDOMManager.ID_FAST_INDEXER);
assertTrue(CCorePlugin.getIndexManager().joinIndexer(360000, new NullProgressMonitor()));
IFile cppfile= TestSourceReader.createFile(cproject.getProject(), references, testData[1].toString());
assertTrue(CCorePlugin.getIndexManager().joinIndexer(360000, new NullProgressMonitor()));
index= CCorePlugin.getIndexManager().getIndex(cproject);
ast = TestSourceReader.createIndexBasedAST(index, cproject, cppfile);
}
protected void tearDown() throws Exception {
if (cproject != null) {
cproject.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor());
}
super.tearDown();
}
protected IBinding getBindingFromASTName(String section, int len) {
IASTName[] names= ast.getLanguage().getSelectedNames(ast, testData[1].indexOf(section), len);
assertEquals("<>1 name found for \""+section+"\"", 1, names.length);
assertNotNull("No binding for "+names[0].getRawSignature(), names[0].resolveBinding());
assertFalse("Binding is a ProblemBinding for name "+names[0].getRawSignature(), IProblemBinding.class.isAssignableFrom(names[0].resolveBinding().getClass()));
return names[0].resolveBinding();
}
protected void assertQNEquals(String expectedQn, IBinding b12) throws DOMException {
assertTrue(b12 instanceof ICPPBinding);
assertEquals(expectedQn, CPPVisitor.renderQualifiedName(((ICPPBinding)b12).getQualifiedName()));
}
protected IType getVariableType(IBinding binding) throws DOMException {
assertTrue(binding instanceof IVariable);
return ((IVariable)binding).getType();
}
protected IType getPtrType(IBinding binding) throws DOMException {
// assert binding is a variable
IVariable v = (IVariable) binding;
IPointerType ptr = (IPointerType) v.getType();
return ptr.getType();
}
protected void assertParamType(int index, Class type, IType function) throws DOMException {
// assert function is IFunctionType
IFunctionType ft = (IFunctionType) function;
assertTrue(type.isInstance((ft.getParameterTypes()[index])));
}
protected void assertCompositeTypeParam(int index, int compositeTypeKey, IType function, String qn) throws DOMException {
// assert function is IFunctionType
IFunctionType ft = (IFunctionType) function;
assertTrue(ICPPClassType.class.isInstance((ft.getParameterTypes()[index])));
assertEquals(compositeTypeKey, ((ICPPClassType)ft.getParameterTypes()[index]).getKey());
assertEquals(qn, CPPVisitor.renderQualifiedName(((ICPPClassType)ft.getParameterTypes()[index]).getQualifiedName()));
}
protected String readTaggedComment(final String tag) throws IOException {
return TestSourceReader.readTaggedComment(CTestPlugin.getDefault().getBundle(), "parser", getClass(), tag);
}
}

View file

@ -0,0 +1,156 @@
/*******************************************************************************
* Copyright (c) 2006 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
*******************************************************************************/
package org.eclipse.cdt.internal.pdom.tests;
import java.io.IOException;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.core.runtime.Path;
/**
* For testing PDOM binding C language resolution
*/
/*
* aftodo - once we have non-problem bindings working, each test should
* additionally check that the binding obtained has characteristics as
* expected (type,name,etc..)
*/
public class IndexCBindingResolutionTest extends IndexBindingResolutionTestBase {
public static TestSuite suite() {
return suite(IndexCBindingResolutionTest.class);
}
protected void setUp() throws Exception {
cproject= CProjectHelper.createCProject("ResolveBindingTestsC", "bin", IPDOMManager.ID_NO_INDEXER);
header = new Path("header.h");
references = new Path("references.c");
super.setUp();
}
// // header file
// struct S {}; union U {}; enum E {ER1,ER2,ER3};
// int var1; C var2; S *var3; void func1(E); void func2(S);
// typedef int Int; typedef int *IntPtr;
// // referencing file
// #include "header.h"
// void references() {
// struct S s; /*s*/ union U u; /*u*/ E e; /*e*/
// var1 = 1; /*var1*/ var2 = c; /*var2*/ var3 = &s; /*var3*/
// func(e); /*func1*/ func(var1); /*func2*/ func(c); /*func3*/
// Int a; /*a*/
// IntPtr b = &a; /*b*/
// func(*b); /*func4*/ func(a); /*func5*/
// }
public void testSimpleGlobalBindings() throws IOException {
IBinding b2 = getBindingFromASTName("S s;", 1);
IBinding b3 = getBindingFromASTName("s;", 1);
IBinding b4 = getBindingFromASTName("U u;", 1);
IBinding b5 = getBindingFromASTName("u; ", 1);
IBinding b7 = getBindingFromASTName("e; ", 1);
IBinding b8 = getBindingFromASTName("var1 = 1;", 4);
IBinding b9 = getBindingFromASTName("var2 = c;", 4);
IBinding b10 = getBindingFromASTName("var3 = &s;", 4);
IBinding b11 = getBindingFromASTName("func(e);", 4);
IBinding b13 = getBindingFromASTName("func(c);", 4);
IBinding b15 = getBindingFromASTName("a; ", 1);
IBinding b17 = getBindingFromASTName("b = &a; /*b*/", 1);
IBinding b19 = getBindingFromASTName("b); /*func4*/", 1);
IBinding b20 = getBindingFromASTName("func(a);", 4);
IBinding b21 = getBindingFromASTName("a); /*func5*/", 1);
}
public void _testSimpleGlobalBindings() throws IOException {
IBinding b6 = getBindingFromASTName("E e; ", 1);
IBinding b12 = getBindingFromASTName("func1(var1);", 4);
IBinding b14 = getBindingFromASTName("Int a; ", 3);
IBinding b16 = getBindingFromASTName("IntPtr b = &a; ", 6);
IBinding b18 = getBindingFromASTName("func2(*b);", 4);
}
public void _testEnumeratorInFileScope() {fail("todo");}
public void _testEnumeratorInStructScope() {fail("todo");}
public void _testEnumeratorInUnionScope() {fail("todo");}
public void _testFieldReference() {fail("todo");}
public void _testMemberAccess() {fail("todo");}
// // header file
// struct S {struct S* sp;};
// struct S foo1(struct S s);
// struct S* foo2(struct S* s);
// int foo3(int i);
// int foo4(int i, struct S s);
// /* aftodo - latter cases need review */
// // referencing content
// void references() {
// struct S s, *sp;
// foo1/*a*/(sp[1]); // IASTArraySubscriptExpression
// foo2/*b*/(sp+1); // IASTBinaryExpression
// foo2/*c*/((struct S*) sp);/*1*/ // IASTCastExpression
// foo1/*d*/(1==1 ? s : s);/*2*/ // IASTConditionalExpression
// foo4/*e*/(5, s);/*3*/ // IASTExpressionList
// foo2/*f*/(s.sp);/*4*/ foo2(sp->sp);/*5*/// IASTFieldReference
// foo1/*g*/(foo1(s));/*6*/ // IASTFunctionCallExpression
// foo1/*h*/(s);/*7*/ // IASTIdExpression
// foo3/*i*/(23489); // IASTLiteralExpression
// foo3/*j*/(sizeof(struct S));/*8*/ // IASTTypeIdExpression
// foo1/*k*/(*sp);/*9*/ // IASTUnaryExpression
// /* not applicable */ // ICPPASTDeleteExpression
// /* not applicable */ // ICPPASTNewExpression
// // ?? foo/*n*/(); // ICPPASTSimpleTypeConstructorExpression
// // ?? foo/*o*/(); // ICPPASTTypenameExprssion
// // foo/*p*/(MADE_UP_SYMBOL); // ICPPASTTypenameExprssion
// }
public void _testExpressionKindForFunctionCalls() {
IBinding b0 = getBindingFromASTName("foo1/*a*/", 4);
IBinding b0a = getBindingFromASTName("ap[1]", 2);
IBinding b1 = getBindingFromASTName("foo2/*b*/", 4);
IBinding b1a = getBindingFromASTName("ap+1);", 2);
IBinding b2 = getBindingFromASTName("foo2/*c*/", 4);
IBinding b2a = getBindingFromASTName("ap);/*1*/", 2);
IBinding b3 = getBindingFromASTName("foo1/*d*/", 4);
IBinding b3a = getBindingFromASTName("a : a);/*2*/", 1);
IBinding b3b = getBindingFromASTName("a);/*2*/", 1);
IBinding b4 = getBindingFromASTName("foo4/*e*/", 4);
IBinding b4a = getBindingFromASTName("a);/*3*/", 1);
IBinding b5 = getBindingFromASTName("foo2/*f*/", 4);
IBinding b5a = getBindingFromASTName("a.ap);/*4*/", 1);
IBinding b5b = getBindingFromASTName("ap);/*4*/", 2);
IBinding b5c = getBindingFromASTName("sp->sp);/*5*/", 2);
IBinding b5d = getBindingFromASTName("sp);/*5*/", 2);
IBinding b6 = getBindingFromASTName("foo1/*g*/", 4);
IBinding b6a = getBindingFromASTName("foo1(s));/*6*/", 4);
IBinding b6b = getBindingFromASTName("s));/*6*/", 1);
IBinding b7 = getBindingFromASTName("foo1/*h*/", 4);
IBinding b7a = getBindingFromASTName("s);/*7*/", 1);
IBinding b8 = getBindingFromASTName("foo3/*i*/", 4);
IBinding b9 = getBindingFromASTName("foo3/*j*/", 4);
IBinding b9a = getBindingFromASTName("S));/*8*/", 1);
IBinding b10 = getBindingFromASTName("foo1/*k*/", 4);
IBinding b10a = getBindingFromASTName("sp);/*9*/ ", 2);
}
}

View file

@ -0,0 +1,683 @@
/*******************************************************************************
* Copyright (c) 2006 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
*******************************************************************************/
package org.eclipse.cdt.internal.pdom.tests;
import java.io.IOException;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.core.runtime.Path;
/**
* For testing PDOM binding CPP language resolution
*/
/*
* aftodo - once we have non-problem bindings working, each test should
* additionally check that the binding obtained has characteristics as
* expected (type,name,etc..)
*/
public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBase {
public static TestSuite suite() {
return suite(IndexCPPBindingResolutionTest.class);
}
protected void setUp() throws Exception {
cproject= CProjectHelper.createCCProject("ResolveBindingTestsCPP", "bin", IPDOMManager.ID_NO_INDEXER);
header = new Path("header.h");
references = new Path("references.cpp");
super.setUp();
}
// // header file
// class C {
// public:
// int field;
// struct CS { long* l; C *method(CS *); };
// CS cs;
// long * CS::* ouch;
// long * CS::* autsch;
// C * CS:: method(CS *);
// };
// // referencing file
// #include "header.h"
// void references() {
// C *cp = new C();
// long l = 5, *lp;
// lp = &l;
// cp->cs.*cp->ouch = lp = cp->cs.*cp->autsch;
// &(cp->cs)->*cp->autsch = lp = &(cp->cs)->*cp->ouch;
// cp->cs.*method(cp);/*1*/ &(cp->cs)->*method(cp);/*2*/
// }
public void _testPointerToMemberFields() throws IOException {
IBinding b0 = getBindingFromASTName("cs.*cp->o", 2);
IBinding b1 = getBindingFromASTName("ouch = lp;", 4);
IBinding b2 = getBindingFromASTName("autsch;", 6);
IBinding b3 = getBindingFromASTName("cs)->*c->a", 2);
IBinding b4 = getBindingFromASTName("autsch = lp", 6);
IBinding b5 = getBindingFromASTName("ouch;", 4);
IBinding b6 = getBindingFromASTName("method(cp);/*1*/", 6);
IBinding b7 = getBindingFromASTName("method(cp);/*2*/", 6);
}
// // header file
// class C {}; struct S {}; union U {}; enum E {ER1,ER2,ER3};
// int var1; C var2; S *var3; void func(E); void func(C);
// namespace ns {}
// typedef int Int; typedef int *IntPtr;
// // referencing file
// #include "header.h"
// void references() {
// C c; /*c*/ S s; /*s*/ U u; /*u*/ E e; /*e*/
// var1 = 1; /*var1*/ var2 = c; /*var2*/ var3 = &s; /*var3*/
// func(e); /*func1*/ func(var1); /*func2*/ func(c); /*func3*/
// Int a; /*a*/
// IntPtr b = &a; /*b*/
// func(*b); /*func4*/ func(a); /*func5*/
// }
// class C2 : public C {}; /*base*/
// struct S2 : public S {}; /*base*/
// union U2 : public U {}; /*base*/
public void testSimpleGlobalBindings() throws IOException {
IBinding b0 = getBindingFromASTName("C c; ", 1);
IBinding b1 = getBindingFromASTName("c; ", 1);
IBinding b2 = getBindingFromASTName("S s;", 1);
IBinding b3 = getBindingFromASTName("s;", 1);
IBinding b4 = getBindingFromASTName("U u;", 1);
IBinding b5 = getBindingFromASTName("u; ", 1);
IBinding b7 = getBindingFromASTName("e; ", 1);
IBinding b8 = getBindingFromASTName("var1 = 1;", 4);
IBinding b9 = getBindingFromASTName("var2 = c;", 4);
IBinding b10 = getBindingFromASTName("var3 = &s;", 4);
IBinding b11 = getBindingFromASTName("func(e);", 4);
IBinding b13 = getBindingFromASTName("func(c);", 4);
IBinding b15 = getBindingFromASTName("a; ", 1);
IBinding b17 = getBindingFromASTName("b = &a; /*b*/", 1);
IBinding b19 = getBindingFromASTName("b); /*func4*/", 1);
IBinding b20 = getBindingFromASTName("func(a);", 4);
IBinding b21 = getBindingFromASTName("a); /*func5*/", 1);
IBinding b22 = getBindingFromASTName("C2 : public", 2);
IBinding b24 = getBindingFromASTName("S2 : public", 2);
IBinding b26 = getBindingFromASTName("U2 : public", 2);
}
public void _testSimpleGlobalBindings() throws IOException {
/* note the test data from above follows through to this test */
IBinding b6 = getBindingFromASTName("E e; ", 1);
IBinding b12 = getBindingFromASTName("func(var1);", 4);
IBinding b14 = getBindingFromASTName("Int a; ", 3);
IBinding b16 = getBindingFromASTName("IntPtr b = &a; ", 6);
IBinding b18 = getBindingFromASTName("func(*b);", 4);
IBinding b23 = getBindingFromASTName("C {}; /*base*/", 1);
IBinding b25 = getBindingFromASTName("S {}; /*base*/", 1);
IBinding b27 = getBindingFromASTName("U {}; /*base*/", 1);
}
//// header content
//class TopC {}; struct TopS {}; union TopU {}; enum TopE {TopER1,TopER2};
//short topBasic; void *topPtr; TopC *topCPtr; TopU topFunc(){return *new TopU();}
//// referencing content
//namespace n1 {
// class TopC {}; struct TopS {}; union TopU {}; enum TopE {TopER1,TopER2};
// short topBasic; void *topPtr; TopC *topCPtr; TopU topFunc(){return *new TopU();}
// class C {
// class TopC {}; struct TopS {}; union TopU {}; enum TopE {TopER1,TopER2};
// short topBasic; void *topPtr; TopC *topCPtr; TopU topFunc(){return *new TopU();}
// void references() {
// ::TopC c; ::TopS s; ::TopU u; ::TopE e = ::TopER1;
// ::topBasic++; ::topPtr = &::topBasic; ::topCPtr = &c; ::topFunc();
// }
// };
//}
public void _testSingletonQualifiedName() {
IBinding b0 = getBindingFromASTName("TopC c", 4);
IBinding b1 = getBindingFromASTName("TopS s", 4);
IBinding b2 = getBindingFromASTName("TopU u", 4);
IBinding b3 = getBindingFromASTName("TopE e", 4);
IBinding b4 = getBindingFromASTName("TopER1;", 6);
IBinding b5 = getBindingFromASTName("topBasic++", 8);
IBinding b6 = getBindingFromASTName("topPtr", 6);
IBinding b7 = getBindingFromASTName("topBasic", 8);
IBinding b8 = getBindingFromASTName("topCPtr", 7);
IBinding b9 = getBindingFromASTName("topFunc", 7);
}
public void _testMultiVirtualBaseClassLookup() {fail("aftodo");}
public void _testMultiNonVirtualBaseClassLookup() {fail("aftodo");}
public void _testQualifiedNamesForNamespaceAliases() {fail("aftodo");}
public void _testQualifiedNamesForNamespaces() {fail("aftodo");}
// // header content
// namespace n1 { namespace n2 { struct S {}; } }
// class c1 { class c2 { struct S {}; };
// struct s1 { struct s2 { struct S {}; }; };
// union u1 { struct u2 { struct S {}; }; };
// namespace n3 { class c3 { struct s3 { union u3 { struct S {}; }; }; }; }
// // reference content
// void reference() {
// ::n1::n2::S s0; n1::n2::S s1;
// ::c1::c2::S s2; c1::c2::S s3;
// ::s1::s2::S s4; s1::s2::S s5;
// ::u1::u2::S s6; u1::u2::S s7;
// ::n3::c3::s3::u3::S s8;
// n3::c3::s3::u3::S s9;
// }
// namespace n3 { c3::s3::u3::S s10; }
// namespace n1 { n2::S s11; }
// namespace n1 { namespace n2 { S s12; }}
public void _testQualifiedNamesForStruct() throws DOMException {
IBinding b0 = getBindingFromASTName("S s0;", 1);
assertQNEquals("n1::n2::S", b0);
IBinding b1 = getBindingFromASTName("S s1;", 1);
assertQNEquals("n1::n2::S", b1);
IBinding b2 = getBindingFromASTName("S s2;", 1);
assertQNEquals("c1::c2::S", b2);
IBinding b3 = getBindingFromASTName("S s3;", 1);
assertQNEquals("c1::c2::S", b3);
IBinding b4 = getBindingFromASTName("S s4;", 1);
assertQNEquals("s1::s2::S", b4);
IBinding b5 = getBindingFromASTName("S s5;", 1);
assertQNEquals("s1::s2::S", b5);
IBinding b6 = getBindingFromASTName("S s6;", 1);
assertQNEquals("u1::u2::S", b6);
IBinding b7 = getBindingFromASTName("S s7;", 1);
assertQNEquals("u1::u2::S", b7);
IBinding b8 = getBindingFromASTName("S s8;", 1);
assertQNEquals("n3::c3::s3::u3::S", b8);
IBinding b9 = getBindingFromASTName("S s9;", 1);
assertQNEquals("n3::c3::s3::u3::S", b9);
IBinding b10 = getBindingFromASTName("S s10;", 1);
assertQNEquals("n3::c3::s3::u3::S", b10);
IBinding b11 = getBindingFromASTName("S s11;", 1);
assertQNEquals("n1::n2::S", b11);
IBinding b12 = getBindingFromASTName("S s12;", 1);
assertQNEquals("n1::n2::S", b12);
}
// // header content
// namespace n1 { namespace n2 { union U {}; } }
// class c1 { class c2 { union U {}; };
// struct s1 { struct s2 { union U {}; }; };
// union u1 { struct u2 { union U {}; }; };
// namespace n3 { class c3 { struct s3 { union u3 { union U {}; }; }; }; }
// // reference content
// void reference() {
// ::n1::n2::U u0; n1::n2::U u1;
// ::c1::c2::U u2; c1::c2::U u3;
// ::s1::s2::U u4; s1::s2::U u5;
// ::u1::u2::U u6; u1::u2::U u7;
// ::n3::c3::s3::u3::U u8;
// n3::c3::s3::u3::U u9;
// }
// namespace n3 { c3::s3::u3::U u10; }
// namespace n1 { n2::U u11; }
// namespace n1 { namespace n2 { U u12; }}
public void _testQualifiedNamesForUnion() throws DOMException {
IBinding b0 = getBindingFromASTName("S s0;", 1);
assertQNEquals("n1::n2::S", b0);
IBinding b1 = getBindingFromASTName("S s1;", 1);
assertQNEquals("n1::n2::S", b1);
IBinding b2 = getBindingFromASTName("S s2;", 1);
assertQNEquals("c1::c2::S", b2);
IBinding b3 = getBindingFromASTName("S s3;", 1);
assertQNEquals("c1::c2::S", b3);
IBinding b4 = getBindingFromASTName("S s4;", 1);
assertQNEquals("s1::s2::S", b4);
IBinding b5 = getBindingFromASTName("S s5;", 1);
assertQNEquals("s1::s2::S", b5);
IBinding b6 = getBindingFromASTName("S s6;", 1);
assertQNEquals("u1::u2::S", b6);
IBinding b7 = getBindingFromASTName("S s7;", 1);
assertQNEquals("u1::u2::S", b7);
IBinding b8 = getBindingFromASTName("S s8;", 1);
assertQNEquals("n3::c3::s3::u3::S", b8);
IBinding b9 = getBindingFromASTName("S s9;", 1);
assertQNEquals("n3::c3::s3::u3::S", b9);
IBinding b10 = getBindingFromASTName("S s10;", 1);
assertQNEquals("n3::c3::s3::u3::S", b10);
IBinding b11 = getBindingFromASTName("S s11;", 1);
assertQNEquals("n1::n2::S", b11);
IBinding b12 = getBindingFromASTName("C s12;", 1);
assertQNEquals("n1::n2::S", b12);
}
// // header content
// namespace n1 { namespace n2 { class C {}; } }
// class c1 { public: class c2 { public: class C {}; }; };
// struct s1 { struct s2 { class C {}; }; };
// union u1 { union u2 { class C {}; }; };
// namespace n3 { class c3 { public: struct s3 { union u3 { class C {}; }; }; }; }
//
// // reference content
// void reference() {
// ::n1::n2::C c0; n1::n2::C c1;
// ::c1::c2::C c2; c1::c2::C c3;
// ::s1::s2::C c4; s1::s2::C c5;
// ::u1::u2::C c6; u1::u2::C c7;
// ::n3::c3::s3::u3::C c8;
// n3::c3::s3::u3::C c9;
// }
// namespace n3 { c3::s3::u3::C c10; }
// namespace n1 { n2::C c11; }
// namespace n1 { namespace n2 { C c12; }}
public void _testQualifiedNamesForClass() throws DOMException {
IBinding b0 = getBindingFromASTName("C c0;", 1);
assertQNEquals("n1::n2::C", b0);
IBinding b1 = getBindingFromASTName("C c1;", 1);
assertQNEquals("n1::n2::C", b1);
IBinding b2 = getBindingFromASTName("C c2;", 1);
assertQNEquals("c1::c2::C", b2);
IBinding b3 = getBindingFromASTName("C c3;", 1);
assertQNEquals("c1::c2::C", b3);
IBinding b4 = getBindingFromASTName("C c4;", 1);
assertQNEquals("s1::s2::C", b4);
IBinding b5 = getBindingFromASTName("C c5;", 1);
assertQNEquals("s1::s2::C", b5);
IBinding b6 = getBindingFromASTName("C c6;", 1);
assertQNEquals("u1::u2::C", b6);
IBinding b7 = getBindingFromASTName("C c7;", 1);
assertQNEquals("u1::u2::C", b7);
IBinding b8 = getBindingFromASTName("C c8;", 1);
assertQNEquals("n3::c3::s3::u3::C", b8);
IBinding b9 = getBindingFromASTName("C c9;", 1);
assertQNEquals("n3::c3::s3::u3::C", b9);
IBinding b10 = getBindingFromASTName("C c10;", 1);
assertQNEquals("n3::c3::s3::u3::C", b10);
IBinding b11 = getBindingFromASTName("C c11;", 1);
assertQNEquals("n1::n2::C", b11);
IBinding b12 = getBindingFromASTName("C c12;", 1);
assertQNEquals("n1::n2::C", b12);
}
// // header content
// namespace n1 { namespace n2 { typedef int Int; } }
// class c1 { public: class c2 { public: typedef int Int; }; };
// struct s1 { struct s2 { typedef int Int; }; };
// union u1 { struct u2 { typedef int Int; }; };
// namespace n3 { class c3 { public: struct s3 { union u3 { typedef int Int; }; }; }; }
// // reference content
// void reference() {
// ::n1::n2::Int i0; n1::n2::Int i1;
// ::c1::c2::Int i2; c1::c2::Int i3;
// ::s1::s2::Int i4; s1::s2::Int i5;
// ::u1::u2::Int i6; u1::u2::Int i7;
// ::n3::c3::s3::u3::Int i8;
// n3::c3::s3::u3::Int i9;
// }
// namespace n3 { c3::s3::u3::Int i10; }
// namespace n1 { n2::Int i11; }
// namespace n1 { namespace n2 { Int i12; }}
public void _testQualifiedNamesForTypedef() throws DOMException {
IBinding b0 = getBindingFromASTName("Int i0;", 3);
assertQNEquals("n1::n2::Int", b0);
IBinding b1= getBindingFromASTName("Int i1;", 3);
assertQNEquals("n1::n2::Int", b1);
IBinding b2 = getBindingFromASTName("Int i2;", 3);
assertQNEquals("c1::c2::Int", b2);
IBinding b3 = getBindingFromASTName("Int i3;", 3);
assertQNEquals("c1::c2::Int", b3);
IBinding b4 = getBindingFromASTName("Int i4;", 3);
assertQNEquals("s1::s2::Int", b4);
IBinding b5 = getBindingFromASTName("Int i5;", 3);
assertQNEquals("s1::s2::Int", b5);
IBinding b6 = getBindingFromASTName("Int i6;", 3);
assertQNEquals("u1::u2::Int", b6);
IBinding b7 = getBindingFromASTName("Int i7;", 3);
assertQNEquals("u1::u2::Int", b7);
IBinding b8 = getBindingFromASTName("Int i8;", 3);
assertQNEquals("n3::c3::s3::u3::Int", b8);
IBinding b9 = getBindingFromASTName("Int i9;", 3);
assertQNEquals("n3::c3::s3::u3::Int", b9);
IBinding b10 = getBindingFromASTName("Int i10;", 3);
assertQNEquals("n3::c3::s3::u3::Int", b10);
IBinding b11 = getBindingFromASTName("Int i11;", 3);
assertQNEquals("n1::n2::Int", b11);
IBinding b12 = getBindingFromASTName("Int i12;", 3);
assertQNEquals("n1::n2::Int", b12);
}
// // header content
// enum E { ER1, ER2 };
// // referencing content
// class C {
// E e1;
// static E e2;
// void m1() { e1 = ER1; }
// static void m2() { e2 = ER2; }
// };
public void _testEnumeratorInClassScope() {
IBinding b0 = getBindingFromASTName("E e1", 1);
IBinding b1 = getBindingFromASTName("ER1; }", 1);
IBinding b2 = getBindingFromASTName("ER2; }", 1);
}
// // header content
// enum E { ER1, ER2 };
// // referencing content
// struct S {
// E e1;
// static E e2;
// void m1() { e1 = ER1; }
// static void m2() { e2 = ER2; }
// };
public void _testEnumeratorInStructScope() {
IBinding b0 = getBindingFromASTName("E e1", 1);
IBinding b1 = getBindingFromASTName("ER1; }", 1);
IBinding b2 = getBindingFromASTName("ER2; }", 1);
}
// // header content
// enum E { ER1, ER2 };
// // referencing content
// union U {
// E e1;
// static E e2;
// void m1() { e1 = ER1; }
// static void m2() { e2 = ER2; }
// };
public void _testEnumeratorInUnionScope() {
IBinding b0 = getBindingFromASTName("E e1", 1);
IBinding b1 = getBindingFromASTName("ER1; }", 1);
IBinding b2 = getBindingFromASTName("ER2; }", 1);
}
// // header content
// enum E { ER1, ER2 };
// // referencing content
// namespace n1 {
// E e1;
// static E e2;
// void f1() { e1 = ER1; }
// static void f2() { e2 = ER2; }
// };
public void _testEnumeratorInNamespaceScope() {
IBinding b0 = getBindingFromASTName("E e1", 1);
IBinding b1 = getBindingFromASTName("ER1; }", 1);
IBinding b2 = getBindingFromASTName("ER2; }", 1);
}
// // teh header
// void foo(int a=2, int b=3);
// #include "header.h"
// void ref() { foo(); }
public void _testFunctionDefaultArguments() {
IBinding b0 = getBindingFromASTName("foo();", 3);
}
// // header
// class Base { public: void foo(int i) {} };
// class Derived : public Base { public: void foo(long l) {} };
// // references
// #include "header.h"
// void references() {
// Derived d; /*d*/
// d.foo(55L); // calls long version
// d.foo(4); // also calls long version (int version is hidden)
// // aftodo - does this test make sense?
// }
public void _testMethodHidingInInheritance() {
IBinding b0 = getBindingFromASTName("d; /*d*/", 1);
IBinding b1 = getBindingFromASTName("foo(55L);", 3);
IBinding b2 = getBindingFromASTName("foo(4);", 3);
}
// // header content
// namespace x { namespace y { int i; } }
// // the references
// #include "header.h"
// class C { public:
// class x { public:
// class y { public:
// static int j;
// };
// };
// void method() {
// ::x::y::i++;
// x::y::j++;
// }
// };
public void testGQualifiedReference() {
IBinding b0 = getBindingFromASTName("x::y::i++", 1);
assertTrue(ICPPNamespace.class.isInstance(b0));
IBinding b1 = getBindingFromASTName("y::i++", 1);
assertTrue(ICPPNamespace.class.isInstance(b1));
IBinding b2 = getBindingFromASTName("i++", 1);
assertTrue(ICPPVariable.class.isInstance(b2));
IBinding b3 = getBindingFromASTName("x::y::j++", 1);
assertTrue(ICPPClassType.class.isInstance(b3));
IBinding b4 = getBindingFromASTName("y::j++", 1);
assertTrue(ICPPClassType.class.isInstance(b4));
IBinding b5 = getBindingFromASTName("j++", 1);
assertTrue(ICPPVariable.class.isInstance(b5));
}
////header content
//struct S {int i;};
//struct SS { S s, *sp; };
//
//S* retsptr() {return 0;}
//S rets() { return *new S(); }
//S s, *sp;
//SS ss, *ssp;
//S *a[3];
////reference content
//void references() {
// a[0]->i/*0*/++; (*a[0]).i/*1*/++; // IASTArraySubscriptExpression
// /* not applicable */ ?? // IASTBinaryExpression
// ((S*)sp)->i/*3*/++; ((S)s).i/*4*/++; //aftodo-valid? // IASTCastExpression
// (true ? sp : sp)->i/*5*/++; (true ? s : s).i/*6*/++; // IASTConditionalExpression
// (sp,sp)->i/*7*/++; (s,s).i/*8*/++; // IASTExpressionList
// ss.sp->i/*9*/++; ss.s.i/*10*/++; // IASTFieldReference
// ssp->sp->i/*11*/++; ssp->s.i/*12*/++; // IASTFieldReference
// retsptr()->i/*13*/++; rets().i/*14*/++; // IASTFunctionCallExpression
// sp->i/*15*/++; s.i/*16*/++; // IASTIdExpression
// /* not applicable */ // IASTLiteralExpression
// /* not applicable */ // IASTTypeIdExpression
// (*sp).i/*17*/++; // IASTUnaryExpression
// /* not applicable */ // ICPPASTDeleteExpression
// (new S())->i/*18*/++; // ICPPASTNewExpression
//}
public void _testFieldReference() {
IBinding b0 = getBindingFromASTName("i/*0*/", 1);
IBinding b1 = getBindingFromASTName("i/*1*/", 1);
// IBinding b2 = getBindingFromASTName(ast, "i/*2*/", 1);
IBinding b3 = getBindingFromASTName("i/*3*/", 1);
IBinding b4 = getBindingFromASTName("i/*4*/", 1);
IBinding b5 = getBindingFromASTName("i/*5*/", 1);
IBinding b6 = getBindingFromASTName("i/*6*/", 1);
IBinding b7 = getBindingFromASTName("i/*7*/", 1);
IBinding b8 = getBindingFromASTName("i/*8*/", 1);
IBinding b9 = getBindingFromASTName("i/*9*/", 1);
IBinding b10 = getBindingFromASTName("i/*10*/", 1);
IBinding b11 = getBindingFromASTName("i/*11*/", 1);
IBinding b12 = getBindingFromASTName("i/*12*/", 1);
IBinding b13 = getBindingFromASTName("i/*13*/", 1);
IBinding b14 = getBindingFromASTName("i/*14*/", 1);
IBinding b15 = getBindingFromASTName("i/*15*/", 1);
IBinding b16 = getBindingFromASTName("i/*16*/", 1);
IBinding b17 = getBindingFromASTName("i/*17*/", 1);
IBinding b18 = getBindingFromASTName("i/*18*/", 1);
}
// // header file
// class C {C* cp;};
// C foo(C c);
// C* foo(C* c);
// int foo(int i);
// int foo(int i, C c);
// // referencing content
// void references() {
// C c, *cp;
// foo/*a*/(cp[1]); // IASTArraySubscriptExpression
// foo/*b*/(cp+1); // IASTBinaryExpression
// foo/*c*/((C*) cp);/*1*/ // IASTCastExpression
// foo/*d*/(true ? c : c);/*2*/ // IASTConditionalExpression
// foo/*e*/(5, c);/*3*/ // IASTExpressionList
// foo/*f*/(c.cp);/*4*/ foo(cp->cp);/*5*/ // IASTFieldReference
// foo/*g*/(foo(c));/*6*/ foo(foo(1));/*7*/// IASTFunctionCallExpression
// foo/*h*/(c);/*8*/ // IASTIdExpression
// foo/*i*/(23489); // IASTLiteralExpression
// foo/*j*/(sizeof(C));/*9*/ // IASTTypeIdExpression
// foo/*k*/(*cp);/*10*/ // IASTUnaryExpression
// foo/*l*/(delete cp);/*11*/ // ICPPASTDeleteExpression
// foo/*m*/(new C());/*12*/ // ICPPASTNewExpression
// // ?? foo/*n*/(); // ICPPASTSimpleTypeConstructorExpression
// // ?? foo/*o*/(); // ICPPASTTypenameExprssion
// // foo/*p*/(MADE_UP_SYMBOL); // ICPPASTTypenameExprssion
// }
public void _testExpressionKindForFunctionCalls() {
IBinding b0 = getBindingFromASTName("foo/*a*/", 3);
IBinding b0a = getBindingFromASTName("cp[1]", 2);
// assertCompositeTypeParam(0, ICPPClassType.k_class, b0, "C");
IBinding b1 = getBindingFromASTName("foo/*b*/", 3);
IBinding b1a = getBindingFromASTName("cp+1", 2);
IBinding b2 = getBindingFromASTName("foo/*c*/", 3);
IBinding b2a = getBindingFromASTName("cp);/*1*/", 2);
IBinding b3 = getBindingFromASTName("foo/*d*/", 3);
IBinding b3a = getBindingFromASTName("c : c", 1);
IBinding b3b = getBindingFromASTName("c);/*2*/", 1);
IBinding b4 = getBindingFromASTName("foo/*e*/", 3);
IBinding b4a = getBindingFromASTName("c);/*3*/", 1);
IBinding b5 = getBindingFromASTName("foo/*f*/", 3);
IBinding b5a = getBindingFromASTName("cp);/*4*/", 2);
IBinding b5b = getBindingFromASTName("cp->cp);/*5*/", 2);
IBinding b5c = getBindingFromASTName("cp);/*5*/", 2);
IBinding b6 = getBindingFromASTName("foo/*g*/", 3);
IBinding b6a = getBindingFromASTName("foo(c));/*6*/", 3);
IBinding b6b = getBindingFromASTName("c));/*6*/", 1);
IBinding b6c = getBindingFromASTName("foo(foo(1));/*7*/", 3);
IBinding b6d = getBindingFromASTName("foo(1));/*7*/", 3);
IBinding b7 = getBindingFromASTName("foo/*h*/", 3);
IBinding b7a = getBindingFromASTName("c);/*8*/", 1);
IBinding b8 = getBindingFromASTName("foo/*i*/", 3);
IBinding b9 = getBindingFromASTName("foo/*j*/", 3);
IBinding b9a = getBindingFromASTName("C));/*9*/", 1);
IBinding b10 = getBindingFromASTName("foo/*k*/", 3);
IBinding b10a = getBindingFromASTName("cp);/*10*/", 2);
IBinding b11 = getBindingFromASTName("foo/*l*/", 3);
IBinding b11a = getBindingFromASTName("cp);/*11*/", 2);
IBinding b12 = getBindingFromASTName("foo/*m*/", 3);
IBinding b12a = getBindingFromASTName("C());/*12*/", 1);
// IBinding b13 = getBindingFromASTName(ast, "foo/*n*/", 3);
}
// // header content
// class C { public:
// typedef int i1; typedef long *lp1;
// class C1 {}; struct S1 {}; union U1 {}; enum E1 {A1};
// };
// struct S { public:
// typedef int i2; typedef long *lp2;
// class C2 {}; struct S2 {}; union U2 {}; enum E2 {A2};
// };
// union U { public:
// typedef int i3; typedef long *lp3;
// class C3 {}; struct S3 {}; union U3 {}; enum E3 {A3};
// };
// enum E {A};
// namespace n {
// typedef int i4; typedef long *lp4;
// class C4 {}; struct S4 {}; union U4 {}; enum E4 {A4};
// }
// void f(int);
// void f(long);
// void f(C); void f(C::i1); void f(C::lp1); void f(C::S1); void f(C::U1); void f(C::E1);
// void f(S); void f(S::i2); void f(S::lp2); void f(S::S2); void f(S::U2); void f(S::E2);
// void f(U); void f(U::i3); void f(U::lp3); void f(U::S3); void f(U::U3); void f(U::E3);
// void f(n::i4); void f(n::lp4); void f(n::S4); void f(n::U4); void f(n::E4);
// void f(E);
// // reference content
// #include "header.h"
// void references() {
// void (*fintptr)(int), (*flongptr)(long);
// void (*fC)(C), (*fCi1)(C::i1), (*fClp1)(C::lp1), (*fCS1)(C::S1), (*fCU1)(C::U1), (*fCE1)(C::E1);
// void (*fS)(S), (*fSi2)(S::i2), (*fSlp2)(S::lp2), (*fSS2)(S::S2), (*fSU2)(S::U2), (*fSE2)(S::E2);
// void (*fU)(U), (*fUi3)(U::i3), (*fUlp3)(U::lp3), (*fUS3)(U::S3), (*fUU3)(U::U3), (*fUE3)(U::E3);
// void (*fni4)(n::i4), (*fnlp4)(n::lp4), (*fnS4)(n::S4), (*fnU4)(n::U4), (*fnE4)(n::E4);
// void (*fE)(E);
// fintptr = &f;/*0*/ flongptr = &f;/*1*/
// fC = &f;/*2*/ fCi1 = &f;/*3*/ fClp1 = &f;/*4*/ fCS1 = &f;/*5*/ fCU1 = &f;/*6*/ fCE1 = &f;/*7*/
// fS = &f;/*8*/ fSi2 = &f;/*9*/ fSlp2 = &f;/*10*/ fSS2 = &f;/*11*/ fSU2 = &f;/*12*/ fSE2 = &f;/*13*/
// fU = &f;/*14*/ fUi3 = &f;/*15*/ fUlp3 = &f;/*16*/ fUS3 = &f;/*17*/ fUU3 = &f;/*18*/ fUE3 = &f;/*19*/
// fni4 = &f;/*20*/ fnlp4 = &f;/*21*/ fnS4 = &f;/*22*/ fnU4 = &f;/*23*/ fnE4 = &f;/*24*/
// fE = &f;/*25*/
// }
public void _testAddressOfOverloadedFunction() throws DOMException {
IBinding b0 = getBindingFromASTName("f;/*0*/", 1);
IBinding b1 = getBindingFromASTName("f;/*1*/", 1);
IBinding b2 = getBindingFromASTName("f;/*2*/", 1);
IBinding b3 = getBindingFromASTName("f;/*3*/", 1);
IBinding b4 = getBindingFromASTName("f;/*4*/", 1);
IBinding b5 = getBindingFromASTName("f;/*5*/", 1);
IBinding b6 = getBindingFromASTName("f;/*6*/", 1);
IBinding b7 = getBindingFromASTName("f;/*7*/", 1);
IBinding b8 = getBindingFromASTName("f;/*8*/", 1);
IBinding b9 = getBindingFromASTName("f;/*9*/", 1);
IBinding b10= getBindingFromASTName("f;/*10*/", 1);
IBinding b11 = getBindingFromASTName("f;/*11*/", 1);
IBinding b12 = getBindingFromASTName("f;/*12*/", 1);
IBinding b13 = getBindingFromASTName("f;/*13*/", 1);
IBinding b14 = getBindingFromASTName("f;/*14*/", 1);
IBinding b15 = getBindingFromASTName("f;/*15*/", 1);
IBinding b16 = getBindingFromASTName("f;/*16*/", 1);
IBinding b17 = getBindingFromASTName("f;/*17*/", 1);
IBinding b18 = getBindingFromASTName("f;/*18*/", 1);
IBinding b19 = getBindingFromASTName("f;/*19*/", 1);
IBinding b20 = getBindingFromASTName("f;/*20*/", 1);
IBinding b21 = getBindingFromASTName("f;/*21*/", 1);
IBinding b22 = getBindingFromASTName("f;/*22*/", 1);
IBinding b23 = getBindingFromASTName("f;/*23*/", 1);
IBinding b24 = getBindingFromASTName("f;/*24*/", 1);
}
}

View file

@ -39,6 +39,9 @@ public class PDOMTests extends TestSuite {
suite.addTest(MethodTests.suite());
suite.addTest(NamespaceTests.suite());
suite.addTest(IndexCBindingResolutionTest.suite());
suite.addTest(IndexCPPBindingResolutionTest.suite());
suite.addTest(CFunctionTests.suite());
suite.addTest(CVariableTests.suite());
suite.addTest(CCompositeTypeTests.suite());

View file

@ -19,12 +19,20 @@ import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import junit.framework.Assert;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexFile;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
@ -37,6 +45,49 @@ import org.osgi.framework.Bundle;
public class TestSourceReader {
/**
* Returns an array of StringBuffer objects for each comment section found preceding the named
* test in the source code.
* @param bundle the bundle containing the source
* @param srcRoot the directory inside the bundle containing the packages
* @param clazz the name of the class containing the test
* @param testName the name of the test
* @param sections the number of comment sections preceding the named test to return
* @return an array of StringBuffer objects for each comment section found preceding the named
* test in the source code.
* @throws IOException
*/
public static StringBuffer[] getContentsForTest(Bundle bundle, String srcRoot, Class clazz, final String testName, int sections) throws IOException {
IPath filePath= new Path(srcRoot + '/' + clazz.getName().replace('.', '/') + ".java");
InputStream in= FileLocator.openStream(bundle, filePath, false);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
final int OUT_COMMENT=0, IN_COMMENT=1;
int state = OUT_COMMENT;
Queue q;
List contents = new ArrayList();
StringBuffer content = new StringBuffer();
for(String line = br.readLine(); line!=null; line = br.readLine()) {
line = line.trim();
if(line.startsWith("//")) {
content.append(line.substring(2)+"\n");
} else {
if(content.length()>0) {
contents.add(content);
if(contents.size()==sections+1)
contents.remove(0);
content = new StringBuffer();
}
if(line.contains(testName)) {
return (StringBuffer[]) contents.toArray(new StringBuffer[contents.size()]);
}
}
}
throw new IOException("Test data not found for "+clazz+" "+testName);
}
/**
* Searches for the offset of the first occurrence of a string in a workspace file.
* @param lookfor string to be searched for
@ -211,4 +262,15 @@ public class TestSourceReader {
Assert.fail("Indexing " + file.getFullPath() + " did not complete in time!");
}
public static IASTTranslationUnit createIndexBasedAST(IIndex index, ICProject project, IFile file) throws CModelException, CoreException {
ICElement elem= project.findElement(file.getFullPath());
if (elem instanceof ITranslationUnit) {
ITranslationUnit tu= (ITranslationUnit) elem;
if (tu != null) {
return tu.getAST(index, ITranslationUnit.AST_SKIP_INDEXED_HEADERS);
}
}
Assert.fail("Could not create ast for " + file.getFullPath());
return null;
}
}

View file

@ -23,9 +23,7 @@ import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexFile;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
import org.eclipse.cdt.ui.testplugin.CTestPlugin;
@ -56,15 +54,7 @@ public class BaseUITestCase extends BaseTestCase {
}
protected IASTTranslationUnit createIndexBasedAST(IIndex index, ICProject project, IFile file) throws CModelException, CoreException {
ICElement elem= project.findElement(file.getFullPath());
if (elem instanceof ITranslationUnit) {
ITranslationUnit tu= (ITranslationUnit) elem;
if (tu != null) {
return tu.getAST(index, ITranslationUnit.AST_SKIP_INDEXED_HEADERS);
}
}
fail("Could not create ast for " + file.getFullPath());
return null;
return TestSourceReader.createIndexBasedAST(index, project, file);
}
protected void waitForIndexer(IIndex index, IFile file, int maxmillis) throws Exception {