mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Fix for 149572, notifications for index.
This commit is contained in:
parent
31cb030bae
commit
6eef40d050
30 changed files with 944 additions and 362 deletions
|
@ -20,6 +20,7 @@ import java.io.InputStream;
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
|
import org.eclipse.cdt.core.dom.IPDOMManager;
|
||||||
import org.eclipse.cdt.core.model.ICProject;
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
import org.eclipse.cdt.core.testplugin.CProjectHelper;
|
import org.eclipse.cdt.core.testplugin.CProjectHelper;
|
||||||
import org.eclipse.cdt.core.testplugin.FileManager;
|
import org.eclipse.cdt.core.testplugin.FileManager;
|
||||||
|
@ -61,6 +62,7 @@ public class AST2FileBasePluginTest extends TestCase {
|
||||||
className = aClassName;
|
className = aClassName;
|
||||||
numProjects++;
|
numProjects++;
|
||||||
}
|
}
|
||||||
|
CCorePlugin.getPDOMManager().setIndexerId(cPrj, IPDOMManager.ID_NO_INDEXER);
|
||||||
} catch ( CoreException e ) {
|
} catch ( CoreException e ) {
|
||||||
/*boo*/
|
/*boo*/
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ import java.io.InputStream;
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
|
import org.eclipse.cdt.core.dom.IPDOMManager;
|
||||||
import org.eclipse.cdt.core.model.ICProject;
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
import org.eclipse.cdt.core.testplugin.CProjectHelper;
|
import org.eclipse.cdt.core.testplugin.CProjectHelper;
|
||||||
import org.eclipse.cdt.core.testplugin.FileManager;
|
import org.eclipse.cdt.core.testplugin.FileManager;
|
||||||
|
@ -44,7 +45,7 @@ public class DOMFileBasePluginTest extends TestCase {
|
||||||
static Class className;
|
static Class className;
|
||||||
static ICProject cPrj;
|
static ICProject cPrj;
|
||||||
|
|
||||||
private void initialize(Class aClassName){
|
private void initialize(Class aClassName) {
|
||||||
if( CCorePlugin.getDefault() != null && CCorePlugin.getDefault().getCoreModel() != null){
|
if( CCorePlugin.getDefault() != null && CCorePlugin.getDefault().getCoreModel() != null){
|
||||||
//(CCorePlugin.getDefault().getCoreModel().getIndexManager()).reset();
|
//(CCorePlugin.getDefault().getCoreModel().getIndexManager()).reset();
|
||||||
monitor = new NullProgressMonitor();
|
monitor = new NullProgressMonitor();
|
||||||
|
@ -61,12 +62,15 @@ public class DOMFileBasePluginTest extends TestCase {
|
||||||
className = aClassName;
|
className = aClassName;
|
||||||
numProjects++;
|
numProjects++;
|
||||||
}
|
}
|
||||||
|
// disable indexer
|
||||||
|
CCorePlugin.getPDOMManager().setIndexerId(cPrj, IPDOMManager.ID_NO_INDEXER);
|
||||||
} catch ( CoreException e ) {
|
} catch ( CoreException e ) {
|
||||||
/*boo*/
|
/*boo*/
|
||||||
}
|
}
|
||||||
if (project == null)
|
if (project == null)
|
||||||
throw new NullPointerException("Unable to create project"); //$NON-NLS-1$
|
throw new NullPointerException("Unable to create project"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
|
||||||
//Create file manager
|
//Create file manager
|
||||||
fileManager = new FileManager();
|
fileManager = new FileManager();
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,107 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* 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.pdom.tests;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import junit.framework.Test;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
|
import org.eclipse.cdt.core.dom.IPDOMManager;
|
||||||
|
import org.eclipse.cdt.core.index.IIndex;
|
||||||
|
import org.eclipse.cdt.core.index.IIndexChangeEvent;
|
||||||
|
import org.eclipse.cdt.core.index.IIndexChangeListener;
|
||||||
|
import org.eclipse.cdt.core.index.IIndexManager;
|
||||||
|
import org.eclipse.cdt.core.index.IIndexerStateEvent;
|
||||||
|
import org.eclipse.cdt.core.index.IIndexerStateListener;
|
||||||
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
|
import org.eclipse.cdt.core.testplugin.CProjectHelper;
|
||||||
|
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
|
||||||
|
import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
|
||||||
|
import org.eclipse.core.runtime.NullProgressMonitor;
|
||||||
|
|
||||||
|
public class IndexListenerTest extends BaseTestCase {
|
||||||
|
protected IIndex fIndex;
|
||||||
|
private ICProject fProject1;
|
||||||
|
private ICProject fProject2;
|
||||||
|
|
||||||
|
public static Test suite() {
|
||||||
|
return suite(IndexListenerTest.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setUp() throws Exception {
|
||||||
|
fProject1 = CProjectHelper.createCCProject("testIndexListener1", null);
|
||||||
|
fProject2 = CProjectHelper.createCCProject("testIndexListener2", null);
|
||||||
|
CCorePlugin.getPDOMManager().setIndexerId(fProject1, IPDOMManager.ID_FAST_INDEXER);
|
||||||
|
CCorePlugin.getPDOMManager().setIndexerId(fProject2, IPDOMManager.ID_FAST_INDEXER);
|
||||||
|
assertTrue(CCorePlugin.getIndexManager().joinIndexer(2000, new NullProgressMonitor()));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void tearDown() throws Exception {
|
||||||
|
CProjectHelper.delete(fProject1);
|
||||||
|
CProjectHelper.delete(fProject2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testIdleListener() throws Exception {
|
||||||
|
final int[] state= new int[] {0, 0, 0};
|
||||||
|
IIndexManager im= CCorePlugin.getIndexManager();
|
||||||
|
|
||||||
|
im.addIndexerStateListener(new IIndexerStateListener() {
|
||||||
|
public void indexChanged(IIndexerStateEvent event) {
|
||||||
|
if (event.indexerIsIdle()) {
|
||||||
|
state[0]++;
|
||||||
|
state[2]= 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
state[1]++;
|
||||||
|
state[2]= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
TestSourceReader.createFile(fProject1.getProject(), "test.cpp", "int a;");
|
||||||
|
Thread.sleep(200);
|
||||||
|
assertTrue(im.joinIndexer(2000, new NullProgressMonitor()));
|
||||||
|
Thread.sleep(200);
|
||||||
|
assertEquals(1, state[0]);
|
||||||
|
assertEquals(1, state[1]);
|
||||||
|
assertEquals(0, state[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testChangeListener() throws Exception {
|
||||||
|
final List projects= new ArrayList();
|
||||||
|
IIndexManager im= CCorePlugin.getIndexManager();
|
||||||
|
|
||||||
|
im.addIndexChangeListener(new IIndexChangeListener() {
|
||||||
|
public void indexChanged(IIndexChangeEvent event) {
|
||||||
|
projects.add(event.getAffectedProject());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
TestSourceReader.createFile(fProject1.getProject(), "test.cpp", "int a;");
|
||||||
|
Thread.sleep(200);
|
||||||
|
assertEquals(1, projects.size());
|
||||||
|
assertTrue(projects.contains(fProject1));
|
||||||
|
projects.clear();
|
||||||
|
|
||||||
|
|
||||||
|
TestSourceReader.createFile(fProject1.getProject(), "test.cpp", "int a;");
|
||||||
|
TestSourceReader.createFile(fProject2.getProject(), "test.cpp", "int b;");
|
||||||
|
Thread.sleep(200);
|
||||||
|
assertEquals(2, projects.size());
|
||||||
|
assertTrue(projects.contains(fProject1));
|
||||||
|
assertTrue(projects.contains(fProject2));
|
||||||
|
projects.clear();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,8 +20,6 @@ import java.util.regex.Pattern;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
import org.eclipse.cdt.core.dom.IName;
|
import org.eclipse.cdt.core.dom.IName;
|
||||||
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.dom.IPDOMManager;
|
||||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMember;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMember;
|
||||||
|
@ -90,28 +88,7 @@ public class PDOMTestBase extends BaseTestCase {
|
||||||
CCorePlugin.getPDOMManager().setIndexerId(cproject, IPDOMManager.ID_FAST_INDEXER);
|
CCorePlugin.getPDOMManager().setIndexerId(cproject, IPDOMManager.ID_FAST_INDEXER);
|
||||||
|
|
||||||
// wait until the indexer is done
|
// wait until the indexer is done
|
||||||
final boolean[] indexerDone = new boolean[1];
|
assertTrue(CCorePlugin.getIndexManager().joinIndexer(5000, new NullProgressMonitor()));
|
||||||
CCorePlugin.getPDOMManager().enqueue(new IPDOMIndexerTask() {
|
|
||||||
public IPDOMIndexer getIndexer() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
public void run(IProgressMonitor monitor) {
|
|
||||||
synchronized(indexerDone) {
|
|
||||||
indexerDone[0] = true;
|
|
||||||
indexerDone.notify();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Join indexer job
|
|
||||||
synchronized(indexerDone) {
|
|
||||||
while(!indexerDone[0])
|
|
||||||
indexerDone.wait();
|
|
||||||
}
|
|
||||||
} catch(InterruptedException ie) {
|
|
||||||
throw new RuntimeException(ie);
|
|
||||||
}
|
|
||||||
|
|
||||||
cprojects[0] = cproject;
|
cprojects[0] = cproject;
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ import junit.framework.TestSuite;
|
||||||
public class PDOMTests extends TestSuite {
|
public class PDOMTests extends TestSuite {
|
||||||
|
|
||||||
public static Test suite() {
|
public static Test suite() {
|
||||||
TestSuite suite = new TestSuite();
|
TestSuite suite = new PDOMTests();
|
||||||
|
|
||||||
suite.addTest(EnumerationTests.suite());
|
suite.addTest(EnumerationTests.suite());
|
||||||
suite.addTest(ClassTests.suite());
|
suite.addTest(ClassTests.suite());
|
||||||
|
|
|
@ -109,10 +109,11 @@ public class TestSourceReader {
|
||||||
* @param filePath the path relative to the container to create the file at
|
* @param filePath the path relative to the container to create the file at
|
||||||
* @param contents the content for the file
|
* @param contents the content for the file
|
||||||
* @return a file object.
|
* @return a file object.
|
||||||
|
* @throws CoreException
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
* @since 4.0
|
* @since 4.0
|
||||||
*/
|
*/
|
||||||
public static IFile createFile(IContainer container, IPath filePath, String contents) throws Exception {
|
public static IFile createFile(IContainer container, IPath filePath, String contents) throws CoreException {
|
||||||
//Obtain file handle
|
//Obtain file handle
|
||||||
IFile file = container.getFile(filePath);
|
IFile file = container.getFile(filePath);
|
||||||
|
|
||||||
|
@ -126,4 +127,20 @@ public class TestSourceReader {
|
||||||
}
|
}
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a file with content at the given path inside the given container.
|
||||||
|
* If the file exists its content is replaced.
|
||||||
|
* @param container a container to create the file in
|
||||||
|
* @param filePath the path relative to the container to create the file at
|
||||||
|
* @param contents the content for the file
|
||||||
|
* @return
|
||||||
|
* @return a file object.
|
||||||
|
* @throws Exception
|
||||||
|
* @throws Exception
|
||||||
|
* @since 4.0
|
||||||
|
*/
|
||||||
|
public static IFile createFile(IContainer container, String filePath, String contents) throws CoreException {
|
||||||
|
return createFile(container, new Path(filePath), contents);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,5 +30,7 @@ public interface IPDOMIndexerTask {
|
||||||
public void run(IProgressMonitor monitor);
|
public void run(IProgressMonitor monitor);
|
||||||
|
|
||||||
public IPDOMIndexer getIndexer();
|
public IPDOMIndexer getIndexer();
|
||||||
|
|
||||||
|
public int getFilesToIndexCount();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,9 @@ public interface IPDOMManager {
|
||||||
public static final String ID_FULL_INDEXER= "org.eclipse.cdt.core.domsourceindexer"; //$NON-NLS-1$
|
public static final String ID_FULL_INDEXER= "org.eclipse.cdt.core.domsourceindexer"; //$NON-NLS-1$
|
||||||
|
|
||||||
// Getting the PDOM
|
// Getting the PDOM
|
||||||
|
/**
|
||||||
|
* mstodo deprecate: use CCorePlugin.getIndexManager().getIndex(...).
|
||||||
|
*/
|
||||||
public IPDOM getPDOM(ICProject project) throws CoreException;
|
public IPDOM getPDOM(ICProject project) throws CoreException;
|
||||||
|
|
||||||
// Get the indexer for a given project
|
// Get the indexer for a given project
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* 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.core.index;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IndexChangeEvents descrive changes to the index.
|
||||||
|
* <p>
|
||||||
|
* <strong>EXPERIMENTAL</strong>. This class or interface has been added as
|
||||||
|
* part of a work in progress. There is no guarantee that this API will work or
|
||||||
|
* that it will remain the same. Please do not use this API without consulting
|
||||||
|
* with the CDT team.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @since 4.0
|
||||||
|
*/
|
||||||
|
public interface IIndexChangeEvent {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the project for which the index has changed.
|
||||||
|
*/
|
||||||
|
public ICProject getAffectedProject();
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* 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.core.index;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An index change listener is notified of changes to the index. These changes
|
||||||
|
* arise from the indexer working in the background.
|
||||||
|
* <p>
|
||||||
|
* Clients may implement this interface.
|
||||||
|
* <p>
|
||||||
|
* <strong>EXPERIMENTAL</strong>. This class or interface has been added as
|
||||||
|
* part of a work in progress. There is no guarantee that this API will work or
|
||||||
|
* that it will remain the same. Please do not use this API without consulting
|
||||||
|
* with the CDT team.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @since 4.0
|
||||||
|
*/
|
||||||
|
public interface IIndexChangeListener {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notifies this listener that some part of the index has changed.
|
||||||
|
* <p>
|
||||||
|
* The supplied event provides the details. This event object is valid only for
|
||||||
|
* the duration of the invocation of this method.
|
||||||
|
* </p>
|
||||||
|
* <p>
|
||||||
|
* Note: This method is called by CDT; it is not intended
|
||||||
|
* to be called directly by clients.
|
||||||
|
*
|
||||||
|
* @param event the index change event
|
||||||
|
*/
|
||||||
|
public void indexChanged(IIndexChangeEvent event);
|
||||||
|
}
|
|
@ -14,6 +14,7 @@ package org.eclipse.cdt.core.index;
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
import org.eclipse.cdt.core.model.ICProject;
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Starting point for working with the index. The manager can be obtained via
|
* Starting point for working with the index. The manager can be obtained via
|
||||||
|
@ -34,6 +35,7 @@ public interface IIndexManager {
|
||||||
public final static int ADD_DEPENDENCIES = 0x1;
|
public final static int ADD_DEPENDENCIES = 0x1;
|
||||||
public final static int ADD_DEPENDENT = 0x2;
|
public final static int ADD_DEPENDENT = 0x2;
|
||||||
|
|
||||||
|
public final static int FOREVER= -1;
|
||||||
/**
|
/**
|
||||||
* Returns the index for the given project.
|
* Returns the index for the given project.
|
||||||
* @param project the project to get the index for
|
* @param project the project to get the index for
|
||||||
|
@ -67,4 +69,37 @@ public interface IIndexManager {
|
||||||
* @throws CoreException
|
* @throws CoreException
|
||||||
*/
|
*/
|
||||||
IIndex getIndex(ICProject[] projects, int options) throws CoreException;
|
IIndex getIndex(ICProject[] projects, int options) throws CoreException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a listener that will be notified whenever the indexer go idle.
|
||||||
|
* @param listener the listener to register.
|
||||||
|
*/
|
||||||
|
void addIndexChangeListener(IIndexChangeListener listener);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a previously registered index change listener.
|
||||||
|
* @param listener the listener to unregister.
|
||||||
|
*/
|
||||||
|
void removeIndexChangeListener(IIndexChangeListener listener);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a listener that will be notified whenever the indexer changes its state.
|
||||||
|
* @param listener the listener to register.
|
||||||
|
*/
|
||||||
|
void addIndexerStateListener(IIndexerStateListener listener);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a previously registered indexer state listener.
|
||||||
|
* @param listener the listener to unregister.
|
||||||
|
*/
|
||||||
|
void removeIndexerStateListener(IIndexerStateListener listener);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Joins the indexer and reports progress.
|
||||||
|
* @param waitMaxMillis time limit in millis after which the method returns with <code>false</code>,
|
||||||
|
* or {@link #FOREVER}.
|
||||||
|
* @param monitor a monitor to report progress.
|
||||||
|
* @return <code>true</code>, if the indexer went idle in the given time.
|
||||||
|
*/
|
||||||
|
boolean joinIndexer(int waitMaxMillis, IProgressMonitor monitor);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* 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.core.index;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IndexChangeEvents descrive changes to the state of the indexer.
|
||||||
|
* <p>
|
||||||
|
* <strong>EXPERIMENTAL</strong>. This class or interface has been added as
|
||||||
|
* part of a work in progress. There is no guarantee that this API will work or
|
||||||
|
* that it will remain the same. Please do not use this API without consulting
|
||||||
|
* with the CDT team.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @since 4.0
|
||||||
|
*/
|
||||||
|
public interface IIndexerStateEvent {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests whether the indexer has more work to do.
|
||||||
|
* @since 4.0
|
||||||
|
*/
|
||||||
|
boolean indexerIsIdle();
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* 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.core.index;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An indexer state listener is notified of changes to the state of the indexer.
|
||||||
|
* <p>
|
||||||
|
* Clients may implement this interface.
|
||||||
|
* <p>
|
||||||
|
* <strong>EXPERIMENTAL</strong>. This class or interface has been added as
|
||||||
|
* part of a work in progress. There is no guarantee that this API will work or
|
||||||
|
* that it will remain the same. Please do not use this API without consulting
|
||||||
|
* with the CDT team.
|
||||||
|
* </p>
|
||||||
|
* @since 4.0
|
||||||
|
*/
|
||||||
|
public interface IIndexerStateListener {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notifies this listener that the state of the indexer has changed.
|
||||||
|
* <p>
|
||||||
|
* The supplied event provides the details. This event object is valid only for
|
||||||
|
* the duration of the invocation of this method.
|
||||||
|
* </p>
|
||||||
|
* <p>
|
||||||
|
* Note: This method is called by CDT; it is not intended
|
||||||
|
* to be called directly by clients.
|
||||||
|
*
|
||||||
|
* @param event the indexer state event
|
||||||
|
*/
|
||||||
|
public void indexChanged(IIndexerStateEvent event);
|
||||||
|
}
|
|
@ -50,6 +50,12 @@ public class CIndex implements IIndex {
|
||||||
this(fragments, fragments.length);
|
this(fragments, fragments.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IIndexFragment[] getPrimaryFragments() {
|
||||||
|
IIndexFragment[] result= new IIndexFragment[fPrimaryFragmentCount];
|
||||||
|
System.arraycopy(fFragments, 0, result, 0, fPrimaryFragmentCount);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
public IIndexBinding findBinding(ICElement element) throws CoreException {
|
public IIndexBinding findBinding(ICElement element) throws CoreException {
|
||||||
// mstodo ICElement to IBinding
|
// mstodo ICElement to IBinding
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -47,7 +47,7 @@ public interface IIndexFragment {
|
||||||
* @see IIndex#FIND_ALL_OCCURENCES
|
* @see IIndex#FIND_ALL_OCCURENCES
|
||||||
*/
|
*/
|
||||||
final int FIND_ALL_OCCURENCES = IIndex.FIND_ALL_OCCURENCES;
|
final int FIND_ALL_OCCURENCES = IIndex.FIND_ALL_OCCURENCES;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the file for the given location. May return <code>null</code>, if no such file exists.
|
* Returns the file for the given location. May return <code>null</code>, if no such file exists.
|
||||||
* This method may only return files that are actually managed by this fragement.
|
* This method may only return files that are actually managed by this fragement.
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* 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 org.eclipse.cdt.core.index.IIndexChangeEvent;
|
||||||
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
|
|
||||||
|
public class IndexChangeEvent implements IIndexChangeEvent {
|
||||||
|
|
||||||
|
private ICProject fAffectedProject;
|
||||||
|
|
||||||
|
public IndexChangeEvent(ICProject projectChanged) {
|
||||||
|
fAffectedProject= projectChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IndexChangeEvent() {
|
||||||
|
fAffectedProject= null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICProject getAffectedProject() {
|
||||||
|
return fAffectedProject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAffectedProject(ICProject project) {
|
||||||
|
fAffectedProject= project;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* 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 org.eclipse.cdt.core.index.IIndexerStateEvent;
|
||||||
|
|
||||||
|
public class IndexerStateEvent implements IIndexerStateEvent {
|
||||||
|
|
||||||
|
public static final int STATE_IDLE= 0;
|
||||||
|
public static final int STATE_BUSY= 1;
|
||||||
|
|
||||||
|
private int fState;
|
||||||
|
|
||||||
|
public IndexerStateEvent() {
|
||||||
|
this(STATE_IDLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IndexerStateEvent(int state) {
|
||||||
|
fState= state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setState(int state) {
|
||||||
|
fState= state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean indexerIsIdle() {
|
||||||
|
return fState == STATE_IDLE;
|
||||||
|
}
|
||||||
|
}
|
|
@ -15,6 +15,11 @@ import org.eclipse.osgi.util.NLS;
|
||||||
|
|
||||||
public class Messages extends NLS {
|
public class Messages extends NLS {
|
||||||
private static final String BUNDLE_NAME = "org.eclipse.cdt.internal.core.pdom.messages"; //$NON-NLS-1$
|
private static final String BUNDLE_NAME = "org.eclipse.cdt.internal.core.pdom.messages"; //$NON-NLS-1$
|
||||||
|
public static String PDOMManager_errorNoSuchIndex;
|
||||||
|
public static String PDOMManager_FilesToIndexSubtask;
|
||||||
|
public static String PDOMManager_JoinIndexerTask;
|
||||||
|
public static String PDOMManager_notifyJob_label;
|
||||||
|
public static String PDOMManager_notifyTask_message;
|
||||||
public static String WritablePDOM_error_unknownLinkage;
|
public static String WritablePDOM_error_unknownLinkage;
|
||||||
static {
|
static {
|
||||||
// initialize resource bundle
|
// initialize resource bundle
|
||||||
|
|
|
@ -51,24 +51,30 @@ public class PDOMIndexerJob extends Job {
|
||||||
while (!pdomManager.finishIndexerJob()) {
|
while (!pdomManager.finishIndexerJob()) {
|
||||||
IPDOMIndexerTask nextTask= pdomManager.getNextTask();
|
IPDOMIndexerTask nextTask= pdomManager.getNextTask();
|
||||||
synchronized (taskMutex) {
|
synchronized (taskMutex) {
|
||||||
if (!cancelledByManager) {
|
currentTask= nextTask; // write to currentTask needs protection
|
||||||
currentTask= nextTask; // write to currentTask needs protection
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (currentTask != null) { // read on currentTask is ok (no write in other thread)
|
|
||||||
|
try {
|
||||||
currentTask.run(monitor);
|
currentTask.run(monitor);
|
||||||
synchronized (taskMutex) {
|
}
|
||||||
currentTask= null; // write to currentTask needs protection
|
catch (Exception e) {
|
||||||
if (cancelledByManager) {
|
CCorePlugin.log(e);
|
||||||
// TODO chance for confusion here is user cancels
|
}
|
||||||
// while project is getting deletes.
|
boolean cancelledByUser= false;
|
||||||
monitor.setCanceled(false);
|
synchronized (taskMutex) {
|
||||||
cancelledByManager = false;
|
currentTask= null; // write to currentTask needs protection
|
||||||
taskMutex.notify();
|
if (cancelledByManager) {
|
||||||
}
|
// TODO chance for confusion here is user cancels
|
||||||
|
// while project is getting deletes.
|
||||||
|
monitor.setCanceled(false);
|
||||||
|
cancelledByManager = false;
|
||||||
|
taskMutex.notify();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
cancelledByUser= monitor.isCanceled();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (monitor.isCanceled()) {
|
if (cancelledByUser) {
|
||||||
pdomManager.cancelledByUser();
|
pdomManager.cancelledByUser();
|
||||||
return Status.CANCEL_STATUS;
|
return Status.CANCEL_STATUS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,8 @@ import org.eclipse.cdt.core.dom.IPDOMIndexer;
|
||||||
import org.eclipse.cdt.core.dom.IPDOMIndexerTask;
|
import org.eclipse.cdt.core.dom.IPDOMIndexerTask;
|
||||||
import org.eclipse.cdt.core.dom.IPDOMManager;
|
import org.eclipse.cdt.core.dom.IPDOMManager;
|
||||||
import org.eclipse.cdt.core.index.IIndex;
|
import org.eclipse.cdt.core.index.IIndex;
|
||||||
import org.eclipse.cdt.core.index.IIndexManager;
|
import org.eclipse.cdt.core.index.IIndexChangeListener;
|
||||||
|
import org.eclipse.cdt.core.index.IIndexerStateListener;
|
||||||
import org.eclipse.cdt.core.model.CoreModel;
|
import org.eclipse.cdt.core.model.CoreModel;
|
||||||
import org.eclipse.cdt.core.model.ElementChangedEvent;
|
import org.eclipse.cdt.core.model.ElementChangedEvent;
|
||||||
import org.eclipse.cdt.core.model.ICElement;
|
import org.eclipse.cdt.core.model.ICElement;
|
||||||
|
@ -42,7 +43,10 @@ import org.eclipse.cdt.internal.core.index.IIndexFragment;
|
||||||
import org.eclipse.cdt.internal.core.index.IWritableIndex;
|
import org.eclipse.cdt.internal.core.index.IWritableIndex;
|
||||||
import org.eclipse.cdt.internal.core.index.IWritableIndexFragment;
|
import org.eclipse.cdt.internal.core.index.IWritableIndexFragment;
|
||||||
import org.eclipse.cdt.internal.core.index.IWritableIndexManager;
|
import org.eclipse.cdt.internal.core.index.IWritableIndexManager;
|
||||||
|
import org.eclipse.cdt.internal.core.index.IndexChangeEvent;
|
||||||
|
import org.eclipse.cdt.internal.core.index.IndexerStateEvent;
|
||||||
import org.eclipse.cdt.internal.core.index.WritableCIndex;
|
import org.eclipse.cdt.internal.core.index.WritableCIndex;
|
||||||
|
import org.eclipse.cdt.internal.core.pdom.PDOM.IListener;
|
||||||
import org.eclipse.cdt.internal.core.pdom.indexer.nulli.PDOMNullIndexer;
|
import org.eclipse.cdt.internal.core.pdom.indexer.nulli.PDOMNullIndexer;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.resources.ProjectScope;
|
import org.eclipse.core.resources.ProjectScope;
|
||||||
|
@ -51,10 +55,14 @@ import org.eclipse.core.runtime.IConfigurationElement;
|
||||||
import org.eclipse.core.runtime.IExtension;
|
import org.eclipse.core.runtime.IExtension;
|
||||||
import org.eclipse.core.runtime.IPath;
|
import org.eclipse.core.runtime.IPath;
|
||||||
import org.eclipse.core.runtime.IProgressMonitor;
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.ISafeRunnable;
|
||||||
import org.eclipse.core.runtime.IStatus;
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.ListenerList;
|
||||||
import org.eclipse.core.runtime.Platform;
|
import org.eclipse.core.runtime.Platform;
|
||||||
import org.eclipse.core.runtime.QualifiedName;
|
import org.eclipse.core.runtime.QualifiedName;
|
||||||
|
import org.eclipse.core.runtime.SafeRunner;
|
||||||
import org.eclipse.core.runtime.Status;
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.core.runtime.jobs.ISchedulingRule;
|
||||||
import org.eclipse.core.runtime.jobs.Job;
|
import org.eclipse.core.runtime.jobs.Job;
|
||||||
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
|
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
|
||||||
import org.eclipse.core.runtime.preferences.IPreferencesService;
|
import org.eclipse.core.runtime.preferences.IPreferencesService;
|
||||||
|
@ -69,34 +77,77 @@ import org.osgi.service.prefs.BackingStoreException;
|
||||||
*
|
*
|
||||||
* @author Doug Schaefer
|
* @author Doug Schaefer
|
||||||
*/
|
*/
|
||||||
public class PDOMManager implements IPDOMManager, IWritableIndexManager, IElementChangedListener {
|
public class PDOMManager implements IPDOMManager, IWritableIndexManager, IElementChangedListener, IListener {
|
||||||
|
|
||||||
private static final QualifiedName indexerProperty
|
private static final QualifiedName indexerProperty= new QualifiedName(CCorePlugin.PLUGIN_ID, "pdomIndexer"); //$NON-NLS-1$
|
||||||
= new QualifiedName(CCorePlugin.PLUGIN_ID, "pdomIndexer"); //$NON-NLS-1$
|
private static final QualifiedName dbNameProperty= new QualifiedName(CCorePlugin.PLUGIN_ID, "pdomName"); //$NON-NLS-1$
|
||||||
private static final QualifiedName dbNameProperty
|
private static final QualifiedName pdomProperty= new QualifiedName(CCorePlugin.PLUGIN_ID, "pdom"); //$NON-NLS-1$
|
||||||
= new QualifiedName(CCorePlugin.PLUGIN_ID, "pdomName"); //$NON-NLS-1$
|
|
||||||
private static final QualifiedName pdomProperty
|
private static final String INDEXER_ID_KEY = "indexerId"; //$NON-NLS-1$
|
||||||
= new QualifiedName(CCorePlugin.PLUGIN_ID, "pdom"); //$NON-NLS-1$
|
private static final ISchedulingRule NOTIFICATION_SCHEDULING_RULE = new ISchedulingRule(){
|
||||||
|
public boolean contains(ISchedulingRule rule) {
|
||||||
|
return rule == this;
|
||||||
|
}
|
||||||
|
public boolean isConflicting(ISchedulingRule rule) {
|
||||||
|
return rule == this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private PDOMIndexerJob indexerJob;
|
||||||
|
private IPDOMIndexerTask currentTask;
|
||||||
|
private LinkedList taskQueue = new LinkedList();
|
||||||
|
private Object taskQueueMutex = new Object();
|
||||||
|
private Object fWakeupOnIdle= new Object();
|
||||||
|
|
||||||
|
private Map fPDOMs= new HashMap();
|
||||||
|
private ListenerList fChangeListeners= new ListenerList();
|
||||||
|
private ListenerList fStateListeners= new ListenerList();
|
||||||
|
|
||||||
|
private IndexChangeEvent fIndexChangeEvent= new IndexChangeEvent();
|
||||||
|
private IndexerStateEvent fIndexerStateEvent= new IndexerStateEvent();
|
||||||
|
|
||||||
|
|
||||||
public synchronized IPDOM getPDOM(ICProject project) throws CoreException {
|
public synchronized IPDOM getPDOM(ICProject project) throws CoreException {
|
||||||
IProject rproject = project.getProject();
|
IProject rproject = project.getProject();
|
||||||
WritablePDOM pdom = (WritablePDOM)rproject.getSessionProperty(pdomProperty);
|
WritablePDOM pdom = (WritablePDOM)rproject.getSessionProperty(pdomProperty);
|
||||||
if (pdom == null) {
|
if (pdom != null) {
|
||||||
String dbName = rproject.getPersistentProperty(dbNameProperty);
|
ICProject oldProject= (ICProject) fPDOMs.get(pdom);
|
||||||
if (dbName == null) {
|
if (project.equals(oldProject)) {
|
||||||
dbName = project.getElementName() + "." //$NON-NLS-1$
|
return pdom;
|
||||||
+ System.currentTimeMillis() + ".pdom"; //$NON-NLS-1$
|
}
|
||||||
|
|
||||||
|
if (oldProject != null && oldProject.getProject().exists()) {
|
||||||
|
// project was copied
|
||||||
|
String dbName= getDefaultName(project);
|
||||||
rproject.setPersistentProperty(dbNameProperty, dbName);
|
rproject.setPersistentProperty(dbNameProperty, dbName);
|
||||||
}
|
}
|
||||||
IPath dbPath = CCorePlugin.getDefault().getStateLocation().append(dbName);
|
else {
|
||||||
pdom = new WritablePDOM(dbPath);
|
// project was renamed
|
||||||
rproject.setSessionProperty(pdomProperty, pdom);
|
fPDOMs.put(pdom, project);
|
||||||
if (pdom.versionMismatch())
|
return pdom;
|
||||||
getIndexer(project).reindex();
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String dbName= rproject.getPersistentProperty(dbNameProperty);
|
||||||
|
if (dbName == null) {
|
||||||
|
dbName = getDefaultName(project);
|
||||||
|
rproject.setPersistentProperty(dbNameProperty, dbName);
|
||||||
|
}
|
||||||
|
IPath dbPath = CCorePlugin.getDefault().getStateLocation().append(dbName);
|
||||||
|
pdom = new WritablePDOM(dbPath);
|
||||||
|
pdom.addListener(this);
|
||||||
|
rproject.setSessionProperty(pdomProperty, pdom);
|
||||||
|
fPDOMs.put(pdom, project);
|
||||||
|
if (pdom.versionMismatch()) {
|
||||||
|
getIndexer(project).reindex();
|
||||||
}
|
}
|
||||||
return pdom;
|
return pdom;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getDefaultName(ICProject project) {
|
||||||
|
return project.getElementName() + "." + System.currentTimeMillis() + ".pdom"; //$NON-NLS-1$//$NON-NLS-2$
|
||||||
|
}
|
||||||
|
|
||||||
public IPDOMIndexer getIndexer(ICProject project) {
|
public IPDOMIndexer getIndexer(ICProject project) {
|
||||||
try {
|
try {
|
||||||
IProject rproject = project.getProject();
|
IProject rproject = project.getProject();
|
||||||
|
@ -240,7 +291,7 @@ public class PDOMManager implements IPDOMManager, IWritableIndexManager, IElemen
|
||||||
|
|
||||||
if (pdoms.isEmpty()) {
|
if (pdoms.isEmpty()) {
|
||||||
throw new CoreException(CCorePlugin.createStatus(
|
throw new CoreException(CCorePlugin.createStatus(
|
||||||
MessageFormat.format("Cannot obtain index for project ''{0}''", new Object[]{project.getElementName()})));
|
MessageFormat.format(Messages.PDOMManager_errorNoSuchIndex, new Object[]{project.getElementName()})));
|
||||||
}
|
}
|
||||||
|
|
||||||
return new WritableCIndex((IWritableIndexFragment[]) pdoms.toArray(new IWritableIndexFragment[pdoms.size()]), new IIndexFragment[0]);
|
return new WritableCIndex((IWritableIndexFragment[]) pdoms.toArray(new IWritableIndexFragment[pdoms.size()]), new IIndexFragment[0]);
|
||||||
|
@ -300,8 +351,6 @@ public class PDOMManager implements IPDOMManager, IWritableIndexManager, IElemen
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final String INDEXER_ID_KEY = "indexerId"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
public String getDefaultIndexerId() {
|
public String getDefaultIndexerId() {
|
||||||
IPreferencesService prefService = Platform.getPreferencesService();
|
IPreferencesService prefService = Platform.getPreferencesService();
|
||||||
return prefService.getString(CCorePlugin.PLUGIN_ID, INDEXER_ID_KEY,
|
return prefService.getString(CCorePlugin.PLUGIN_ID, INDEXER_ID_KEY,
|
||||||
|
@ -420,56 +469,83 @@ public class PDOMManager implements IPDOMManager, IWritableIndexManager, IElemen
|
||||||
return indexer;
|
return indexer;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Indexer manager
|
|
||||||
private PDOMIndexerJob indexerJob;
|
|
||||||
private LinkedList indexerJobQueue = new LinkedList();
|
|
||||||
private Object indexerJobMutex = new Object();
|
|
||||||
|
|
||||||
public void enqueue(IPDOMIndexerTask subjob) {
|
public void enqueue(IPDOMIndexerTask subjob) {
|
||||||
synchronized (indexerJobMutex) {
|
boolean notifyBusy= false;
|
||||||
indexerJobQueue.addLast(subjob);
|
synchronized (taskQueueMutex) {
|
||||||
|
taskQueue.addLast(subjob);
|
||||||
if (indexerJob == null) {
|
if (indexerJob == null) {
|
||||||
indexerJob = new PDOMIndexerJob(this);
|
indexerJob = new PDOMIndexerJob(this);
|
||||||
indexerJob.schedule();
|
indexerJob.schedule();
|
||||||
|
notifyBusy= true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (notifyBusy) {
|
||||||
|
notifyState(IndexerStateEvent.STATE_BUSY);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
IPDOMIndexerTask getNextTask() {
|
IPDOMIndexerTask getNextTask() {
|
||||||
synchronized (indexerJobMutex) {
|
synchronized (taskQueueMutex) {
|
||||||
return indexerJobQueue.isEmpty()
|
currentTask= taskQueue.isEmpty() ? null : (IPDOMIndexerTask)taskQueue.removeFirst();
|
||||||
? null
|
return currentTask;
|
||||||
: (IPDOMIndexerTask)indexerJobQueue.removeFirst();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cancelledByUser() {
|
void cancelledByUser() {
|
||||||
synchronized (indexerJobMutex) {
|
synchronized (taskQueueMutex) {
|
||||||
indexerJobQueue.clear();
|
taskQueue.clear();
|
||||||
|
currentTask= null;
|
||||||
|
indexerJob= null;
|
||||||
}
|
}
|
||||||
|
notifyState(IndexerStateEvent.STATE_IDLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean finishIndexerJob() {
|
boolean finishIndexerJob() {
|
||||||
synchronized (indexerJobMutex) {
|
boolean idle= false;
|
||||||
if (indexerJobQueue.isEmpty()) {
|
synchronized (taskQueueMutex) {
|
||||||
|
currentTask= null;
|
||||||
|
if (taskQueue.isEmpty()) {
|
||||||
indexerJob = null;
|
indexerJob = null;
|
||||||
return true;
|
idle= true;
|
||||||
} else
|
}
|
||||||
// No way, there's more work to do
|
}
|
||||||
return false;
|
if (idle) {
|
||||||
}
|
notifyState(IndexerStateEvent.STATE_IDLE);
|
||||||
|
}
|
||||||
|
return idle;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void deleting(ICProject project) {
|
public void deleting(ICProject project) {
|
||||||
// Project is about to be deleted. Stop all indexing tasks for it
|
// Project is about to be deleted. Stop all indexing tasks for it
|
||||||
IPDOMIndexer indexer = getIndexer(project);
|
IPDOMIndexer indexer = getIndexer(project);
|
||||||
synchronized (indexerJobMutex) {
|
synchronized (taskQueueMutex) {
|
||||||
if (indexerJob != null) {
|
if (indexerJob != null) {
|
||||||
indexerJob.cancelJobs(indexer);
|
indexerJob.cancelJobs(indexer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isIndexerIdle() {
|
||||||
|
synchronized (taskQueueMutex) {
|
||||||
|
return currentTask == null && taskQueue.isEmpty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getFilesToIndexCount() {
|
||||||
|
int count= 0;
|
||||||
|
synchronized (taskQueueMutex) {
|
||||||
|
if (currentTask != null) {
|
||||||
|
count= currentTask.getFilesToIndexCount();
|
||||||
|
}
|
||||||
|
for (Iterator iter = taskQueue.iterator(); iter.hasNext();) {
|
||||||
|
IPDOMIndexerTask task= (IPDOMIndexerTask) iter.next();
|
||||||
|
count+= task.getFilesToIndexCount();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Startup the PDOM. This mainly sets us up to handle model
|
* Startup the PDOM. This mainly sets us up to handle model
|
||||||
* change events.
|
* change events.
|
||||||
|
@ -478,4 +554,137 @@ public class PDOMManager implements IPDOMManager, IWritableIndexManager, IElemen
|
||||||
CoreModel.getDefault().addElementChangedListener(this);
|
CoreModel.getDefault().addElementChangedListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addIndexChangeListener(IIndexChangeListener listener) {
|
||||||
|
fChangeListeners.add(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeIndexChangeListener(IIndexChangeListener listener) {
|
||||||
|
fChangeListeners.remove(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addIndexerStateListener(IIndexerStateListener listener) {
|
||||||
|
fStateListeners.add(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeIndexerStateListener(IIndexerStateListener listener) {
|
||||||
|
fStateListeners.remove(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void notifyState(final int state) {
|
||||||
|
if (state == IndexerStateEvent.STATE_IDLE) {
|
||||||
|
assert !Thread.holdsLock(taskQueueMutex);
|
||||||
|
synchronized(fWakeupOnIdle) {
|
||||||
|
fWakeupOnIdle.notifyAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fStateListeners.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Job notify= new Job(Messages.PDOMManager_notifyJob_label) {
|
||||||
|
protected IStatus run(IProgressMonitor monitor) {
|
||||||
|
fIndexerStateEvent.setState(state);
|
||||||
|
Object[] listeners= fStateListeners.getListeners();
|
||||||
|
monitor.beginTask(Messages.PDOMManager_notifyTask_message, listeners.length);
|
||||||
|
for (int i = 0; i < listeners.length; i++) {
|
||||||
|
final IIndexerStateListener listener = (IIndexerStateListener) listeners[i];
|
||||||
|
SafeRunner.run(new ISafeRunnable(){
|
||||||
|
public void handleException(Throwable exception) {
|
||||||
|
CCorePlugin.log(exception);
|
||||||
|
}
|
||||||
|
public void run() throws Exception {
|
||||||
|
listener.indexChanged(fIndexerStateEvent);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
monitor.worked(1);
|
||||||
|
}
|
||||||
|
return Status.OK_STATUS;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
notify.setRule(NOTIFICATION_SCHEDULING_RULE);
|
||||||
|
notify.setSystem(true);
|
||||||
|
notify.schedule();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void handleChange(PDOM pdom) {
|
||||||
|
if (fChangeListeners.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ICProject project;
|
||||||
|
synchronized (this) {
|
||||||
|
project = (ICProject) fPDOMs.get(pdom);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (project != null) {
|
||||||
|
final ICProject finalProject= project;
|
||||||
|
Job notify= new Job(Messages.PDOMManager_notifyJob_label) {
|
||||||
|
protected IStatus run(IProgressMonitor monitor) {
|
||||||
|
fIndexChangeEvent.setAffectedProject(finalProject);
|
||||||
|
Object[] listeners= fChangeListeners.getListeners();
|
||||||
|
monitor.beginTask(Messages.PDOMManager_notifyTask_message, listeners.length);
|
||||||
|
for (int i = 0; i < listeners.length; i++) {
|
||||||
|
final IIndexChangeListener listener = (IIndexChangeListener) listeners[i];
|
||||||
|
SafeRunner.run(new ISafeRunnable(){
|
||||||
|
public void handleException(Throwable exception) {
|
||||||
|
CCorePlugin.log(exception);
|
||||||
|
}
|
||||||
|
public void run() throws Exception {
|
||||||
|
listener.indexChanged(fIndexChangeEvent);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
monitor.worked(1);
|
||||||
|
}
|
||||||
|
return Status.OK_STATUS;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
notify.setRule(NOTIFICATION_SCHEDULING_RULE);
|
||||||
|
notify.setSystem(true);
|
||||||
|
notify.schedule();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean joinIndexer(int waitMaxMillis, IProgressMonitor monitor) {
|
||||||
|
monitor.beginTask(Messages.PDOMManager_JoinIndexerTask, IProgressMonitor.UNKNOWN);
|
||||||
|
long limit= System.currentTimeMillis()+waitMaxMillis;
|
||||||
|
try {
|
||||||
|
while (true) {
|
||||||
|
if (monitor.isCanceled()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
boolean wouldFail= false;
|
||||||
|
int wait= 1000;
|
||||||
|
if (waitMaxMillis >= 0) {
|
||||||
|
int rest= (int) (limit - System.currentTimeMillis());
|
||||||
|
if (rest < wait) {
|
||||||
|
if (rest <= 0) {
|
||||||
|
wouldFail= true;
|
||||||
|
}
|
||||||
|
|
||||||
|
wait= rest;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert !Thread.holdsLock(taskQueueMutex);
|
||||||
|
synchronized(fWakeupOnIdle) {
|
||||||
|
if (isIndexerIdle()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (wouldFail) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
monitor.subTask(MessageFormat.format(Messages.PDOMManager_FilesToIndexSubtask, new Object[] {new Integer(getFilesToIndexCount())}));
|
||||||
|
try {
|
||||||
|
fWakeupOnIdle.wait(wait);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
monitor.done();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,128 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* 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.pdom.indexer;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
|
import org.eclipse.cdt.core.dom.IPDOMIndexerTask;
|
||||||
|
import org.eclipse.cdt.core.model.ICElement;
|
||||||
|
import org.eclipse.cdt.core.model.ICElementDelta;
|
||||||
|
import org.eclipse.cdt.core.model.ICElementVisitor;
|
||||||
|
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.resources.IFile;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
|
||||||
|
public abstract class PDOMIndexerTask implements IPDOMIndexerTask {
|
||||||
|
|
||||||
|
protected static final int MAX_ERRORS = 10;
|
||||||
|
protected int fErrorCount;
|
||||||
|
|
||||||
|
protected void processDelta(ICElementDelta delta, Collection added, Collection changed, Collection removed) throws CoreException {
|
||||||
|
int flags = delta.getFlags();
|
||||||
|
|
||||||
|
if ((flags & ICElementDelta.F_CHILDREN) != 0) {
|
||||||
|
ICElementDelta[] children = delta.getAffectedChildren();
|
||||||
|
for (int i = 0; i < children.length; ++i) {
|
||||||
|
processDelta(children[i], added, changed, removed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ICElement element = delta.getElement();
|
||||||
|
switch (element.getElementType()) {
|
||||||
|
case ICElement.C_UNIT:
|
||||||
|
ITranslationUnit tu = (ITranslationUnit)element;
|
||||||
|
switch (delta.getKind()) {
|
||||||
|
case ICElementDelta.CHANGED:
|
||||||
|
if ((flags & ICElementDelta.F_CONTENT) != 0)
|
||||||
|
changed.add(tu);
|
||||||
|
break;
|
||||||
|
case ICElementDelta.ADDED:
|
||||||
|
if (!tu.isWorkingCopy())
|
||||||
|
added.add(tu);
|
||||||
|
break;
|
||||||
|
case ICElementDelta.REMOVED:
|
||||||
|
if (!tu.isWorkingCopy())
|
||||||
|
removed.add(tu);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void collectSources(ICProject project, final Collection sources, final Collection headers) throws CoreException {
|
||||||
|
project.accept(new ICElementVisitor() {
|
||||||
|
public boolean visit(ICElement element) throws CoreException {
|
||||||
|
switch (element.getElementType()) {
|
||||||
|
case ICElement.C_UNIT:
|
||||||
|
ITranslationUnit tu = (ITranslationUnit)element;
|
||||||
|
if (tu.isSourceUnit()) {
|
||||||
|
sources.add(tu);
|
||||||
|
}
|
||||||
|
else if (tu.isHeaderUnit()) {
|
||||||
|
headers.add(tu);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
case ICElement.C_CCONTAINER:
|
||||||
|
case ICElement.C_PROJECT:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
if (file != null)
|
||||||
|
index.clearFile(file);
|
||||||
|
} finally {
|
||||||
|
index.releaseWriteLock(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void changeTU(ITranslationUnit tu) throws CoreException, InterruptedException {
|
||||||
|
try {
|
||||||
|
doChangeTU(tu);
|
||||||
|
}
|
||||||
|
catch (CoreException e) {
|
||||||
|
if (++fErrorCount <= MAX_ERRORS) {
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract protected void doChangeTU(ITranslationUnit tu) throws CoreException, InterruptedException;
|
||||||
|
|
||||||
|
protected void clearIndex(IWritableIndex index) throws InterruptedException, CoreException {
|
||||||
|
// reset error count
|
||||||
|
fErrorCount= 0;
|
||||||
|
// First clear the pdom
|
||||||
|
index.acquireWriteLock(0);
|
||||||
|
try {
|
||||||
|
index.clear();
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
index.releaseWriteLock(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -17,68 +17,46 @@ import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
import org.eclipse.cdt.core.index.IIndexFile;
|
|
||||||
import org.eclipse.cdt.core.model.ICElement;
|
|
||||||
import org.eclipse.cdt.core.model.ICElementDelta;
|
import org.eclipse.cdt.core.model.ICElementDelta;
|
||||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
|
|
||||||
import org.eclipse.core.resources.IFile;
|
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
import org.eclipse.core.runtime.IPath;
|
|
||||||
import org.eclipse.core.runtime.IProgressMonitor;
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
import org.eclipse.core.runtime.Platform;
|
import org.eclipse.core.runtime.Platform;
|
||||||
|
|
||||||
class PDOMFastHandleDelta extends PDOMFastIndexerJob {
|
class PDOMFastHandleDelta extends PDOMFastIndexerJob {
|
||||||
|
|
||||||
private final ICElementDelta delta;
|
|
||||||
|
|
||||||
private List added = new ArrayList();
|
|
||||||
private List changed = new ArrayList();
|
private List changed = new ArrayList();
|
||||||
private List removed = new ArrayList();
|
private List removed = new ArrayList();
|
||||||
|
private volatile int fFilesToIndex= 0;
|
||||||
|
|
||||||
public PDOMFastHandleDelta(PDOMFastIndexer indexer, ICElementDelta delta) throws CoreException {
|
public PDOMFastHandleDelta(PDOMFastIndexer indexer, ICElementDelta delta) throws CoreException {
|
||||||
super(indexer);
|
super(indexer);
|
||||||
this.delta = delta;
|
processDelta(delta, changed, changed, removed);
|
||||||
|
fFilesToIndex= changed.size() + removed.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void run(IProgressMonitor monitor) {
|
public void run(IProgressMonitor monitor) {
|
||||||
try {
|
try {
|
||||||
long start = System.currentTimeMillis();
|
long start = System.currentTimeMillis();
|
||||||
|
|
||||||
processDelta(delta);
|
|
||||||
|
|
||||||
Iterator i = changed.iterator();
|
Iterator i = changed.iterator();
|
||||||
while (i.hasNext()) {
|
while (i.hasNext()) {
|
||||||
|
if (monitor.isCanceled())
|
||||||
|
return;
|
||||||
ITranslationUnit tu = (ITranslationUnit)i.next();
|
ITranslationUnit tu = (ITranslationUnit)i.next();
|
||||||
try {
|
changeTU(tu);
|
||||||
changeTU(tu);
|
fFilesToIndex--;
|
||||||
} catch (Throwable e) {
|
|
||||||
CCorePlugin.log(e);
|
|
||||||
if (++errorCount > MAX_ERRORS)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
i = added.iterator();
|
|
||||||
while (i.hasNext()) {
|
|
||||||
ITranslationUnit tu = (ITranslationUnit)i.next();
|
|
||||||
try {
|
|
||||||
addTU(tu);
|
|
||||||
} catch (Throwable e) {
|
|
||||||
CCorePlugin.log(e);
|
|
||||||
if (++errorCount > MAX_ERRORS)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
i = removed.iterator();
|
i = removed.iterator();
|
||||||
while (i.hasNext()) {
|
while (i.hasNext()) {
|
||||||
|
if (monitor.isCanceled())
|
||||||
|
return;
|
||||||
ITranslationUnit tu = (ITranslationUnit)i.next();
|
ITranslationUnit tu = (ITranslationUnit)i.next();
|
||||||
removeTU(tu);
|
removeTU(index, tu);
|
||||||
|
fFilesToIndex--;
|
||||||
}
|
}
|
||||||
|
|
||||||
String showTimings = Platform.getDebugOption(CCorePlugin.PLUGIN_ID
|
String showTimings = Platform.getDebugOption(CCorePlugin.PLUGIN_ID + "/debug/pdomtimings"); //$NON-NLS-1$
|
||||||
+ "/debug/pdomtimings"); //$NON-NLS-1$
|
|
||||||
if (showTimings != null && showTimings.equalsIgnoreCase("true")) //$NON-NLS-1$
|
if (showTimings != null && showTimings.equalsIgnoreCase("true")) //$NON-NLS-1$
|
||||||
System.out.println("PDOM Fast Delta Time: " + (System.currentTimeMillis() - start)); //$NON-NLS-1$
|
System.out.println("PDOM Fast Delta Time: " + (System.currentTimeMillis() - start)); //$NON-NLS-1$
|
||||||
|
|
||||||
|
@ -87,49 +65,8 @@ class PDOMFastHandleDelta extends PDOMFastIndexerJob {
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void processDelta(ICElementDelta delta) throws CoreException {
|
|
||||||
int flags = delta.getFlags();
|
|
||||||
|
|
||||||
if ((flags & ICElementDelta.F_CHILDREN) != 0) {
|
|
||||||
ICElementDelta[] children = delta.getAffectedChildren();
|
|
||||||
for (int i = 0; i < children.length; ++i) {
|
|
||||||
processDelta(children[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ICElement element = delta.getElement();
|
|
||||||
switch (element.getElementType()) {
|
|
||||||
case ICElement.C_UNIT:
|
|
||||||
ITranslationUnit tu = (ITranslationUnit)element;
|
|
||||||
switch (delta.getKind()) {
|
|
||||||
case ICElementDelta.CHANGED:
|
|
||||||
if ((flags & ICElementDelta.F_CONTENT) != 0)
|
|
||||||
changed.add(tu);
|
|
||||||
break;
|
|
||||||
case ICElementDelta.ADDED:
|
|
||||||
if (!tu.isWorkingCopy())
|
|
||||||
added.add(tu);
|
|
||||||
break;
|
|
||||||
case ICElementDelta.REMOVED:
|
|
||||||
if (!tu.isWorkingCopy())
|
|
||||||
removed.add(tu);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void removeTU(ITranslationUnit tu) throws CoreException, InterruptedException {
|
public int getFilesToIndexCount() {
|
||||||
index.acquireWriteLock(0);
|
return fFilesToIndex;
|
||||||
try {
|
|
||||||
IPath path = ((IFile)tu.getResource()).getLocation();
|
|
||||||
IIndexFragmentFile file = (IIndexFragmentFile) index.getFile(path);
|
|
||||||
if (file != null)
|
|
||||||
index.clearFile(file);
|
|
||||||
} finally {
|
|
||||||
index.releaseWriteLock(0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,8 +43,10 @@ public class PDOMFastIndexer implements IPDOMIndexer {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void handleDelta(ICElementDelta delta) throws CoreException {
|
public void handleDelta(ICElementDelta delta) throws CoreException {
|
||||||
CCorePlugin.getPDOMManager().enqueue(
|
PDOMFastHandleDelta fhd= new PDOMFastHandleDelta(this, delta);
|
||||||
new PDOMFastHandleDelta(this, delta));
|
if (fhd.getFilesToIndexCount() > 0) {
|
||||||
|
CCorePlugin.getPDOMManager().enqueue(fhd);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void reindex() throws CoreException {
|
public void reindex() throws CoreException {
|
||||||
|
|
|
@ -23,11 +23,13 @@ import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||||
import org.eclipse.cdt.core.model.ILanguage;
|
import org.eclipse.cdt.core.model.ILanguage;
|
||||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||||
|
import org.eclipse.cdt.core.parser.CodeReader;
|
||||||
import org.eclipse.cdt.core.parser.IScannerInfo;
|
import org.eclipse.cdt.core.parser.IScannerInfo;
|
||||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
|
import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
|
||||||
import org.eclipse.cdt.internal.core.index.IWritableIndex;
|
import org.eclipse.cdt.internal.core.index.IWritableIndex;
|
||||||
import org.eclipse.cdt.internal.core.index.IWritableIndexManager;
|
import org.eclipse.cdt.internal.core.index.IWritableIndexManager;
|
||||||
import org.eclipse.cdt.internal.core.index.IndexBasedCodeReaderFactory;
|
import org.eclipse.cdt.internal.core.index.IndexBasedCodeReaderFactory;
|
||||||
|
import org.eclipse.cdt.internal.core.pdom.indexer.PDOMIndexerTask;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
import org.eclipse.core.runtime.IPath;
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
|
||||||
|
@ -35,16 +37,12 @@ import org.eclipse.core.runtime.IPath;
|
||||||
* @author Doug Schaefer
|
* @author Doug Schaefer
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public abstract class PDOMFastIndexerJob implements IPDOMIndexerTask {
|
abstract class PDOMFastIndexerJob extends PDOMIndexerTask implements IPDOMIndexerTask {
|
||||||
|
|
||||||
protected final PDOMFastIndexer indexer;
|
protected final PDOMFastIndexer indexer;
|
||||||
protected final IWritableIndex index;
|
protected final IWritableIndex index;
|
||||||
protected final IndexBasedCodeReaderFactory codeReaderFactory;
|
protected final IndexBasedCodeReaderFactory codeReaderFactory;
|
||||||
|
|
||||||
// Error counter. If we too many errors we bail
|
|
||||||
protected int errorCount;
|
|
||||||
protected final int MAX_ERRORS = 10;
|
|
||||||
|
|
||||||
public PDOMFastIndexerJob(PDOMFastIndexer indexer) throws CoreException {
|
public PDOMFastIndexerJob(PDOMFastIndexer indexer) throws CoreException {
|
||||||
this.indexer = indexer;
|
this.indexer = indexer;
|
||||||
this.index= ((IWritableIndexManager) CCorePlugin.getIndexManager()).getWritableIndex(indexer.getProject());
|
this.index= ((IWritableIndexManager) CCorePlugin.getIndexManager()).getWritableIndex(indexer.getProject());
|
||||||
|
@ -55,31 +53,26 @@ public abstract class PDOMFastIndexerJob implements IPDOMIndexerTask {
|
||||||
return indexer;
|
return indexer;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void addTU(ITranslationUnit tu) throws InterruptedException, CoreException {
|
protected void doChangeTU(ITranslationUnit tu) throws CoreException, InterruptedException {
|
||||||
// we can do the same as for changing a tu
|
IPath path = tu.getLocation();
|
||||||
changeTU(tu);
|
if (path == null) {
|
||||||
}
|
return;
|
||||||
|
}
|
||||||
protected void changeTU(ITranslationUnit tu) throws CoreException, InterruptedException {
|
|
||||||
ILanguage language = tu.getLanguage();
|
ILanguage language = tu.getLanguage();
|
||||||
if (language == null)
|
if (language == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// skip if no scanner info
|
// skip if no scanner info
|
||||||
IScannerInfo scanner= tu.getScannerInfo(false);
|
IScannerInfo scanner= tu.getScannerInfo(false);
|
||||||
if (scanner == null) {
|
CodeReader codeReader = tu.getCodeReader();
|
||||||
return;
|
if (scanner == null || codeReader == null) {
|
||||||
}
|
|
||||||
|
|
||||||
IPath path = tu.getLocation();
|
|
||||||
if (path == null) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
index.acquireReadLock();
|
index.acquireReadLock();
|
||||||
try {
|
try {
|
||||||
// get the AST in a "Fast" way
|
// get the AST in a "Fast" way
|
||||||
IASTTranslationUnit ast= language.getASTTranslationUnit(tu.getCodeReader(), scanner, codeReaderFactory, index);
|
IASTTranslationUnit ast= language.getASTTranslationUnit(codeReader, scanner, codeReaderFactory, index);
|
||||||
|
|
||||||
index.acquireWriteLock(1);
|
index.acquireWriteLock(1);
|
||||||
try {
|
try {
|
||||||
|
@ -148,7 +141,7 @@ public abstract class PDOMFastIndexerJob implements IPDOMIndexerTask {
|
||||||
return PROCESS_CONTINUE;
|
return PROCESS_CONTINUE;
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
CCorePlugin.log(e);
|
CCorePlugin.log(e);
|
||||||
return ++errorCount > MAX_ERRORS ? PROCESS_ABORT : PROCESS_CONTINUE;
|
return ++fErrorCount > MAX_ERRORS ? PROCESS_ABORT : PROCESS_CONTINUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -12,64 +12,44 @@
|
||||||
|
|
||||||
package org.eclipse.cdt.internal.core.pdom.indexer.fast;
|
package org.eclipse.cdt.internal.core.pdom.indexer.fast;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
import org.eclipse.cdt.core.model.ICContainer;
|
|
||||||
import org.eclipse.cdt.core.model.ISourceRoot;
|
|
||||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
import org.eclipse.core.runtime.IProgressMonitor;
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
import org.eclipse.core.runtime.Platform;
|
import org.eclipse.core.runtime.Platform;
|
||||||
import org.eclipse.core.runtime.Status;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Doug Schaefer
|
* @author Doug Schaefer
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class PDOMFastReindex extends PDOMFastIndexerJob {
|
class PDOMFastReindex extends PDOMFastIndexerJob {
|
||||||
|
|
||||||
|
private volatile int fFilesToIndex= 0;
|
||||||
|
private ArrayList fTUs= new ArrayList();
|
||||||
|
|
||||||
public PDOMFastReindex(PDOMFastIndexer indexer) throws CoreException {
|
public PDOMFastReindex(PDOMFastIndexer indexer) throws CoreException {
|
||||||
super(indexer);
|
super(indexer);
|
||||||
|
collectSources(indexer.getProject(), fTUs, fTUs);
|
||||||
|
fFilesToIndex= fTUs.size()+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addSources(ICContainer container, IProgressMonitor monitor) throws CoreException {
|
|
||||||
ITranslationUnit[] tus = container.getTranslationUnits();
|
|
||||||
for (int i = 0; i < tus.length; ++i) {
|
|
||||||
if (monitor.isCanceled())
|
|
||||||
throw new CoreException(Status.CANCEL_STATUS);
|
|
||||||
ITranslationUnit tu = tus[i];
|
|
||||||
if (tu.isSourceUnit()) {
|
|
||||||
try {
|
|
||||||
addTU(tu);
|
|
||||||
} catch (Throwable e) {
|
|
||||||
CCorePlugin.log(e);
|
|
||||||
if (++errorCount > MAX_ERRORS)
|
|
||||||
throw new CoreException(Status.CANCEL_STATUS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ICContainer[] childContainers = container.getCContainers();
|
|
||||||
for (int i = 0; i < childContainers.length; ++i)
|
|
||||||
addSources(childContainers[i], monitor);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run(final IProgressMonitor monitor) {
|
public void run(final IProgressMonitor monitor) {
|
||||||
try {
|
try {
|
||||||
long start = System.currentTimeMillis();
|
long start = System.currentTimeMillis();
|
||||||
|
|
||||||
// First clear the pdom
|
clearIndex(index);
|
||||||
index.acquireWriteLock(0);
|
fFilesToIndex--;
|
||||||
try {
|
|
||||||
index.clear();
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
index.releaseWriteLock(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
ISourceRoot[] roots = indexer.getProject().getAllSourceRoots();
|
|
||||||
for (int i = 0; i < roots.length; ++i)
|
|
||||||
addSources(roots[i], monitor);
|
|
||||||
|
|
||||||
|
for (Iterator iter = fTUs.iterator(); iter.hasNext();) {
|
||||||
|
ITranslationUnit tu = (ITranslationUnit) iter.next();
|
||||||
|
changeTU(tu);
|
||||||
|
fFilesToIndex--;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert fFilesToIndex == 0;
|
||||||
String showTimings = Platform.getDebugOption(CCorePlugin.PLUGIN_ID
|
String showTimings = Platform.getDebugOption(CCorePlugin.PLUGIN_ID
|
||||||
+ "/debug/pdomtimings"); //$NON-NLS-1$
|
+ "/debug/pdomtimings"); //$NON-NLS-1$
|
||||||
if (showTimings != null && showTimings.equalsIgnoreCase("true")) //$NON-NLS-1$
|
if (showTimings != null && showTimings.equalsIgnoreCase("true")) //$NON-NLS-1$
|
||||||
|
@ -82,4 +62,8 @@ public class PDOMFastReindex extends PDOMFastIndexerJob {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getFilesToIndexCount() {
|
||||||
|
return fFilesToIndex;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,10 +23,8 @@ import org.eclipse.cdt.core.index.IIndex;
|
||||||
import org.eclipse.cdt.core.index.IIndexFile;
|
import org.eclipse.cdt.core.index.IIndexFile;
|
||||||
import org.eclipse.cdt.core.index.IIndexInclude;
|
import org.eclipse.cdt.core.index.IIndexInclude;
|
||||||
import org.eclipse.cdt.core.model.CoreModel;
|
import org.eclipse.cdt.core.model.CoreModel;
|
||||||
import org.eclipse.cdt.core.model.ICElement;
|
|
||||||
import org.eclipse.cdt.core.model.ICElementDelta;
|
import org.eclipse.cdt.core.model.ICElementDelta;
|
||||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
|
|
||||||
import org.eclipse.core.resources.IFile;
|
import org.eclipse.core.resources.IFile;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.resources.ResourcesPlugin;
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
|
@ -40,41 +38,41 @@ import org.eclipse.core.runtime.Platform;
|
||||||
* @author Doug Schaefer
|
* @author Doug Schaefer
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class PDOMFullHandleDelta extends PDOMFullIndexerJob {
|
class PDOMFullHandleDelta extends PDOMFullIndexerJob {
|
||||||
|
|
||||||
private final ICElementDelta delta;
|
|
||||||
|
|
||||||
// Map of filename, TU of files that need to be parsed.
|
// Map of filename, TU of files that need to be parsed.
|
||||||
private Map changed = new HashMap();
|
private Map changedMap = new HashMap();
|
||||||
|
private List changed = new ArrayList();
|
||||||
private List added = new ArrayList();
|
private List added = new ArrayList();
|
||||||
private List removed = new ArrayList();
|
private List removed = new ArrayList();
|
||||||
|
private volatile int fFilesToIndex= 0;
|
||||||
|
|
||||||
public PDOMFullHandleDelta(PDOMFullIndexer indexer, ICElementDelta delta) throws CoreException {
|
public PDOMFullHandleDelta(PDOMFullIndexer indexer, ICElementDelta delta) throws CoreException {
|
||||||
super(indexer);
|
super(indexer);
|
||||||
this.delta = delta;
|
processDelta(delta, added, changed, removed);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void run(IProgressMonitor monitor) {
|
public void run(IProgressMonitor monitor) {
|
||||||
try {
|
try {
|
||||||
long start = System.currentTimeMillis();
|
long start = System.currentTimeMillis();
|
||||||
|
|
||||||
processDelta(delta);
|
|
||||||
|
|
||||||
int count = changed.size() + added.size() + removed.size();
|
int count = changed.size() + added.size() + removed.size();
|
||||||
|
|
||||||
|
for (Iterator iter = changed.iterator(); iter.hasNext();) {
|
||||||
|
ITranslationUnit tu = (ITranslationUnit) iter.next();
|
||||||
|
processTranslationUnit(tu);
|
||||||
|
fFilesToIndex--;
|
||||||
|
}
|
||||||
|
changed.clear();
|
||||||
|
|
||||||
if (count > 0) {
|
if (count > 0) {
|
||||||
Iterator i = changed.values().iterator();
|
Iterator i = changedMap.values().iterator();
|
||||||
while (i.hasNext()) {
|
while (i.hasNext()) {
|
||||||
if (monitor.isCanceled())
|
if (monitor.isCanceled())
|
||||||
return;
|
return;
|
||||||
ITranslationUnit tu = (ITranslationUnit)i.next();
|
ITranslationUnit tu = (ITranslationUnit)i.next();
|
||||||
try {
|
changeTU(tu);
|
||||||
changeTU(tu);
|
fFilesToIndex--;
|
||||||
} catch (Throwable e) {
|
|
||||||
CCorePlugin.log(e);
|
|
||||||
if (++errorCount > MAX_ERRORS)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
i = added.iterator();
|
i = added.iterator();
|
||||||
|
@ -82,13 +80,8 @@ public class PDOMFullHandleDelta extends PDOMFullIndexerJob {
|
||||||
if (monitor.isCanceled())
|
if (monitor.isCanceled())
|
||||||
return;
|
return;
|
||||||
ITranslationUnit tu = (ITranslationUnit)i.next();
|
ITranslationUnit tu = (ITranslationUnit)i.next();
|
||||||
try {
|
changeTU(tu);
|
||||||
addTU(tu);
|
fFilesToIndex--;
|
||||||
} catch (Throwable e) {
|
|
||||||
CCorePlugin.log(e);
|
|
||||||
if (++errorCount > MAX_ERRORS)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
i = removed.iterator();
|
i = removed.iterator();
|
||||||
|
@ -96,7 +89,8 @@ public class PDOMFullHandleDelta extends PDOMFullIndexerJob {
|
||||||
if (monitor.isCanceled())
|
if (monitor.isCanceled())
|
||||||
return;
|
return;
|
||||||
ITranslationUnit tu = (ITranslationUnit)i.next();
|
ITranslationUnit tu = (ITranslationUnit)i.next();
|
||||||
removeTU(tu);
|
removeTU(index, tu);
|
||||||
|
fFilesToIndex--;
|
||||||
}
|
}
|
||||||
|
|
||||||
String showTimings = Platform.getDebugOption(CCorePlugin.PLUGIN_ID
|
String showTimings = Platform.getDebugOption(CCorePlugin.PLUGIN_ID
|
||||||
|
@ -110,37 +104,6 @@ public class PDOMFullHandleDelta extends PDOMFullIndexerJob {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void processDelta(ICElementDelta delta) throws CoreException {
|
|
||||||
int flags = delta.getFlags();
|
|
||||||
|
|
||||||
if ((flags & ICElementDelta.F_CHILDREN) != 0) {
|
|
||||||
ICElementDelta[] children = delta.getAffectedChildren();
|
|
||||||
for (int i = 0; i < children.length; ++i) {
|
|
||||||
processDelta(children[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ICElement element = delta.getElement();
|
|
||||||
switch (element.getElementType()) {
|
|
||||||
case ICElement.C_UNIT:
|
|
||||||
ITranslationUnit tu = (ITranslationUnit)element;
|
|
||||||
switch (delta.getKind()) {
|
|
||||||
case ICElementDelta.CHANGED:
|
|
||||||
if ((flags & ICElementDelta.F_CONTENT) != 0)
|
|
||||||
processTranslationUnit(tu);
|
|
||||||
break;
|
|
||||||
case ICElementDelta.ADDED:
|
|
||||||
if (!tu.isWorkingCopy())
|
|
||||||
added.add(tu);
|
|
||||||
break;
|
|
||||||
case ICElementDelta.REMOVED:
|
|
||||||
if (!tu.isWorkingCopy())
|
|
||||||
removed.add(tu);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void processTranslationUnit(ITranslationUnit tu) throws CoreException {
|
protected void processTranslationUnit(ITranslationUnit tu) throws CoreException {
|
||||||
IPath path = tu.getUnderlyingResource().getLocation();
|
IPath path = tu.getUnderlyingResource().getLocation();
|
||||||
|
@ -155,13 +118,14 @@ public class PDOMFullHandleDelta extends PDOMFullIndexerJob {
|
||||||
for (int i = 0; i < includedBy.length; ++i) {
|
for (int i = 0; i < includedBy.length; ++i) {
|
||||||
String incfilename = includedBy[i].getIncludedByLocation();
|
String incfilename = includedBy[i].getIncludedByLocation();
|
||||||
if (CoreModel.isValidSourceUnitName(project, incfilename)) {
|
if (CoreModel.isValidSourceUnitName(project, incfilename)) {
|
||||||
if (changed.get(incfilename) == null) {
|
if (changedMap.get(incfilename) == null) {
|
||||||
IFile[] rfiles = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(new Path(incfilename));
|
IFile[] rfiles = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(new Path(incfilename));
|
||||||
for (int j = 0; j < rfiles.length; ++j) {
|
for (int j = 0; j < rfiles.length; ++j) {
|
||||||
if (rfiles[j].getProject().equals(project)) {
|
if (rfiles[j].getProject().equals(project)) {
|
||||||
ITranslationUnit inctu = (ITranslationUnit)CoreModel.getDefault().create(rfiles[j]);
|
ITranslationUnit inctu = (ITranslationUnit)CoreModel.getDefault().create(rfiles[j]);
|
||||||
changed.put(incfilename, inctu);
|
changedMap.put(incfilename, inctu);
|
||||||
found = true;
|
found = true;
|
||||||
|
fFilesToIndex++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -169,20 +133,13 @@ public class PDOMFullHandleDelta extends PDOMFullIndexerJob {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!found)
|
if (!found) {
|
||||||
changed.put(path.toOSString(), tu);
|
changedMap.put(path.toOSString(), tu);
|
||||||
}
|
fFilesToIndex++;
|
||||||
|
|
||||||
protected void removeTU(ITranslationUnit tu) throws CoreException, InterruptedException {
|
|
||||||
index.acquireWriteLock(0);
|
|
||||||
try {
|
|
||||||
IPath path = ((IFile)tu.getResource()).getLocation();
|
|
||||||
IIndexFragmentFile file = (IIndexFragmentFile) index.getFile(path);
|
|
||||||
if (file != null)
|
|
||||||
index.clearFile(file);
|
|
||||||
} finally {
|
|
||||||
index.releaseWriteLock(0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getFilesToIndexCount() {
|
||||||
|
return fFilesToIndex;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@ import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
|
import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
|
||||||
import org.eclipse.cdt.internal.core.index.IWritableIndex;
|
import org.eclipse.cdt.internal.core.index.IWritableIndex;
|
||||||
import org.eclipse.cdt.internal.core.index.IWritableIndexManager;
|
import org.eclipse.cdt.internal.core.index.IWritableIndexManager;
|
||||||
|
import org.eclipse.cdt.internal.core.pdom.indexer.PDOMIndexerTask;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
import org.eclipse.core.runtime.IPath;
|
import org.eclipse.core.runtime.IPath;
|
||||||
import org.eclipse.core.runtime.Path;
|
import org.eclipse.core.runtime.Path;
|
||||||
|
@ -33,15 +34,11 @@ import org.eclipse.core.runtime.Path;
|
||||||
* @author Doug Schaefer
|
* @author Doug Schaefer
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public abstract class PDOMFullIndexerJob implements IPDOMIndexerTask {
|
abstract class PDOMFullIndexerJob extends PDOMIndexerTask implements IPDOMIndexerTask {
|
||||||
|
|
||||||
protected final PDOMFullIndexer indexer;
|
protected final PDOMFullIndexer indexer;
|
||||||
protected final IWritableIndex index;
|
protected final IWritableIndex index;
|
||||||
|
|
||||||
// Error count, bail when it gets too high
|
|
||||||
protected int errorCount;
|
|
||||||
protected final int MAX_ERRORS = 10;
|
|
||||||
|
|
||||||
public PDOMFullIndexerJob(PDOMFullIndexer indexer) throws CoreException {
|
public PDOMFullIndexerJob(PDOMFullIndexer indexer) throws CoreException {
|
||||||
this.indexer = indexer;
|
this.indexer = indexer;
|
||||||
this.index = ((IWritableIndexManager) CCorePlugin.getIndexManager()).getWritableIndex(indexer.getProject());
|
this.index = ((IWritableIndexManager) CCorePlugin.getIndexManager()).getWritableIndex(indexer.getProject());
|
||||||
|
@ -51,11 +48,8 @@ public abstract class PDOMFullIndexerJob implements IPDOMIndexerTask {
|
||||||
return indexer;
|
return indexer;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void addTU(ITranslationUnit tu) throws InterruptedException, CoreException {
|
|
||||||
changeTU(tu);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void changeTU(ITranslationUnit tu) throws CoreException, InterruptedException {
|
protected void doChangeTU(ITranslationUnit tu) throws CoreException, InterruptedException {
|
||||||
IPath path = tu.getLocation();
|
IPath path = tu.getLocation();
|
||||||
if (path == null) {
|
if (path == null) {
|
||||||
return;
|
return;
|
||||||
|
@ -134,7 +128,7 @@ public abstract class PDOMFullIndexerJob implements IPDOMIndexerTask {
|
||||||
return PROCESS_CONTINUE;
|
return PROCESS_CONTINUE;
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
CCorePlugin.log(e);
|
CCorePlugin.log(e);
|
||||||
return ++errorCount > MAX_ERRORS ? PROCESS_ABORT : PROCESS_CONTINUE;
|
return ++fErrorCount > MAX_ERRORS ? PROCESS_ABORT : PROCESS_CONTINUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -12,9 +12,10 @@
|
||||||
|
|
||||||
package org.eclipse.cdt.internal.core.pdom.indexer.full;
|
package org.eclipse.cdt.internal.core.pdom.indexer.full;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
import org.eclipse.cdt.core.model.ICElement;
|
|
||||||
import org.eclipse.cdt.core.model.ICElementVisitor;
|
|
||||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
import org.eclipse.core.runtime.IPath;
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
@ -26,10 +27,16 @@ import org.eclipse.core.runtime.Status;
|
||||||
* @author Doug Schaefer
|
* @author Doug Schaefer
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class PDOMFullReindex extends PDOMFullIndexerJob {
|
class PDOMFullReindex extends PDOMFullIndexerJob {
|
||||||
|
|
||||||
|
private volatile int fFilesToIndex= 0;
|
||||||
|
private ArrayList fTUs= new ArrayList();
|
||||||
|
private ArrayList fHeaders= new ArrayList();
|
||||||
|
|
||||||
public PDOMFullReindex(PDOMFullIndexer indexer) throws CoreException {
|
public PDOMFullReindex(PDOMFullIndexer indexer) throws CoreException {
|
||||||
super(indexer);
|
super(indexer);
|
||||||
|
collectSources(indexer.getProject(), fTUs, fHeaders);
|
||||||
|
fFilesToIndex= fTUs.size()+fHeaders.size() + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void run(final IProgressMonitor monitor) {
|
public void run(final IProgressMonitor monitor) {
|
||||||
|
@ -37,65 +44,32 @@ public class PDOMFullReindex extends PDOMFullIndexerJob {
|
||||||
long start = System.currentTimeMillis();
|
long start = System.currentTimeMillis();
|
||||||
|
|
||||||
// First clear out the PDOM
|
// First clear out the PDOM
|
||||||
index.clear();
|
clearIndex(index);
|
||||||
|
fFilesToIndex--;
|
||||||
|
|
||||||
// First index all the source files (i.e. not headers)
|
for (Iterator iter = fTUs.iterator(); iter.hasNext();) {
|
||||||
indexer.getProject().accept(new ICElementVisitor() {
|
ITranslationUnit tu = (ITranslationUnit) iter.next();
|
||||||
public boolean visit(ICElement element) throws CoreException {
|
if (monitor.isCanceled())
|
||||||
if (monitor.isCanceled())
|
return;
|
||||||
throw new CoreException(Status.CANCEL_STATUS);
|
changeTU(tu);
|
||||||
switch (element.getElementType()) {
|
fFilesToIndex--;
|
||||||
case ICElement.C_UNIT:
|
}
|
||||||
ITranslationUnit tu = (ITranslationUnit)element;
|
|
||||||
if (tu.isSourceUnit()) {
|
|
||||||
try {
|
|
||||||
addTU(tu);
|
|
||||||
} catch (Throwable e) {
|
|
||||||
CCorePlugin.log(e);
|
|
||||||
if (++errorCount > MAX_ERRORS)
|
|
||||||
throw new CoreException(Status.CANCEL_STATUS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
case ICElement.C_CCONTAINER:
|
|
||||||
case ICElement.C_PROJECT:
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Now add in the header files but only if they aren't already indexed
|
for (Iterator iter = fHeaders.iterator(); iter.hasNext();) {
|
||||||
indexer.getProject().accept(new ICElementVisitor() {
|
ITranslationUnit tu = (ITranslationUnit) iter.next();
|
||||||
public boolean visit(ICElement element) throws CoreException {
|
if (monitor.isCanceled())
|
||||||
if (monitor.isCanceled())
|
return;
|
||||||
throw new CoreException(Status.CANCEL_STATUS);
|
|
||||||
switch (element.getElementType()) {
|
IPath fileLocation = tu.getLocation();
|
||||||
case ICElement.C_UNIT:
|
if ( fileLocation != null ) {
|
||||||
ITranslationUnit tu = (ITranslationUnit)element;
|
if (index.getFile(fileLocation) == null) {
|
||||||
if (tu.isHeaderUnit()) {
|
changeTU(tu);
|
||||||
IPath fileLocation = tu.getLocation();
|
|
||||||
if ( fileLocation != null ) {
|
|
||||||
if (index.getFile(fileLocation) == null) {
|
|
||||||
try {
|
|
||||||
addTU(tu);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
CCorePlugin.log(e);
|
|
||||||
if (++errorCount > MAX_ERRORS)
|
|
||||||
throw new CoreException(Status.CANCEL_STATUS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
case ICElement.C_CCONTAINER:
|
|
||||||
case ICElement.C_PROJECT:
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
return false;
|
fFilesToIndex--;
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
|
assert fFilesToIndex==0;
|
||||||
String showTimings = Platform.getDebugOption(CCorePlugin.PLUGIN_ID
|
String showTimings = Platform.getDebugOption(CCorePlugin.PLUGIN_ID
|
||||||
+ "/debug/pdomtimings"); //$NON-NLS-1$
|
+ "/debug/pdomtimings"); //$NON-NLS-1$
|
||||||
if (showTimings != null && showTimings.equalsIgnoreCase("true")) //$NON-NLS-1$
|
if (showTimings != null && showTimings.equalsIgnoreCase("true")) //$NON-NLS-1$
|
||||||
|
@ -104,7 +78,12 @@ public class PDOMFullReindex extends PDOMFullIndexerJob {
|
||||||
} catch (CoreException e) {
|
} catch (CoreException e) {
|
||||||
if (e.getStatus() != Status.CANCEL_STATUS)
|
if (e.getStatus() != Status.CANCEL_STATUS)
|
||||||
CCorePlugin.log(e);
|
CCorePlugin.log(e);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getFilesToIndexCount() {
|
||||||
|
return fFilesToIndex;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,6 +67,10 @@ public class PDOMNullIndexer implements IPDOMIndexer {
|
||||||
CCorePlugin.log(e);
|
CCorePlugin.log(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getFilesToIndexCount() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public void reindex() throws CoreException {
|
public void reindex() throws CoreException {
|
||||||
CCorePlugin.getPDOMManager().enqueue(new PDOMNullReindex());
|
CCorePlugin.getPDOMManager().enqueue(new PDOMNullReindex());
|
||||||
|
|
|
@ -1 +1,6 @@
|
||||||
WritablePDOM_error_unknownLinkage=AST specifies unknown linkage ''{0}''
|
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_notifyTask_message=Notify Listeners
|
||||||
|
PDOMManager_FilesToIndexSubtask={0} files to index
|
||||||
|
|
Loading…
Add table
Reference in a new issue