diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/indexer/tests/IndexListenerTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexListenerTest.java similarity index 98% rename from core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/indexer/tests/IndexListenerTest.java rename to core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexListenerTest.java index f7fe6cef59b..5d788817d0a 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/indexer/tests/IndexListenerTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexListenerTest.java @@ -9,7 +9,7 @@ * Markus Schorn - initial API and implementation *******************************************************************************/ -package org.eclipse.cdt.internal.indexer.tests; +package org.eclipse.cdt.internal.index.tests; import java.util.ArrayList; import java.util.List; diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/indexer/tests/IndexSearchTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexSearchTest.java similarity index 97% rename from core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/indexer/tests/IndexSearchTest.java rename to core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexSearchTest.java index ddea1bafb9b..d15a4d1915e 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/indexer/tests/IndexSearchTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexSearchTest.java @@ -9,7 +9,7 @@ * Markus Schorn - initial API and implementation *******************************************************************************/ -package org.eclipse.cdt.internal.indexer.tests; +package org.eclipse.cdt.internal.index.tests; import java.util.LinkedList; import java.util.regex.Pattern; @@ -86,12 +86,11 @@ public class IndexSearchTest extends BaseTestCase { CCorePlugin.getPDOMManager().setIndexerId(fProject, IPDOMManager.ID_NO_INDEXER); CProjectHelper.importSourcesFromPlugin(fProject, CTestPlugin.getDefault().getBundle(), "resources/indexTests/search"); - CCorePlugin.getPDOMManager().setIndexerId(fProject, IPDOMManager.ID_FAST_INDEXER); - - // wait until the indexer is done - assertTrue(CCorePlugin.getIndexManager().joinIndexer(5000, new NullProgressMonitor())); } }, null); + CCorePlugin.getPDOMManager().setIndexerId(fProject, IPDOMManager.ID_FAST_INDEXER); + // wait until the indexer is done + assertTrue(CCorePlugin.getIndexManager().joinIndexer(5000, new NullProgressMonitor())); } public void deleteProject() { diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/indexer/tests/IndexerTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexTests.java similarity index 81% rename from core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/indexer/tests/IndexerTests.java rename to core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexTests.java index ccb3c9fcd61..4c1467772aa 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/indexer/tests/IndexerTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexTests.java @@ -8,7 +8,7 @@ * Contributors: * Markus Schorn - initial API and implementation *******************************************************************************/ -package org.eclipse.cdt.internal.indexer.tests; +package org.eclipse.cdt.internal.index.tests; import junit.framework.Test; import junit.framework.TestSuite; @@ -16,11 +16,12 @@ import junit.framework.TestSuite; /** * Test suite for the indexer tests */ -public class IndexerTests extends TestSuite { +public class IndexTests extends TestSuite { public static Test suite() { - TestSuite suite = new IndexerTests(); + TestSuite suite = new IndexTests(); suite.addTest(IndexListenerTest.suite()); + suite.addTest(IndexSearchTest.suite()); return suite; } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMTestBase.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMTestBase.java index 3ad08a705cc..7d8aa697c1f 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMTestBase.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMTestBase.java @@ -85,16 +85,15 @@ public class PDOMTestBase extends BaseTestCase { throw new CoreException(new Status(IStatus.ERROR, CTestPlugin.PLUGIN_ID, 0, "Import Interrupted", e)); } - // Index the project - CCorePlugin.getPDOMManager().setIndexerId(cproject, IPDOMManager.ID_FAST_INDEXER); - - // wait until the indexer is done - assertTrue(CCorePlugin.getIndexManager().joinIndexer(5000, new NullProgressMonitor())); - cprojects[0] = cproject; } }, null); + // Index the project + CCorePlugin.getPDOMManager().setIndexerId(cprojects[0], IPDOMManager.ID_FAST_INDEXER); + // wait until the indexer is done + assertTrue(CCorePlugin.getIndexManager().joinIndexer(5000, new NullProgressMonitor())); + return cprojects[0]; } diff --git a/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/suite/AutomatedIntegrationSuite.java b/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/suite/AutomatedIntegrationSuite.java index 86f22c4e341..73e5de4db48 100644 --- a/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/suite/AutomatedIntegrationSuite.java +++ b/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/suite/AutomatedIntegrationSuite.java @@ -30,7 +30,7 @@ import org.eclipse.cdt.core.parser.failedTests.ASTFailedTests; import org.eclipse.cdt.core.parser.failedTests.FailedCompleteParseASTTest; import org.eclipse.cdt.core.parser.failedTests.STLFailedTests; import org.eclipse.cdt.core.parser.tests.ParserTestSuite; -import org.eclipse.cdt.internal.indexer.tests.IndexerTests; +import org.eclipse.cdt.internal.index.tests.IndexTests; import org.eclipse.cdt.internal.pdom.tests.PDOMTests; /** @@ -80,7 +80,7 @@ public class AutomatedIntegrationSuite extends TestSuite { // Add in PDOM tests suite.addTest(PDOMTests.suite()); - suite.addTest(IndexerTests.suite()); + suite.addTest(IndexTests.suite()); // Add all failed tests suite.addTestSuite(ASTFailedTests.class); diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java index b8402f4238b..02ba703fd15 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java @@ -50,6 +50,7 @@ import org.eclipse.cdt.core.model.IParent; import org.eclipse.cdt.core.model.ISourceRoot; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.IWorkingCopy; +import org.eclipse.cdt.internal.core.CCoreInternals; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; @@ -747,7 +748,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe if (resource.getType() == IResource.PROJECT && ( ((IProject)resource).hasNature(CProjectNature.C_NATURE_ID) || ((IProject)resource).hasNature(CCProjectNature.CC_NATURE_ID) )){ - this.deleting((IProject) resource);} + this.deleting((IProject) resource, delta);} } catch (CoreException e) { } break; @@ -1145,11 +1146,11 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe } } - public void deleting(IProject project) { + private void deleting(IProject project, IResourceDelta delta) { // stop the binary runner for this project removeBinaryRunner(project); // stop indexing jobs for this project - CCorePlugin.getPDOMManager().deleting(create(project)); + CCoreInternals.getPDOMManager().deleteProject(create(project), delta); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOMManager.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOMManager.java index dd7c06f8781..336d2f59d5d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOMManager.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOMManager.java @@ -39,11 +39,4 @@ public interface IPDOMManager { public String getIndexerId(ICProject project) throws CoreException; public void setIndexerId(ICProject project, String indexerId) throws CoreException; - - // Enqueue and indexer sub job - public void enqueue(IPDOMIndexerTask subjob); - - // Project being deleted - public void deleting(ICProject project); - } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexFactory.java new file mode 100644 index 00000000000..e2dda72eaf5 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexFactory.java @@ -0,0 +1,166 @@ +/******************************************************************************* + * Copyright (c) 2006 Wind River Systems, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ + +package org.eclipse.cdt.internal.core.index; + +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.index.IIndex; +import org.eclipse.cdt.core.index.IIndexManager; +import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.model.ICProject; +import org.eclipse.cdt.internal.core.pdom.PDOMManager; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; + +/** + * Class that creates indexes based on pdoms + * @since 4.0 + */ +public class IndexFactory { + private static final int ADD_DEPENDENCIES = IIndexManager.ADD_DEPENDENCIES; + private static final int ADD_DEPENDENT = IIndexManager.ADD_DEPENDENT; + + private PDOMManager fPDOMManager; + + public IndexFactory(PDOMManager manager) { + fPDOMManager= manager; + } + + public IIndex getIndex(ICProject[] projects, int options) throws CoreException { + boolean addDependencies= (options & ADD_DEPENDENCIES) != 0; + boolean addDependent= (options & ADD_DEPENDENT) != 0; + + HashMap map= new HashMap(); + Collection selectedProjects= getProjects(projects, addDependencies, addDependent, map, new Integer(1)); + + ArrayList pdoms= new ArrayList(); + for (Iterator iter = selectedProjects.iterator(); iter.hasNext(); ) { + ICProject project = (ICProject) iter.next(); + IWritableIndexFragment pdom= (IWritableIndexFragment) fPDOMManager.getPDOM(project); + if (pdom != null) { + pdoms.add(pdom); + } + } + if (pdoms.isEmpty()) { + return EmptyCIndex.INSTANCE; + } + + // todo add the SDKs + int primaryFragmentCount= pdoms.size(); + + if (!addDependencies) { + projects= (ICProject[]) selectedProjects.toArray(new ICProject[selectedProjects.size()]); + selectedProjects.clear(); + // don't clear the map, so projects are not selected again + selectedProjects= getProjects(projects, true, false, map, new Integer(2)); + for (Iterator iter = selectedProjects.iterator(); iter.hasNext(); ) { + ICProject project = (ICProject) iter.next(); + IWritableIndexFragment pdom= (IWritableIndexFragment) fPDOMManager.getPDOM(project); + if (pdom != null) { + pdoms.add(pdom); + } + } + // todo add further SDKs + } + + return new CIndex((IIndexFragment[]) pdoms.toArray(new IIndexFragment[pdoms.size()]), primaryFragmentCount); + } + + private Collection getProjects(ICProject[] projects, boolean addDependencies, boolean addDependent, HashMap map, Integer markWith) { + List projectsToSearch= new ArrayList(); + + for (int i = 0; i < projects.length; i++) { + ICProject cproject = projects[i]; + IProject project= cproject.getProject(); + checkAddProject(project, map, projectsToSearch, markWith); + } + + if (addDependencies || addDependent) { + for (int i=0; i 0) { - CCorePlugin.getPDOMManager().enqueue(fhd); + CCoreInternals.getPDOMManager().enqueue(fhd); } } public void reindex() throws CoreException { - CCorePlugin.getPDOMManager().enqueue( - new PDOMFastReindex(this)); + CCoreInternals.getPDOMManager().enqueue(new PDOMFastReindex(this)); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullIndexer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullIndexer.java index 3ec17e21233..c3b9a9ac5e2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullIndexer.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullIndexer.java @@ -11,10 +11,10 @@ package org.eclipse.cdt.internal.core.pdom.indexer.full; -import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.IPDOMIndexer; import org.eclipse.cdt.core.model.ICElementDelta; import org.eclipse.cdt.core.model.ICProject; +import org.eclipse.cdt.internal.core.CCoreInternals; import org.eclipse.core.runtime.CoreException; /** @@ -37,12 +37,11 @@ public class PDOMFullIndexer implements IPDOMIndexer { } public void handleDelta(ICElementDelta delta) throws CoreException { - CCorePlugin.getPDOMManager().enqueue( - new PDOMFullHandleDelta(this, delta)); + CCoreInternals.getPDOMManager().enqueue(new PDOMFullHandleDelta(this, delta)); } public void reindex() throws CoreException { - CCorePlugin.getPDOMManager().enqueue(new PDOMFullReindex(this)); + CCoreInternals.getPDOMManager().enqueue(new PDOMFullReindex(this)); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/nulli/PDOMNullIndexer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/nulli/PDOMNullIndexer.java index 1b24aa009f2..bcdf66482e9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/nulli/PDOMNullIndexer.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/nulli/PDOMNullIndexer.java @@ -18,6 +18,7 @@ import org.eclipse.cdt.core.dom.IPDOMIndexerTask; import org.eclipse.cdt.core.dom.IPDOMManager; import org.eclipse.cdt.core.model.ICElementDelta; import org.eclipse.cdt.core.model.ICProject; +import org.eclipse.cdt.internal.core.CCoreInternals; import org.eclipse.cdt.internal.core.index.IWritableIndex; import org.eclipse.cdt.internal.core.index.IWritableIndexManager; import org.eclipse.core.runtime.CoreException; @@ -73,7 +74,7 @@ public class PDOMNullIndexer implements IPDOMIndexer { } } public void reindex() throws CoreException { - CCorePlugin.getPDOMManager().enqueue(new PDOMNullReindex()); + CCoreInternals.getPDOMManager().enqueue(new PDOMNullReindex()); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/messages.properties b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/messages.properties index b5f98c807fa..767ca86c54c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/messages.properties +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/messages.properties @@ -1,6 +1,6 @@ WritablePDOM_error_unknownLinkage=AST specifies unknown linkage ''{0}'' -PDOMManager_errorNoSuchIndex=Cannot obtain index for project ''{0}'' PDOMManager_notifyJob_label=Notify Index Change Listeners PDOMManager_JoinIndexerTask=Join Indexer +PDOMManager_savePrefsJob=Save Project Preferences PDOMManager_notifyTask_message=Notify Listeners PDOMManager_FilesToIndexSubtask={0} files to index diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CCoreInternals.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CCoreInternals.java new file mode 100644 index 00000000000..8fdb807f357 --- /dev/null +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CCoreInternals.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright (c) 2006 Wind River Systems, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ + +package org.eclipse.cdt.internal.core; + +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.internal.core.pdom.PDOMManager; + +public class CCoreInternals { + + public static PDOMManager getPDOMManager() { + return (PDOMManager) CCorePlugin.getPDOMManager(); + } +}