From b305b10095b0b9a61b0dcf1079680680989c0094 Mon Sep 17 00:00:00 2001 From: Vladimir Hirsl Date: Mon, 11 Jul 2005 20:25:09 +0000 Subject: [PATCH] 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. --- core/org.eclipse.cdt.core/ChangeLog | 7 ++ .../core/search/indexing/IndexManager.java | 80 +++++++++++++++++++ 2 files changed, 87 insertions(+) diff --git a/core/org.eclipse.cdt.core/ChangeLog b/core/org.eclipse.cdt.core/ChangeLog index 70fc2cf28b7..31313067342 100644 --- a/core/org.eclipse.cdt.core/ChangeLog +++ b/core/org.eclipse.cdt.core/ChangeLog @@ -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 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. diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java index e8c0cfb6b03..7f1b2ec60a9 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java @@ -10,8 +10,10 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.search.indexing; +import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Set; 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.index.ICDTIndexer; 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.IElementChangedListener; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.internal.core.index.IndexRequest; import org.eclipse.cdt.internal.core.index.cindexstorage.CIndexStorage; 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.JobManager; +import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceDelta; @@ -100,10 +108,82 @@ public class IndexManager extends JobManager{ //Set default upgrade values CCorePlugin.getDefault().getPluginPreferences().setValue(CCorePlugin.PREF_INDEXER, CCorePlugin.DEFAULT_INDEXER_UNIQ_ID); this.indexerMap = new HashMap(5); + + // subscribe for path entry changes + CoreModel.getDefault().addElementChangedListener(new ElementChangeListener()); } finally{ 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 *