1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 22:52:11 +02:00

Fix and Testcase for 197311, Full Indexer with dependent project corrupts index.

This commit is contained in:
Markus Schorn 2007-07-24 09:16:15 +00:00
parent 79b3fc77bb
commit 208e4f68ef
4 changed files with 101 additions and 20 deletions

View file

@ -750,7 +750,6 @@ public class IndexBugsTests extends BaseTestCase {
// StructA_T gvar2;
public void testFileInMultipleFragments_bug192352() throws Exception {
StringBuffer[] contents= getContentsForTest(3);
ICProject p2 = CProjectHelper.createCCProject("__bugsTest_2_", "bin", IPDOMManager.ID_FAST_INDEXER);
try {
@ -833,4 +832,65 @@ public class IndexBugsTests extends BaseTestCase {
index.releaseReadLock();
}
}
// int globalVar;
// #include "../__bugsTest__/common.h"
// void func() {
// globalVar++;
// }
public void testDependentProjectsWithFullIndexer_Bug197311() throws Exception {
StringBuffer[] contents= getContentsForTest(2);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
indexManager.setIndexerId(fCProject, IPDOMManager.ID_FULL_INDEXER);
ICProject p2 = CProjectHelper.createCCProject("bug197311", "bin", IPDOMManager.ID_FULL_INDEXER);
IProject[] refs = new IProject[] {fCProject.getProject()};
IProjectDescription pd = p2.getProject().getDescription();
pd.setReferencedProjects(refs);
p2.getProject().setDescription(pd, new NullProgressMonitor());
try {
IFile f1= TestSourceReader.createFile(fCProject.getProject(), "common.h", contents[0].toString());
IFile f2= TestSourceReader.createFile(fCProject.getProject(), "src.cpp", contents[1].toString());
IFile f3= TestSourceReader.createFile(p2.getProject(), "src.cpp", contents[1].toString());
waitForIndexer();
IIndex index= indexManager.getIndex(p2, IIndexManager.ADD_DEPENDENCIES);
index.acquireReadLock();
try {
IIndexBinding[] bindings= index.findBindings("globalVar".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();
}
indexManager.reindex(p2);
waitForIndexer();
index= indexManager.getIndex(p2, IIndexManager.ADD_DEPENDENCIES);
index.acquireReadLock();
try {
IIndexBinding[] bindings= index.findBindings("globalVar".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);
}
}
}

View file

@ -34,6 +34,19 @@ public interface IWritableIndex extends IIndex {
public IIndexFragmentFile fTargetFile;
public boolean fIsContext= false;
}
/**
* Checks whether the given file can be written to in this index.
*/
boolean isWritableFile(IIndexFragmentFile file);
/**
* Clears the given file in the index.
* @param file a file to clear.
* @param a collection that receives IndexFileLocation objects for files that
* had the cleared file as a context. May be <code>null</code>.
*/
void clearFile(IIndexFragmentFile file, Collection clearedContexts) throws CoreException;
/**
* Creates a file object for the given location or returns an existing one.
@ -52,14 +65,6 @@ public interface IWritableIndex extends IIndex {
*/
void clear() throws CoreException;
/**
* Clears the given file in the index.
* @param file a file to clear.
* @param a collection that receives IndexFileLocation objects for files that
* had the cleared file as a context. May be <code>null</code>.
*/
void clearFile(IIndexFragmentFile file, Collection clearedContexts) throws CoreException;
/**
* Acquires a write lock, while giving up a certain amount of read locks.
*/

View file

@ -61,15 +61,18 @@ public class WritableCIndex extends CIndex implements IWritableIndex {
IASTPreprocessorMacroDefinition[] macros, IASTName[][] names) throws CoreException {
IIndexFragment indexFragment = file.getIndexFragment();
assert isWritableFragment(indexFragment);
for (int i = 0; i < includes.length; i++) {
IncludeInformation ii= includes[i];
if (ii.fLocation != null) {
ii.fTargetFile= addFile(ii.fLocation);
}
if (!isWritableFragment(indexFragment)) {
assert false : "Attempt to update file of read-only fragment"; //$NON-NLS-1$
}
else {
for (int i = 0; i < includes.length; i++) {
IncludeInformation ii= includes[i];
if (ii.fLocation != null) {
ii.fTargetFile= addFile(ii.fLocation);
}
}
((IWritableIndexFragment) indexFragment).addFileContent(file, includes, macros, names);
}
((IWritableIndexFragment) indexFragment).addFileContent(file, includes, macros, names);
}
public void clear() throws CoreException {
@ -79,11 +82,18 @@ public class WritableCIndex extends CIndex implements IWritableIndex {
}
}
public boolean isWritableFile(IIndexFragmentFile file) {
return isWritableFragment(file.getIndexFragment());
}
public void clearFile(IIndexFragmentFile file, Collection clearedContexts) throws CoreException {
IIndexFragment indexFragment = file.getIndexFragment();
assert isWritableFragment(indexFragment);
((IWritableIndexFragment) indexFragment).clearFile(file, clearedContexts);
if (!isWritableFragment(indexFragment)) {
assert false : "Attempt to clear file of read-only fragment"; //$NON-NLS-1$
}
else {
((IWritableIndexFragment) indexFragment).clearFile(file, clearedContexts);
}
}

View file

@ -33,6 +33,7 @@ import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.ParserUtil;
import org.eclipse.cdt.internal.core.dom.SavedCodeReaderFactory;
import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
import org.eclipse.cdt.internal.core.index.IWritableIndex;
import org.eclipse.cdt.internal.core.index.IWritableIndexManager;
import org.eclipse.cdt.internal.core.pdom.indexer.PDOMIndexerTask;
@ -173,6 +174,11 @@ class PDOMFullIndexerTask extends PDOMIndexerTask {
Object required= filePathsToParse.get(location);
if (required == null) {
required= MISSING;
// bug 197311, don't attempt to update files in fragments of other projects.
IIndexFragmentFile file= (IIndexFragmentFile) fIndex.getFile(location);
if (file != null && !fIndex.isWritableFile(file)) {
required= SKIP;
}
filePathsToParse.put(location, required);
}
else if (confighash != 0 && required == REQUIRED_IF_CONFIG_CHANGED) {