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

Fix for PR 100585: [Scanner Discovery - Indexer] Indexer not notified of scanner info change. Change in project/file scanner info will now cause whole project or just affected files to be indexed.

This commit is contained in:
Vladimir Hirsl 2005-07-11 20:25:09 +00:00
parent afb99ca2e0
commit b305b10095
2 changed files with 87 additions and 0 deletions

View file

@ -1,3 +1,10 @@
2005-07-11 Vladimir Hirsl
Fix for PR 100585: [Scanner Discovery - Indexer] Indexer not notified of scanner info change
Change in project/file scanner info will now cause whole project or just affected files
to be indexed.
* index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java
2005-07-08 Alain Magloire 2005-07-08 Alain Magloire
PR 100585:We need to bacth the fire of event. Actually the CModelOperation needed to be PR 100585:We need to bacth the fire of event. Actually the CModelOperation needed to be
change to be aware of nested operation in the same thread. change to be aware of nested operation in the same thread.

View file

@ -10,8 +10,10 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.search.indexing; package org.eclipse.cdt.internal.core.search.indexing;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import java.util.Set; import java.util.Set;
import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.CCorePlugin;
@ -19,13 +21,19 @@ import org.eclipse.cdt.core.ICDescriptor;
import org.eclipse.cdt.core.ICExtensionReference; import org.eclipse.cdt.core.ICExtensionReference;
import org.eclipse.cdt.core.index.ICDTIndexer; import org.eclipse.cdt.core.index.ICDTIndexer;
import org.eclipse.cdt.core.index.IIndexStorage; import org.eclipse.cdt.core.index.IIndexStorage;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ElementChangedEvent;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICElementDelta;
import org.eclipse.cdt.core.model.ICModelMarker; import org.eclipse.cdt.core.model.ICModelMarker;
import org.eclipse.cdt.core.model.IElementChangedListener;
import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.internal.core.index.IndexRequest; import org.eclipse.cdt.internal.core.index.IndexRequest;
import org.eclipse.cdt.internal.core.index.cindexstorage.CIndexStorage; import org.eclipse.cdt.internal.core.index.cindexstorage.CIndexStorage;
import org.eclipse.cdt.internal.core.index.domsourceindexer.DOMSourceIndexer; import org.eclipse.cdt.internal.core.index.domsourceindexer.DOMSourceIndexer;
import org.eclipse.cdt.internal.core.search.processing.IIndexJob; import org.eclipse.cdt.internal.core.search.processing.IIndexJob;
import org.eclipse.cdt.internal.core.search.processing.JobManager; import org.eclipse.cdt.internal.core.search.processing.JobManager;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IResourceDelta;
@ -100,10 +108,82 @@ public class IndexManager extends JobManager{
//Set default upgrade values //Set default upgrade values
CCorePlugin.getDefault().getPluginPreferences().setValue(CCorePlugin.PREF_INDEXER, CCorePlugin.DEFAULT_INDEXER_UNIQ_ID); CCorePlugin.getDefault().getPluginPreferences().setValue(CCorePlugin.PREF_INDEXER, CCorePlugin.DEFAULT_INDEXER_UNIQ_ID);
this.indexerMap = new HashMap(5); this.indexerMap = new HashMap(5);
// subscribe for path entry changes
CoreModel.getDefault().addElementChangedListener(new ElementChangeListener());
} finally{ } finally{
monitor.exitWrite(); monitor.exitWrite();
} }
} }
public class ElementChangeListener implements IElementChangedListener {
private boolean scannerInfoChanged = false;
private IProject currentProject = null;
private List changedElements = new ArrayList();
/* (non-Javadoc)
* @see org.eclipse.cdt.core.model.IElementChangedListener#elementChanged(org.eclipse.cdt.core.model.ElementChangedEvent)
*/
public void elementChanged(ElementChangedEvent event) {
scannerInfoChanged = false;
currentProject = null;
changedElements.clear();
processDelta(event.getDelta());
if (!scannerInfoChanged)
return;
if (changedElements.size() > 0) {
for (Iterator i = changedElements.iterator(); i.hasNext();) {
IFile file = (IFile) i.next();
addResource(currentProject, file);
}
}
else {
if (!CoreModel.isScannerInformationEmpty(currentProject)) {
addResource(currentProject, currentProject);
}
}
}
/**
* @param delta
*/
private void processDelta(ICElementDelta delta) {
ICElement element= delta.getElement();
IResource res = element.getResource();
if (res instanceof IProject) {
currentProject = (IProject) res;
}
if (isPathEntryChange(delta)) {
scannerInfoChanged = true;
if (res instanceof IFile) {
if (!changedElements.contains(res)) {
changedElements.add(res);
}
}
}
ICElementDelta[] affectedChildren= delta.getAffectedChildren();
for (int i= 0; i < affectedChildren.length; i++) {
processDelta(affectedChildren[i]);
}
}
/**
* @param delta
* @return
*/
private boolean isPathEntryChange(ICElementDelta delta) {
int flags= delta.getFlags();
return (delta.getKind() == ICElementDelta.CHANGED &&
((flags & ICElementDelta.F_CHANGED_PATHENTRY_INCLUDE) != 0 ||
(flags & ICElementDelta.F_CHANGED_PATHENTRY_MACRO) != 0 ||
(flags & ICElementDelta.F_PATHENTRY_REORDER) !=0));
}
}
/** /**
* Notify indexer which scheduled this job that the job has completed * Notify indexer which scheduled this job that the job has completed
* *