From 8f627892aa97797db344fd97f3805300abda086f Mon Sep 17 00:00:00 2001 From: John Camelon Date: Tue, 9 Sep 2003 17:54:02 +0000 Subject: [PATCH] Core - Hooked up the Indexer to the dependency tree. Everytime a header file gets modified, the including source files get reindexed. - Automated dependency calcuations - each time a file gets modified, its tree gets updated. - Added error logging via the PDE Error Log (Views->PDE Runtime->Error Log) - the indexer reports unsuccesful index attempts and the preprocessor reports unsuccesful inclusion resolution attempts UI - Changed the names on the search popup mens --- .../CModelElementsFailedTests.java | 9 +- .../core/indexer/tests/IndexManagerTests.java | 87 ++++++++----- .../tests/CompletionProposalsTest.java | 9 +- .../cdt/core/model/tests/ArchiveTests.java | 9 +- .../cdt/core/model/tests/BinaryTests.java | 16 ++- .../core/model/tests/CModelElementsTests.java | 9 +- .../cdt/core/model/tests/CModelTests.java | 8 +- .../core/model/tests/ElementDeltaTests.java | 9 +- .../model/tests/IntegratedCModelTest.java | 10 +- .../model/tests/TranslationUnitBaseTest.java | 9 +- .../core/model/tests/WorkingCopyTests.java | 9 +- .../cdt/core/search/tests/BaseSearchTest.java | 45 +++++-- .../cdt/testplugin/CProjectHelper.java | 17 ++- .../eclipse/cdt/testplugin/FileManager.java | 55 +++++++++ core/org.eclipse.cdt.core/ChangeLog | 9 +- .../AddFileToDependencyTree.java | 10 +- .../sourcedependency/DependencyManager.java | 83 +++++++++---- .../sourcedependency/DependencyQueryJob.java | 18 ++- .../sourcedependency/DependencySelector.java | 114 ++++++++++++++++++ .../core/sourcedependency/DependencyTree.java | 24 +++- .../EntireProjectDependencyTree.java | 16 ++- .../sourcedependency/IDependencyTree.java | 4 +- .../sourcedependency/PreprocessorOutput.java | 10 +- .../RemoveFromDependencyTree.java | 58 +++++++++ .../sourcedependency/impl/InMemoryTree.java | 7 ++ .../core/search/indexing/AbstractIndexer.java | 4 +- .../core/search/indexing/AddFileToIndex.java | 2 +- .../search/indexing/AddFolderToIndex.java | 2 +- .../core/search/indexing/IndexAllProject.java | 4 +- .../core/search/indexing/IndexManager.java | 28 +++-- .../indexing/RemoveFolderFromIndex.java | 2 +- .../core/search/indexing/RemoveFromIndex.java | 2 +- .../core/search/indexing/SaveIndex.java | 2 +- .../core/search/indexing/SourceIndexer.java | 5 +- .../internal/core/model/DeltaProcessor.java | 74 +++++++++++- core/org.eclipse.cdt.core/parser/ChangeLog | 5 + .../internal/core/parser/Preprocessor.java | 2 + .../src/org/eclipse/cdt/core/CCorePlugin.java | 20 ++- core/org.eclipse.cdt.ui/ChangeLog | 3 + .../internal/ui/CPluginResources.properties | 12 +- .../ui/editor/SearchForReferencesAction.java | 2 +- 41 files changed, 682 insertions(+), 141 deletions(-) create mode 100644 core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/testplugin/FileManager.java create mode 100644 core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/DependencySelector.java create mode 100644 core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/RemoveFromDependencyTree.java diff --git a/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/model/failedTests/CModelElementsFailedTests.java b/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/model/failedTests/CModelElementsFailedTests.java index 0370a17697f..7530d85d4df 100644 --- a/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/model/failedTests/CModelElementsFailedTests.java +++ b/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/model/failedTests/CModelElementsFailedTests.java @@ -28,6 +28,7 @@ import org.eclipse.cdt.core.model.IStructure; import org.eclipse.cdt.internal.core.model.CElement; import org.eclipse.cdt.internal.core.model.TranslationUnit; import org.eclipse.cdt.testplugin.CProjectHelper; +import org.eclipse.core.internal.resources.ResourceException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; @@ -90,8 +91,12 @@ public class CModelElementsFailedTests extends TestCase { proj.setDescription(description, monitor); } - protected void tearDown() throws Exception { - CProjectHelper.delete(fCProject); + protected void tearDown() { + try{ + CProjectHelper.delete(fCProject); + } + catch (ResourceException e) {} + catch (CoreException e) {} } public void testBug36379() { diff --git a/core/org.eclipse.cdt.core.tests/indexer/org/eclipse/cdt/core/indexer/tests/IndexManagerTests.java b/core/org.eclipse.cdt.core.tests/indexer/org/eclipse/cdt/core/indexer/tests/IndexManagerTests.java index 49b5b3849e6..59dcaf7a1b7 100644 --- a/core/org.eclipse.cdt.core.tests/indexer/org/eclipse/cdt/core/indexer/tests/IndexManagerTests.java +++ b/core/org.eclipse.cdt.core.tests/indexer/org/eclipse/cdt/core/indexer/tests/IndexManagerTests.java @@ -33,6 +33,7 @@ import org.eclipse.cdt.internal.core.search.indexing.IIndexConstants; import org.eclipse.cdt.internal.core.search.indexing.IndexManager; import org.eclipse.cdt.internal.core.sourcedependency.DependencyManager; import org.eclipse.cdt.internal.core.sourcedependency.DependencyQueryJob; +import org.eclipse.core.internal.resources.ResourceException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; @@ -56,6 +57,7 @@ public class IndexManagerTests extends TestCase { IProject testProject; NullProgressMonitor monitor; IndexManager indexManager; + public static final int TIMEOUT = 10000; /** * Constructor for IndexManagerTest. @@ -76,15 +78,24 @@ public class IndexManagerTests extends TestCase { testProject = createProject("IndexerTestProject"); if (testProject==null) fail("Unable to create project"); + + } /* * @see TestCase#tearDown() */ - protected void tearDown() throws Exception { - super.tearDown(); + protected void tearDown() { + try { + super.tearDown(); + } catch (Exception e1) { + } //Delete project if (testProject.exists()){ - testProject.delete(true,monitor); + try { + testProject.delete(true,monitor); + } catch (ResourceException e) { + } catch (CoreException e) { + } } } @@ -109,31 +120,39 @@ public class IndexManagerTests extends TestCase { { IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot(); IProject project= root.getProject(projectName); - if (!project.exists()) { - project.create(null); - } else { - project.refreshLocal(IResource.DEPTH_INFINITE, null); + IProject cproject = null; + try{ + if (!project.exists()) { + project.create(null); + } else { + project.refreshLocal(IResource.DEPTH_INFINITE, null); + } + if (!project.isOpen()) { + project.open(null); + } + + //Fill out a project description + IPath defaultPath = Platform.getLocation(); + IPath newPath = project.getFullPath(); + if (defaultPath.equals(newPath)) + newPath = null; + IWorkspace workspace = ResourcesPlugin.getWorkspace(); + IProjectDescription description = workspace.newProjectDescription(project.getName()); + description.setLocation(newPath); + //Create the project + cproject = CCorePlugin.getDefault().createCProject(description,project,monitor,CCorePlugin.PLUGIN_ID + ".make"); //.getCoreModel().create(project); + + if( !cproject.hasNature(CCProjectNature.CC_NATURE_ID) ){ + addNatureToProject(cproject, CCProjectNature.CC_NATURE_ID, null); + } } - if (!project.isOpen()) { - project.open(null); - } - - //Fill out a project description - IPath defaultPath = Platform.getLocation(); - IPath newPath = project.getFullPath(); - if (defaultPath.equals(newPath)) - newPath = null; - IWorkspace workspace = ResourcesPlugin.getWorkspace(); - IProjectDescription description = workspace.newProjectDescription(project.getName()); - description.setLocation(newPath); - //Create the project - IProject cproject = CCorePlugin.getDefault().createCProject(description,project,monitor,CCorePlugin.PLUGIN_ID + ".make"); //.getCoreModel().create(project); - - if( !cproject.hasNature(CCProjectNature.CC_NATURE_ID) ){ - addNatureToProject(cproject, CCProjectNature.CC_NATURE_ID, null); + catch (CoreException e){ + cproject = project; + cproject.open(null); + } + finally{ + return cproject; } - - return cproject; } private IFile importFile(String fileName, String resourceLocation)throws Exception{ @@ -236,12 +255,26 @@ public class IndexManagerTests extends TestCase { IIndex ind = indexManager.getIndex(testProjectPath,true,true); assertTrue("Index exists for project",ind != null); //Delete the project - testProject.delete(true,monitor); + safeDelete(testProject); + //See if the index is still there ind = indexManager.getIndex(testProjectPath,true,true); assertTrue("Index deleted",ind == null); } + /** + * @param testProject + */ + private void safeDelete(IProject testProject) throws InterruptedException, CoreException { + try { + testProject.delete(true,monitor); + } catch (CoreException e) { + Thread.sleep(1000); + testProject.delete(true,monitor); + } + + } + public void testRemoveFileFromIndex() throws Exception{ //Add a file to the project importFile("mail.cpp","resources/indexer/mail.cpp"); diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/codeassist/tests/CompletionProposalsTest.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/codeassist/tests/CompletionProposalsTest.java index 19dcba2ad4c..72ef408b266 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/codeassist/tests/CompletionProposalsTest.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/codeassist/tests/CompletionProposalsTest.java @@ -23,6 +23,7 @@ import org.eclipse.cdt.internal.core.model.TranslationUnit; import org.eclipse.cdt.internal.core.search.indexing.IndexManager; import org.eclipse.cdt.internal.ui.text.CCompletionProcessor; import org.eclipse.cdt.testplugin.CProjectHelper; +import org.eclipse.core.internal.resources.ResourceException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; @@ -95,8 +96,12 @@ public class CompletionProposalsTest extends TestCase{ proj.setDescription(description, monitor); } - protected void tearDown() throws Exception { - CProjectHelper.delete(fCProject); + protected void tearDown() { + try{ + CProjectHelper.delete(fCProject); + } + catch (ResourceException e) {} + catch (CoreException e) {} } public void testCompletionProposals(){ diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/ArchiveTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/ArchiveTests.java index bac3f94d3dc..4410522f3c7 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/ArchiveTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/ArchiveTests.java @@ -18,6 +18,7 @@ import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.testplugin.CProjectHelper; import org.eclipse.cdt.testplugin.util.ExpectedStrings; +import org.eclipse.core.internal.resources.ResourceException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRoot; @@ -127,8 +128,12 @@ public class ArchiveTests extends TestCase { * * Called after every test case method. */ - protected void tearDown() throws CoreException { - CProjectHelper.delete(testProject); + protected void tearDown() { + try{ + CProjectHelper.delete(testProject); + } + catch (ResourceException e) {} + catch (CoreException e) {} } public static TestSuite suite() { diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/BinaryTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/BinaryTests.java index 186cf8d0180..db1212af97a 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/BinaryTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/BinaryTests.java @@ -17,6 +17,7 @@ import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.testplugin.CProjectHelper; import org.eclipse.cdt.testplugin.util.ExpectedStrings; +import org.eclipse.core.internal.resources.ResourceException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRoot; @@ -62,9 +63,11 @@ public class BinaryTests extends TestCase { /** * Make sure we leave the workspace clean for the next set of tests */ - CProjectHelper.delete(testProject); - - + try{ + CProjectHelper.delete(testProject); + } + catch (ResourceException e) {} + catch (CoreException e) {} } @@ -169,9 +172,12 @@ public class BinaryTests extends TestCase { protected void tearDown() throws CoreException, InterruptedException { /* Let everything settle down before we try to delete the project. */ - Thread.sleep(500); - CProjectHelper.delete(testProject); + try{ + CProjectHelper.delete(testProject); + } + catch (ResourceException e) {} + catch (CoreException e) {} } diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java index f2c2436d230..8b8af179ec2 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java @@ -44,6 +44,7 @@ import org.eclipse.cdt.internal.core.model.MethodTemplate; import org.eclipse.cdt.internal.core.model.StructureTemplate; import org.eclipse.cdt.internal.core.model.TranslationUnit; import org.eclipse.cdt.testplugin.CProjectHelper; +import org.eclipse.core.internal.resources.ResourceException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; @@ -98,8 +99,12 @@ public class CModelElementsTests extends TestCase { proj.setDescription(description, monitor); } - protected void tearDown() throws Exception { - CProjectHelper.delete(fCProject); + protected void tearDown() { + try{ + CProjectHelper.delete(fCProject); + } + catch (ResourceException e) {} + catch (CoreException e) {} } public void testCModelElements(){ diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/CModelTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/CModelTests.java index 020c97ebc87..2cef670c248 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/CModelTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/CModelTests.java @@ -16,6 +16,7 @@ import org.eclipse.cdt.core.CCProjectNature; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.testplugin.CProjectHelper; +import org.eclipse.core.internal.resources.ResourceException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspace; @@ -216,7 +217,12 @@ public class CModelTests extends TestCase { assertTrue("isTranslationUnit", !CoreModel.getDefault().isTranslationUnit(file)); - testProject.getProject().delete(true,true,monitor); + + try{ + testProject.getProject().delete(true,true,monitor); + } + catch (ResourceException e) {} + catch (CoreException e) {} } /**** diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/ElementDeltaTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/ElementDeltaTests.java index a2260aa5657..cee68ff7bac 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/ElementDeltaTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/ElementDeltaTests.java @@ -35,6 +35,7 @@ import org.eclipse.cdt.internal.core.model.IWorkingCopy; import org.eclipse.cdt.internal.core.model.TranslationUnit; import org.eclipse.cdt.testplugin.CProjectHelper; import org.eclipse.cdt.testplugin.TestPluginLauncher; +import org.eclipse.core.internal.resources.ResourceException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; @@ -104,8 +105,12 @@ public class ElementDeltaTests extends TestCase implements IElementChangedListen proj.setDescription(description, monitor); } - protected void tearDown() throws Exception { - CProjectHelper.delete(fCProject); + protected void tearDown() { + try{ + CProjectHelper.delete(fCProject); + } + catch (ResourceException e) {} + catch (CoreException e) {} } diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/IntegratedCModelTest.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/IntegratedCModelTest.java index 54c19d18068..efddf0252b2 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/IntegratedCModelTest.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/IntegratedCModelTest.java @@ -12,6 +12,7 @@ import java.util.Map; import org.eclipse.cdt.testplugin.CProjectHelper; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ITranslationUnit; +import org.eclipse.core.internal.resources.ResourceException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; @@ -81,8 +82,13 @@ public abstract class IntegratedCModelTest extends TestCase { CCorePlugin.getDefault().setUseNewParser(true); } - protected void tearDown() throws Exception { - CProjectHelper.delete(fCProject); + protected void tearDown() { + try{ + CProjectHelper.delete(fCProject); + } + catch (ResourceException e) {} + catch (CoreException e) {} + } private static void addNatureToProject(IProject proj, String natureId, IProgressMonitor monitor) throws CoreException { diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/TranslationUnitBaseTest.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/TranslationUnitBaseTest.java index 78f62eeaf04..e95f12b2c5f 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/TranslationUnitBaseTest.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/TranslationUnitBaseTest.java @@ -17,6 +17,7 @@ import junit.framework.TestCase; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.testplugin.CProjectHelper; +import org.eclipse.core.internal.resources.ResourceException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceDescription; @@ -142,9 +143,13 @@ public class TranslationUnitBaseTest extends TestCase * * Called after every test case method. */ - protected void tearDown() throws CoreException + protected void tearDown() { // release resources here and clean-up - testProject.getProject().delete(true,true,monitor); + try { + testProject.getProject().delete(true,true,monitor); + } catch (ResourceException e) { + } catch (CoreException e) { + } } } diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/WorkingCopyTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/WorkingCopyTests.java index 0cd5d0a88a5..0aead62cff1 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/WorkingCopyTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/WorkingCopyTests.java @@ -26,6 +26,7 @@ import org.eclipse.cdt.internal.core.model.IWorkingCopy; import org.eclipse.cdt.internal.core.model.TranslationUnit; import org.eclipse.cdt.testplugin.CProjectHelper; import org.eclipse.cdt.testplugin.TestPluginLauncher; +import org.eclipse.core.internal.resources.ResourceException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; @@ -89,8 +90,12 @@ public class WorkingCopyTests extends TestCase { proj.setDescription(description, monitor); } - protected void tearDown() throws Exception { - CProjectHelper.delete(fCProject); + protected void tearDown() { + try{ + CProjectHelper.delete(fCProject); + } + catch (ResourceException e) {} + catch (CoreException e) {} } diff --git a/core/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/BaseSearchTest.java b/core/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/BaseSearchTest.java index d6b21b808b0..1844c6b81a8 100644 --- a/core/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/BaseSearchTest.java +++ b/core/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/BaseSearchTest.java @@ -24,9 +24,10 @@ import org.eclipse.cdt.core.search.ICSearchPattern; import org.eclipse.cdt.core.search.ICSearchResultCollector; import org.eclipse.cdt.core.search.ICSearchScope; import org.eclipse.cdt.core.search.SearchEngine; -import org.eclipse.cdt.internal.core.index.impl.IFileDocument; import org.eclipse.cdt.internal.core.search.indexing.IndexManager; import org.eclipse.cdt.internal.ui.search.CSearchResultCollector; +import org.eclipse.cdt.testplugin.FileManager; +import org.eclipse.core.internal.resources.ResourceException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; @@ -51,13 +52,13 @@ public class BaseSearchTest extends TestCase implements ICSearchConstants { ICSearchScope scope; IFile file; - IFileDocument fileDoc; IProject testProject; NullProgressMonitor monitor; IWorkspace workspace; CSearchResultCollector resultCollector; SearchEngine searchEngine; - + FileManager fileManager; + public BaseSearchTest(String name) { super(name); } @@ -75,6 +76,9 @@ public class BaseSearchTest extends TestCase implements ICSearchConstants { if (testProject == null) fail("Unable to create project"); + //Create file manager + fileManager = new FileManager(); + //Add a file to the project importFile("mail.cpp", "resources/indexer/mail.cpp"); importFile("classDecl.cpp", "resources/search/classDecl.cpp"); @@ -91,18 +95,28 @@ public class BaseSearchTest extends TestCase implements ICSearchConstants { searchEngine = new SearchEngine(); } - protected void tearDown() throws Exception { - super.tearDown(); + protected void tearDown() { + try { + super.tearDown(); + } catch (Exception e1) { + } //Delete project if (testProject.exists()){ - testProject.delete( true, monitor ); + try { + fileManager.closeAllFiles(); + testProject.delete(true,monitor); + } catch (ResourceException e) { + } catch (CoreException e) { + } } } - private IProject createProject(String projectName) throws CoreException { + private IProject createProject(String projectName) { IWorkspaceRoot root = workspace.getRoot(); IProject project = root.getProject(projectName); - + IProject cproject = null; + try{ + if( !project.exists() ) { project.create( null ); } else { @@ -125,7 +139,7 @@ public class BaseSearchTest extends TestCase implements ICSearchConstants { description.setLocation(newPath); //Create the project - IProject cproject = CCorePlugin.getDefault().createCProject( description, + cproject = CCorePlugin.getDefault().createCProject( description, project, monitor, CCorePlugin.PLUGIN_ID + ".make"); @@ -133,8 +147,15 @@ public class BaseSearchTest extends TestCase implements ICSearchConstants { if( !project.hasNature(CCProjectNature.CC_NATURE_ID) ){ addNatureToProject(project, CCProjectNature.CC_NATURE_ID, null); } - + } + catch (CoreException e){ + cproject = project; + cproject.open(null); + } + finally{ return cproject; + } + } private void importFile(String fileName, String resourceLocation)throws Exception{ @@ -145,8 +166,9 @@ public class BaseSearchTest extends TestCase implements ICSearchConstants { if (!file.exists()){ file.create(new FileInputStream(pluginRoot + resourceLocation),false,monitor); + fileManager.addFile(file); } - fileDoc = new IFileDocument(file); + } private void addNatureToProject(IProject proj, String natureId, IProgressMonitor monitor) throws CoreException { @@ -165,4 +187,5 @@ public class BaseSearchTest extends TestCase implements ICSearchConstants { resultCollector.setProgressMonitor( monitor ); searchEngine.search( workspace, pattern, scope, collector ); } + } diff --git a/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/testplugin/CProjectHelper.java b/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/testplugin/CProjectHelper.java index b5039d9c0ee..94f95e7ee6f 100644 --- a/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/testplugin/CProjectHelper.java +++ b/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/testplugin/CProjectHelper.java @@ -63,7 +63,22 @@ public class CProjectHelper { * Removes a ICProject. */ public static void delete(ICProject cproject) throws CoreException { - cproject.getProject().delete(true, true, null); + + try { + cproject.getProject().delete(true, true, null); + } catch (CoreException e) { + try { + Thread.sleep(1000); + } catch (InterruptedException e1) { + + } + finally{ + cproject.getProject().delete(true, true, null); + } + + } + + } diff --git a/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/testplugin/FileManager.java b/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/testplugin/FileManager.java new file mode 100644 index 00000000000..c0c7baf8c2a --- /dev/null +++ b/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/testplugin/FileManager.java @@ -0,0 +1,55 @@ +/* + * Created on Sep 8, 2003 + * + * To change the template for this generated file go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +package org.eclipse.cdt.testplugin; + +import java.util.ArrayList; +import java.util.Iterator; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.CoreException; + +/** + * @author bgheorgh + * + * To change the template for this generated type comment go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +public class FileManager { + ArrayList fileHandles; + + public FileManager(){ + fileHandles = new ArrayList(); + } + + public void addFile(IFile file){ + fileHandles.add(file); + } + + public void closeAllFiles() throws CoreException{ + Iterator iter = fileHandles.iterator(); + while (iter.hasNext()){ + IFile tempFile = (IFile) iter.next(); + tempFile.refreshLocal(IResource.DEPTH_INFINITE,null); + + try { + tempFile.delete(true,null); + } catch (CoreException e) { + try { + Thread.sleep(2000); + } catch (InterruptedException e1) { + + } + finally{ + tempFile.delete(true,null); + } + + } + + } + } +} \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/ChangeLog b/core/org.eclipse.cdt.core/ChangeLog index 7cffb873648..5b3b5df1376 100644 --- a/core/org.eclipse.cdt.core/ChangeLog +++ b/core/org.eclipse.cdt.core/ChangeLog @@ -1,3 +1,11 @@ +2003-09-05 Bogdan Gheorghe + + Hooked in the dependency checking on file changes in Delta + Processor.java. When a header files' contents change we look + up the referencing files in the dep tree table and reindex them. + + * model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java + 2003-09-05 Alain Magloire The PTY classes are using one instance of the master fd for Input/Output/Error @@ -37,7 +45,6 @@ * src/org/eclipse/cdt/core/ErrorParserManager.java - 2003-09-01 Alain Magloire Typo in the class signature. diff --git a/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/AddFileToDependencyTree.java b/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/AddFileToDependencyTree.java index 2f9b518e40f..f995c8690f0 100644 --- a/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/AddFileToDependencyTree.java +++ b/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/AddFileToDependencyTree.java @@ -26,12 +26,12 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; public class AddFileToDependencyTree extends DependencyRequest { - public static final String[] FILE_TYPES= new String[] {"cpp"}; //$NON-NLS-1$ + public static final String[] FILE_TYPES= new String[] {"cpp","c", "cc", "cxx"}; //$NON-NLS-1$ IFile resource; char[] contents; IScannerInfo buildInfo; - + /** * @param path * @param manager @@ -57,7 +57,7 @@ public class AddFileToDependencyTree extends DependencyRequest { monitor.enterWrite(); // ask permission to write if (!addDocumentToTree(tree)) return false; } catch (IOException e) { - if (JobManager.VERBOSE) { + if (DependencyManager.VERBOSE) { JobManager.verbose("-> failed to calculate dependency for " + this.resource + " because of the following exception:"); //$NON-NLS-1$ //$NON-NLS-2$ e.printStackTrace(); } @@ -78,8 +78,8 @@ public class AddFileToDependencyTree extends DependencyRequest { IScannerInfo newInfo = new ScannerInfo((this.buildInfo != null) ? this.buildInfo.getDefinedSymbols() : null,(this.buildInfo != null) ? this.buildInfo.getIncludePaths() : null); ParserLanguage language = CoreModel.getDefault().hasCCNature( resource.getProject() ) ? ParserLanguage.CPP : ParserLanguage.C; - - dTree.add(document,docPath,newInfo, language); + dTree.add(document,docPath,newInfo, resource, language); + return true; } diff --git a/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/DependencyManager.java b/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/DependencyManager.java index a13090af3cc..fd0674a7e2c 100644 --- a/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/DependencyManager.java +++ b/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/DependencyManager.java @@ -15,6 +15,7 @@ import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.zip.CRC32; @@ -40,6 +41,7 @@ public class DependencyManager extends JobManager implements ISourceDependency { public static int MAX_FILES_IN_MEMORY = 0; public SimpleLookupTable projectNames = new SimpleLookupTable(); + public SimpleLookupTable dependencyTable; private Map dependencyTrees = new HashMap(5); /* read write monitors */ @@ -58,7 +60,9 @@ public class DependencyManager extends JobManager implements ISourceDependency { public static Integer UPDATING_STATE = new Integer(1); public static Integer UNKNOWN_STATE = new Integer(2); public static Integer REBUILDING_STATE = new Integer(3); - + + public static boolean VERBOSE = false; + public String processName(){ //TODO: BOG Add name to .properties file return "Dependency Tree"; //org.eclipse.cdt.internal.core.search.Util.bind("process.name"); //$NON-NLS-1$ @@ -77,6 +81,7 @@ public class DependencyManager extends JobManager implements ISourceDependency { } this.projectNames = new SimpleLookupTable(); + this.dependencyTable = new SimpleLookupTable(); this.ccorePluginLocation = null; } /* (non-Javadoc) @@ -125,7 +130,7 @@ public class DependencyManager extends JobManager implements ISourceDependency { } catch (IOException e) { // failed to read the existing file or its no longer compatible if (currentDTreeState != REBUILDING_STATE) { // rebuild tree if existing file is corrupt, unless the tree is already being rebuilt - if (VERBOSE) + if (DependencyManager.VERBOSE) JobManager.verbose("-> cannot reuse existing tree: "+ treeName +" path: "+path.toOSString()); //$NON-NLS-1$ //$NON-NLS-2$ rebuildDTree(treeName, path); return null; @@ -167,7 +172,7 @@ public class DependencyManager extends JobManager implements ISourceDependency { checksumCalculator.reset(); checksumCalculator.update(pathString.getBytes()); String fileName = Long.toString(checksumCalculator.getValue()) + ".depTree"; //$NON-NLS-1$ - if (VERBOSE) + if (DependencyManager.VERBOSE) JobManager.verbose("-> dependency tree name for " + pathString + " is " + fileName); //$NON-NLS-1$ //$NON-NLS-2$ name = getCCorePluginWorkingLocation().append(fileName).toOSString(); projectNames.put(path, name); @@ -209,7 +214,7 @@ public class DependencyManager extends JobManager implements ISourceDependency { try { return org.eclipse.cdt.internal.core.Util.getFileCharContent(savedDTreesFile, null); } catch (IOException ignored) { - if (VERBOSE) + if (DependencyManager.VERBOSE) JobManager.verbose("Failed to read saved dTree file names"); //$NON-NLS-1$ return new char[0]; } @@ -219,7 +224,7 @@ public class DependencyManager extends JobManager implements ISourceDependency { Object target = org.eclipse.cdt.internal.core.Util.getTarget(ResourcesPlugin.getWorkspace().getRoot(), path, true); if (target == null) return; - if (VERBOSE) + if (DependencyManager.VERBOSE) JobManager.verbose("-> request to rebuild dTree: "+treeName+" path: "+path.toOSString()); //$NON-NLS-1$ //$NON-NLS-2$ updateTreeState(treeName, REBUILDING_STATE); @@ -274,7 +279,7 @@ public class DependencyManager extends JobManager implements ISourceDependency { } } } catch (IOException ignored) { - if (VERBOSE) + if (DependencyManager.VERBOSE) JobManager.verbose("Failed to write saved dTree file names"); //$NON-NLS-1$ } finally { if (writer != null) { @@ -283,7 +288,7 @@ public class DependencyManager extends JobManager implements ISourceDependency { } catch (IOException e) {} } } - if (VERBOSE) { + if (DependencyManager.VERBOSE) { String state = "?"; //$NON-NLS-1$ if (treeState == SAVED_STATE) state = "SAVED"; //$NON-NLS-1$ else if (treeState == UPDATING_STATE) state = "UPDATING"; //$NON-NLS-1$ @@ -307,13 +312,15 @@ public class DependencyManager extends JobManager implements ISourceDependency { */ public void remove(String resourceName, IPath indexedContainer){ //request(new RemoveFromIndex(resourceName, indexedContainer, this)); + if (DependencyManager.VERBOSE) + JobManager.verbose("remove file from tree " + resourceName); } /** * Removes the tree for a given path. * This is a no-op if the tree did not exist. */ public synchronized void removeTree(IPath path) { - if (VERBOSE) + if (DependencyManager.VERBOSE) JobManager.verbose("removing dependency tree " + path); //$NON-NLS-1$ String treeName = computeTreeName(path); File indexFile = new File(treeName); @@ -325,6 +332,50 @@ public class DependencyManager extends JobManager implements ISourceDependency { this.dependencyTrees.remove(path); updateTreeState(treeName, null); } + + public synchronized void addToTable(String fileName, IFile resource){ + ArrayList projectContainer = (ArrayList) dependencyTable.get(fileName); + if (projectContainer == null) { + ArrayList newProjectContainer = new ArrayList(); + newProjectContainer.add(resource.getLocation()); + + dependencyTable.put(fileName, newProjectContainer); + } + else { + if (!projectContainer.contains(resource.getLocation())){ + projectContainer.add(resource.getLocation()); + } + } + } + + public synchronized void removeFromTable(String fileName, IPath refToRemove){ + ArrayList projectContainer = (ArrayList) dependencyTable.get(fileName); + if (projectContainer != null) { + int index = projectContainer.indexOf(refToRemove); + projectContainer.remove(refToRemove); + } + } + + public synchronized ArrayList getProjectDependsForFile(String fileName){ + ArrayList projectContainer = (ArrayList) dependencyTable.get(fileName); + return projectContainer; + } + + /** + * @param file + * @param path + * @param info + */ + public void addSource(IFile file, IPath path, IScannerInfo info) { + if (CCorePlugin.getDefault() == null) return; + AddFileToDependencyTree job = new AddFileToDependencyTree(file, path, this, info); + if (this.awaitingJobsCount() < MAX_FILES_IN_MEMORY) { + // reduces the chance that the file is open later on, preventing it from being deleted + if (!job.initializeContents()) return; + } + request(job); + } + /************* *TODO: Remove these methods once the depTree is *fully integrated @@ -363,21 +414,7 @@ public class DependencyManager extends JobManager implements ISourceDependency { } catch (CoreException e) { } } - /** - * @param file - * @param path - * @param info - */ - public void addSource(IFile file, IPath path, IScannerInfo info) { - if (CCorePlugin.getDefault() == null) return; - AddFileToDependencyTree job = new AddFileToDependencyTree(file, path, this, info); - if (this.awaitingJobsCount() < MAX_FILES_IN_MEMORY) { - // reduces the chance that the file is open later on, preventing it from being deleted - if (!job.initializeContents()) return; - } - request(job); - } - + /************ * END OF TEMP D-TREE ENABLE SECTION */ diff --git a/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/DependencyQueryJob.java b/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/DependencyQueryJob.java index 628648e95a6..ed558491f02 100644 --- a/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/DependencyQueryJob.java +++ b/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/DependencyQueryJob.java @@ -6,6 +6,7 @@ package org.eclipse.cdt.internal.core.sourcedependency; import java.util.ArrayList; import java.util.List; +import org.eclipse.cdt.core.search.SearchEngine; import org.eclipse.cdt.internal.core.search.processing.IJob; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; @@ -20,6 +21,7 @@ public class DependencyQueryJob implements IJob { IFile file; ArrayList includeFiles; DependencyManager depManager; + protected DependencySelector depSelector; public DependencyQueryJob(IProject project, IFile file, DependencyManager depMan, List includeFiles) { this.project = project; @@ -46,18 +48,26 @@ public class DependencyQueryJob implements IJob { */ public boolean execute(IProgressMonitor progress) { + if ((project == null) ||(file == null)) return false; + String[] tempFiles = this.depManager.getFileDependencies(project,file); - for (int i=0; i 1 + && ((location = root.getFile(path).getLocation()) == null + || !new java.io.File(location.toOSString()).exists()) // and internal jar file does not exist + && !new java.io.File(path.toOSString()).exists()) { // and external jar file does not exist + continue; + } + if (projectFocus == null || canSeeFocus(projectFocus, this.isPolymorphicSearch, path)) { + if (requiredIndexKeys.indexOf(path) == -1) { + requiredIndexKeys.add(path); + } + } + } + this.treeKeys = new IPath[requiredIndexKeys.size()]; + requiredIndexKeys.toArray(this.treeKeys); + } + + public IDependencyTree[] getIndexes() { + if (this.treeKeys == null) { + this.initializeIndexKeys(); + } + // acquire the in-memory indexes on the fly + int length = this.treeKeys.length; + IDependencyTree[] indexes = new IDependencyTree[length]; + int count = 0; + for (int i = 0; i < length; i++){ + // may trigger some index recreation work + IDependencyTree index = depManager.getDependencyTree(treeKeys[i], true /*reuse index file*/, false /*do not create if none*/); + if (index != null) indexes[count++] = index; // only consider indexes which are ready yet + } + if (count != length) { + System.arraycopy(indexes, 0, indexes=new IDependencyTree[count], 0, count); + } + return indexes; + } + /** + * Returns the project that corresponds to the given path. + * Returns null if the path doesn't correspond to a project. + */ + private static ICProject getCProject(IPath path, ICModel model) { + ICProject project = model.getCProject(path.lastSegment()); + if (project.exists()) { + return project; + } else { + return null; + } + } + public static ICElement getProject(ICElement element) { + while (!(element instanceof ICProject)) { + element = element.getParent(); + } + return element; + } +} diff --git a/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/DependencyTree.java b/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/DependencyTree.java index c4b66ea3b5a..a50d4cb9e74 100644 --- a/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/DependencyTree.java +++ b/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/DependencyTree.java @@ -27,14 +27,19 @@ import org.eclipse.cdt.internal.core.index.IQueryResult; import org.eclipse.cdt.internal.core.index.impl.IndexedFile; import org.eclipse.cdt.internal.core.sourcedependency.impl.InMemoryTree; import org.eclipse.cdt.internal.core.sourcedependency.impl.IncludeEntry; +import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IPath; public class DependencyTree implements IDependencyTree { - + /** + * Maximum size of the index in memory. + */ + public static final int MAX_FOOTPRINT= 1000000; protected InMemoryTree addsTree; public DependencyTree(String treeName, String string, boolean b) throws IOException{ + super(); initialize(); } @@ -106,17 +111,20 @@ public class DependencyTree implements IDependencyTree { * @see org.eclipse.cdt.internal.core.sourcedependency.IDependencyTree#remove(java.lang.String) */ public void remove(String documentName) throws IOException { - // TODO Auto-generated method stub + //IndexedFile file= addsTree.getIndexedFile(documentName); + //if (file != null) { + //} + } /** * Add the file that will be preprocessed to the tree, create a new * preprocessor output and preprocess! */ - public void add(IDocument document, String docPath, IScannerInfo newInfo, ParserLanguage language) throws IOException { + public void add(IDocument document, String docPath, IScannerInfo newInfo, IFile file, ParserLanguage language) throws IOException { IndexedFile indexedFile= addsTree.getIndexedFile(document.getName()); //if (indexedFile != null) //remove(indexedFile, 0); - PreprocessorOutput output= new PreprocessorOutput(addsTree); + PreprocessorOutput output= new PreprocessorOutput(addsTree, file); DependencyRequestor depReq = new DependencyRequestor(output,document); output.addDocument(document); @@ -172,4 +180,12 @@ public class DependencyTree implements IDependencyTree { } } + + /** + * Returns true if the in memory index reaches a critical size, + * to merge it with the index on the disk. + */ + protected boolean timeToMerge() { + return (addsTree.getFootprint() >= MAX_FOOTPRINT); + } } diff --git a/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/EntireProjectDependencyTree.java b/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/EntireProjectDependencyTree.java index 751d98f518f..eea64209516 100644 --- a/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/EntireProjectDependencyTree.java +++ b/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/EntireProjectDependencyTree.java @@ -13,7 +13,9 @@ package org.eclipse.cdt.internal.core.sourcedependency; import java.util.HashSet; -import org.eclipse.cdt.core.build.managed.ManagedBuildManager; +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.parser.IScannerInfo; +import org.eclipse.cdt.core.parser.IScannerInfoProvider; import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.index.IQueryResult; import org.eclipse.cdt.internal.core.index.impl.IFileDocument; @@ -160,13 +162,19 @@ public class EntireProjectDependencyTree extends DependencyRequest { shouldSave = true; if (value == DELETED) this.manager.remove(name, this.dependencyTreePath); - else - this.manager.addSource((IFile) value, this.dependencyTreePath, ManagedBuildManager.getScannerInfo(project)); + else{ + IScannerInfo scanInfo = null; + IScannerInfoProvider provider = CCorePlugin.getDefault().getScannerInfoProvider(project); + if (provider != null){ + scanInfo = provider.getScannerInformation(project); + } + this.manager.addSource((IFile) value, this.dependencyTreePath, scanInfo); + } } } } } catch (/*IO*/Exception e) { - if (JobManager.VERBOSE) { + if (DependencyManager.VERBOSE) { JobManager.verbose("-> failed to generate tree " + this.project + " because of the following exception:"); //$NON-NLS-1$ //$NON-NLS-2$ e.printStackTrace(); } diff --git a/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/IDependencyTree.java b/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/IDependencyTree.java index e1efee69680..b798594b7bd 100644 --- a/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/IDependencyTree.java +++ b/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/IDependencyTree.java @@ -18,13 +18,15 @@ import org.eclipse.cdt.core.parser.IScannerInfo; import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.internal.core.index.IDocument; import org.eclipse.cdt.internal.core.index.IQueryResult; +import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IPath; public interface IDependencyTree { /** * Adds the given document to the index. */ - void add(IDocument document, String docPath, IScannerInfo newInfo, ParserLanguage language) throws IOException; + void add(IDocument document, String docPath, IScannerInfo newInfo, IFile file, ParserLanguage language) throws IOException; + /** * Empties the index. */ diff --git a/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/PreprocessorOutput.java b/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/PreprocessorOutput.java index 97dfb5bb04c..e4bbd08c02d 100644 --- a/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/PreprocessorOutput.java +++ b/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/PreprocessorOutput.java @@ -10,24 +10,32 @@ ***********************************************************************/ package org.eclipse.cdt.internal.core.sourcedependency; +import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.parser.ast.IASTInclusion; import org.eclipse.cdt.internal.core.index.IDocument; import org.eclipse.cdt.internal.core.index.impl.IndexedFile; import org.eclipse.cdt.internal.core.sourcedependency.impl.InMemoryTree; +import org.eclipse.core.resources.IFile; public class PreprocessorOutput implements IPreprocessorOutput { protected InMemoryTree tree; protected IndexedFile indexedFile; protected IDocument document; + protected IFile file; - public PreprocessorOutput(InMemoryTree tree) { + public PreprocessorOutput(InMemoryTree tree, IFile file) { this.tree = tree; + this.file = file; } public void addInclude(IASTInclusion inclusion, IASTInclusion parent){ addRef(inclusion.getFullFileName()); addRelatives(inclusion.getFullFileName(),(parent != null ) ? parent.getFullFileName() : null); + + DependencyManager depMan = CCorePlugin.getDefault().getCoreModel().getDependencyManager(); + depMan.addToTable(inclusion.getFullFileName(),this.file); + } public void addRelatives(String inclusion, String parent) { diff --git a/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/RemoveFromDependencyTree.java b/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/RemoveFromDependencyTree.java new file mode 100644 index 00000000000..b9c1591ba2a --- /dev/null +++ b/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/RemoveFromDependencyTree.java @@ -0,0 +1,58 @@ +/* + * Created on Sep 5, 2003 + * + * To change the template for this generated file go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +package org.eclipse.cdt.internal.core.sourcedependency; + +import java.io.IOException; + +import org.eclipse.cdt.internal.core.search.indexing.ReadWriteMonitor; +import org.eclipse.cdt.internal.core.search.processing.JobManager; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; + +/** + * @author bgheorgh + * + * To change the template for this generated type comment go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +public class RemoveFromDependencyTree extends DependencyRequest { + String resourceName; + + public RemoveFromDependencyTree(String resourceName, IPath dependencyTreePath, DependencyManager manager) { + super(dependencyTreePath, manager); + this.resourceName = resourceName; + } + + public boolean execute(IProgressMonitor progressMonitor) { + + if (progressMonitor != null && progressMonitor.isCanceled()) return true; + + /* ensure no concurrent write access to index */ + IDependencyTree depTree = manager.getDependencyTree(this.dependencyTreePath, true, /*reuse index file*/ false /*create if none*/); + if (depTree == null) return true; + ReadWriteMonitor monitor = manager.getMonitorFor(depTree); + if (monitor == null) return true; // index got deleted since acquired + + try { + monitor.enterWrite(); // ask permission to write + depTree.remove(resourceName); + } catch (IOException e) { + if (DependencyManager.VERBOSE) { + JobManager.verbose("-> failed to remove " + this.resourceName + " from index because of the following exception:"); //$NON-NLS-1$ //$NON-NLS-2$ + e.printStackTrace(); + } + return false; + } finally { + monitor.exitWrite(); // free write lock + } + return true; + } + + public String toString() { + return "removing " + this.resourceName + " from dep Tree " + this.dependencyTreePath; //$NON-NLS-1$ //$NON-NLS-2$ + } +} diff --git a/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/impl/InMemoryTree.java b/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/impl/InMemoryTree.java index 9fb24a857c3..dbc39409994 100644 --- a/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/impl/InMemoryTree.java +++ b/core/org.eclipse.cdt.core/dependency/org/eclipse/cdt/internal/core/sourcedependency/impl/InMemoryTree.java @@ -140,4 +140,11 @@ public class InMemoryTree { public IndexedFile[] getIndexedFiles(){ return this.files.asArray(); } + + /** + * Returns the footprint of the index. + */ + public long getFootprint() { + return this.footprint; + } } diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/AbstractIndexer.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/AbstractIndexer.java index 344820c725e..0571e49f9b7 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/AbstractIndexer.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/AbstractIndexer.java @@ -283,7 +283,7 @@ public abstract class AbstractIndexer implements IIndexer, IIndexConstants, ICSe pos+=tempName.length; } - if (VERBOSE) + if (AbstractIndexer.VERBOSE) AbstractIndexer.verbose(new String(result)); return result; @@ -315,7 +315,7 @@ public abstract class AbstractIndexer implements IIndexer, IIndexConstants, ICSe pos+=tempName.length; } - if (VERBOSE) + if (AbstractIndexer.VERBOSE) AbstractIndexer.verbose(new String(result)); return result; diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/AddFileToIndex.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/AddFileToIndex.java index fe9c595d832..4a3c494b4d8 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/AddFileToIndex.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/AddFileToIndex.java @@ -37,7 +37,7 @@ public abstract class AddFileToIndex extends IndexRequest { monitor.enterWrite(); // ask permission to write if (!indexDocument(index)) return false; } catch (IOException e) { - if (JobManager.VERBOSE) { + if (IndexManager.VERBOSE) { JobManager.verbose("-> failed to index " + this.resource + " because of the following exception:"); //$NON-NLS-1$ //$NON-NLS-2$ e.printStackTrace(); } diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/AddFolderToIndex.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/AddFolderToIndex.java index 20e7ad15281..029aa05f285 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/AddFolderToIndex.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/AddFolderToIndex.java @@ -75,7 +75,7 @@ class AddFolderToIndex extends IndexRequest { IResource.NONE ); } catch (CoreException e) { - if (JobManager.VERBOSE) { + if (IndexManager.VERBOSE) { JobManager.verbose("-> failed to add " + this.folderPath + " to index because of the following exception:"); //$NON-NLS-1$ //$NON-NLS-2$ e.printStackTrace(); } diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexAllProject.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexAllProject.java index bc4d89a97ed..c9c978d8861 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexAllProject.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexAllProject.java @@ -182,14 +182,14 @@ public class IndexAllProject extends IndexRequest { this.manager.request(new SaveIndex(this.indexPath, this.manager)); } catch (CoreException e) { - if (JobManager.VERBOSE) { + if (IndexManager.VERBOSE) { JobManager.verbose("-> failed to index " + this.project + " because of the following exception:"); //$NON-NLS-1$ //$NON-NLS-2$ e.printStackTrace(); } this.manager.removeIndex(this.indexPath); return false; } catch (IOException e) { - if (JobManager.VERBOSE) { + if (IndexManager.VERBOSE) { JobManager.verbose("-> failed to index " + this.project + " because of the following exception:"); //$NON-NLS-1$ //$NON-NLS-2$ e.printStackTrace(); } diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java index 65ac979ed0c..f2c6bf0d001 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java @@ -65,6 +65,8 @@ public class IndexManager extends JobManager implements IIndexConstants { public static Integer UNKNOWN_STATE = new Integer(2); public static Integer REBUILDING_STATE = new Integer(3); + public static boolean VERBOSE = false; + public synchronized void aboutToUpdateIndex(IPath path, Integer newIndexState) { // newIndexState is either UPDATING_STATE or REBUILDING_STATE // must tag the index as inconsistent, in case we exit before the update job is started @@ -127,7 +129,7 @@ public class IndexManager extends JobManager implements IIndexConstants { checksumCalculator.reset(); checksumCalculator.update(pathString.getBytes()); String fileName = Long.toString(checksumCalculator.getValue()) + ".index"; //$NON-NLS-1$ - if (VERBOSE) + if (IndexManager.VERBOSE) JobManager.verbose("-> index name for " + pathString + " is " + fileName); //$NON-NLS-1$ //$NON-NLS-2$ name = getCCorePluginWorkingLocation().append(fileName).toOSString(); indexNames.put(path, name); @@ -168,7 +170,7 @@ public class IndexManager extends JobManager implements IIndexConstants { } catch (IOException e) { // failed to read the existing file or its no longer compatible if (currentIndexState != REBUILDING_STATE) { // rebuild index if existing file is corrupt, unless the index is already being rebuilt - if (VERBOSE) + if (IndexManager.VERBOSE) JobManager.verbose("-> cannot reuse existing index: "+indexName+" path: "+path.toOSString()); //$NON-NLS-1$ //$NON-NLS-2$ rebuildIndex(indexName, path); return null; @@ -311,7 +313,7 @@ public class IndexManager extends JobManager implements IIndexConstants { Object target = org.eclipse.cdt.internal.core.Util.getTarget(ResourcesPlugin.getWorkspace().getRoot(), path, true); if (target == null) return; - if (VERBOSE) + if (IndexManager.VERBOSE) JobManager.verbose("-> request to rebuild index: "+indexName+" path: "+path.toOSString()); //$NON-NLS-1$ //$NON-NLS-2$ updateIndexState(indexName, REBUILDING_STATE); @@ -344,7 +346,7 @@ public class IndexManager extends JobManager implements IIndexConstants { // Path is already canonical String indexPath = computeIndexName(path); - if (VERBOSE) + if (IndexManager.VERBOSE) JobManager.verbose("-> recreating index: "+indexPath+" for path: "+path.toOSString()); //$NON-NLS-1$ //$NON-NLS-2$ index = new Index(indexPath, "Index for " + path.toOSString(), false /*reuse index file*/); //$NON-NLS-1$ indexes.put(path, index); @@ -352,7 +354,7 @@ public class IndexManager extends JobManager implements IIndexConstants { return index; } catch (IOException e) { // The file could not be created. Possible reason: the project has been deleted. - if (VERBOSE) { + if (IndexManager.VERBOSE) { JobManager.verbose("-> failed to recreate index for path: "+path.toOSString()); //$NON-NLS-1$ //$NON-NLS-2$ e.printStackTrace(); } @@ -371,7 +373,7 @@ public class IndexManager extends JobManager implements IIndexConstants { * This is a no-op if the index did not exist. */ public synchronized void removeIndex(IPath path) { - if (VERBOSE) + if (IndexManager.VERBOSE) JobManager.verbose("removing index " + path); //$NON-NLS-1$ String indexName = computeIndexName(path); File indexFile = new File(indexName); @@ -439,7 +441,7 @@ public class IndexManager extends JobManager implements IIndexConstants { public void saveIndex(IIndex index) throws IOException { // must have permission to write from the write monitor if (index.hasChanged()) { - if (VERBOSE) + if (IndexManager.VERBOSE) JobManager.verbose("-> saving index " + index.getIndexFile()); //$NON-NLS-1$ index.save(); } @@ -479,7 +481,7 @@ public class IndexManager extends JobManager implements IIndexConstants { try { saveIndex(index); } catch(IOException e){ - if (VERBOSE) { + if (IndexManager.VERBOSE) { JobManager.verbose("-> got the following exception while saving:"); //$NON-NLS-1$ e.printStackTrace(); } @@ -493,7 +495,7 @@ public class IndexManager extends JobManager implements IIndexConstants { } public void shutdown() { - if (VERBOSE) + if (IndexManager.VERBOSE) JobManager.verbose("Shutdown"); //$NON-NLS-1$ //Get index entries for all projects in the workspace, store their absolute paths IndexSelector indexSelector = new IndexSelector(new CWorkspaceScope(), null, false, this); @@ -523,7 +525,7 @@ public class IndexManager extends JobManager implements IIndexConstants { for (int i = 0, indexesFilesLength = indexesFiles.length; i < indexesFilesLength; i++) { String fileName = indexesFiles[i].getAbsolutePath(); if (!knownPaths.containsKey(fileName) && fileName.toLowerCase().endsWith(".index")) { //$NON-NLS-1$ - if (VERBOSE) + if (IndexManager.VERBOSE) JobManager.verbose("Deleting index file " + indexesFiles[i]); //$NON-NLS-1$ indexesFiles[i].delete(); } @@ -549,7 +551,7 @@ public class IndexManager extends JobManager implements IIndexConstants { try { return org.eclipse.cdt.internal.core.Util.getFileCharContent(savedIndexNamesFile, null); } catch (IOException ignored) { - if (VERBOSE) + if (IndexManager.VERBOSE) JobManager.verbose("Failed to read saved index file names"); //$NON-NLS-1$ return new char[0]; } @@ -577,7 +579,7 @@ public class IndexManager extends JobManager implements IIndexConstants { } } } catch (IOException ignored) { - if (VERBOSE) + if (IndexManager.VERBOSE) JobManager.verbose("Failed to write saved index file names"); //$NON-NLS-1$ } finally { if (writer != null) { @@ -586,7 +588,7 @@ public class IndexManager extends JobManager implements IIndexConstants { } catch (IOException e) {} } } - if (VERBOSE) { + if (IndexManager.VERBOSE) { String state = "?"; //$NON-NLS-1$ if (indexState == SAVED_STATE) state = "SAVED"; //$NON-NLS-1$ else if (indexState == UPDATING_STATE) state = "UPDATING"; //$NON-NLS-1$ diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/RemoveFolderFromIndex.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/RemoveFolderFromIndex.java index 74f269f0032..0c08b31e7b7 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/RemoveFolderFromIndex.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/RemoveFolderFromIndex.java @@ -54,7 +54,7 @@ class RemoveFolderFromIndex extends IndexRequest { } } } catch (IOException e) { - if (JobManager.VERBOSE) { + if (IndexManager.VERBOSE) { JobManager.verbose("-> failed to remove " + this.folderPath + " from index because of the following exception:"); //$NON-NLS-1$ //$NON-NLS-2$ e.printStackTrace(); } diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/RemoveFromIndex.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/RemoveFromIndex.java index 69b12652090..e69d580e908 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/RemoveFromIndex.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/RemoveFromIndex.java @@ -40,7 +40,7 @@ class RemoveFromIndex extends IndexRequest { monitor.enterWrite(); // ask permission to write index.remove(resourceName); } catch (IOException e) { - if (JobManager.VERBOSE) { + if (IndexManager.VERBOSE) { JobManager.verbose("-> failed to remove " + this.resourceName + " from index because of the following exception:"); //$NON-NLS-1$ //$NON-NLS-2$ e.printStackTrace(); } diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/SaveIndex.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/SaveIndex.java index 89e395d5e04..99e3bfa0d69 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/SaveIndex.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/SaveIndex.java @@ -39,7 +39,7 @@ public class SaveIndex extends IndexRequest { monitor.enterWrite(); // ask permission to write this.manager.saveIndex(index); } catch (IOException e) { - if (JobManager.VERBOSE) { + if (IndexManager.VERBOSE) { JobManager.verbose("-> failed to save index " + this.indexPath + " because of the following exception:"); //$NON-NLS-1$ //$NON-NLS-2$ e.printStackTrace(); } diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/SourceIndexer.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/SourceIndexer.java index 9cb833dcbe9..ccdbb108415 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/SourceIndexer.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/SourceIndexer.java @@ -88,7 +88,10 @@ public class SourceIndexer extends AbstractIndexer { try{ boolean retVal = parser.parse(); - if (VERBOSE){ + if (!retVal) + org.eclipse.cdt.internal.core.model.Util.log(null, "Failed to index " + resourceFile.getFullPath()); + + if (AbstractIndexer.VERBOSE){ if (!retVal) AbstractIndexer.verbose("PARSE FAILED " + resourceFile.getName().toString()); else diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java index dcfe254fdd4..19d0ef3d084 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java @@ -5,6 +5,10 @@ package org.eclipse.cdt.internal.core.model; * All Rights Reserved. */ +import java.util.ArrayList; +import java.util.Iterator; + +import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.IArchiveContainer; @@ -14,15 +18,19 @@ import org.eclipse.cdt.core.model.ICElementDelta; import org.eclipse.cdt.core.model.ICModel; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.IParent; +import org.eclipse.cdt.core.parser.IScannerInfo; +import org.eclipse.cdt.core.parser.IScannerInfoProvider; +import org.eclipse.cdt.core.search.ICSearchConstants; +import org.eclipse.cdt.internal.core.search.indexing.IndexManager; +import org.eclipse.cdt.internal.core.sourcedependency.DependencyManager; +import org.eclipse.cdt.internal.core.sourcedependency.DependencyQueryJob; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceDelta; +import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.runtime.IPath; -import org.eclipse.cdt.internal.core.search.indexing.IndexManager; -import org.eclipse.cdt.internal.core.sourcedependency.DependencyManager; - /** * This class is used by CModelManager to convert * IResourceDeltas into ICElementDeltas. @@ -424,6 +432,9 @@ public class DeltaProcessor { if (element != null) { elementChanged(element, delta); updateIndexAddResource(element, delta); + //check to see if any projects need to be reindexed + updateDependencies(element); + } } else if (resource.getType() == IResource.PROJECT) { if ((flags & IResourceDelta.OPEN) != 0) { @@ -462,11 +473,21 @@ public class DeltaProcessor { switch (element.getElementType()) { case ICElement.C_PROJECT : this.indexManager.indexAll(element.getCProject().getProject()); + this.sourceDependencyManager.generateEntireDependencyTree(element.getCProject().getProject()); break; case ICElement.C_UNIT: IFile file = (IFile) delta.getResource(); - indexManager.addSource(file, file.getProject().getProject().getFullPath()); + IProject filesProject = file.getProject(); + indexManager.addSource(file, filesProject.getFullPath()); + cleanDependencies(file, filesProject); + IScannerInfo scanInfo = null; + IScannerInfoProvider provider = CCorePlugin.getDefault().getScannerInfoProvider(filesProject); + if (provider != null){ + scanInfo = provider.getScannerInformation(filesProject); + } + + this.sourceDependencyManager.addSource(file,filesProject.getFullPath(),scanInfo); break; } @@ -482,6 +503,7 @@ public class DeltaProcessor { case ICElement.C_PROJECT : this.indexManager.removeIndexFamily(element.getCProject().getProject().getFullPath()); // NB: Discarding index jobs belonging to this project was done during PRE_DELETE + this.sourceDependencyManager.removeTree(element.getCProject().getProject().getFullPath()); break; // NB: Update of index if project is opened, closed, or its c nature is added or removed // is done in updateCurrentDeltaAndIndex @@ -489,9 +511,53 @@ public class DeltaProcessor { case ICElement.C_UNIT: IFile file = (IFile) delta.getResource(); indexManager.remove(file.getFullPath().toString(), file.getProject().getProject().getFullPath()); + sourceDependencyManager.remove(file.getFullPath().toString(),file.getProject().getFullPath()); break; } } + + private void updateDependencies(ICElement element){ + //Update table + String fileExtension = element.getResource().getFileExtension(); + if (fileExtension.equals("h") || + fileExtension.equals("hh") || + fileExtension.equals("hpp")){ + + if (sourceDependencyManager.getProjectDependsForFile(element.getResource().getLocation().toOSString()) == null){ + //retrigger dep trees + sourceDependencyManager.performConcurrentJob(new DependencyQueryJob(null,null,sourceDependencyManager,null),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null); + } + + ArrayList projs =sourceDependencyManager.getProjectDependsForFile(element.getResource().getLocation().toOSString()); + if (projs != null){ + Iterator iter = projs.iterator(); + while (iter.hasNext()){ + IPath pathToReindex = (IPath) iter.next(); + + IWorkspaceRoot workRoot = element.getCProject().getProject().getWorkspace().getRoot(); + IFile fileToReindex = workRoot.getFileForLocation(pathToReindex); + + if (fileToReindex.exists() ) { + if (VERBOSE) + System.out.println("Going to reindex " + fileToReindex.getName()); + this.indexManager.addSource(fileToReindex,fileToReindex.getProject().getProject().getFullPath()); + } + } + } + } + } + + private void cleanDependencies(IFile file, IProject filesProject) { + String[] files = sourceDependencyManager.getFileDependencies(filesProject,file); + if (files != null){ + for (int i=0; i