diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/AbstractIndexerTask.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/AbstractIndexerTask.java index 7af23d4cde9..9a7c04476de 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/AbstractIndexerTask.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/AbstractIndexerTask.java @@ -102,6 +102,7 @@ public abstract class AbstractIndexerTask extends PDOMWriter { private List<Object> fFilesToRemove = new ArrayList<Object>(); private List<String> fFilesUpFront= new ArrayList<String>(); private int fASTOptions; + private int fForceNumberFiles= 0; protected IWritableIndex fIndex; private ITodoTaskUpdater fTodoTaskUpdater; @@ -128,6 +129,9 @@ public abstract class AbstractIndexerTask extends PDOMWriter { public final void setParseUpFront(String[] astFilePaths) { fFilesUpFront.addAll(Arrays.asList(astFilePaths)); } + public final void setForceFirstFiles(int number) { + fForceNumberFiles= number; + } protected abstract IWritableIndex createIndex(); protected abstract ICodeReaderFactory createReaderFactory(); @@ -248,15 +252,17 @@ public abstract class AbstractIndexerTask extends PDOMWriter { } private void extractFiles(Map<Integer, List<Object>> files, List<IIndexFragmentFile> iFilesToRemove, IProgressMonitor monitor) throws CoreException { - final boolean force= (fUpdateFlags & IIndexManager.UPDATE_ALL) != 0; + final boolean forceAll= (fUpdateFlags & IIndexManager.UPDATE_ALL) != 0; final boolean checkTimestamps= (fUpdateFlags & IIndexManager.UPDATE_CHECK_TIMESTAMPS) != 0; final boolean checkConfig= (fUpdateFlags & IIndexManager.UPDATE_CHECK_CONFIGURATION) != 0; int count= 0; + int forceFirst= fForceNumberFiles; for (final Object tu : fFilesToUpdate) { if (monitor.isCanceled()) return; + final boolean force= forceAll || --forceFirst >= 0; final IIndexFileLocation ifl= fResolver.resolveFile(tu); if (ifl == null) continue; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/CModelListener.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/CModelListener.java index d79ad0d33df..6712cc3be8b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/CModelListener.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/CModelListener.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2007 Wind River Systems, Inc. and others. + * Copyright (c) 2006, 2008 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 @@ -8,7 +8,6 @@ * Contributors: * Markus Schorn - initial API and implementation *******************************************************************************/ - package org.eclipse.cdt.internal.core.pdom; import java.util.HashMap; @@ -39,9 +38,9 @@ public class CModelListener implements IElementChangedListener, IResourceChangeL private static final int UPDATE_LR_CHANGED_FILES_COUNT = 5; private PDOMManager fManager; - private LinkedHashMap fLRUs= new LinkedHashMap(UPDATE_LR_CHANGED_FILES_COUNT, 0.75f, true) { + private LinkedHashMap<ITranslationUnit, ITranslationUnit> fLRUs= new LinkedHashMap<ITranslationUnit,ITranslationUnit>(UPDATE_LR_CHANGED_FILES_COUNT, 0.75f, true) { @Override - protected boolean removeEldestEntry(Map.Entry eldest) { + protected boolean removeEldestEntry(Map.Entry<ITranslationUnit, ITranslationUnit> eldest) { return size() > UPDATE_LR_CHANGED_FILES_COUNT; } }; @@ -56,21 +55,21 @@ public class CModelListener implements IElementChangedListener, IResourceChangeL return; // Walk the delta collecting tu's per project - HashMap changeMap= new HashMap(); + HashMap<ICProject, DeltaAnalyzer> changeMap= new HashMap<ICProject, DeltaAnalyzer>(); processDelta(event.getDelta(), changeMap); // bug 171834 update last recently changed sources addLastRecentlyUsed(changeMap); - for (Iterator it = changeMap.entrySet().iterator(); it.hasNext();) { - Map.Entry entry = (Map.Entry) it.next(); + for (Iterator<?> it = changeMap.entrySet().iterator(); it.hasNext();) { + Map.Entry<?, ?> entry = (Map.Entry<?, ?>) it.next(); ICProject cproject = (ICProject) entry.getKey(); DeltaAnalyzer analyzer= (DeltaAnalyzer) entry.getValue(); - fManager.changeProject(cproject, analyzer.getAddedTUs(), analyzer.getChangedTUs(), analyzer.getRemovedTUs()); + fManager.changeProject(cproject, analyzer.getForcedTUs(), analyzer.getChangedTUs(), analyzer.getRemovedTUs()); } } - private void processDelta(ICElementDelta delta, HashMap changeMap) { + private void processDelta(ICElementDelta delta, HashMap<ICProject, DeltaAnalyzer> changeMap) { int type = delta.getElement().getElementType(); switch (type) { case ICElement.C_MODEL: @@ -99,7 +98,7 @@ public class CModelListener implements IElementChangedListener, IResourceChangeL } } - private void processProjectDelta(ICProject project, ICElementDelta delta, HashMap changeMap) { + private void processProjectDelta(ICProject project, ICElementDelta delta, HashMap<ICProject, DeltaAnalyzer> changeMap) { IPDOMIndexer indexer = fManager.getIndexer(project); if (indexer != null && indexer.getID().equals(IPDOMManager.ID_NO_INDEXER)) { return; @@ -114,23 +113,15 @@ public class CModelListener implements IElementChangedListener, IResourceChangeL changeMap.put(project, deltaAnalyzer); } - private void addLastRecentlyUsed(HashMap changeMap) { + private void addLastRecentlyUsed(HashMap<ICProject, DeltaAnalyzer> changeMap) { boolean addLRUs= false; int count= 0; ITranslationUnit[] newLRUs= new ITranslationUnit[UPDATE_LR_CHANGED_FILES_COUNT]; - for (Iterator iterator = changeMap.values().iterator(); iterator.hasNext();) { - DeltaAnalyzer analyzer = (DeltaAnalyzer) iterator.next(); - List l= analyzer.getAddedList(); - for (Iterator it = l.iterator(); it.hasNext();) { - ITranslationUnit tu= (ITranslationUnit) it.next(); - newLRUs[count++ % UPDATE_LR_CHANGED_FILES_COUNT]= tu; - if (!addLRUs && tu.isHeaderUnit()) { - addLRUs= true; - } - } - l= analyzer.getChangedList(); - for (Iterator it = l.iterator(); it.hasNext();) { + for (Iterator<DeltaAnalyzer> iterator = changeMap.values().iterator(); iterator.hasNext();) { + DeltaAnalyzer analyzer = iterator.next(); + List<?> l= analyzer.getChangedList(); + for (Iterator<?> it = l.iterator(); it.hasNext();) { ITranslationUnit tu= (ITranslationUnit) it.next(); newLRUs[count++ % UPDATE_LR_CHANGED_FILES_COUNT]= tu; if (!addLRUs && tu.isHeaderUnit()) { @@ -141,16 +132,16 @@ public class CModelListener implements IElementChangedListener, IResourceChangeL if (count > 0) { if (addLRUs) { - for (Iterator it = fLRUs.keySet().iterator(); it.hasNext();) { - final ITranslationUnit tu = (ITranslationUnit) it.next(); + for (Iterator<ITranslationUnit> it = fLRUs.keySet().iterator(); it.hasNext();) { + final ITranslationUnit tu = it.next(); if (tu.getResource().exists()) { final ICProject cproject= tu.getCProject(); - DeltaAnalyzer analyzer= (DeltaAnalyzer) changeMap.get(cproject); + DeltaAnalyzer analyzer= changeMap.get(cproject); if (analyzer == null) { analyzer= new DeltaAnalyzer(); changeMap.put(cproject, analyzer); } - analyzer.getChangedList().add(tu); + analyzer.getForcedList().add(tu); } } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/IndexUpdatePolicy.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/IndexUpdatePolicy.java index f16e5cd7f6a..f9138201500 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/IndexUpdatePolicy.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/IndexUpdatePolicy.java @@ -8,7 +8,6 @@ * Contributors: * Markus Schorn - initial API and implementation *******************************************************************************/ - package org.eclipse.cdt.internal.core.pdom; import java.util.HashSet; @@ -30,8 +29,8 @@ public class IndexUpdatePolicy { private final ICProject fCProject; private int fKind; - private HashSet<ITranslationUnit> fAdded= new HashSet<ITranslationUnit>(); - private HashSet<ITranslationUnit> fChanged= new HashSet<ITranslationUnit>(); + private HashSet<ITranslationUnit> fForce= new HashSet<ITranslationUnit>(); + private HashSet<ITranslationUnit> fTimestamp= new HashSet<ITranslationUnit>(); private HashSet<ITranslationUnit> fRemoved= new HashSet<ITranslationUnit>(); private IPDOMIndexer fIndexer; private boolean fReindexRequested; @@ -56,25 +55,13 @@ public class IndexUpdatePolicy { } public void clearTUs() { - fAdded.clear(); - fChanged.clear(); + fForce.clear(); + fTimestamp.clear(); fRemoved.clear(); } public boolean hasTUs() { - return !(fAdded.isEmpty() && fChanged.isEmpty() && fRemoved.isEmpty()); - } - - private ITranslationUnit[] getAdded() { - return fAdded.toArray(new ITranslationUnit[fAdded.size()]); - } - - private ITranslationUnit[] getChanged() { - return fChanged.toArray(new ITranslationUnit[fChanged.size()]); - } - - private ITranslationUnit[] getRemoved() { - return fRemoved.toArray(new ITranslationUnit[fRemoved.size()]); + return !(fForce.isEmpty() && fTimestamp.isEmpty() && fRemoved.isEmpty()); } public void setIndexer(IPDOMIndexer indexer) { @@ -85,7 +72,7 @@ public class IndexUpdatePolicy { return fIndexer; } - public IPDOMIndexerTask handleDelta(ITranslationUnit[] added, ITranslationUnit[] changed, ITranslationUnit[] removed) { + public IPDOMIndexerTask handleDelta(ITranslationUnit[] force, ITranslationUnit[] changed, ITranslationUnit[] removed) { if (isNullIndexer()) { return null; } @@ -95,28 +82,27 @@ public class IndexUpdatePolicy { return null; case IndexUpdatePolicy.POST_CHANGE: if (fIndexer != null) { - return fIndexer.createTask(added, changed, removed); + return fIndexer.createTask(force, changed, removed); } break; } for (int i = 0; i < removed.length; i++) { ITranslationUnit tu = removed[i]; - fAdded.remove(tu); - fChanged.remove(tu); + fForce.remove(tu); + fTimestamp.remove(tu); fRemoved.add(tu); } - for (int i = 0; i < added.length; i++) { - ITranslationUnit tu = added[i]; - if (!fChanged.contains(tu)) { - fAdded.add(tu); - } + for (int i = 0; i < force.length; i++) { + ITranslationUnit tu = force[i]; + fForce.add(tu); + fTimestamp.remove(tu); fRemoved.remove(tu); } for (int i = 0; i < changed.length; i++) { ITranslationUnit tu = changed[i]; - if (!fAdded.contains(tu)) { - fChanged.add(tu); + if (!fForce.contains(tu)) { + fTimestamp.add(tu); } fRemoved.remove(tu); } @@ -127,13 +113,17 @@ public class IndexUpdatePolicy { IPDOMIndexerTask task= null; if (fIndexer != null && hasTUs()) { if (fKind != IndexUpdatePolicy.MANUAL && !isNullIndexer()) { - task= fIndexer.createTask(getAdded(), getChanged(), getRemoved()); + task= fIndexer.createTask(toarray(fForce), toarray(fTimestamp), toarray(fRemoved)); } clearTUs(); } return task; } + private ITranslationUnit[] toarray(HashSet<ITranslationUnit> set) { + return set.toArray(new ITranslationUnit[set.size()]); + } + private boolean isNullIndexer() { return fIndexer != null && fIndexer.getID().equals(IPDOMManager.ID_NO_INDEXER); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/DeltaAnalyzer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/DeltaAnalyzer.java index 226e4056deb..8ca0b0cb443 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/DeltaAnalyzer.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/DeltaAnalyzer.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007 Wind River Systems, Inc. and others. + * Copyright (c) 2007, 2008 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 @@ -8,7 +8,6 @@ * Contributors: * Markus Schorn - initial API and implementation *******************************************************************************/ - package org.eclipse.cdt.internal.core.pdom.indexer; import java.util.ArrayList; @@ -23,7 +22,7 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; public class DeltaAnalyzer { - private List<ITranslationUnit> fAdded= new ArrayList<ITranslationUnit>(); + private List<ITranslationUnit> fForce= new ArrayList<ITranslationUnit>(); private List<ITranslationUnit> fChanged= new ArrayList<ITranslationUnit>(); private List<ITranslationUnit> fRemoved= new ArrayList<ITranslationUnit>(); @@ -56,7 +55,7 @@ public class DeltaAnalyzer { } break; case ICElementDelta.ADDED: - fAdded.add(tu); + fChanged.add(tu); break; case ICElementDelta.REMOVED: fRemoved.add(tu); @@ -67,7 +66,7 @@ public class DeltaAnalyzer { case ICElement.C_CCONTAINER: ICContainer folder= (ICContainer) element; if (delta.getKind() == ICElementDelta.ADDED) { - collectSources(folder, fAdded); + collectSources(folder, fChanged); } break; } @@ -77,8 +76,8 @@ public class DeltaAnalyzer { container.accept(new TranslationUnitCollector(sources, sources, new NullProgressMonitor())); } - public ITranslationUnit[] getAddedTUs() { - return fAdded.toArray(new ITranslationUnit[fAdded.size()]); + public ITranslationUnit[] getForcedTUs() { + return fForce.toArray(new ITranslationUnit[fForce.size()]); } public ITranslationUnit[] getChangedTUs() { @@ -89,8 +88,8 @@ public class DeltaAnalyzer { return fRemoved.toArray(new ITranslationUnit[fRemoved.size()]); } - public List<ITranslationUnit> getAddedList() { - return fAdded; + public List<ITranslationUnit> getForcedList() { + return fForce; } public List<ITranslationUnit> getChangedList() { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMIndexerTask.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMIndexerTask.java index 3f5b5280c0b..ea7235fc7d1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMIndexerTask.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMIndexerTask.java @@ -9,7 +9,6 @@ * Markus Schorn - initial API and implementation * Sergey Prigogin (Google) *******************************************************************************/ - package org.eclipse.cdt.internal.core.pdom.indexer; import java.text.NumberFormat; @@ -20,6 +19,7 @@ import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.IPDOMIndexer; import org.eclipse.cdt.core.dom.IPDOMIndexerTask; +import org.eclipse.cdt.core.index.IIndexManager; import org.eclipse.cdt.core.model.AbstractLanguage; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ILanguage; @@ -54,9 +54,9 @@ public abstract class PDOMIndexerTask extends AbstractIndexerTask implements IPD private AbstractPDOMIndexer fIndexer; private boolean fWriteInfoToLog; - protected PDOMIndexerTask(ITranslationUnit[] addFiles, ITranslationUnit[] updateFiles, ITranslationUnit[] removeFiles, + protected PDOMIndexerTask(ITranslationUnit[] forceFiles, ITranslationUnit[] updateFiles, ITranslationUnit[] removeFiles, AbstractPDOMIndexer indexer, boolean isFastIndexer) { - super(concat(addFiles, updateFiles), removeFiles, new ProjectIndexerInputAdapter(indexer.getProject()), isFastIndexer); + super(concat(forceFiles, updateFiles), removeFiles, new ProjectIndexerInputAdapter(indexer.getProject()), isFastIndexer); fIndexer= indexer; setShowActivity(checkDebugOption(TRACE_ACTIVITY, TRUE)); setShowInclusionProblems(checkDebugOption(TRACE_INCLUSION_PROBLEMS, TRUE)); @@ -86,6 +86,8 @@ public abstract class PDOMIndexerTask extends AbstractIndexerTask implements IPD setIndexFilesWithoutBuildConfiguration(false); setIndexHeadersWithoutContext(false); } + setUpdateFlags(IIndexManager.UPDATE_CHECK_TIMESTAMPS); + setForceFirstFiles(forceFiles.length); } private static ITranslationUnit[] concat(ITranslationUnit[] added, ITranslationUnit[] changed) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMUpdateTask.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMUpdateTask.java index 1b471becb53..59f4a15896a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMUpdateTask.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMUpdateTask.java @@ -87,7 +87,7 @@ public class PDOMUpdateTask implements IPDOMIndexerTask { } } ITranslationUnit[] tus= set.toArray(new ITranslationUnit[set.size()]); - IPDOMIndexerTask delegate= fIndexer.createTask(tus, NO_TUS, NO_TUS); + IPDOMIndexerTask delegate= fIndexer.createTask(NO_TUS, tus, NO_TUS); if (delegate instanceof PDOMIndexerTask) { final PDOMIndexerTask task = (PDOMIndexerTask) delegate; task.setUpdateFlags(fUpdateOptions);