diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/pdomdepgen/PDOMDependencyCalculator.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/pdomdepgen/PDOMDependencyCalculator.java index f8772e7baab..8d2a5dcbb09 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/pdomdepgen/PDOMDependencyCalculator.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/pdomdepgen/PDOMDependencyCalculator.java @@ -19,19 +19,18 @@ import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexFile; 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.CoreModel; import org.eclipse.cdt.core.model.ICProject; -import org.eclipse.cdt.internal.core.pdom.PDOM; -import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile; import org.eclipse.cdt.managedbuilder.core.IBuildObject; import org.eclipse.cdt.managedbuilder.core.ITool; import org.eclipse.cdt.managedbuilder.makegen.IManagedDependencyCalculator; +import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Path; -/** +/** * @author Doug Schaefer */ public class PDOMDependencyCalculator implements IManagedDependencyCalculator { @@ -44,7 +43,7 @@ public class PDOMDependencyCalculator implements IManagedDependencyCalculator { private IPath[] dependencies; public PDOMDependencyCalculator(IPath source, IResource resource, IBuildObject buildContext, ITool tool, IPath topBuildDirectory) { - this.source = source; + this.source = source; this.resource = resource; this.buildContext = buildContext; this.tool = tool; @@ -60,16 +59,16 @@ public class PDOMDependencyCalculator implements IManagedDependencyCalculator { if (resource != null) { ICProject project = CoreModel.getDefault().create(resource.getProject()); try { - IIndex index= CCorePlugin.getIndexManager().getIndex(project, IIndexManager.ADD_DEPENDENCIES); + IIndex index = CCorePlugin.getIndexManager().getIndex(project, IIndexManager.ADD_DEPENDENCIES); index.acquireReadLock(); try { - IIndexFile file = index.getFile(resource.getLocation()); + IIndexFile file = index.getFile(IndexLocationFactory.getWorkspaceIFL((IFile)resource)); if (file != null) { IIndexInclude[] includes = index.findIncludes(file, IIndex.DEPTH_INFINITE); List/**/ list = new ArrayList/**/(); for (int i = 0; i < includes.length; ++i) - list.add(new Path(includes[i].getIncludesLocation())); + list.add(IndexLocationFactory.getAbsolutePath(includes[i].getIncludesLocation())); dependencies = (IPath[])list.toArray(new IPath[list.size()]); } else diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java index c62bace8bc4..5ffa57016d7 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java @@ -29,6 +29,7 @@ import org.eclipse.cdt.core.index.IIndexInclude; import org.eclipse.cdt.core.index.IIndexMacro; import org.eclipse.cdt.core.index.IIndexName; import org.eclipse.cdt.core.index.IndexFilter; +import org.eclipse.cdt.core.index.IndexLocationFactory; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.testplugin.CProjectHelper; @@ -195,13 +196,13 @@ public class IndexBugsTests extends BaseTestCase { fIndex.acquireReadLock(); try { - IIndexFile ifile= fIndex.getFile(file.getLocation()); + IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(file)); assertNotNull(ifile); IIndexInclude[] includes= ifile.getIncludes(); assertEquals(1, includes.length); IIndexInclude i= includes[0]; - assertEquals(file.getLocation().toOSString(), i.getIncludedByLocation()); - assertEquals(include.getLocation().toOSString(), i.getIncludesLocation()); + assertEquals(file.getLocationURI(), i.getIncludedByLocation().getURI()); + assertEquals(include.getLocationURI(), i.getIncludesLocation().getURI()); assertEquals(true, i.isSystemInclude()); assertEquals(0, i.getNameOffset()); assertEquals(0, i.getNameLength()); @@ -225,13 +226,13 @@ public class IndexBugsTests extends BaseTestCase { fIndex.acquireReadLock(); try { - IIndexFile ifile= fIndex.getFile(file.getLocation()); + IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(file)); assertNotNull(ifile); IIndexInclude[] includes= ifile.getIncludes(); assertEquals(1, includes.length); IIndexInclude i= includes[0]; - assertEquals(file.getLocation().toOSString(), i.getIncludedByLocation()); - assertEquals(include.getLocation().toOSString(), i.getIncludesLocation()); + assertEquals(file.getLocationURI(), i.getIncludedByLocation().getURI()); + assertEquals(include.getLocationURI(), i.getIncludesLocation().getURI()); assertEquals(true, i.isSystemInclude()); assertEquals(0, i.getNameOffset()); assertEquals(0, i.getNameLength()); @@ -257,7 +258,7 @@ public class IndexBugsTests extends BaseTestCase { fIndex.acquireReadLock(); try { - IIndexFile ifile= fIndex.getFile(file.getLocation()); + IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(file)); assertNotNull(ifile); IIndexMacro[] macros= ifile.getMacros(); assertEquals(2, macros.length); diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexIncludeTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexIncludeTest.java index 345f6fc7a0b..5b7a3ee133d 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexIncludeTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexIncludeTest.java @@ -23,6 +23,7 @@ import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexFile; import org.eclipse.cdt.core.index.IIndexInclude; import org.eclipse.cdt.core.index.IndexFilter; +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.IPathEntry; @@ -133,7 +134,7 @@ public class IndexIncludeTest extends IndexTestBase { TestSourceReader.waitUntilFileIsIndexed(fIndex, file, 4000); fIndex.acquireReadLock(); try { - IIndexFile ifile= fIndex.getFile(file.getLocation()); + IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(file)); assertNotNull("Can't find " + file.getLocation(), ifile); assertTrue("timestamp not ok", ifile.getTimestamp() >= timestamp); @@ -160,7 +161,7 @@ public class IndexIncludeTest extends IndexTestBase { fIndex.acquireReadLock(); try { - IIndexFile ifile= fIndex.getFile(file.getLocation()); + IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(file)); assertNotNull(ifile); IIndexInclude[] includes= ifile.getIncludes(); assertEquals(2, includes.length); @@ -190,7 +191,7 @@ public class IndexIncludeTest extends IndexTestBase { fIndex.acquireReadLock(); try { - IIndexFile ifile= fIndex.getFile(file.getLocation()); + IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(file)); assertNotNull(ifile); IIndexInclude[] includes= ifile.getIncludes(); assertEquals(1, includes.length); @@ -205,7 +206,7 @@ public class IndexIncludeTest extends IndexTestBase { TestScannerProvider.sIncludes= null; } } - + private void checkInclude(IIndexInclude include, String content, String includeName, boolean isSystem) throws CoreException { int offset= content.indexOf(includeName); assertEquals(offset, include.getNameOffset()); diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexLocationTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexLocationTests.java new file mode 100644 index 00000000000..68eeff53369 --- /dev/null +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexLocationTests.java @@ -0,0 +1,5 @@ +package org.eclipse.cdt.internal.index.tests; + +public class IndexLocationTests { + +} diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/BTreeTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/BTreeTests.java index 66286c420f4..de8685ab20d 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/BTreeTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/BTreeTests.java @@ -50,7 +50,7 @@ public class BTreeTests extends BaseTestCase { // and invoke it multiple times per Junit test protected void init(int degree) throws Exception { dbFile = File.createTempFile("pdomtest", "db"); - db = new Database(dbFile.getAbsolutePath()); + db = new Database(dbFile); rootRecord = Database.DATA_AREA; comparator = new BTMockRecordComparator(); btree = new BTree(db, rootRecord, degree, comparator); diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/DBTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/DBTest.java index 6e709c2ca26..64c36d2d097 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/DBTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/DBTest.java @@ -37,7 +37,7 @@ public class DBTest extends TestCase { // Tests block size and simple first block File f = getTestDir().append("test1.dat").toFile(); f.delete(); - Database db = new Database(f.getCanonicalPath()); + Database db = new Database(f); assertEquals(0, db.getVersion()); final int realsize = 42; @@ -55,7 +55,7 @@ public class DBTest extends TestCase { // Tests free block linking File f = getTestDir().append("test2.dat").toFile(); f.delete(); - Database db = new Database(f.getCanonicalPath()); + Database db = new Database(f); final int realsize = 42; final int blocksize = (realsize / Database.MIN_SIZE + 1) * Database.MIN_SIZE; @@ -75,7 +75,7 @@ public class DBTest extends TestCase { // File f = getTestDir().append("test2.dat").toFile(); f.delete(); - Database db = new Database(f.getCanonicalPath()); + Database db = new Database(f); int mem1 = db.malloc(42); db.free(mem1); @@ -112,7 +112,7 @@ public class DBTest extends TestCase { // Tests inserting and retrieving strings File f = getTestDir().append("testStrings.dat").toFile(); f.delete(); - final Database db = new Database(f.getCanonicalPath()); + final Database db = new Database(f); String[] names = { "ARLENE", diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/FilesOnReindexTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/FilesOnReindexTests.java index 243343bfbdc..e48afb3a530 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/FilesOnReindexTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/FilesOnReindexTests.java @@ -19,6 +19,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexFile; import org.eclipse.cdt.core.index.IndexFilter; +import org.eclipse.cdt.core.index.IndexLocationFactory; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.internal.core.CCoreInternals; import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; @@ -68,13 +69,13 @@ public class FilesOnReindexTests extends PDOMTestBase { void performAssertions(IFile file) throws CoreException { IIndex index = CCorePlugin.getIndexManager().getIndex(project); - assertNotNull(index.getFile(file.getLocation())); + assertNotNull(index.getFile(IndexLocationFactory.getWorkspaceIFL(file))); IBinding[] bs = index.findBindings(Pattern.compile("C"), true, new IndexFilter(), new NullProgressMonitor()); assertEquals(1, bs.length); PDOMBinding binding = (PDOMBinding) bs[0]; IIndexFile file2 = binding.getFirstDefinition().getFile(); - assertEquals(file.getLocation().toOSString(), file2.getLocation()); + assertEquals(file.getLocationURI(), file2.getLocation().getURI()); } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IncludesTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IncludesTests.java index f281fdec060..5fc875ea8b0 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IncludesTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IncludesTests.java @@ -16,8 +16,10 @@ import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexFile; import org.eclipse.cdt.core.index.IIndexInclude; +import org.eclipse.cdt.core.index.IndexLocationFactory; import org.eclipse.cdt.core.model.ICProject; -import org.eclipse.core.runtime.IPath; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IResource; /** * @author Doug Schaefer @@ -26,37 +28,37 @@ import org.eclipse.core.runtime.IPath; public class IncludesTests extends PDOMTestBase { protected ICProject project; - protected IIndex pdom; + protected IIndex index; public static Test suite() { return suite(IncludesTests.class); } protected void setUp() throws Exception { - if (pdom == null) { + if (index == null) { project = createProject("includesTests"); - pdom = CCorePlugin.getIndexManager().getIndex(project); + index = CCorePlugin.getIndexManager().getIndex(project); } - pdom.acquireReadLock(); + index.acquireReadLock(); } protected void tearDown() throws Exception { - pdom.releaseReadLock(); + index.releaseReadLock(); } public void testIncludedBy() throws Exception { - IPath loc = project.getProject().getLocation().append("I2.h"); - IIndexFile file = pdom.getFile(loc); + IResource loc = project.getProject().findMember("I2.h"); + IIndexFile file = index.getFile(IndexLocationFactory.getWorkspaceIFL((IFile)loc)); assertNotNull(file); - IIndexInclude[] allIncludedBy = pdom.findIncludedBy(file, -1); + IIndexInclude[] allIncludedBy = index.findIncludedBy(file, -1); assertEquals(9, allIncludedBy.length); // i.e. all of them } public void testIncludes() throws Exception { - IPath loc = project.getProject().getLocation().append("I1.cpp"); - IIndexFile file = pdom.getFile(loc); + IResource loc = project.getProject().findMember("I1.cpp"); + IIndexFile file = index.getFile(IndexLocationFactory.getWorkspaceIFL((IFile)loc)); assertNotNull(file); - IIndexInclude[] allIncludesTo= pdom.findIncludes(file, -1); + IIndexInclude[] allIncludesTo= index.findIncludes(file, -1); assertEquals(2, allIncludesTo.length); // i.e. I1.h, I2.h } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IndexBindingResolutionTestBase.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IndexBindingResolutionTestBase.java index ba328a27c0e..a6c53b520c7 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IndexBindingResolutionTestBase.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IndexBindingResolutionTestBase.java @@ -62,8 +62,6 @@ public abstract class IndexBindingResolutionTestBase extends PDOMTestBase { IFile file = TestSourceReader.createFile(cproject.getProject(), header, testData[0].toString()); CCoreInternals.getPDOMManager().setIndexerId(cproject, IPDOMManager.ID_FAST_INDEXER); assertTrue(CCorePlugin.getIndexManager().joinIndexer(360000, new NullProgressMonitor())); - - /* ((PDOM)CCoreInternals.getPDOMManager().getPDOM(cproject)).accept(new PDOMPrettyPrinter()); */ IFile cppfile= TestSourceReader.createFile(cproject.getProject(), references, testData[1].toString()); assertTrue(CCorePlugin.getIndexManager().joinIndexer(360000, new NullProgressMonitor())); diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IndexCPPBindingResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IndexCPPBindingResolutionTest.java index 273f0289518..0ead60d597f 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IndexCPPBindingResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IndexCPPBindingResolutionTest.java @@ -77,12 +77,38 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas IBinding b7 = getBindingFromASTName("method(cp->cspp);/*2*/", 6); } + // // header file + // class C {public: class Base {}; static Base b; }; + // C::Base C::b = *(new C::Base()); + // namespace N { class Base2 {}; Base2 b2; }; + + // // references + // void foo(C::Base b) {} + // void foo2(N::Base2 b2) {} + // class D : public C::Base {}; + // class E : public N::Base2 {}; + // void bar() { foo(C::b); foo2(N::b2); } + public void _testSomeMore() { + IBinding b0 = getBindingFromASTName("Base {}", 4); + IBinding b1 = getBindingFromASTName("Base2 {}", 5); + IBinding b2 = getBindingFromASTName("foo(C::Base b)", 3); + IBinding b3 = getBindingFromASTName("foo2(N::Base2 b2)", 4); + IBinding b4 = getBindingFromASTName("C::b", 1); + IBinding b5 = getBindingFromASTName("N::b2", 1); + IBinding b6 = getBindingFromASTName("b); f", 1); + IBinding b7 = getBindingFromASTName("b2); }", 2); + IBinding b8 = getBindingFromASTName("foo(C::b)", 3); + IBinding b9 = getBindingFromASTName("foo2(N::b2)", 4); + } + + // // header file // class C {}; struct S {}; union U {}; enum E {ER1,ER2,ER3}; // int var1; C var2; S *var3; void func(E); void func(C); // namespace ns {} // typedef int Int; typedef int *IntPtr; // void func(int*); void func(int); + // // referencing file // #include "header.h" // void references() { diff --git a/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/testplugin/util/TestSourceReader.java b/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/testplugin/util/TestSourceReader.java index 543ecfd5a46..d625cfa7d2f 100644 --- a/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/testplugin/util/TestSourceReader.java +++ b/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/testplugin/util/TestSourceReader.java @@ -29,6 +29,7 @@ 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.IndexLocationFactory; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; @@ -209,18 +210,19 @@ public class TestSourceReader { final IFile result[] = new IFile[1]; ws.run(new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { - //Obtain file handle - IFile file = container.getFile(filePath); - InputStream stream = new ByteArrayInputStream(contents.getBytes()); - //Create file input stream - if (file.exists()) { - file.setContents(stream, false, false, new NullProgressMonitor()); - } - else { - file.create(stream, false, new NullProgressMonitor()); - } + //Obtain file handle + IFile file = container.getFile(filePath); + + InputStream stream = new ByteArrayInputStream(contents.getBytes()); + //Create file input stream + if (file.exists()) { + file.setContents(stream, false, false, new NullProgressMonitor()); + } + else { + file.create(stream, false, new NullProgressMonitor()); + } result[0]= file; - } + } }, null); return result[0]; } @@ -256,7 +258,7 @@ public class TestSourceReader { Assert.assertTrue(CCorePlugin.getIndexManager().joinIndexer(timeLeft, new NullProgressMonitor())); index.acquireReadLock(); try { - IIndexFile pfile= index.getFile(file.getLocation()); + IIndexFile pfile= index.getFile(IndexLocationFactory.getWorkspaceIFL(file)); if (pfile != null && pfile.getTimestamp() >= file.getLocalTimeStamp()) { return; } diff --git a/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF b/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF index 74312c4bbf9..650bde99d4f 100644 --- a/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF +++ b/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF @@ -80,6 +80,7 @@ Require-Bundle: org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)", org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)", org.eclipse.text;bundle-version="[3.2.0,4.0.0)", org.eclipse.core.variables;bundle-version="[3.1.100,4.0.0)", - org.eclipse.core.filebuffers;bundle-version="[3.2.0,4.0.0)" + org.eclipse.core.filebuffers;bundle-version="[3.2.0,4.0.0)", + org.eclipse.core.filesystem;bundle-version="[1.1.0,2.0.0)" Eclipse-LazyStart: true Bundle-RequiredExecutionEnvironment: J2SE-1.4 diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndex.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndex.java index 106f5e8657c..d076ff586ab 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndex.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndex.java @@ -7,6 +7,7 @@ * * Contributors: * Markus Schorn - initial API and implementation + * Andrew Ferguson (Symbian) *******************************************************************************/ package org.eclipse.cdt.core.index; @@ -16,7 +17,6 @@ import java.util.regex.Pattern; import org.eclipse.cdt.core.dom.IName; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; /** @@ -125,12 +125,13 @@ public interface IIndex { public long getLastWriteAccess(); /** - * Looks for a file with the given location. May return null. - * @param location absolute path of the file location + * Looks for a file with the given location. Will return null if there + * is no entry in the index for the given location. + * @param location an IIndexFileLocation representing the location of the file * @return the file in the index or null * @throws CoreException */ - public IIndexFile getFile(IPath location) throws CoreException; + public IIndexFile getFile(IIndexFileLocation location) throws CoreException; /** * Looks for include relations originated by the given file. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexFile.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexFile.java index 10261cf6542..a0419339fa4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexFile.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexFile.java @@ -7,6 +7,7 @@ * * Contributors: * Markus Schorn - initial API and implementation + * Andrew Ferguson (Symbian) *******************************************************************************/ package org.eclipse.cdt.core.index; @@ -29,13 +30,12 @@ import org.eclipse.core.runtime.CoreException; * @since 4.0 */ public interface IIndexFile { - /** - * Returns the absolute path of the location of the file. - * @return the absolute path of the location of the file + * Returns an IIndexFileLocation representing the location of this file + * @return an IIndexFileLocation representing the location of this file * @throws CoreException */ - String getLocation() throws CoreException; + IIndexFileLocation getLocation() throws CoreException; /** * Returns all includes found in this file. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexFileLocation.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexFileLocation.java new file mode 100644 index 00000000000..5dc6757d5c1 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexFileLocation.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright (c) 2006 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.core.index; + +import java.net.URI; + +/** + * Files in the index are (conceptually) partitioned into workspace and non-workspace (external) files. + * Clients can obtain instances of IIndexFileLocation implementations from {@link IndexLocationFactory} + *

+ * This interface is not intended to be implemented by clients. + *

+ *

+ * EXPERIMENTAL. 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. + *

+ * + * @since 4.0 + */ +public interface IIndexFileLocation { + /** + * The URI of the indexed file + * @return the URI of the indexed file (non-null) + */ + public URI getURI(); + + /** + * Return the workspace relative path of the indexed file or null if the file + * is not in the workspace + * @return the workspace relative path of the file in the index, or null if the + * file is not in the workspace + */ + public String getFullPath(); +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexInclude.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexInclude.java index c00bd8fb451..112d71114ed 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexInclude.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexInclude.java @@ -7,6 +7,7 @@ * * Contributors: * Markus Schorn - initial API and implementation + * Andrew Ferguson (Symbian) *******************************************************************************/ package org.eclipse.cdt.core.index; @@ -38,18 +39,18 @@ public interface IIndexInclude { IIndexFile getIncludedBy() throws CoreException; /** - * Returns the absolute path of the location of the file that contains this directive. - * @return the absolute path of the location of the file performing the include + * Returns the IIndexFileLocation of the file that contains this directive. + * @return the IIndexFileLocation of the file performing the include * @throws CoreException */ - String getIncludedByLocation() throws CoreException; + IIndexFileLocation getIncludedByLocation() throws CoreException; /** - * Returns the absolute path of the location of the file that is included by this directive. - * @return the absolute path of the location of the file that is included by this directive + * Returns the IIndexFileLocation of the file that is included by this directive. + * @return the IIndexFileLocation of the file that is included by this directive * @throws CoreException */ - String getIncludesLocation() throws CoreException; + IIndexFileLocation getIncludesLocation() throws CoreException; /** * Returns the character offset of the name of the include in its source file. The name does diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexName.java index 7c6b79fa1fd..8405b84c159 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexName.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexName.java @@ -7,6 +7,7 @@ * * Contributors: * Markus Schorn - initial API and implementation + * Andrew Ferguson (Symbian) *******************************************************************************/ package org.eclipse.cdt.core.index; @@ -31,11 +32,6 @@ import org.eclipse.core.runtime.CoreException; * @since 4.0 */ public interface IIndexName extends IName { - /** - * Returns the location of the file the name resides in. - */ - public String getFileName(); - /** * Returns the file the name belongs to. * @throws CoreException diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IndexLocationFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IndexLocationFactory.java new file mode 100644 index 00000000000..ebf5c798fd4 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IndexLocationFactory.java @@ -0,0 +1,98 @@ +/******************************************************************************* + * Copyright (c) 2006 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.core.index; + +import org.eclipse.cdt.core.model.ITranslationUnit; +import org.eclipse.cdt.internal.core.index.IndexFileLocation; +import org.eclipse.core.filesystem.URIUtil; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; + +/** + * Factory for obtaining instances of IIndexFileLocation for workspace or external files, and + * some utility methods for going in the opposite direction. + */ +public class IndexLocationFactory { + /** + * Returns + * + * @param location + * @return the workspace root relative path, a local file system absolute path or null + */ + public static IPath getPath(IIndexFileLocation location) { + String fp = location.getFullPath(); + if(fp!=null) { + return new Path(fp); + } + return getAbsolutePath(location); + } + + /** + * Returns the absolute file path of an URI or null if the + * URI is not a filesystem path. + * @param uri + * @return + */ + public static IPath getAbsolutePath(IIndexFileLocation location) { + return URIUtil.toPath(location.getURI()); + } + + public static IIndexFileLocation getIFLExpensive(String absolutePath) { + IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(new Path(absolutePath)); + if(files.length==1) { + return getWorkspaceIFL(files[0]); + } + return new IndexFileLocation(URIUtil.toURI(absolutePath), null); + } + + public static IIndexFileLocation getExternalIFL(String absolutePath) { + return getExternalIFL(new Path(absolutePath)); + } + + public static IIndexFileLocation getExternalIFL(IPath absolutePath) { + return new IndexFileLocation(URIUtil.toURI(absolutePath), null); + } + + public static IIndexFileLocation getWorkspaceIFL(IFile file) { + return new IndexFileLocation(file.getLocationURI(), file.getFullPath().toString()); + } + + /** + * Returns + * @param tu + * @return + */ + public static IIndexFileLocation getIFL(ITranslationUnit tu) { + IResource res = tu.getResource(); + if(res instanceof IFile) { + return getWorkspaceIFL((IFile)res); + } else { + IPath location = tu.getLocation(); + if(location!=null) { + return getExternalIFL(location); + } else { + return null; + } + } + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java index 3e0ce25b51a..00ad276eeb0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java @@ -2005,7 +2005,7 @@ public class CPPVisitor { } public static String [] getQualifiedName( IBinding binding ){ - IASTName [] ns = null; + IName [] ns = null; try { ICPPScope scope = (ICPPScope) binding.getScope(); while( scope != null ){ @@ -2020,12 +2020,12 @@ public class CPPVisitor { if( scope instanceof ICPPNamespaceScope && scope.getScopeName().toCharArray().length == 0 ) break; - ns = (IASTName[]) ArrayUtil.append( IASTName.class, ns, n ); + ns = (IName[]) ArrayUtil.append( IName.class, ns, n ); scope = (ICPPScope) scope.getParent(); } } catch ( DOMException e ) { } - ns = (IASTName[]) ArrayUtil.trim( IASTName.class, ns ); + ns = (IName[]) ArrayUtil.trim( IName.class, ns ); String [] result = new String[ ns.length + 1 ]; for( int i = ns.length - 1; i >= 0; i-- ){ result[ ns.length - i - 1 ] = ns[i].toString(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/CIndex.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/CIndex.java index ecb7b0c4f0f..aec355416c4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/CIndex.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/CIndex.java @@ -26,11 +26,11 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexFile; +import org.eclipse.cdt.core.index.IIndexFileLocation; import org.eclipse.cdt.core.index.IIndexInclude; import org.eclipse.cdt.core.index.IIndexName; import org.eclipse.cdt.core.index.IndexFilter; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.SubProgressMonitor; @@ -177,11 +177,10 @@ public class CIndex implements IIndex { return findNames(binding, FIND_REFERENCES); } - public IIndexFile getFile(IPath location) throws CoreException { + public IIndexFile getFile(IIndexFileLocation location) throws CoreException { IIndexFile result= null; - String path= location.toOSString(); for (int i = 0; result==null && i < fPrimaryFragmentCount; i++) { - result= fFragments[i].getFile(path); + result= fFragments[i].getFile(location); } return result; } @@ -195,7 +194,8 @@ public class CIndex implements IIndex { return result; } } - String location= include.getIncludesLocation(); + + IIndexFileLocation location= include.getIncludesLocation(); for (int i = 0; i < fPrimaryFragmentCount; i++) { IIndexFragment otherFrag = fFragments[i]; if (otherFrag != frag) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/EmptyCIndex.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/EmptyCIndex.java index 59d1a30226a..e82917cb39c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/EmptyCIndex.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/EmptyCIndex.java @@ -18,11 +18,11 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexFile; +import org.eclipse.cdt.core.index.IIndexFileLocation; import org.eclipse.cdt.core.index.IIndexInclude; import org.eclipse.cdt.core.index.IIndexName; import org.eclipse.cdt.core.index.IndexFilter; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; final public class EmptyCIndex implements IIndex { @@ -47,7 +47,7 @@ final public class EmptyCIndex implements IIndex { return IIndexFragmentName.EMPTY_NAME_ARRAY; } - public IIndexFile getFile(IPath location) { + public IIndexFile getFile(IIndexFileLocation location) { return null; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragment.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragment.java index 2ca4c96b977..6a7b73ca772 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragment.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragment.java @@ -16,6 +16,7 @@ import java.util.regex.Pattern; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.index.IIndex; +import org.eclipse.cdt.core.index.IIndexFileLocation; import org.eclipse.cdt.core.index.IndexFilter; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; @@ -50,11 +51,11 @@ public interface IIndexFragment { /** * Returns the file for the given location. May return null, if no such file exists. * This method may only return files that are actually managed by this fragement. - * @param location absolute path to the location of the file + * @param location the IIndexFileLocation representing the location of the file * @return the file for the location * @throws CoreException */ - IIndexFragmentFile getFile(String location) throws CoreException; + IIndexFragmentFile getFile(IIndexFileLocation location) throws CoreException; /** * Returns all include directives that point to the given file. The input file may belong to diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndex.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndex.java index 0b1ba63822a..e4df0d8b8b1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndex.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndex.java @@ -7,6 +7,7 @@ * * Contributors: * Markus Schorn - initial API and implementation + * Andrew Ferguson (Symbian) *******************************************************************************/ package org.eclipse.cdt.internal.core.index; @@ -15,8 +16,8 @@ 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.IIndexFileLocation; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; /** * Interface used by the indexer to write to the index. @@ -28,13 +29,14 @@ public interface IWritableIndex extends IIndex { /** * Creates a file object for the given location or returns an existing one. */ - IIndexFragmentFile addFile(IPath fileLocation) throws CoreException; + IIndexFragmentFile addFile(IIndexFileLocation fileLocation) throws CoreException; /** * Adds content to the given file. */ void setFileContent(IIndexFragmentFile sourceFile, IASTPreprocessorIncludeStatement[] includes, + IIndexFileLocation[] includeLocations, IASTPreprocessorMacroDefinition[] macros, IASTName[][] names) throws CoreException; /** diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndexFragment.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndexFragment.java index 091cfaa3a2e..3550708aca8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndexFragment.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndexFragment.java @@ -7,6 +7,7 @@ * * Contributors: * Markus Schorn - initial API and implementation + * Andrew Ferguson (Symbian) *******************************************************************************/ package org.eclipse.cdt.internal.core.index; @@ -14,6 +15,7 @@ package org.eclipse.cdt.internal.core.index; 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.IIndexFileLocation; import org.eclipse.core.runtime.CoreException; /** @@ -33,8 +35,11 @@ public interface IWritableIndexFragment extends IIndexFragment { /** * Creates a file object for the given location 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(String fileLocation) throws CoreException; + IIndexFragmentFile addFile(IIndexFileLocation fileLocation) throws CoreException; /** * Adds an include to the given file. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexBasedCodeReaderFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexBasedCodeReaderFactory.java index bb6d1dbf0e7..8180eac2d21 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexBasedCodeReaderFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexBasedCodeReaderFactory.java @@ -8,6 +8,7 @@ * Contributors: * QNX - Initial API and implementation * Markus Schorn (Wind River Systems) + * Andrew Ferguson (Symbian) *******************************************************************************/ package org.eclipse.cdt.internal.core.index; @@ -24,9 +25,10 @@ import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ICodeReaderFactory; 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.IIndexMacro; -import org.eclipse.cdt.core.model.ITranslationUnit; +import org.eclipse.cdt.core.index.IndexLocationFactory; import org.eclipse.cdt.core.parser.CodeReader; import org.eclipse.cdt.core.parser.ICodeReaderCache; import org.eclipse.cdt.core.parser.IMacro; @@ -35,7 +37,6 @@ import org.eclipse.cdt.core.parser.ParserUtil; import org.eclipse.cdt.internal.core.parser.scanner2.ObjectStyleMacro; import org.eclipse.cdt.internal.core.pdom.dom.PDOMMacro; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.Path; /** * @author Doug Schaefer @@ -45,12 +46,15 @@ public class IndexBasedCodeReaderFactory implements ICodeReaderFactory { private final static boolean CASE_SENSITIVE_FILES= !new File("a").equals(new File("A")); //$NON-NLS-1$//$NON-NLS-2$ private final IIndex index; - private Map fileInfoCache = new HashMap(); // filename, fileInfo + private Map/**/ fileInfoCache; + private Map/**/ iflCache; private List usedMacros = new ArrayList(); private static final char[] EMPTY_CHARS = new char[0]; - private static class NeedToParseException extends Exception {} + private static class NeedToParseException extends Exception { + private static final long serialVersionUID = 1L; + } public static class FileInfo { private FileInfo() {} public IIndexFile fFile= null; @@ -66,9 +70,14 @@ public class IndexBasedCodeReaderFactory implements ICodeReaderFactory { } } - public IndexBasedCodeReaderFactory(IIndex index) { + this(index, new HashMap/**/()); + } + + public IndexBasedCodeReaderFactory(IIndex index, Map iflCache) { this.index = index; + this.fileInfoCache = new HashMap/**/(); + this.iflCache = iflCache; } public int getUniqueIdentifier() { @@ -95,7 +104,8 @@ public class IndexBasedCodeReaderFactory implements ICodeReaderFactory { } } try { - FileInfo info= createInfo(canonicalPath, null); + IIndexFileLocation incLocation = findLocation(canonicalPath); + FileInfo info= createInfo(incLocation, null); // try to build macro dictionary off index if (info.fFile != null) { @@ -133,17 +143,17 @@ public class IndexBasedCodeReaderFactory implements ICodeReaderFactory { return ParserUtil.createReader(canonicalPath, null); } - private FileInfo createInfo(String location, IIndexFile file) throws CoreException { + private FileInfo createInfo(IIndexFileLocation location, IIndexFile file) throws CoreException { FileInfo info= (FileInfo) fileInfoCache.get(location); if (info == null) { info= new FileInfo(); - info.fFile= file == null ? index.getFile(new Path(location)) : file; + info.fFile= file == null ? index.getFile(location) : file; fileInfoCache.put(location, info); } return info; } - private void getInfosForMacroDictionary(FileInfo fileInfo, LinkedHashSet target) throws CoreException, NeedToParseException { + private void getInfosForMacroDictionary(FileInfo fileInfo, LinkedHashSet/**/ target) throws CoreException, NeedToParseException { if (!target.add(fileInfo)) { return; } @@ -181,11 +191,14 @@ public class IndexBasedCodeReaderFactory implements ICodeReaderFactory { return null; } - public FileInfo createFileInfo(String location) throws CoreException { + public FileInfo createFileInfo(IIndexFileLocation location) throws CoreException { return createInfo(location, null); } - - public FileInfo createFileInfo(ITranslationUnit tu) throws CoreException { - return createInfo(tu.getLocation().toOSString(), null); + + public IIndexFileLocation findLocation(String absolutePath) { + if(!iflCache.containsKey(absolutePath)) { + iflCache.put(absolutePath, IndexLocationFactory.getIFLExpensive(absolutePath)); + } + return (IIndexFileLocation) iflCache.get(absolutePath); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexFileLocation.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexFileLocation.java new file mode 100644 index 00000000000..6c249285abc --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexFileLocation.java @@ -0,0 +1,65 @@ +/******************************************************************************* + * Copyright (c) 2006 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.index; + +import java.net.URI; + +import org.eclipse.cdt.core.index.IIndexFileLocation; + +/** + * An implementation of IIndexFileLocation + */ +public class IndexFileLocation implements IIndexFileLocation { + private final URI uri; + private final String fullPath; + + public IndexFileLocation(URI uri, String fullPath) { + if(uri==null) + throw new IllegalArgumentException(); + this.uri = uri; + this.fullPath = fullPath; + } + + /* + * (non-Javadoc) + * @see org.eclipse.cdt.core.index.IIndexFileLocation#getFullPath() + */ + public String getFullPath() { + return fullPath; + } + + /* + * (non-Javadoc) + * @see org.eclipse.cdt.core.index.IIndexFileLocation#getURI() + */ + public URI getURI() { + return uri; + } + + /* + * (non-Javadoc) + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object obj) { + if(obj instanceof IIndexFileLocation) { + return uri.equals(((IIndexFileLocation)obj).getURI()); + } + return false; + } + + /* + * (non-Javadoc) + * @see java.lang.Object#hashCode() + */ + public int hashCode() { + return uri.hashCode(); + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/WritableCIndex.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/WritableCIndex.java index dd43f620d71..8661ed376f1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/WritableCIndex.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/WritableCIndex.java @@ -7,6 +7,7 @@ * * Contributors: * Markus Schorn - initial API and implementation + * Andrew Ferguson (Symbian) *******************************************************************************/ package org.eclipse.cdt.internal.core.index; @@ -14,9 +15,8 @@ package org.eclipse.cdt.internal.core.index; 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.IIndexFileLocation; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Path; public class WritableCIndex extends CIndex implements IWritableIndex { @@ -35,12 +35,12 @@ public class WritableCIndex extends CIndex implements IWritableIndex { return result; } - public IIndexFragmentFile addFile(IPath fileLocation) throws CoreException { + public IIndexFragmentFile addFile(IIndexFileLocation fileLocation) throws CoreException { IWritableIndexFragment frag= selectFragment(fileLocation); - return frag.addFile(fileLocation.toOSString()); + return frag.addFile(fileLocation); } - private IWritableIndexFragment selectFragment(IPath fileLocation) { + private IWritableIndexFragment selectFragment(IIndexFileLocation fileLocation) { // todo handling of multiple writable indices assert fWritableFragments.length == 1; return fWritableFragments[0]; @@ -57,6 +57,7 @@ public class WritableCIndex extends CIndex implements IWritableIndex { public void setFileContent(IIndexFragmentFile file, IASTPreprocessorIncludeStatement[] includes, + IIndexFileLocation[] includeLocations, IASTPreprocessorMacroDefinition[] macros, IASTName[][] names) throws CoreException { IIndexFragment indexFragment = file.getIndexFragment(); @@ -64,8 +65,7 @@ public class WritableCIndex extends CIndex implements IWritableIndex { IIndexFragmentFile[] destFiles= new IIndexFragmentFile[includes.length]; for (int i = 0; i < includes.length; i++) { - IASTPreprocessorIncludeStatement statement = includes[i]; - destFiles[i]= addFile(new Path(statement.getPath())); + destFiles[i]= addFile(includeLocations[i]); } ((IWritableIndexFragment) indexFragment).addFileContent(file, includes, destFiles, macros, names); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java index 71885fb90a2..5fed95137e2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java @@ -12,6 +12,7 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom; +import java.io.File; import java.util.ArrayList; import java.util.BitSet; import java.util.Collection; @@ -29,8 +30,9 @@ import org.eclipse.cdt.core.dom.IPDOMNode; import org.eclipse.cdt.core.dom.IPDOMVisitor; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; -import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexBinding; +import org.eclipse.cdt.core.index.IIndex; +import org.eclipse.cdt.core.index.IIndexFileLocation; import org.eclipse.cdt.core.index.IIndexName; import org.eclipse.cdt.core.index.IndexFilter; import org.eclipse.cdt.core.model.LanguageManager; @@ -42,6 +44,7 @@ import org.eclipse.cdt.internal.core.index.IIndexFragmentName; import org.eclipse.cdt.internal.core.index.IIndexProxyBinding; import org.eclipse.cdt.internal.core.pdom.db.BTree; import org.eclipse.cdt.internal.core.pdom.db.Database; +import org.eclipse.cdt.internal.core.pdom.dom.IIndexLocationConverter; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory; import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile; @@ -49,9 +52,7 @@ import org.eclipse.cdt.internal.core.pdom.dom.PDOMInclude; import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; import org.eclipse.cdt.internal.core.pdom.dom.PDOMName; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; -import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile.Finder; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.PlatformObject; import org.eclipse.core.runtime.Status; @@ -85,6 +86,7 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM { // 16 - have PDOMCPPField store type information, and PDOMCPPNamespaceAlias store what it is aliasing // 17 - use single linked list for names in file, adds a link to enclosing defintion name. // 18 - distinction between c-unions and c-structs. + // 19 - alter representation of paths in the pdom (162172) public static final int LINKAGES = Database.DATA_AREA; public static final int FILE_INDEX = Database.DATA_AREA + 4; @@ -92,16 +94,23 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM { // Local caches private BTree fileIndex; private Map fLinkageIDCache = new HashMap(); - private IPath fPath; - - public PDOM(IPath dbPath) throws CoreException { + private File fPath; + private IIndexLocationConverter locationConverter; + + public PDOM(File dbPath, IIndexLocationConverter locationConverter) throws CoreException { // Load up the database fPath= dbPath; - db = new Database(dbPath.toOSString()); + db = new Database(fPath); if (db.getVersion() == VERSION) { readLinkages(); } + + this.locationConverter = locationConverter; + } + + public IIndexLocationConverter getLocationConverter() { + return locationConverter; } public boolean versionMismatch() { @@ -155,17 +164,14 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM { return fileIndex; } - public IIndexFragmentFile getFile(String path) throws CoreException { - Finder finder = new Finder(db, path); - getFileIndex().accept(finder); - int record = finder.getRecord(); - return record != 0 ? new PDOMFile(this, record) : null; + public IIndexFragmentFile getFile(IIndexFileLocation location) throws CoreException { + return PDOMFile.findFile(this, getFileIndex(), location, locationConverter); } - protected IIndexFragmentFile addFile(String path) throws CoreException { - IIndexFragmentFile file = getFile(path); + protected IIndexFragmentFile addFile(IIndexFileLocation location) throws CoreException { + IIndexFragmentFile file = getFile(location); if (file == null) { - PDOMFile pdomFile = new PDOMFile(this, path); + PDOMFile pdomFile = new PDOMFile(this, location); getFileIndex().insert(pdomFile.getRecord()); file= pdomFile; } @@ -571,7 +577,7 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM { return (PDOMFile) getFile(file.getLocation()); } - public IPath getPath() { + public File getPath() { return fPath; } } \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java index fd2e07a9197..abb5967bed9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java @@ -11,6 +11,7 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom; +import java.io.File; import java.text.MessageFormat; import java.util.HashMap; import java.util.Iterator; @@ -24,8 +25,8 @@ import org.eclipse.cdt.core.dom.IPDOM; import org.eclipse.cdt.core.dom.IPDOMIndexer; import org.eclipse.cdt.core.dom.IPDOMIndexerTask; import org.eclipse.cdt.core.dom.IPDOMManager; -import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexChangeListener; +import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexerStateListener; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ICElementDelta; @@ -37,6 +38,7 @@ import org.eclipse.cdt.internal.core.index.IndexChangeEvent; import org.eclipse.cdt.internal.core.index.IndexFactory; import org.eclipse.cdt.internal.core.index.IndexerStateEvent; import org.eclipse.cdt.internal.core.pdom.PDOM.IListener; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMProjectIndexLocationConverter; import org.eclipse.cdt.internal.core.pdom.indexer.nulli.PDOMNullIndexer; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResourceDelta; @@ -177,7 +179,7 @@ public class PDOMManager implements IPDOMManager, IWritableIndexManager, IListen dbPath= CCorePlugin.getDefault().getStateLocation().append(dbName); } - pdom = new WritablePDOM(dbPath); + pdom = new WritablePDOM(new File(dbPath.toOSString()), new PDOMProjectIndexLocationConverter(rproject)); pdom.addListener(this); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/WritablePDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/WritablePDOM.java index 797c1375bcf..0b5088b4f7d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/WritablePDOM.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/WritablePDOM.java @@ -11,27 +11,29 @@ package org.eclipse.cdt.internal.core.pdom; +import java.io.File; import java.text.MessageFormat; import org.eclipse.cdt.core.CCorePlugin; 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.IIndexFileLocation; import org.eclipse.cdt.internal.core.index.IIndexFragmentFile; import org.eclipse.cdt.internal.core.index.IWritableIndexFragment; +import org.eclipse.cdt.internal.core.pdom.dom.IIndexLocationConverter; import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile; import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; public class WritablePDOM extends PDOM implements IWritableIndexFragment { - public WritablePDOM(IPath dbPath) throws CoreException { - super(dbPath); + public WritablePDOM(File dbPath, IIndexLocationConverter locationConverter) throws CoreException { + super(dbPath, locationConverter); } - public IIndexFragmentFile addFile(String filename) throws CoreException { - return super.addFile(filename); + public IIndexFragmentFile addFile(IIndexFileLocation location) throws CoreException { + return super.addFile(location); } public void addFileContent(IIndexFragmentFile sourceFile, diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/Database.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/Database.java index 427dfc7f259..7626db02d0b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/Database.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/Database.java @@ -78,10 +78,10 @@ public class Database { public static final int MAX_SIZE = CHUNK_SIZE - 4; // Room for overhead - public Database(String filename) throws CoreException { + public Database(File location) throws CoreException { try { - location = new File(filename); - file = new RandomAccessFile(filename, "rw"); //$NON-NLS-1$ + this.location = location; + this.file = new RandomAccessFile(location, "rw"); //$NON-NLS-1$ // Allocate chunk table, make sure we have at least one long nChunks = file.length() / CHUNK_SIZE; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/IIndexLocationConverter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/IIndexLocationConverter.java new file mode 100644 index 00000000000..2682acda12b --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/IIndexLocationConverter.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * Copyright (c) 2006 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.pdom.dom; + +import org.eclipse.cdt.core.index.IIndexFileLocation; + +/** + * Each IIndexFragment stores file location representations in an implementation specific manner. + * External to IIndexFragment files are identified by an {@link IIndexFileLocation} + * + * Internal to IIndexFragment a mechanism for converting between the string location format used + * and the URI world is needed. This interface represents that mechanism. + */ +public interface IIndexLocationConverter { + /** + * Convert a raw string in an internal IIndexFragment implementation specific format to + * an IIndexFileLocation or null if the internal format could not be translated. + * @param raw + * @return + */ + public abstract IIndexFileLocation fromInternalFormat(String raw); + + /** + * Convert a IIndexFileLocation to the internal IIndexFragment implementation specific format + * or null if the location could not be translated. + * @param location + * @return an internal representation for the location specified + */ + public abstract String toInternalFormat(IIndexFileLocation location); +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/Messages.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/Messages.java new file mode 100644 index 00000000000..daf55592493 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/Messages.java @@ -0,0 +1,22 @@ +package org.eclipse.cdt.internal.core.pdom.dom; + +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class Messages { + private static final String BUNDLE_NAME = "org.eclipse.cdt.internal.core.pdom.dom.messages"; //$NON-NLS-1$ + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle + .getBundle(BUNDLE_NAME); + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMFile.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMFile.java index d524b0e1e97..6810bc4dd6d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMFile.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMFile.java @@ -15,9 +15,11 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import org.eclipse.cdt.core.CCorePlugin; 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.IIndexFileLocation; import org.eclipse.cdt.core.index.IIndexInclude; import org.eclipse.cdt.core.index.IIndexMacro; import org.eclipse.cdt.core.index.IIndexName; @@ -26,6 +28,7 @@ import org.eclipse.cdt.internal.core.index.IIndexFragmentFile; import org.eclipse.cdt.internal.core.index.IWritableIndexFragment; import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.WritablePDOM; +import org.eclipse.cdt.internal.core.pdom.db.BTree; import org.eclipse.cdt.internal.core.pdom.db.Database; import org.eclipse.cdt.internal.core.pdom.db.IBTreeComparator; import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor; @@ -42,75 +45,54 @@ public class PDOMFile implements IIndexFragmentFile { private final PDOM pdom; private final int record; - + private static final int FIRST_NAME = 0; private static final int FIRST_INCLUDE = 4; private static final int FIRST_INCLUDED_BY = 8; private static final int FIRST_MACRO = 12; - private static final int FILE_NAME = 16; + private static final int LOCATION_REPRESENTATION = 16; private static final int TIME_STAMP = 20; - + private static final int RECORD_SIZE = 28; - + public static class Comparator implements IBTreeComparator { private Database db; - + public Comparator(Database db) { this.db = db; } - + public int compare(int record1, int record2) throws CoreException { - IString name1 = db.getString(db.getInt(record1 + FILE_NAME)); - IString name2 = db.getString(db.getInt(record2 + FILE_NAME)); + IString name1 = db.getString(db.getInt(record1 + LOCATION_REPRESENTATION)); + IString name2 = db.getString(db.getInt(record2 + LOCATION_REPRESENTATION)); return name1.compare(name2); } } - - public static class Finder implements IBTreeVisitor { - private final Database db; - private final String key; - private int record; - - public Finder(Database db, String key) { - this.db = db; - this.key = key; - } - - public int compare(int record) throws CoreException { - IString name = db.getString(db.getInt(record + FILE_NAME)); - return name.compare(key); - } - public boolean visit(int record) throws CoreException { - this.record = record; - return false; - } - - public int getRecord() { - return record; - } - } - public PDOMFile(PDOM pdom, int record) { this.pdom = pdom; this.record = record; } - - public PDOMFile(PDOM pdom, String filename) throws CoreException { + + public PDOMFile(PDOM pdom, IIndexFileLocation location) throws CoreException { this.pdom = pdom; Database db = pdom.getDB(); record = db.malloc(RECORD_SIZE); - db.putInt(record + FILE_NAME, db.newString(filename).getRecord()); + String locationString = pdom.getLocationConverter().toInternalFormat(location); + if(locationString==null) + 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.putLong(record + TIME_STAMP, 0); setFirstName(null); setFirstInclude(null); setFirstIncludedBy(null); } - + public int getRecord() { return record; } - + public boolean equals(Object obj) { if (obj == this) return true; @@ -120,29 +102,31 @@ public class PDOMFile implements IIndexFragmentFile { } return false; } - - public IString getFileName() throws CoreException { + + /** + * Directly changes this record's internal location string. The format + * of this string is unspecified in general and is determined by the + * associated IIndexLocationConverter + * @param newName + * @throws CoreException + */ + public void setInternalLocation(String internalLocation) throws CoreException { Database db = pdom.getDB(); - return db.getString(db.getInt(record + FILE_NAME)); - } - - public void setFilename(String newName) throws CoreException { - Database db = pdom.getDB(); - int oldRecord = db.getInt(record + FILE_NAME); + int oldRecord = db.getInt(record + LOCATION_REPRESENTATION); db.free(oldRecord); - db.putInt(record + FILE_NAME, db.newString(newName).getRecord()); + db.putInt(record + LOCATION_REPRESENTATION, db.newString(internalLocation).getRecord()); } public long getTimestamp() throws CoreException { Database db = pdom.getDB(); return db.getLong(record + TIME_STAMP); } - + public void setTimestamp(long timestamp) throws CoreException { Database db= pdom.getDB(); db.putLong(record + TIME_STAMP, timestamp); } - + public PDOMName getFirstName() throws CoreException { int namerec = pdom.getDB().getInt(record + FIRST_NAME); return namerec != 0 ? new PDOMName(pdom, namerec) : null; @@ -152,27 +136,27 @@ public class PDOMFile implements IIndexFragmentFile { int namerec = firstName != null ? firstName.getRecord() : 0; pdom.getDB().putInt(record + FIRST_NAME, namerec); } - + public PDOMInclude getFirstInclude() throws CoreException { int increc = pdom.getDB().getInt(record + FIRST_INCLUDE); return increc != 0 ? new PDOMInclude(pdom, increc) : null; } - + public void setFirstInclude(PDOMInclude include) throws CoreException { int rec = include != null ? include.getRecord() : 0; pdom.getDB().putInt(record + FIRST_INCLUDE, rec); } - + public PDOMInclude getFirstIncludedBy() throws CoreException { int rec = pdom.getDB().getInt(record + FIRST_INCLUDED_BY); return rec != 0 ? new PDOMInclude(pdom, rec) : null; } - + public void setFirstIncludedBy(PDOMInclude includedBy) throws CoreException { int rec = includedBy != null ? includedBy.getRecord() : 0; pdom.getDB().putInt(record + FIRST_INCLUDED_BY, rec); } - + public PDOMMacro getFirstMacro() throws CoreException { int rec = pdom.getDB().getInt(record + FIRST_MACRO); return rec != 0 ? new PDOMMacro(pdom, rec) : null; @@ -182,10 +166,10 @@ public class PDOMFile implements IIndexFragmentFile { int rec = macro != null ? macro.getRecord() : 0; pdom.getDB().putInt(record + FIRST_MACRO, rec); } - + public void addMacros(IASTPreprocessorMacroDefinition[] macros) throws CoreException { assert getFirstMacro() == null; - + PDOMMacro lastMacro= null; for (int i = 0; i < macros.length; i++) { IASTPreprocessorMacroDefinition macro = macros[i]; @@ -199,7 +183,7 @@ public class PDOMFile implements IIndexFragmentFile { lastMacro= pdomMacro; } } - + public void addNames(IASTName[][] names) throws CoreException { assert getFirstName() == null; HashMap nameCache= new HashMap(); @@ -220,7 +204,7 @@ public class PDOMFile implements IIndexFragmentFile { } } } - + private PDOMName createPDOMName(IASTName name, PDOMName caller) throws CoreException { PDOMName result= null; PDOMBinding binding= ((WritablePDOM) pdom).addBinding(name); @@ -239,7 +223,7 @@ public class PDOMFile implements IIndexFragmentFile { include = nextInclude; } setFirstInclude(include); - + // Delete all the macros in this file PDOMMacro macro = getFirstMacro(); while (macro != null) { @@ -248,7 +232,7 @@ public class PDOMFile implements IIndexFragmentFile { macro = nextMacro; } setFirstMacro(null); - + // Delete all the names in this file PDOMName name = getFirstName(); while (name != null) { @@ -258,21 +242,21 @@ public class PDOMFile implements IIndexFragmentFile { } setFirstName(null); } - + public void addIncludesTo(IIndexFragmentFile[] files, IASTPreprocessorIncludeStatement[] includes) throws CoreException { assert files.length == includes.length; assert getFirstInclude() == null; - + PDOMInclude lastInclude= null; for (int i = 0; i < includes.length; i++) { IASTPreprocessorIncludeStatement statement = includes[i]; PDOMFile file= (PDOMFile) files[i]; assert file.getIndexFragment() instanceof IWritableIndexFragment; - + PDOMInclude pdomInclude = new PDOMInclude(pdom, statement); pdomInclude.setIncludedBy(this); pdomInclude.setIncludes(file); - + file.addIncludedBy(pdomInclude); if (lastInclude == null) { setFirstInclude(pdomInclude); @@ -283,7 +267,7 @@ public class PDOMFile implements IIndexFragmentFile { lastInclude= pdomInclude; } } - + public void addIncludedBy(PDOMInclude include) throws CoreException { PDOMInclude firstIncludedBy = getFirstIncludedBy(); if (firstIncludedBy != null) { @@ -292,9 +276,9 @@ public class PDOMFile implements IIndexFragmentFile { } setFirstIncludedBy(include); } - - - + + + public IIndexInclude[] getIncludes() throws CoreException { List result= new ArrayList(); PDOMInclude include = getFirstInclude(); @@ -305,10 +289,6 @@ public class PDOMFile implements IIndexFragmentFile { return (IIndexInclude[]) result.toArray(new IIndexInclude[result.size()]); } - public String getLocation() throws CoreException { - return getFileName().getString(); - } - public IIndexMacro[] getMacros() throws CoreException { List result= new ArrayList(); PDOMMacro macro = getFirstMacro(); @@ -318,7 +298,7 @@ public class PDOMFile implements IIndexFragmentFile { } return (IIndexMacro[]) result.toArray(new IIndexMacro[result.size()]); } - + public IIndexFragment getIndexFragment() { return pdom; } @@ -339,8 +319,52 @@ public class PDOMFile implements IIndexFragmentFile { break; } } - + } return (IIndexName[]) result.toArray(new IIndexName[result.size()]); } + + public static IIndexFragmentFile findFile(PDOM pdom, BTree btree, IIndexFileLocation location, IIndexLocationConverter strategy) + throws CoreException { + Finder finder = new Finder(pdom.getDB(), location, strategy); + btree.accept(finder); + int record = finder.getRecord(); + return record != 0 ? new PDOMFile(pdom, record) : null; + } + + private static class Finder implements IBTreeVisitor { + private final Database db; + private final String rawKey; + private int record; + + public Finder(Database db, IIndexFileLocation location, IIndexLocationConverter strategy) + throws CoreException + { + this.db = db; + this.rawKey = strategy.toInternalFormat(location); + } + + public int compare(int record) throws CoreException { + IString name = db.getString(db.getInt(record + PDOMFile.LOCATION_REPRESENTATION)); + return name.compare(rawKey); + } + + public boolean visit(int record) throws CoreException { + this.record = record; + return false; + } + + public int getRecord() { + return record; + } + } + + public IIndexFileLocation getLocation() throws CoreException { + Database db = pdom.getDB(); + String raw = db.getString(db.getInt(record + LOCATION_REPRESENTATION)).getString(); + IIndexFileLocation result = pdom.getLocationConverter().fromInternalFormat(raw); + if(result==null) + throw new CoreException(CCorePlugin.createStatus(Messages.getString("PDOMFile.toExternalProblem")+raw)); //$NON-NLS-1$ + return result; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMInclude.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMInclude.java index 826c189cfc3..927182f75a8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMInclude.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMInclude.java @@ -16,6 +16,7 @@ import org.eclipse.cdt.core.dom.ast.IASTFileLocation; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement; import org.eclipse.cdt.core.index.IIndexFile; +import org.eclipse.cdt.core.index.IIndexFileLocation; import org.eclipse.cdt.internal.core.index.IIndexFragment; import org.eclipse.cdt.internal.core.index.IIndexFragmentFile; import org.eclipse.cdt.internal.core.index.IIndexFragmentInclude; @@ -139,11 +140,11 @@ public class PDOMInclude implements IIndexFragmentInclude { pdom.getDB().putInt(record + INCLUDED_BY_PREV, rec); } - public String getIncludedByLocation() throws CoreException { + public IIndexFileLocation getIncludedByLocation() throws CoreException { return getIncludedBy().getLocation(); } - public String getIncludesLocation() throws CoreException { + public IIndexFileLocation getIncludesLocation() throws CoreException { return getIncludes().getLocation(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMName.java index e7427d6393c..94315035efb 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMName.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMName.java @@ -11,6 +11,7 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom; +import java.net.URI; import java.util.ArrayList; import org.eclipse.cdt.core.CCorePlugin; @@ -106,16 +107,16 @@ public class PDOMName implements IIndexFragmentName, IASTFileLocation { private int getRecField(int offset) throws CoreException { return pdom.getDB().getInt(record + offset); } - + private void setRecField(int offset, int fieldrec) throws CoreException { pdom.getDB().putInt(record + offset, fieldrec); } - + public PDOMBinding getPDOMBinding() throws CoreException { int bindingrec = getRecField(BINDING_REC_OFFSET); return pdom.getBinding(bindingrec); } - + public void setBinding(PDOMBinding binding) throws CoreException { int bindingrec = binding != null ? binding.getRecord() : 0; setRecField(BINDING_REC_OFFSET, bindingrec); @@ -125,16 +126,16 @@ public class PDOMName implements IIndexFragmentName, IASTFileLocation { int namerec = getRecField(offset); return namerec != 0 ? new PDOMName(pdom, namerec) : null; } - + private void setNameField(int offset, PDOMName name) throws CoreException { int namerec = name != null ? name.getRecord() : 0; setRecField(offset, namerec); } - + public PDOMName getPrevInBinding() throws CoreException { return getNameField(BINDING_PREV_OFFSET); } - + public void setPrevInBinding(PDOMName name) throws CoreException { setNameField(BINDING_PREV_OFFSET, name); } @@ -194,7 +195,7 @@ public class PDOMName implements IIndexFragmentName, IASTFileLocation { private byte getFlags() throws CoreException { return pdom.getDB().getByte(record + FLAGS); } - + public boolean isDeclaration() { try { byte flags = getFlags(); @@ -232,11 +233,20 @@ public class PDOMName implements IIndexFragmentName, IASTFileLocation { public String getFileName() { try { PDOMFile file = (PDOMFile) getFile(); - return file != null ? file.getFileName().getString() : null; + if(file!=null) { + /* + * We need to spec. what this method can return to know + * how to implement this. Existing implmentations return + * the absolute path, so here we attempt to do the same. + */ + URI uri = file.getLocation().getURI(); + if ("file".equals(uri.getScheme())) //$NON-NLS-1$ + return uri.getSchemeSpecificPart(); + } } catch (CoreException e) { CCorePlugin.log(e); - return null; } + return null; } public int getStartingLineNumber() { @@ -288,10 +298,10 @@ public class PDOMName implements IIndexFragmentName, IASTFileLocation { break; } } - + if (nextName != null) nextName.setPrevInBinding(prevName); - + // Delete our record pdom.getDB().free(record); } @@ -299,7 +309,7 @@ public class PDOMName implements IIndexFragmentName, IASTFileLocation { public IIndexFragment getIndexFragment() { return pdom; } - + public IIndexProxyBinding getBinding() throws CoreException { return getPDOMBinding(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMProjectIndexLocationConverter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMProjectIndexLocationConverter.java new file mode 100644 index 00000000000..f7773f35702 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMProjectIndexLocationConverter.java @@ -0,0 +1,66 @@ +/******************************************************************************* + * Copyright (c) 2006 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - initial API and implementation + *******************************************************************************/ + package org.eclipse.cdt.internal.core.pdom.dom; + +import java.net.URI; +import java.net.URISyntaxException; + +import org.eclipse.cdt.core.index.IIndexFileLocation; +import org.eclipse.cdt.internal.core.index.IndexFileLocation; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IWorkspaceRoot; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.Path; + +/** + * The standard location converter used by the per-project PDOM + */ +public class PDOMProjectIndexLocationConverter implements IIndexLocationConverter { + IProject project; + IWorkspaceRoot root; + private static final String EXTERNAL = ""; //$NON-NLS-1$ + + public PDOMProjectIndexLocationConverter(IProject project) { + this.project = project; + this.root = ResourcesPlugin.getWorkspace().getRoot(); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.pdom.dom.IIndexLocationConverter#fromInternalFormat(java.lang.String) + */ + public IIndexFileLocation fromInternalFormat(String raw) { + String fullPath = null; + URI uri; + if(raw.startsWith(EXTERNAL)) { + try { + uri = new URI(raw.substring(EXTERNAL.length())); + } catch(URISyntaxException use) { + uri = null; + } + } else { + uri = project.findMember(raw).getLocationURI(); + } + return new IndexFileLocation(uri, fullPath); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.pdom.dom.IIndexLocationConverter#toRaw(java.net.URI) + */ + public String toInternalFormat(IIndexFileLocation location) { + String result; + if(location.getFullPath()!=null) { + result = new Path(location.getFullPath()).removeFirstSegments(1).toString(); + } else { + result = EXTERNAL+location.getURI().toString(); + } + return result; + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/messages.properties b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/messages.properties new file mode 100644 index 00000000000..4c999104b16 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/messages.properties @@ -0,0 +1,2 @@ +PDOMFile.toInternalProblem=Unable to translate location to internal format: +PDOMFile.toExternalProblem=Unable to translate from internal format for diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMIndexerTask.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMIndexerTask.java index 9d93cff18db..5bed0ab6fe1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMIndexerTask.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMIndexerTask.java @@ -31,7 +31,9 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IProblemBinding; 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.CoreModel; import org.eclipse.cdt.core.model.CoreModelUtil; import org.eclipse.cdt.core.model.ICContainer; @@ -42,12 +44,12 @@ import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.internal.core.index.IIndexFragmentFile; import org.eclipse.cdt.internal.core.index.IWritableIndex; +import org.eclipse.core.filesystem.EFS; import org.eclipse.core.resources.IFile; 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; public abstract class PDOMIndexerTask implements IPDOMIndexerTask { @@ -89,7 +91,7 @@ public abstract class PDOMIndexerTask implements IPDOMIndexerTask { protected volatile int fTotalSourcesEstimate= 0; protected volatile int fCompletedSources= 0; protected volatile int fCompletedHeaders= 0; - protected Map fContextMap= new HashMap(); + protected Map/**/ fContextMap = new HashMap/**/(); protected volatile String fMessage; private boolean fTrace; @@ -105,7 +107,7 @@ public abstract class PDOMIndexerTask implements IPDOMIndexerTask { protected PDOMIndexerTask() { fTrace= checkDebugOption("indexer", "true"); //$NON-NLS-1$//$NON-NLS-2$ fShowStatistics= checkDebugOption("pdomtimings", "true"); //$NON-NLS-1$//$NON-NLS-2$ - } + } private boolean checkDebugOption(String option, String value) { String trace = Platform.getDebugOption(CCorePlugin.PLUGIN_ID + "/debug/" + option); //$NON-NLS-1$ @@ -168,8 +170,7 @@ public abstract class PDOMIndexerTask implements IPDOMIndexerTask { protected void removeTU(IWritableIndex index, ITranslationUnit tu) throws CoreException, InterruptedException { index.acquireWriteLock(0); try { - IPath path = ((IFile)tu.getResource()).getLocation(); - IIndexFragmentFile file = (IIndexFragmentFile) index.getFile(path); + IIndexFragmentFile file = (IIndexFragmentFile) index.getFile(getIndexFileLocation(tu)); if (file != null) index.clearFile(file); } finally { @@ -179,29 +180,26 @@ public abstract class PDOMIndexerTask implements IPDOMIndexerTask { protected void parseTUs(Collection sources, Collection headers, IProgressMonitor monitor) throws CoreException, InterruptedException { // sources first - Iterator iter; - for (iter = sources.iterator(); iter.hasNext();) { + for (Iterator iter = sources.iterator(); iter.hasNext();) { if (monitor.isCanceled()) return; ITranslationUnit tu = (ITranslationUnit) iter.next(); - String path = tu.getLocation().toOSString(); - if (needToUpdate(path)) { + if (needToUpdate(getIndexFileLocation(tu))) { parseTU(tu, monitor); } } // headers with context - for (iter = headers.iterator(); iter.hasNext();) { + for (Iterator iter = headers.iterator(); iter.hasNext();) { if (monitor.isCanceled()) return; ITranslationUnit tu = (ITranslationUnit) iter.next(); - String path = tu.getLocation().toOSString(); - if (!needToUpdate(path)) { + IIndexFileLocation location = getIndexFileLocation(tu); + if (!needToUpdate(location)) { iter.remove(); - } - else { - ITranslationUnit context= findContext(getIndex(), path); - if (context != null) { + } else { + ITranslationUnit context= findContext(getIndex(), location); + if (context != null) { parseTU(context, monitor); } } @@ -209,12 +207,11 @@ public abstract class PDOMIndexerTask implements IPDOMIndexerTask { // headers without context if (getIndexAllFiles()) { - for (iter = headers.iterator(); iter.hasNext();) { + for (Iterator iter = headers.iterator(); iter.hasNext();) { if (monitor.isCanceled()) return; ITranslationUnit tu = (ITranslationUnit) iter.next(); - String path = tu.getLocation().toOSString(); - if (!needToUpdate(path)) { + if (!needToUpdate(getIndexFileLocation(tu))) { iter.remove(); } else { @@ -276,38 +273,37 @@ public abstract class PDOMIndexerTask implements IPDOMIndexerTask { return getIndexer().getIndexAllFiles(); } - protected ITranslationUnit findContext(IIndex index, String path) { - Object cachedContext= fContextMap.get(path); + protected ITranslationUnit findContext(IIndex index, IIndexFileLocation location) { + Object cachedContext= fContextMap.get(location); if (cachedContext != null) { return cachedContext == NO_CONTEXT ? null : (ITranslationUnit) cachedContext; } - ITranslationUnit context= null; - fContextMap.put(path, NO_CONTEXT); // prevent recursion + fContextMap.put(location, NO_CONTEXT); // prevent recursion IIndexFile pdomFile; try { - pdomFile = index.getFile(new Path(path)); + pdomFile = index.getFile(location); if (pdomFile != null) { ICProject project= getIndexer().getProject(); IIndexInclude[] includedBy = index.findIncludedBy(pdomFile, IIndex.DEPTH_ZERO); - ArrayList paths= new ArrayList(includedBy.length); + ArrayList/**/ paths= new ArrayList/**/(includedBy.length); for (int i = 0; i < includedBy.length; i++) { IIndexInclude include = includedBy[i]; - String incfilename = include.getIncludedByLocation(); - if (CoreModel.isValidSourceUnitName(project.getProject(), incfilename)) { - context= CoreModelUtil.findTranslationUnitForLocation(new Path(incfilename), project); + IIndexFileLocation incLocation = include.getIncludedByLocation(); + if (CoreModel.isValidSourceUnitName(project.getProject(), incLocation.getURI().toString())) { // FIXME - is this ok? + ITranslationUnit context = CoreModelUtil.findTranslationUnitForLocation(IndexLocationFactory.getAbsolutePath(incLocation), project); if (context != null) { - fContextMap.put(path, context); + fContextMap.put(location, context); return context; } } - paths.add(incfilename); + paths.add(incLocation); } - for (Iterator iter = paths.iterator(); iter.hasNext();) { - String nextLevel = (String) iter.next(); - context= findContext(index, nextLevel); + for (Iterator/**/ iter = paths.iterator(); iter.hasNext();) { + IIndexFileLocation nextLevel = (IIndexFileLocation) iter.next(); + ITranslationUnit context = findContext(index, nextLevel); if (context != null) { - fContextMap.put(path, context); + fContextMap.put(location, context); return context; } } @@ -339,12 +335,12 @@ public abstract class PDOMIndexerTask implements IPDOMIndexerTask { protected void addSymbols(IASTTranslationUnit ast, IProgressMonitor pm) throws InterruptedException, CoreException { final Map symbolMap= new HashMap(); try { - String[] orderedPaths= extractSymbols(ast, symbolMap); + IIndexFileLocation[] orderedPaths= extractSymbols(ast, symbolMap); for (int i=0; i*/ orderedIncludes= new LinkedHashSet/**/(); + ArrayList/**/ stack= new ArrayList/**/(); - final String astFilePath = ast.getFilePath(); - String currentPath= astFilePath; + + final IIndexFileLocation astLocation = findLocation(ast.getFilePath()); + IIndexFileLocation currentPath = astLocation; IASTPreprocessorIncludeStatement[] includes = ast.getIncludeDirectives(); for (int i= 0; i < includes.length; i++) { IASTPreprocessorIncludeStatement include = includes[i]; IASTFileLocation sourceLoc = include.getFileLocation(); - String newPath= sourceLoc != null ? sourceLoc.getFileName() : astFilePath; // command-line includes + IIndexFileLocation newPath= sourceLoc != null ? findLocation(sourceLoc.getFileName()) : astLocation; // command-line includes while (!stack.isEmpty() && !currentPath.equals(newPath)) { if (needToUpdate(currentPath)) { prepareInMap(symbolMap, currentPath); orderedIncludes.add(currentPath); } - currentPath= (String) stack.remove(stack.size()-1); + currentPath= (IIndexFileLocation) stack.remove(stack.size()-1); } if (needToUpdate(newPath)) { prepareInMap(symbolMap, newPath); addToMap(symbolMap, 0, newPath, include); } stack.add(currentPath); - currentPath= include.getPath(); + currentPath= findLocation(include.getPath()); } stack.add(currentPath); while (!stack.isEmpty()) { - currentPath= (String) stack.remove(stack.size()-1); + currentPath= (IIndexFileLocation) stack.remove(stack.size()-1); if (needToUpdate(currentPath)) { prepareInMap(symbolMap, currentPath); orderedIncludes.add(currentPath); @@ -444,7 +441,7 @@ public abstract class PDOMIndexerTask implements IPDOMIndexerTask { IASTPreprocessorMacroDefinition macro = macros[i2]; IASTFileLocation sourceLoc = macro.getFileLocation(); if (sourceLoc != null) { // skip built-ins and command line macros - String path2 = sourceLoc.getFileName(); + IIndexFileLocation path2 = findLocation(sourceLoc.getFileName()); addToMap(symbolMap, 1, path2, macro); } } @@ -454,44 +451,41 @@ public abstract class PDOMIndexerTask implements IPDOMIndexerTask { public void visit(IASTName name, IASTName caller) { IASTFileLocation nameLoc = name.getFileLocation(); if (nameLoc != null) { - addToMap(symbolMap, 2, nameLoc.getFileName(), new IASTName[]{name, caller}); + IIndexFileLocation location = findLocation(nameLoc.getFileName()); + addToMap(symbolMap, 2, location, new IASTName[]{name, caller}); } } }); - return (String[]) orderedIncludes.toArray(new String[orderedIncludes.size()]); + return (IIndexFileLocation[]) orderedIncludes.toArray(new IIndexFileLocation[orderedIncludes.size()]); } protected abstract IWritableIndex getIndex(); protected abstract int getReadlockCount(); - protected abstract boolean needToUpdate(String path) throws CoreException; - protected abstract boolean postAddToIndex(String path, IIndexFile file) throws CoreException; + protected abstract boolean needToUpdate(IIndexFileLocation location) throws CoreException; + protected abstract boolean postAddToIndex(IIndexFileLocation location, IIndexFile file) throws CoreException; - - private void addToMap(Map map, int idx, String path, Object thing) { - List[] lists= (List[]) map.get(path); + private void addToMap(Map map, int idx, IIndexFileLocation location, Object thing) { + List[] lists= (List[]) map.get(location); if (lists != null) lists[idx].add(thing); } - private boolean prepareInMap(Map map, String path) { - if (map.get(path) == null) { + private boolean prepareInMap(Map map, IIndexFileLocation location) { + if (map.get(location) == null) { Object lists= new ArrayList[]{new ArrayList(), new ArrayList(), new ArrayList()}; - map.put(path, lists); + map.put(location, lists); } return false; } - private IIndexFragmentFile addToIndex(IWritableIndex index, String location, Map symbolMap) throws CoreException { - // Remove the old symbols in the tu - Path path= new Path(location); - IIndexFragmentFile file= (IIndexFragmentFile) index.getFile(path); + private IIndexFragmentFile addToIndex(IWritableIndex index, IIndexFileLocation location, Map symbolMap) throws CoreException { + IIndexFragmentFile file= (IIndexFragmentFile) index.getFile(location); if (file != null) { index.clearFile(file); + } else { + file= index.addFile(location); } - else { - file= index.addFile(path); - } - file.setTimestamp(path.toFile().lastModified()); + file.setTimestamp(EFS.getStore(location.getURI()).fetchInfo().getLastModified()); ArrayList[] lists= (ArrayList[]) symbolMap.get(location); if (lists != null) { ArrayList list= lists[0]; @@ -501,7 +495,11 @@ public abstract class PDOMIndexerTask implements IPDOMIndexerTask { list= lists[2]; IASTName[][] names= (IASTName[][]) list.toArray(new IASTName[list.size()][]); - index.setFileContent(file, includes, macros, names); + IIndexFileLocation[] includeLocations = new IIndexFileLocation[includes.length]; + for(int i=0; i*/ iflCache; public PDOMFastIndexerJob(PDOMFastIndexer indexer) throws CoreException { this.indexer = indexer; @@ -51,13 +56,24 @@ abstract class PDOMFastIndexerJob extends PDOMIndexerTask implements IPDOMIndexe protected void setupIndexAndReaderFactory() throws CoreException { this.index= ((IWritableIndexManager) CCorePlugin.getIndexManager()).getWritableIndex(indexer.getProject()); - this.codeReaderFactory = new IndexBasedCodeReaderFactory(index); - } + this.iflCache = new HashMap/**/(); + this.codeReaderFactory = new IndexBasedCodeReaderFactory(index, iflCache); + } + + protected IIndexFileLocation findLocation(String absolutePath) { + IIndexFileLocation result = (IIndexFileLocation) iflCache.get(absolutePath); + if(result==null) { + result = IndexLocationFactory.getIFLExpensive(absolutePath); + iflCache.put(absolutePath, result); + } + return result; + } protected void registerTUsInReaderFactory(Collection files) throws CoreException { for (Iterator iter = files.iterator(); iter.hasNext();) { ITranslationUnit tu = (ITranslationUnit) iter.next(); - FileInfo info= codeReaderFactory.createFileInfo(tu); + IIndexFileLocation location = getIndexFileLocation(tu); + FileInfo info= codeReaderFactory.createFileInfo(location); info.setRequested(true); } } @@ -111,13 +127,13 @@ abstract class PDOMFastIndexerJob extends PDOMIndexerTask implements IPDOMIndexe return 1; } - protected boolean needToUpdate(String path) throws CoreException { + protected boolean needToUpdate(IIndexFileLocation location) throws CoreException { // file is requested or is not yet indexed. - FileInfo info= codeReaderFactory.createFileInfo(path); + FileInfo info= codeReaderFactory.createFileInfo(location); return info.isRequested() || info.fFile == null; } - protected boolean postAddToIndex(String path, IIndexFile file) throws CoreException { + protected boolean postAddToIndex(IIndexFileLocation path, IIndexFile file) throws CoreException { FileInfo info= codeReaderFactory.createFileInfo(path); info.fFile= file; if (info.isRequested()) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullIndexerJob.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullIndexerJob.java index c7cba2a5f46..7a379812b48 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullIndexerJob.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullIndexerJob.java @@ -22,6 +22,8 @@ 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.IIndexFile; +import org.eclipse.cdt.core.index.IIndexFileLocation; +import org.eclipse.cdt.core.index.IndexLocationFactory; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.internal.core.index.IWritableIndex; import org.eclipse.cdt.internal.core.index.IWritableIndexManager; @@ -41,8 +43,9 @@ abstract class PDOMFullIndexerJob extends PDOMIndexerTask implements IPDOMIndexe protected final PDOMFullIndexer indexer; protected IWritableIndex index= null; - private Map filePathsToParse= new HashMap(); - + private Map/**/ filePathsToParse= new HashMap/**/(); + private Map/**/ iflCache = new HashMap/**/(); + public PDOMFullIndexerJob(PDOMFullIndexer indexer) throws CoreException { this.indexer = indexer; } @@ -55,15 +58,23 @@ abstract class PDOMFullIndexerJob extends PDOMIndexerTask implements IPDOMIndexe this.index = ((IWritableIndexManager) CCorePlugin.getIndexManager()).getWritableIndex(indexer.getProject()); } - protected void registerTUsInReaderFactory(Collection sources) throws CoreException { - filePathsToParse= new HashMap(); - + protected void registerTUsInReaderFactory(Collection/**/ sources) throws CoreException { + filePathsToParse= new HashMap/**/(); for (Iterator iter = sources.iterator(); iter.hasNext();) { ITranslationUnit tu = (ITranslationUnit) iter.next(); - filePathsToParse.put(tu.getLocation().toOSString(), REQUIRED); + filePathsToParse.put(getIndexFileLocation(tu), REQUIRED); } } + protected IIndexFileLocation findLocation(String absolutePath) { + IIndexFileLocation result = (IIndexFileLocation) iflCache.get(absolutePath); + if(result==null) { + result = IndexLocationFactory.getIFLExpensive(absolutePath); + iflCache.put(absolutePath, result); + } + return result; + } + protected void doParseTU(ITranslationUnit tu, IProgressMonitor pm) throws CoreException, InterruptedException { IPath path = tu.getLocation(); if (path == null) { @@ -87,18 +98,18 @@ abstract class PDOMFullIndexerJob extends PDOMIndexerTask implements IPDOMIndexe return 0; } - protected boolean needToUpdate(String path) throws CoreException { - Object required= filePathsToParse.get(path); + protected boolean needToUpdate(IIndexFileLocation location) throws CoreException { + Object required= filePathsToParse.get(location); if (required == null) { required= MISSING; - filePathsToParse.put(path, required); + filePathsToParse.put(location, required); } return required != SKIP; } - protected boolean postAddToIndex(String path, IIndexFile file) throws CoreException { - Object required= filePathsToParse.get(path); - filePathsToParse.put(path, SKIP); + protected boolean postAddToIndex(IIndexFileLocation location, IIndexFile file) throws CoreException { + Object required= filePathsToParse.get(location); + filePathsToParse.put(location, SKIP); return required == REQUIRED; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullReindex.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullReindex.java index 430d7b38fd7..8fcd4e1817b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullReindex.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullReindex.java @@ -34,8 +34,8 @@ class PDOMFullReindex extends PDOMFullIndexerJob { long start = System.currentTimeMillis(); try { boolean allFiles= getIndexAllFiles(); - List sources= new ArrayList(); - List headers= new ArrayList(); + List/**/ sources= new ArrayList/**/(); + List/**/ headers= new ArrayList/**/(); collectSources(indexer.getProject(), sources, allFiles ? headers : null, allFiles); fTotalSourcesEstimate= sources.size() + headers.size(); diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CCodeFormatter.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CCodeFormatter.java index 0285bc87c68..97685a29eac 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CCodeFormatter.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CCodeFormatter.java @@ -124,7 +124,7 @@ public class CCodeFormatter extends CodeFormatter { if (lineSeparator != null) { this.preferences.line_separator = lineSeparator; } else { - this.preferences.line_separator = System.getProperty("line.separator"); + this.preferences.line_separator = System.getProperty("line.separator"); //$NON-NLS-1$ } this.preferences.initial_indentation_level = indentationLevel; diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/BaseUITestCase.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/BaseUITestCase.java index ca0bc16de79..56a9f50d8ce 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/BaseUITestCase.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/BaseUITestCase.java @@ -22,6 +22,7 @@ import org.eclipse.swt.widgets.Display; 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.IndexLocationFactory; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.testplugin.util.BaseTestCase; @@ -62,7 +63,7 @@ public class BaseUITestCase extends BaseTestCase { do { index.acquireReadLock(); try { - IIndexFile pfile= index.getFile(file.getLocation()); + IIndexFile pfile= index.getFile(IndexLocationFactory.getWorkspaceIFL(file)); if (pfile != null && pfile.getTimestamp() >= file.getLocalTimeStamp()) { return; } diff --git a/core/org.eclipse.cdt.ui/META-INF/MANIFEST.MF b/core/org.eclipse.cdt.ui/META-INF/MANIFEST.MF index 2af6603f566..8c426f7111f 100644 --- a/core/org.eclipse.cdt.ui/META-INF/MANIFEST.MF +++ b/core/org.eclipse.cdt.ui/META-INF/MANIFEST.MF @@ -70,6 +70,7 @@ Require-Bundle: org.eclipse.ui.ide;bundle-version="[3.2.0,4.0.0)", org.eclipse.help;bundle-version="[3.2.0,4.0.0)", org.eclipse.ui.navigator;bundle-version="[3.2.0,4.0.0)", com.ibm.icu;bundle-version="[3.4.0,4.0.0)", - org.eclipse.cdt.refactoring;bundle-version="[4.0.0,5.0.0)" + org.eclipse.cdt.refactoring;bundle-version="[4.0.0,5.0.0)", + org.eclipse.core.filesystem;bundle-version="[1.1.0,2.0.0)" Eclipse-LazyStart: true Bundle-RequiredExecutionEnvironment: J2SE-1.4 diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHQueries.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHQueries.java index 74a84e379a4..7cacd4b6b7f 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHQueries.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHQueries.java @@ -31,7 +31,9 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexFile; +import org.eclipse.cdt.core.index.IIndexFileLocation; import org.eclipse.cdt.core.index.IIndexName; +import org.eclipse.cdt.core.index.IndexLocationFactory; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; @@ -84,7 +86,7 @@ public class CHQueries { ISourceReference sf = ((ISourceReference)element); ITranslationUnit tu= sf.getTranslationUnit(); if (tu != null) { - IPath location= tu.getLocation(); + IIndexFileLocation location= IndexLocationFactory.getIFL(tu); if (location != null) { IIndexFile file= index.getFile(location); if (file != null) { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/AddIncludeOnSelectionAction.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/AddIncludeOnSelectionAction.java index 52ff7d61b0e..909c9342fbd 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/AddIncludeOnSelectionAction.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/AddIncludeOnSelectionAction.java @@ -187,7 +187,7 @@ public class AddIncludeOnSelectionAction extends Action implements IUpdate { try { if (binding != null) { - return getBindingQualifiedName(binding) + " - " + name.getFileName(); //$NON-NLS-1$ + return getBindingQualifiedName(binding) + " - " + name.getFileLocation().getFileName(); //$NON-NLS-1$ } else return null; @@ -284,7 +284,7 @@ public class AddIncludeOnSelectionAction extends Action implements IUpdate { fRequiredIncludes = new IRequiredInclude[selects.length]; List usings = new ArrayList(selects.length); for (int i = 0; i < fRequiredIncludes.length; i++) { - IRequiredInclude include = getRequiredInclude(((DisplayName)selects[i]).getName().getFileName(), getTranslationUnit()); + IRequiredInclude include = getRequiredInclude(((DisplayName)selects[i]).getName().getFileLocation().getFileName(), getTranslationUnit()); if (include != null) { fRequiredIncludes[i] = include; IIndexBinding binding = ((DisplayName)selects[i]).getBinding(); @@ -309,8 +309,9 @@ public class AddIncludeOnSelectionAction extends Action implements IUpdate { } } else if (pdomNames.size() == 1) - { - String fileName = ((DisplayName)pdomNames.get(0)).getName().getFileName(); + { + // we should use the IIndexName.getLocation here rather than getFileLocation + String fileName = ((DisplayName)pdomNames.get(0)).getName().getFileLocation().getFileName(); fRequiredIncludes = new IRequiredInclude[] {getRequiredInclude(fileName, getTranslationUnit())}; IIndexBinding binding = ((DisplayName)pdomNames.get(0)).getBinding(); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/includebrowser/IBContentProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/includebrowser/IBContentProvider.java index c1a65c8bb83..8775be53d4a 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/includebrowser/IBContentProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/includebrowser/IBContentProvider.java @@ -17,14 +17,15 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.core.runtime.Path; import org.eclipse.swt.widgets.Display; import org.eclipse.cdt.core.CCorePlugin; 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.ITranslationUnit; import org.eclipse.cdt.ui.CUIPlugin; @@ -104,9 +105,9 @@ public class IBContentProvider extends AsyncTreeContentProvider { for (int i = 0; i < includes.length; i++) { IIndexInclude include = includes[i]; try { - Path includesPath = new Path(include.getIncludesLocation()); + IPath includesPath = IndexLocationFactory.getAbsolutePath(include.getIncludesLocation()); if (fComputeIncludedBy) { - directiveFile= targetFile= new IBFile(tu.getCProject(), new Path(include.getIncludedByLocation())); + directiveFile= targetFile= new IBFile(tu.getCProject(), IndexLocationFactory.getAbsolutePath(include.getIncludesLocation())); } else { targetFile= new IBFile(tu.getCProject(), includesPath); @@ -147,7 +148,7 @@ public class IBContentProvider extends AsyncTreeContentProvider { private IIndexInclude[] findIncludedBy(IIndex index, ITranslationUnit tu, IProgressMonitor pm) { try { - IPath location= tu.getLocation(); + IIndexFileLocation location= IndexLocationFactory.getIFL(tu); if (location != null) { IIndexFile file= index.getFile(location); if (file != null) { @@ -163,7 +164,7 @@ public class IBContentProvider extends AsyncTreeContentProvider { public IIndexInclude[] findIncludesTo(IIndex index, ITranslationUnit tu, IProgressMonitor pm) { try { - IPath location= tu.getLocation(); + IIndexFileLocation location= IndexLocationFactory.getIFL(tu); if (location != null) { IIndexFile file= index.getFile(location); if (file != null) { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/OpenDefinitionAction.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/OpenDefinitionAction.java index d8e6f6b5b61..34273394c69 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/OpenDefinitionAction.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/OpenDefinitionAction.java @@ -13,7 +13,6 @@ package org.eclipse.cdt.internal.ui.indexview; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Path; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.viewers.ISelection; @@ -27,6 +26,7 @@ import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexName; +import org.eclipse.cdt.core.index.IndexLocationFactory; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.ui.CUIPlugin; @@ -75,23 +75,25 @@ public class OpenDefinitionAction extends IndexAction { } } - private void showInEditor(IIndexName name) throws CModelException, PartInitException { - IPath path = new Path(name.getFileName()); - IEditorPart editor = EditorUtility.openInEditor(path, null); - if (editor != null && editor instanceof ITextEditor) { - ITextEditor textEditor = (ITextEditor)editor; - int nodeOffset = name.getNodeOffset(); - int nodeLength = name.getNodeLength(); - try { - if (nodeLength == -1) { - // This means the offset is actually a line number - IDocument document = textEditor.getDocumentProvider().getDocument(editor.getEditorInput()); - nodeOffset = document.getLineOffset(nodeOffset); - nodeLength = document.getLineLength(nodeOffset); - } - textEditor.selectAndReveal(nodeOffset, nodeLength); - } catch (BadLocationException e) { - CUIPlugin.getDefault().log(e); + private void showInEditor(IIndexName name) throws CModelException, PartInitException, CoreException { + IPath path = IndexLocationFactory.getPath(name.getFile().getLocation()); + if(path!=null) { + IEditorPart editor = EditorUtility.openInEditor(path, null); + if (editor != null && editor instanceof ITextEditor) { + ITextEditor textEditor = (ITextEditor)editor; + int nodeOffset = name.getNodeOffset(); + int nodeLength = name.getNodeLength(); + try { + if (nodeLength == -1) { + // This means the offset is actually a line number + IDocument document = textEditor.getDocumentProvider().getDocument(editor.getEditorInput()); + nodeOffset = document.getLineOffset(nodeOffset); + nodeLength = document.getLineLength(nodeOffset); + } + textEditor.selectAndReveal(nodeOffset, nodeLength); + } catch (BadLocationException e) { + CUIPlugin.getDefault().log(e); + } } } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchElement.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchElement.java index fcb68c18197..9620e4b5114 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchElement.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchElement.java @@ -31,7 +31,7 @@ public class PDOMSearchElement { public PDOMSearchElement(IIndexName name, IIndexBinding binding) throws CoreException { this.binding= binding; this.name = binding.getName(); - filename = name.getFileName(); + filename = name.getFileLocation().getFileName(); } public int hashCode() { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchResult.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchResult.java index 9220148b530..b70bcf35fc3 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchResult.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchResult.java @@ -18,7 +18,6 @@ import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.search.ui.ISearchQuery; @@ -30,6 +29,7 @@ import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.part.FileEditorInput; +import org.eclipse.cdt.core.index.IIndexFileLocation; import org.eclipse.cdt.core.index.IIndexName; import org.eclipse.cdt.ui.CUIPlugin; @@ -121,14 +121,14 @@ public class PDOMSearchResult extends AbstractTextSearchResult implements IEdito public IFile getFile(Object element) { if (element instanceof IIndexName) { IIndexName name = (IIndexName)element; - IPath path = new Path(name.getFileName()); - IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(path); - if (files.length > 0) - return files[0]; - else - return null; - } else - return null; + try { + IIndexFileLocation location = name.getFile().getLocation(); + if(location.getFullPath()!=null) { + return ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(location.getFullPath())); + } + } catch(CoreException ce) { /* fall-through to return null */ } + } + return null; } public String getLabel() {