blob: 7cca9ea3f268604b8ee754b8d8b5128f0505585a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2016 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
* Andrew Ferguson (Symbian)
* Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.internal.index.tests;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import java.util.regex.Pattern;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.IName;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTImplicitName;
import org.eclipse.cdt.core.dom.ast.IASTImplicitNameOwner;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNodeSelector;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIfdefStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBasicType;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.ICompositeType;
import org.eclipse.cdt.core.dom.ast.IEnumeration;
import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.core.dom.ast.IFunction;
import org.eclipse.cdt.core.dom.ast.IFunctionType;
import org.eclipse.cdt.core.dom.ast.IProblemBinding;
import org.eclipse.cdt.core.dom.ast.ISemanticProblem;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDirective;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.index.IIndexFile;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.index.IIndexFileSet;
import org.eclipse.cdt.core.index.IIndexInclude;
import org.eclipse.cdt.core.index.IIndexMacro;
import org.eclipse.cdt.core.index.IIndexManager;
import org.eclipse.cdt.core.index.IIndexName;
import org.eclipse.cdt.core.index.IndexFilter;
import org.eclipse.cdt.core.index.IndexLocationFactory;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
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.settings.model.CSourceEntry;
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.cdt.core.settings.model.ICSettingEntry;
import org.eclipse.cdt.core.settings.model.ICSourceEntry;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.CTestPlugin;
import org.eclipse.cdt.core.testplugin.TestScannerProvider;
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.pdom.CModelListener;
import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import junit.framework.TestSuite;
public class IndexBugsTests extends BaseTestCase {
private ICProject fCProject;
protected IIndex fIndex;
public IndexBugsTests(String name) {
super(name);
}
protected class BindingAssertionHelper {
protected IASTTranslationUnit tu;
protected String contents;
public BindingAssertionHelper(IFile file, String contents, IIndex index) throws CModelException, CoreException {
this.contents= contents;
this.tu= TestSourceReader.createIndexBasedAST(index, fCProject, file);
}
public IASTTranslationUnit getTranslationUnit() {
return tu;
}
public IBinding assertProblem(String section, int len) {
IBinding binding= binding(section, len);
assertTrue("Non-ProblemBinding for name: " + section.substring(0, len),
binding instanceof IProblemBinding);
return binding;
}
public <T extends IBinding> T assertNonProblem(String section, int len) {
IBinding binding= binding(section, len);
if (binding instanceof IProblemBinding) {
IProblemBinding problem= (IProblemBinding) binding;
fail("ProblemBinding for name: " + section.substring(0, len) + " (" + renderProblemID(problem.getID())+")");
}
if (binding == null) {
fail("Null binding resolved for name: " + section.substring(0, len));
}
return (T) binding;
}
public void assertNoName(String section, int len) {
IASTName name= findName(section, len, false);
if (name != null) {
String selection = section.substring(0, len);
fail("Found unexpected \"" + selection + "\": " + name.resolveBinding());
}
}
/**
* Asserts that there is exactly one name at the given location and that
* it resolves to the given type of binding.
*/
public IASTImplicitName assertImplicitName(String section, int len, Class<?> bindingClass) {
IASTName name = findName(section, len, true);
final String selection = section.substring(0, len);
assertNotNull("did not find \""+selection+"\"", name);
assertInstance(name, IASTImplicitName.class);
IASTImplicitNameOwner owner = (IASTImplicitNameOwner) name.getParent();
IASTImplicitName[] implicits = owner.getImplicitNames();
assertNotNull(implicits);
if (implicits.length > 1) {
boolean found = false;
for (IASTImplicitName n : implicits) {
if (((ASTNode)n).getOffset() == ((ASTNode)name).getOffset()) {
assertFalse(found);
found = true;
}
}
assertTrue(found);
}
assertEquals(selection, name.getRawSignature());
IBinding binding = name.resolveBinding();
assertNotNull(binding);
assertInstance(binding, bindingClass);
return (IASTImplicitName) name;
}
public void assertNoImplicitName(String section, int len) {
IASTName name = findName(section, len, true);
final String selection = section.substring(0, len);
assertNull("found name \""+selection+"\"", name);
}
public IASTImplicitName[] getImplicitNames(String section, int len) {
IASTName name = findName(section, len, true);
IASTImplicitNameOwner owner = (IASTImplicitNameOwner) name.getParent();
IASTImplicitName[] implicits = owner.getImplicitNames();
return implicits;
}
private IASTName findName(String section, int len, boolean implicit) {
final int offset = contents.indexOf(section);
assertTrue(offset >= 0);
IASTNodeSelector selector = tu.getNodeSelector(null);
return implicit ? selector.findImplicitName(offset, len) : selector.findName(offset, len);
}
private String renderProblemID(int i) {
try {
for (Field field : IProblemBinding.class.getDeclaredFields()) {
if (field.getName().startsWith("SEMANTIC_")) {
if (field.getType() == int.class) {
Integer ci= (Integer) field.get(null);
if (ci.intValue() == i) {
return field.getName();
}
}
}
}
} catch(IllegalAccessException iae) {
throw new RuntimeException(iae);
}
return "Unknown problem ID";
}
public <T extends IBinding> T assertNonProblem(String section, int len, Class<T> type, Class... cs) {
IBinding binding= binding(section, len);
assertTrue("ProblemBinding for name: " + section.substring(0, len),
!(binding instanceof IProblemBinding));
assertInstance(binding, type);
for (Class c : cs) {
assertInstance(binding, c);
}
return type.cast(binding);
}
private IBinding binding(String section, int len) {
IASTName name = findName(section, len, false);
final String selection = section.substring(0, len);
assertNotNull("Did not find \"" + selection + "\"", name);
assertEquals(selection, name.getRawSignature());
IBinding binding = name.resolveBinding();
assertNotNull("No binding for " + name.getRawSignature(), binding);
return name.resolveBinding();
}
}
public static TestSuite suite() {
final TestSuite ts = suite(IndexBugsTests.class);
ts.addTest(Bug246129.suite());
return ts;
}
@Override
protected void setUp() throws Exception {
super.setUp();
fCProject= CProjectHelper.createCCProject("__bugsTest__", "bin", IPDOMManager.ID_FAST_INDEXER);
CCorePlugin.getIndexManager().reindex(fCProject);
waitForIndexer();
fIndex= CCorePlugin.getIndexManager().getIndex(fCProject);
}
@Override
protected void tearDown() throws Exception {
if (fCProject != null) {
CProjectHelper.delete(fCProject);
}
super.tearDown();
}
protected IProject getProject() {
return fCProject.getProject();
}
protected String[] getContentsForTest(int blocks) throws IOException {
CharSequence[] help= TestSourceReader.getContentsForTest(
CTestPlugin.getDefault().getBundle(), "parser", getClass(), getName(), blocks);
String[] result= new String[help.length];
int i= 0;
for (CharSequence buf : help) {
result[i++]= buf.toString();
}
return result;
}
protected IFile createFile(IContainer container, String fileName, String contents) throws Exception {
return TestSourceReader.createFile(container, new Path(fileName), contents);
}
private IIndexFile getIndexFile(IFile file) throws CoreException {
return getIndexFile(fIndex, file);
}
private IIndexFile getIndexFile(IIndex index, IFile file) throws CoreException {
IIndexFile[] files = index.getFiles(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(file));
assertTrue("Can't find " + file.getLocation(), files.length > 0);
assertEquals("Found " + files.length + " files for " + file.getLocation() + " instead of one", 1, files.length);
return files[0];
}
private void waitForIndexer() throws InterruptedException {
waitForIndexer(fCProject);
}
protected Pattern[] getPattern(String qname) {
String[] parts= qname.split("::");
Pattern[] result= new Pattern[parts.length];
for (int i = 0; i < result.length; i++) {
result[i]= Pattern.compile(parts[i]);
}
return result;
}
protected void waitUntilFileIsIndexed(IFile file, int time) throws Exception {
TestSourceReader.waitUntilFileIsIndexed(fIndex, file, time);
}
/**
* Attempts to get an IBinding from the initial specified number of characters
* from the specified code fragment. Fails the test if
* <ul>
* <li> There is not a unique name with the specified criteria
* <li> The binding associated with the name is null or a problem binding
* <li> The binding is not an instance of the specified class
* </ul>
* @param ast the AST to test.
* @param source the source code corresponding to the AST.
* @param section the code fragment to search for in the AST. The first occurrence of
* an identical section is used.
* @param len the length of the specified section to use as a name. This can also be useful
* for distinguishing between template names, and template ids.
* @param clazz an expected class type or interface that the binding should extend/implement
* @return the associated name's binding
*/
protected <T> T getBindingFromASTName(IASTTranslationUnit ast, String source, String section, int len,
Class<T> clazz, Class... cs) {
IASTName name= ast.getNodeSelector(null).findName(source.indexOf(section), len);
assertNotNull("Name not found for \"" + section + "\"", name);
assertEquals(section.substring(0, len), name.getRawSignature());
IBinding binding = name.resolveBinding();
assertNotNull("No binding for " + section.substring(0, len), binding);
assertTrue("ProblemBinding for name: " + section.substring(0, len),
!(binding instanceof IProblemBinding));
assertInstance(binding, clazz, cs);
return clazz.cast(binding);
}
protected static <T> T assertInstance(Object o, Class<T> clazz, Class ... cs) {
assertNotNull("Expected " + clazz.getName() + " but got null", o);
assertTrue("Expected " + clazz.getName() + " but got " + o.getClass().getName(), clazz.isInstance(o));
for (Class c : cs) {
assertTrue("Expected " + clazz.getName() + " but got " + o.getClass().getName(), c.isInstance(o));
}
return clazz.cast(o);
}
// class A {
// public:
// void one() {}
// void two() {}
// };
// class A {
// public:
// void three() {}
// void four() {}
// void five() {}
// };
public void test154563() throws Exception {
// Because of fix for http://bugs.eclipse.org/193779 this test case passes.
// However http://bugs.eclipse.org/154563 remains to be fixed.
String[] content= getContentsForTest(2);
IFile file= createFile(getProject(), "header.h", content[0]);
waitUntilFileIsIndexed(file, INDEXER_TIMEOUT_SEC * 1000);
IIndex index= CCorePlugin.getIndexManager().getIndex(fCProject);
index.acquireReadLock();
try {
IBinding[] bs= index.findBindings("A".toCharArray(), IndexFilter.ALL, npm());
assertEquals(1, bs.length);
assertTrue(bs[0] instanceof ICPPClassType);
assertEquals(2, ((ICPPClassType)bs[0]).getDeclaredMethods().length);
} finally {
index.releaseReadLock();
}
file= createFile(getProject(), "header.h", content[1]);
waitUntilFileIsIndexed(file, INDEXER_TIMEOUT_SEC * 1000);
index= CCorePlugin.getIndexManager().getIndex(fCProject);
index.acquireReadLock();
try {
IBinding[] bs= index.findBindings("A".toCharArray(), IndexFilter.ALL, npm());
assertEquals(1, bs.length);
assertTrue(bs[0] instanceof ICPPClassType);
assertEquals(3, ((ICPPClassType)bs[0]).getDeclaredMethods().length);
} finally {
index.releaseReadLock();
}
}
public void test150906() throws Exception {
String fileName= "bug150906.c";
String varName= "arrayDataSize";
StringBuilder content= new StringBuilder();
content.append("unsigned char arrayData[] = {\n");
for (int i= 0; i < 1024 * 250 - 1; i++) {
content.append("0x00,");
}
content.append("0x00};\n");
content.append("unsigned int arrayDataSize = sizeof(arrayData);\n");
int indexOfDecl = content.indexOf(varName);
waitForIndexer();
IFile file= createFile(getProject(), fileName, content.toString());
// must be done in a reasonable amount of time
waitUntilFileIsIndexed(file, INDEXER_TIMEOUT_SEC * 1000);
fIndex.acquireReadLock();
try {
IIndexBinding[] bindings= fIndex.findBindings(getPattern("arrayDataSize"), true, IndexFilter.ALL, npm());
assertEquals(1, bindings.length);
IIndexBinding binding= bindings[0];
// check if we have the definition
IIndexName[] decls= fIndex.findNames(binding, IIndex.FIND_DEFINITIONS);
assertEquals(1, decls.length);
assertEquals(indexOfDecl, decls[0].getNodeOffset());
} finally {
fIndex.releaseReadLock();
}
}
// enum {e20070206};
public void test156671() throws Exception {
waitForIndexer();
String content= getContentsForTest(1)[0];
IFile file= TestSourceReader.createFile(fCProject.getProject(), "test156671.cpp", content);
TestSourceReader.waitUntilFileIsIndexed(fIndex, file, INDEXER_TIMEOUT_SEC * 1000);
fIndex.acquireReadLock();
try {
IBinding[] bindings= fIndex.findBindings("e20070206".toCharArray(), IndexFilter.getFilter(ILinkage.CPP_LINKAGE_ID), npm());
assertEquals(1, bindings.length);
assertTrue(bindings[0] instanceof IEnumerator);
} finally {
fIndex.releaseReadLock();
}
}
public void test160281_1() throws Exception {
waitForIndexer();
IProject project = fCProject.getProject();
IFile include= TestSourceReader.createFile(project, "inc/test160281_1.h", "");
TestScannerProvider.sIncludes= new String[]{include.getLocation().removeLastSegments(1).toString()};
TestScannerProvider.sIncludeFiles= new String[]{include.getName()};
IFile file= TestSourceReader.createFile(project, "test160281_1.cpp", "");
TestSourceReader.waitUntilFileIsIndexed(fIndex, file, INDEXER_TIMEOUT_SEC * 1000);
fIndex.acquireReadLock();
try {
IIndexFile ifile= getIndexFile(file);
IIndexInclude[] includes= ifile.getIncludes();
// the first directory searched for file is the preprocessor's working directory (build directory), see gcc manual -include option
IIndexInclude i1= includes[0];
assertEquals(file.getLocationURI(), i1.getIncludedByLocation().getURI());
assertEquals(project.getFile(TestScannerProvider.sIncludeFiles[0]).getLocation(), new Path(i1.getFullName()));
// the include file is not in the working directory
assertEquals(null, i1.getIncludesLocation());
// the second directory is the directory containing the main source file
IIndexInclude i2= includes[1];
assertEquals(file.getLocationURI(), i2.getIncludedByLocation().getURI());
assertEquals(include.getLocationURI(), i2.getIncludesLocation().getURI());
assertEquals(true, i2.isSystemInclude());
assertEquals(0, i2.getNameOffset());
assertEquals(0, i2.getNameLength());
assertEquals(2, includes.length);
} finally {
fIndex.releaseReadLock();
}
}
public void test160281_2() throws Exception {
waitForIndexer();
IProject project = fCProject.getProject();
IFile include= TestSourceReader.createFile(project, "inc/test160281_2.h", "#define X y\n");
TestScannerProvider.sIncludes= new String[]{include.getLocation().removeLastSegments(1).toString()};
TestScannerProvider.sMacroFiles= new String[]{include.getName()};
IFile file= TestSourceReader.createFile(project, "test160281_2.cpp", "int X;");
TestSourceReader.waitUntilFileIsIndexed(fIndex, file, INDEXER_TIMEOUT_SEC * 1000);
fIndex.acquireReadLock();
try {
IIndexFile ifile= getIndexFile(file);
IIndexInclude[] includes= ifile.getIncludes();
// the first directory searched for file is the preprocessor's working directory (build directory), see gcc manual -imacros option
IIndexInclude i1= includes[0];
assertEquals(file.getLocationURI(), i1.getIncludedByLocation().getURI());
assertEquals(project.getFile(TestScannerProvider.sMacroFiles[0]).getLocation(), new Path(i1.getFullName()));
// the include file is not in the working directory
assertEquals(null, i1.getIncludesLocation());
// the second directory is the directory containing the main source file
IIndexInclude i2= includes[1];
assertEquals(file.getLocationURI(), i2.getIncludedByLocation().getURI());
assertEquals(include.getLocationURI(), i2.getIncludesLocation().getURI());
assertEquals(true, i2.isSystemInclude());
assertEquals(0, i2.getNameOffset());
assertEquals(0, i2.getNameLength());
IIndexBinding[] bindings= fIndex.findBindings("y".toCharArray(), IndexFilter.ALL, npm());
assertEquals(1, bindings.length);
assertTrue(bindings[0] instanceof IVariable);
assertEquals(2, includes.length);
} finally {
fIndex.releaseReadLock();
}
}
// namespace ns162011 {
// class Class162011 {
// friend void function162011(Class162011);
// };
// void function162011(Class162011 x){};
// }
public void test162011() throws Exception {
String content = getContentsForTest(1)[0];
String fileName = "bug162011.cpp";
String funcName = "function162011";
int indexOfDecl = content.indexOf(funcName);
int indexOfDef = content.indexOf(funcName, indexOfDecl+1);
IFile file= createFile(getProject(), fileName, content);
waitUntilFileIsIndexed(file, INDEXER_TIMEOUT_SEC * 1000);
// make sure the ast is correct
ITranslationUnit tu= (ITranslationUnit) fCProject.findElement(new Path(fileName));
IASTTranslationUnit ast= tu.getAST();
IASTName name= (IASTName) ast.getNodeSelector(null).findNode(indexOfDecl, funcName.length());
IBinding astBinding= name.resolveBinding();
IName[] astDecls= ast.getDeclarations(astBinding);
assertEquals(2, astDecls.length);
int i1= astDecls[0].getFileLocation().getNodeOffset();
int i2= astDecls[1].getFileLocation().getNodeOffset();
assertEquals(indexOfDecl, Math.min(i1, i2));
assertEquals(indexOfDef, Math.max(i1, i2));
fIndex.acquireReadLock();
try {
IIndexBinding[] bindings= fIndex.findBindings(getPattern("ns162011::function162011"), true, IndexFilter.ALL, npm());
assertEquals(1, bindings.length);
IIndexBinding binding= bindings[0];
// check if we have the declaration
IIndexName[] decls= fIndex.findNames(binding, IIndex.FIND_DECLARATIONS);
assertEquals(1, decls.length);
assertEquals(indexOfDecl, decls[0].getNodeOffset());
// check if we have the definition
decls= fIndex.findNames(binding, IIndex.FIND_DEFINITIONS);
assertEquals(1, decls.length);
assertEquals(indexOfDef, decls[0].getNodeOffset());
} finally {
fIndex.releaseReadLock();
}
}
public void test164360_1() throws Exception {
waitForIndexer();
IFile include= TestSourceReader.createFile(fCProject.getProject(), "test164360.h", "");
TestScannerProvider.sIncludeFiles= new String[] { include.getLocation().toOSString() };
IFile file= TestSourceReader.createFile(fCProject.getProject(), "test164360.cpp", "");
TestSourceReader.waitUntilFileIsIndexed(fIndex, file, INDEXER_TIMEOUT_SEC * 1000);
fIndex.acquireReadLock();
try {
IIndexFile ifile= getIndexFile(file);
IIndexInclude[] includes= ifile.getIncludes();
assertEquals(1, includes.length);
IIndexInclude i= includes[0];
assertEquals(file.getLocationURI(), i.getIncludedByLocation().getURI());
assertEquals(include.getLocationURI(), i.getIncludesLocation().getURI());
assertEquals(true, i.isSystemInclude());
assertEquals(0, i.getNameOffset());
assertEquals(0, i.getNameLength());
} finally {
fIndex.releaseReadLock();
}
}
public void test164360_2() throws Exception {
waitForIndexer();
IFile include= TestSourceReader.createFile(fCProject.getProject(), "test164360.h", "");
TestScannerProvider.sMacroFiles= new String[]{include.getLocation().toOSString()};
IFile file= TestSourceReader.createFile(fCProject.getProject(), "test164360.cpp", "");
TestSourceReader.waitUntilFileIsIndexed(fIndex, file, INDEXER_TIMEOUT_SEC * 1000);
fIndex.acquireReadLock();
try {
IIndexFile ifile= getIndexFile(file);
IIndexInclude[] includes= ifile.getIncludes();
assertEquals(1, includes.length);
IIndexInclude i= includes[0];
assertEquals(file.getLocationURI(), i.getIncludedByLocation().getURI());
assertEquals(include.getLocationURI(), i.getIncludesLocation().getURI());
assertEquals(true, i.isSystemInclude());
assertEquals(0, i.getNameOffset());
assertEquals(0, i.getNameLength());
} finally {
fIndex.releaseReadLock();
}
}
// #define macro164500 1
// #undef macro164500
// #define macro164500 2
public void test164500() throws Exception {
waitForIndexer();
String content= getContentsForTest(1)[0];
IFile file= TestSourceReader.createFile(fCProject.getProject(), "test164500.cpp", content);
TestSourceReader.waitUntilFileIsIndexed(fIndex, file, INDEXER_TIMEOUT_SEC * 1000);
fIndex.acquireReadLock();
try {
IIndexFile ifile= getIndexFile(file);
IIndexMacro[] macros= ifile.getMacros();
assertEquals(3, macros.length);
IIndexMacro m= macros[0];
assertEquals("1", new String(m.getExpansionImage()));
assertEquals("macro164500", new String(m.getName()));
m= macros[2];
assertEquals("2", new String(m.getExpansionImage()));
assertEquals("macro164500", new String(m.getName()));
} finally {
fIndex.releaseReadLock();
}
}
// // header.h
// class E {};
// #include "header.h"
// E var;
// // header.h
// enum E {A,B,C};
public void test171834() throws Exception {
CModelListener.sSuppressUpdateOfLastRecentlyUsed= false;
waitForIndexer();
ICProject cproject = CProjectHelper.createCCProject("seq1", "bin", IPDOMManager.ID_FAST_INDEXER);
try {
IIndex index = CCorePlugin.getIndexManager().getIndex(cproject);
String[] testData = getContentsForTest(3);
IFile header= TestSourceReader.createFile(cproject.getProject(), "header.h", testData[0]);
IFile referer= TestSourceReader.createFile(cproject.getProject(), "content.cpp", testData[1]);
TestSourceReader.waitUntilFileIsIndexed(index, referer, INDEXER_TIMEOUT_SEC * 1000);
index.acquireReadLock();
try {
IBinding[] bindings = index.findBindings(Pattern.compile("var"), true, IndexFilter.ALL, new NullProgressMonitor());
assertEquals(1, bindings.length);
IType type = ((ICPPVariable)bindings[0]).getType();
assertTrue(type instanceof ICPPClassType);
assertEquals("var is not of type class", ICPPClassType.k_class, ((ICPPClassType)type).getKey());
} finally {
index.releaseReadLock();
}
InputStream in = new ByteArrayInputStream(testData[2].getBytes());
header.setContents(in, IResource.FORCE, null);
TestSourceReader.waitUntilFileIsIndexed(index, header, INDEXER_TIMEOUT_SEC * 1000);
index.acquireReadLock();
try {
IBinding[] bindings = index.findBindings(Pattern.compile("var"), true, IndexFilter.ALL, new NullProgressMonitor());
assertEquals(1, bindings.length);
IType type = ((ICPPVariable)bindings[0]).getType();
assertTrue(type instanceof IEnumeration);
} finally {
index.releaseReadLock();
}
} finally {
CProjectHelper.delete(cproject);
}
}
// typedef struct S20070201 {
// int a;
// } S20070201;
public void test172454_1() throws Exception {
waitForIndexer();
String content= getContentsForTest(1)[0];
IFile file= TestSourceReader.createFile(fCProject.getProject(), "test172454.c", content);
TestSourceReader.waitUntilFileIsIndexed(fIndex, file, INDEXER_TIMEOUT_SEC * 1000);
fIndex.acquireReadLock();
try {
IBinding[] bindings= fIndex.findBindings("S20070201".toCharArray(), IndexFilter.getFilter(ILinkage.C_LINKAGE_ID), npm());
assertEquals(2, bindings.length);
IBinding struct, typedef;
if (bindings[0] instanceof ICompositeType) {
struct= bindings[0];
typedef= bindings[1];
} else {
struct= bindings[1];
typedef= bindings[0];
}
assertTrue(struct instanceof ICompositeType);
assertTrue(typedef instanceof ITypedef);
assertTrue(((ITypedef) typedef).getType() instanceof ICompositeType);
assertTrue(((ITypedef) typedef).isSameType((ICompositeType) struct));
} finally {
fIndex.releaseReadLock();
}
}
// typedef struct S20070201 {
// int a;
// } S20070201;
public void test172454_2() throws Exception {
waitForIndexer();
String content= getContentsForTest(1)[0];
IFile file= TestSourceReader.createFile(fCProject.getProject(), "test172454.cpp", content);
TestSourceReader.waitUntilFileIsIndexed(fIndex, file, INDEXER_TIMEOUT_SEC * 1000);
fIndex.acquireReadLock();
try {
IBinding[] bindings= fIndex.findBindings("S20070201".toCharArray(), IndexFilter.getFilter(ILinkage.CPP_LINKAGE_ID), npm());
assertEquals(2, bindings.length);
IBinding struct, typedef;
if (bindings[0] instanceof ICPPClassType) {
struct= bindings[0];
typedef= bindings[1];
} else {
struct= bindings[1];
typedef= bindings[0];
}
assertTrue(struct instanceof ICPPClassType);
assertTrue(((ICPPClassType)struct).getKey()==ICompositeType.k_struct);
assertTrue(typedef instanceof ITypedef);
IType aliased = ((ITypedef) typedef).getType();
assertTrue(aliased instanceof ICPPClassType);
assertTrue(((ICPPClassType)aliased).getKey()==ICompositeType.k_struct);
assertTrue(((ITypedef) typedef).isSameType((ICompositeType) struct));
} finally {
fIndex.releaseReadLock();
}
}
// typedef int T20070213;
public void test173997() throws Exception {
waitForIndexer();
String content= getContentsForTest(1)[0];
IFile file= TestSourceReader.createFile(fCProject.getProject(), "test173997.cpp", content);
TestSourceReader.waitUntilFileIsIndexed(fIndex, file, INDEXER_TIMEOUT_SEC * 1000);
fIndex.acquireReadLock();
try {
IBinding[] bindings= fIndex.findBindings("T20070213".toCharArray(), IndexFilter.getFilter(ILinkage.CPP_LINKAGE_ID), npm());
assertEquals(1, bindings.length);
assertTrue(bindings[0] instanceof ITypedef);
ITypedef td= (ITypedef) bindings[0];
IType type= td.getType();
assertTrue(type instanceof IBasicType);
IBasicType btype= (IBasicType) type;
assertEquals(IBasicType.t_int, btype.getType());
} finally {
fIndex.releaseReadLock();
}
long timestamp= file.getLocalTimeStamp();
content= "int UPDATED20070213;\n" + content.replaceFirst("int", "float");
file= TestSourceReader.createFile(fCProject.getProject(), "test173997.cpp", content);
TestSourceReader.waitUntilFileIsIndexed(fIndex, file, INDEXER_TIMEOUT_SEC * 1000);
fIndex.acquireReadLock();
try {
// double check if file was indexed
IBinding[] bindings= fIndex.findBindings("UPDATED20070213".toCharArray(), IndexFilter.getFilter(ILinkage.CPP_LINKAGE_ID), npm());
assertEquals(1, bindings.length);
bindings= fIndex.findBindings("T20070213".toCharArray(), IndexFilter.getFilter(ILinkage.CPP_LINKAGE_ID), npm());
assertEquals(1, bindings.length);
assertTrue(bindings[0] instanceof ITypedef);
ITypedef td= (ITypedef) bindings[0];
IType type= td.getType();
assertTrue(type instanceof IBasicType);
IBasicType btype= (IBasicType) type;
assertTrue(IBasicType.t_int != btype.getType());
assertEquals(IBasicType.t_float, btype.getType());
} finally {
fIndex.releaseReadLock();
}
}
// class A {};
// class B {};
// A var;
// class A {};
// class B {};
// B var;
public void test173997_2() throws Exception {
String[] content= getContentsForTest(2);
IFile file= createFile(getProject(), "header.h", content[0]);
waitUntilFileIsIndexed(file, INDEXER_TIMEOUT_SEC * 1000);
IIndex index= CCorePlugin.getIndexManager().getIndex(fCProject);
index.acquireReadLock();
try {
IBinding[] bs= index.findBindings("var".toCharArray(), IndexFilter.ALL, npm());
assertEquals(1, bs.length);
assertTrue(bs[0] instanceof ICPPVariable);
assertTrue(((ICPPVariable)bs[0]).getType() instanceof ICPPClassType);
assertEquals("A", ((ICPPClassType)(((ICPPVariable)bs[0]).getType())).getName());
} finally {
index.releaseReadLock();
}
file= createFile(getProject(), "header.h", content[1]);
waitUntilFileIsIndexed(file, INDEXER_TIMEOUT_SEC * 1000);
index= CCorePlugin.getIndexManager().getIndex(fCProject);
index.acquireReadLock();
try {
IBinding[] bs= index.findBindings("var".toCharArray(), IndexFilter.ALL, npm());
assertEquals(1, bs.length);
assertTrue(bs[0] instanceof ICPPVariable);
assertTrue(((ICPPVariable)bs[0]).getType() instanceof ICPPClassType);
assertEquals("B", ((ICPPClassType)(((ICPPVariable)bs[0]).getType())).getName());
} finally {
index.releaseReadLock();
}
}
// // header.h
// template <class T1> class Test {};
// template <class T2> void f() {}
// #include "header.h"
// struct A {};
// Test<A> a;
// void func() {
// f<A>();
// }
// template <class U1> class Test;
// template <class U2> void f();
public void test253080() throws Exception {
waitForIndexer();
String[] testData = getContentsForTest(3);
TestSourceReader.createFile(fCProject.getProject(), "header.h", testData[0]);
IFile test= TestSourceReader.createFile(fCProject.getProject(), "test.cpp", testData[1]);
TestSourceReader.createFile(fCProject.getProject(), "unrelated.cpp", testData[2]);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
indexManager.reindex(fCProject);
waitForIndexer();
IIndex index= indexManager.getIndex(fCProject);
index.acquireReadLock();
try {
IASTTranslationUnit ast = TestSourceReader.createIndexBasedAST(index, fCProject, test);
getBindingFromASTName(ast, testData[1], "Test<A>", 7, ICPPTemplateInstance.class);
getBindingFromASTName(ast, testData[1], "f<A>", 4, ICPPTemplateInstance.class);
} finally {
index.releaseReadLock();
}
}
// // test1.h
// template<class U> struct A {
// typedef U value_type;
// };
// // test2.h
// #include "test1.h"
// template<class T> struct B {
// typedef A<T> container_type;
// typedef typename container_type::value_type value_type;
// };
// #include "test1.h"
// #include "test2.h"
// void f(int x);
// void test(B<int>::value_type x) {
// f(x);
// }
public void test257818_1() throws Exception {
waitForIndexer();
String[] testData = getContentsForTest(4);
TestSourceReader.createFile(fCProject.getProject(), "test1.h", testData[0]);
TestSourceReader.createFile(fCProject.getProject(), "test2.h", testData[1]);
TestSourceReader.createFile(fCProject.getProject(), "test1.cpp", testData[2]);
IFile test2= TestSourceReader.createFile(fCProject.getProject(), "test2.cpp", testData[3]);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
indexManager.reindex(fCProject);
waitForIndexer();
IIndex index= indexManager.getIndex(fCProject);
index.acquireReadLock();
try {
IASTTranslationUnit ast = TestSourceReader.createIndexBasedAST(index, fCProject, test2);
getBindingFromASTName(ast, testData[3], "f(x)", 1, ICPPFunction.class);
} finally {
index.releaseReadLock();
}
}
// // test1.h
// template<class U> struct A {
// typedef U value_type;
// };
// // test2.h
// #include "test1.h"
// template<class T> struct B {
// typedef A<T> container_type;
// typedef typename container_type::value_type value_type;
// void m(value_type* p);
// };
// #include "test1.h"
// #include "test2.h"
// class C {};
// void test(B<C> x, C y) {
// x.m(&y);
// }
public void test257818_2() throws Exception {
waitForIndexer();
String[] testData = getContentsForTest(4);
TestSourceReader.createFile(fCProject.getProject(), "test1.h", testData[0]);
TestSourceReader.createFile(fCProject.getProject(), "test2.h", testData[1]);
TestSourceReader.createFile(fCProject.getProject(), "test1.cpp", testData[2]);
IFile test2= TestSourceReader.createFile(fCProject.getProject(), "test2.cpp", testData[3]);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
indexManager.reindex(fCProject);
waitForIndexer();
IIndex index= indexManager.getIndex(fCProject);
index.acquireReadLock();
try {
IASTTranslationUnit ast = TestSourceReader.createIndexBasedAST(index, fCProject, test2);
getBindingFromASTName(ast, testData[3], "m(&y)", 1, ICPPMethod.class);
} finally {
index.releaseReadLock();
}
}
// class A {}; class B {}; class C {};
public void testIndexContentOverProjectDelete() throws Exception {
waitForIndexer();
/* Check that when a project is deleted, its index contents do not
* appear in the initial index of a newly created project of the same name */
String pname = "deleteTest"+System.currentTimeMillis();
ICProject cproject = CProjectHelper.createCCProject(pname, "bin", IPDOMManager.ID_FAST_INDEXER);
IIndex index = CCorePlugin.getIndexManager().getIndex(cproject);
String content= getContentsForTest(1)[0];
IFile file= TestSourceReader.createFile(cproject.getProject(), "content.cpp", content);
TestSourceReader.waitUntilFileIsIndexed(index, file, INDEXER_TIMEOUT_SEC * 1000);
CProjectHelper.delete(cproject);
cproject = CProjectHelper.createCCProject(pname, "bin", IPDOMManager.ID_FAST_INDEXER);
index = CCorePlugin.getIndexManager().getIndex(cproject);
index.acquireReadLock();
try {
IBinding[] bindings = index.findBindings(Pattern.compile(".*"), false, IndexFilter.ALL, new NullProgressMonitor());
assertEquals(0, bindings.length);
} finally {
index.releaseReadLock();
CProjectHelper.delete(cproject);
}
}
// class A {}; class B {}; class C {}; class D {};
public void testIndexContentOverProjectMove() throws Exception {
waitForIndexer();
/* Check that the contents of an index is preserved over a project
* move operation */
ICProject cproject = CProjectHelper.createCCProject("moveTest", "bin", IPDOMManager.ID_FAST_INDEXER);
IIndex index = CCorePlugin.getIndexManager().getIndex(cproject);
String content= getContentsForTest(1)[0];
IFile file= TestSourceReader.createFile(cproject.getProject(), "content.cpp", content);
TestSourceReader.waitUntilFileIsIndexed(index, file, INDEXER_TIMEOUT_SEC * 1000);
// move the project to a random new location
File newLocation = CProjectHelper.freshDir();
IProjectDescription description = cproject.getProject().getDescription();
description.setLocationURI(newLocation.toURI());
cproject.getProject().move(description, IResource.FORCE | IResource.SHALLOW, new NullProgressMonitor());
index = CCorePlugin.getIndexManager().getIndex(cproject);
index.acquireReadLock();
try {
IBinding[] bindings = index.findBindings(Pattern.compile(".*"), false, IndexFilter.ALL_DECLARED, new NullProgressMonitor());
assertEquals(4, bindings.length);
} finally {
index.releaseReadLock();
CProjectHelper.delete(cproject);
}
}
// class a {};
// class A {};
// namespace aa {
// class a {
// class e {
// class AA {class A{};};
// };
// };
// };
public void testFindBindingsWithPrefix() throws Exception {
waitForIndexer();
String content= getContentsForTest(1)[0];
IFile file= TestSourceReader.createFile(fCProject.getProject(), "testFBWP.cpp", content);
TestSourceReader.waitUntilFileIsIndexed(fIndex, file, INDEXER_TIMEOUT_SEC * 1000);
fIndex.acquireReadLock();
try {
final IndexFilter NON_FUNCTIONS = new IndexFilter() {
@Override
public boolean acceptBinding(IBinding binding) {
return !(binding instanceof IFunction);
}
};
IBinding[] bindings= fIndex.findBindingsForPrefix(new char[] {'a'}, true, NON_FUNCTIONS, null);
assertEquals(3, bindings.length);
bindings= fIndex.findBindingsForPrefix(new char[] {'a'}, false, NON_FUNCTIONS, null);
assertEquals(6, bindings.length);
bindings= fIndex.findBindingsForPrefix(new char[] {'a','A'}, true, NON_FUNCTIONS, null);
assertEquals(1, bindings.length);
bindings= fIndex.findBindingsForPrefix(new char[] {'a','A'}, false, NON_FUNCTIONS, null);
assertEquals(2, bindings.length);
} finally {
fIndex.releaseReadLock();
}
}
// class a { class b { class c { void f(); }; }; };
public void testFilterFindBindingsFQCharArray() throws Exception {
waitForIndexer();
String content= getContentsForTest(1)[0];
IFile file= TestSourceReader.createFile(fCProject.getProject(), "testFilterFindBindingsFQCharArray.cpp", content);
TestSourceReader.waitUntilFileIsIndexed(fIndex, file, INDEXER_TIMEOUT_SEC * 1000);
fIndex.acquireReadLock();
try {
final IndexFilter NON_CLASS = new IndexFilter() {
@Override
public boolean acceptBinding(IBinding binding) {
return !(binding instanceof ICPPClassType);
}
};
IBinding[] bindings= fIndex.findBindings(new char[][]{{'a'},{'b'},{'c'},{'f'}}, NON_CLASS, npm());
assertEquals(1, bindings.length);
} finally {
fIndex.releaseReadLock();
}
}
// typedef struct {
// float fNumber;
// int iIdx;
// } StructA_T;
// #include "../__bugsTest__/common.h"
// StructA_T gvar1;
// #include "../__bugsTest__/common.h"
// StructA_T gvar2;
public void testFileInMultipleFragments_bug192352() throws Exception {
String[] contents= getContentsForTest(3);
ICProject p2 = CProjectHelper.createCCProject("__bugsTest_2_", "bin", IPDOMManager.ID_FAST_INDEXER);
try {
IFile f1= TestSourceReader.createFile(fCProject.getProject(), "common.h", contents[0]);
IFile f2= TestSourceReader.createFile(fCProject.getProject(), "src.cpp", contents[1]);
IFile f3= TestSourceReader.createFile(p2.getProject(), "src.cpp", contents[2]);
waitForIndexer();
IIndex index= CCorePlugin.getIndexManager().getIndex(new ICProject[]{fCProject, p2});
index.acquireReadLock();
try {
IIndexBinding[] bindings= index.findBindings("StructA_T".toCharArray(), IndexFilter.ALL, npm());
assertEquals(1, bindings.length);
IIndexBinding binding= bindings[0];
IIndexName[] names= index.findReferences(binding);
assertEquals(2, names.length);
names= index.findDeclarations(binding);
assertEquals(1, names.length);
} finally {
index.releaseReadLock();
}
} finally {
CProjectHelper.delete(p2);
}
}
// #ifndef _h1
// #define _h1
// #define M v
// #endif
// #ifndef _h1
// #include "header1.h" // is inactive, but must be resolved
// #endif
// #include "header1.h"
// #include "header2.h"
// #include "header2.h"
// int M;
// #include "header2.h"
// #ifndef _h1
// #include "header1.h" // inactive but resolved.
// #endif
public void testIncludeGuardsOutsideOfHeader_Bug167100() throws Exception {
final IIndexManager indexManager = CCorePlugin.getIndexManager();
String[] contents= getContentsForTest(5);
IFile f1= TestSourceReader.createFile(fCProject.getProject(), "header1.h", contents[0]);
IFile f2= TestSourceReader.createFile(fCProject.getProject(), "header2.h", contents[1]);
IFile f3= TestSourceReader.createFile(fCProject.getProject(), "src.cpp", contents[2]);
indexManager.reindex(fCProject);
waitForIndexer();
IFile f4= TestSourceReader.createFile(fCProject.getProject(), "src2.cpp", contents[3]);
IFile f5= TestSourceReader.createFile(fCProject.getProject(), "src3.cpp", contents[4]);
waitForIndexer();
IIndex index= indexManager.getIndex(fCProject);
index.acquireReadLock();
try {
IIndexBinding[] bindings = index.findBindings("v".toCharArray(), IndexFilter.ALL, npm());
assertEquals(1, bindings.length);
IIndexBinding binding = bindings[0];
assertTrue(binding instanceof IVariable);
IIndexName[] names = index.findNames(binding, IIndex.FIND_ALL_OCCURRENCES);
assertEquals(1, names.length);
assertEquals(f4.getFullPath().toString(), names[0].getFile().getLocation().getFullPath());
IIndexFile[] idxFiles= index.getFiles(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(f5));
assertEquals(1, idxFiles.length);
IIndexFile idxFile= idxFiles[0];
IIndexInclude[] includes= idxFile.getIncludes();
assertEquals(2, includes.length);
assertTrue(includes[0].isActive());
assertTrue(includes[0].isResolved());
assertFalse(includes[1].isActive());
// includes[1].isResolved()); May or may not be resolved.
} finally {
index.releaseReadLock();
}
}
// #define MAC(...) Bug200239
// #include "header.h"
// int MAC(1);
// void func() {
// MAC()= MAC(1) + MAC(1,2);
// }
public void testVariadicMacros_Bug200239_1() throws Exception {
String[] contents= getContentsForTest(2);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
IFile f1= TestSourceReader.createFile(fCProject.getProject(), "header.h", contents[0]);
waitUntilFileIsIndexed(f1, INDEXER_TIMEOUT_SEC * 1000);
IFile f2= TestSourceReader.createFile(fCProject.getProject(), "src.cpp", contents[1]);
waitForIndexer();
fIndex.acquireReadLock();
try {
IIndexBinding[] bindings= fIndex.findBindings("Bug200239".toCharArray(), IndexFilter.ALL, npm());
assertEquals(1, bindings.length);
IIndexName[] refs= fIndex.findReferences(bindings[0]);
assertEquals(3, refs.length);
} finally {
fIndex.releaseReadLock();
}
}
// #define GMAC(x...) Bug200239
// #include "header.h"
// int GMAC(1);
// void func() {
// GMAC()= GMAC(1) + GMAC(1,2);
// }
public void testVariadicMacros_Bug200239_2() throws Exception {
String[] contents= getContentsForTest(2);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
IFile f1= TestSourceReader.createFile(fCProject.getProject(), "header.h", contents[0]);
waitUntilFileIsIndexed(f1, INDEXER_TIMEOUT_SEC * 1000);
IFile f2= TestSourceReader.createFile(fCProject.getProject(), "src.cpp", contents[1]);
waitForIndexer();
fIndex.acquireReadLock();
try {
IIndexBinding[] bindings= fIndex.findBindings("Bug200239".toCharArray(), IndexFilter.ALL, npm());
assertEquals(1, bindings.length);
IIndexName[] refs= fIndex.findReferences(bindings[0]);
assertEquals(3, refs.length);
} finally {
fIndex.releaseReadLock();
}
}
// typedef bug200553_A bug200553_B;
// typedef bug200553_B bug200553_A;
public void testTypedefRecursionCpp_Bug200553() throws Exception {
String[] contents= getContentsForTest(1);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
IFile f1= TestSourceReader.createFile(fCProject.getProject(), "src.cpp", contents[0]);
waitForIndexer();
fIndex.acquireReadLock();
try {
IIndexBinding[] bindings= fIndex.findBindings("bug200553_A".toCharArray(), IndexFilter.ALL, npm());
assertEquals(1, bindings.length);
assertTrue(bindings[0] instanceof ITypedef);
checkTypedefDepth((ITypedef) bindings[0]);
bindings= fIndex.findBindings("bug200553_B".toCharArray(), IndexFilter.ALL, npm());
assertEquals(1, bindings.length);
assertTrue(bindings[0] instanceof ITypedef);
checkTypedefDepth((ITypedef) bindings[0]);
} finally {
fIndex.releaseReadLock();
}
indexManager.update(new ICElement[] {fCProject}, IIndexManager.UPDATE_ALL);
waitForIndexer();
fIndex.acquireReadLock();
try {
IIndexBinding[] bindings= fIndex.findBindings("bug200553_A".toCharArray(), IndexFilter.ALL, npm());
assertEquals(1, bindings.length);
assertTrue(bindings[0] instanceof ITypedef);
checkTypedefDepth((ITypedef) bindings[0]);
bindings= fIndex.findBindings("bug200553_B".toCharArray(), IndexFilter.ALL, npm());
assertEquals(1, bindings.length);
assertTrue(bindings[0] instanceof ITypedef);
checkTypedefDepth((ITypedef) bindings[0]);
} finally {
fIndex.releaseReadLock();
}
}
private void checkTypedefDepth(ITypedef td) throws DOMException {
int maxDepth= 20;
IType type= td;
while (--maxDepth > 0 && type instanceof ITypedef) {
type= ((ITypedef) type).getType();
}
assertTrue(maxDepth > 0);
}
// typedef bug200553_A bug200553_B;
// typedef bug200553_B bug200553_A;
public void testTypedefRecursionC_Bug200553() throws Exception {
String[] contents= getContentsForTest(1);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
IFile f1= TestSourceReader.createFile(fCProject.getProject(), "src.c", contents[0]);
waitForIndexer();
fIndex.acquireReadLock();
try {
IIndexBinding[] bindings= fIndex.findBindings("bug200553_A".toCharArray(), IndexFilter.ALL, npm());
assertEquals(1, bindings.length);
assertTrue(bindings[0] instanceof ITypedef);
checkTypedefDepth((ITypedef) bindings[0]);
bindings= fIndex.findBindings("bug200553_B".toCharArray(), IndexFilter.ALL, npm());
assertEquals(1, bindings.length);
assertTrue(bindings[0] instanceof ITypedef);
checkTypedefDepth((ITypedef) bindings[0]);
} finally {
fIndex.releaseReadLock();
}
indexManager.update(new ICElement[] {fCProject}, IIndexManager.UPDATE_ALL);
waitForIndexer();
fIndex.acquireReadLock();
try {
IIndexBinding[] bindings= fIndex.findBindings("bug200553_A".toCharArray(), IndexFilter.ALL, npm());
assertEquals(1, bindings.length);
assertTrue(bindings[0] instanceof ITypedef);
checkTypedefDepth((ITypedef) bindings[0]);
bindings= fIndex.findBindings("bug200553_B".toCharArray(), IndexFilter.ALL, npm());
assertEquals(1, bindings.length);
assertTrue(bindings[0] instanceof ITypedef);
checkTypedefDepth((ITypedef) bindings[0]);
} finally {
fIndex.releaseReadLock();
}
}
// #ifndef GUARD
// #include "source.cpp"
// #endif
public void testIncludeSource_Bug199412() throws Exception {
String[] contents= getContentsForTest(1);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
IFile f1= TestSourceReader.createFile(fCProject.getProject(), "source.cpp", contents[0]);
waitForIndexer();
final ITranslationUnit tu= (ITranslationUnit) fCProject.findElement(new Path("source.cpp"));
Thread th= new Thread() {
@Override
public void run() {
try {
tu.getAST(fIndex, ITranslationUnit.AST_CONFIGURE_USING_SOURCE_CONTEXT);
} catch (CoreException e) {
CCorePlugin.log(e);
}
}
};
fIndex.acquireReadLock();
try {
th.start();
th.join(5000);
assertFalse(th.isAlive());
} finally {
try {
th.stop();
} finally {
fIndex.releaseReadLock();
}
}
}
// void func_209049(long long x);
public void testGPPTypes_Bug209049() throws Exception {
String[] contents= getContentsForTest(1);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
IFile f1= TestSourceReader.createFile(fCProject.getProject(), "source.cpp", contents[0]);
waitForIndexer();
fIndex.acquireReadLock();
try {
IIndexBinding[] bindings = fIndex.findBindings("func_209049".toCharArray(),
IndexFilter.ALL, npm());
IFunctionType ft = ((IFunction) bindings[0]).getType();
assertEquals("void (long long int)", ASTTypeUtil.getType(ft));
} finally {
fIndex.releaseReadLock();
}
}
// static inline void staticInHeader() {};
// #include "header.h"
// void f1() {
// staticInHeader();
// }
public void testStaticFunctionsInHeader_Bug180305() throws Exception {
String[] contents= getContentsForTest(2);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
TestSourceReader.createFile(fCProject.getProject(), "header.h", contents[0]);
TestSourceReader.createFile(fCProject.getProject(), "source1.cpp", contents[1]);
TestSourceReader.createFile(fCProject.getProject(), "source2.cpp", contents[1]);
indexManager.reindex(fCProject);
waitForIndexer();
fIndex.acquireReadLock();
try {
IIndexBinding[] bindings = fIndex.findBindings("staticInHeader".toCharArray(),
IndexFilter.ALL, npm());
IFunction func = (IFunction) bindings[0];
assertTrue(func.isStatic());
IIndexName[] refs = fIndex.findReferences(func);
assertEquals(2, refs.length);
} finally {
fIndex.releaseReadLock();
}
}
// static const int staticConstInHeader= 12;
// #include "header.h"
// void f1() {
// int a= staticConstInHeader;
// }
public void testStaticVariableInHeader_Bug180305() throws Exception {
String[] contents= getContentsForTest(2);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
TestSourceReader.createFile(fCProject.getProject(), "header.h", contents[0]);
TestSourceReader.createFile(fCProject.getProject(), "source1.cpp", contents[1]);
TestSourceReader.createFile(fCProject.getProject(), "source2.cpp", contents[1]);
indexManager.reindex(fCProject);
waitForIndexer();
fIndex.acquireReadLock();
try {
IIndexBinding[] bindings = fIndex.findBindings("staticConstInHeader".toCharArray(),
IndexFilter.ALL, npm());
IVariable var = (IVariable) bindings[0];
assertTrue(var.isStatic());
IIndexName[] refs = fIndex.findReferences(var);
assertEquals(2, refs.length);
} finally {
fIndex.releaseReadLock();
}
}
// static inline void staticInHeader() {};
// #include "header.h"
// void f1() {
// staticInHeader();
// }
public void testStaticFunctionsInHeaderC_Bug180305() throws Exception {
String[] contents= getContentsForTest(2);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
TestSourceReader.createFile(fCProject.getProject(), "header.h", contents[0]);
TestSourceReader.createFile(fCProject.getProject(), "source1.c", contents[1]);
TestSourceReader.createFile(fCProject.getProject(), "source2.c", contents[1]);
indexManager.reindex(fCProject);
waitForIndexer();
fIndex.acquireReadLock();
try {
IIndexBinding[] bindings = fIndex.findBindings("staticInHeader".toCharArray(),
IndexFilter.C_DECLARED_OR_IMPLICIT, npm());
IFunction func = (IFunction) bindings[0];
assertTrue(func.isStatic());
IIndexName[] refs = fIndex.findReferences(func);
assertEquals(2, refs.length);
} finally {
fIndex.releaseReadLock();
}
}
// static const int staticConstInHeader= 12;
// #include "header.h"
// void f1() {
// int a= staticConstInHeader;
// }
public void testStaticVariableInHeaderC_Bug180305() throws Exception {
String[] contents= getContentsForTest(2);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
TestSourceReader.createFile(fCProject.getProject(), "header.h", contents[0]);
TestSourceReader.createFile(fCProject.getProject(), "source1.c", contents[1]);
TestSourceReader.createFile(fCProject.getProject(), "source2.c", contents[1]);
indexManager.reindex(fCProject);
waitForIndexer();
fIndex.acquireReadLock();
try {
IIndexBinding[] bindings = fIndex.findBindings("staticConstInHeader".toCharArray(),
IndexFilter.C_DECLARED_OR_IMPLICIT, npm());
IVariable var = (IVariable) bindings[0];
assertTrue(var.isStatic());
IIndexName[] refs = fIndex.findReferences(var);
assertEquals(2, refs.length);
} finally {
fIndex.releaseReadLock();
}
}
// int ok;
// #include "header.x"
public void testNonStandardSuffix_Bug205778() throws Exception {
String[] contents= getContentsForTest(2);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
TestSourceReader.createFile(fCProject.getProject(), "header.x", contents[0]);
TestSourceReader.createFile(fCProject.getProject(), "source.cpp", contents[1]);
indexManager.reindex(fCProject);
waitForIndexer();
fIndex.acquireReadLock();
try {
IIndexBinding[] bindings = fIndex.findBindings("ok".toCharArray(), IndexFilter.ALL, npm());
assertEquals(1, bindings.length);
} finally {
fIndex.releaseReadLock();
}
}
// inline void MyClass::method() {}
// class MyClass {
// void method();
// };
// #include "MyClass_inline.h"
// #include "MyClass.h"
public void testAddingMemberBeforeContainer_Bug203170() throws Exception {
String[] contents= getContentsForTest(3);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
TestSourceReader.createFile(fCProject.getProject(), "MyClass_inline.h", contents[0]);
TestSourceReader.createFile(fCProject.getProject(), "MyClass.h", contents[1]);
TestSourceReader.createFile(fCProject.getProject(), "MyClass.cpp", contents[2]);
indexManager.reindex(fCProject);
waitForIndexer();
fIndex.acquireReadLock();
try {
IIndexBinding[] bindings = fIndex.findBindings(new char[][] { "MyClass".toCharArray(),
"method".toCharArray() }, IndexFilter.ALL, npm());
assertEquals(1, bindings.length);
IIndexName[] decls = fIndex.findDeclarations(bindings[0]);
assertEquals(2, decls.length);
} finally {
fIndex.releaseReadLock();
}
}
// typedef int unrelated;
// class unrelated {
// public: int b;
// };
// #include "h1.h"
// void test() {
// unrelated a;
// a.b;
// }
public void testUnrelatedTypedef_Bug214146() throws Exception {
String[] contents= getContentsForTest(3);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
TestSourceReader.createFile(fCProject.getProject(), "s1.cpp", contents[0]);
TestSourceReader.createFile(fCProject.getProject(), "h1.h", contents[1]);
TestSourceReader.createFile(fCProject.getProject(), "s2.h", contents[2]);
indexManager.reindex(fCProject);
waitForIndexer();
fIndex.acquireReadLock();
try {
IIndexBinding[] bindings = fIndex.findBindings(new char[][] { "unrelated".toCharArray(),
"b".toCharArray() }, IndexFilter.ALL, npm());
assertEquals(1, bindings.length);
IIndexName[] decls = fIndex.findNames(bindings[0], IIndex.FIND_ALL_OCCURRENCES);
assertEquals(2, decls.length);
} finally {
fIndex.releaseReadLock();
}
}
// #undef BBB
// #define BBB
// #include "header.h"
// #ifdef BBB
// int bug227088;
// #else
// int ok;
// #endif
public void testUndefInHeader_Bug227088() throws Exception {
String[] contents= getContentsForTest(2);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
TestSourceReader.createFile(fCProject.getProject(), "header.h", contents[0]);
TestSourceReader.createFile(fCProject.getProject(), "s1.cpp", contents[1]);
TestSourceReader.createFile(fCProject.getProject(), "s2.cpp", contents[1]);
indexManager.reindex(fCProject);
waitForIndexer();
fIndex.acquireReadLock();
try {
IIndexBinding[] bindings = fIndex.findBindings("bug227088".toCharArray(), IndexFilter.ALL, npm());
assertEquals(0, bindings.length);
bindings = fIndex.findBindings("ok".toCharArray(), IndexFilter.ALL, npm());
assertEquals(1, bindings.length);
IIndexName[] decls = fIndex.findNames(bindings[0], IIndex.FIND_ALL_OCCURRENCES);
assertEquals(2, decls.length);
} finally {
fIndex.releaseReadLock();
}
}
// #define BUG ok
// int BUG;
// #include "common.h"
// #include "header.h"
public void testCommonHeader_Bug228012() throws Exception {
String[] contents= getContentsForTest(3);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
TestSourceReader.createFile(fCProject.getProject(), "common.h", contents[0]);
IFile hfile= TestSourceReader.createFile(fCProject.getProject(), "header.h", contents[1]);
TestSourceReader.createFile(fCProject.getProject(), "source.cpp", contents[2]);
indexManager.reindex(fCProject);
waitForIndexer();
ITranslationUnit tu= (ITranslationUnit) CoreModel.getDefault().create(hfile);
fIndex.acquireReadLock();
try {
IASTTranslationUnit ast= tu.getAST(fIndex, ITranslationUnit.AST_CONFIGURE_USING_SOURCE_CONTEXT | ITranslationUnit.AST_SKIP_INDEXED_HEADERS);
IASTSimpleDeclaration decl= (IASTSimpleDeclaration) ast.getDeclarations()[0];
assertEquals("ok", decl.getDeclarators()[0].getName().toString());
} finally {
fIndex.releaseReadLock();
}
}
// #include "h2.h"
// int BUG;
// #define BUG ok
// #include "h1.h"
public void testIndirectContext_Bug267907() throws Exception {
String[] contents= getContentsForTest(3);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
TestSourceReader.createFile(fCProject.getProject(), "h1.h", contents[0]);
IFile hfile= TestSourceReader.createFile(fCProject.getProject(), "h2.h", contents[1]);
TestSourceReader.createFile(fCProject.getProject(), "source.cpp", contents[2]);
indexManager.reindex(fCProject);
waitForIndexer();
ITranslationUnit tu= (ITranslationUnit) CoreModel.getDefault().create(hfile);
fIndex.acquireReadLock();
try {
IASTTranslationUnit ast= tu.getAST(fIndex, ITranslationUnit.AST_CONFIGURE_USING_SOURCE_CONTEXT | ITranslationUnit.AST_SKIP_INDEXED_HEADERS);
IASTSimpleDeclaration decl= (IASTSimpleDeclaration) ast.getDeclarations()[0];
assertEquals("ok", decl.getDeclarators()[0].getName().toString());
} finally {
fIndex.releaseReadLock();
}
}
// #include <header.h>
// #define _CONCAT(x,y) x##y
// #define CONCAT(x,y) _CONCAT(x,y)
public void testIncludeHeuristics_Bug213562() throws Exception {
String contents= getContentsForTest(1)[0];
final IIndexManager indexManager = CCorePlugin.getIndexManager();
TestSourceReader.createFile(fCProject.getProject(), "f1/g/header.h", "#define ID one\n");
TestSourceReader.createFile(fCProject.getProject(), "f2/header.h", "#define ID two\n");
TestSourceReader.createFile(fCProject.getProject(), "f1/g/h/header.h", "#define ID three\n");
TestSourceReader.createFile(fCProject.getProject(), "f1/g/source.cpp", contents + "int CONCAT(one, ID);\n");
TestSourceReader.createFile(fCProject.getProject(), "f2/g/source.cpp", contents + "int CONCAT(two, ID);\n");
TestSourceReader.createFile(fCProject.getProject(), "f1/g/h/source.cpp", contents + "int CONCAT(three, ID);\n");
waitForIndexer();
fIndex.acquireReadLock();
try {
IIndexBinding[] bindings= fIndex.findBindings("oneone".toCharArray(), IndexFilter.ALL_DECLARED, new NullProgressMonitor());
assertEquals(1, bindings.length);
bindings= fIndex.findBindings("twotwo".toCharArray(), IndexFilter.ALL_DECLARED, new NullProgressMonitor());
assertEquals(1, bindings.length);
bindings= fIndex.findBindings("threethree".toCharArray(), IndexFilter.ALL_DECLARED, new NullProgressMonitor());
assertEquals(1, bindings.length);
} finally {
fIndex.releaseReadLock();
}
}
public void testIncludeHeuristicsFlag_Bug213562() throws Exception {
final IIndexManager indexManager = CCorePlugin.getIndexManager();
TestSourceReader.createFile(fCProject.getProject(), "f1/header.h", "");
IFile f1= TestSourceReader.createFile(fCProject.getProject(), "source1.cpp", "#include \"header.h\"\n");
IFile f2= TestSourceReader.createFile(fCProject.getProject(), "source2.cpp", "#include \"f1/header.h\"\n");
indexManager.reindex(fCProject);
waitForIndexer();
fIndex.acquireReadLock();
try {
IIndexFile f= getIndexFile(f1);
IIndexInclude i= f.getIncludes()[0];
assertTrue(i.isResolvedByHeuristics());
f= getIndexFile(f2);
i= f.getIncludes()[0];
assertFalse(i.isResolvedByHeuristics());
} finally {
fIndex.releaseReadLock();
}
}
// #include "dir"
// #include "header.h"
public void testInclusionOfFolders_Bug243682() throws Exception {
String contents= getContentsForTest(1)[0];
final IIndexManager indexManager = CCorePlugin.getIndexManager();
IFile sol= TestSourceReader.createFile(fCProject.getProject(), "f1/header.h", "");
TestSourceReader.createFile(fCProject.getProject(), "dir/dummy.h", "");
TestSourceReader.createFile(fCProject.getProject(), "header.h/dummy.h", "");
IFile f1= TestSourceReader.createFile(fCProject.getProject(), "source1.cpp", contents);
indexManager.reindex(fCProject);
waitForIndexer();
fIndex.acquireReadLock();
try {
IIndexFile f= getIndexFile(f1);
IIndexInclude[] is= f.getIncludes();
assertFalse(is[0].isResolved());
assertTrue(is[1].isResolvedByHeuristics());
assertEquals(sol.getFullPath().toString(), is[1].getIncludesLocation().getFullPath());
} finally {
fIndex.releaseReadLock();
}
}
// #ifndef B_H
// #include "b.h"
// #endif
//
// #ifndef A_H_
// #define A_H_
// int aOK;
// #endif /* A_H_ */
// #ifndef B_H_
// #define B_H_
// #ifndef A_H_
// #include "a.h"
// #endif
//
// int bOK;
// #endif
// #include "a.h"
public void testStrangeIncludeStrategy_Bug249884() throws Exception {
String[] contents= getContentsForTest(3);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
IFile ah= TestSourceReader.createFile(fCProject.getProject(), "a.h", contents[0]);
TestSourceReader.createFile(fCProject.getProject(), "b.h", contents[1]);
TestSourceReader.createFile(fCProject.getProject(), "source.cpp", contents[2]);
indexManager.reindex(fCProject);
waitForIndexer();
ITranslationUnit tu= (ITranslationUnit) CoreModel.getDefault().create(ah);
fIndex.acquireReadLock();
try {
IIndexBinding[] bindings= fIndex.findBindings("aOK".toCharArray(), IndexFilter.ALL_DECLARED, new NullProgressMonitor());
assertEquals(1, bindings.length);
fIndex.findBindings("bOK".toCharArray(), IndexFilter.ALL_DECLARED, new NullProgressMonitor());
assertEquals(1, bindings.length);
IASTTranslationUnit ast= tu.getAST(fIndex, ITranslationUnit.AST_CONFIGURE_USING_SOURCE_CONTEXT | ITranslationUnit.AST_SKIP_INDEXED_HEADERS);
final IASTDeclaration[] decls = ast.getDeclarations();
assertEquals(1, decls.length);
IASTSimpleDeclaration decl= (IASTSimpleDeclaration) decls[0];
assertEquals("aOK", decl.getDeclarators()[0].getName().toString());
} finally {
fIndex.releaseReadLock();
}
}
// struct s {int a;};
// struct s x[]= {{.a=1,},{.a=2}};
public void testReferencesInDesignators_Bug253690() throws Exception {
String code= getContentsForTest(1)[0];
final IIndexManager indexManager = CCorePlugin.getIndexManager();
IFile file= TestSourceReader.createFile(fCProject.getProject(), "test.c", code);
waitUntilFileIsIndexed(file, 4000);
fIndex.acquireReadLock();
try {
IIndexBinding[] bindings = fIndex.findBindings("a".toCharArray(), false, IndexFilter.ALL_DECLARED, npm());
assertEquals(1, bindings.length);
IIndexName[] refs = fIndex.findNames(bindings[0], IIndex.FIND_REFERENCES);
assertEquals(2, refs.length);
} finally {
fIndex.releaseReadLock();
}
}
// namespace ns {
// template<typename T> class X {};
// }
// class Y : public ns::X<int> {
// };
public void testInstanceInheritance_258745() throws Exception {
String code= getContentsForTest(1)[0];
final IIndexManager indexManager = CCorePlugin.getIndexManager();
IFile file= TestSourceReader.createFile(fCProject.getProject(), "test.cpp", code);
waitUntilFileIsIndexed(file, 4000);
fIndex.acquireReadLock();
try {
IIndexBinding[] bindings = fIndex.findBindings("Y".toCharArray(), false, IndexFilter.ALL_DECLARED, npm());
assertEquals(1, bindings.length);
ICPPClassType ct= (ICPPClassType) bindings[0];
final ICPPBase[] bases = ct.getBases();
assertEquals(1, bases.length);
IBinding inst = bases[0].getBaseClass();
assertTrue(inst instanceof ICPPTemplateInstance);
} finally {
fIndex.releaseReadLock();
}
}
// #include "B.cpp"
// static int STATIC;
// void ref() {STATIC=1;}
public void testStaticVarInSourceIncluded_Bug265821() throws Exception {
String[] contents= getContentsForTest(2);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
IFile a= TestSourceReader.createFile(fCProject.getProject(), "A.cpp", contents[0]);
IFile b= TestSourceReader.createFile(fCProject.getProject(), "B.cpp", contents[1]);
indexManager.reindex(fCProject);
waitForIndexer();
ITranslationUnit tu= (ITranslationUnit) CoreModel.getDefault().create(b);
fIndex.acquireReadLock();
try {
IASTTranslationUnit ast= tu.getAST(fIndex, ITranslationUnit.AST_CONFIGURE_USING_SOURCE_CONTEXT | ITranslationUnit.AST_SKIP_INDEXED_HEADERS);
IBinding var= ((IASTSimpleDeclaration) ast.getDeclarations()[0]).getDeclarators()[0].getName().resolveBinding();
IIndexBinding adapted = fIndex.adaptBinding(var);
assertNotNull(adapted);
} finally {
fIndex.releaseReadLock();
}
}
// int a;
// #include "a.h"
// void test() {a=0;}
public void testDeclarationForBinding_Bug254844() throws Exception {
String[] contents= getContentsForTest(2);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
IFile a= TestSourceReader.createFile(fCProject.getProject(), "a.h", contents[0]);
IFile b= TestSourceReader.createFile(fCProject.getProject(), "b.h", contents[0]);
IFile source= TestSourceReader.createFile(fCProject.getProject(), "source.cpp", contents[1]);
indexManager.reindex(fCProject);
waitForIndexer();
ITranslationUnit tu= (ITranslationUnit) CoreModel.getDefault().create(source);
fIndex.acquireReadLock();
try {
IASTTranslationUnit ast= tu.getAST(fIndex, ITranslationUnit.AST_SKIP_INDEXED_HEADERS);
IIndexFileSet fileset= ast.getIndexFileSet();
IBinding var= getBindingFromASTName(ast, contents[1], "a=", 1, IBinding.class);
IName[] decls= ast.getDeclarations(var);
assertEquals(2, decls.length);
int check= 0;
for (IName name : decls) {
assert name instanceof IIndexName;
IIndexName iName= (IIndexName) name;
if (iName.getFileLocation().getFileName().endsWith("a.h")) {
check |= 1;
assertTrue(fileset.contains(iName.getFile()));
} else {
check |= 2;
assertFalse(fileset.contains(iName.getFile()));
}
}
assertEquals(3, check);
} finally {
fIndex.releaseReadLock();
}
}
// // a.h
// namespace ns {
// struct A {
// int i;
// };
// }
// #include "a.h"
// using ns::A;
// void test() {
// A a;
// a.i = 0;
// a.j = 0;
// }
// // b.h
// struct A {
// int j;
// };
// #include "b.h"
// void test() {
// A a;
// a.i = 0;
// a.j = 0;
// }
public void testDisambiguationByReachability_268704_1() throws Exception {
waitForIndexer();
String[] testData = getContentsForTest(4);
TestSourceReader.createFile(fCProject.getProject(), "a.h", testData[0]);
IFile a = TestSourceReader.createFile(fCProject.getProject(), "a.cpp", testData[1]);
TestSourceReader.createFile(fCProject.getProject(), "b.h", testData[2]);
IFile b = TestSourceReader.createFile(fCProject.getProject(), "b.cpp", testData[3]);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
indexManager.reindex(fCProject);
waitForIndexer();
IIndex index= indexManager.getIndex(fCProject);
index.acquireReadLock();
try {
BindingAssertionHelper aHelper = new BindingAssertionHelper(a, testData[1], index);
aHelper.assertNonProblem("A a;", 1, ICPPClassType.class);
aHelper.assertNonProblem("i = 0;", 1, ICPPVariable.class);
aHelper.assertProblem("j = 0;", 1);
BindingAssertionHelper bHelper = new BindingAssertionHelper(b, testData[3], index);
aHelper.assertNonProblem("A a;", 1, ICPPClassType.class);
bHelper.assertProblem("i = 0;", 1);
bHelper.assertNonProblem("j = 0;", 1, ICPPVariable.class);
} finally {
index.releaseReadLock();
}
}
// // a.h
// namespace ns {
// enum E1 { e = 1 };
// }
// #include "a.h"
// using namespace ns;
// int i = e;
// // b.h
// enum E2 { e = 2 };
// #include "b.h"
// int i = e;
public void testDisambiguationByReachability_268704_2() throws Exception {
waitForIndexer();
String[] testData = getContentsForTest(4);
TestSourceReader.createFile(fCProject.getProject(), "a.h", testData[0]);
IFile a = TestSourceReader.createFile(fCProject.getProject(), "a.cpp", testData[1]);
TestSourceReader.createFile(fCProject.getProject(), "b.h", testData[2]);
IFile b = TestSourceReader.createFile(fCProject.getProject(), "b.cpp", testData[3]);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
indexManager.reindex(fCProject);
waitForIndexer();
IIndex index= indexManager.getIndex(fCProject);
index.acquireReadLock();
try {
BindingAssertionHelper aHelper = new BindingAssertionHelper(a, testData[1], index);
IEnumerator e1 = aHelper.assertNonProblem("e;", 1, IEnumerator.class);
assertEquals(1, e1.getValue().numberValue().longValue());
BindingAssertionHelper bHelper = new BindingAssertionHelper(b, testData[3], index);
IEnumerator e2 = bHelper.assertNonProblem("e;", 1, IEnumerator.class);
assertEquals(2, e2.getValue().numberValue().longValue());
} finally {
index.releaseReadLock();
}
}
// // a.h
// int xx;
// #include "a.h"
// int yy= xx;
// // b.h
// int xx();
// #include "b.h"
// void test() {
// xx();
// }
public void testDisambiguationByReachability_268704_3() throws Exception {
String[] testData = getContentsForTest(4);
TestSourceReader.createFile(fCProject.getProject(), "a.h", testData[0]);
IFile a = TestSourceReader.createFile(fCProject.getProject(), "a.cpp", testData[1]);
TestSourceReader.createFile(fCProject.getProject(), "b.h", testData[2]);
IFile b = TestSourceReader.createFile(fCProject.getProject(), "b.cpp", testData[3]);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
indexManager.reindex(fCProject);
waitForIndexer();
IIndex index= indexManager.getIndex(fCProject);
index.acquireReadLock();
try {
BindingAssertionHelper aHelper = new BindingAssertionHelper(a, testData[1], index);
IVariable b1 = aHelper.assertNonProblem("xx;", 2, IVariable.class);
BindingAssertionHelper bHelper = new BindingAssertionHelper(b, testData[3], index);
IFunction f = bHelper.assertNonProblem("xx();", 2, IFunction.class);
} finally {
index.releaseReadLock();
}
}
// // header.h
// template<class T>
// struct A {
// void m(const T& p);
// };
// #include "header.h"
// namespace {
// enum E { e1 };
// }
//
// void test() {
// A<E> a;
// a.m(e1);
// }
// enum E { e2 };
public void testDisambiguationByReachability_281782() throws Exception {
waitForIndexer();
String[] testData = getContentsForTest(3);
TestSourceReader.createFile(fCProject.getProject(), "header.h", testData[0]);
IFile test= TestSourceReader.createFile(fCProject.getProject(), "test.cpp", testData[1]);
TestSourceReader.createFile(fCProject.getProject(), "unrelated.cpp", testData[2]);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
indexManager.reindex(fCProject);
waitForIndexer();
IIndex index= indexManager.getIndex(fCProject);
index.acquireReadLock();
try {
IASTTranslationUnit ast = TestSourceReader.createIndexBasedAST(index, fCProject, test);
getBindingFromASTName(ast, testData[1], "m(e1)", 1, ICPPMethod.class);
} finally {
index.releaseReadLock();
}
}
// // header.h
// namespace ns2 { class A {}; }
// #include "header.h"
// namespace ns1 {
// class B : public ns2::A {};
// }
// namespace ns1 {
// namespace ns2 {
// typedef int A;
// }
// }
public void testNamespaceReachability_319632() throws Exception {
waitForIndexer();
String[] testData = getContentsForTest(3);
TestSourceReader.createFile(fCProject.getProject(), "header.h", testData[0]);
IFile test= TestSourceReader.createFile(fCProject.getProject(), "test.cpp", testData[1]);
TestSourceReader.createFile(fCProject.getProject(), "unrelated.cpp", testData[2]);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
indexManager.reindex(fCProject);
waitForIndexer();
IIndex index= indexManager.getIndex(fCProject);
index.acquireReadLock();
try {
BindingAssertionHelper helper = new BindingAssertionHelper(test, testData[1], index);
helper.assertNonProblem("A", 1, ICPPClassType.class);
} finally {
index.releaseReadLock();
}
}
// // a.h
// #undef AAA
// // b.h
// #include "a.h"
// #define AAA
// // source.c
// #include "b.h"
// #ifdef AAA
// int ok;
// #endif
public void testPreprocessingStatementOrder_270806_1() throws Exception {
waitForIndexer();
String[] testData = getContentsForTest(3);
TestSourceReader.createFile(fCProject.getProject(), "a.h", testData[0]);
TestSourceReader.createFile(fCProject.getProject(), "b.h", testData[1]);
IFile s= TestSourceReader.createFile(fCProject.getProject(), "s1.c", testData[2]);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
indexManager.reindex(fCProject);
waitForIndexer();
IIndex index= indexManager.getIndex(fCProject);
index.acquireReadLock();
try {
IASTTranslationUnit tu = TestSourceReader.createIndexBasedAST(index, fCProject, s);
IASTPreprocessorStatement[] pstmts= tu.getAllPreprocessorStatements();
IASTPreprocessorStatement ifndef= pstmts[1];
assertInstance(ifndef, IASTPreprocessorIfdefStatement.class);
assertTrue(((IASTPreprocessorIfdefStatement) ifndef).taken());
} finally {
index.releaseReadLock();
}
}
// // a.h
// #undef AAA
// // b.h
// #define AAA
// #include "a.h"
// // source.c
// #include "b.h"
// #ifdef AAA
// int bug;
// #endif
public void testPreprocessingStatementOrder_270806_2() throws Exception {
waitForIndexer();
String[] testData = getContentsForTest(3);
TestSourceReader.createFile(fCProject.getProject(), "a.h", testData[0]);
TestSourceReader.createFile(fCProject.getProject(), "b.h", testData[1]);
IFile s= TestSourceReader.createFile(fCProject.getProject(), "s1.c", testData[2]);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
indexManager.reindex(fCProject);
waitForIndexer();
IIndex index= indexManager.getIndex(fCProject);
index.acquireReadLock();
try {
IASTTranslationUnit tu = TestSourceReader.createIndexBasedAST(index, fCProject, s);
IASTPreprocessorStatement[] pstmts= tu.getAllPreprocessorStatements();
IASTPreprocessorStatement ifndef= pstmts[1];
assertInstance(ifndef, IASTPreprocessorIfdefStatement.class);
assertFalse(((IASTPreprocessorIfdefStatement) ifndef).taken());
} finally {
index.releaseReadLock();
}
}
// namespace X {}
// namespace Y {}
// #define AAA
// #define BBB
// #include "inc.h"
// #include <inc.h>
// using namespace X;
// using namespace Y;
public void testPreprocessingStatementOrder_270806_3() throws Exception {
waitForIndexer();
String[] testData = getContentsForTest(1);
IFile f= TestSourceReader.createFile(fCProject.getProject(), "a.cpp", testData[0]);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
waitUntilFileIsIndexed(f, 4000);
IIndex index= indexManager.getIndex(fCProject);
index.acquireReadLock();
try {
IIndexFile file= getIndexFile(index, f);
// check order of includes
IIndexInclude[] incs = file.getIncludes();
assertEquals(2, incs.length);
assertFalse(incs[0].isSystemInclude());
assertTrue(incs[1].isSystemInclude());
// check order of macros
IIndexMacro[] macros = file.getMacros();
assertEquals(2, macros.length);
assertEquals("AAA", macros[0].getName());
assertEquals("BBB", macros[1].getName());
// check order of using directives
ICPPUsingDirective[] uds = file.getUsingDirectives();
assertEquals(2, uds.length);
assertEquals("X", new String(uds[0].getNominatedScope().getScopeName().getSimpleID()));
assertEquals("Y", new String(uds[1].getNominatedScope().getScopeName().getSimpleID()));
assertTrue(uds[0].getPointOfDeclaration() < uds[1].getPointOfDeclaration());
} finally {
index.releaseReadLock();
}
}
// template<typename T> void f(T t) throw (T) {}
public void testFunctionTemplateWithThrowsException_293021() throws Exception {
waitForIndexer();
String testData = getContentsForTest(1)[0].toString();
IFile f= TestSourceReader.createFile(fCProject.getProject(), "testFunctionTemplateWithThrowsException_293021.cpp", testData);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
waitUntilFileIsIndexed(f, 4000);
IIndex index= indexManager.getIndex(fCProject);
index.acquireReadLock();
try {
IIndexFile file= getIndexFile(index, f);
int idx= testData.indexOf("f(");
IIndexName[] names = file.findNames(idx, idx+1);
assertEquals(1, names.length);
ICPPFunctionTemplate ft= (ICPPFunctionTemplate) index.findBinding(names[0]);
final IType[] espec = ft.getExceptionSpecification();
ICPPTemplateParameter par= (ICPPTemplateParameter) espec[0];
assertEquals(ft, par.getOwner());
} finally {
index.releaseReadLock();
}
}
// // a.h
// class P {};
// // b.h
// namespace P {class C {};}
// // source1.cpp
// #include "a.h"
// P p;
// // source2.cpp
// #include "b.h"
// P::C c;
public void testDisambiguateClassVsNamespace_297686() throws Exception {
waitForIndexer();
String[] testData = getContentsForTest(4);
TestSourceReader.createFile(fCProject.getProject(), "a.h", testData[0]);
TestSourceReader.createFile(fCProject.getProject(), "b.h", testData[1]);
IFile s1= TestSourceReader.createFile(fCProject.getProject(), "s1.cpp", testData[2]);
IFile s2= TestSourceReader.createFile(fCProject.getProject(), "s2.cpp", testData[3]);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
indexManager.reindex(fCProject);
waitForIndexer();
IIndex index= indexManager.getIndex(fCProject);
index.acquireReadLock();
try {
IASTTranslationUnit tu = TestSourceReader.createIndexBasedAST(index, fCProject, s1);
IASTSimpleDeclaration sdecl= (IASTSimpleDeclaration) tu.getDeclarations()[0];
IVariable var= (IVariable) sdecl.getDeclarators()[0].getName().resolveBinding();
assertFalse(var.getType() instanceof IProblemBinding);
assertTrue(var.getType() instanceof ICPPClassType);
tu = TestSourceReader.createIndexBasedAST(index, fCProject, s2);
sdecl= (IASTSimpleDeclaration) tu.getDeclarations()[0];
var= (IVariable) sdecl.getDeclarators()[0].getName().resolveBinding();
assertFalse(var.getType() instanceof IProblemBinding);
assertTrue(var.getType() instanceof ICPPClassType);
} finally {
index.releaseReadLock();
}
}
// // a.h
// struct Error{};
// // b.h
// void Error(int errCode) {}
// // source1.cpp
// #include "a.h"
// Error d;
// // source2.cpp
// Error d; // Problem, without inclusion we need to prefer the function.
public void testDisambiguateObjectVsType_304479() throws Exception {
waitForIndexer();
String[] testData = getContentsForTest(4);
TestSourceReader.createFile(fCProject.getProject(), "a.h", testData[0]);
TestSourceReader.createFile(fCProject.getProject(), "b.h", testData[1]);
IFile s1= TestSourceReader.createFile(fCProject.getProject(), "s1.cpp", testData[2]);
IFile s2= TestSourceReader.createFile(fCProject.getProject(), "s2.cpp", testData[3]);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
indexManager.reindex(fCProject);
waitForIndexer();
IIndex index= indexManager.getIndex(fCProject);
index.acquireReadLock();
try {
IASTTranslationUnit tu = TestSourceReader.createIndexBasedAST(index, fCProject, s1);
IASTSimpleDeclaration sdecl= (IASTSimpleDeclaration) tu.getDeclarations()[0];
IVariable var= (IVariable) sdecl.getDeclarators()[0].getName().resolveBinding();
assertFalse(var.getType() instanceof IProblemBinding);
assertTrue(var.getType() instanceof ICPPClassType);
tu = TestSourceReader.createIndexBasedAST(index, fCProject, s2);
sdecl= (IASTSimpleDeclaration) tu.getDeclarations()[0];
var= (IVariable) sdecl.getDeclarators()[0].getName().resolveBinding();
assertTrue(var.getType() instanceof ISemanticProblem);
} finally {
index.releaseReadLock();
}
}
public void testUpdateNonSrcFolderHeader_283080() throws Exception {
IIndexBinding[] r;
final IProject prj = fCProject.getProject();
final IFolder src= prj.getFolder("src");
final IFolder h= prj.getFolder("h");
src.create(true, false, null);
h.create(true, false, null);
assertTrue(src.exists());
assertTrue(h.exists());
ICProjectDescription desc= CCorePlugin.getDefault().getProjectDescription(prj);
assertNotNull(desc);
desc.getActiveConfiguration().setSourceEntries(new ICSourceEntry[] {
new CSourceEntry(src, new IPath[0], ICSettingEntry.SOURCE_PATH)
});
CCorePlugin.getDefault().setProjectDescription(prj, desc);
TestSourceReader.createFile(h, "a.h", "int version1;");
waitForIndexer(fCProject);
final IIndex index= CCorePlugin.getIndexManager().getIndex(fCProject);
index.acquireReadLock();
try {
r = index.findBindings("version1".toCharArray(), IndexFilter.ALL_DECLARED, null);
assertEquals(0, r.length);
} finally {
index.releaseReadLock();
}
IFile s= TestSourceReader.createFile(h, "a.h", "int version2;");
waitForIndexer(fCProject);
index.acquireReadLock();
try {
r = index.findBindings("version2".toCharArray(), IndexFilter.ALL_DECLARED, null);
assertEquals(0, r.length);
} finally {
index.releaseReadLock();
}
s= TestSourceReader.createFile(src, "source.cpp", "#include \"../h/a.h\"");
waitUntilFileIsIndexed(s, INDEXER_TIMEOUT_SEC * 1000);
index.acquireReadLock();
try {
r = index.findBindings("version2".toCharArray(), IndexFilter.ALL_DECLARED, null);
assertEquals(1, r.length);
} finally {
index.releaseReadLock();
}
s= TestSourceReader.createFile(h, "a.h", "int version3;");
waitUntilFileIsIndexed(s, INDEXER_TIMEOUT_SEC * 1000);
index.acquireReadLock();
try {
r = index.findBindings("version2".toCharArray(), IndexFilter.ALL_DECLARED, null);
assertEquals(0, r.length);
r = index.findBindings("version3".toCharArray(), IndexFilter.ALL_DECLARED, null);
assertEquals(1, r.length);
} finally {
index.releaseReadLock();
}
}
public void testUpdateForContentTypeChange_283080() throws Exception {
IIndexBinding[] r;
final IProject prj = fCProject.getProject();
IFile file= TestSourceReader.createFile(prj, "a.cpp", "// \u0110 \n int a;");
file.setCharset("US-ASCII", new NullProgressMonitor());
waitForIndexer(fCProject);
final IIndex index= CCorePlugin.getIndexManager().getIndex(fCProject);
int offset1= 0;
index.acquireReadLock();
try {
r = index.findBindings("a".toCharArray(), IndexFilter.ALL_DECLARED, null);
assertEquals(1, r.length);
IIndexName[] defs = index.findDefinitions(r[0]);
assertEquals(1, defs.length);
offset1= defs[0].getNodeOffset();
} finally {
index.releaseReadLock();
}
file.setCharset("UTF-8", new NullProgressMonitor());
waitForIndexer(fCProject);
int offset2= 0;
index.acquireReadLock();
try {
r = index.findBindings("a".toCharArray(), IndexFilter.ALL_DECLARED, null);
assertEquals(1, r.length);
IIndexName[] defs = index.findDefinitions(r[0]);
assertEquals(1, defs.length);
offset1= defs[0].getNodeOffset();
} finally {
index.releaseReadLock();
}
assertTrue(offset1 != offset2);
}
public void testUpdateOnFolderRemove_343538() throws Exception {
IIndexBinding[] r;
final IProject prj = fCProject.getProject();
final IFolder root= prj.getFolder("root");
root.create(true, false, null);
assertTrue(root.exists());
IFolder child1 = root.getFolder("child1");
child1.create(true, false, null);
assertTrue(child1.exists());
IFolder child2 = root.getFolder("child2");
child2.create(true, false, null);
assertTrue(child2.exists());
TestSourceReader.createFile(child1, "a.c", "void bug343538() {}");
TestSourceReader.createFile(child2, "b.c", "void bug343538();");
waitForIndexer(fCProject);
final IIndex index= CCorePlugin.getIndexManager().getIndex(fCProject);
index.acquireReadLock();
try {
r = index.findBindings("bug343538".toCharArray(), IndexFilter.ALL, null);
assertEquals(1, r.length);
IIndexName[] names = index.findNames(r[0], IIndex.FIND_DECLARATIONS_DEFINITIONS);
assertEquals(2, names.length);
} finally {
index.releaseReadLock();
}
// Collect files and folders
final Set<IFile> files = new HashSet<IFile>();
final Set<IFolder> folders = new HashSet<IFolder>();
folders.add(root);
root.accept(new IResourceVisitor() {
@Override
public boolean visit(final IResource resource) throws CoreException {
if (resource instanceof IFile) {
files.add((IFile) resource);
} else if (resource instanceof IFolder) {
folders.add((IFolder) resource);
}
return true;
}
});
Job job = new WorkspaceJob("Delete folder") {
@Override
public IStatus runInWorkspace(final IProgressMonitor monitor) throws CoreException {
IWorkspace ws = ResourcesPlugin.getWorkspace();
ws.delete(files.toArray(new IResource[files.size()]), IResource.FORCE, null);
ws.delete(folders.toArray(new IResource[folders.size()]), IResource.FORCE, null);
return Status.OK_STATUS;
}
};
job.schedule();
job.join();
Thread.sleep(100);
waitForIndexer(fCProject);
index.acquireReadLock();
try {
r = index.findBindings("bug343538".toCharArray(), IndexFilter.ALL, null);
if (r.length == 1) {
IIndexName[] names = index.findNames(r[0], IIndex.FIND_DECLARATIONS_DEFINITIONS);
assertEquals(0, names.length);
} else {
assertEquals(0, r.length);
}
} finally {
index.releaseReadLock();
}
}
// // context.c
// #define A B
// #include "b.h" // file name is important to reproduce the issue
// #include "a.h" // file name is important to reproduce the issue
// // a.h and b.h
// int A;
public void testUpdatingHeaderInContext_367315() throws Exception {
String[] contents= getContentsForTest(2);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
TestSourceReader.createFile(fCProject.getProject(), "context.c", contents[0]);
IFile ah= TestSourceReader.createFile(fCProject.getProject(), "a.h", contents[1]);
IFile bh= TestSourceReader.createFile(fCProject.getProject(), "b.h", contents[1]);
indexManager.reindex(fCProject);
waitForIndexer();
fIndex.acquireReadLock();
try {
IIndexBinding[] vars = fIndex.findBindings("B".toCharArray(), IndexFilter.ALL_DECLARED, new NullProgressMonitor());
assertEquals(1, vars.length);
assertEquals(2, fIndex.findDefinitions(vars[0]).length);
} finally {
fIndex.releaseReadLock();
}
final CoreModel coreModel = CCorePlugin.getDefault().getCoreModel();
ICElement[] selection = new ICElement[] {coreModel.create(ah), coreModel.create(bh)};
indexManager.update(selection, IIndexManager.UPDATE_ALL);
waitForIndexer();
fIndex.acquireReadLock();
try {
IIndexBinding[] vars = fIndex.findBindings("B".toCharArray(), IndexFilter.ALL_DECLARED, new NullProgressMonitor());
assertEquals(1, vars.length);
assertEquals(2, fIndex.findDefinitions(vars[0]).length);
} finally {
fIndex.releaseReadLock();
}
}
// // test.cpp
// #include "a.h"
// using ns::INT;
// // a.h
// #include "b.h"
// // b.h
// namespace ns { typedef int INT; }
public void testUpdateUnresolvedIncludes_378317() throws Exception {
// Turn off indexing of unused headers.
IndexerPreferences.set(fCProject.getProject(), IndexerPreferences.KEY_INDEX_UNUSED_HEADERS_WITH_DEFAULT_LANG, "false");
// Turn off automatic index update.
IndexerPreferences.setUpdatePolicy(fCProject.getProject(), IndexerPreferences.UPDATE_POLICY_MANUAL);
try {
String[] contents= getContentsForTest(3);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
TestSourceReader.createFile(fCProject.getProject(), "test.c", contents[0]);
IFile ah= TestSourceReader.createFile(fCProject.getProject(), "a.h", contents[1]);
// b.h is not created yet, so #include "b.h" in a.h is unresolved.
indexManager.reindex(fCProject);
waitForIndexer();
fIndex.acquireReadLock();
try {
IIndexFile[] files = fIndex.getFilesWithUnresolvedIncludes();
assertEquals(1, files.length);
assertEquals(IndexLocationFactory.getWorkspaceIFL(ah), files[0].getLocation());
} finally {
fIndex.releaseReadLock();
}
IFile bh= TestSourceReader.createFile(fCProject.getProject(), "b.h", contents[2]);
indexManager.update(new ICElement[] { fCProject }, IIndexManager.UPDATE_UNRESOLVED_INCLUDES);
waitForIndexer();
fIndex.acquireReadLock();
try {
IIndexFile[] files = fIndex.getFilesWithUnresolvedIncludes();
assertEquals(0, files.length);
IIndexFileLocation location = IndexLocationFactory.getWorkspaceIFL(bh);
files = fIndex.getFiles(IndexLocationFactory.getWorkspaceIFL(bh));
assertEquals(1, files.length);
} finally {
fIndex.releaseReadLock();
}
} finally {
// Restore default indexer preferences.
Properties defaults = IndexerPreferences.getDefaultIndexerProperties();
IndexerPreferences.set(fCProject.getProject(), IndexerPreferences.KEY_INDEX_UNUSED_HEADERS_WITH_DEFAULT_LANG,
defaults.getProperty(IndexerPreferences.KEY_INDEX_UNUSED_HEADERS_WITH_DEFAULT_LANG));
IndexerPreferences.setUpdatePolicy(fCProject.getProject(), IndexerPreferences.getDefaultUpdatePolicy());
}
}
// extern int h1;
// extern int h2;
// #include "../p1/h1.hh"
// #include "h2.hh"
// static int i = h1;
public void test429196StackOverflow() throws Exception {
// Bug429196: StackOverflow when creating a PDOMBinding in the following case: 2550
// 1) The variable is file-local 2551
// 2) The TU's indexFileSet has more than one fragment 2552
IIndex index = null;
boolean locked = false;
String[] contents = getContentsForTest(3);
ICProject p1 = CProjectHelper.createCCProject("p1", "bin", IPDOMManager.ID_FAST_INDEXER);
try {
IProjectDescription desc = fCProject.getProject().getDescription();
desc.setReferencedProjects(new IProject[] { p1.getProject() });
fCProject.getProject().setDescription(desc, npm());
// make sure the header is read from the other pdom when the ast is created
IFile head1 = TestSourceReader.createFile(p1.getProject(), "h1.hh", contents[0]);
CCorePlugin.getIndexManager().reindex(p1);
waitForIndexer(p1);
IFile head2 = TestSourceReader.createFile(fCProject.getProject(), "h2.hh", contents[1]);
IFile impl2 = TestSourceReader.createFile(fCProject.getProject(), "file.cc", contents[2]);
CCorePlugin.getIndexManager().reindex(fCProject);
waitForIndexer(fCProject);
index = CCorePlugin.getIndexManager().getIndex(new ICProject[] { p1, fCProject });
ITranslationUnit tu = (ITranslationUnit) CoreModel.getDefault().create(impl2);
assertNotNull(tu);
index.acquireReadLock();
locked = true;
IASTTranslationUnit ast = tu.getAST(
index,
ITranslationUnit.AST_SKIP_ALL_HEADERS
| ITranslationUnit.AST_CONFIGURE_USING_SOURCE_CONTEXT
| ITranslationUnit.AST_SKIP_TRIVIAL_EXPRESSIONS_IN_AGGREGATE_INITIALIZERS
| ITranslationUnit.AST_PARSE_INACTIVE_CODE);
assertNotNull(ast);
IASTDeclaration[] decls = ast.getDeclarations();
assertNotNull(decls);
assertEquals(1, decls.length);
assertTrue(decls[0] instanceof IASTSimpleDeclaration);
IASTDeclarator[] decltors = ((IASTSimpleDeclaration)decls[0]).getDeclarators();
assertNotNull(decltors);
assertEquals(1, decltors.length);
IASTName name = decltors[0].getName();
assertNotNull(name);
assertEquals("i", name.getRawSignature());
IBinding var = name.resolveBinding();
assertNotNull(var);
IIndexBinding adapted = null;
try {
adapted = index.adaptBinding(var);
} catch (StackOverflowError e) {
fail();
}
assertNotNull(adapted);
} finally {
if (index != null && locked)
index.releaseReadLock();
if (p1 != null)
CProjectHelper.delete(p1);
}
}
}