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

Headers included from c- and c++-files (bug 191989).

This commit is contained in:
Markus Schorn 2007-12-07 10:33:34 +00:00
parent 643f6c20d3
commit 21b09a659c
75 changed files with 2155 additions and 2457 deletions

View file

@ -8,6 +8,7 @@
* Contributors:
* QNX Software Systems - Initial API and implementation
* Anton Leherbauer (Wind River Systems)
* Markus Schorn (Wind River Systems)
**********************************************************************/
package org.eclipse.cdt.managedbuilder.pdomdepgen;
@ -63,9 +64,9 @@ public class PDOMDependencyCalculator implements IManagedDependencyCalculator {
IIndex index = CCorePlugin.getIndexManager().getIndex(project, IIndexManager.ADD_DEPENDENCIES);
index.acquireReadLock();
try {
IIndexFile file = index.getFile(IndexLocationFactory.getWorkspaceIFL((IFile)resource));
if (file != null) {
IIndexInclude[] includes = index.findIncludes(file, IIndex.DEPTH_INFINITE);
IIndexFile[] files = index.getFiles(IndexLocationFactory.getWorkspaceIFL((IFile)resource));
if (files.length > 0) {
IIndexInclude[] includes = index.findIncludes(files[0], IIndex.DEPTH_INFINITE);
List/*<IPath>*/ list = new ArrayList/*<IPath>*/();
for (int i = 0; i < includes.length; ++i) {

View file

@ -25,7 +25,7 @@ import org.eclipse.cdt.core.parser.ParserMode;
import org.eclipse.cdt.core.parser.ScannerInfo;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
import org.eclipse.cdt.internal.core.pdom.indexer.nulli.PDOMNullIndexer;
import org.eclipse.cdt.internal.core.pdom.indexer.PDOMNullIndexer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.runtime.NullProgressMonitor;

View file

@ -80,11 +80,16 @@ public class EmptyIndexFragment implements IIndexFragment {
return 0;
}
public IIndexFragmentFile getFile(IIndexFileLocation location)
public IIndexFragmentFile getFile(int linkageID, IIndexFileLocation location)
throws CoreException {
return null;
}
public IIndexFragmentFile[] getFiles(IIndexFileLocation location) throws CoreException {
return new IIndexFragmentFile[0];
}
public long getLastWriteAccess() {
return 0;
}

View file

@ -304,7 +304,7 @@ public class IndexBugsTests extends BaseTestCase {
fIndex.acquireReadLock();
try {
IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(file));
IIndexFile ifile= fIndex.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(file));
assertNotNull(ifile);
IIndexInclude[] includes= ifile.getIncludes();
assertEquals(1, includes.length);
@ -329,7 +329,7 @@ public class IndexBugsTests extends BaseTestCase {
fIndex.acquireReadLock();
try {
IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(file));
IIndexFile ifile= fIndex.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(file));
assertNotNull(ifile);
IIndexInclude[] includes= ifile.getIncludes();
assertEquals(1, includes.length);
@ -355,7 +355,7 @@ public class IndexBugsTests extends BaseTestCase {
fIndex.acquireReadLock();
try {
IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(file));
IIndexFile ifile= fIndex.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(file));
assertNotNull(ifile);
IIndexInclude[] includes= ifile.getIncludes();
assertEquals(1, includes.length);
@ -381,7 +381,7 @@ public class IndexBugsTests extends BaseTestCase {
fIndex.acquireReadLock();
try {
IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(file));
IIndexFile ifile= fIndex.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(file));
assertNotNull(ifile);
IIndexInclude[] includes= ifile.getIncludes();
assertEquals(1, includes.length);
@ -412,7 +412,7 @@ public class IndexBugsTests extends BaseTestCase {
fIndex.acquireReadLock();
try {
IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(file));
IIndexFile ifile= fIndex.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(file));
assertNotNull(ifile);
IIndexMacro[] macros= ifile.getMacros();
assertEquals(2, macros.length);
@ -826,7 +826,7 @@ public class IndexBugsTests extends BaseTestCase {
assertEquals(1, names.length);
assertEquals(f4.getFullPath().toString(), names[0].getFile().getLocation().getFullPath());
IIndexFile idxFile= index.getFile(IndexLocationFactory.getWorkspaceIFL(f5));
IIndexFile idxFile= index.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(f5));
IIndexInclude[] includes= idxFile.getIncludes();
assertEquals(2, includes.length);
assertTrue(includes[0].isActive());

View file

@ -17,6 +17,7 @@ import java.util.regex.Pattern;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IVariable;
@ -134,7 +135,7 @@ public class IndexIncludeTest extends IndexTestBase {
TestSourceReader.waitUntilFileIsIndexed(fIndex, file, 4000);
fIndex.acquireReadLock();
try {
IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(file));
IIndexFile ifile= fIndex.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(file));
assertNotNull("Can't find " + file.getLocation(), ifile);
assertTrue("timestamp not ok", ifile.getTimestamp() >= timestamp);
@ -163,7 +164,7 @@ public class IndexIncludeTest extends IndexTestBase {
fIndex.acquireReadLock();
try {
IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(file));
IIndexFile ifile= fIndex.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(file));
assertNotNull(ifile);
IIndexInclude[] includes= ifile.getIncludes();
assertEquals(2, includes.length);
@ -188,7 +189,7 @@ public class IndexIncludeTest extends IndexTestBase {
fIndex.acquireReadLock();
try {
IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(file));
IIndexFile ifile= fIndex.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(file));
assertNotNull(ifile);
IIndexInclude[] includes= ifile.getIncludes();
assertEquals(1, includes.length);
@ -209,7 +210,7 @@ public class IndexIncludeTest extends IndexTestBase {
fIndex.acquireReadLock();
try {
IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(file));
IIndexFile ifile= fIndex.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(file));
assertNotNull(ifile);
IIndexInclude[] includes= ifile.getIncludes();
assertEquals(1, includes.length);
@ -231,7 +232,7 @@ public class IndexIncludeTest extends IndexTestBase {
fIndex.acquireReadLock();
try {
IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(file));
IIndexFile ifile= fIndex.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(file));
assertNotNull(ifile);
IIndexInclude[] includes= ifile.getIncludes();
assertEquals(1, includes.length);
@ -311,16 +312,17 @@ public class IndexIncludeTest extends IndexTestBase {
fIndex.acquireReadLock();
try {
IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(header));
IIndexFile ifile= fIndex.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(header));
assertNotNull(ifile);
IIndexInclude[] includes= fIndex.findIncludedBy(ifile);
assertEquals(2, includes.length);
assertEquals(s1.getFullPath().toString(), includes[0].getIncludedByLocation().getFullPath());
assertEquals(s2.getFullPath().toString(), includes[1].getIncludedByLocation().getFullPath());
IIndexInclude context= ifile.getParsedInContext();
assertNotNull(context);
assertEquals(s1.getFullPath().toString(), context.getIncludedByLocation().getFullPath());
assertEquals(s1.getFullPath().toString(), includes[0].getIncludedByLocation().getFullPath());
assertEquals(s2.getFullPath().toString(), includes[1].getIncludedByLocation().getFullPath());
}
finally {
fIndex.releaseReadLock();
@ -331,7 +333,7 @@ public class IndexIncludeTest extends IndexTestBase {
fIndex.acquireReadLock();
try {
assertEquals(1, fIndex.findBindings("a20070426".toCharArray(), IndexFilter.ALL_DECLARED, NPM).length);
IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(header));
IIndexFile ifile= fIndex.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(header));
assertNotNull(ifile);
IIndexInclude[] includes= fIndex.findIncludedBy(ifile);
assertEquals(2, includes.length);
@ -350,7 +352,7 @@ public class IndexIncludeTest extends IndexTestBase {
fIndex.acquireReadLock();
try {
assertEquals(1, fIndex.findBindings("b20070426".toCharArray(), IndexFilter.ALL_DECLARED, NPM).length);
IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(header));
IIndexFile ifile= fIndex.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(header));
assertNotNull(ifile);
IIndexInclude[] includes= fIndex.findIncludedBy(ifile);
assertEquals(2, includes.length);
@ -435,8 +437,8 @@ public class IndexIncludeTest extends IndexTestBase {
try {
assertEquals(1, fIndex.findBindings(tag.toCharArray(), IndexFilter.ALL_DECLARED, NPM).length);
IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(header));
IIndexFile sfile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(s1));
IIndexFile ifile= fIndex.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(header));
IIndexFile sfile= fIndex.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(s1));
assertNotNull(ifile);
IIndexInclude[] includes= fIndex.findIncludedBy(ifile);
assertEquals(1, includes.length);
@ -477,8 +479,8 @@ public class IndexIncludeTest extends IndexTestBase {
try {
assertEquals(1, fIndex.findBindings(tag.toCharArray(), IndexFilter.ALL_DECLARED, NPM).length);
IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(header));
IIndexFile sfile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(s1));
IIndexFile ifile= fIndex.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(header));
IIndexFile sfile= fIndex.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(s1));
assertNotNull(ifile);
IIndexInclude[] includes= fIndex.findIncludedBy(ifile);
assertEquals(0, includes.length);
@ -509,8 +511,8 @@ public class IndexIncludeTest extends IndexTestBase {
try {
assertEquals(1, fIndex.findBindings(tag.toCharArray(), IndexFilter.ALL_DECLARED, NPM).length);
IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(header));
IIndexFile sfile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(s1));
IIndexFile ifile= fIndex.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(header));
IIndexFile sfile= fIndex.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(s1));
assertNotNull(ifile);
IIndexInclude[] includes= fIndex.findIncludedBy(ifile);
assertEquals(1, includes.length);
@ -545,8 +547,8 @@ public class IndexIncludeTest extends IndexTestBase {
try {
assertEquals(1, fIndex.findBindings(tag.toCharArray(), IndexFilter.ALL_DECLARED, NPM).length);
IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(header));
IIndexFile sfile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(s1));
IIndexFile ifile= fIndex.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(header));
IIndexFile sfile= fIndex.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(s1));
assertNotNull(ifile);
IIndexInclude[] includes= fIndex.findIncludedBy(ifile);
assertEquals(1, includes.length);

View file

@ -17,6 +17,7 @@ import java.util.regex.Pattern;
import junit.framework.AssertionFailedError;
import junit.framework.Test;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.IName;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IBinding;
@ -218,7 +219,7 @@ public class DefDeclTests extends PDOMTestBase {
String elName = "foo" + "08";
IIndexFileLocation ifl= IndexLocationFactory.getIFL((ITranslationUnit) cproject.findElement(new Path("func.c")));
IIndexFile file= pdom.getFile(ifl);
IIndexFile file= pdom.getFile(ILinkage.C_LINKAGE_ID, ifl);
int offset= TestSourceReader.indexOfInFile("foo08();", new Path(ifl.getFullPath()));
IIndexName[] names= file.findNames(offset, 5);
assertEquals(1, names.length);
@ -230,7 +231,7 @@ public class DefDeclTests extends PDOMTestBase {
// check the other file
ifl= IndexLocationFactory.getIFL((ITranslationUnit) cproject.findElement(new Path("second.c")));
file= pdom.getFile(ifl);
file= pdom.getFile(ILinkage.C_LINKAGE_ID, ifl);
offset= TestSourceReader.indexOfInFile("foo08();", new Path(ifl.getFullPath()));
names= file.findNames(offset, 5);
assertEquals(1, names.length);

View file

@ -15,6 +15,7 @@ import java.util.regex.Pattern;
import junit.framework.Test;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexBinding;
@ -69,7 +70,7 @@ public class FilesOnReindexTests extends PDOMTestBase {
void performAssertions(IFile file) throws CoreException {
IIndex index = CCorePlugin.getIndexManager().getIndex(project);
assertNotNull(index.getFile(IndexLocationFactory.getWorkspaceIFL(file)));
assertNotNull(index.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(file)));
IBinding[] bs = index.findBindings(Pattern.compile("C"), true, IndexFilter.ALL, new NullProgressMonitor());
assertEquals(1, bs.length);

View file

@ -13,6 +13,7 @@ package org.eclipse.cdt.internal.pdom.tests;
import junit.framework.Test;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexFile;
import org.eclipse.cdt.core.index.IIndexInclude;
@ -48,7 +49,7 @@ public class IncludesTests extends PDOMTestBase {
public void testIncludedBy() throws Exception {
IResource loc = project.getProject().findMember("I2.h");
IIndexFile file = index.getFile(IndexLocationFactory.getWorkspaceIFL((IFile)loc));
IIndexFile file = index.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL((IFile)loc));
assertNotNull(file);
IIndexInclude[] allIncludedBy = index.findIncludedBy(file, -1);
assertEquals(9, allIncludedBy.length); // i.e. all of them
@ -56,7 +57,7 @@ public class IncludesTests extends PDOMTestBase {
public void testIncludes() throws Exception {
IResource loc = project.getProject().findMember("I1.cpp");
IIndexFile file = index.getFile(IndexLocationFactory.getWorkspaceIFL((IFile)loc));
IIndexFile file = index.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL((IFile)loc));
assertNotNull(file);
IIndexInclude[] allIncludesTo= index.findIncludes(file, -1);
assertEquals(2, allIncludesTo.length); // i.e. I1.h, I2.h

View file

@ -27,6 +27,7 @@ import junit.framework.Assert;
import junit.framework.TestCase;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexFile;
@ -285,7 +286,11 @@ public class TestSourceReader {
Assert.assertTrue(CCorePlugin.getIndexManager().joinIndexer(timeLeft, new NullProgressMonitor()));
index.acquireReadLock();
try {
IIndexFile pfile= index.getFile(IndexLocationFactory.getWorkspaceIFL(file));
IIndexFile pfile= index.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(file));
if (pfile != null && pfile.getTimestamp() >= file.getLocalTimeStamp()) {
return;
}
pfile= index.getFile(ILinkage.C_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(file));
if (pfile != null && pfile.getTimestamp() >= file.getLocalTimeStamp()) {
return;
}

View file

@ -64,9 +64,6 @@ Export-Package: org.eclipse.cdt.core,
org.eclipse.cdt.internal.core.pdom.dom.cpp;x-internal:=true,
org.eclipse.cdt.internal.core.pdom.export,
org.eclipse.cdt.internal.core.pdom.indexer;x-friends:="org.eclipse.cdt.ui",
org.eclipse.cdt.internal.core.pdom.indexer.fast;x-internal:=true,
org.eclipse.cdt.internal.core.pdom.indexer.full;x-internal:=true,
org.eclipse.cdt.internal.core.pdom.indexer.nulli;x-internal:=true,
org.eclipse.cdt.internal.core.util;x-internal:=true,
org.eclipse.cdt.internal.errorparsers;x-internal:=true,
org.eclipse.cdt.internal.formatter;x-internal:=true,

View file

@ -14,6 +14,7 @@ import java.util.Set;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ICodeReaderFactory;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.ast.IASTCompletionNode;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
@ -151,4 +152,7 @@ public class AssemblyLanguage extends AbstractLanguage implements IAsmLanguage,
fId= CCorePlugin.PLUGIN_ID + '.' + config.getAttribute("id"); //$NON-NLS-1$
}
public int getLinkageID() {
return ILinkage.NO_LINKAGE_ID;
}
}

View file

@ -14,6 +14,7 @@
package org.eclipse.cdt.core.model;
import org.eclipse.cdt.core.dom.ICodeReaderFactory;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.ast.IASTCompletionNode;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
@ -25,7 +26,7 @@ import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
/**
* Models differences between languages. The interace is not supposed to be implemented directly.
* Models differences between languages. The interface is not supposed to be implemented directly.
* Rather than that clients may subclass {@link AbstractLanguage}.
* @author Doug Schaefer
*/
@ -34,34 +35,20 @@ public interface ILanguage extends IAdaptable {
//public static final QualifiedName KEY = new QualifiedName(CCorePlugin.PLUGIN_ID, "language"); //$NON-NLS-1$
public static final String KEY = "language"; //$NON-NLS-1$
/**
* @deprecated has no effect.
*/
public static final int AST_USE_INDEX = 1;
/**
* @deprecated use {@link ITranslationUnit#AST_SKIP_ALL_HEADERS}
*/
public static final int AST_SKIP_ALL_HEADERS = ITranslationUnit.AST_SKIP_ALL_HEADERS;
/**
* @deprecated use {@link ITranslationUnit#AST_SKIP_INDEXED_HEADERS}
*/
public static final int AST_SKIP_INDEXED_HEADERS = ITranslationUnit.AST_SKIP_INDEXED_HEADERS;
/**
* @deprecated use {@link ITranslationUnit#AST_SKIP_IF_NO_BUILD_INFO}
*/
public static final int AST_SKIP_IF_NO_BUILD_INFO = ITranslationUnit.AST_SKIP_IF_NO_BUILD_INFO;
/**
* Return the language id for this language.
* This is to differentiate languages from each other.
*
* @return language id
*/
public String getId();
/**
* Return the id of the linkage this language contributes to. This is especially important
* for languages that write to the index.
* @see ILinkage
* @since 5.0
*/
public int getLinkageID();
/**
* @return the human readable name corresponding to this language, suitable for display.
* @since 4.0

View file

@ -24,6 +24,7 @@ import java.util.Map;
import java.util.Set;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.language.ProjectLanguageConfiguration;
import org.eclipse.cdt.core.language.WorkspaceLanguageConfiguration;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
@ -195,7 +196,7 @@ public class LanguageManager {
return getLanguageForContentTypeID(contentTypeID);
}
private ILanguage getLanguageForContentTypeID(String contentTypeID) {
public ILanguage getLanguageForContentTypeID(String contentTypeID) {
cacheAllLanguages();
ILanguage language = (ILanguage)fContentTypeToLanguageCache.get(contentTypeID);

View file

@ -25,10 +25,12 @@ import java.util.Map;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ICodeReaderFactory;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.ast.IASTCompletionNode;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexFile;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.index.IIndexInclude;
import org.eclipse.cdt.core.index.IndexLocationFactory;
import org.eclipse.cdt.core.model.AbstractLanguage;
@ -60,6 +62,7 @@ import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.cdt.internal.core.dom.NullCodeReaderFactory;
import org.eclipse.cdt.internal.core.dom.SavedCodeReaderFactory;
import org.eclipse.cdt.internal.core.index.IndexBasedCodeReaderFactory;
import org.eclipse.cdt.internal.core.pdom.indexer.ProjectIndexerInputAdapter;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
@ -742,16 +745,6 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
}
public IASTTranslationUnit getAST(IIndex index, int style) throws CoreException {
ICodeReaderFactory codeReaderFactory;
if ((style & AST_SKIP_NONINDEXED_HEADERS) != 0) {
codeReaderFactory= NullCodeReaderFactory.getInstance();
} else {
codeReaderFactory= SavedCodeReaderFactory.getInstance();
}
if (index != null && (style & AST_SKIP_INDEXED_HEADERS) != 0) {
codeReaderFactory= new IndexBasedCodeReaderFactory(getCProject(), index, codeReaderFactory);
}
ITranslationUnit configureWith = getSourceContextTU(index, style);
IScannerInfo scanInfo= configureWith.getScannerInfo( (style & AST_SKIP_IF_NO_BUILD_INFO) == 0);
@ -766,6 +759,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
ILanguage language= configureWith.getLanguage();
fLanguageOfContext= language;
if (language != null) {
ICodeReaderFactory crf= getCodeReaderFactory(style, index, language.getLinkageID());
IASTTranslationUnit ast= null;
if (language instanceof AbstractLanguage) {
int options= 0;
@ -775,10 +769,10 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
if ((style & AST_CREATE_COMMENT_NODES) != 0) {
options |= AbstractLanguage.OPTION_ADD_COMMENTS;
}
ast= ((AbstractLanguage)language).getASTTranslationUnit(reader, scanInfo, codeReaderFactory, index, options, ParserUtil.getParserLogService());
ast= ((AbstractLanguage)language).getASTTranslationUnit(reader, scanInfo, crf, index, options, ParserUtil.getParserLogService());
}
else {
ast= language.getASTTranslationUnit(reader, scanInfo, codeReaderFactory, index, ParserUtil.getParserLogService());
ast= language.getASTTranslationUnit(reader, scanInfo, crf, index, ParserUtil.getParserLogService());
}
if (ast != null) {
ast.setIsHeaderUnit(isHeaderUnit());
@ -789,13 +783,31 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
return null;
}
private ICodeReaderFactory getCodeReaderFactory(int style, IIndex index, int linkageID) {
ICodeReaderFactory codeReaderFactory;
if ((style & AST_SKIP_NONINDEXED_HEADERS) != 0) {
codeReaderFactory= NullCodeReaderFactory.getInstance();
} else {
codeReaderFactory= SavedCodeReaderFactory.getInstance();
}
if (index != null && (style & AST_SKIP_INDEXED_HEADERS) != 0) {
IndexBasedCodeReaderFactory ibcf= new IndexBasedCodeReaderFactory(index, new ProjectIndexerInputAdapter(getCProject()), linkageID, codeReaderFactory);
codeReaderFactory= ibcf;
}
return codeReaderFactory;
}
private static int[] CTX_LINKAGES= {ILinkage.CPP_LINKAGE_ID, ILinkage.C_LINKAGE_ID};
private ITranslationUnit getSourceContextTU(IIndex index, int style) {
ITranslationUnit configureWith= this;
if (index != null && (style & AST_CONFIGURE_USING_SOURCE_CONTEXT) != 0) {
try {
fLanguageOfContext= null;
for (int i = 0; i < CTX_LINKAGES.length; i++) {
IIndexFile context= null;
IIndexFile indexFile= index.getFile(IndexLocationFactory.getIFL(this));
final IIndexFileLocation ifl = IndexLocationFactory.getIFL(this);
IIndexFile indexFile= index.getFile(CTX_LINKAGES[i], ifl);
if (indexFile != null) {
// bug 199412, when a source-file includes itself the context may recurse.
HashSet visited= new HashSet();
@ -809,7 +821,8 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
if (context != null) {
ITranslationUnit tu= CoreModelUtil.findTranslationUnitForLocation(context.getLocation(), getCProject());
if (tu != null && tu.isSourceUnit()) {
configureWith= tu;
return tu;
}
}
}
}
@ -817,7 +830,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
CCorePlugin.log(e);
}
}
return configureWith;
return this;
}
private IIndexFile getParsedInContext(IIndexFile indexFile)
@ -830,20 +843,6 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
}
public IASTCompletionNode getCompletionNode(IIndex index, int style, int offset) throws CoreException {
ICodeReaderFactory codeReaderFactory;
if (index != null && (style & (ITranslationUnit.AST_SKIP_INDEXED_HEADERS | ITranslationUnit.AST_SKIP_ALL_HEADERS)) != 0) {
ICodeReaderFactory fallbackFactory;
if ((style & ITranslationUnit.AST_SKIP_ALL_HEADERS) != 0) {
fallbackFactory= NullCodeReaderFactory.getInstance();
} else {
fallbackFactory= SavedCodeReaderFactory.getInstance();
}
codeReaderFactory= new IndexBasedCodeReaderFactory(getCProject(), index, fallbackFactory);
}
else {
codeReaderFactory = SavedCodeReaderFactory.getInstance();
}
ITranslationUnit configureWith= getSourceContextTU(index, style);
IScannerInfo scanInfo = configureWith.getScannerInfo( (style & ITranslationUnit.AST_SKIP_IF_NO_BUILD_INFO) == 0);
@ -857,7 +856,8 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
ILanguage language= configureWith.getLanguage();
fLanguageOfContext= language;
if (language != null) {
return language.getCompletionNode(reader, scanInfo, codeReaderFactory, index, ParserUtil.getParserLogService(), offset);
ICodeReaderFactory crf= getCodeReaderFactory(style, index, language.getLinkageID());
return language.getCompletionNode(reader, scanInfo, crf, index, ParserUtil.getParserLogService(), offset);
}
return null;
}

View file

@ -28,10 +28,12 @@ public interface ILinkage {
final static String FORTRAN_LINKAGE_NAME= "Fortran"; //$NON-NLS-1$
final static int NO_LINKAGE_ID= 0;
final static int C_LINKAGE_ID= 1;
final static int CPP_LINKAGE_ID= 2;
final static int CPP_LINKAGE_ID= 1;
final static int C_LINKAGE_ID= 2;
final static int FORTRAN_LINKAGE_ID= 3;
final static int MAX_LINKAGE_ID= FORTRAN_LINKAGE_ID;
/**
* Returns the name of the linkage.
*/

View file

@ -9,9 +9,6 @@
* QNX Software Systems - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
/**
*
*/
package org.eclipse.cdt.core.dom;
import org.eclipse.cdt.core.CCorePlugin;
@ -31,7 +28,7 @@ public interface IPDOMIndexerTask {
/**
* Called by the framework to perform the task.
*/
public void run(IProgressMonitor monitor);
public void run(IProgressMonitor monitor) throws InterruptedException;
/**
* Returns the indexer the task belongs to.

View file

@ -15,6 +15,7 @@
package org.eclipse.cdt.core.dom.ast.gnu.c;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.c.AbstractCLanguage;
import org.eclipse.cdt.core.dom.parser.c.GCCParserExtensionConfiguration;
@ -42,6 +43,10 @@ public class GCCLanguage extends AbstractCLanguage {
return ID;
}
public int getLinkageID() {
return ILinkage.C_LINKAGE_ID;
}
/*
* @see org.eclipse.cdt.core.dom.parser.c.AbstractCLanguage#getScannerExtensionConfiguration()
*/

View file

@ -14,6 +14,7 @@
package org.eclipse.cdt.core.dom.ast.gnu.cpp;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.cpp.AbstractCPPLanguage;
import org.eclipse.cdt.core.dom.parser.cpp.AbstractCPPParserExtensionConfiguration;
@ -40,6 +41,11 @@ public class GPPLanguage extends AbstractCPPLanguage {
return ID;
}
public int getLinkageID() {
return ILinkage.CPP_LINKAGE_ID;
}
/*
* @see org.eclipse.cdt.core.dom.parser.cpp.AbstractCPPLanguage#getScannerExtensionConfiguration()
*/

View file

@ -132,13 +132,21 @@ public interface IIndex {
public long getLastWriteAccess();
/**
* Looks for a file with the given location. Will return <code>null</code> if there
* is no entry in the index for the given location.
* Returns the file-object for the given location and linkage or returns
* <code>null</code> if the file was not indexed in this linkage.
* @param location an IIndexFileLocation representing the location of the file
* @return the file in the index or <code>null</code>
* @throws CoreException
*/
public IIndexFile getFile(IIndexFileLocation location) throws CoreException;
public IIndexFile getFile(int linkageID, IIndexFileLocation location) throws CoreException;
/**
* Returns the file-objects for the given location in any linkage.
* @param location an IIndexFileLocation representing the location of the file
* @return an array of file-objects.
* @throws CoreException
*/
public IIndexFile[] getFiles(IIndexFileLocation location) throws CoreException;
/**
* Looks for include relations originated by the given file.

View file

@ -30,6 +30,8 @@ import org.eclipse.core.runtime.CoreException;
* @since 4.0
*/
public interface IIndexFile {
IIndexFile[] EMPTY_FILE_ARRAY = {};
/**
* Returns an IIndexFileLocation representing the location of this file
* @return an IIndexFileLocation representing the location of this file
@ -59,9 +61,9 @@ public interface IIndexFile {
long getTimestamp() throws CoreException;
/**
* Returns the hashcode of the scanner configuration that was used to parse the file.
* <code>0</code> will be returned in case the hashcode is unknown.
* @return the hashcode of the scanner configuration or <code>0</code>.
* Returns the hash-code of the scanner configuration that was used to parse the file.
* <code>0</code> will be returned in case the hash-code is unknown.
* @return the hash-code of the scanner configuration or <code>0</code>.
* @throws CoreException
*/
int getScannerConfigurationHashcode() throws CoreException;
@ -76,4 +78,9 @@ public interface IIndexFile {
*/
IIndexInclude getParsedInContext() throws CoreException;
/**
* Returns the id of the linkage this file was parsed in.
* @since 5.0
*/
int getLinkageID() throws CoreException;
}

View file

@ -16,6 +16,7 @@ package org.eclipse.cdt.internal.core.index;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.BitSet;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@ -158,19 +159,34 @@ public class CIndex implements IIndex {
return findNames(binding, FIND_REFERENCES);
}
public IIndexFile getFile(IIndexFileLocation location) throws CoreException {
IIndexFile result= null, backup= null;
for (int i = 0; result==null && i < fPrimaryFragmentCount; i++) {
IIndexFragmentFile candidate= fFragments[i].getFile(location);
if(candidate!=null) {
if(candidate.hasNames()) {
result = candidate;
}
if(backup==null)
backup = candidate;
public IIndexFile getFile(int linkageID, IIndexFileLocation location) throws CoreException {
for (int i = 0; i < fPrimaryFragmentCount; i++) {
IIndexFragmentFile candidate= fFragments[i].getFile(linkageID, location);
if (candidate!=null && candidate.hasContent()) {
return candidate;
}
}
return result == null ? backup : result;
return null;
}
public IIndexFile[] getFiles(IIndexFileLocation location) throws CoreException {
ArrayList result= new ArrayList();
BitSet linkages= new BitSet();
for (int i = 0; i < fPrimaryFragmentCount; i++) {
IIndexFragmentFile[] candidates= fFragments[i].getFiles(location);
for (int j = 0; j < candidates.length; j++) {
IIndexFragmentFile candidate= candidates[j];
int linkage= candidate.getLinkageID();
if (!linkages.get(linkage) && candidate.hasContent()) {
result.add(candidate);
linkages.set(linkage);
}
}
}
if (result.isEmpty()) {
return IIndexFile.EMPTY_FILE_ARRAY;
}
return (IIndexFile[]) result.toArray(new IIndexFile[result.size()]);
}
public IIndexFile resolveInclude(IIndexInclude include) throws CoreException {
@ -179,11 +195,11 @@ public class CIndex implements IIndex {
}
IIndexFragmentInclude fragmentInclude = (IIndexFragmentInclude) include;
IIndexFragmentFile result= fragmentInclude.getIncludes();
if (result != null && result.hasNames()) {
if (result != null && result.hasContent()) {
return result;
}
return getFile(include.getIncludesLocation());
return getFile(include.getIncludedBy().getLinkageID(), include.getIncludesLocation());
}
public IIndexInclude[] findIncludedBy(IIndexFile file) throws CoreException {

View file

@ -50,10 +50,14 @@ final public class EmptyCIndex implements IIndex {
return IIndexFragmentName.EMPTY_NAME_ARRAY;
}
public IIndexFile getFile(IIndexFileLocation location) {
public IIndexFile getFile(int linkageID, IIndexFileLocation location) {
return null;
}
public IIndexFile[] getFiles(IIndexFileLocation location) {
return IIndexFile.EMPTY_FILE_ARRAY;
}
public IIndexFile resolveInclude(IIndexInclude include) {
return null;
}

View file

@ -80,13 +80,25 @@ public interface IIndexFragment {
public static final String PROPERTY_FRAGMENT_FORMAT_VERSION= "org.eclipse.cdt.internal.core.index.fragment.format.version"; //$NON-NLS-1$
/**
* Returns the file for the given location. May return <code>null</code>, if no such file exists.
* Returns the file for the given location and linkage.
* May return <code>null</code>, if no such file exists.
* This method may only return files that are actually managed by this fragment.
* This method returns files without content, also.
* @param linkageID the id of the linkage in which the file has been parsed.
* @param location the IIndexFileLocation representing the location of the file
* @return the file for the location, or <code>null</code> if the file is not present in the index
* @throws CoreException
*/
IIndexFragmentFile getFile(int linkageID, IIndexFileLocation location) throws CoreException;
/**
* Returns the files in all linkages for the given location.
* This method may only return files that are actually managed by this fragment.
* @param location the IIndexFileLocation representing the location of the file
* @return the file for the location, or <code>null</code> if the file is not present in the index
* @throws CoreException
*/
IIndexFragmentFile getFile(IIndexFileLocation location) throws CoreException;
IIndexFragmentFile[] getFiles(IIndexFileLocation location) throws CoreException;
/**
* Returns all include directives that point to the given file. The input file may belong to

View file

@ -16,6 +16,7 @@ import org.eclipse.cdt.core.index.IIndexFile;
import org.eclipse.core.runtime.CoreException;
public interface IIndexFragmentFile extends IIndexFile {
IIndexFragmentFile[] EMPTY_ARRAY = {};
/**
* Returns the fragment that owns this file.
@ -24,23 +25,24 @@ public interface IIndexFragmentFile extends IIndexFile {
/**
* Sets the timestamp of the file
* @throws CoreException
*/
void setTimestamp(long timestamp) throws CoreException;
/**
* Sets the hashcode of the scanner configuration.
* @param hashcode a hashcode or <code>0</code> if it is unknown.
* Sets the hash-code of the scanner configuration.
* @param hashcode a hash-code or <code>0</code> if it is unknown.
* @throws CoreException
*/
void setScannerConfigurationHashcode(int hashcode) throws CoreException;
/**
* Returns whether any names are associated with this file object
* in this fragment - i.e. whether this file contains content in its
* associated fragment
* @return whether any names are associated with this file object
* in this fragment
* Returns whether this file contains content in its
* associated fragment. Files without content are inserted to track includes.
*/
boolean hasNames() throws CoreException;
boolean hasContent() throws CoreException;
/**
* Returns the id of the linkage this file belongs to.
*/
int getLinkageID() throws CoreException;
}

View file

@ -18,6 +18,7 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexFile;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.core.runtime.CoreException;
@ -38,12 +39,19 @@ public interface IWritableIndex extends IIndex {
/**
* Checks whether the given file can be written to in this index.
*/
boolean isWritableFile(IIndexFragmentFile file);
boolean isWritableFile(IIndexFile file);
/**
* Returns a writable file for the given location, or null.
* Returns a writable file for the given location and linkage, or null. This method
* returns file-objects without content, also.
*/
IIndexFragmentFile getWritableFile(IIndexFileLocation location) throws CoreException;
IIndexFragmentFile getWritableFile(int linkageID, IIndexFileLocation location) throws CoreException;
/**
* Returns the writable files for the given location in any linkage. This method
* returns file-objects without content, also.
*/
IIndexFragmentFile[] getWritableFiles(IIndexFileLocation location) throws CoreException;
/**
* Clears the given file in the index.
@ -56,13 +64,13 @@ public interface IWritableIndex extends IIndex {
/**
* Creates a file object for the given location or returns an existing one.
*/
IIndexFragmentFile addFile(IIndexFileLocation fileLocation) throws CoreException;
IIndexFragmentFile addFile(int linkageID, IIndexFileLocation fileLocation) throws CoreException;
/**
* Adds content to the given file.
*/
void setFileContent(IIndexFragmentFile sourceFile,
IncludeInformation[] includes,
int linkageID, IncludeInformation[] includes,
IASTPreprocessorMacroDefinition[] macros, IASTName[][] names) throws CoreException;
/**

View file

@ -39,12 +39,12 @@ public interface IWritableIndexFragment extends IIndexFragment {
void clearFile(IIndexFragmentFile file, Collection contextsRemoved) throws CoreException;
/**
* Creates a file object for the given location or returns an existing one.
* Creates a file object for the given location and linkage or returns an existing one.
* @param fileLocation an IIndexFileLocation representing the location of the file
* @return the existing IIndexFragmentFile for this location, or a newly created one
* @throws CoreException
*/
IIndexFragmentFile addFile(IIndexFileLocation fileLocation) throws CoreException;
IIndexFragmentFile addFile(int linkageID, IIndexFileLocation fileLocation) throws CoreException;
/**
* Adds an include to the given file.

View file

@ -14,14 +14,9 @@
*******************************************************************************/
package org.eclipse.cdt.internal.core.index;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
@ -33,91 +28,47 @@ import org.eclipse.cdt.core.index.IIndexFile;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.index.IIndexInclude;
import org.eclipse.cdt.core.index.IIndexMacro;
import org.eclipse.cdt.core.index.IndexLocationFactory;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.ICodeReaderCache;
import org.eclipse.cdt.core.parser.IMacro;
import org.eclipse.cdt.core.parser.ParserUtil;
import org.eclipse.cdt.internal.core.parser.scanner2.IIndexBasedCodeReaderFactory;
import org.eclipse.cdt.internal.core.parser.scanner2.ObjectStyleMacro;
import org.eclipse.cdt.internal.core.pdom.ASTFilePathResolver;
import org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMMacro;
import org.eclipse.core.runtime.CoreException;
/**
* Code reader factory, that fakes code readers for header files already stored in the
* index.
*
* <p>
* This interface is not intended to be implemented by clients.
* </p>
*/
public class IndexBasedCodeReaderFactory implements IIndexBasedCodeReaderFactory {
public static interface CallbackHandler {
boolean needToUpdate(IndexFileInfo fileInfo) throws CoreException;
}
public static class IndexFileInfo {
public final static int NOT_REQUESTED= 0;
public final static int REQUESTED_IF_CONFIG_CHANGED= 1;
public final static int REQUESTED= 2;
private IndexFileInfo() {}
private IMacro[] fMacros= null;
public IIndexFile fFile= null;
public int fRequested= 0;
public boolean hasCachedMacros() {
return fMacros != null;
}
}
private static class NeedToParseException extends Exception {
private static final long serialVersionUID = 1L;
}
private final static boolean CASE_SENSITIVE_FILES= !new File("a").equals(new File("A")); //$NON-NLS-1$//$NON-NLS-2$
public final class IndexBasedCodeReaderFactory implements IIndexBasedCodeReaderFactory {
private static final class NeedToParseException extends Exception {}
private final static char[] EMPTY_CHARS = new char[0];
private final IIndex index;
private Map/*<IIndexFileLocation,FileInfo>*/ fileInfoCache;
private Map/*<String,IIndexFileLocation>*/ iflCache;
private List usedMacros = new ArrayList();
private Set/*<FileInfo>*/ fIncluded= new HashSet();
private final IIndex fIndex;
private int fLinkage;
private Set fIncludedFiles= new HashSet();
/** The fall-back code reader factory used in case a header file is not indexed */
private ICodeReaderFactory fFallBackFactory;
private CallbackHandler fCallbackHandler;
private final ICProject cproject;
private final String fProjectPathPrefix;
private final ICodeReaderFactory fFallBackFactory;
private final ASTFilePathResolver fPathResolver;
private final AbstractIndexerTask fRelatedIndexerTask;
public IndexBasedCodeReaderFactory(ICProject cproject, IIndex index) {
this(cproject, index, new HashMap/*<String,IIndexFileLocation>*/());
public IndexBasedCodeReaderFactory(IIndex index, ASTFilePathResolver pathResolver, int linkage) {
this(index, pathResolver, linkage, null);
}
public IndexBasedCodeReaderFactory(ICProject cproject, IIndex index, ICodeReaderFactory fallbackFactory) {
this(cproject, index, new HashMap/*<String,IIndexFileLocation>*/(), fallbackFactory);
public IndexBasedCodeReaderFactory(IIndex index, ASTFilePathResolver pathResolver, int linkage, ICodeReaderFactory fallbackFactory) {
this(index, pathResolver, linkage, fallbackFactory, null);
}
public IndexBasedCodeReaderFactory(ICProject cproject, IIndex index, Map iflCache) {
this(cproject, index, iflCache, null);
}
/**
* @param cproject the ICProject to prefer when resolving external includes to workspace resources (may be null)
* @param index the IIndex that backs this code reader
* @param iflCache
* @param fallbackFactory
*/
public IndexBasedCodeReaderFactory(ICProject cproject, IIndex index, Map iflCache, ICodeReaderFactory fallbackFactory) {
this.cproject= cproject;
this.index = index;
this.fileInfoCache = new HashMap/*<IIndexFileLocation,FileInfo>*/();
this.iflCache = iflCache;
this.fFallBackFactory= fallbackFactory;
this.fProjectPathPrefix= cproject == null ? null : '/' + cproject.getElementName() + '/';
}
final protected Map getIFLCache() {
return iflCache;
public IndexBasedCodeReaderFactory(IIndex index, ASTFilePathResolver pathResolver, int linkage,
ICodeReaderFactory fallbackFactory, AbstractIndexerTask relatedIndexerTask) {
fIndex= index;
fFallBackFactory= fallbackFactory;
fPathResolver= pathResolver;
fRelatedIndexerTask= relatedIndexerTask;
fLinkage= linkage;
}
public int getUniqueIdentifier() {
@ -129,185 +80,95 @@ public class IndexBasedCodeReaderFactory implements IIndexBasedCodeReaderFactory
}
public CodeReader createCodeReaderForInclusion(IMacroCollector scanner, String path) {
// if the file is in the index, we skip it
File location= new File(path);
String canonicalPath= path;
if (!location.exists()) {
IIndexFileLocation ifl= fPathResolver.resolveIncludeFile(path);
if (ifl == null) {
return null;
}
if (!CASE_SENSITIVE_FILES) {
try {
canonicalPath= location.getCanonicalPath();
}
catch (IOException e) {
// just use the original
}
}
try {
IIndexFileLocation incLocation = findLocation(canonicalPath);
IndexFileInfo info= createInfo(incLocation, null);
path= fPathResolver.getASTPath(ifl);
if (isIncluded(info)) {
return new CodeReader(canonicalPath, EMPTY_CHARS);
// include files once, only.
if (!fIncludedFiles.add(ifl)) {
return new CodeReader(path, EMPTY_CHARS);
}
// try to build macro dictionary off index
if (info.fFile != null) {
try {
LinkedHashSet infos= new LinkedHashSet();
getInfosForMacroDictionary(info, infos);
for (Iterator iter = infos.iterator(); iter.hasNext();) {
IndexFileInfo fi = (IndexFileInfo) iter.next();
if (fi.fMacros == null) {
assert fi.fFile != null;
IIndexMacro[] macros= fi.fFile.getMacros();
IMacro[] converted= new IMacro[macros.length];
IIndexFile file= fIndex.getFile(fLinkage, ifl);
if (file != null) {
try {
LinkedHashMap macroMap= new LinkedHashMap();
collectMacros(file, macroMap, false);
for (Iterator iterator = macroMap.entrySet().iterator(); iterator.hasNext();) {
Map.Entry entry = (Map.Entry) iterator.next();
IIndexFileLocation includedIFL = (IIndexFileLocation) entry.getKey();
IMacro[] macros = (IMacro[]) entry.getValue();
for (int i = 0; i < macros.length; ++i) {
scanner.addDefinition(macros[i]);
}
fIncludedFiles.add(includedIFL);
}
return new CodeReader(path, EMPTY_CHARS);
}
catch (NeedToParseException e) {
}
}
}
catch (CoreException e) {
CCorePlugin.log(e);
}
if (fFallBackFactory != null) {
return fFallBackFactory.createCodeReaderForInclusion(scanner, path);
}
return ParserUtil.createReader(path, null);
}
public boolean hasFileBeenIncludedInCurrentTranslationUnit(String path) {
IIndexFileLocation ifl= fPathResolver.resolveASTPath(path);
return fIncludedFiles.contains(ifl);
}
private void collectMacros(IIndexFile file, LinkedHashMap macroMap, boolean checkIncluded) throws CoreException, NeedToParseException {
IIndexFileLocation ifl= file.getLocation();
if (macroMap.containsKey(ifl) || (checkIncluded && fIncludedFiles.contains(ifl))) {
return;
}
IMacro[] converted;
if (fRelatedIndexerTask != null) {
converted= fRelatedIndexerTask.getConvertedMacros(fLinkage, ifl);
if (converted == null) {
throw new NeedToParseException();
}
}
else {
IIndexMacro[] macros= file.getMacros();
converted= new IMacro[macros.length];
for (int i = 0; i < macros.length; i++) {
IIndexMacro macro = macros[i];
converted[i]= ((PDOMMacro)macro).getMacro();
}
fi.fMacros= converted;
}
for (int i = 0; i < fi.fMacros.length; ++i) {
scanner.addDefinition(fi.fMacros[i]);
}
// record the macros we used.
usedMacros.add(fi.fMacros);
setIncluded(fi);
}
return new CodeReader(canonicalPath, EMPTY_CHARS);
} catch (NeedToParseException e) {
}
}
setIncluded(info);
}
catch (CoreException e) {
CCorePlugin.log(e);
// still try to parse the file.
}
macroMap.put(ifl, converted); // prevent recursion
if (fFallBackFactory != null) {
return fFallBackFactory.createCodeReaderForInclusion(scanner, canonicalPath);
}
return ParserUtil.createReader(canonicalPath, null);
}
public boolean hasFileBeenIncludedInCurrentTranslationUnit(String path) {
String canonicalPath= path;
if (!CASE_SENSITIVE_FILES) {
try {
File location= new File(path);
canonicalPath= location.getCanonicalPath();
}
catch (IOException e) {
// just use the original
}
}
IIndexFileLocation loc= findLocation(canonicalPath);
IndexFileInfo info= (IndexFileInfo) fileInfoCache.get(loc);
if (info != null && isIncluded(info)) {
return true;
}
return false;
}
/**
* Mark the given inclusion as included.
* @param info
*/
private void setIncluded(IndexFileInfo info) {
fIncluded.add(info);
}
/**
* Test whether the given inclusion is already included.
* @param info
* @return <code>true</code> if the inclusion is already included.
*/
private boolean isIncluded(IndexFileInfo info) {
return fIncluded.contains(info);
}
private IndexFileInfo createInfo(IIndexFileLocation location, IIndexFile file) throws CoreException {
IndexFileInfo info= (IndexFileInfo) fileInfoCache.get(location);
if (info == null) {
info= new IndexFileInfo();
if (file != null) {
info.fFile= file;
}
else {
// bug 205555, in case a file of the project is also part of a read-only pdom,
// we prefer the writable pdom.
final String path= location.getFullPath();
if (path != null && fProjectPathPrefix != null &&
path.startsWith(fProjectPathPrefix) && index instanceof IWritableIndex) {
info.fFile= ((IWritableIndex) index).getWritableFile(location);
}
else {
info.fFile= index.getFile(location);
}
}
fileInfoCache.put(location, info);
}
return info;
}
private void getInfosForMacroDictionary(IndexFileInfo fileInfo, LinkedHashSet/*<FileInfo>*/ target) throws CoreException, NeedToParseException {
// in case the file is already included, don't load the macros again.
if (isIncluded(fileInfo)) {
return;
}
if (!target.add(fileInfo)) {
return;
}
final IIndexFile file= fileInfo.fFile;
if (file == null ||
(fCallbackHandler != null && fCallbackHandler.needToUpdate(fileInfo))) {
throw new NeedToParseException();
}
// Follow the includes
// follow the includes
IIndexInclude[] includeDirectives= file.getIncludes();
for (int i = 0; i < includeDirectives.length; i++) {
IIndexFile includedFile= index.resolveInclude(includeDirectives[i]);
final IIndexInclude indexInclude = includeDirectives[i];
IIndexFile includedFile= fIndex.resolveInclude(indexInclude);
if (includedFile != null) {
IndexFileInfo nextInfo= createInfo(includedFile.getLocation(), includedFile);
getInfosForMacroDictionary(nextInfo, target);
collectMacros(includedFile, macroMap, true);
}
}
}
public void clearMacroAttachements() {
Iterator i = usedMacros.iterator();
while (i.hasNext()) {
IMacro[] macros = (IMacro[])i.next();
for (int j = 0; j < macros.length; ++j) {
if (macros[j] instanceof ObjectStyleMacro) {
((ObjectStyleMacro)macros[j]).attachment = null;
}
}
}
usedMacros.clear();
fIncluded.clear();
public void cleanupAfterTranslationUnit() {
fIncludedFiles.clear();
}
public ICodeReaderCache getCodeReaderCache() {
// No need for cache here
return null;
}
public IndexFileInfo createFileInfo(IIndexFileLocation location) throws CoreException {
return createInfo(location, null);
}
public IIndexFileLocation findLocation(String absolutePath) {
if(!iflCache.containsKey(absolutePath)) {
iflCache.put(absolutePath, IndexLocationFactory.getIFLExpensive(cproject, absolutePath));
}
return (IIndexFileLocation) iflCache.get(absolutePath);
}
public void setCallbackHandler(CallbackHandler callbackHandler) {
fCallbackHandler= callbackHandler;
public void setLinkage(int linkageID) {
fLinkage= linkageID;
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2006 Symbian Software Ltd. and others.
* Copyright (c) 2006, 2007 Symbian Software Ltd. 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
@ -62,4 +62,11 @@ public class IndexFileLocation implements IIndexFileLocation {
public int hashCode() {
return uri.hashCode();
}
public String toString() {
if (fullPath == null) {
return uri.toString();
}
return fullPath.toString() + " (" + uri.toString() + ')'; //$NON-NLS-1$
}
}

View file

@ -16,6 +16,7 @@ import java.util.Collection;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
import org.eclipse.cdt.core.index.IIndexFile;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.core.runtime.CoreException;
@ -40,19 +41,23 @@ public class WritableCIndex extends CIndex implements IWritableIndex {
return fWritableFragment;
}
public IIndexFragmentFile getWritableFile(IIndexFileLocation location) throws CoreException {
return fWritableFragment.getFile(location);
public IIndexFragmentFile getWritableFile(int linkageID, IIndexFileLocation location) throws CoreException {
return fWritableFragment.getFile(linkageID, location);
}
public IIndexFragmentFile addFile(IIndexFileLocation fileLocation) throws CoreException {
return fWritableFragment.addFile(fileLocation);
public IIndexFragmentFile[] getWritableFiles(IIndexFileLocation location) throws CoreException {
return fWritableFragment.getFiles(location);
}
public IIndexFragmentFile addFile(int linkageID, IIndexFileLocation fileLocation) throws CoreException {
return fWritableFragment.addFile(linkageID, fileLocation);
}
private boolean isWritableFragment(IIndexFragment frag) {
return frag == fWritableFragment;
}
public void setFileContent(IIndexFragmentFile file,
public void setFileContent(IIndexFragmentFile file, int linkageID,
IncludeInformation[] includes,
IASTPreprocessorMacroDefinition[] macros, IASTName[][] names) throws CoreException {
@ -64,7 +69,7 @@ public class WritableCIndex extends CIndex implements IWritableIndex {
for (int i = 0; i < includes.length; i++) {
IncludeInformation ii= includes[i];
if (ii.fLocation != null) {
ii.fTargetFile= addFile(ii.fLocation);
ii.fTargetFile= addFile(linkageID, ii.fLocation);
}
}
((IWritableIndexFragment) indexFragment).addFileContent(file, includes, macros, names);
@ -75,8 +80,9 @@ public class WritableCIndex extends CIndex implements IWritableIndex {
fWritableFragment.clear();
}
public boolean isWritableFile(IIndexFragmentFile file) {
return isWritableFragment(file.getIndexFragment());
public boolean isWritableFile(IIndexFile file) {
return file instanceof IIndexFragmentFile &&
isWritableFragment(((IIndexFragmentFile)file).getIndexFragment());
}
public void clearFile(IIndexFragmentFile file, Collection clearedContexts) throws CoreException {

View file

@ -13,28 +13,9 @@
package org.eclipse.cdt.internal.core.indexer;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.index.IIndexFile;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.model.AbstractLanguage;
import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.internal.core.index.IWritableIndex;
import org.eclipse.cdt.internal.core.index.IndexFileLocation;
import org.eclipse.cdt.internal.core.index.IndexBasedCodeReaderFactory.CallbackHandler;
import org.eclipse.cdt.internal.core.index.IndexBasedCodeReaderFactory.IndexFileInfo;
import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.cdt.core.dom.ICodeReaderFactory;
/**
* A task for index updates.
@ -48,162 +29,12 @@ import org.eclipse.core.runtime.IProgressMonitor;
*
* @since 4.0
*/
public class StandaloneFastIndexerTask extends StandaloneIndexerTask implements CallbackHandler {
private List fChanged = new ArrayList();
private List fRemoved = new ArrayList();
private IWritableIndex fIndex;
private StandaloneIndexBasedCodeReaderFactory fCodeReaderFactory;
private Map fIflCache;
private int fCurrentConfigHash= 0;
public StandaloneFastIndexerTask(StandaloneFastIndexer indexer, List added,
List changed, List removed) {
super(indexer);
fChanged.addAll(added);
fChanged.addAll(changed);
fRemoved.addAll(removed);
updateInfo(0, 0, fChanged.size() + fRemoved.size());
public class StandaloneFastIndexerTask extends StandaloneIndexerTask {
public StandaloneFastIndexerTask(StandaloneFastIndexer indexer, List added, List changed, List removed) {
super(indexer, added, changed, removed, true);
}
public void run(IProgressMonitor monitor) throws IOException{
long start = System.currentTimeMillis();
try {
setupIndexAndReaderFactory();
fIndex.acquireReadLock();
try {
registerTUsInReaderFactory(fChanged);
Iterator i= fRemoved.iterator();
while (i.hasNext()) {
if (monitor.isCanceled())
return;
String tu = (String) i.next();
removeTU(fIndex, getIndexFileLocation(tu), 1);
if (isValidSourceUnitName(tu)) {
updateInfo(1, 0, 0);
}
else {
updateInfo(0, 1, -1);
}
}
// separate headers
List headers= new ArrayList();
List sources= fChanged;
for (Iterator iter = fChanged.iterator(); iter.hasNext();) {
String tu = (String) iter.next();
if (!isValidSourceUnitName(tu)) {
headers.add(tu);
iter.remove();
}
}
parseTUs(fIndex, 1, sources, headers, monitor);
if (monitor.isCanceled()) {
return;
}
}
finally {
fIndex.releaseReadLock();
}
} catch (CoreException e) {
e.printStackTrace();
} catch (InterruptedException e) {
}
traceEnd(start);
}
private void setupIndexAndReaderFactory() throws CoreException {
fIndex= fIndexer.getIndex();
fIndex.resetCacheCounters();
fIflCache = new HashMap/*<String,IIndexFileLocation>*/();
fCodeReaderFactory = new StandaloneIndexBasedCodeReaderFactory(fIndex, fIflCache);
fCodeReaderFactory.setCallbackHandler(this);
}
private void registerTUsInReaderFactory(Collection files) throws IOException, CoreException {
int removed= 0;
for (Iterator iter = files.iterator(); iter.hasNext();) {
String sourcePath = (String) iter.next();
String path = new File(sourcePath).getCanonicalPath();
IIndexFileLocation location = getIndexFileLocation(path);
IndexFileInfo info= fCodeReaderFactory.createFileInfo(location);
if (updateAll()) {
info.fRequested= IndexFileInfo.REQUESTED;
}
else if (updateChangedTimestamps() && isOutdated(location, info.fFile)) {
info.fRequested= IndexFileInfo.REQUESTED;
}
else {
iter.remove();
removed++;
}
}
updateInfo(0, 0, -removed);
}
protected IIndexFileLocation findLocation(String absolutePath) {
IIndexFileLocation result = (IIndexFileLocation) fIflCache.get(absolutePath);
if(result==null) {
//Standalone indexing stores the absolute paths of files being indexed
result = new IndexFileLocation(URIUtil.toURI(absolutePath),absolutePath);
fIflCache.put(absolutePath, result);
}
return result;
}
protected IASTTranslationUnit createAST(AbstractLanguage lang, CodeReader codeReader, IScannerInfo scanInfo, int options, IProgressMonitor pm) throws CoreException {
// get the AST in a "Fast" way
IASTTranslationUnit ast= lang.getASTTranslationUnit(codeReader, scanInfo, fCodeReaderFactory, fIndex, options, fIndexer.getParserLog());
if (pm.isCanceled()) {
return null;
}
// Clear the macros
fCodeReaderFactory.clearMacroAttachements();
return ast;
}
protected boolean needToUpdate(IIndexFileLocation location, int confighash) throws CoreException {
if (super.needToUpdate(location, confighash)) {
// file is requested or is not yet indexed.
IndexFileInfo info= fCodeReaderFactory.createFileInfo(location);
return needToUpdate(info, confighash);
}
return false;
}
public boolean needToUpdate(IndexFileInfo info) throws CoreException {
return needToUpdate(info, fCurrentConfigHash);
}
private boolean needToUpdate(IndexFileInfo info, int confighash) throws CoreException {
if (info.fFile == null) {
return true;
}
if (confighash != 0 && info.fRequested == IndexFileInfo.REQUESTED_IF_CONFIG_CHANGED) {
int oldhash= info.fFile.getScannerConfigurationHashcode();
if (oldhash == 0 || oldhash==confighash) {
info.fRequested= IndexFileInfo.NOT_REQUESTED;
updateInfo(0, 0, -1);
}
else {
info.fRequested= IndexFileInfo.REQUESTED;
}
}
return info.fRequested != IndexFileInfo.NOT_REQUESTED;
}
protected boolean postAddToIndex(IIndexFileLocation path, IIndexFile file)
throws CoreException {
IndexFileInfo info= fCodeReaderFactory.createFileInfo(path);
info.fFile= file;
if (info.fRequested != IndexFileInfo.NOT_REQUESTED) {
info.fRequested= IndexFileInfo.NOT_REQUESTED;
return true;
}
return false;
protected ICodeReaderFactory createReaderFactory() {
return new StandaloneIndexerFallbackReaderFactory();
}
}

View file

@ -13,26 +13,9 @@
package org.eclipse.cdt.internal.core.indexer;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.index.IIndexFile;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.model.AbstractLanguage;
import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.internal.core.index.IWritableIndex;
import org.eclipse.cdt.internal.core.index.IndexFileLocation;
import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.cdt.core.dom.ICodeReaderFactory;
/**
* A task for index updates.
@ -47,133 +30,12 @@ import org.eclipse.core.runtime.IProgressMonitor;
* @since 4.0
*/
public class StandaloneFullIndexerTask extends StandaloneIndexerTask {
private final static Object REQUIRED= new Object();
private final static Object MISSING = new Object();
private final static Object SKIP= new Object();
private List fChanged = new ArrayList();
private List fRemoved = new ArrayList();
private IWritableIndex fIndex = null;
private Map filePathsToParse = new HashMap/*<IIndexFileLocation, Object>*/();
private Map fIflCache = new HashMap/*<String, IIndexFileLocation>*/();
public StandaloneFullIndexerTask(StandaloneFullIndexer indexer, List added,
List changed, List removed) {
super(indexer);
fChanged.addAll(added);
fChanged.addAll(changed);
fRemoved.addAll(removed);
updateInfo(0, 0, fChanged.size() + fRemoved.size());
super(indexer, added, changed, removed, false);
}
public void run(IProgressMonitor monitor) throws IOException {
long start = System.currentTimeMillis();
try {
setupIndex();
registerTUsInReaderFactory(fChanged);
// separate headers
List headers= new ArrayList();
List sources= fChanged;
for (Iterator iter = fChanged.iterator(); iter.hasNext();) {
String tu = (String) iter.next();
if (!isValidSourceUnitName(tu)) {
headers.add(tu);
iter.remove();
}
}
Iterator i= fRemoved.iterator();
while (i.hasNext()) {
if (monitor.isCanceled())
return;
String tu = (String) i.next();
removeTU(fIndex, getIndexFileLocation(tu), 0);
if (isValidSourceUnitName(tu)) {
updateInfo(1, 0, 0);
}
else {
updateInfo(0, 1, -1);
}
}
fIndex.acquireReadLock();
try {
parseTUs(fIndex, 1, sources, headers, monitor);
}
finally {
fIndex.releaseReadLock();
}
} catch (CoreException e) {
e.printStackTrace();
} catch (InterruptedException e) {
}
traceEnd(start);
}
private void setupIndex() throws CoreException {
fIndex = fIndexer.getIndex();
fIndex.resetCacheCounters();
}
private void registerTUsInReaderFactory(Collection/*<ITranslationUnit>*/ sources)
throws IOException, CoreException {
int removed= 0;
filePathsToParse= new HashMap/*<IIndexFileLocation, Object>*/();
for (Iterator iter = sources.iterator(); iter.hasNext();) {
String sourcePath = (String) iter.next();
String path = new File(sourcePath).getCanonicalPath();
IIndexFileLocation location = getIndexFileLocation(path);
if (updateAll()) {
filePathsToParse.put(location, REQUIRED);
}
else if (updateChangedTimestamps() && isOutdated(location, fIndex.getFile(location))) {
filePathsToParse.put(location, REQUIRED);
}
else {
iter.remove();
removed++;
continue;
}
updateInfo(0, 0, -removed);
}
}
protected IIndexFileLocation findLocation(String absolutePath) {
IIndexFileLocation result = (IIndexFileLocation) fIflCache.get(absolutePath);
if(result==null) {
//Standalone indexing stores the absolute paths of files being indexed
result = new IndexFileLocation(URIUtil.toURI(absolutePath),absolutePath);
fIflCache.put(absolutePath, result);
}
return result;
}
protected IASTTranslationUnit createAST(AbstractLanguage lang, CodeReader codeReader, IScannerInfo scanInfo, int options, IProgressMonitor pm) throws CoreException {
// get the AST in a "Fast" way
IASTTranslationUnit ast= lang.getASTTranslationUnit(codeReader, scanInfo, ((StandaloneFullIndexer)fIndexer).getCodeReaderFactory(), null, options, fIndexer.getParserLog());
if (pm.isCanceled()) {
return null;
}
return ast;
}
protected boolean needToUpdate(IIndexFileLocation location, int confighash) throws CoreException {
if (super.needToUpdate(location, confighash)) {
Object required= filePathsToParse.get(location);
if (required == null) {
required= MISSING;
filePathsToParse.put(location, required);
}
return required != SKIP;
}
return false;
}
protected boolean postAddToIndex(IIndexFileLocation location, IIndexFile file)
throws CoreException {
Object required= filePathsToParse.get(location);
filePathsToParse.put(location, SKIP);
return required == REQUIRED;
protected ICodeReaderFactory createReaderFactory() {
return ((StandaloneFullIndexer)fIndexer).getCodeReaderFactory();
}
}

View file

@ -1,96 +0,0 @@
/*******************************************************************************
* Copyright (c) 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.indexer;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.core.dom.ICodeReaderFactory;
import org.eclipse.cdt.core.dom.IMacroCollector;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.ICodeReaderCache;
import org.eclipse.cdt.internal.core.index.IndexBasedCodeReaderFactory;
import org.eclipse.cdt.internal.core.index.IndexFileLocation;
import org.eclipse.core.filesystem.URIUtil;
/**
* A factory for CodeReaders construction.
*
* <p>
* <strong>EXPERIMENTAL</strong>. This class or interface has been added as
* part of a work in progress. There is no guarantee that this API will work or
* that it will remain the same. Please do not use this API without consulting
* with the CDT team.
* </p>
*
* @since 4.0
*/
public class StandaloneIndexBasedCodeReaderFactory extends IndexBasedCodeReaderFactory {
public static class DefaultFallBackFactory implements ICodeReaderFactory {
public CodeReader createCodeReaderForInclusion(IMacroCollector callback, String path) {
try {
if (!new File(path).exists())
return null;
return new CodeReader(path);
} catch (IOException e) {
return null;
}
}
public CodeReader createCodeReaderForTranslationUnit(String path) {
try {
if (!new File(path).exists())
return null;
return new CodeReader(path);
} catch (IOException e) {
return null;
}
}
public ICodeReaderCache getCodeReaderCache() {
return null;
}
public int getUniqueIdentifier() {
return 0;
}
}
public StandaloneIndexBasedCodeReaderFactory(IIndex index) {
super(null, index);
}
public StandaloneIndexBasedCodeReaderFactory(IIndex index, ICodeReaderFactory fallbackFactory) {
super(null, index, new HashMap/*<String,IIndexFileLocation>*/(), fallbackFactory);
}
public StandaloneIndexBasedCodeReaderFactory(IIndex index, Map iflCache) {
super(null, index, iflCache, new DefaultFallBackFactory());
}
public IIndexFileLocation findLocation(String absolutePath) {
IIndexFileLocation result = (IIndexFileLocation) getIFLCache().get(absolutePath);
if(result==null) {
//Standalone indexing stores the absolute paths of files being indexed
result = new IndexFileLocation(URIUtil.toURI(absolutePath),absolutePath);
getIFLCache().put(absolutePath, result);
}
return result;
}
}

View file

@ -306,15 +306,13 @@ public abstract class StandaloneIndexer {
fDelegate= createTask(getFilesAdded(tus), NO_TUS, NO_TUS);
fDelegate.setUpdateFlags(fUpdateOptions);
if (fDelegate != null) {
fDelegate.run(monitor);
}
} catch (CoreException e) {
e.printStackTrace();
} catch (InterruptedException e) {
}
if (fDelegate != null) {
fDelegate.run(monitor);
}
}
/**
@ -329,12 +327,12 @@ public abstract class StandaloneIndexer {
fProgress= new IndexerProgress();
fDelegate= createTask(getFilesAdded(added), changed, removed);
if (fDelegate instanceof StandaloneIndexerTask) {
fDelegate.setUpdateFlags(fUpdateOptions);
}
if (fDelegate != null) {
try {
fDelegate.setUpdateFlags(fUpdateOptions);
fDelegate.run(monitor);
} catch (InterruptedException e) {
}
}
}
@ -360,7 +358,7 @@ public abstract class StandaloneIndexer {
if (file.isDirectory()) {
String[] files = file.list(filter);
for (int i = 0; i < files.length; i++) {
added.add((String)files[i]);
added.add(files[i]);
}
}
else {

View file

@ -0,0 +1,63 @@
/*******************************************************************************
* Copyright (c) 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.indexer;
import java.io.File;
import java.io.IOException;
import org.eclipse.cdt.core.dom.ICodeReaderFactory;
import org.eclipse.cdt.core.dom.IMacroCollector;
import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.ICodeReaderCache;
/**
* A factory for CodeReaders construction.
*
* <p>
* <strong>EXPERIMENTAL</strong>. This class or interface has been added as
* part of a work in progress. There is no guarantee that this API will work or
* that it will remain the same. Please do not use this API without consulting
* with the CDT team.
* </p>
*
* @since 4.0
*/
public class StandaloneIndexerFallbackReaderFactory implements ICodeReaderFactory {
public CodeReader createCodeReaderForInclusion(IMacroCollector callback, String path) {
try {
if (!new File(path).exists())
return null;
return new CodeReader(path);
} catch (IOException e) {
return null;
}
}
public CodeReader createCodeReaderForTranslationUnit(String path) {
try {
if (!new File(path).exists())
return null;
return new CodeReader(path);
} catch (IOException e) {
return null;
}
}
public ICodeReaderCache getCodeReaderCache() {
return null;
}
public int getUniqueIdentifier() {
return 0;
}
}

View file

@ -0,0 +1,129 @@
/*******************************************************************************
* Copyright (c) 2007 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.indexer;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.model.AbstractLanguage;
import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.internal.core.index.IndexFileLocation;
import org.eclipse.cdt.internal.core.pdom.IndexerInputAdapter;
import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
/**
* Provides information about the file paths represented as strings.
* @since 5.0
*/
public class StandaloneIndexerInputAdapter extends IndexerInputAdapter {
private HashMap fIflCache= new HashMap();
private final StandaloneIndexer fIndexer;
public StandaloneIndexerInputAdapter(StandaloneIndexer indexer) {
fIndexer= indexer;
}
public IScannerInfo getBuildConfiguration(int linkageID, Object tu) {
return fIndexer.getScannerInfo();
}
public long getLastModified(IIndexFileLocation location) {
return new File(location.getFullPath()).lastModified();
}
public boolean isSourceUnit(Object tu) {
return isValidSourceUnitName((String) tu);
}
public IIndexFileLocation resolveFile(Object tu) {
return resolveASTPath((String) tu);
}
public String getASTPath(IIndexFileLocation ifl) {
return ifl.getFullPath();
}
public IIndexFileLocation resolveASTPath(String astPath) {
IIndexFileLocation result= (IIndexFileLocation) fIflCache.get(astPath);
if (result == null) {
try {
astPath = new File(astPath).getCanonicalPath();
} catch (IOException e) {
// use the original
}
//Standalone indexing stores the absolute paths of files being indexed
result = new IndexFileLocation(URIUtil.toURI(astPath),astPath);
fIflCache.put(astPath, result);
}
return result;
}
public IIndexFileLocation resolveIncludeFile(String includePath) {
IIndexFileLocation result= (IIndexFileLocation) fIflCache.get(includePath);
if (result == null) {
File file= new File(includePath);
if (!file.exists()) {
return null;
}
try {
includePath = file.getCanonicalPath();
} catch (IOException e) {
// use the original
}
//Standalone indexing stores the absolute paths of files being indexed
result = new IndexFileLocation(URIUtil.toURI(includePath),includePath);
fIflCache.put(includePath, result);
}
return result;
}
public boolean isFileBuildConfigured(Object tu) {
return isValidSourceUnitName((String) tu);
}
public boolean canBePartOfSDK(IIndexFileLocation ifl) {
return false;
}
public CodeReader getCodeReader(Object tu) {
try {
return new CodeReader((String) tu);
} catch (IOException e) {
}
return null;
}
public Object getInputFile(IIndexFileLocation location) {
return location.getFullPath();
}
public AbstractLanguage[] getLanguages(Object tu) {
ILanguage language = fIndexer.getLanguageMapper().getLanguage((String) tu);
if (language instanceof AbstractLanguage) {
return new AbstractLanguage[] {(AbstractLanguage) language};
}
return new AbstractLanguage[0];
}
private boolean isValidSourceUnitName(String file) {
IPath path = new Path(file);
if (fIndexer.getValidSourceUnitNames() == null || fIndexer.getValidSourceUnitNames().size() == 0)
return true;
return fIndexer.getValidSourceUnitNames().contains(path.getFileExtension());
}
}

View file

@ -12,38 +12,16 @@
package org.eclipse.cdt.internal.core.indexer;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexFile;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.index.IIndexInclude;
import org.eclipse.cdt.core.model.AbstractLanguage;
import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.IExtendedScannerInfo;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
import org.eclipse.cdt.internal.core.index.IWritableIndex;
import org.eclipse.cdt.internal.core.index.IndexFileLocation;
import org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask;
import org.eclipse.cdt.internal.core.pdom.IndexerProgress;
import org.eclipse.cdt.internal.core.pdom.PDOMWriter;
import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
/**
* A task for index updates.
@ -57,21 +35,37 @@ import org.eclipse.core.runtime.Path;
*
* @since 4.0
*/
public abstract class StandaloneIndexerTask extends PDOMWriter{
private static final Object NO_CONTEXT = new Object();
public abstract class StandaloneIndexerTask extends AbstractIndexerTask {
protected StandaloneIndexer fIndexer;
protected Map/*<IIndexFileLocation, Object>*/ fContextMap = new HashMap/*<IIndexFileLocation, Object>*/();
private List fFilesUpFront= new ArrayList();
private String fDummyFileName;
private URI fDummyFileURI;
private int fUpdateFlags= StandaloneIndexer.UPDATE_ALL;
protected StandaloneIndexerTask(StandaloneIndexer indexer) {
protected StandaloneIndexerTask(StandaloneIndexer indexer, Collection added, Collection changed, Collection removed, boolean isFast) {
super(concat(added, changed), removed.toArray(), new StandaloneIndexerInputAdapter(indexer), isFast);
fIndexer= indexer;
setShowActivity(fIndexer.getShowActivity());
setShowProblems(fIndexer.getShowProblems());
setSkipReferences(fIndexer.getSkipReferences());
if (getIndexAllFiles()) {
setIndexFilesWithoutBuildConfiguration(true);
setIndexHeadersWithoutContext(true);
}
else {
setIndexFilesWithoutBuildConfiguration(false);
setIndexHeadersWithoutContext(false);
}
}
private static Object[] concat(Collection added, Collection changed) {
Object[] result= new Object[added.size() + changed.size()];
int i=0;
for (Iterator iterator = added.iterator(); iterator.hasNext();) {
result[i++]= iterator.next();
}
for (Iterator iterator = changed.iterator(); iterator.hasNext();) {
result[i++]= iterator.next();
}
return result;
}
/**
@ -89,30 +83,16 @@ public abstract class StandaloneIndexerTask extends PDOMWriter{
return super.getProgressInformation();
}
public void setUpdateFlags(int flags) {
fUpdateFlags= flags;
}
final public boolean updateAll() {
return (fUpdateFlags & StandaloneIndexer.UPDATE_ALL) != 0;
}
final public boolean updateChangedTimestamps() {
return (fUpdateFlags & StandaloneIndexer.UPDATE_CHECK_TIMESTAMPS) != 0;
}
/**
* Tells the parser which files to parse first
*/
final public void setParseUpFront() {
String[] files = fIndexer.getFilesToParseUpFront();
for (int i = 0; i < files.length; i++) {
fFilesUpFront.add((String) files[i]);
}
setParseUpFront(fIndexer.getFilesToParseUpFront());
}
/**
* Figurues out whether all files (sources without config, headers not included)
* Figures out whether all files (sources without config, headers not included)
* should be parsed.
* @since 4.0
*/
@ -120,262 +100,23 @@ public abstract class StandaloneIndexerTask extends PDOMWriter{
return getIndexer().getIndexAllFiles();
}
private IASTTranslationUnit createAST(IIndexFileLocation location, IScannerInfo scannerInfo, int options, IProgressMonitor pm) throws IOException, CoreException {
String path = location.getFullPath();
if (path == null) {
return null;
}
ILanguage language = fIndexer.getLanguageMapper().getLanguage(path);
if (language == null)
return null;
CodeReader codeReader = new CodeReader(path);
if (codeReader == null) {
return null;
}
return createAST((AbstractLanguage)language, codeReader, scannerInfo, options, pm);
}
/**
* Called to create the ast for a translation unit or a pre-parsed file.
* May return <code>null</code>.
* @see #parseTUs(IWritableIndex, int, Collection, Collection, IProgressMonitor)
* @since 4.0
*/
abstract protected IASTTranslationUnit createAST(AbstractLanguage lang, CodeReader codeReader, IScannerInfo scanInfo, int options, IProgressMonitor pm) throws CoreException;
/**
* Convenience method for subclasses, parses the files calling out to the methods
* {@link #createAST(IIndexFileLocation, IProgressMonitor)},
* {@link #needToUpdate(IIndexFileLocation)},
* {@link #addSymbols(IASTTranslationUnit, IWritableIndex, int, IProgressMonitor)}
* {@link #postAddToIndex(IIndexFileLocation, IIndexFile)} and
* {@link #findLocation(String)}
* @since 4.0
*/
protected void parseTUs(IWritableIndex index, int readlockCount, Collection sources, Collection headers, IProgressMonitor monitor) throws IOException, CoreException, InterruptedException {
int options= 0;
if (fIndexer.getSkipReferences() == StandaloneIndexer.SKIP_ALL_REFERENCES) {
options |= AbstractLanguage.OPTION_SKIP_FUNCTION_BODIES;
}
for (Iterator iter = fFilesUpFront.iterator(); iter.hasNext();) {
String upfront= (String) iter.next();
parseUpFront(upfront, options, index, readlockCount, monitor);
}
// sources first
for (Iterator iter = sources.iterator(); iter.hasNext();) {
if (monitor.isCanceled())
return;
String sourcePath = (String) iter.next();
String path = new File(sourcePath).getCanonicalPath();
final IIndexFileLocation ifl = getIndexFileLocation(path);
if (needToUpdate(ifl, 0)) {
parseTU(ifl, options, index, readlockCount, monitor);
}
}
// headers with context
for (Iterator iter = headers.iterator(); iter.hasNext();) {
if (monitor.isCanceled())
return;
String sourcePath = (String) iter.next();
String path = new File(sourcePath).getCanonicalPath();
final IIndexFileLocation location = getIndexFileLocation(path);
if (!needToUpdate(location, 0)) {
iter.remove();
}
else {
IIndexFileLocation context= findContext(index, location);
if (context != null) {
parseTU(context, options, index, readlockCount, monitor);
}
}
}
// headers without context
if (getIndexAllFiles()) {
for (Iterator iter = headers.iterator(); iter.hasNext();) {
if (monitor.isCanceled())
return;
String sourcePath = (String) iter.next();
String path = new File(sourcePath).getCanonicalPath();
final IIndexFileLocation ifl = getIndexFileLocation(path);
if (!needToUpdate(ifl, 0)) {
iter.remove();
}
else {
parseTU(ifl, options, index, readlockCount, monitor);
}
}
}
}
final protected boolean isOutdated(IIndexFileLocation ifl, IIndexFile indexFile) throws CoreException {
if (indexFile == null) {
return true;
}
File res = new File(ifl.getFullPath());
if (res != null) {
if (indexFile != null) {
if (res.lastModified() == indexFile.getTimestamp()) {
return false;
}
}
return true;
}
return false;
}
private void parseTU(IIndexFileLocation location, int options, IWritableIndex index, int readlockCount, IProgressMonitor pm) throws IOException, CoreException, InterruptedException {
String path = location.getFullPath();
try {
// skip if no scanner info
IScannerInfo scanner= fIndexer.getScannerInfo();
if (scanner == null) {
updateInfo(0, 0, -1);
}
else {
final int configHash = computeHashCode(scanner);
if (needToUpdate(location, configHash)) {
if (fShowActivity) {
System.out.println("Indexer: parsing " + path); //$NON-NLS-1$
}
long start= System.currentTimeMillis();
IASTTranslationUnit ast= createAST(location, scanner, options, pm);
fStatistics.fParsingTime += System.currentTimeMillis()-start;
if (ast != null) {
addSymbols(ast, index, readlockCount, configHash, pm);
}
}
}
}
catch (CoreException e) {
e.printStackTrace();
}
catch (RuntimeException e) {
e.printStackTrace();
}
catch (Error e) {
e.printStackTrace();
}
}
private void parseUpFront(String file, int options, IWritableIndex index, int readlockCount, IProgressMonitor pm) throws CoreException, InterruptedException {
file= file.trim();
if (file.length() == 0) {
return;
}
try {
if (fShowActivity) {
System.out.println("Indexer: parsing " + file + " up front"); //$NON-NLS-1$ //$NON-NLS-2$
}
long start= System.currentTimeMillis();
IASTTranslationUnit ast= null;
ILanguage l = fIndexer.getLanguageMapper().getLanguage(file);
final protected AbstractLanguage[] getLanguages(String filename) {
ILanguage l = fIndexer.getLanguageMapper().getLanguage(filename);
if (l instanceof AbstractLanguage) {
AbstractLanguage lang= (AbstractLanguage) l;
IScannerInfo scanInfo = fIndexer.getScannerInfo();
String code= "#include \"" + file + "\"\n"; //$NON-NLS-1$ //$NON-NLS-2$
if (fDummyFileName == null) {
fDummyFileName= file + "___"; //$NON-NLS-1$
fDummyFileURI= findLocation(fDummyFileName).getURI();
}
CodeReader codeReader= new CodeReader(fDummyFileName, code.toCharArray());
ast= createAST(lang, codeReader, scanInfo, options, pm);
}
fStatistics.fParsingTime += System.currentTimeMillis()-start;
if (ast != null) {
addSymbols(ast, index, readlockCount, 0, pm);
updateInfo(-1, +1, 0);
}
}
catch (CoreException e) {
e.printStackTrace();
}
catch (RuntimeException e) {
e.printStackTrace();
}
catch (Error e) {
e.printStackTrace();
return new AbstractLanguage[] {(AbstractLanguage) l};
}
return new AbstractLanguage[0];
}
/**
* Overriders must call super.needToUpdate(). If <code>false</code> is returned
* this must be passed on to their caller:
* <pre>
* if (super.needToUpdate()) {
* // your code
* }
* return false;
*/
protected boolean needToUpdate(IIndexFileLocation fileLoc, int configHash) throws CoreException {
return fDummyFileURI==null || !fDummyFileURI.equals(fileLoc.getURI());
protected final IWritableIndex createIndex() {
return fIndexer.getIndex();
}
private IIndexFileLocation findContext(IIndex index, IIndexFileLocation location) {
Object cachedContext= fContextMap.get(location);
if (cachedContext != null) {
return cachedContext == NO_CONTEXT ? null : (IIndexFileLocation) cachedContext;
}
IIndexFileLocation context= null;
fContextMap.put(location, NO_CONTEXT); // prevent recursion
IIndexFile pdomFile;
try {
pdomFile = index.getFile(location);
if (pdomFile != null) {
IIndexInclude[] includedBy = index.findIncludedBy(pdomFile, IIndex.DEPTH_ZERO);
ArrayList/*<IIndexFileLocation>*/ paths= new ArrayList/*<IIndexFileLocation>*/(includedBy.length);
for (int i = 0; i < includedBy.length; i++) {
IIndexInclude include = includedBy[i];
IIndexFileLocation incLocation = include.getIncludedByLocation();
if (isValidSourceUnitName(incLocation.getFullPath())) {
context = incLocation;
if (context != null) {
fContextMap.put(location, context);
return context;
}
}
paths.add(incLocation);
}
for (Iterator/*<IIndexFileLocation>*/ iter = paths.iterator(); iter.hasNext();) {
IIndexFileLocation nextLevel = (IIndexFileLocation) iter.next();
context = findContext(index, nextLevel);
if (context != null) {
fContextMap.put(location, context);
return context;
}
}
}
} catch (CoreException e) {
CCorePlugin.log(e);
}
return null;
}
/**
* Conveninence method for subclasses, removes a translation unit from the index.
* @since 4.0
*/
protected void removeTU(IWritableIndex index, IIndexFileLocation ifl, int readlocks) throws CoreException, InterruptedException {
index.acquireWriteLock(readlocks);
try {
IIndexFragmentFile file = (IIndexFragmentFile) index.getFile(ifl);
if (file != null)
index.clearFile(file, null);
} finally {
index.releaseWriteLock(readlocks);
}
public final void run(IProgressMonitor monitor) throws InterruptedException {
long start = System.currentTimeMillis();
runTask(monitor);
traceEnd(start);
}
protected void traceEnd(long start) {
@ -425,75 +166,4 @@ public abstract class StandaloneIndexerTask extends PDOMWriter{
}
}
}
public abstract void run(IProgressMonitor monitor) throws IOException;
protected IIndexFileLocation getIndexFileLocation(String path) {
String absolutePath = new File(path).getAbsolutePath();
//Standalone indexing stores the absolute paths of files being indexed
return new IndexFileLocation(URIUtil.toURI(absolutePath),absolutePath);
}
protected boolean isValidSourceUnitName(String filename) {
IPath path = new Path(filename);
if (fIndexer.getValidSourceUnitNames() == null || fIndexer.getValidSourceUnitNames().size() == 0)
return true;
return fIndexer.getValidSourceUnitNames().contains(path.getFileExtension());
}
protected long getLastModified(IIndexFileLocation location) {
return new File(location.getFullPath()).lastModified();
}
protected static int computeHashCode(IScannerInfo scannerInfo) {
int result= 0;
Map macros= scannerInfo.getDefinedSymbols();
if (macros != null) {
for (Iterator i = macros.entrySet().iterator(); i.hasNext();) {
Map.Entry entry = (Map.Entry) i.next();
String key = (String) entry.getKey();
String value = (String) entry.getValue();
result= addToHashcode(result, key);
if (value != null && value.length() > 0) {
result= addToHashcode(result, value);
}
}
}
String[] a= scannerInfo.getIncludePaths();
if (a != null) {
for (int i = 0; i < a.length; i++) {
result= addToHashcode(result, a[i]);
}
}
if (scannerInfo instanceof IExtendedScannerInfo) {
IExtendedScannerInfo esi= (IExtendedScannerInfo) scannerInfo;
a= esi.getIncludeFiles();
if (a != null) {
for (int i = 0; i < a.length; i++) {
result= addToHashcode(result, a[i]);
}
}
a= esi.getLocalIncludePath();
if (a != null) {
for (int i = 0; i < a.length; i++) {
result= addToHashcode(result, a[i]);
}
}
a= esi.getMacroFiles();
if (a != null) {
for (int i = 0; i < a.length; i++) {
result= addToHashcode(result, a[i]);
}
}
}
return result;
}
private static int addToHashcode(int result, String key) {
return result*31 + key.hashCode();
}
}

View file

@ -28,9 +28,6 @@ class LocationCtxFile extends LocationCtxContainer {
public final void addChildSequenceLength(int childLength) {
super.addChildSequenceLength(childLength);
if (fASTInclude != null) {
fASTInclude.setLength(fASTInclude.getLength()+childLength);
}
}
public final String getFilePath() {

View file

@ -0,0 +1,38 @@
/*******************************************************************************
* Copyright (c) 2007 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom;
import org.eclipse.cdt.core.index.IIndexFileLocation;
/**
* Abstract class for resolving paths as computed by the parser.
* @since 5.0
*/
public abstract class ASTFilePathResolver {
/**
* Resolve a path as stored in the AST.
* @return an index file location.
*/
public abstract IIndexFileLocation resolveASTPath(String astFilePath);
/**
* Resolve a path for an inclusion as computed by the preprocessor. Check for existance
* and return <code>null</code> if the file does not exist.
* @return an index file location or <code>null</code> if the file does not exist.
*/
public abstract IIndexFileLocation resolveIncludeFile(String includePath);
/**
* Convert an index file location to the path as it will be stored in the AST.
*/
public abstract String getASTPath(IIndexFileLocation ifl);
}

View file

@ -0,0 +1,782 @@
/*******************************************************************************
* Copyright (c) 2007 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom;
import java.net.URI;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ICodeReaderFactory;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit.IDependencyTree;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit.IDependencyTree.IASTInclusionNode;
import org.eclipse.cdt.core.index.IIndexFile;
import org.eclipse.cdt.core.index.IIndexFileLocation;
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.IndexLocationFactory;
import org.eclipse.cdt.core.model.AbstractLanguage;
import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.IExtendedScannerInfo;
import org.eclipse.cdt.core.parser.IMacro;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.ParserUtil;
import org.eclipse.cdt.core.parser.ScannerInfo;
import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
import org.eclipse.cdt.internal.core.index.IWritableIndex;
import org.eclipse.cdt.internal.core.index.IndexBasedCodeReaderFactory;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMMacro;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
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.Path;
/**
* Task for the actual indexing. Various indexers need to implement the abstract methods.
* @since 5.0
*/
public abstract class AbstractIndexerTask extends PDOMWriter {
private static final int MAX_ERRORS = 500;
private static class FileKey {
final URI fUri;
final int fLinkageID;
public FileKey(int linkageID, URI uri) {
fUri= uri;
fLinkageID= linkageID;
}
public int hashCode() {
return fUri.hashCode() * 31 + fLinkageID;
}
public boolean equals(Object obj) {
FileKey other = (FileKey) obj;
return fLinkageID == other.fLinkageID && fUri.equals(other.fUri);
}
}
private static class FileInfo {
IIndexFile fIndexFile= null;
boolean fRequestUpdate= false;
boolean fIsUpdated= false;
public IMacro[] fMacros;
}
private int fUpdateFlags= IIndexManager.UPDATE_ALL;
private boolean fIndexHeadersWithoutContext= true;
private boolean fIndexFilesWithoutConfiguration= true;
private HashMap fFileInfos= new HashMap();
private Object[] fFilesToUpdate;
private List fFilesToRemove = new ArrayList();
private List fFilesUpFront= new ArrayList();
private int fASTOptions;
protected IWritableIndex fIndex;
private ITodoTaskUpdater fTodoTaskUpdater;
private final boolean fIsFastIndexer;
private ICodeReaderFactory fCodeReaderFactory;
public AbstractIndexerTask(Object[] filesToUpdate, Object[] filesToRemove, IndexerInputAdapter resolver, boolean fastIndexer) {
super(resolver);
fIsFastIndexer= fastIndexer;
fFilesToUpdate= filesToUpdate;
fFilesToRemove.addAll(Arrays.asList(filesToRemove));
updateInfo(0, 0, fFilesToUpdate.length + fFilesToRemove.size());
}
public final void setIndexHeadersWithoutContext(boolean val) {
fIndexHeadersWithoutContext= val;
}
public final void setIndexFilesWithoutBuildConfiguration(boolean val) {
fIndexFilesWithoutConfiguration= val;
}
public final void setUpdateFlags(int flags) {
fUpdateFlags= flags;
}
public final void setParseUpFront(String[] astFilePaths) {
fFilesUpFront.addAll(Arrays.asList(astFilePaths));
}
protected abstract IWritableIndex createIndex();
protected abstract ICodeReaderFactory createReaderFactory();
protected abstract AbstractLanguage[] getLanguages(String fileName);
protected ITodoTaskUpdater createTodoTaskUpdater() {
return null;
}
protected IScannerInfo createDefaultScannerConfig(int linkageID) {
return new ScannerInfo();
}
protected String getASTPathForParsingUpFront() {
return "______"; //$NON-NLS-1$
}
private final IASTTranslationUnit createAST(String code, AbstractLanguage lang, IScannerInfo scanInfo,
int options, IProgressMonitor monitor) throws CoreException {
String dummyName= getASTPathForParsingUpFront();
if (dummyName != null) {
IIndexFileLocation dummyLoc= fResolver.resolveASTPath(dummyName);
setIndexed(lang.getLinkageID(), dummyLoc);
CodeReader codeReader= new CodeReader(dummyName, code.toCharArray());
return createAST(lang, codeReader, scanInfo, options, monitor);
}
return null;
}
private final IASTTranslationUnit createAST(Object tu, AbstractLanguage language, IScannerInfo scanInfo, int options, IProgressMonitor pm)
throws CoreException {
final CodeReader codeReader= fResolver.getCodeReader(tu);
if (codeReader == null) {
return null;
}
IASTTranslationUnit ast= createAST(language, codeReader, scanInfo, options, pm);
if (ast != null && !fResolver.isSourceUnit(tu)) {
ast.setIsHeaderUnit(true);
}
return ast;
}
private final IASTTranslationUnit createAST(AbstractLanguage language, CodeReader codeReader,
IScannerInfo scanInfo, int options, IProgressMonitor pm) throws CoreException {
if (fCodeReaderFactory == null) {
if (fIsFastIndexer) {
fCodeReaderFactory= new IndexBasedCodeReaderFactory(fIndex, fResolver, language.getLinkageID(), createReaderFactory(), this);
}
else {
fCodeReaderFactory= createReaderFactory();
}
}
else if (fIsFastIndexer) {
((IndexBasedCodeReaderFactory) fCodeReaderFactory).setLinkage(language.getLinkageID());
}
try {
IASTTranslationUnit ast= language.getASTTranslationUnit(codeReader, scanInfo, fCodeReaderFactory, fIndex, options, ParserUtil.getParserLogService());
if (pm.isCanceled()) {
return null;
}
return ast;
}
finally {
if (fIsFastIndexer) {
((IndexBasedCodeReaderFactory) fCodeReaderFactory).cleanupAfterTranslationUnit();
}
}
}
public final void runTask(IProgressMonitor monitor) throws InterruptedException {
if (!fIndexFilesWithoutConfiguration) {
fIndexHeadersWithoutContext= false;
}
fIndex= createIndex();
if (fIndex == null) {
return;
}
fTodoTaskUpdater= createTodoTaskUpdater();
fASTOptions= AbstractLanguage.OPTION_ADD_COMMENTS | AbstractLanguage.OPTION_NO_IMAGE_LOCATIONS;
if (getSkipReferences() == SKIP_ALL_REFERENCES) {
fASTOptions |= AbstractLanguage.OPTION_SKIP_FUNCTION_BODIES;
}
fIndex.resetCacheCounters();
fIndex.acquireReadLock();
try {
try {
// split into sources and headers, remove excluded sources.
final HashMap files= new HashMap();
final ArrayList ifilesToRemove= new ArrayList();
extractFiles(files, ifilesToRemove, monitor);
// remove files from index
removeFilesInIndex(fFilesToRemove, ifilesToRemove, monitor);
parseFilesUpFront(monitor);
parseLinkage(ILinkage.CPP_LINKAGE_ID, files, monitor);
parseLinkage(ILinkage.C_LINKAGE_ID, files, monitor);
}
finally {
fIndex.flush();
}
}
catch (CoreException e) {
CCorePlugin.log(e);
}
finally {
fIndex.releaseReadLock();
}
}
private void extractFiles(Map files, List iFilesToRemove, IProgressMonitor monitor) throws CoreException {
final boolean force= (fUpdateFlags & IIndexManager.UPDATE_ALL) != 0;
final boolean checkTimestamps= (fUpdateFlags & IIndexManager.UPDATE_CHECK_TIMESTAMPS) != 0;
final boolean checkConfig= (fUpdateFlags & IIndexManager.UPDATE_CHECK_CONFIGURATION) != 0;
int count= 0;
for (int i = 0; i < fFilesToUpdate.length; i++) {
if (monitor.isCanceled())
return;
final Object tu= fFilesToUpdate[i];
final IIndexFileLocation ifl= fResolver.resolveFile(tu);
final boolean isSourceUnit= fResolver.isSourceUnit(tu);
final boolean isExcludedSource= isSourceUnit && !fIndexFilesWithoutConfiguration && !fResolver.isFileBuildConfigured(tu);
final IIndexFragmentFile[] indexFiles= fIndex.getWritableFiles(ifl);
if ((isSourceUnit && !isExcludedSource) || fIndexHeadersWithoutContext) {
// headers or sources required with a specific linkage
AbstractLanguage[] langs= fResolver.getLanguages(tu);
for (int j = 0; j < langs.length; j++) {
int linkageID = langs[j].getLinkageID();
IIndexFragmentFile ifile= getFile(linkageID, indexFiles);
if (ifile == null || !ifile.hasContent()) {
store(tu, linkageID, isSourceUnit, files);
requestUpdate(linkageID, ifl, null);
count++;
}
else {
takeFile(ifile, indexFiles);
boolean update= false;
if (checkConfig) {
update= isSourceUnit ? isSourceUnitConfigChange(tu, ifile) : isHeaderConfigChange(tu, ifile);
}
update= update || force || (checkTimestamps && fResolver.getLastModified(ifl) != ifile.getTimestamp());
if (update) {
requestUpdate(linkageID, ifl, ifile);
store(tu, linkageID, isSourceUnit, files);
count++;
}
}
}
}
// handle other files present in index
for (int j = 0; j < indexFiles.length; j++) {
IIndexFragmentFile ifile = indexFiles[j];
if (ifile != null && ifile.hasContent()) {
IIndexInclude ctx= ifile.getParsedInContext();
if (ctx == null) {
iFilesToRemove.add(ifile);
count++;
}
else {
boolean update= false;
if (checkConfig && ifile.getParsedInContext() != null) {
update= isHeaderConfigChange(tu, ifile);
}
update= update || force || (checkTimestamps && fResolver.getLastModified(ifl) != ifile.getTimestamp());
if (update) {
final int linkageID = ifile.getLinkageID();
requestUpdate(linkageID, ifl, ifile);
store(tu, linkageID, false, files);
count++;
}
}
}
}
}
updateInfo(0, 0, count-fFilesToUpdate.length);
fFilesToUpdate= null;
}
private void requestUpdate(int linkageID, IIndexFileLocation ifl, IIndexFragmentFile ifile) {
FileKey key= new FileKey(linkageID, ifl.getURI());
FileInfo info= (FileInfo) fFileInfos.get(key);
if (info == null) {
info= createFileInfo(key, null);
}
info.fIndexFile= ifile;
info.fRequestUpdate= true;
}
private void setIndexed(int linkageID, IIndexFileLocation ifl) {
FileKey key= new FileKey(linkageID, ifl.getURI());
FileInfo info= (FileInfo) fFileInfos.get(key);
if (info == null) {
info= createFileInfo(key, null);
}
info.fIsUpdated= true;
info.fMacros= null;
}
private FileInfo createFileInfo(FileKey key, IIndexFile ifile) {
FileInfo info = new FileInfo();
fFileInfos.put(key, info);
info.fIndexFile= ifile;
return info;
}
private FileInfo getFileInfo(int linkageID, IIndexFileLocation ifl) {
FileKey key= new FileKey(linkageID, ifl.getURI());
return (FileInfo) fFileInfos.get(key);
}
private boolean isSourceUnitConfigChange(Object tu, IIndexFragmentFile ifile) {
return false;
}
private boolean isHeaderConfigChange(Object tu, IIndexFragmentFile ifile) {
return false;
}
private IIndexFragmentFile getFile(int linkageID, IIndexFragmentFile[] indexFiles) throws CoreException {
for (int i = 0; i < indexFiles.length; i++) {
IIndexFragmentFile ifile = indexFiles[i];
if (ifile != null && ifile.getLinkageID() == linkageID) {
return ifile;
}
}
return null;
}
private void takeFile(IIndexFragmentFile ifile, IIndexFragmentFile[] indexFiles) {
for (int i = 0; i < indexFiles.length; i++) {
if (indexFiles[i] == ifile) {
indexFiles[i]= null;
return;
}
}
}
private void store(Object tu, int linkageID, boolean isSourceUnit, Map files) {
Integer key = getFileListKey(linkageID, isSourceUnit);
List list= (List) files.get(key);
if (list == null) {
list= new LinkedList();
files.put(key, list);
}
list.add(tu);
}
private Integer getFileListKey(int linkageID, boolean isSourceUnit) {
Integer key= new Integer(linkageID*2 + (isSourceUnit ? 0 : 1));
return key;
}
private void removeFilesInIndex(List filesToRemove, List ifilesToRemove, IProgressMonitor monitor) throws InterruptedException, CoreException {
if (!filesToRemove.isEmpty() || !ifilesToRemove.isEmpty()) {
fIndex.acquireWriteLock(1);
try {
for (Iterator iterator = fFilesToRemove.iterator(); iterator.hasNext();) {
if (monitor.isCanceled()) {
return;
}
final Object tu = iterator.next();
IIndexFileLocation ifl= fResolver.resolveFile(tu);
IIndexFragmentFile[] ifiles= fIndex.getWritableFiles(ifl);
for (int i = 0; i < ifiles.length; i++) {
IIndexFragmentFile ifile = ifiles[i];
fIndex.clearFile(ifile, null);
}
updateInfo(0, 0, -1);
}
for (Iterator iterator = ifilesToRemove.iterator(); iterator.hasNext();) {
if (monitor.isCanceled()) {
return;
}
IIndexFragmentFile ifile= (IIndexFragmentFile) iterator.next();
fIndex.clearFile(ifile, null);
updateInfo(0, 0, -1);
}
} finally {
fIndex.releaseWriteLock(1);
}
}
fFilesToRemove.clear();
}
private void parseFilesUpFront(IProgressMonitor monitor) throws CoreException {
for (Iterator iter = fFilesUpFront.iterator(); iter.hasNext();) {
if (monitor.isCanceled()) {
return;
}
String upfront= (String) iter.next();
String filePath = upfront;
filePath= filePath.trim();
if (filePath.length() == 0) {
continue;
}
final IPath path= new Path(filePath);
final String fileName = path.lastSegment();
try {
if (fShowActivity) {
System.out.println("Indexer: parsing " + filePath + " up front"); //$NON-NLS-1$ //$NON-NLS-2$
}
monitor.subTask(MessageFormat.format(Messages.AbstractIndexerTask_parsingFileTask,
new Object[]{fileName, path.removeLastSegments(1).toString()}));
AbstractLanguage[] langs= getLanguages(fileName);
for (int i = 0; i < langs.length; i++) {
AbstractLanguage lang= langs[i];
int linkageID= lang.getLinkageID();
String code= "#include \"" + filePath + "\"\n"; //$NON-NLS-1$ //$NON-NLS-2$
IScannerInfo scanInfo= createDefaultScannerConfig(linkageID);
if (scanInfo != null) {
long start= System.currentTimeMillis();
IASTTranslationUnit ast= createAST(code, lang, scanInfo, fASTOptions, monitor);
fStatistics.fParsingTime += System.currentTimeMillis()-start;
if (ast != null) {
writeToIndex(linkageID, ast, computeHashCode(scanInfo), monitor);
updateInfo(0, 1, 0);
}
}
}
}
catch (OutOfMemoryError e) {
throw e;
}
catch (Throwable e) {
swallowError(path, e);
}
}
fFilesUpFront.clear();
}
private void parseLinkage(int linkageID, Map fileListMap, IProgressMonitor monitor) throws CoreException, InterruptedException {
// sources
List files= (List) fileListMap.get(getFileListKey(linkageID, true));
if (files != null) {
for (Iterator iter = files.iterator(); iter.hasNext();) {
if (monitor.isCanceled())
return;
final Object tu= iter.next();
final IIndexFileLocation ifl = fResolver.resolveFile(tu);
final FileInfo info= getFileInfo(linkageID, ifl);
if (info != null && info.fRequestUpdate && !info.fIsUpdated) {
final IScannerInfo scannerInfo= fResolver.getBuildConfiguration(linkageID, tu);
parseFile(tu, linkageID, ifl, scannerInfo, monitor);
if (info.fIsUpdated) {
updateInfo(1, 0, 0); // a source file was parsed
}
}
}
files.clear();
}
// headers with context
HashMap contextMap= new HashMap();
files= (List) fileListMap.get(getFileListKey(linkageID, false));
if (files != null) {
for (Iterator iter = files.iterator(); iter.hasNext();) {
if (monitor.isCanceled())
return;
final Object header= iter.next();
final IIndexFileLocation ifl = fResolver.resolveFile(header);
final FileInfo info= getFileInfo(linkageID, ifl);
if (info != null && info.fRequestUpdate && !info.fIsUpdated) {
if (info.fIndexFile != null && fIndex.isWritableFile(info.fIndexFile)) {
Object tu= findContext((IIndexFragmentFile) info.fIndexFile, contextMap);
if (tu != null) {
final IScannerInfo scannerInfo= fResolver.getBuildConfiguration(linkageID, tu);
parseFile(tu, linkageID, fResolver.resolveFile(tu), scannerInfo, monitor);
if (info.fIsUpdated) {
updateInfo(0, 1, 0); // a header was parsed in context
iter.remove();
}
}
}
}
else {
// file was already parsed.
iter.remove();
}
}
// headers without context
contextMap= null;
for (Iterator iter = files.iterator(); iter.hasNext();) {
if (monitor.isCanceled())
return;
final Object header= iter.next();
final IIndexFileLocation ifl = fResolver.resolveFile(header);
final FileInfo info= getFileInfo(linkageID, ifl);
if (info != null && info.fRequestUpdate && !info.fIsUpdated) {
final IScannerInfo scannerInfo= fResolver.getBuildConfiguration(linkageID, header);
parseFile(header, linkageID, ifl, scannerInfo, monitor);
if (info.fIsUpdated) {
updateInfo(-1, 1, 0); // a header was parsed without context
iter.remove();
}
}
}
}
}
private static Object NO_CONTEXT= new Object();
private Object findContext(IIndexFragmentFile ifile, HashMap contextMap) {
Object cachedContext= contextMap.get(ifile);
if (cachedContext != null) {
return cachedContext == NO_CONTEXT ? null : cachedContext;
}
try {
Object context= fResolver.getInputFile(ifile.getLocation());
if (context != null) {
contextMap.put(ifile, context);
return context;
}
contextMap.put(ifile, NO_CONTEXT); // prevent recursion
final IIndexInclude contextInclude= ifile.getParsedInContext();
if (contextInclude != null) {
final IIndexFragmentFile contextIFile= (IIndexFragmentFile) contextInclude.getIncludedBy();
context= findContext(contextIFile, contextMap);
if (context != null) {
contextMap.put(ifile, context);
return context;
}
}
} catch (CoreException e) {
CCorePlugin.log(e);
}
return null;
}
private void parseFile(Object tu, int linkageID, IIndexFileLocation ifl, IScannerInfo scanInfo, IProgressMonitor pm) throws CoreException, InterruptedException {
IPath path= getPathForLabel(ifl);
AbstractLanguage[] langs= fResolver.getLanguages(tu);
AbstractLanguage lang= null;
for (int i = 0; i < langs.length; i++) {
if (langs[i].getLinkageID() == linkageID) {
lang= langs[i];
break;
}
}
if (lang==null) {
return;
}
try {
if (fShowActivity) {
System.out.println("Indexer: parsing " + path.toOSString()); //$NON-NLS-1$
}
pm.subTask(MessageFormat.format(Messages.AbstractIndexerTask_parsingFileTask,
new Object[]{path.lastSegment(), path.removeLastSegments(1).toString()}));
long start= System.currentTimeMillis();
IASTTranslationUnit ast= createAST(tu, lang, scanInfo, fASTOptions, pm);
fStatistics.fParsingTime += System.currentTimeMillis()-start;
if (ast != null) {
writeToIndex(linkageID, ast, computeHashCode(scanInfo), pm);
}
}
catch (CoreException e) {
swallowError(path, e);
}
catch (RuntimeException e) {
swallowError(path, e);
}
catch (PDOMNotImplementedError e) {
swallowError(path, e);
}
}
private void writeToIndex(final int linkageID, IASTTranslationUnit ast, int configHash, IProgressMonitor pm) throws CoreException, InterruptedException {
HashSet enteredASTFilePaths= new HashSet();
ArrayList orderedIFLs= new ArrayList();
final String astPath = ast.getFilePath();
enteredASTFilePaths.add(astPath);
IDependencyTree tree= ast.getDependencyTree();
IASTInclusionNode[] inclusions= tree.getInclusions();
for (int i=0; i < inclusions.length; i++) {
collectOrderedIFLs(linkageID, inclusions[i], enteredASTFilePaths, orderedIFLs);
}
IIndexFileLocation ifl= fResolver.resolveASTPath(astPath);
FileInfo info= getFileInfo(linkageID, ifl);
if (info != null && info.fRequestUpdate && !info.fIsUpdated) {
orderedIFLs.add(fResolver.resolveASTPath(astPath));
}
IIndexFileLocation[] ifls= (IIndexFileLocation[]) orderedIFLs.toArray(new IIndexFileLocation[orderedIFLs.size()]);
addSymbols(ast, ifls, fIndex, 1, false, configHash, fTodoTaskUpdater, pm);
for (int i = 0; i < ifls.length; i++) {
ifl= ifls[i];
info= getFileInfo(linkageID, ifl);
assert info != null;
if (info != null) {
info.fIsUpdated= true;
}
}
}
private void collectOrderedIFLs(final int linkageID, IASTInclusionNode inclusion, HashSet enteredASTFilePaths, ArrayList orderedIFLs) throws CoreException {
final IASTPreprocessorIncludeStatement id= inclusion.getIncludeDirective();
if (id.isActive() && id.isResolved()) {
final String path= id.getPath();
final boolean isFirst= enteredASTFilePaths.add(path);
IASTInclusionNode[] nested= inclusion.getNestedInclusions();
for (int i = 0; i < nested.length; i++) {
collectOrderedIFLs(linkageID, nested[i], enteredASTFilePaths, orderedIFLs);
}
if (isFirst) {
final IIndexFileLocation ifl= fResolver.resolveASTPath(path);
if (needToUpdateHeader(linkageID, ifl)) {
orderedIFLs.add(ifl);
}
}
}
}
public final boolean needToUpdateHeader(int linkageID, IIndexFileLocation ifl) throws CoreException {
FileInfo info= getFileInfo(linkageID, ifl);
if (info == null) {
IIndexFile ifile= null;
if (fResolver.canBePartOfSDK(ifl)) {
ifile= fIndex.getFile(linkageID, ifl);
}
else {
IIndexFragmentFile fragFile= fIndex.getWritableFile(linkageID, ifl);
if (fragFile != null && fragFile.hasContent()) {
ifile= fragFile;
}
}
info= createFileInfo(new FileKey(linkageID, ifl.getURI()), ifile);
if (ifile == null) {
if (info.fRequestUpdate && !info.fIsUpdated) {
updateInfo(0,0,-1); // header found implicitly
}
info.fRequestUpdate= true;
}
}
return !info.fIsUpdated && info.fRequestUpdate;
}
private IPath getPathForLabel(IIndexFileLocation ifl) {
String fullPath= ifl.getFullPath();
if (fullPath != null) {
return new Path(fullPath);
}
IPath path= IndexLocationFactory.getAbsolutePath(ifl);
if (path != null) {
return path;
}
URI uri= ifl.getURI();
return new Path(uri.getPath());
}
private void swallowError(IPath file, Throwable e) throws CoreException {
if (e instanceof CoreException) {
CCorePlugin.log(((CoreException) e).getStatus());
}
else {
IStatus status= CCorePlugin.createStatus(
MessageFormat.format(Messages.AbstractIndexerTask_errorWhileParsing, new Object[]{file}), e);
CCorePlugin.log(status);
}
if (++fStatistics.fErrorCount > MAX_ERRORS) {
throw new CoreException(CCorePlugin.createStatus(Messages.AbstractIndexerTask_tooManyIndexProblems));
}
}
private static int computeHashCode(IScannerInfo scannerInfo) {
int result= 0;
Map macros= scannerInfo.getDefinedSymbols();
if (macros != null) {
for (Iterator i = macros.entrySet().iterator(); i.hasNext();) {
Map.Entry entry = (Map.Entry) i.next();
String key = (String) entry.getKey();
String value = (String) entry.getValue();
result= addToHashcode(result, key);
if (value != null && value.length() > 0) {
result= addToHashcode(result, value);
}
}
}
String[] a= scannerInfo.getIncludePaths();
if (a != null) {
for (int i = 0; i < a.length; i++) {
result= addToHashcode(result, a[i]);
}
}
if (scannerInfo instanceof IExtendedScannerInfo) {
IExtendedScannerInfo esi= (IExtendedScannerInfo) scannerInfo;
a= esi.getIncludeFiles();
if (a != null) {
for (int i = 0; i < a.length; i++) {
result= addToHashcode(result, a[i]);
}
}
a= esi.getLocalIncludePath();
if (a != null) {
for (int i = 0; i < a.length; i++) {
result= addToHashcode(result, a[i]);
}
}
a= esi.getMacroFiles();
if (a != null) {
for (int i = 0; i < a.length; i++) {
result= addToHashcode(result, a[i]);
}
}
}
return result;
}
private static int addToHashcode(int result, String key) {
return result*31 + key.hashCode();
}
public final IMacro[] getConvertedMacros(int linkageID, IIndexFileLocation ifl) throws CoreException {
if (!needToUpdateHeader(linkageID, ifl)) {
FileInfo info= getFileInfo(linkageID, ifl);
assert info != null;
if (info != null) {
if (info.fIndexFile == null) {
info.fIndexFile= fIndex.getFile(linkageID, ifl);
if (info.fIndexFile == null) {
return null;
}
}
IMacro[] result= info.fMacros;
if (result == null) {
IIndexMacro[] macros= info.fIndexFile.getMacros();
result= new IMacro[macros.length];
for (int i = 0; i < macros.length; i++) {
IIndexMacro macro = macros[i];
result[i]= ((PDOMMacro)macro).getMacro();
}
info.fMacros= result;
}
return result;
}
}
return null;
}
}

View file

@ -0,0 +1,73 @@
/*******************************************************************************
* Copyright (c) 2007 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.model.AbstractLanguage;
import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.IScannerInfo;
/**
* Abstract class to obtain information about the input to the indexer. For the
* project based indexers the input are translation units, for the stand-alone
* indexer they are file-paths represented as strings.
* @since 5.0
*/
public abstract class IndexerInputAdapter extends ASTFilePathResolver {
/**
* Returns an object representing an input file for the given index location,
* or <code>null</code>, if it does not exist.
*/
public abstract Object getInputFile(IIndexFileLocation location);
/**
* Return the last modification date for the file denoted by the index location.
*/
public abstract long getLastModified(IIndexFileLocation location);
/**
* Create an index location for the given input file.
*/
public abstract IIndexFileLocation resolveFile(Object tu);
/**
* Tests whether the input file is a source unit.
*/
public abstract boolean isSourceUnit(Object tu);
/**
* Tests whether the input file is part of the build.
*/
public abstract boolean isFileBuildConfigured(Object tu);
/**
* Tests whether the file in the index is allowed to be part of an SDK. If not
* it will be indexed.
*/
public abstract boolean canBePartOfSDK(IIndexFileLocation ifl);
/**
* Obtains the languages the input file should be parsed with.
*/
public abstract AbstractLanguage[] getLanguages(Object tu);
/**
* Obtains the scanner configuration for the input file.
*/
public abstract IScannerInfo getBuildConfiguration(int linkageID, Object tu);
/**
* Returns a code reader for the given input file.
*/
public abstract CodeReader getCodeReader(Object tu);
}

View file

@ -9,7 +9,7 @@
* Markus Schorn - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.indexer;
package org.eclipse.cdt.internal.core.pdom;
public class IndexerStatistics {
public int fResolutionTime;

View file

@ -32,6 +32,9 @@ public class Messages extends NLS {
public static String TeamPDOMExportOperation_subtaskCreateDatabase;
public static String TeamPDOMExportOperation_taskExportIndex;
public static String WritablePDOM_error_unknownLinkage;
public static String AbstractIndexerTask_parsingFileTask;
public static String AbstractIndexerTask_errorWhileParsing;
public static String AbstractIndexerTask_tooManyIndexProblems;
static {
// initialize resource bundle
NLS.initializeMessages(BUNDLE_NAME, Messages.class);

View file

@ -90,7 +90,7 @@ public class PDOM extends PlatformObject implements IPDOM {
*/
public static final String FRAGMENT_PROPERTY_VALUE_FORMAT_ID= "org.eclipse.cdt.internal.core.pdom.PDOM"; //$NON-NLS-1$
public static final int CURRENT_VERSION = 51;
public static final int CURRENT_VERSION = 52;
public static final int MIN_SUPPORTED_VERSION= CURRENT_VERSION;
/**
@ -151,6 +151,7 @@ public class PDOM extends PlatformObject implements IPDOM {
*
* 50 - support for complex, imaginary and long long (bug 209049).
* 51 - modeling extern "C" (bug 191989)
* 52 - files per linkage (bug 191989)
*/
public static final int LINKAGES = Database.DATA_AREA;
@ -261,11 +262,15 @@ public class PDOM extends PlatformObject implements IPDOM {
return fileIndex;
}
public IIndexFragmentFile getFile(IIndexFileLocation location) throws CoreException {
return PDOMFile.findFile(this, getFileIndex(), location, locationConverter);
public IIndexFragmentFile getFile(int linkageID, IIndexFileLocation location) throws CoreException {
return PDOMFile.findFile(this, getFileIndex(), location, linkageID, locationConverter);
}
public List/*<IIndexFileLocation>*/ getAllFileLocations() throws CoreException {
public IIndexFragmentFile[] getFiles(IIndexFileLocation location) throws CoreException {
return PDOMFile.findFiles(this, getFileIndex(), location, locationConverter);
}
public IIndexFragmentFile[] getAllFiles() throws CoreException {
final List locations = new ArrayList();
getFileIndex().accept(new IBTreeVisitor(){
public int compare(int record) throws CoreException {
@ -273,17 +278,17 @@ public class PDOM extends PlatformObject implements IPDOM {
}
public boolean visit(int record) throws CoreException {
PDOMFile file = new PDOMFile(PDOM.this, record);
locations.add(file.getLocation());
locations.add(file);
return true;
}
});
return locations;
return (IIndexFragmentFile[]) locations.toArray(new IIndexFragmentFile[locations.size()]);
}
protected IIndexFragmentFile addFile(IIndexFileLocation location) throws CoreException {
IIndexFragmentFile file = getFile(location);
protected IIndexFragmentFile addFile(int linkageID, IIndexFileLocation location) throws CoreException {
IIndexFragmentFile file = getFile(linkageID, location);
if (file == null) {
PDOMFile pdomFile = new PDOMFile(this, location);
PDOMFile pdomFile = new PDOMFile(this, location, linkageID);
getFileIndex().insert(pdomFile.getRecord());
file= pdomFile;
}
@ -758,7 +763,7 @@ public class PDOM extends PlatformObject implements IPDOM {
return (PDOMFile) file;
}
return (PDOMFile) getFile(file.getLocation());
return (PDOMFile) getFile(file.getLinkageID(), file.getLocation());
}
public File getPath() {

View file

@ -93,6 +93,9 @@ public class PDOMIndexerJob extends Job {
System.out.println("Indexer: completed " + name + "[" + time + "ms]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
}
catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
catch (OperationCanceledException e) {
}
}

View file

@ -64,10 +64,10 @@ import org.eclipse.cdt.internal.core.pdom.PDOM.IListener;
import org.eclipse.cdt.internal.core.pdom.db.ChunkCache;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMProjectIndexLocationConverter;
import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences;
import org.eclipse.cdt.internal.core.pdom.indexer.PDOMNullIndexer;
import org.eclipse.cdt.internal.core.pdom.indexer.PDOMRebuildTask;
import org.eclipse.cdt.internal.core.pdom.indexer.PDOMUpdateTask;
import org.eclipse.cdt.internal.core.pdom.indexer.TriggerNotificationTask;
import org.eclipse.cdt.internal.core.pdom.indexer.nulli.PDOMNullIndexer;
import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;

View file

@ -120,13 +120,20 @@ public class PDOMProxy implements IPDOM {
return 0;
}
public synchronized IIndexFragmentFile getFile(IIndexFileLocation location) throws CoreException {
public synchronized IIndexFragmentFile getFile(int linkageID, IIndexFileLocation location) throws CoreException {
if (fDelegate != null)
return fDelegate.getFile(location);
return fDelegate.getFile(linkageID, location);
return null;
}
public synchronized IIndexFragmentFile[] getFiles(IIndexFileLocation location) throws CoreException {
if (fDelegate != null)
return fDelegate.getFiles(location);
return IIndexFragmentFile.EMPTY_ARRAY;
}
public synchronized long getLastWriteAccess() {
if (fDelegate != null)
return fDelegate.getLastWriteAccess();

View file

@ -17,7 +17,6 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@ -44,13 +43,10 @@ import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
import org.eclipse.cdt.internal.core.index.IWritableIndex;
import org.eclipse.cdt.internal.core.index.IndexFileLocation;
import org.eclipse.cdt.internal.core.index.IWritableIndex.IncludeInformation;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMASTAdapter;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
import org.eclipse.cdt.internal.core.pdom.indexer.IndexerASTVisitor;
import org.eclipse.cdt.internal.core.pdom.indexer.IndexerStatistics;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
@ -68,13 +64,15 @@ abstract public class PDOMWriter {
protected boolean fShowActivity;
protected boolean fShowProblems;
protected IndexerStatistics fStatistics;
protected final IndexerStatistics fStatistics;
protected final IndexerInputAdapter fResolver;
private IndexerProgress fInfo= new IndexerProgress();
private int fSkipReferences= SKIP_NO_REFERENCES;
public PDOMWriter() {
public PDOMWriter(IndexerInputAdapter resolver) {
fStatistics= new IndexerStatistics();
fResolver= resolver;
}
public void setShowActivity(boolean val) {
@ -93,36 +91,8 @@ abstract public class PDOMWriter {
fSkipReferences= options;
}
/**
* Called to check whether a translation unit still needs to be updated.
* @see #addSymbols(IASTTranslationUnit, IWritableIndex, int, IProgressMonitor)
* @since 4.0
*/
protected abstract boolean needToUpdate(IIndexFileLocation location, int confighash) throws CoreException;
/**
* Called after a file was added to the index.
* @return whether the file was actually requested by the indexer.
* @see #addSymbols(IASTTranslationUnit, IWritableIndex, int, IProgressMonitor)
* @since 4.0
*/
protected abstract boolean postAddToIndex(IIndexFileLocation location, IIndexFile file) throws CoreException;
/**
* Called to resolve an absolute path to an index file location.
* @since 4.0
*/
protected abstract IIndexFileLocation findLocation(String absolutePath);
/**
* Fully equivalent to
* <code>addSymbols(IASTTranslationUnit, IWritableIndex, int, true, int, null, IProgressMonitor)</code>.
* @since 4.0
*/
public void addSymbols(IASTTranslationUnit ast,
IWritableIndex index, int readlockCount,
int configHash, IProgressMonitor pm) throws InterruptedException, CoreException {
addSymbols(ast, index, readlockCount, true, configHash, null, pm);
public int getSkipReferences() {
return fSkipReferences;
}
/**
@ -137,24 +107,93 @@ abstract public class PDOMWriter {
* index after your last write operation.
* @since 4.0
*/
public void addSymbols(IASTTranslationUnit ast,
IWritableIndex index, int readlockCount, boolean flushIndex,
int configHash, ITodoTaskUpdater taskUpdater, IProgressMonitor pm) throws InterruptedException, CoreException {
public void addSymbols(IASTTranslationUnit ast, IIndexFileLocation[] ifls, IWritableIndex index,
int readlockCount, boolean flushIndex, int configHash, ITodoTaskUpdater taskUpdater, IProgressMonitor pm)
throws InterruptedException, CoreException {
final Map symbolMap= new HashMap();
for (int i = 0; i < ifls.length; i++) {
prepareInMap(symbolMap, ifls[i]);
}
ArrayList stati= new ArrayList();
IIndexFileLocation[] orderedPaths= null;
try {
HashSet contextIncludes= new HashSet();
orderedPaths= extractSymbols(ast, symbolMap, configHash, contextIncludes);
for (int i=0; i<orderedPaths.length; i++) {
extractSymbols(ast, symbolMap, contextIncludes);
// name resolution
resolveNames(symbolMap, ifls, stati, pm);
// index update
storeSymbolsInIndex(symbolMap, ifls, ast.getLinkage().getLinkageID(), configHash, contextIncludes, index, readlockCount, flushIndex, stati, pm);
if (taskUpdater != null) {
taskUpdater.updateTasks(ast.getComments(), ifls);
}
if (!stati.isEmpty()) {
String path= null;
if (ifls != null && ifls.length > 0) {
path= ifls[ifls.length-1].getURI().getPath();
}
else {
path= ast.getFilePath().toString();
}
String msg= NLS.bind(Messages.PDOMWriter_errorWhileParsing, path);
if (stati.size() == 1) {
IStatus status= (IStatus) stati.get(0);
if (msg.equals(status.getMessage())) {
throw new CoreException(status);
}
}
throw new CoreException(new MultiStatus(CCorePlugin.PLUGIN_ID, 0,
(IStatus[]) stati.toArray(new IStatus[stati.size()]), msg, null));
}
}
private void storeSymbolsInIndex(final Map symbolMap, IIndexFileLocation[] ifls, int linkageID, int configHash,
HashSet contextIncludes, IWritableIndex index, int readlockCount, boolean flushIndex,
ArrayList stati, IProgressMonitor pm) throws InterruptedException, CoreException {
index.acquireWriteLock(readlockCount);
long start= System.currentTimeMillis();
try {
for (int i=0; i<ifls.length; i++) {
if (pm.isCanceled())
return;
final IIndexFileLocation ifl= ifls[i];
if (ifl != null) {
if (fShowActivity) {
System.out.println("Indexer: adding " + ifl.getURI()); //$NON-NLS-1$
}
try {
storeFileInIndex(index, ifl, symbolMap, linkageID, configHash, contextIncludes);
} catch (RuntimeException e) {
stati.add(CCorePlugin.createStatus(
NLS.bind(Messages.PDOMWriter_errorWhileParsing, ifl.getURI().getPath()), e));
break;
} catch (PDOMNotImplementedError e) {
stati.add(CCorePlugin.createStatus(
NLS.bind(Messages.PDOMWriter_errorWhileParsing, ifl.getURI().getPath()), e));
break;
}
if (i<ifls.length-1) {
updateInfo(0, 1, 0); // update header count
}
}
}
} finally {
index.releaseWriteLock(readlockCount, flushIndex);
}
fStatistics.fAddToIndexTime+= System.currentTimeMillis()-start;
}
private void resolveNames(final Map symbolMap, IIndexFileLocation[] ifls, ArrayList stati, IProgressMonitor pm) {
long start= System.currentTimeMillis();
for (int i=0; i<ifls.length; i++) {
if (pm.isCanceled()) {
return;
}
IIndexFileLocation path= orderedPaths[i];
IIndexFileLocation path= ifls[i];
ArrayList[] arrayLists = ((ArrayList[]) symbolMap.get(path));
// resolve the names
long start= System.currentTimeMillis();
ArrayList names= arrayLists[2];
boolean reported= false;
for (Iterator j = names.iterator(); j.hasNext();) {
@ -192,152 +231,36 @@ abstract public class PDOMWriter {
j.remove();
}
}
}
fStatistics.fResolutionTime += System.currentTimeMillis()-start;
}
boolean isFirstRequest= true;
boolean isFirstAddition= true;
index.acquireWriteLock(readlockCount);
long start= System.currentTimeMillis();
try {
for (int i=0; i<orderedPaths.length; i++) {
if (pm.isCanceled())
return;
private void extractSymbols(IASTTranslationUnit ast, final Map symbolMap, Collection contextIncludes) throws CoreException {
IIndexFileLocation path = orderedPaths[i];
if (path != null) {
if (fShowActivity) {
System.out.println("Indexer: adding " + path.getURI()); //$NON-NLS-1$
}
IIndexFile file;
try {
file = addToIndex(index, path, symbolMap, configHash, contextIncludes);
} catch (RuntimeException e) {
stati.add(CCorePlugin.createStatus(
NLS.bind(Messages.PDOMWriter_errorWhileParsing, path.getURI().getPath()), e));
break;
} catch (PDOMNotImplementedError e) {
stati.add(CCorePlugin.createStatus(
NLS.bind(Messages.PDOMWriter_errorWhileParsing, path.getURI().getPath()), e));
break;
}
boolean wasRequested= postAddToIndex(path, file);
synchronized(fInfo) {
if (wasRequested) {
if (isFirstRequest)
isFirstRequest= false;
else
fInfo.fTotalSourcesEstimate--;
}
if (isFirstAddition)
isFirstAddition= false;
else
fInfo.fCompletedHeaders++;
}
}
}
} finally {
index.releaseWriteLock(readlockCount, flushIndex);
}
fStatistics.fAddToIndexTime+= System.currentTimeMillis()-start;
if (taskUpdater != null) {
taskUpdater.updateTasks(ast.getComments(), orderedPaths);
}
}
finally {
synchronized(fInfo) {
fInfo.fCompletedSources++;
}
}
if (!stati.isEmpty()) {
String path= null;
if (orderedPaths != null && orderedPaths.length > 0) {
path= orderedPaths[orderedPaths.length-1].getURI().getPath();
}
else {
path= ast.getFilePath().toString();
}
String msg= NLS.bind(Messages.PDOMWriter_errorWhileParsing, path);
if (stati.size() == 1) {
IStatus status= (IStatus) stati.get(0);
if (msg.equals(status.getMessage())) {
throw new CoreException(status);
}
}
throw new CoreException(new MultiStatus(CCorePlugin.PLUGIN_ID, 0,
(IStatus[]) stati.toArray(new IStatus[stati.size()]), msg, null));
}
}
private IIndexFileLocation[] extractSymbols(IASTTranslationUnit ast,
final Map symbolMap, int confighash, Collection contextIncludes) throws CoreException {
LinkedHashSet/*<IIndexFileLocation>*/ orderedIFLs= new LinkedHashSet/*<IIndexFileLocation>*/();
ArrayList/*<IIndexFileLocation>*/ iflStack= new ArrayList/*<IIndexFileLocation>*/();
HashMap firstIncludePerTarget= new HashMap();
final IIndexFileLocation astLocation = findLocation(ast.getFilePath());
IIndexFileLocation aboveStackIFL = astLocation;
final HashSet contextIFLs= new HashSet();
final IIndexFileLocation astIFL = fResolver.resolveASTPath(ast.getFilePath());
// includes
IASTPreprocessorIncludeStatement[] includes = ast.getIncludeDirectives();
for (int i= 0; i < includes.length; i++) {
final IASTPreprocessorIncludeStatement include = includes[i];
// check if we have left a file.
final IASTFileLocation tmpLoc = include.getFileLocation();
final IIndexFileLocation nextIFL= tmpLoc != null ? findLocation(tmpLoc.getFileName()) : astLocation; // command-line includes
while (!aboveStackIFL.equals(nextIFL)) {
if (!iflStack.isEmpty()) {
if (needToUpdate(aboveStackIFL, confighash)) {
prepareInMap(symbolMap, aboveStackIFL);
orderedIFLs.add(aboveStackIFL);
final IASTFileLocation astLoc= include.getFileLocation();
final IIndexFileLocation sourceIFL= astLoc != null ? fResolver.resolveASTPath(astLoc.getFileName()) : astIFL; // command-line includes
final boolean updateSource= symbolMap.containsKey(sourceIFL);
if (updateSource) {
addToMap(symbolMap, 0, sourceIFL, include);
}
aboveStackIFL= (IIndexFileLocation) iflStack.remove(iflStack.size()-1);
}
else {
assert false; // logics in parser is broken, still do something useful
iflStack.add(aboveStackIFL);
aboveStackIFL= nextIFL;
break;
}
}
// save include in map
if (needToUpdate(nextIFL, confighash)) {
prepareInMap(symbolMap, nextIFL);
addToMap(symbolMap, 0, nextIFL, include);
}
// prepare to go into next level
if (include.isResolved()) {
iflStack.add(nextIFL);
aboveStackIFL= findLocation(include.getPath());
if (include.isActive()) {
if (!firstIncludePerTarget.containsKey(aboveStackIFL)) {
firstIncludePerTarget.put(aboveStackIFL, include);
}
}
}
else if (include.isActive()) {
if (!include.isResolved()) {
reportProblem(include);
}
}
iflStack.add(aboveStackIFL);
while (!iflStack.isEmpty()) {
aboveStackIFL= (IIndexFileLocation) iflStack.remove(iflStack.size()-1);
if (needToUpdate(aboveStackIFL, confighash)) {
prepareInMap(symbolMap, aboveStackIFL);
orderedIFLs.add(aboveStackIFL);
else if (updateSource) {
// the include was parsed, check if we want to update the included file in the index
final IIndexFileLocation targetIFL= fResolver.resolveASTPath(include.getPath());
if (symbolMap.containsKey(targetIFL) && contextIFLs.add(targetIFL)) {
contextIncludes.add(include);
}
}
// extract context includes
for (Iterator iterator = orderedIFLs.iterator(); iterator.hasNext();) {
IndexFileLocation loc = (IndexFileLocation) iterator.next();
Object contextInclude= firstIncludePerTarget.get(loc);
if (contextInclude != null) {
contextIncludes.add(contextInclude);
}
}
@ -347,7 +270,7 @@ abstract public class PDOMWriter {
IASTPreprocessorMacroDefinition macro = macros[i2];
IASTFileLocation sourceLoc = macro.getFileLocation();
if (sourceLoc != null) { // skip built-ins and command line macros
IIndexFileLocation path2 = findLocation(sourceLoc.getFileName());
IIndexFileLocation path2 = fResolver.resolveASTPath(sourceLoc.getFileName());
addToMap(symbolMap, 1, path2, macro);
}
}
@ -368,13 +291,12 @@ abstract public class PDOMWriter {
if (name != null) {
IASTFileLocation nameLoc = name.getFileLocation();
if (nameLoc != null) {
IIndexFileLocation location = findLocation(nameLoc.getFileName());
IIndexFileLocation location = fResolver.resolveASTPath(nameLoc.getFileName());
addToMap(symbolMap, 2, location, new IASTName[]{name, caller});
}
}
}
});
return (IIndexFileLocation[]) orderedIFLs.toArray(new IIndexFileLocation[orderedIFLs.size()]);
}
protected boolean isInheritanceSpec(IASTName name) {
@ -439,16 +361,17 @@ abstract public class PDOMWriter {
return false;
}
private IIndexFragmentFile addToIndex(IWritableIndex index, IIndexFileLocation location, Map symbolMap, int configHash, Set contextIncludes) throws CoreException {
private IIndexFragmentFile storeFileInIndex(IWritableIndex index, IIndexFileLocation location, Map symbolMap,
int linkageID, int configHash, Set contextIncludes) throws CoreException {
Set clearedContexts= Collections.EMPTY_SET;
IIndexFragmentFile file= index.getWritableFile(location);
IIndexFragmentFile file= index.getWritableFile(linkageID, location);
if (file != null) {
clearedContexts= new HashSet();
index.clearFile(file, clearedContexts);
} else {
file= index.addFile(location);
file= index.addFile(linkageID, location);
}
file.setTimestamp(getLastModified(location));
file.setTimestamp(fResolver.getLastModified(location));
file.setScannerConfigurationHashcode(configHash);
ArrayList[] lists= (ArrayList[]) symbolMap.get(location);
if (lists != null) {
@ -470,13 +393,12 @@ abstract public class PDOMWriter {
final IncludeInformation info= includeInfos[i]= new IncludeInformation();
info.fStatement= include;
if (include.isResolved()) {
info.fLocation= findLocation(include.getPath());
info.fLocation= fResolver.resolveASTPath(include.getPath());
info.fIsContext= include.isActive() &&
(contextIncludes.contains(include) ||
clearedContexts.contains(info.fLocation));
(contextIncludes.contains(include) || clearedContexts.contains(info.fLocation));
}
}
index.setFileContent(file, includeInfos, macros, names);
index.setFileContent(file, linkageID, includeInfos, macros, names);
}
return file;
}
@ -502,15 +424,4 @@ abstract public class PDOMWriter {
fInfo.fTotalSourcesEstimate+= totalEstimate;
}
}
/**
* Obtains the timestamp of an index file location.
* @param location the location for which the timestamp is obtained.
* @return the timestamp.
* @throws CoreException
* @since 4.0
*/
protected long getLastModified(IIndexFileLocation location) throws CoreException {
return EFS.getStore(location.getURI()).fetchInfo().getLastModified();
}
}

View file

@ -20,20 +20,20 @@ import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.zip.Deflater;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.index.IIndexFile;
import org.eclipse.cdt.core.index.IIndexLocationConverter;
import org.eclipse.cdt.core.index.ResourceContainerRelativeLocationConverter;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.LanguageManager;
import org.eclipse.cdt.internal.core.CCoreInternals;
import org.eclipse.cdt.internal.core.index.IndexFileLocation;
import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspaceRoot;
@ -144,28 +144,31 @@ public class TeamPDOMExportOperation implements IWorkspaceRunnable {
}
private void createChecksums(ICProject cproject, PDOM pdom, File target, IProgressMonitor monitor) throws CoreException {
List locs;
HashSet fullPaths= new HashSet();
try {
pdom.acquireReadLock();
} catch (InterruptedException e) {
throw new OperationCanceledException();
}
try {
locs = pdom.getAllFileLocations();
IIndexFile[] ifiles= pdom.getAllFiles();
for (int i = 0; i < ifiles.length; i++) {
String fullPath= ifiles[i].getLocation().getFullPath();
if (fullPath != null) {
fullPaths.add(fullPath);
}
}
}
finally {
pdom.releaseReadLock();
}
int i=0;
IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot();
IFile[] files= new IFile[locs.size()];
for (Iterator iterator = locs.iterator(); iterator.hasNext();) {
IndexFileLocation floc = (IndexFileLocation) iterator.next();
String fullPath= floc.getFullPath();
if (fullPath != null) {
IFile[] files= new IFile[fullPaths.size()];
for (Iterator iterator = fullPaths.iterator(); iterator.hasNext();) {
String fullPath= (String) iterator.next();
files[i++]= root.getFile(new Path(fullPath));
}
}
Map map= Checksums.createChecksumMap(files, fMessageDigest, monitor);
writeChecksums(map, target);
}

View file

@ -31,13 +31,11 @@ import java.util.zip.ZipFile;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.IPDOMIndexerTask;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.index.IndexLocationFactory;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.internal.core.CCoreInternals;
import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
import org.eclipse.cdt.internal.core.index.IndexFileLocation;
import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences;
import org.eclipse.cdt.internal.core.pdom.indexer.Messages;
import org.eclipse.cdt.internal.core.pdom.indexer.PDOMIndexerTask;
@ -68,9 +66,11 @@ public class TeamPDOMImportOperation implements IWorkspaceRunnable {
private static final class FileAndChecksum {
public ITranslationUnit fFile;
public IIndexFragmentFile fIFile;
public byte[] fChecksum;
public FileAndChecksum(ITranslationUnit tu, byte[] checksum) {
public FileAndChecksum(ITranslationUnit tu, IIndexFragmentFile ifile, byte[] checksum) {
fFile= tu;
fIFile= ifile;
fChecksum= checksum;
}
}
@ -193,8 +193,6 @@ public class TeamPDOMImportOperation implements IWorkspaceRunnable {
}
private void checkIndex(Map checksums, IProgressMonitor monitor) throws CoreException, InterruptedException {
List filesToCheck= new ArrayList();
IPDOM obj= CCoreInternals.getPDOMManager().getPDOM(fProject);
if (!(obj instanceof WritablePDOM)) {
return;
@ -203,20 +201,22 @@ public class TeamPDOMImportOperation implements IWorkspaceRunnable {
WritablePDOM pdom= (WritablePDOM) obj;
pdom.acquireReadLock();
try {
List filesToCheck= new ArrayList();
if (!pdom.isSupportedVersion()) {
throw new CoreException(CCorePlugin.createStatus(
NLS.bind(Messages.PDOMImportTask_errorInvalidPDOMVersion, fProject.getElementName())));
}
final IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
List filesToDelete= pdom.getAllFileLocations();
for (Iterator i = filesToDelete.iterator(); i.hasNext();) {
IIndexFragmentFile[] filesToDelete= pdom.getAllFiles();
for (int i = 0; i < filesToDelete.length; i++) {
checkMonitor(monitor);
IIndexFragmentFile ifile = filesToDelete[i];
byte[] checksum= null;
ITranslationUnit tu= null;
IIndexFileLocation ifl = (IIndexFileLocation) i.next();
IIndexFileLocation ifl = ifile.getLocation();
String fullPathStr= ifl.getFullPath();
if (fullPathStr != null) {
Path fullPath= new Path(fullPathStr);
@ -238,8 +238,8 @@ public class TeamPDOMImportOperation implements IWorkspaceRunnable {
}
}
if (checksum != null) {
filesToCheck.add(new FileAndChecksum(tu, checksum));
i.remove();
filesToCheck.add(new FileAndChecksum(tu, ifile, checksum));
filesToDelete[i]= null;
}
}
try {
@ -261,22 +261,22 @@ public class TeamPDOMImportOperation implements IWorkspaceRunnable {
}
}
private void deleteFiles(WritablePDOM pdom, final int giveupReadlocks, List filesToDelete,
private void deleteFiles(WritablePDOM pdom, final int giveupReadlocks, IIndexFragmentFile[] filesToDelete,
List updateTimestamps, IProgressMonitor monitor) throws InterruptedException, CoreException {
pdom.acquireWriteLock(giveupReadlocks);
try {
for (Iterator i = filesToDelete.iterator(); i.hasNext();) {
for (int i = 0; i < filesToDelete.length; i++) {
IIndexFragmentFile ifile = filesToDelete[i];
if (ifile != null) {
checkMonitor(monitor);
IndexFileLocation ifl = (IndexFileLocation) i.next();
IIndexFragmentFile file= pdom.getFile(ifl);
pdom.clearFile(file, null);
pdom.clearFile(ifile, null);
}
}
for (Iterator i = updateTimestamps.iterator(); i.hasNext();) {
checkMonitor(monitor);
FileAndChecksum fc = (FileAndChecksum) i.next();
IIndexFragmentFile file= pdom.getFile(IndexLocationFactory.getIFL(fc.fFile));
IIndexFragmentFile file= fc.fIFile;
if (file != null) {
IResource r= fc.fFile.getResource();
if (r != null) {

View file

@ -49,8 +49,8 @@ public class WritablePDOM extends PDOM implements IWritableIndexFragment {
super(dbPath, locationConverter, cache, linkageFactoryMappings);
}
public IIndexFragmentFile addFile(IIndexFileLocation location) throws CoreException {
return super.addFile(location);
public IIndexFragmentFile addFile(int linkageID, IIndexFileLocation location) throws CoreException {
return super.addFile(linkageID, location);
}
public void addFileContent(IIndexFragmentFile sourceFile,

View file

@ -54,10 +54,11 @@ public class PDOMFile implements IIndexFragmentFile {
private static final int FIRST_INCLUDED_BY = 8;
private static final int FIRST_MACRO = 12;
private static final int LOCATION_REPRESENTATION = 16;
private static final int TIME_STAMP = 20;
private static final int SCANNER_CONFIG_HASH= 28;
private static final int LINKAGE_ID= 20;
private static final int TIME_STAMP = 24;
private static final int SCANNER_CONFIG_HASH= 32;
private static final int RECORD_SIZE = 32;
private static final int RECORD_SIZE = 36;
public static class Comparator implements IBTreeComparator {
private Database db;
@ -69,7 +70,11 @@ public class PDOMFile implements IIndexFragmentFile {
public int compare(int record1, int record2) throws CoreException {
IString name1 = db.getString(db.getInt(record1 + LOCATION_REPRESENTATION));
IString name2 = db.getString(db.getInt(record2 + LOCATION_REPRESENTATION));
return name1.compare(name2, true);
int cmp= name1.compare(name2, true);
if (cmp == 0) {
cmp= db.getInt(record1+LINKAGE_ID) - db.getInt(record2+LINKAGE_ID);
}
return cmp;
}
}
@ -78,7 +83,7 @@ public class PDOMFile implements IIndexFragmentFile {
this.record = record;
}
public PDOMFile(PDOM pdom, IIndexFileLocation location) throws CoreException {
public PDOMFile(PDOM pdom, IIndexFileLocation location, int linkageID) throws CoreException {
this.pdom = pdom;
Database db = pdom.getDB();
record = db.malloc(RECORD_SIZE);
@ -87,10 +92,12 @@ public class PDOMFile implements IIndexFragmentFile {
throw new CoreException(CCorePlugin.createStatus(Messages.getString("PDOMFile.toInternalProblem")+location.getURI())); //$NON-NLS-1$
IString locationDBString = db.newString(locationString);
db.putInt(record + LOCATION_REPRESENTATION, locationDBString.getRecord());
db.putInt(record + LINKAGE_ID, linkageID);
db.putLong(record + TIME_STAMP, 0);
setFirstName(null);
setFirstInclude(null);
setFirstIncludedBy(null);
setTimestamp(-1);
}
public int getRecord() {
@ -125,6 +132,11 @@ public class PDOMFile implements IIndexFragmentFile {
db.putInt(record + LOCATION_REPRESENTATION, db.newString(internalLocation).getRecord());
}
public int getLinkageID() throws CoreException {
Database db = pdom.getDB();
return db.getInt(record + LINKAGE_ID);
}
public long getTimestamp() throws CoreException {
Database db = pdom.getDB();
return db.getLong(record + TIME_STAMP);
@ -281,6 +293,7 @@ public class PDOMFile implements IIndexFragmentFile {
name.delete();
}
setFirstName(null);
setTimestamp(-1);
}
public void addIncludesTo(IncludeInformation[] includeInfos) throws CoreException {
@ -374,39 +387,89 @@ public class PDOMFile implements IIndexFragmentFile {
return (IIndexName[]) result.toArray(new IIndexName[result.size()]);
}
public static IIndexFragmentFile findFile(PDOM pdom, BTree btree, IIndexFileLocation location, IIndexLocationConverter strategy)
public static IIndexFragmentFile findFile(PDOM pdom, BTree btree, IIndexFileLocation location, int linkageID, IIndexLocationConverter strategy)
throws CoreException {
String internalRepresentation= strategy.toInternalFormat(location);
int record= 0;
if(internalRepresentation!=null) {
Finder finder = new Finder(pdom.getDB(), internalRepresentation);
Finder finder = new Finder(pdom.getDB(), internalRepresentation, linkageID);
btree.accept(finder);
record= finder.getRecord();
}
return record != 0 ? new PDOMFile(pdom, record) : null;
}
public static IIndexFragmentFile[] findFiles(PDOM pdom, BTree btree, IIndexFileLocation location, IIndexLocationConverter strategy)
throws CoreException {
String internalRepresentation= strategy.toInternalFormat(location);
if(internalRepresentation!=null) {
Finder finder = new Finder(pdom.getDB(), internalRepresentation, -1);
btree.accept(finder);
int[] records= finder.getRecords();
PDOMFile[] result= new PDOMFile[records.length];
for (int i = 0; i < result.length; i++) {
result[i]= new PDOMFile(pdom, records[i]);
}
return result;
}
return new IIndexFragmentFile[0];
}
private static class Finder implements IBTreeVisitor {
private static final int[] EMPTY = {};
private final Database db;
private final String rawKey;
private int record;
private int[] records;
private final int linkageID;
public Finder(Database db, String internalRepresentation)
throws CoreException
{
/**
* Searches for a file with the given linkage id.
*/
public Finder(Database db, String internalRepresentation, int linkageID) {
this.db = db;
this.rawKey = internalRepresentation;
this.linkageID= linkageID;
}
public int[] getRecords() {
if (records == null) {
if (record == 0) {
return EMPTY;
}
return new int[] {record};
}
return records;
}
public int compare(int record) throws CoreException {
IString name = db.getString(db.getInt(record + PDOMFile.LOCATION_REPRESENTATION));
return name.compare(rawKey, true);
int cmp= name.compare(rawKey, true);
if (cmp == 0 && linkageID >= 0) {
cmp= db.getInt(record + PDOMFile.LINKAGE_ID) - linkageID;
}
return cmp;
}
public boolean visit(int record) throws CoreException {
if (linkageID >= 0) {
this.record = record;
return false;
}
if (this.record == 0) {
this.record= record;
}
else if (this.records == null) {
this.records= new int[] {this.record, record};
}
else {
int[] cpy= new int[this.records.length+1];
System.arraycopy(this.records, 0, cpy, 0, this.records.length);
cpy[cpy.length-1]= record;
this.records= cpy;
}
return linkageID < 0;
}
public int getRecord() {
return record;
@ -422,8 +485,8 @@ public class PDOMFile implements IIndexFragmentFile {
return result;
}
public boolean hasNames() throws CoreException {
return getFirstName()!=null || getFirstMacro() != null || getFirstInclude() != null;
public boolean hasContent() throws CoreException {
return getTimestamp() != -1;
}
public void convertIncludersToUnresolved() throws CoreException {

View file

@ -18,6 +18,9 @@ import java.util.Properties;
import org.eclipse.cdt.core.dom.IPDOMIndexer;
import org.eclipse.cdt.core.model.ICProject;
/**
* Abstract base class for all indexers.
*/
public abstract class AbstractPDOMIndexer implements IPDOMIndexer {
protected ICProject project;

View file

@ -74,7 +74,7 @@ public class DeltaAnalyzer {
}
private void collectSources(ICContainer container, Collection sources) throws CoreException {
container.accept(new TranslationUnitCollector(sources, sources, true, new NullProgressMonitor()));
container.accept(new TranslationUnitCollector(sources, sources, new NullProgressMonitor()));
}
public ITranslationUnit[] getAddedTUs() {

View file

@ -18,9 +18,6 @@ public class Messages extends NLS {
public static String PDOMImportTask_errorInvalidArchive;
public static String PDOMImportTask_errorInvalidPDOMVersion;
public static String PDOMIndexerTask_collectingFilesTask;
public static String PDOMIndexerTask_errorWhileParsing;
public static String PDOMIndexerTask_parsingFileTask;
public static String PDOMIndexerTask_tooManyIndexProblems;
public static String TodoTaskUpdater_DeleteJob;
public static String TodoTaskUpdater_taskFormat;
public static String TodoTaskUpdater_UpdateJob;

View file

@ -10,17 +10,15 @@
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.indexer.fast;
package org.eclipse.cdt.internal.core.pdom.indexer;
import org.eclipse.cdt.core.dom.IPDOMIndexerTask;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.internal.core.pdom.indexer.AbstractPDOMIndexer;
/**
* @author Doug Schaefer
*
* Configures the abstract indexer to return tasks suitable for fast indexing.
*/
public class PDOMFastIndexer extends AbstractPDOMIndexer {
// Must match extension id
@ -30,8 +28,7 @@ public class PDOMFastIndexer extends AbstractPDOMIndexer {
return ID;
}
public IPDOMIndexerTask createTask(ITranslationUnit[] added,
ITranslationUnit[] changed, ITranslationUnit[] removed) {
public IPDOMIndexerTask createTask(ITranslationUnit[] added, ITranslationUnit[] changed, ITranslationUnit[] removed) {
return new PDOMFastIndexerTask(this, added, changed, removed);
}
}

View file

@ -0,0 +1,30 @@
/*******************************************************************************
* Copyright (c) 2006, 2007 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* QNX - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.indexer;
import org.eclipse.cdt.core.dom.ICodeReaderFactory;
import org.eclipse.cdt.core.model.ITranslationUnit;
/**
* Configures the abstract indexer to return tasks suitable for fast indexing.
*/
class PDOMFastIndexerTask extends PDOMIndexerTask {
public PDOMFastIndexerTask(PDOMFastIndexer indexer, ITranslationUnit[] added,
ITranslationUnit[] changed, ITranslationUnit[] removed) {
super(added, changed, removed, indexer, true);
}
protected ICodeReaderFactory createReaderFactory() {
return null;
}
}

View file

@ -10,12 +10,11 @@
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.indexer.full;
package org.eclipse.cdt.internal.core.pdom.indexer;
import org.eclipse.cdt.core.dom.IPDOMIndexerTask;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.internal.core.pdom.indexer.AbstractPDOMIndexer;
/**
* The Full indexer does full parsing in order to gather index information.

View file

@ -0,0 +1,32 @@
/*******************************************************************************
* Copyright (c) 2006, 2007 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* QNX - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.indexer;
import org.eclipse.cdt.core.dom.ICodeReaderFactory;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.internal.core.dom.SavedCodeReaderFactory;
/**
* Configures the indexer task as a fast indexer task.
*/
class PDOMFullIndexerTask extends PDOMIndexerTask {
public PDOMFullIndexerTask(PDOMFullIndexer indexer, ITranslationUnit[] added,
ITranslationUnit[] changed, ITranslationUnit[] removed) {
super(added, changed, removed, indexer, false);
}
protected ICodeReaderFactory createReaderFactory() {
return SavedCodeReaderFactory.getInstance();
}
}

View file

@ -12,70 +12,44 @@
package org.eclipse.cdt.internal.core.pdom.indexer;
import java.net.URI;
import java.text.MessageFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.IPDOMIndexer;
import org.eclipse.cdt.core.dom.IPDOMIndexerTask;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexFile;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.index.IIndexInclude;
import org.eclipse.cdt.core.index.IIndexManager;
import org.eclipse.cdt.core.index.IndexLocationFactory;
import org.eclipse.cdt.core.model.AbstractLanguage;
import org.eclipse.cdt.core.model.CoreModelUtil;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.LanguageManager;
import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.IExtendedScannerInfo;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
import org.eclipse.cdt.core.parser.ScannerInfo;
import org.eclipse.cdt.internal.core.CContentTypes;
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.AbstractIndexerTask;
import org.eclipse.cdt.internal.core.pdom.ITodoTaskUpdater;
import org.eclipse.cdt.internal.core.pdom.IndexerProgress;
import org.eclipse.cdt.internal.core.pdom.PDOMWriter;
import org.eclipse.cdt.internal.core.pdom.db.ChunkCache;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
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.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
public abstract class PDOMIndexerTask extends PDOMWriter implements IPDOMIndexerTask {
private static final Object NO_CONTEXT = new Object();
private static final int MAX_ERRORS = 500;
/**
* Configures the abstract indexer task suitable for indexing projects.
*/
public abstract class PDOMIndexerTask extends AbstractIndexerTask implements IPDOMIndexerTask {
private static final String TRUE = "true"; //$NON-NLS-1$
private AbstractPDOMIndexer fIndexer;
protected Map/*<IIndexFileLocation, Object>*/ fContextMap = new HashMap/*<IIndexFileLocation, Object>*/();
private List fFilesUpFront= new ArrayList();
private String fDummyFileName;
private URI fDummyFileURI;
private int fUpdateFlags= IIndexManager.UPDATE_ALL;
private boolean fAllFilesProvided= true;
protected PDOMIndexerTask(AbstractPDOMIndexer indexer) {
protected PDOMIndexerTask(ITranslationUnit[] addFiles, ITranslationUnit[] updateFiles, ITranslationUnit[] removeFiles,
AbstractPDOMIndexer indexer, boolean isFastIndexer) {
super(concat(addFiles, updateFiles), removeFiles, new ProjectIndexerInputAdapter(indexer.getProject()), isFastIndexer);
fIndexer= indexer;
setShowActivity(checkDebugOption(TRACE_ACTIVITY, TRUE));
setShowProblems(checkDebugOption(TRACE_PROBLEMS, TRUE));
@ -85,48 +59,43 @@ public abstract class PDOMIndexerTask extends PDOMWriter implements IPDOMIndexer
else if (checkProperty(IndexerPreferences.KEY_SKIP_TYPE_REFERENCES)) {
setSkipReferences(SKIP_TYPE_REFERENCES);
}
if (getIndexAllFiles()) {
setIndexFilesWithoutBuildConfiguration(true);
setIndexHeadersWithoutContext(true);
}
else {
setIndexFilesWithoutBuildConfiguration(false);
setIndexHeadersWithoutContext(false);
}
}
final public IPDOMIndexer getIndexer() {
private static ITranslationUnit[] concat(ITranslationUnit[] added, ITranslationUnit[] changed) {
ITranslationUnit[] result= new ITranslationUnit[added.length+changed.length];
System.arraycopy(added, 0, result, 0, added.length);
System.arraycopy(changed, 0, result, added.length, changed.length);
return result;
}
public final void setParseUpFront() {
setParseUpFront(fIndexer.getFilesToParseUpFront());
}
public final IPDOMIndexer getIndexer() {
return fIndexer;
}
final public ICProject getProject() {
return fIndexer.getProject();
public final void run(IProgressMonitor monitor) throws InterruptedException {
long start = System.currentTimeMillis();
runTask(monitor);
traceEnd(start, fIndex);
}
final public IndexerProgress getProgressInformation() {
public IndexerProgress getProgressInformation() {
return super.getProgressInformation();
}
public void setUpateFlags(int flags) {
fUpdateFlags= flags;
}
final public boolean updateAll() {
return (fUpdateFlags & IIndexManager.UPDATE_ALL) != 0;
}
final public boolean updateChangedTimestamps() {
return (fUpdateFlags & IIndexManager.UPDATE_CHECK_TIMESTAMPS) != 0;
}
final public boolean updateChangedConfiguration() {
return (fUpdateFlags & IIndexManager.UPDATE_CHECK_CONFIGURATION) != 0;
}
final public void setParseUpFront() {
fFilesUpFront.addAll(Arrays.asList(fIndexer.getFilesToParseUpFront()));
}
final public void setAllFilesProvided(boolean allFiles) {
fAllFilesProvided= allFiles;
}
final public boolean getAllFilesProvided() {
return fAllFilesProvided;
}
/**
* Checks whether a given debug option is enabled. See {@link IPDOMIndexerTask}
* for valid values.
@ -138,12 +107,7 @@ public abstract class PDOMIndexerTask extends PDOMWriter implements IPDOMIndexer
return internallyActivated || (trace != null && trace.equalsIgnoreCase(value));
}
/**
* Figures out whether all files (sources without configuration, headers not included)
* should be parsed.
* @since 4.0
*/
final protected boolean getIndexAllFiles() {
private boolean getIndexAllFiles() {
return checkProperty(IndexerPreferences.KEY_INDEX_ALL_FILES);
}
@ -151,228 +115,35 @@ public abstract class PDOMIndexerTask extends PDOMWriter implements IPDOMIndexer
return TRUE.equals(getIndexer().getProperty(key));
}
private IASTTranslationUnit createAST(ITranslationUnit tu, IScannerInfo scannerInfo, int options, IProgressMonitor pm) throws CoreException {
IPath path = tu.getLocation();
if (path == null) {
return null;
}
ILanguage language = tu.getLanguage();
if (!(language instanceof AbstractLanguage))
return null;
CodeReader codeReader = tu.getCodeReader();
if (codeReader == null) {
return null;
}
IASTTranslationUnit ast= createAST((AbstractLanguage) language, codeReader, scannerInfo, options, pm);
if (ast != null) {
ast.setIsHeaderUnit(tu.isHeaderUnit());
}
return ast;
}
/**
* Called to create the ast for a translation unit or a pre-parsed file.
* May return <code>null</code>.
* @see #parseTUs(IWritableIndex, int, Collection, Collection, IProgressMonitor)
* @since 4.0
*/
abstract protected IASTTranslationUnit createAST(AbstractLanguage lang, CodeReader codeReader,
IScannerInfo scanInfo, int options, IProgressMonitor pm) throws CoreException;
/**
* Convenience method for subclasses, parses the files calling out to the methods
* {@link #createAST(AbstractLanguage, CodeReader, IScannerInfo, int, IProgressMonitor)},
* {@link #needToUpdate(IIndexFileLocation,int)},
* {@link #addSymbols(IASTTranslationUnit, IWritableIndex, int, IProgressMonitor)}
* {@link #postAddToIndex(IIndexFileLocation, IIndexFile)},
* {@link #getLastModified(IIndexFileLocation)} and
* {@link #findLocation(String)}
* @since 4.0
*/
protected void parseTUs(IWritableIndex index, int readlockCount, Collection sources, Collection headers, IProgressMonitor monitor) throws CoreException, InterruptedException {
try {
internalParseTUs(index, readlockCount, sources, headers, monitor);
}
finally {
index.flush();
}
}
private void internalParseTUs(IWritableIndex index, int readlockCount, Collection sources, Collection headers, IProgressMonitor monitor) throws CoreException, InterruptedException {
TodoTaskUpdater taskUpdater = new TodoTaskUpdater();
int options= AbstractLanguage.OPTION_ADD_COMMENTS | AbstractLanguage.OPTION_NO_IMAGE_LOCATIONS;
if (checkProperty(IndexerPreferences.KEY_SKIP_ALL_REFERENCES)) {
options |= AbstractLanguage.OPTION_SKIP_FUNCTION_BODIES;
}
for (Iterator iter = fFilesUpFront.iterator(); iter.hasNext();) {
String upfront= (String) iter.next();
parseUpFront(upfront, options, index, readlockCount, taskUpdater, monitor);
}
// sources first
sources= sortByContentType(sources);
for (Iterator iter = sources.iterator(); iter.hasNext();) {
if (monitor.isCanceled())
return;
ITranslationUnit tu = (ITranslationUnit) iter.next();
final IIndexFileLocation ifl = IndexLocationFactory.getIFL(tu);
if (needToUpdate(ifl, 0)) {
parseTU(ifl, tu, options, index, readlockCount, taskUpdater, monitor);
}
}
// headers with context
headers= sortByContentType(headers);
for (Iterator iter = headers.iterator(); iter.hasNext();) {
if (monitor.isCanceled())
return;
ITranslationUnit tu = (ITranslationUnit) iter.next();
final IIndexFileLocation ifl = IndexLocationFactory.getIFL(tu);
if (!needToUpdate(ifl, 0)) {
iter.remove();
}
else {
ITranslationUnit context= findContext(index, ifl);
if (context != null) {
parseTU(ifl, context, options, index, readlockCount, taskUpdater, monitor);
}
}
}
// headers without context
if (getIndexAllFiles()) {
for (Iterator iter = headers.iterator(); iter.hasNext();) {
if (monitor.isCanceled())
return;
ITranslationUnit tu = (ITranslationUnit) iter.next();
final IIndexFileLocation ifl = IndexLocationFactory.getIFL(tu);
if (!needToUpdate(ifl, 0)) {
iter.remove();
}
else {
parseTU(ifl, tu, options, index, readlockCount, taskUpdater, monitor);
}
}
}
}
private Collection sortByContentType(Collection sources) {
HashMap ctToLists= new HashMap();
for (Iterator iterator = sources.iterator(); iterator.hasNext();) {
final ITranslationUnit tu = (ITranslationUnit) iterator.next();
final String ct= tu.getContentTypeId();
List list= (List) ctToLists.get(ct);
if (list == null) {
list= new ArrayList();
ctToLists.put(ct, list);
}
list.add(tu);
}
if (ctToLists.size() <= 1) {
return sources;
}
Collection result= new ArrayList(sources.size());
// do C++ first
List list= (List) ctToLists.remove(CCorePlugin.CONTENT_TYPE_CXXSOURCE);
if (list != null) {
result.addAll(list);
}
list= (List) ctToLists.remove(CCorePlugin.CONTENT_TYPE_CXXHEADER);
if (list != null) {
result.addAll(list);
}
for (Iterator iterator = ctToLists.values().iterator(); iterator.hasNext();) {
list = (List) iterator.next();
result.addAll(list);
}
return result;
}
/**
* Convenience method to check whether a translation unit in the index is outdated
* with respect to its timestamp.
* @throws CoreException
* @since 4.0
*/
final protected boolean isOutdated(ITranslationUnit tu, IIndexFile indexFile) throws CoreException {
if (indexFile == null) {
return true;
}
IResource res= tu.getResource();
if (res != null) {
if (indexFile != null) {
if (res.getLocalTimeStamp() == indexFile.getTimestamp()) {
return false;
}
}
return true;
}
return false;
}
private void parseTU(IIndexFileLocation originator, ITranslationUnit tu, int options, IWritableIndex index,
int readlockCount, ITodoTaskUpdater taskUpdater, IProgressMonitor pm) throws CoreException, InterruptedException {
IPath path= tu.getPath();
try {
// skip if no scanner info
IScannerInfo scanner= tu.getScannerInfo(getIndexAllFiles());
if (scanner == null) {
updateInfo(0, 0, -1);
}
else {
final int configHash = computeHashCode(scanner);
if (needToUpdate(originator, configHash)) {
if (fShowActivity) {
System.out.println("Indexer: parsing " + path.toOSString()); //$NON-NLS-1$
}
pm.subTask(MessageFormat.format(Messages.PDOMIndexerTask_parsingFileTask,
new Object[]{path.lastSegment(), path.removeLastSegments(1).toString()}));
long start= System.currentTimeMillis();
IASTTranslationUnit ast= createAST(tu, scanner, options, pm);
fStatistics.fParsingTime += System.currentTimeMillis()-start;
if (ast != null) {
addSymbols(ast, index, readlockCount, false, configHash, taskUpdater, pm);
}
}
}
}
catch (CoreException e) {
swallowError(path, e);
}
catch (RuntimeException e) {
swallowError(path, e);
}
catch (Error e) {
swallowError(path, e);
}
}
private void parseUpFront(String file, int options, IWritableIndex index, int readlockCount,
ITodoTaskUpdater taskUpdater, IProgressMonitor pm) throws CoreException, InterruptedException {
file= file.trim();
if (file.length() == 0) {
return;
}
IPath path= new Path(file);
try {
if (fShowActivity) {
System.out.println("Indexer: parsing " + file + " up front"); //$NON-NLS-1$ //$NON-NLS-2$
}
pm.subTask(MessageFormat.format(Messages.PDOMIndexerTask_parsingFileTask,
new Object[]{path.lastSegment(), path.removeLastSegments(1).toString()}));
long start= System.currentTimeMillis();
IASTTranslationUnit ast= null;
protected String getASTPathForParsingUpFront() {
final IProject project = getProject().getProject();
IContentType ct= CContentTypes.getContentType(project, file);
final IPath prjLocation= project.getLocation();
if (prjLocation == null) {
return null;
}
return prjLocation.append(super.getASTPathForParsingUpFront()).toString();
}
protected AbstractLanguage[] getLanguages(String filename) {
IContentType ct= CCorePlugin.getContentType(filename);
if (ct != null) {
ILanguage l = LanguageManager.getInstance().getLanguage(ct);
if (l instanceof AbstractLanguage) {
AbstractLanguage lang= (AbstractLanguage) l;
if (ct.getId().equals(CCorePlugin.CONTENT_TYPE_CXXHEADER) && l.getLinkageID() == ILinkage.CPP_LINKAGE_ID) {
ILanguage l2= LanguageManager.getInstance().getLanguageForContentTypeID(CCorePlugin.CONTENT_TYPE_CHEADER);
if (l2 instanceof AbstractLanguage) {
return new AbstractLanguage[] {(AbstractLanguage) l, (AbstractLanguage) l2};
}
}
return new AbstractLanguage[] {(AbstractLanguage) l};
}
}
return new AbstractLanguage[0];
}
protected IScannerInfo createDefaultScannerConfig(int linkageID) {
IProject project= getProject().getProject();
IScannerInfoProvider provider= CCorePlugin.getDefault().getScannerInfoProvider(project);
IScannerInfo scanInfo;
if (provider != null) {
@ -381,130 +152,24 @@ public abstract class PDOMIndexerTask extends PDOMWriter implements IPDOMIndexer
else {
scanInfo= new ScannerInfo();
}
String code= "#include \"" + file + "\"\n"; //$NON-NLS-1$ //$NON-NLS-2$
if (fDummyFileName == null) {
fDummyFileName= project.getLocation().append("___").toString(); //$NON-NLS-1$
fDummyFileURI= findLocation(fDummyFileName).getURI();
}
CodeReader codeReader= new CodeReader(fDummyFileName, code.toCharArray());
ast= createAST(lang, codeReader, scanInfo, options, pm);
}
return scanInfo;
}
fStatistics.fParsingTime += System.currentTimeMillis()-start;
if (ast != null) {
addSymbols(ast, index, readlockCount, false, 0, taskUpdater, pm);
updateInfo(-1, +1, 0);
}
}
catch (CoreException e) {
swallowError(path, e);
}
catch (RuntimeException e) {
swallowError(path, e);
}
catch (Error e) {
swallowError(path, e);
}
private ICProject getProject() {
return getIndexer().getProject();
}
/**
* Overrides must call super.needToUpdate(). If <code>false</code> is returned
* this must be passed on to their caller:
* <pre>
* if (super.needToUpdate()) {
* // your code
* }
* return false;
*/
protected boolean needToUpdate(IIndexFileLocation fileLoc, int configHash) throws CoreException {
return fDummyFileURI==null || !fDummyFileURI.equals(fileLoc.getURI());
}
private void swallowError(IPath file, Throwable e) throws CoreException {
if (e instanceof CoreException) {
CCorePlugin.log(((CoreException) e).getStatus());
}
else {
IStatus status= CCorePlugin.createStatus(
MessageFormat.format(Messages.PDOMIndexerTask_errorWhileParsing, new Object[]{file}), e);
CCorePlugin.log(status);
}
if (++fStatistics.fErrorCount > MAX_ERRORS) {
throw new CoreException(CCorePlugin.createStatus(
MessageFormat.format(Messages.PDOMIndexerTask_tooManyIndexProblems, new Object[]{getIndexer().getProject().getElementName()})));
}
}
private ITranslationUnit findContext(IIndex index, final IIndexFileLocation location) {
Object cachedContext= fContextMap.get(location);
if (cachedContext != null) {
return cachedContext == NO_CONTEXT ? null : (ITranslationUnit) cachedContext;
}
fContextMap.put(location, NO_CONTEXT); // prevent recursion
IIndexFile pdomFile;
protected final IWritableIndex createIndex() {
try {
final ICProject project= getIndexer().getProject();
pdomFile = index.getFile(location);
if (pdomFile != null) {
final IIndexInclude contextInclude= pdomFile.getParsedInContext();
if (contextInclude != null) {
final IIndexFileLocation loc= contextInclude.getIncludedByLocation();
ITranslationUnit context= getSourceUnit(project, loc);
if (context == null) {
context= findContext(index, loc);
}
if (context != null) {
fContextMap.put(location, context);
return context;
}
}
// fallback to other includes
IIndexInclude[] includedBy = index.findIncludedBy(pdomFile, IIndex.DEPTH_ZERO);
for (int i = includedBy.length-1; i >=0; i--) {
final IIndexFileLocation loc= includedBy[i].getIncludedByLocation();
ITranslationUnit context= getSourceUnit(project, loc);
if (context == null) {
context= findContext(index, loc);
}
if (context != null) {
fContextMap.put(location, context);
return context;
}
}
}
return ((IWritableIndexManager) CCorePlugin.getIndexManager()).getWritableIndex(getProject());
} catch (CoreException e) {
CCorePlugin.log(e);
}
return null;
}
private ITranslationUnit getSourceUnit(final ICProject project, final IIndexFileLocation location)
throws CoreException {
ITranslationUnit tu= CoreModelUtil.findTranslationUnitForLocation(location, getIndexer().getProject());
if (tu != null) {
if (tu.isSourceUnit()) {
return tu;
}
}
return null;
}
/**
* Conveninence method for subclasses, removes a translation unit from the index.
* @since 4.0
*/
protected void removeTU(IWritableIndex index, ITranslationUnit tu, int readlocks) throws CoreException, InterruptedException {
index.acquireWriteLock(readlocks);
try {
IIndexFragmentFile file = (IIndexFragmentFile) index.getFile(IndexLocationFactory.getIFL(tu));
if (file != null)
index.clearFile(file, null);
} finally {
index.releaseWriteLock(readlocks);
}
protected final ITodoTaskUpdater createTodoTaskUpdater() {
return new TodoTaskUpdater();
}
protected void traceEnd(long start, IWritableIndex index) {
@ -558,69 +223,6 @@ public abstract class PDOMIndexerTask extends PDOMWriter implements IPDOMIndexer
}
}
protected long getLastModified(IIndexFileLocation location) throws CoreException {
String fullPath= location.getFullPath();
if (fullPath != null) {
IResource res= ResourcesPlugin.getWorkspace().getRoot().findMember(fullPath);
if (res != null) {
return res.getLocalTimeStamp();
}
}
return super.getLastModified(location);
}
protected static int computeHashCode(IScannerInfo scannerInfo) {
int result= 0;
Map macros= scannerInfo.getDefinedSymbols();
if (macros != null) {
for (Iterator i = macros.entrySet().iterator(); i.hasNext();) {
Map.Entry entry = (Map.Entry) i.next();
String key = (String) entry.getKey();
String value = (String) entry.getValue();
result= addToHashcode(result, key);
if (value != null && value.length() > 0) {
result= addToHashcode(result, value);
}
}
}
String[] a= scannerInfo.getIncludePaths();
if (a != null) {
for (int i = 0; i < a.length; i++) {
result= addToHashcode(result, a[i]);
}
}
if (scannerInfo instanceof IExtendedScannerInfo) {
IExtendedScannerInfo esi= (IExtendedScannerInfo) scannerInfo;
a= esi.getIncludeFiles();
if (a != null) {
for (int i = 0; i < a.length; i++) {
result= addToHashcode(result, a[i]);
}
}
a= esi.getLocalIncludePath();
if (a != null) {
for (int i = 0; i < a.length; i++) {
result= addToHashcode(result, a[i]);
}
}
a= esi.getMacroFiles();
if (a != null) {
for (int i = 0; i < a.length; i++) {
result= addToHashcode(result, a[i]);
}
}
}
return result;
}
private static int addToHashcode(int result, String key) {
return result*31 + key.hashCode();
}
protected ICProject getCProject() {
return fIndexer.project;
}

View file

@ -10,17 +10,14 @@
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.indexer.nulli;
package org.eclipse.cdt.internal.core.pdom.indexer;
import org.eclipse.cdt.core.dom.IPDOMIndexerTask;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.internal.core.pdom.indexer.AbstractPDOMIndexer;
/**
* @author Doug Schaefer
*
* The Null Indexer which does nothing.
* Configures the abstract indexer to do nothing.
*/
public class PDOMNullIndexer extends AbstractPDOMIndexer {

View file

@ -32,6 +32,9 @@ import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.osgi.util.NLS;
/**
* A task for rebuilding an index, works for all indexers.
*/
public class PDOMRebuildTask implements IPDOMIndexerTask {
protected static final String TRUE= String.valueOf(true);
protected static final ITranslationUnit[] NO_TUS = new ITranslationUnit[0];
@ -55,7 +58,7 @@ public class PDOMRebuildTask implements IPDOMIndexerTask {
return fIndexer;
}
public void run(IProgressMonitor monitor) {
public void run(IProgressMonitor monitor) throws InterruptedException {
monitor.subTask(NLS.bind(Messages.PDOMIndexerTask_collectingFilesTask,
fIndexer.getProject().getElementName()));
@ -102,15 +105,14 @@ public class PDOMRebuildTask implements IPDOMIndexerTask {
boolean allFiles= TRUE.equals(fIndexer.getProperty(IndexerPreferences.KEY_INDEX_ALL_FILES));
List sources= new ArrayList();
List headers= allFiles ? sources : null;
TranslationUnitCollector collector= new TranslationUnitCollector(sources, headers, allFiles, monitor);
TranslationUnitCollector collector= new TranslationUnitCollector(sources, headers, monitor);
project.accept(collector);
ITranslationUnit[] tus= (ITranslationUnit[]) sources.toArray(new ITranslationUnit[sources.size()]);
fDelegate= fIndexer.createTask(tus, NO_TUS, NO_TUS);
if (fDelegate instanceof PDOMIndexerTask) {
final PDOMIndexerTask delegate = (PDOMIndexerTask) fDelegate;
delegate.setUpateFlags(IIndexManager.UPDATE_ALL);
delegate.setUpdateFlags(IIndexManager.UPDATE_ALL);
delegate.setParseUpFront();
delegate.setAllFilesProvided(allFiles);
}
}

View file

@ -28,6 +28,9 @@ import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.osgi.util.NLS;
/**
* A task for updating an index, suitable for all indexers.
*/
public class PDOMUpdateTask implements IPDOMIndexerTask {
protected static final String TRUE= String.valueOf(true);
protected static final ITranslationUnit[] NO_TUS = new ITranslationUnit[0];
@ -54,7 +57,7 @@ public class PDOMUpdateTask implements IPDOMIndexerTask {
return fIndexer;
}
public void run(IProgressMonitor monitor) {
public void run(IProgressMonitor monitor) throws InterruptedException {
monitor.subTask(NLS.bind(Messages.PDOMIndexerTask_collectingFilesTask,
fIndexer.getProject().getElementName()));
@ -75,9 +78,8 @@ public class PDOMUpdateTask implements IPDOMIndexerTask {
}
private synchronized void createDelegate(ICProject project, IProgressMonitor monitor) throws CoreException {
boolean allFiles= TRUE.equals(fIndexer.getProperty(IndexerPreferences.KEY_INDEX_ALL_FILES));
HashSet set= new HashSet();
TranslationUnitCollector collector= new TranslationUnitCollector(set, set, allFiles, monitor);
TranslationUnitCollector collector= new TranslationUnitCollector(set, set, monitor);
if (fFilesAndFolders == null) {
project.accept(collector);
}
@ -91,8 +93,7 @@ public class PDOMUpdateTask implements IPDOMIndexerTask {
fDelegate= fIndexer.createTask(tus, NO_TUS, NO_TUS);
if (fDelegate instanceof PDOMIndexerTask) {
final PDOMIndexerTask task = (PDOMIndexerTask) fDelegate;
task.setUpateFlags(fUpdateOptions);
task.setAllFilesProvided(allFiles);
task.setUpdateFlags(fUpdateOptions);
}
}

View file

@ -0,0 +1,164 @@
/*******************************************************************************
* Copyright (c) 2007 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.indexer;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.index.IndexLocationFactory;
import org.eclipse.cdt.core.model.AbstractLanguage;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.CoreModelUtil;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.ScannerInfo;
import org.eclipse.cdt.internal.core.pdom.IndexerInputAdapter;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
/**
* Provides information about translation-units.
* @since 5.0
*/
public class ProjectIndexerInputAdapter extends IndexerInputAdapter {
private final static boolean CASE_SENSITIVE_FILES= !new File("a").equals(new File("A")); //$NON-NLS-1$//$NON-NLS-2$
private final ICProject fCProject;
private HashMap fIflCache= new HashMap();
public ProjectIndexerInputAdapter(ICProject cproject) {
fCProject= cproject;
}
public IIndexFileLocation resolveASTPath(String astPath) {
IIndexFileLocation result= (IIndexFileLocation) fIflCache.get(astPath);
if (result == null) {
result= IndexLocationFactory.getIFLExpensive(fCProject, astPath);
fIflCache.put(astPath, result);
}
return result;
}
public IIndexFileLocation resolveIncludeFile(String includePath) {
IIndexFileLocation result= (IIndexFileLocation) fIflCache.get(includePath);
if (result == null) {
File location= new File(includePath);
if (!location.exists()) {
return null;
}
result= IndexLocationFactory.getIFLExpensive(fCProject, includePath);
if (result.getFullPath() == null && !CASE_SENSITIVE_FILES) {
try {
String canonicalPath= location.getCanonicalPath();
if (!includePath.equals(canonicalPath)) {
result= IndexLocationFactory.getExternalIFL(canonicalPath);
fIflCache.put(canonicalPath, result);
}
}
catch (IOException e) {
// just use the original
}
}
fIflCache.put(includePath, result);
}
return result;
}
public String getASTPath(IIndexFileLocation ifl) {
IPath path= IndexLocationFactory.getAbsolutePath(ifl);
if (path != null) {
return path.toString();
}
return ifl.getURI().getPath();
}
public IScannerInfo getBuildConfiguration(int linkageID, Object tu) {
IScannerInfo info= ((ITranslationUnit) tu).getScannerInfo(true);
if (info == null) {
info= new ScannerInfo();
}
return info;
}
public long getLastModified(IIndexFileLocation ifl) {
String fullPath= ifl.getFullPath();
if (fullPath != null) {
IResource res= ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(fullPath));
if (res != null) {
return res.getLocalTimeStamp();
}
return 0;
}
IPath location= IndexLocationFactory.getAbsolutePath(ifl);
if (location != null) {
return location.toFile().lastModified();
}
return 0;
}
public AbstractLanguage[] getLanguages(Object tuo) {
ITranslationUnit tu= (ITranslationUnit) tuo;
try {
ILanguage lang= tu.getLanguage();
if (lang instanceof AbstractLanguage) {
return new AbstractLanguage[] {(AbstractLanguage) lang};
}
}
catch (CoreException e) {
CCorePlugin.log(e);
}
return new AbstractLanguage[0];
}
public boolean isFileBuildConfigured(Object tuo) {
ITranslationUnit tu= (ITranslationUnit) tuo;
return !CoreModel.isScannerInformationEmpty(tu.getResource());
}
public boolean isSourceUnit(Object tuo) {
ITranslationUnit tu= (ITranslationUnit) tuo;
return tu.isSourceUnit();
}
public IIndexFileLocation resolveFile(Object tuo) {
ITranslationUnit tu= (ITranslationUnit) tuo;
return IndexLocationFactory.getIFL(tu);
}
public boolean canBePartOfSDK(IIndexFileLocation ifl) {
return ifl.getFullPath() == null;
}
public Object getInputFile(IIndexFileLocation location) {
try {
return CoreModelUtil.findTranslationUnitForLocation(location, fCProject);
} catch (CModelException e) {
CCorePlugin.log(e);
}
return null;
}
public CodeReader getCodeReader(Object tuo) {
ITranslationUnit tu= (ITranslationUnit) tuo;
return tu.getCodeReader();
}
}

View file

@ -13,7 +13,6 @@ package org.eclipse.cdt.internal.core.pdom.indexer;
import java.util.Collection;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICElementVisitor;
import org.eclipse.cdt.core.model.ITranslationUnit;
@ -23,13 +22,11 @@ import org.eclipse.core.runtime.IProgressMonitor;
final class TranslationUnitCollector implements ICElementVisitor {
private final Collection fSources;
private final Collection fHeaders;
private final boolean fAllFiles;
private final IProgressMonitor fProgressMonitor;
public TranslationUnitCollector(Collection sources, Collection headers, boolean allFiles, IProgressMonitor pm) {
public TranslationUnitCollector(Collection sources, Collection headers, IProgressMonitor pm) {
fSources= sources;
fHeaders= headers;
fAllFiles = allFiles;
fProgressMonitor= pm;
}
@ -41,10 +38,8 @@ final class TranslationUnitCollector implements ICElementVisitor {
case ICElement.C_UNIT:
ITranslationUnit tu = (ITranslationUnit)element;
if (tu.isSourceUnit()) {
if (fAllFiles || !CoreModel.isScannerInformationEmpty(tu.getResource())) {
fSources.add(tu);
}
}
else if (fHeaders != null && tu.isHeaderUnit()) {
fHeaders.add(tu);
}

View file

@ -1,215 +0,0 @@
/*******************************************************************************
* Copyright (c) 2006, 2007 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* QNX - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.indexer.fast;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.index.IIndexFile;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.index.IndexLocationFactory;
import org.eclipse.cdt.core.model.AbstractLanguage;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ITranslationUnit;
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.index.IWritableIndex;
import org.eclipse.cdt.internal.core.index.IWritableIndexManager;
import org.eclipse.cdt.internal.core.index.IndexBasedCodeReaderFactory;
import org.eclipse.cdt.internal.core.index.IndexBasedCodeReaderFactory.CallbackHandler;
import org.eclipse.cdt.internal.core.index.IndexBasedCodeReaderFactory.IndexFileInfo;
import org.eclipse.cdt.internal.core.pdom.indexer.PDOMIndexerTask;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
class PDOMFastIndexerTask extends PDOMIndexerTask implements CallbackHandler {
private List fChanged = new LinkedList();
private List fRemoved = new ArrayList();
private IWritableIndex fIndex;
private IndexBasedCodeReaderFactory fCodeReaderFactory;
private Map fIflCache;
private int fCurrentConfigHash= 0;
public PDOMFastIndexerTask(PDOMFastIndexer indexer, ITranslationUnit[] added,
ITranslationUnit[] changed, ITranslationUnit[] removed) {
super(indexer);
fChanged.addAll(Arrays.asList(added));
fChanged.addAll(Arrays.asList(changed));
fRemoved.addAll(Arrays.asList(removed));
updateInfo(0, 0, fChanged.size() + fRemoved.size());
}
public void run(IProgressMonitor monitor) {
long start = System.currentTimeMillis();
try {
// separate headers remove files that have no scanner configuration
final boolean filterFiles= !getIndexAllFiles() && getAllFilesProvided();
List headers= new ArrayList();
List sources= fChanged;
for (Iterator iter = fChanged.iterator(); iter.hasNext();) {
ITranslationUnit tu = (ITranslationUnit) iter.next();
if (tu.isSourceUnit()) {
if (filterFiles && CoreModel.isScannerInformationEmpty(tu.getResource())) {
iter.remove();
updateInfo(0, 0, -1);
}
}
else {
headers.add(tu);
iter.remove();
}
}
if (!setupIndexAndReaderFactory()) {
return;
}
fIndex.acquireReadLock();
try {
registerTUsInReaderFactory(sources);
registerTUsInReaderFactory(headers);
Iterator i= fRemoved.iterator();
while (i.hasNext()) {
if (monitor.isCanceled())
return;
ITranslationUnit tu = (ITranslationUnit)i.next();
removeTU(fIndex, tu, 1);
if (tu.isSourceUnit()) {
updateInfo(1, 0, 0);
}
else {
updateInfo(0, 1, -1);
}
}
parseTUs(fIndex, 1, sources, headers, monitor);
if (monitor.isCanceled()) {
return;
}
}
finally {
fIndex.releaseReadLock();
}
} catch (CoreException e) {
CCorePlugin.log(e);
} catch (InterruptedException e) {
}
traceEnd(start, fIndex);
}
private boolean setupIndexAndReaderFactory() throws CoreException {
fIndex= ((IWritableIndexManager) CCorePlugin.getIndexManager()).getWritableIndex(getProject());
if (fIndex == null) {
return false;
}
fIndex.resetCacheCounters();
fIflCache = new HashMap/*<String,IIndexFileLocation>*/();
fCodeReaderFactory = new IndexBasedCodeReaderFactory(getCProject(), fIndex, fIflCache);
fCodeReaderFactory.setCallbackHandler(this);
return true;
}
private void registerTUsInReaderFactory(Collection tus) throws CoreException {
int removed= 0;
for (Iterator iter = tus.iterator(); iter.hasNext();) {
ITranslationUnit tu = (ITranslationUnit) iter.next();
IIndexFileLocation ifl = IndexLocationFactory.getIFL(tu);
IndexFileInfo info= fCodeReaderFactory.createFileInfo(ifl);
if (updateAll()) {
info.fRequested= IndexFileInfo.REQUESTED;
}
else if (updateChangedTimestamps() && isOutdated(tu, info.fFile)) {
info.fRequested= IndexFileInfo.REQUESTED;
}
else if (updateChangedConfiguration()) {
info.fRequested= IndexFileInfo.REQUESTED_IF_CONFIG_CHANGED;
}
else {
iter.remove();
removed++;
}
}
updateInfo(0, 0, -removed);
}
protected IIndexFileLocation findLocation(String absolutePath) {
IIndexFileLocation result = (IIndexFileLocation) fIflCache.get(absolutePath);
if(result==null) {
result = IndexLocationFactory.getIFLExpensive(getCProject(), absolutePath);
fIflCache.put(absolutePath, result);
}
return result;
}
protected IASTTranslationUnit createAST(AbstractLanguage lang, CodeReader codeReader, IScannerInfo scanInfo, int options, IProgressMonitor pm) throws CoreException {
// get the AST in a "Fast" way
IASTTranslationUnit ast= lang.getASTTranslationUnit(codeReader, scanInfo, fCodeReaderFactory, fIndex, options, ParserUtil.getParserLogService());
if (pm.isCanceled()) {
return null;
}
// Clear the macros
fCodeReaderFactory.clearMacroAttachements();
return ast;
}
protected boolean needToUpdate(IIndexFileLocation location, int confighash) throws CoreException {
if (super.needToUpdate(location, confighash)) {
// file is requested or is not yet indexed.
IndexFileInfo info= fCodeReaderFactory.createFileInfo(location);
return needToUpdate(info, confighash);
}
return false;
}
public boolean needToUpdate(IndexFileInfo info) throws CoreException {
return needToUpdate(info, fCurrentConfigHash);
}
private boolean needToUpdate(IndexFileInfo info, int confighash) throws CoreException {
if (info.fFile == null) {
return true;
}
if (confighash != 0 && info.fRequested == IndexFileInfo.REQUESTED_IF_CONFIG_CHANGED) {
int oldhash= info.fFile.getScannerConfigurationHashcode();
if (oldhash == 0 || oldhash==confighash) {
info.fRequested= IndexFileInfo.NOT_REQUESTED;
updateInfo(0, 0, -1);
}
else {
info.fRequested= IndexFileInfo.REQUESTED;
}
}
return info.fRequested != IndexFileInfo.NOT_REQUESTED;
}
protected boolean postAddToIndex(IIndexFileLocation path, IIndexFile file)
throws CoreException {
IndexFileInfo info= fCodeReaderFactory.createFileInfo(path);
info.fFile= file;
assert !info.hasCachedMacros();
if (info.fRequested != IndexFileInfo.NOT_REQUESTED) {
info.fRequested= IndexFileInfo.NOT_REQUESTED;
return true;
}
return false;
}
}

View file

@ -1,215 +0,0 @@
/*******************************************************************************
* Copyright (c) 2006, 2007 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* QNX - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.indexer.full;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.index.IIndexFile;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.index.IndexLocationFactory;
import org.eclipse.cdt.core.model.AbstractLanguage;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ITranslationUnit;
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;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
/**
* @author Doug Schaefer
*
*/
class PDOMFullIndexerTask extends PDOMIndexerTask {
private final static Object REQUIRED= new Object();
private final static Object MISSING = new Object();
private final static Object SKIP= new Object();
private final static Object REQUIRED_IF_CONFIG_CHANGED= new Object();
private List fChanged = new LinkedList();
private List fRemoved = new ArrayList();
private IWritableIndex fIndex = null;
private Map filePathsToParse = new HashMap/*<IIndexFileLocation, Object>*/();
private Map fIflCache = new HashMap/*<String, IIndexFileLocation>*/();
public PDOMFullIndexerTask(PDOMFullIndexer indexer, ITranslationUnit[] added,
ITranslationUnit[] changed, ITranslationUnit[] removed) {
super(indexer);
fChanged.addAll(Arrays.asList(added));
fChanged.addAll(Arrays.asList(changed));
fRemoved.addAll(Arrays.asList(removed));
updateInfo(0, 0, fChanged.size() + fRemoved.size());
}
public void run(IProgressMonitor monitor) {
long start = System.currentTimeMillis();
try {
// separate headers remove files that have no scanner configuration
final boolean filterFiles= !getIndexAllFiles() && getAllFilesProvided();
List headers= new ArrayList();
List sources= fChanged;
for (Iterator iter = fChanged.iterator(); iter.hasNext();) {
ITranslationUnit tu = (ITranslationUnit) iter.next();
if (tu.isSourceUnit()) {
if (filterFiles && CoreModel.isScannerInformationEmpty(tu.getResource())) {
iter.remove();
updateInfo(0, 0, -1);
}
}
else {
headers.add(tu);
iter.remove();
}
}
if (!setupIndex()) {
return;
}
registerTUsInReaderFactory(sources);
registerTUsInReaderFactory(headers);
Iterator i= fRemoved.iterator();
while (i.hasNext()) {
if (monitor.isCanceled())
return;
ITranslationUnit tu = (ITranslationUnit)i.next();
removeTU(fIndex, tu, 0);
if (tu.isSourceUnit()) {
updateInfo(1, 0, 0);
}
else {
updateInfo(0, 1, -1);
}
}
fIndex.acquireReadLock();
try {
parseTUs(fIndex, 1, sources, headers, monitor);
}
finally {
fIndex.releaseReadLock();
}
} catch (CoreException e) {
CCorePlugin.log(e);
} catch (InterruptedException e) {
}
traceEnd(start, fIndex);
}
private boolean setupIndex() throws CoreException {
// there is no mechanism to clear dirty files from the cache, so flush it.
SavedCodeReaderFactory.getInstance().getCodeReaderCache().flush();
fIndex = ((IWritableIndexManager) CCorePlugin.getIndexManager()).getWritableIndex(getProject());
if (fIndex == null) {
return false;
}
fIndex.resetCacheCounters();
return true;
}
private void registerTUsInReaderFactory(Collection/*<ITranslationUnit>*/ sources)
throws CoreException {
int removed= 0;
filePathsToParse= new HashMap/*<IIndexFileLocation, Object>*/();
for (Iterator iter = sources.iterator(); iter.hasNext();) {
ITranslationUnit tu = (ITranslationUnit) iter.next();
IIndexFileLocation ifl= IndexLocationFactory.getIFL(tu);
if (updateAll()) {
filePathsToParse.put(ifl, REQUIRED);
}
else if (updateChangedTimestamps() && isOutdated(tu, fIndex.getFile(ifl))) {
filePathsToParse.put(ifl, REQUIRED);
}
else if (updateChangedConfiguration()) {
filePathsToParse.put(ifl, REQUIRED_IF_CONFIG_CHANGED);
}
else {
iter.remove();
removed++;
continue;
}
updateInfo(0, 0, -removed);
}
}
protected IIndexFileLocation findLocation(String absolutePath) {
IIndexFileLocation result = (IIndexFileLocation) fIflCache.get(absolutePath);
if(result==null) {
result = IndexLocationFactory.getIFLExpensive(getCProject(), absolutePath);
fIflCache.put(absolutePath, result);
}
return result;
}
protected IASTTranslationUnit createAST(AbstractLanguage lang, CodeReader codeReader, IScannerInfo scanInfo, int options, IProgressMonitor pm) throws CoreException {
SavedCodeReaderFactory codeReaderFactory= SavedCodeReaderFactory.getInstance();
IASTTranslationUnit ast= lang.getASTTranslationUnit(codeReader, scanInfo, codeReaderFactory, null, options, ParserUtil.getParserLogService());
if (pm.isCanceled()) {
return null;
}
return ast;
}
public boolean needToUpdate(IIndexFileLocation location, int confighash) throws CoreException {
if (super.needToUpdate(location, confighash)) {
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) {
IIndexFile file= fIndex.getFile(location);
if (file != null) {
int oldConfig= file.getScannerConfigurationHashcode();
if (oldConfig == 0 || oldConfig == confighash) {
required= SKIP;
updateInfo(0, 0, -1);
}
else {
required= REQUIRED;
}
filePathsToParse.put(location, required);
}
}
return required != SKIP;
}
return false;
}
protected boolean postAddToIndex(IIndexFileLocation location, IIndexFile file)
throws CoreException {
Object required= filePathsToParse.get(location);
filePathsToParse.put(location, SKIP);
return required == REQUIRED;
}
}

View file

@ -9,10 +9,7 @@
# Markus Schorn (Wind River Systems)
###############################################################################
PDOMIndexerTask_collectingFilesTask=Collecting files (project ''{0}'')
PDOMIndexerTask_tooManyIndexProblems=Too many problems while indexing project ''{0}'', stopping indexer.
PDOMImportTask_errorInvalidPDOMVersion=The version of the cdt-index to import for project {0} does not match
PDOMIndexerTask_parsingFileTask=parsing {0} ({1})
PDOMIndexerTask_errorWhileParsing=Error while parsing {0}.
PDOMImportTask_errorInvalidArchive=Invalid Archive: {0}
# {0} - task tag, {1} - task message.

View file

@ -25,3 +25,6 @@ TeamPDOMExportOperation_taskExportIndex=Export team shared index
TeamPDOMExportOperation_subtaskCreateDatabase=Creating database
TeamPDOMExportOperation_errorWriteTempFile=Cannot write to temporary file
TeamPDOMExportOperation_errorCreateArchive=Error creating archive
AbstractIndexerTask_parsingFileTask=parsing {0} ({1})
AbstractIndexerTask_errorWhileParsing=Error while parsing {0}.
AbstractIndexerTask_tooManyIndexProblems=Too many errors while indexing, stopping indexer.

View file

@ -531,19 +531,19 @@
id="nullindexer"
name="%CDTIndexer.nullindexer"
point="org.eclipse.cdt.core.CIndexer">
<run class="org.eclipse.cdt.internal.core.pdom.indexer.nulli.PDOMNullIndexer"/>
<run class="org.eclipse.cdt.internal.core.pdom.indexer.PDOMNullIndexer"/>
</extension>
<extension
id="fastIndexer"
name="%fastIndexer.name"
point="org.eclipse.cdt.core.CIndexer">
<run class="org.eclipse.cdt.internal.core.pdom.indexer.fast.PDOMFastIndexer"/>
<run class="org.eclipse.cdt.internal.core.pdom.indexer.PDOMFastIndexer"/>
</extension>
<extension
name="%CDTIndexer.domsourceindexer"
id="domsourceindexer"
point="org.eclipse.cdt.core.CIndexer">
<run class="org.eclipse.cdt.internal.core.pdom.indexer.full.PDOMFullIndexer"/>
<run class="org.eclipse.cdt.internal.core.pdom.indexer.PDOMFullIndexer"/>
</extension>
<extension
point="org.eclipse.core.variables.dynamicVariables">

View file

@ -53,7 +53,6 @@ import org.eclipse.cdt.internal.core.model.DeltaProcessor;
import org.eclipse.cdt.internal.core.model.IBufferFactory;
import org.eclipse.cdt.internal.core.model.Util;
import org.eclipse.cdt.internal.core.pdom.PDOMManager;
import org.eclipse.cdt.internal.core.pdom.indexer.fast.PDOMFastIndexer;
import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
@ -103,7 +102,7 @@ public class CCorePlugin extends Plugin {
public static final String INDEXER_SIMPLE_ID = "CIndexer"; //$NON-NLS-1$
public static final String INDEXER_UNIQ_ID = PLUGIN_ID + "." + INDEXER_SIMPLE_ID; //$NON-NLS-1$
public static final String PREF_INDEXER = "indexer"; //$NON-NLS-1$
public static final String DEFAULT_INDEXER = PDOMFastIndexer.ID;
public static final String DEFAULT_INDEXER = IPDOMManager.ID_FAST_INDEXER;
public final static String ERROR_PARSER_SIMPLE_ID = "ErrorParser"; //$NON-NLS-1$
public final static String ERROR_PARSER_UNIQ_ID = PLUGIN_ID + "." + ERROR_PARSER_SIMPLE_ID; //$NON-NLS-1$

View file

@ -43,6 +43,7 @@ import org.eclipse.ui.WorkbenchException;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexFile;
@ -98,7 +99,11 @@ public class BaseUITestCase extends BaseTestCase {
index.acquireReadLock();
try {
IIndexFile pfile= index.getFile(IndexLocationFactory.getWorkspaceIFL(file));
IIndexFile pfile= index.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(file));
if (pfile != null && pfile.getTimestamp() >= file.getLocalTimeStamp()) {
return;
}
pfile= index.getFile(ILinkage.C_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(file));
if (pfile != null && pfile.getTimestamp() >= file.getLocalTimeStamp()) {
return;
}

View file

@ -615,11 +615,11 @@ public class BasicCallHierarchyTest extends CallHierarchyBaseTest {
editor.selectAndReveal(content1.indexOf("sf"), 0);
openCallHierarchy(editor);
tree = getCHTreeViewer().getTree();
i0= checkTreeNode(tree, 0, "sf()");
checkTreeNode(tree, 0, "sf()");
assertEquals(1, tree.getItemCount());
i1= checkTreeNode(i0, 0, "sf()"); // sf()[f2] <- sf()[f2]
checkTreeNode(i0, 1, null); // not called by gf()
i1= checkTreeNode(tree, 0, 0, "sf()"); // sf()[f2] <- sf()[f2]
checkTreeNode(tree, 0, 1, null); // not called by gf()
expandTreeItem(i1);
checkTreeNode(i1, 0, null);

View file

@ -170,11 +170,11 @@ public class CallHierarchyAcrossProjectsTest extends CallHierarchyBaseTest {
openCallHierarchy(editor);
TreeViewer tv = getCHTreeViewer();
TreeItem item= checkTreeNode(tv.getTree(), 0, "MyClass::method3()");
TreeItem nextItem= checkTreeNode(item, 0, "MyClass::method2()");
checkTreeNode(item, 1, null); item= nextItem;
checkTreeNode(tv.getTree(), 0, "MyClass::method3()");
TreeItem item= checkTreeNode(tv.getTree(), 0, 0, "MyClass::method2()");
checkTreeNode(tv.getTree(), 0, 1, null);
tv.setExpandedState(item.getData(), true);
nextItem= checkTreeNode(item, 0, "MyClass::method1()");
TreeItem nextItem= checkTreeNode(item, 0, "MyClass::method1()");
checkTreeNode(item, 1, null); item= nextItem;
tv.setExpandedState(item.getData(), true);
checkTreeNode(item, 0, null);
@ -220,10 +220,10 @@ public class CallHierarchyAcrossProjectsTest extends CallHierarchyBaseTest {
openCallHierarchy(editor);
TreeViewer tv = getCHTreeViewer();
TreeItem item= checkTreeNode(tv.getTree(), 0, "MyClass::method3()");
TreeItem item0= checkTreeNode(item, 0, "MyClass::method1()");
TreeItem item1= checkTreeNode(item, 1, "MyClass::method2()");
checkTreeNode(item, 2, null); item= null;
checkTreeNode(tv.getTree(), 0, "MyClass::method3()");
TreeItem item0= checkTreeNode(tv.getTree(), 0, 0, "MyClass::method1()");
TreeItem item1= checkTreeNode(tv.getTree(), 0, 1, "MyClass::method2()");
checkTreeNode(tv.getTree(), 0, 2, null);
// method 1
tv.setExpandedState(item0.getData(), true);

View file

@ -12,6 +12,7 @@
package org.eclipse.cdt.internal.ui.includebrowser;
import java.util.ArrayList;
import java.util.Arrays;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
@ -154,9 +155,16 @@ public class IBContentProvider extends AsyncTreeContentProvider {
private IIndexInclude[] findIncludedBy(IIndex index, IIndexFileLocation ifl, IProgressMonitor pm) {
try {
if (ifl != null) {
IIndexFile file= index.getFile(ifl);
if (file != null) {
return index.findIncludedBy(file);
IIndexFile[] files= index.getFiles(ifl);
if (files.length == 1) {
return index.findIncludedBy(files[0]);
}
if (files.length > 0) {
ArrayList list= new ArrayList();
for (int i = 0; i < files.length; i++) {
list.addAll(Arrays.asList(index.findIncludedBy(files[i])));
}
return (IIndexInclude[]) list.toArray(new IIndexInclude[list.size()]);
}
}
}
@ -169,9 +177,16 @@ public class IBContentProvider extends AsyncTreeContentProvider {
public IIndexInclude[] findIncludesTo(IIndex index, IIndexFileLocation ifl, IProgressMonitor pm) {
try {
if (ifl != null) {
IIndexFile file= index.getFile(ifl);
if (file != null) {
return index.findIncludes(file);
IIndexFile[] files= index.getFiles(ifl);
if (files.length == 1) {
return index.findIncludes(files[0]);
}
if (files.length > 0) {
ArrayList list= new ArrayList();
for (int i = 0; i < files.length; i++) {
list.addAll(Arrays.asList(index.findIncludes(files[i])));
}
return (IIndexInclude[]) list.toArray(new IIndexInclude[list.size()]);
}
}
}

View file

@ -168,15 +168,16 @@ public class IndexUI {
if (tu != null) {
IIndexFileLocation location= IndexLocationFactory.getIFL(tu);
if (location != null) {
IIndexFile file= index.getFile(location);
if (file != null) {
IIndexFile[] files= index.getFiles(location);
for (int i = 0; i < files.length; i++) {
IIndexFile file = files[i];
String elementName= element.getElementName();
int idx= elementName.lastIndexOf(":")+1; //$NON-NLS-1$
ISourceRange pos= sf.getSourceRange();
IRegion region = getConvertedRegion(tu, file, pos.getIdStartPos()+idx, pos.getIdLength()-idx);
IIndexName[] names= file.findNames(region.getOffset(), region.getLength());
for (int i = 0; i < names.length; i++) {
IIndexName name = names[i];
for (int j = 0; j < names.length; j++) {
IIndexName name = names[j];
if (!name.isReference() && elementName.endsWith(new String(name.toCharArray()))) {
return name;
}
@ -195,8 +196,8 @@ public class IndexUI {
if (tu != null) {
IIndexFileLocation location= IndexLocationFactory.getIFL(tu);
if (location != null) {
IIndexFile file= index.getFile(location);
return file != null;
IIndexFile[] files= index.getFiles(location);
return files.length > 0;
}
}
}
@ -218,8 +219,9 @@ public class IndexUI {
if (tu != null) {
IIndexFileLocation location= IndexLocationFactory.getIFL(tu);
if (location != null) {
IIndexFile file= index.getFile(location);
if (file != null) {
IIndexFile[] files= index.getFiles(location);
for (int j=0; j<files.length; j++) {
IIndexFile file= files[j];
String elementName= include.getElementName();
elementName= elementName.substring(elementName.lastIndexOf('/')+1);
ISourceRange pos= include.getSourceRange();